Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxxxxxxx> --- man/virt-install.pod | 28 +++++++++++++++++++ tests/cli-test-xml/compare/many-devices.xml | 10 +++++++ tests/clitest.py | 11 +++++++- virt-install | 1 + virtinst/cli.py | 42 +++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) diff --git a/man/virt-install.pod b/man/virt-install.pod index f7b8cf6..32bbccf 100644 --- a/man/virt-install.pod +++ b/man/virt-install.pod @@ -1175,6 +1175,34 @@ Do not use memballoon device: --memballoon none +=item --tpm=TYPE[,OPTS] + +Configure a virtual TPM device. + +Type must be B<passthrough>. Additional options are: + +=over 4 + +=item B<model> + +The device model to present to the guest operating system. Model +must be B<tpm-tis>. + +=back + +An example invocation: + +=over 4 + +=item B<--tpm passthrough,model=tpm-tis> + +Make the host's TPM accessible to a single guest. + +=back + +See C<http://libvirt.org/formatdomain.html#elementsTpm> for complete +details. + =back =head2 Miscellaneous Options diff --git a/tests/cli-test-xml/compare/many-devices.xml b/tests/cli-test-xml/compare/many-devices.xml index a78d395..f71e3f3 100644 --- a/tests/cli-test-xml/compare/many-devices.xml +++ b/tests/cli-test-xml/compare/many-devices.xml @@ -76,6 +76,11 @@ </channel> <smartcard mode='passthrough' type='spicevmc'> </smartcard> + <tpm model='tpm-tis'> + <backend type='passthrough'> + <device path='/dev/tpm0'/> + </backend> + </tpm> </devices> <seclabel type='static' model='testSecurity' relabel='yes'> <label>system_u:object_r:svirt_image_t:s0:c100,c200</label> @@ -158,6 +163,11 @@ </channel> <smartcard mode='passthrough' type='spicevmc'> </smartcard> + <tpm model='tpm-tis'> + <backend type='passthrough'> + <device path='/dev/tpm0'/> + </backend> + </tpm> </devices> <seclabel type='static' model='testSecurity' relabel='yes'> <label>system_u:object_r:svirt_image_t:s0:c100,c200</label> diff --git a/tests/clitest.py b/tests/clitest.py index 806c5d7..a1176e1 100644 --- a/tests/clitest.py +++ b/tests/clitest.py @@ -429,6 +429,15 @@ vinst.add_invalid("smartcard", "--smartcard passthrough,type=foo") # Invalid ty vinst.add_invalid("smartcard", "--smartcard host,foobar=baz") # --smartcard bogus +vinst.add_category("tpm", "--noautoconsole --nodisks --pxe") +vinst.add_valid("tpm", "--tpm passthrough") # --tpm passthrough +vinst.add_valid("tpm", "--tpm passthrough,model=tpm-tis") # --tpm backend type with model +vinst.add_valid("tpm", "--tpm passthrough,model=tpm-tis,path=/dev/tpm0") # --tpm backend type with model and device path +vinst.add_invalid("tpm", "--tpm") # Missing argument +vinst.add_invalid("tpm", "--tpm foo") # Invalid argument +vinst.add_invalid("tpm", "--tpm passthrough,model=foo") # Invalid model + + vinst.add_category("xen", "--connect %(XENURI)s --noautoconsole") vinst.add_compare("xen", "--disk %(EXISTIMG1)s --import", "xen-default") # Xen default vinst.add_compare("xen", "--disk %(EXISTIMG1)s --location %(TREEDIR)s --paravirt", "xen-pv") # Xen PV @@ -461,7 +470,7 @@ vinst.add_category("misc", "--nographics --noautoconsole") vinst.add_compare("misc", "", "noargs-fail") # No arguments vinst.add_compare("misc", "--hvm --nodisks --pxe --print-step all", "simple-pxe") # Diskless PXE install vinst.add_compare("misc", "--hvm --cdrom %(EXISTIMG2)s --file %(EXISTIMG1)s --os-variant win2k3 --wait 0 --vcpus cores=4", "w2k3-cdrom") # HVM windows install with disk -vinst.add_compare("misc", """--hvm --pxe --controller usb,model=ich9-ehci1,address=0:0:4.7,index=0 --controller usb,model=ich9-uhci1,address=0:0:4.0,index=0,master=0 --controller usb,model=ich9-uhci2,address=0:0:4.1,index=0,master=2 --controller usb,model=ich9-uhci3,address=0:0:4.2,index=0,master=4 --disk %(MANAGEDEXISTUPPER)s,cache=writeback,io=threads,perms=sh,serial=WD-WMAP9A966149 --disk %(NEWIMG1)s,sparse=false,size=.001,perms=ro,error_policy=enospace --disk device=cdrom,bus=sata --serial tcp,host=:2222,mode=bind,protocol=telnet --filesystem /source,/target,mode=squash --network user,mac=12:34:56:78:11:22 --network bridge=foobar,model=virtio --channel spicevmc --smartcard passthrough,type=spicevmc --security type=static,label='system_u:object_r:svirt_image_t:s0:c100,c200',relabel=yes --numatune \\"1-3,5\\",mode=preferred --boot loader=/foo/bar """, "many-devices") # Lot's of devices +vinst.add_compare("misc", """--hvm --pxe --controller usb,model=ich9-ehci1,address=0:0:4.7,index=0 --controller usb,model=ich9-uhci1,address=0:0:4.0,index=0,master=0 --controller usb,model=ich9-uhci2,address=0:0:4.1,index=0,master=2 --controller usb,model=ich9-uhci3,address=0:0:4.2,index=0,master=4 --disk %(MANAGEDEXISTUPPER)s,cache=writeback,io=threads,perms=sh,serial=WD-WMAP9A966149 --disk %(NEWIMG1)s,sparse=false,size=.001,perms=ro,error_policy=enospace --disk device=cdrom,bus=sata --serial tcp,host=:2222,mode=bind,protocol=telnet --filesystem /source,/target,mode=squash --network user,mac=12:34:56:78:11:22 --network bridge=foobar,model=virtio --channel spicevmc --smartcard passthrough,type=spicevmc --tpm passthrough,model=tpm-tis,path=/dev/tpm0 --security type=static,label='system_u:object_r:svirt_image_t:s0:c100,c200',relabel=yes --numatune \\"1-3,5\\",mode=preferred --boot loader=/foo/bar """, "many-devices") # Lot's of devices vinst.add_compare("misc", "--connect %(DEFAULTURI)s --hvm --nodisks --pxe --cpuset auto --vcpus 2", "cpuset-auto") # --cpuset=auto actually works vinst.add_valid("misc", "--hvm --disk path=virt-install,device=cdrom") # Specifying cdrom media via --disk vinst.add_valid("misc", "--hvm --import --disk path=virt-install") # FV Import install diff --git a/virt-install b/virt-install index 1b76015..6e1bad2 100755 --- a/virt-install +++ b/virt-install @@ -546,6 +546,7 @@ def build_guest_instance(conn, options): guest, cli.parse_console) cli.get_hostdevs(options.hostdevs, guest) cli.get_smartcard(guest, options.smartcard) + cli.get_tpm(guest, options.tpm) # Install options diff --git a/virtinst/cli.py b/virtinst/cli.py index 99c49aa..74814c8 100644 --- a/virtinst/cli.py +++ b/virtinst/cli.py @@ -1042,6 +1042,17 @@ def get_smartcard(guest, sc_opts): guest.add_device(dev) +def get_tpm(guest, tpm_opts): + for tpm in listify(tpm_opts): + try: + dev = parse_tpm(guest, tpm) + except Exception, e: + fail(_("Error in TPM device parameters: %s") % str(e)) + + if dev: + guest.add_device(dev) + + def get_controller(guest, sc_opts): for sc in listify(sc_opts): try: @@ -1178,6 +1189,9 @@ def add_device_options(devg): devg.add_option("", "--memballoon", dest="memballoon", action="append", help=_("Configure a guest memballoon device. Ex:\n" "--memballoon model=virtio")) + devg.add_option("", "--tpm", dest="tpm", action="append", + help=_("Configure a guest TPM device. Ex:\n" + "--tpm type=passthrough")) def add_gfx_option(devg): @@ -1901,6 +1915,34 @@ 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 type 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("model", "model") + set_param("type", "type") + set_param("path", "path") + + 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