Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxxxxxxx> --- 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@xxxxxxxxxx> +# Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> +# +# Copyright 2013 IBM Corporation +# Author: Stefan Berger <stefanb@xxxxxxxxxxxxxxxxxx> +# +# 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 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list