[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.