[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