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:
Stefan Berger 2013-06-25 21:45:06 -04:00 committed by Cole Robinson
parent c1a5bc91d7
commit c829b55581
7 changed files with 280 additions and 1 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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