[virt-tools-list] [virt-manager PATCH 1/3] Add TPM passthrough support to virtinst
Stefan Berger
stefanb at linux.vnet.ibm.com
Mon Jun 24 21:58:06 UTC 2013
Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
---
virtinst/Guest.py | 1 +
virtinst/VirtualDevice.py | 4 +-
virtinst/VirtualTPMDevice.py | 138 +++++++++++++++++++++++++++++++++++++++++++
virtinst/__init__.py | 1 +
virtinst/cli.py | 25 ++++++++
5 files changed, 168 insertions(+), 1 deletion(-)
create mode 100644 virtinst/VirtualTPMDevice.py
diff --git a/virtinst/Guest.py b/virtinst/Guest.py
index 6702444..81c4b4e 100644
--- a/virtinst/Guest.py
+++ b/virtinst/Guest.py
@@ -675,6 +675,7 @@ class Guest(XMLBuilderDomain.XMLBuilderDomain):
"smartcard" : virtinst.VirtualSmartCardDevice,
"redirdev" : virtinst.VirtualRedirDevice,
"memballoon": virtinst.VirtualMemballoon,
+ "tpm" : virtinst.VirtualTPMDevice,
}
# Hand off all child element parsing to relevant classes
diff --git a/virtinst/VirtualDevice.py b/virtinst/VirtualDevice.py
index bbc32a6..a1e5aef 100644
--- a/virtinst/VirtualDevice.py
+++ b/virtinst/VirtualDevice.py
@@ -45,6 +45,7 @@ class VirtualDevice(XMLBuilderDomain):
VIRTUAL_DEV_SMARTCARD = "smartcard"
VIRTUAL_DEV_REDIRDEV = "redirdev"
VIRTUAL_DEV_MEMBALLOON = "memballoon"
+ VIRTUAL_DEV_TPM = "tpm"
# Ordering in this list is important: it will be the order the
# Guest class outputs XML. So changing this may upset the test suite
@@ -64,7 +65,8 @@ class VirtualDevice(XMLBuilderDomain):
VIRTUAL_DEV_WATCHDOG,
VIRTUAL_DEV_SMARTCARD,
VIRTUAL_DEV_REDIRDEV,
- VIRTUAL_DEV_MEMBALLOON]
+ VIRTUAL_DEV_MEMBALLOON,
+ VIRTUAL_DEV_TPM]
# General device type (disk, interface, etc.)
_virtual_device_type = None
diff --git a/virtinst/VirtualTPMDevice.py b/virtinst/VirtualTPMDevice.py
new file mode 100644
index 0000000..46bb3f6
--- /dev/null
+++ b/virtinst/VirtualTPMDevice.py
@@ -0,0 +1,138 @@
+# coding=utf-8
+#
+# Copyright 2011 Red Hat, Inc.
+# Cole Robinson <crobinso at redhat.com>
+# Marc-André Lureau <marcandre.lureau at redhat.com>
+#
+# Copyright 2013 IBM Corporation
+# Author: Stefan Berger <stefanb at linux.vnet.ibm.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA.
+
+import VirtualDevice
+from XMLBuilderDomain import _xml_property
+
+class VirtualTPMDevice(VirtualDevice.VirtualDevice):
+
+ _virtual_device_type = VirtualDevice.VirtualDevice.VIRTUAL_DEV_TPM
+
+ # backend types
+ TPM_PASSTHROUGH = "passthrough"
+
+ # device models
+ TPM_TIS = "tpm-tis"
+
+ # Default backend type and list of choices
+ TYPE_DEFAULT = TPM_PASSTHROUGH
+ _types = [ TPM_PASSTHROUGH ]
+
+ # Default device model and list of choices
+ MODEL_DEFAULT = TPM_TIS
+ _models = [ TPM_TIS ]
+
+ def get_dev_instance(conn, tpm_type):
+ """
+ Set up the class attributes for the passed tpm_type
+ """
+
+ if tpm_type == VirtualTPMDevice.TPM_PASSTHROUGH:
+ c = VirtualTPMPassthroughDevice
+ else:
+ raise ValueError(_("Unknown TPM device type '%s'.") %
+ tpm_type)
+
+ return c(conn, tpm_type)
+ get_dev_instance = staticmethod(get_dev_instance)
+
+
+ def __init__(self, conn, type=TYPE_DEFAULT,
+ parsexml=None, parsexmlnode=None, caps=None):
+ VirtualDevice.VirtualDevice.__init__(self, conn,
+ parsexml, parsexmlnode, caps)
+
+ self._type = None
+ self._model = self.TPM_TIS
+ self._device_path = None
+
+ if self._is_parse():
+ return
+
+ self.type = type
+
+ def get_types(self):
+ return self._types[:]
+ types = property(get_types)
+
+ def get_type(self):
+ return self._type
+ def set_type(self, val):
+ if val not in self.types:
+ raise ValueError(_("Unknown TPM type '%s'") % val)
+ self._type = val
+ type = _xml_property(get_type, set_type,
+ xpath="./backend/@type")
+
+ def get_models(self):
+ return self._models[:]
+ models = property(get_models)
+
+ def get_model(self):
+ return self._model
+ def set_model(self, val):
+ if val not in self.models:
+ raise ValueError(_("Unknown TPM model '%s'") % val)
+ self._model = val
+ model = _xml_property(get_model, set_model,
+ xpath="./@model")
+
+ def get_device_path(self):
+ return self._device_path
+ def set_device_path(self, val):
+ self._device_path = val
+ device_path = _xml_property(get_device_path, set_device_path,
+ xpath="./backend/device/@path")
+
+ def supports_property(self, propname):
+ """
+ Whether the TPM dev type supports the passed property name
+ """
+ users = {
+ "device_path" : [self.TPM_PASSTHROUGH],
+ }
+
+ if users.get(propname):
+ return self.type in users[propname]
+
+ return hasattr(self, propname)
+
+ def _get_xml_config(self):
+ type = self.type
+
+ device = "/dev/tpm0"
+ if self._device_path != None:
+ device = self._device_path
+
+ xml = " <tpm model='%s'>\n" % self.model
+ xml += " <backend type='%s'>\n" % type
+ if self.type == "passthrough":
+ xml += " <device path='%s'/>\n" % device
+ xml += " </backend>\n"
+ xml += " </tpm>\n"
+
+ return xml
+
+class VirtualTPMPassthroughDevice(VirtualTPMDevice):
+ _tpm_type = VirtualTPMDevice.TPM_PASSTHROUGH
diff --git a/virtinst/__init__.py b/virtinst/__init__.py
index 5e10ca6..2fe0e2c 100644
--- a/virtinst/__init__.py
+++ b/virtinst/__init__.py
@@ -38,6 +38,7 @@ from virtinst.VirtualFilesystem import VirtualFilesystem
from virtinst.VirtualSmartCardDevice import VirtualSmartCardDevice
from virtinst.VirtualRedirDevice import VirtualRedirDevice
from virtinst.VirtualMemballoon import VirtualMemballoon
+from VirtualTPMDevice import VirtualTPMDevice
from virtinst.DistroInstaller import DistroInstaller
from virtinst.PXEInstaller import PXEInstaller
from virtinst.LiveCDInstaller import LiveCDInstaller
diff --git a/virtinst/cli.py b/virtinst/cli.py
index 99c49aa..e08ffcd 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -1901,6 +1901,31 @@ def parse_redirdev(guest, optstring, dev=None):
return dev
+#######################
+# --tpm parsing #
+#######################
+
+def parse_tpm(guest, optstring, dev=None):
+ if optstring is None:
+ return None
+
+ # Peel the mode off the front
+ opts = parse_optstr(optstring, remove_first="type")
+ if opts.get("type") == "none":
+ return None
+
+ if not dev:
+ dev = virtinst.VirtualTPMDevice(guest.conn, opts.get("type"))
+
+ set_param = _build_set_param(dev, opts)
+
+ set_param("type", "type")
+
+ if opts:
+ raise ValueError(_("Unknown options %s") % opts.keys())
+
+ return dev
+
######################
# --watchdog parsing #
######################
--
1.8.1.4
More information about the virt-tools-list
mailing list