Add VirtualTPMDevice class to virtinst
Add VirtualTPMDevice class and TPM test cases to xmlparse.py Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
This commit is contained in:
parent
c1a5bc91d7
commit
c829b55581
|
@ -0,0 +1,63 @@
|
||||||
|
<domain type='kvm'>
|
||||||
|
<name>TestGuest</name>
|
||||||
|
<currentMemory>204800</currentMemory>
|
||||||
|
<memory>409600</memory>
|
||||||
|
<uuid>12345678-1234-1234-1234-123456789012</uuid>
|
||||||
|
<os>
|
||||||
|
<type arch='i686' machine='foobar'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<acpi/><apic/>
|
||||||
|
</features>
|
||||||
|
<cpu match='exact'>
|
||||||
|
<model>footest</model>
|
||||||
|
<vendor>Intel</vendor>
|
||||||
|
<topology sockets='4' cores='5' threads='2'/>
|
||||||
|
<feature policy='force' name='x2apic'/>
|
||||||
|
<feature policy='forbid' name='lahf_lm'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>restart</on_crash>
|
||||||
|
<vcpu cpuset='1-3'>5</vcpu>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
|
||||||
|
<disk type='file' device='floppy'>
|
||||||
|
<driver name='qemu' type='qcow2'/>
|
||||||
|
<source file='/default-pool/testvol1.img'/>
|
||||||
|
<target dev='fda' bus='fdc'/>
|
||||||
|
</disk>
|
||||||
|
<disk type='file' device='disk'>
|
||||||
|
<driver name='qemu' type='raw'/>
|
||||||
|
<source file='/tmp/test.img'/>
|
||||||
|
<target dev='vda' bus='virtio'/>
|
||||||
|
</disk>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver name='qemu'/>
|
||||||
|
<source dev='/dev/loop0'/>
|
||||||
|
<target dev='vdb' bus='virtio'/>
|
||||||
|
</disk>
|
||||||
|
<disk type='block' device='cdrom'>
|
||||||
|
<target dev='hdc' bus='ide'/>
|
||||||
|
<readonly/>
|
||||||
|
</disk>
|
||||||
|
<interface type='network'>
|
||||||
|
<source network='default'/>
|
||||||
|
<mac address='22:22:33:44:55:66'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
</interface>
|
||||||
|
<graphics type='sdl' display=':3.4' xauth='/tmp/.Xauthority'/>
|
||||||
|
<console type='pty'/>
|
||||||
|
<tpm model='tpm-tis'>
|
||||||
|
<backend type='passthrough'>
|
||||||
|
<backend path='/dev/tpm0'/>
|
||||||
|
</backend>
|
||||||
|
</tpm>
|
||||||
|
</devices>
|
||||||
|
<seclabel type='static' model='selinux'>
|
||||||
|
<label>foolabel</label>
|
||||||
|
<imagelabel>imagelabel</imagelabel>
|
||||||
|
</seclabel>
|
||||||
|
</domain>
|
|
@ -0,0 +1,63 @@
|
||||||
|
<domain type="kvm">
|
||||||
|
<name>TestGuest</name>
|
||||||
|
<currentMemory>204800</currentMemory>
|
||||||
|
<memory>409600</memory>
|
||||||
|
<uuid>12345678-1234-1234-1234-123456789012</uuid>
|
||||||
|
<os>
|
||||||
|
<type arch="i686" machine="foobar">hvm</type>
|
||||||
|
<boot dev="hd"/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<acpi/><apic/>
|
||||||
|
</features>
|
||||||
|
<cpu match="exact">
|
||||||
|
<model>footest</model>
|
||||||
|
<vendor>Intel</vendor>
|
||||||
|
<topology sockets="4" cores="5" threads="2"/>
|
||||||
|
<feature policy="force" name="x2apic"/>
|
||||||
|
<feature policy="forbid" name="lahf_lm"/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset="utc"/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>restart</on_crash>
|
||||||
|
<vcpu cpuset="1-3">5</vcpu>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
|
||||||
|
<disk type="file" device="floppy">
|
||||||
|
<driver name="qemu" type="qcow2"/>
|
||||||
|
<source file="/default-pool/testvol1.img"/>
|
||||||
|
<target dev="fda" bus="fdc"/>
|
||||||
|
</disk>
|
||||||
|
<disk type="file" device="disk">
|
||||||
|
<driver name="qemu" type="raw"/>
|
||||||
|
<source file="/tmp/test.img"/>
|
||||||
|
<target dev="vda" bus="virtio"/>
|
||||||
|
</disk>
|
||||||
|
<disk type="block" device="disk">
|
||||||
|
<driver name="qemu"/>
|
||||||
|
<source dev="/dev/loop0"/>
|
||||||
|
<target dev="vdb" bus="virtio"/>
|
||||||
|
</disk>
|
||||||
|
<disk type="block" device="cdrom">
|
||||||
|
<target dev="hdc" bus="ide"/>
|
||||||
|
<readonly/>
|
||||||
|
</disk>
|
||||||
|
<interface type="network">
|
||||||
|
<source network="default"/>
|
||||||
|
<mac address="22:22:33:44:55:66"/>
|
||||||
|
<model type="virtio"/>
|
||||||
|
</interface>
|
||||||
|
<graphics type="sdl" display=":3.4" xauth="/tmp/.Xauthority"/>
|
||||||
|
<console type="pty"/>
|
||||||
|
<tpm model="tpm-tis">
|
||||||
|
<backend type="passthrough">
|
||||||
|
<backend path="/dev/tpm0"/>
|
||||||
|
</backend>
|
||||||
|
</tpm>
|
||||||
|
</devices>
|
||||||
|
<seclabel type="static" model="selinux">
|
||||||
|
<label>foolabel</label>
|
||||||
|
<imagelabel>imagelabel</imagelabel>
|
||||||
|
</seclabel>
|
||||||
|
</domain>
|
|
@ -724,6 +724,19 @@ class XMLParseTest(unittest.TestCase):
|
||||||
|
|
||||||
self._alter_compare(guest.get_xml_config(), outfile)
|
self._alter_compare(guest.get_xml_config(), outfile)
|
||||||
|
|
||||||
|
def testAlterTPM(self):
|
||||||
|
infile = "tests/xmlparse-xml/change-tpm-in.xml"
|
||||||
|
outfile = "tests/xmlparse-xml/change-tpm-out.xml"
|
||||||
|
guest = virtinst.Guest(conn=conn,
|
||||||
|
parsexml=file(infile).read())
|
||||||
|
|
||||||
|
dev1 = guest.get_devices("tpm")[0]
|
||||||
|
|
||||||
|
check = self._make_checker(dev1)
|
||||||
|
check("model", "tpm-tis", "tpm-tis")
|
||||||
|
|
||||||
|
self._alter_compare(guest.get_xml_config(), outfile)
|
||||||
|
|
||||||
def testConsoleCompat(self):
|
def testConsoleCompat(self):
|
||||||
infile = "tests/xmlparse-xml/console-compat-in.xml"
|
infile = "tests/xmlparse-xml/console-compat-in.xml"
|
||||||
outfile = "tests/xmlparse-xml/console-compat-out.xml"
|
outfile = "tests/xmlparse-xml/console-compat-out.xml"
|
||||||
|
|
|
@ -675,6 +675,7 @@ class Guest(XMLBuilderDomain.XMLBuilderDomain):
|
||||||
"smartcard" : virtinst.VirtualSmartCardDevice,
|
"smartcard" : virtinst.VirtualSmartCardDevice,
|
||||||
"redirdev" : virtinst.VirtualRedirDevice,
|
"redirdev" : virtinst.VirtualRedirDevice,
|
||||||
"memballoon": virtinst.VirtualMemballoon,
|
"memballoon": virtinst.VirtualMemballoon,
|
||||||
|
"tpm" : virtinst.VirtualTPMDevice,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Hand off all child element parsing to relevant classes
|
# Hand off all child element parsing to relevant classes
|
||||||
|
|
|
@ -45,6 +45,7 @@ class VirtualDevice(XMLBuilderDomain):
|
||||||
VIRTUAL_DEV_SMARTCARD = "smartcard"
|
VIRTUAL_DEV_SMARTCARD = "smartcard"
|
||||||
VIRTUAL_DEV_REDIRDEV = "redirdev"
|
VIRTUAL_DEV_REDIRDEV = "redirdev"
|
||||||
VIRTUAL_DEV_MEMBALLOON = "memballoon"
|
VIRTUAL_DEV_MEMBALLOON = "memballoon"
|
||||||
|
VIRTUAL_DEV_TPM = "tpm"
|
||||||
|
|
||||||
# Ordering in this list is important: it will be the order the
|
# Ordering in this list is important: it will be the order the
|
||||||
# Guest class outputs XML. So changing this may upset the test suite
|
# Guest class outputs XML. So changing this may upset the test suite
|
||||||
|
@ -64,7 +65,8 @@ class VirtualDevice(XMLBuilderDomain):
|
||||||
VIRTUAL_DEV_WATCHDOG,
|
VIRTUAL_DEV_WATCHDOG,
|
||||||
VIRTUAL_DEV_SMARTCARD,
|
VIRTUAL_DEV_SMARTCARD,
|
||||||
VIRTUAL_DEV_REDIRDEV,
|
VIRTUAL_DEV_REDIRDEV,
|
||||||
VIRTUAL_DEV_MEMBALLOON]
|
VIRTUAL_DEV_MEMBALLOON,
|
||||||
|
VIRTUAL_DEV_TPM]
|
||||||
|
|
||||||
# General device type (disk, interface, etc.)
|
# General device type (disk, interface, etc.)
|
||||||
_virtual_device_type = None
|
_virtual_device_type = None
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
# coding=utf-8
|
||||||
|
#
|
||||||
|
# Copyright 2011 Red Hat, Inc.
|
||||||
|
# Cole Robinson <crobinso@redhat.com>
|
||||||
|
# Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
#
|
||||||
|
# Copyright 2013 IBM Corporation
|
||||||
|
# Author: Stefan Berger <stefanb@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.
|
||||||
|
|
||||||
|
from virtinst.VirtualDevice import VirtualDevice
|
||||||
|
from virtinst.XMLBuilderDomain import _xml_property
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualTPMDevice(VirtualDevice):
|
||||||
|
|
||||||
|
_virtual_device_type = 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, typ=TYPE_DEFAULT,
|
||||||
|
parsexml=None, parsexmlnode=None, caps=None):
|
||||||
|
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 = typ
|
||||||
|
|
||||||
|
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):
|
||||||
|
device = "/dev/tpm0"
|
||||||
|
if self._device_path is not None:
|
||||||
|
device = self._device_path
|
||||||
|
|
||||||
|
xml = " <tpm model='%s'>\n" % self.model
|
||||||
|
xml += " <backend type='%s'>\n" % self.type
|
||||||
|
if self.type == "passthrough":
|
||||||
|
xml += " <device path='%s'/>\n" % device
|
||||||
|
xml += " </backend>\n"
|
||||||
|
xml += " </tpm>"
|
||||||
|
|
||||||
|
return xml
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualTPMPassthroughDevice(VirtualTPMDevice):
|
||||||
|
_tpm_type = VirtualTPMDevice.TPM_PASSTHROUGH
|
|
@ -38,6 +38,7 @@ from virtinst.VirtualFilesystem import VirtualFilesystem
|
||||||
from virtinst.VirtualSmartCardDevice import VirtualSmartCardDevice
|
from virtinst.VirtualSmartCardDevice import VirtualSmartCardDevice
|
||||||
from virtinst.VirtualRedirDevice import VirtualRedirDevice
|
from virtinst.VirtualRedirDevice import VirtualRedirDevice
|
||||||
from virtinst.VirtualMemballoon import VirtualMemballoon
|
from virtinst.VirtualMemballoon import VirtualMemballoon
|
||||||
|
from virtinst.VirtualTPMDevice import VirtualTPMDevice
|
||||||
from virtinst.DistroInstaller import DistroInstaller
|
from virtinst.DistroInstaller import DistroInstaller
|
||||||
from virtinst.PXEInstaller import PXEInstaller
|
from virtinst.PXEInstaller import PXEInstaller
|
||||||
from virtinst.LiveCDInstaller import LiveCDInstaller
|
from virtinst.LiveCDInstaller import LiveCDInstaller
|
||||||
|
|
Loading…
Reference in New Issue