[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] The attached patch does the following:
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID 136aea67b3698aa19e977cd44db7785498a3ad87 # Parent 911f3ecd975ede0e1d3dab529d49dc8102f2da89 The attached patch does the following: - introduces two basic tests for the virtual TPM (skipped on hardware where a TPM is not available or vtpm manager has not been started manually before) - adapts the Makefiles to make the test cases available - splits up the hotplug files into two files where the vtpm-common.sh can be sourced by 'other' scripts as well - uses echo "$var" to return variables from functions - gets rid of the 'set +e" work-around - introduces a script (vtpm-delete) to delete entries from the virtual TPM directory in /etc/xen/vtpm.db The xm-tests will skip over the 2nd test on most systems and the patch has otherwise no effect on existing tests. Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxx> diff -r 911f3ecd975e -r 136aea67b369 tools/examples/Makefile --- a/tools/examples/Makefile Mon Feb 27 15:11:01 2006 +++ b/tools/examples/Makefile Mon Feb 27 15:13:05 2006 @@ -26,10 +26,10 @@ XEN_SCRIPTS += network-nat vif-nat XEN_SCRIPTS += block XEN_SCRIPTS += block-enbd block-nbd -XEN_SCRIPTS += vtpm +XEN_SCRIPTS += vtpm vtpm-delete XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh -XEN_SCRIPT_DATA += block-common.sh vtpm-common.sh +XEN_SCRIPT_DATA += block-common.sh vtpm-common.sh vtpm-hotplug-common.sh XEN_HOTPLUG_DIR = /etc/hotplug XEN_HOTPLUG_SCRIPTS = xen-backend.agent diff -r 911f3ecd975e -r 136aea67b369 tools/examples/vtpm --- a/tools/examples/vtpm Mon Feb 27 15:11:01 2006 +++ b/tools/examples/vtpm Mon Feb 27 15:13:05 2006 @@ -1,7 +1,7 @@ #!/bin/sh dir=$(dirname "$0") -. "$dir/vtpm-common.sh" +. "$dir/vtpm-hotplug-common.sh" vtpm_fatal_error=0 diff -r 911f3ecd975e -r 136aea67b369 tools/examples/vtpm-common.sh --- a/tools/examples/vtpm-common.sh Mon Feb 27 15:11:01 2006 +++ b/tools/examples/vtpm-common.sh Mon Feb 27 15:13:05 2006 @@ -17,21 +17,8 @@ # dir=$(dirname "$0") -. "$dir/xen-hotplug-common.sh" - -findCommand "$@" -if [ "$command" != "online" ] && - [ "$command" != "offline" ] && - [ "$command" != "add" ] && - [ "$command" != "remove" ] -then - log err "Invalid command: $command" - exit 1 -fi - - -XENBUS_PATH="${XENBUS_PATH:?}" - +. "$dir/logging.sh" +. "$dir/locking.sh" VTPMDB="/etc/xen/vtpm.db" @@ -58,7 +45,11 @@ function vtpm_resume() { true } + function vtpm_delete() { + true + } fi + #Find the instance number for the vtpm given the name of the domain # Parameters @@ -66,7 +57,7 @@ # Return value # Returns '0' if instance number could not be found, otherwise # it returns the instance number in the variable 'instance' -function find_instance () { +function vtpmdb_find_instance () { local vmname=$1 local ret=0 instance=`cat $VTPMDB | \ @@ -80,18 +71,17 @@ } \ }'` if [ "$instance" != "" ]; then - ret=1 - fi - return $ret + ret=$instance + fi + echo "$ret" } # Check whether a particular instance number is still available -# returns '1' if it is available -function is_free_instancenum () { +# returns "0" if it is not available, "1" otherwise. +function vtpmdb_is_free_instancenum () { local instance=$1 local avail=1 - #Allowed instance number range: 1-255 if [ $instance -eq 0 -o $instance -gt 255 ]; then avail=0 @@ -110,13 +100,13 @@ fi done fi - return $avail + echo "$avail" } # Get an available instance number given the database # Returns an unused instance number -function get_free_instancenum () { +function vtpmdb_get_free_instancenum () { local ctr local instances local don @@ -145,12 +135,12 @@ fi let ctr=ctr+1 done - let instance=$ctr + echo "$ctr" } # Add a domain name and instance number to the DB file -function add_instance () { +function vtpmdb_add_instance () { local vmname=$1 local inst=$2 @@ -159,8 +149,8 @@ echo "#1st column: domain name" >> $VTPMDB echo "#2nd column: TPM instance number" >> $VTPMDB fi - validate_entry $vmname $inst - if [ $? -eq 0 ]; then + res=$(vtpmdb_validate_entry $vmname $inst) + if [ $res -eq 0 ]; then echo "$vmname $inst" >> $VTPMDB fi } @@ -168,11 +158,10 @@ #Validate whether an entry is the same as passed to this #function -function validate_entry () { +function vtpmdb_validate_entry () { local rc=0 local vmname=$1 local inst=$2 - local res res=`cat $VTPMDB | \ gawk -vvmname=$vmname \ @@ -197,13 +186,15 @@ elif [ "$res" == "2" ]; then let rc=2 fi - return $rc + echo "$rc" } #Remove an entry from the vTPM database given its domain name -function remove_entry () { +#and instance number +function vtpmdb_remove_entry () { local vmname=$1 + local instance=$2 local VTPMDB_TMP="$VTPMDB".tmp `cat $VTPMDB | \ gawk -vvmname=$vmname \ @@ -214,6 +205,7 @@ '} > $VTPMDB_TMP` if [ -e $VTPMDB_TMP ]; then mv -f $VTPMDB_TMP $VTPMDB + vtpm_delete $instance else log err "Error creating temporary file '$VTPMDB_TMP'." fi @@ -222,7 +214,7 @@ # Find the reason for the creation of this device: # Set global REASON variable to 'resume' or 'create' -function get_create_reason () { +function vtpm_get_create_reason () { local resume=$(xenstore-read $XENBUS_PATH/resume) if [ "$resume" == "True" ]; then REASON="resume" @@ -230,6 +222,7 @@ REASON="create" fi } + #Create a vTPM instance # If no entry in the TPM database is found, the instance is @@ -237,26 +230,23 @@ function vtpm_create_instance () { local domname=$(xenstore_read "$XENBUS_PATH"/domain) local res - set +e - get_create_reason + local instance + vtpm_get_create_reason claim_lock vtpmdb - - find_instance $domname - res=$? - if [ $res -eq 0 ]; then + instance=$(vtpmdb_find_instance $domname) + if [ "$instance" == "0" ]; then #Try to give the preferred instance to the domain instance=$(xenstore_read "$XENBUS_PATH"/pref_instance) if [ "$instance" != "" ]; then - is_free_instancenum $instance - res=$? + res=$(vtpmdb_is_free_instancenum $instance) if [ $res -eq 0 ]; then - get_free_instancenum + instance=$(vtpmdb_get_free_instancenum) fi else - get_free_instancenum + instance=$(vtpmdb_get_free_instancenum) fi - add_instance $domname $instance + vtpmdb_add_instance $domname $instance if [ "$REASON" == "create" ]; then vtpm_create $instance elif [ "$REASON" == "resume" ]; then @@ -279,25 +269,40 @@ true fi xenstore_write $XENBUS_PATH/instance $instance - set -e -} - - -#Remove an instance +} + + +#Remove an instance when a VM is terminating or suspending. +#Since it is assumed that the VM will appear again, the +#entry is kept in the VTPMDB file. function vtpm_remove_instance () { local domname=$(xenstore_read "$XENBUS_PATH"/domain) - set +e - find_instance $domname - res=$? - if [ $res -eq 0 ]; then - #Something is really wrong with the DB - log err "vTPM DB file $VTPMDB has no entry for '$domname'" - else + + claim_lock vtpmdb + + instance=$(vtpmdb_find_instance $domname) + + if [ "$instance" != "0" ]; then if [ "$REASON" == "suspend" ]; then vtpm_suspend $instance fi fi - set -e -} - - + + release_lock vtpmdb +} + + +#Remove an entry in the VTPMDB file given the domain's name +#1st parameter: The name of the domain +function vtpm_delete_instance () { + local rc + + claim_lock vtpmdb + + instance=$(vtpmdb_find_instance $1) + if [ "$instance" != "0" ]; then + vtpmdb_remove_entry $1 $instance + fi + + release_lock vtpmdb +} diff -r 911f3ecd975e -r 136aea67b369 tools/xm-test/configure.ac --- a/tools/xm-test/configure.ac Mon Feb 27 15:11:01 2006 +++ b/tools/xm-test/configure.ac Mon Feb 27 15:13:05 2006 @@ -93,6 +93,7 @@ tests/unpause/Makefile tests/vcpu-pin/Makefile tests/vcpu-disable/Makefile + tests/vtpm/Makefile tests/enforce_dom0_cpus/Makefile lib/XmTestReport/xmtest.py lib/XmTestLib/config.py diff -r 911f3ecd975e -r 136aea67b369 tools/xm-test/lib/XmTestLib/XenDomain.py --- a/tools/xm-test/lib/XmTestLib/XenDomain.py Mon Feb 27 15:11:01 2006 +++ b/tools/xm-test/lib/XmTestLib/XenDomain.py Mon Feb 27 15:13:05 2006 @@ -99,6 +99,7 @@ # These options need to be lists self.defaultOpts["disk"] = [] self.defaultOpts["vif"] = [] + self.defaultOpts["vtpm"] = [] self.opts = self.defaultOpts diff -r 911f3ecd975e -r 136aea67b369 tools/xm-test/tests/Makefile.am --- a/tools/xm-test/tests/Makefile.am Mon Feb 27 15:11:01 2006 +++ b/tools/xm-test/tests/Makefile.am Mon Feb 27 15:13:05 2006 @@ -23,6 +23,7 @@ unpause \ vcpu-disable \ vcpu-pin \ + vtpm \ enforce_dom0_cpus \ save restore migrate diff -r 911f3ecd975e -r 136aea67b369 xen-unstable.hg/tools/examples/vtpm-delete --- /dev/null Mon Feb 27 15:11:01 2006 +++ b/xen-unstable.hg/tools/examples/vtpm-delete Mon Feb 27 15:13:05 2006 @@ -0,0 +1,9 @@ +#!/bin/sh + +# This scripts must be called the following way: +# vtpm-delete <domain name> + +dir=$(dirname "$0") +. "$dir/vtpm-common.sh" + +vtpm_delete_instance $1 diff -r 911f3ecd975e -r 136aea67b369 xen-unstable.hg/tools/examples/vtpm-hotplug-common.sh --- /dev/null Mon Feb 27 15:11:01 2006 +++ b/xen-unstable.hg/tools/examples/vtpm-hotplug-common.sh Mon Feb 27 15:13:05 2006 @@ -0,0 +1,35 @@ +# +# Copyright (c) 2005 IBM Corporation +# Copyright (c) 2005 XenSource Ltd. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of version 2.1 of the GNU Lesser General Public +# License as published by the Free Software Foundation. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +dir=$(dirname "$0") +. "$dir/xen-hotplug-common.sh" + +findCommand "$@" +if [ "$command" != "online" ] && + [ "$command" != "offline" ] && + [ "$command" != "add" ] && + [ "$command" != "remove" ] +then + log err "Invalid command: $command" + exit 1 +fi + + +XENBUS_PATH="${XENBUS_PATH:?}" + +. "$dir/vtpm-common.sh" diff -r 911f3ecd975e -r 136aea67b369 xen-unstable.hg/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py --- /dev/null Mon Feb 27 15:11:01 2006 +++ b/xen-unstable.hg/tools/xm-test/tests/vtpm/01_vtpm-list_pos.py Mon Feb 27 15:13:05 2006 @@ -0,0 +1,45 @@ +#!/usr/bin/python + +# Copyright (C) International Business Machines Corp., 2006 +# Author: Stefan Berger <stefanb@xxxxxxxxxx) + +# Positive Test: create domain with virtual TPM attached at build time, +# verify list + + +from XmTestLib import * + +def vtpm_cleanup(domName): + # Since this is only a temporary domain I clean up the domain from the + # virtual TPM directory + traceCommand("/etc/xen/scripts/vtpm-delete %s" % domName) + +if ENABLE_HVM_SUPPORT: + SKIP("vtpm-list not supported for HVM domains") + +config = {"vtpm":"instance=1,backend=0"} +domain = XmTestDomain(extraConfig=config) + +try: + domain.start() +except DomainError, e: + if verbose: + print e.extra + vtpm_cleanup(domain.getName()) + FAIL("Unable to create domain") + +domName = domain.getName() + +status, output = traceCommand("xm vtpm-list %s" % domain.getId()) +eyecatcher = "/local/domain/0/backend/vtpm" +where = output.find(eyecatcher) +if status != 0: + vtpm_cleanup(domName) + FAIL("xm vtpm-list returned bad status, expected 0, status is %i" % status) +elif where < 0: + vtpm_cleanup(domName) + FAIL("Fail to list virtual TPM device") + +domain.stop() + +vtpm_cleanup(domName) diff -r 911f3ecd975e -r 136aea67b369 xen-unstable.hg/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py --- /dev/null Mon Feb 27 15:11:01 2006 +++ b/xen-unstable.hg/tools/xm-test/tests/vtpm/02_vtpm-cat_pcrs.py Mon Feb 27 15:13:05 2006 @@ -0,0 +1,81 @@ +#!/usr/bin/python + +# Copyright (C) International Business Machines Corp., 2006 +# Author: Stefan Berger <stefanb@xxxxxxxxxx) + +# Positive Test: create domain with virtual TPM attached at build time, +# check list of pcrs + +from XmTestLib import * + +def vtpm_cleanup(domName): + # Since this is only a temporary domain I clean up the domain from the + # virtual TPM directory + traceCommand("/etc/xen/scripts/vtpm-delete %s" % domName) + +if ENABLE_HVM_SUPPORT: + SKIP("vtpm-list not supported for HVM domains") + +status, output = traceCommand("ls /dev/tpm0") +if re.search("No such file or directory",output): + SKIP("This machine has no hardware TPM; cannot run this test") + +status, output = traceCommand("ps aux | grep vtpm_manager | grep -v grep") +if output == "": + FAIL("virtual TPM manager must be started to run this test") + +# vtpm manager has been detected +config = {"vtpm":"instance=1,backend=0"} +domain = XmTestDomain(extraConfig=config) + +try: + domain.start() +except DomainError, e: + if verbose: + print e.extra + vtpm_cleanup(domain.getName()) + FAIL("Unable to create domain") + +domName = domain.getName() + +try: + console = XmConsole(domain.getName()) +except ConsoleError, e: + vtpm_cleanup(domName) + FAIL(str(e)) + +try: + console.sendInput("input") + run = console.runCmd("ls /sys") +except ConsoleError, e: + saveLog(console.getHistory()) + vtpm_cleanup(domName) + FAIL(str(e)) + +if re.search("No such file",run["output"]): + try: + run = console.runCmd("mkdir /sys") + run = console.runCmd("mount -t sysfs /sys /sys") + except ConsoleError, e: + saveLog(console.getHistory()) + vtpm_cleanup(domName) + FAIL(str(e)) + +try: + run = console.runCmd("cat /sys/devices/platform/tpm_vtpm/pcrs") +except ConsoleError, e: + saveLog(console.getHistory()) + vtpm_cleanup(domName) + FAIL(str(e)) + +if re.search("No such file",run["output"]): + FAIL("TPM frontend support not compiled into (domU?) kernel") + +console.closeConsole() + +domain.stop() + +vtpm_cleanup(domName) + +if not re.search("PCR-00:",run["output"]): + FAIL("Virtual TPM is not working correctly on /dev/vtpm on backend side") diff -r 911f3ecd975e -r 136aea67b369 xen-unstable.hg/tools/xm-test/tests/vtpm/Makefile.am --- /dev/null Mon Feb 27 15:11:01 2006 +++ b/xen-unstable.hg/tools/xm-test/tests/vtpm/Makefile.am Mon Feb 27 15:13:05 2006 @@ -0,0 +1,22 @@ + +SUBDIRS = + +TESTS = 01_vtpm-list_pos.test \ + 02_vtpm-cat_pcrs.test + +XFAIL_TESTS = + +EXTRA_DIST = $(TESTS) $(XFAIL_TESTS) + +TESTS_ENVIRONMENT=@TENV@ + +%.test: %.py + cp $< $@ + chmod +x $@ + +clean-local: am_config_clean-local + +am_config_clean-local: + rm -f *test + rm -f *log + rm -f *~ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |