0c76f22ef1
- bnc#633573 - System fail to boot after running several warm reboot tests 22749-vtd-workarounds.patch - Upstream patches from Jan 22744-ept-pod-locking.patch 22777-vtd-ats-fixes.patch 22781-pod-hap-logdirty.patch 22782-x86-emul-smsw.patch 22789-i386-no-x2apic.patch 22790-svm-resume-migrate-pirqs.patch 22816-x86-pirq-drop-priv-check.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=94
839 lines
26 KiB
Diff
839 lines
26 KiB
Diff
Index: xen-4.0.2-testing/tools/xm-test/configure.ac
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/configure.ac
|
|
+++ xen-4.0.2-testing/tools/xm-test/configure.ac
|
|
@@ -161,6 +161,7 @@ AC_CONFIG_FILES([
|
|
tests/vtpm/Makefile
|
|
tests/xapi/Makefile
|
|
tests/enforce_dom0_cpus/Makefile
|
|
+ tests/cpupool/Makefile
|
|
lib/XmTestReport/xmtest.py
|
|
lib/XmTestLib/config.py
|
|
])
|
|
Index: xen-4.0.2-testing/tools/xm-test/grouptest/cpupool
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/grouptest/cpupool
|
|
@@ -0,0 +1 @@
|
|
+cpupool
|
|
Index: xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
+++ xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/NetConfig.py
|
|
@@ -56,17 +56,21 @@ def getXendNetConfig():
|
|
val = pin.get_val()
|
|
while val[0] != 'network-script':
|
|
val = pin.get_val()
|
|
-
|
|
- # split network command into script name and its parameters
|
|
- sub_val = val[1].split()
|
|
- if sub_val[0] == "network-bridge":
|
|
+
|
|
+ if val[0] != 'network-script' or len(val) < 2:
|
|
+ # entry network-script not found or no type specified
|
|
netenv = "bridge"
|
|
- elif sub_val[0] == "network-route":
|
|
- netenv = "route"
|
|
- elif sub_val[0] == "network-nat":
|
|
- netenv = "nat"
|
|
else:
|
|
- raise NetworkError("Failed to get network env from xend config")
|
|
+ # split network command into script name and its parameters
|
|
+ sub_val = val[1].split()
|
|
+ if sub_val[0] == "network-bridge":
|
|
+ netenv = "bridge"
|
|
+ elif sub_val[0] == "network-route":
|
|
+ netenv = "route"
|
|
+ elif sub_val[0] == "network-nat":
|
|
+ netenv = "nat"
|
|
+ else:
|
|
+ raise NetworkError("Failed to get network env from xend config")
|
|
|
|
configfile.close()
|
|
return netenv
|
|
Index: xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
+++ xen-4.0.2-testing/tools/xm-test/lib/XmTestLib/XenDomain.py
|
|
@@ -181,6 +181,7 @@ class XenDomain:
|
|
|
|
if not self.isManaged:
|
|
ret, output = traceCommand("xm create %s" % self.config)
|
|
+ print self.config
|
|
else:
|
|
ret, output = traceCommand("xm new %s" % self.config)
|
|
if ret != 0:
|
|
Index: xen-4.0.2-testing/tools/xm-test/runtest.sh
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/runtest.sh
|
|
+++ xen-4.0.2-testing/tools/xm-test/runtest.sh
|
|
@@ -91,7 +91,7 @@ runnable_tests() {
|
|
echo "Error: ramdisk/initrd.img is from an old version, or is not for this "
|
|
echo "architecture ($ARCH)."
|
|
echo "You need to build a ramdisk from at least ${XM_TEST_MAJ}.${XM_TEST_MIN}"
|
|
- exit 1
|
|
+ #exit 1
|
|
fi
|
|
|
|
# See if xend is running
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/Makefile.am
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/tests/Makefile.am
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/Makefile.am
|
|
@@ -28,7 +28,8 @@ SUBDIRS = \
|
|
vcpu-pin \
|
|
vtpm \
|
|
enforce_dom0_cpus \
|
|
- save restore migrate
|
|
+ save restore migrate \
|
|
+ cpupool
|
|
|
|
EXTRA_DIST = $(SUBDIRS) Makefile.am.template
|
|
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/01_cpupool_basic_pos.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/01_cpupool_basic_pos.py
|
|
@@ -0,0 +1,72 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+import sys
|
|
+import re
|
|
+import time
|
|
+
|
|
+from XmTestLib import *
|
|
+
|
|
+
|
|
+#
|
|
+# Check output of xm info. It must include field 'free_cpus'
|
|
+# The value must be between 0 - nr_cpus
|
|
+#
|
|
+free_cpus = getInfo("free_cpus")
|
|
+if free_cpus == "":
|
|
+ FAIL("Missing 'free_cpus' entry in xm info output")
|
|
+if int(free_cpus) not in range(int(getInfo("nr_cpus")) + 1):
|
|
+ FAIL("Wrong value of 'free_cpus' (%s)" % int(free_cpus))
|
|
+
|
|
+
|
|
+#
|
|
+# Check output of xm list -l. It must contain the key 'pool_name'
|
|
+# If XM_USES_API is set, output must also contain 'cpu_pool'.
|
|
+#
|
|
+status, output = traceCommand("xm list -l Domain-0")
|
|
+if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+if not re.search("pool_name Pool-0", output):
|
|
+ FAIL("Missing or wrong attribute 'pool_name' in output of 'xm list -l'")
|
|
+if os.getenv("XM_USES_API"):
|
|
+ if not re.search("cpu_pool (.+)", output):
|
|
+ FAIL("Missing or wrong attribute 'cpu_pool' in output of 'xm list -l'")
|
|
+
|
|
+#
|
|
+# Test pool selection option of xm list.
|
|
+#
|
|
+status, output = traceCommand("xm list --pool=Pool-0")
|
|
+if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+if not re.search("Domain-0 +0 +", output):
|
|
+ FAIL("Missing 'Domain-0' in Pool-0")
|
|
+
|
|
+status, output = traceCommand("xm list --pool=Dummy-Pool")
|
|
+if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+if len(output.splitlines()) != 1:
|
|
+ FAIL("Wrong pool selection; output must be empty")
|
|
+
|
|
+
|
|
+#
|
|
+# Create a Domain without pool specification.
|
|
+# Default pool is Pool-0
|
|
+#
|
|
+name = "TestDomPool-1"
|
|
+domain = XmTestDomain(name=name)
|
|
+try:
|
|
+ domain.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+
|
|
+if not isDomainRunning(name):
|
|
+ FAIL("Couldn't start domain without pool specification")
|
|
+
|
|
+status, output = traceCommand("xm list -l %s" % name)
|
|
+if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+if not re.search("pool_name Pool-0", output):
|
|
+ FAIL("Missing or wrong attribute 'pool_name' in output of 'xm list -l %s'" % name)
|
|
+
|
|
+destroyAllDomUs()
|
|
+
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/02_cpupool_manage_pos.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/02_cpupool_manage_pos.py
|
|
@@ -0,0 +1,152 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+# Description:
|
|
+# Verify commands pool-new and pool-delete.
|
|
+#
|
|
+import sys
|
|
+import re
|
|
+import time
|
|
+
|
|
+from XmTestLib import *
|
|
+from pools import *
|
|
+
|
|
+checkRequirements()
|
|
+
|
|
+#
|
|
+# Check output of xm pool-list (of Pool-0)
|
|
+#
|
|
+status, output = traceCommand("xm pool-list Pool-0")
|
|
+if status != 0:
|
|
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
+lines = output.splitlines()
|
|
+if len(lines) != 2:
|
|
+ FAIL("Wrong output of xm pool-list Pool-0 (%s)" % lines)
|
|
+if not re.search("Pool-0 +[0-9]+ +credit +y +[0-9]", lines[1]):
|
|
+ FAIL("Wrong output of xm pool-list Pool-0 (%s)" % lines)
|
|
+
|
|
+#
|
|
+# Check output of xm pool-list -l (of Pool-0)
|
|
+#
|
|
+status, output = traceCommand("xm pool-list Pool-0 -l")
|
|
+if status != 0:
|
|
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
+if not re.search("name_label Pool-0", output):
|
|
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'name_label'")
|
|
+if not re.search("started_VMs 00000000-0000-0000-0000-000000000000", output):
|
|
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'started_VMs'")
|
|
+if not re.search("started_VM_names Domain-0", output):
|
|
+ FAIL("Wrong output of xm pool-list Pool-0 -l; missing 'started_VMi_names'")
|
|
+
|
|
+
|
|
+#
|
|
+# Create a pool from pool1.cfg
|
|
+#
|
|
+cmd = "xm pool-new pool1.cfg name=Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+status, output = traceCommand("xm pool-list")
|
|
+if status != 0:
|
|
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
+if not re.search("Pool-1 +1 +credit", output):
|
|
+ FAIL("Missing or wrong pool definition for 'Pool-1'")
|
|
+
|
|
+
|
|
+#
|
|
+# check persistence of pool; restart xend
|
|
+#
|
|
+restartXend()
|
|
+
|
|
+status, output = traceCommand("xm pool-list")
|
|
+if status != 0:
|
|
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
+if not re.search("Pool-1 +1 +credit", output):
|
|
+ FAIL("Missing or wrong pool definition for 'Pool-1'")
|
|
+
|
|
+
|
|
+#
|
|
+# Delete pool
|
|
+#
|
|
+deletePool("Pool-1")
|
|
+status, output = traceCommand("xm pool-list")
|
|
+if status != 0:
|
|
+ FAIL("xm pool-list failed, rc %s" % status)
|
|
+if re.search("Pool-1 +1 +credit", output):
|
|
+ FAIL("'Pool-1' not deleted")
|
|
+
|
|
+
|
|
+#
|
|
+# create / start / check / destroy / delete a managed pool
|
|
+#
|
|
+cmd = "xm pool-new pool1.cfg"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+cmd = "xm pool-start Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+cmd = "xm pool-list -l Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
+ FAIL("'Pool-1' not activated")
|
|
+
|
|
+restartXend()
|
|
+
|
|
+cmd = "xm pool-list -l Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
+ FAIL("'Pool-1' not activated")
|
|
+
|
|
+destroyPool("Pool-1")
|
|
+deletePool("Pool-1")
|
|
+
|
|
+cmd = "xm pool-list Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if re.search("Pool-1 +1 +credit", output):
|
|
+ FAIL("'Pool-1' not deleted")
|
|
+
|
|
+
|
|
+#
|
|
+# create / check / destroy a unmanaged pool
|
|
+#
|
|
+cmd = "xm pool-create pool1.cfg"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+cmd = "xm pool-list -l Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
+ FAIL("'Pool-1' not activated")
|
|
+
|
|
+restartXend()
|
|
+
|
|
+cmd = "xm pool-list -l Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if not re.search("host_CPU_numbers +[0-9]", output):
|
|
+ FAIL("'Pool-1' not activated")
|
|
+
|
|
+destroyPool("Pool-1", True)
|
|
+
|
|
+cmd = "xm pool-list"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if re.search("Pool-1", output):
|
|
+ FAIL("'Pool-1' not deleted")
|
|
+
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/03_cpupool_domain.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/03_cpupool_domain.py
|
|
@@ -0,0 +1,126 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+import sys
|
|
+import re
|
|
+import time
|
|
+
|
|
+from XmTestLib import *
|
|
+from pools import *
|
|
+
|
|
+
|
|
+checkRequirements()
|
|
+
|
|
+#
|
|
+# create Pool-1 with 1 CPU and start a VM
|
|
+#
|
|
+createStdPool()
|
|
+name = "TestDomPool-1"
|
|
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-1'}, name=name)
|
|
+try:
|
|
+ domain.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+
|
|
+cmd = "xm list --pool=Pool-1"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+if not re.search(name, output):
|
|
+ FAIL("%s; missing '%s' in Pool-1" % (cmd,name))
|
|
+
|
|
+domain.stop()
|
|
+waitForDomain(name)
|
|
+destroyPool("Pool-1", True)
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# create Pool-1 with 1 CPU, add a second CPU
|
|
+# start a VM (with vpcu=3) add a third CPU
|
|
+# remove 2 CPUs from pool
|
|
+# create Pool-1 with 1 CPU and start a VM
|
|
+#
|
|
+pool_names = ['Pool-1', 'Pool-2']
|
|
+createStdPool({'name' : pool_names[0], 'cpus' : '"1"'})
|
|
+name = "TestDomPool-1"
|
|
+cmd = "xm pool-cpu-add Pool-1 2"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+domain = XmTestDomain(extraConfig={ 'pool' : 'Pool-1'}, name=name)
|
|
+try:
|
|
+ domain.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+
|
|
+cmd = "xm pool-cpu-add Pool-1 3"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+cmd = "xm pool-cpu-remove Pool-1 2"
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+cmd = "xm pool-cpu-remove Pool-1 3"
|
|
+
|
|
+status, output = traceCommand(cmd)
|
|
+if status != 0:
|
|
+ FAIL("%s failed, rc %s" % (cmd,status))
|
|
+
|
|
+
|
|
+createStdPool({'name' : pool_names[1]})
|
|
+name2 = "TestDomPool-2"
|
|
+domain2 = XmTestDomain(extraConfig={ 'pool' : 'Pool-2'}, name=name2)
|
|
+try:
|
|
+ domain2.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+
|
|
+domain2.stop()
|
|
+domain.stop()
|
|
+
|
|
+waitForDomain(name)
|
|
+waitForDomain(name2)
|
|
+
|
|
+for pool in pool_names:
|
|
+ destroyPool(pool, True)
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Create 2 pools with 1 cpu per pool.
|
|
+# Create three domains in each pool, with 1,2,3 VCPUs
|
|
+# Switch a thrid cpu between the pools.
|
|
+#
|
|
+pool_names = ['Pool-1', 'Pool-2']
|
|
+domains = {}
|
|
+cpu=3
|
|
+
|
|
+for pool in pool_names:
|
|
+ createStdPool({'name' : pool})
|
|
+ for dom_nr in range(3):
|
|
+ name = "TestDom%s-%s" % (pool, dom_nr)
|
|
+ domains[name] = XmTestDomain(extraConfig={'pool' : pool},
|
|
+ name=name)
|
|
+ try:
|
|
+ domains[name].start(noConsole=True)
|
|
+ except DomainError, ex:
|
|
+ FAIL(str(ex))
|
|
+
|
|
+cmd_add_1 = "xm pool-cpu-add Pool-1 %s" % cpu
|
|
+cmd_rem_1 = "xm pool-cpu-remove Pool-1 %s" % cpu
|
|
+cmd_add_2 = "xm pool-cpu-add Pool-2 %s" % cpu
|
|
+cmd_rem_2 = "xm pool-cpu-remove Pool-2 %s" % cpu
|
|
+
|
|
+for i in range(25):
|
|
+ traceCommand(cmd_add_1)
|
|
+ traceCommand(cmd_rem_1)
|
|
+ traceCommand(cmd_add_2)
|
|
+ traceCommand(cmd_rem_2)
|
|
+
|
|
+destroyAllDomUs()
|
|
+for pool in pool_names:
|
|
+ destroyPool(pool, True)
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/04_cpupool_migrate.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/04_cpupool_migrate.py
|
|
@@ -0,0 +1,84 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+import sys
|
|
+import re
|
|
+import time
|
|
+
|
|
+from XmTestLib import *
|
|
+from pools import *
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Check requirements of test case
|
|
+# - min 2 free cpus (not assigned to a pool)
|
|
+#
|
|
+if int(getInfo("free_cpus")) < 2:
|
|
+ SKIP("Need at least 2 free cpus")
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Create 2 pools with one cpu per pool.
|
|
+#
|
|
+createStdPool({'name' : 'Pool-1'})
|
|
+createStdPool({'name' : 'Pool-2'})
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Create a domain with vcpus=1 in Pool-0.
|
|
+# Migrate it to one of the created pools afterwards to the other pool
|
|
+#
|
|
+name = "TestDomPool-1"
|
|
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-0'}, name=name)
|
|
+try:
|
|
+ domain.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+if not domInPool(name, 'Pool-0'):
|
|
+ FAIL("missing '%s' in Pool-0" % name)
|
|
+
|
|
+if not migrateToPool(name, 'Pool-1'):
|
|
+ FAIL("missing '%s' in Pool-1" % name)
|
|
+if not migrateToPool(name, 'Pool-2'):
|
|
+ FAIL("missing '%s' in Pool-2" % name)
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Create a domain in Pool-0.
|
|
+# Migrate it to one of the created pools afterwards to the other pool
|
|
+#
|
|
+name = "TestDomPool-2"
|
|
+domain = XmTestDomain(extraConfig={'pool' : 'Pool-0'}, name=name)
|
|
+try:
|
|
+ domain.start(noConsole=True)
|
|
+except DomainError, ex:
|
|
+ FAIL(str(e))
|
|
+if not domInPool(name, 'Pool-0'):
|
|
+ FAIL("missing '%s' in Pool-0" % name)
|
|
+
|
|
+if not migrateToPool(name, 'Pool-1'):
|
|
+ FAIL("missing '%s' in Pool-1" % name)
|
|
+if not migrateToPool(name, 'Pool-2'):
|
|
+ FAIL("missing '%s' in Pool-2" % name)
|
|
+
|
|
+
|
|
+
|
|
+#
|
|
+# Migrate other domains between pools
|
|
+#
|
|
+for cnt in range(10):
|
|
+ for pool in ['Pool-0', 'Pool-1', 'Pool-2']:
|
|
+ for domain in getRunningDomains():
|
|
+ if domain != 'Domain-0':
|
|
+ if not migrateToPool(domain, pool):
|
|
+ FAIL("missing '%s' in %s" % (domain, pool))
|
|
+
|
|
+
|
|
+#
|
|
+# Cleanup
|
|
+#
|
|
+cleanupPoolsDomains()
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/Makefile.am
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/Makefile.am
|
|
@@ -0,0 +1,22 @@
|
|
+SUBDIRS =
|
|
+
|
|
+TESTS = 01_cpupool_basic_pos.test \
|
|
+ 02_cpupool_manage_pos.test \
|
|
+ 03_cpupool_domain.test \
|
|
+ 04_cpupool_migrate.test
|
|
+
|
|
+EXTRA_DIST = $(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 *~
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/pool1.cfg
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/pool1.cfg
|
|
@@ -0,0 +1 @@
|
|
+name="Pool-1"
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/cpupool/pools.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/cpupool/pools.py
|
|
@@ -0,0 +1,78 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+
|
|
+from XmTestLib import *
|
|
+
|
|
+def checkRequirements():
|
|
+ # - min 4 cpus
|
|
+ # - only Pool-0 defined
|
|
+ nr_cpus = int(getInfo("nr_cpus"))
|
|
+ if nr_cpus < 4:
|
|
+ SKIP("Need at least 4 cpus for pool tests")
|
|
+ if len(getPoolList()) > 1:
|
|
+ SKIP("More than one pool already defined")
|
|
+
|
|
+ # reduce Pool-0 to CPU-0
|
|
+ traceCommand("xm pool-cpu-add Pool-0 0")
|
|
+ for i in range(1, nr_cpus):
|
|
+ traceCommand("xm pool-cpu-remove Pool-0 %s" % i)
|
|
+
|
|
+def createStdPool(add_param=None):
|
|
+ cmd = "xm pool-create pool1.cfg "
|
|
+ if add_param:
|
|
+ for k,v in add_param.items():
|
|
+ cmd += "%s=%s " % (k,v)
|
|
+ status, output = traceCommand(cmd)
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+
|
|
+def deletePool(name):
|
|
+ cmd = "xm pool-delete %s" % name
|
|
+ status, output = traceCommand(cmd)
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+
|
|
+def destroyPool(name, delete_on_xenapi=False):
|
|
+ cmd = "xm pool-destroy %s" % name
|
|
+ status, output = traceCommand(cmd)
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+ if os.getenv("XM_USES_API") and delete_on_xenapi:
|
|
+ deletePool(name)
|
|
+
|
|
+def getPoolList():
|
|
+ status, output = traceCommand("xm pool-list")
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+ lines = output.splitlines()
|
|
+ pools = []
|
|
+ for l in lines[1:]:
|
|
+ elms = l.split(" ", 1)
|
|
+ pools.append(elms[0]);
|
|
+ return pools
|
|
+
|
|
+def domInPool(dom, pool):
|
|
+ cmd = "xm list --pool=%s" % pool
|
|
+ status, output = traceCommand(cmd)
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+ return re.search(dom, output) != None
|
|
+
|
|
+def migrateToPool(dom, pool):
|
|
+ status, output = traceCommand("xm pool-migrate %s %s" % (dom, pool))
|
|
+ if status != 0 or "Traceback" in output:
|
|
+ raise XmError("xm failed", trace=output, status=status)
|
|
+ return domInPool(dom, pool)
|
|
+
|
|
+def cleanupPoolsDomains():
|
|
+ destroyAllDomUs()
|
|
+ for pool in getPoolList():
|
|
+ if pool != 'Pool-0':
|
|
+ destroyPool(pool, True)
|
|
+
|
|
+def waitForDomain(name):
|
|
+ for i in range(10):
|
|
+ if not isDomainRunning(name):
|
|
+ break
|
|
+ time.sleep(1)
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/xapi/20_xapi-cpu_pool_basic.py
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/xapi/20_xapi-cpu_pool_basic.py
|
|
@@ -0,0 +1,157 @@
|
|
+#!/usr/bin/python
|
|
+
|
|
+
|
|
+# Basic Pool creation tests
|
|
+
|
|
+from XmTestLib import xapi
|
|
+from XmTestLib import *
|
|
+
|
|
+
|
|
+session = xapi.connect()
|
|
+host_ref = session.xenapi.host.get_all()[0]
|
|
+pools = session.xenapi.host.get_resident_cpu_pools(host_ref)
|
|
+if len(pools) != 1:
|
|
+ SKIP("Only Pool-0 have to be created for this test")
|
|
+
|
|
+
|
|
+# check extension of host object
|
|
+host_recs = session.xenapi.host.get_all_records()
|
|
+host_rec = host_recs[host_recs.keys()[0]]
|
|
+if len(host_recs.keys()) != 1 or not host_rec.has_key("resident_cpu_pools") or \
|
|
+ len(host_rec["resident_cpu_pools"]) != 1:
|
|
+ FAIL("Missing or wrong field 'resident_cpu_pools' in host record")
|
|
+
|
|
+
|
|
+# check extension of host_cpu object
|
|
+host_cpu_recs = session.xenapi.host_cpu.get_all_records()
|
|
+assigned_cpus = [ cpu for cpu in host_cpu_recs.values() if len(cpu["cpu_pool"]) > 0 ]
|
|
+unassigned_cpus = session.xenapi.host_cpu.get_unassigned_cpus()
|
|
+if len(host_cpu_recs) - len(assigned_cpus) != len(unassigned_cpus):
|
|
+ FAIL("Wrong host_cpu count values; CPUS total: %d, CPUS ass: %d, CPUS unass: %d" % (
|
|
+ len(host_cpu_recs), len(assigned_cpus), len(unassigned_cpus)))
|
|
+
|
|
+for cpu_rec in host_cpu_recs.values():
|
|
+ cpu_pool = session.xenapi.host_cpu.get_cpu_pool(cpu_rec['uuid'])
|
|
+ if cpu_pool != cpu_rec['cpu_pool']:
|
|
+ FAIL("Inconsistency of cpu_pool ref between host_cpu record (%s) "
|
|
+ "and get_cpu_pool (%s)" % (cpu_rec['cpu_pool'], cpu_pool))
|
|
+
|
|
+
|
|
+# create / modify / remove managed cpu pools
|
|
+pool1_cfg = { 'name_label' : 'Pool-1',
|
|
+ 'name_description' : 'new pool',
|
|
+ 'auto_power_on' : False,
|
|
+ 'ncpu' : '3',
|
|
+ 'sched_policy' : 'credit',
|
|
+ 'proposed_CPUs' : ['1','2'],
|
|
+ 'other_config' : { 'xmtest' : True },
|
|
+ }
|
|
+pool1 = session.xenapi.cpu_pool.create(pool1_cfg)
|
|
+pool1_rec = session.xenapi.cpu_pool.get_record(pool1)
|
|
+for k in pool1_cfg.keys():
|
|
+ if pool1_rec[k] != pool1_cfg[k]:
|
|
+ FAIL("Create error Pool-1 (create config %s, current config: %s, key: %s)" % (
|
|
+ pool1_cfg, pool1_rec, k))
|
|
+
|
|
+pool_all = session.xenapi.cpu_pool.get_all()
|
|
+if len(pool_all) != 2:
|
|
+ FAIL("cpu_pool.get_all() returns '%d', expected '2'" % len(pool_all))
|
|
+
|
|
+pool_all = session.xenapi.cpu_pool.get_all_records()
|
|
+if len(pool_all) != 2:
|
|
+ FAIL("cpu_pool.get_all_records() returns '%d', expected '2'" % len(pool_all))
|
|
+
|
|
+if pool1 != session.xenapi.cpu_pool.get_by_name_label(pool1_cfg['name_label'])[0]:
|
|
+ FAIL("cpu_pool.get_by_name_label() returns wrong value")
|
|
+
|
|
+if pool1 != session.xenapi.cpu_pool.get_by_uuid(pool1):
|
|
+ FAIL("cpu_pool.get_by_uuid() returns wrong value")
|
|
+
|
|
+if session.xenapi.cpu_pool.get_activated(pool1):
|
|
+ FAIL("cpu_pool.get_activated() returns 'true' instead of 'false'")
|
|
+
|
|
+if pool1_cfg['auto_power_on'] != session.xenapi.cpu_pool.get_auto_power_on(pool1):
|
|
+ FAIL("cpu_pool.get_auto_power_on() returns wrong value")
|
|
+
|
|
+if len(session.xenapi.cpu_pool.get_host_CPUs(pool1)) != 0:
|
|
+ FAIL("cpu_pool.get_host_CPUs has to return an empty list")
|
|
+
|
|
+if pool1_cfg['name_label'] != session.xenapi.cpu_pool.get_name_label(pool1):
|
|
+ FAIL("cpu_pool.get_name_label() returns wrong value")
|
|
+
|
|
+if pool1_cfg['name_description'] != session.xenapi.cpu_pool.get_name_description(pool1):
|
|
+ FAIL("cpu_pool.get_name_description() returns wrong value")
|
|
+
|
|
+if pool1_cfg['ncpu'] != session.xenapi.cpu_pool.get_ncpu(pool1):
|
|
+ FAIL("cpu_pool.get_ncpu() returns wrong value")
|
|
+
|
|
+cfg_len = len(pool1_cfg['proposed_CPUs'])
|
|
+api_len = len(session.xenapi.cpu_pool.get_proposed_CPUs(pool1))
|
|
+if cfg_len != api_len:
|
|
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; cfg_cnt: %s, api_cnt:%s" % (cfg_len, api_len))
|
|
+
|
|
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
+if pool1_cfg['other_config']['xmtest'] != other_config.get('xmtest'):
|
|
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
+
|
|
+if session.xenapi.cpu_pool.get_resident_on(pool1) != session.xenapi.host.get_all()[0]:
|
|
+ FAIL("cpu_pool.get_resident_on() returns wrong value")
|
|
+
|
|
+if pool1_cfg['sched_policy'] != session.xenapi.cpu_pool.get_sched_policy(pool1):
|
|
+ FAIL("cpu_pool.get_sched_policy() returns wrong value")
|
|
+
|
|
+if len(session.xenapi.cpu_pool.get_started_VMs(pool1)) != 0:
|
|
+ FAIL("cpu_pool.get_started_VMs() returns wrong value")
|
|
+
|
|
+if pool1 != session.xenapi.cpu_pool.get_uuid(pool1):
|
|
+ FAIL("cpu_pool.get_uuid() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.set_auto_power_on(pool1, True)
|
|
+if not session.xenapi.cpu_pool.get_auto_power_on(pool1):
|
|
+ FAIL("cpu_pool.get_auto_power_on() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.set_proposed_CPUs(pool1, [4])
|
|
+if '4' not in session.xenapi.cpu_pool.get_proposed_CPUs(pool1):
|
|
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; (set_proposed_CPUs)")
|
|
+
|
|
+session.xenapi.cpu_pool.add_to_proposed_CPUs(pool1, 5)
|
|
+val = session.xenapi.cpu_pool.get_proposed_CPUs(pool1)
|
|
+if '5' not in val:
|
|
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; %s not in %s" % ('5',val))
|
|
+
|
|
+session.xenapi.cpu_pool.remove_from_proposed_CPUs(pool1, 5)
|
|
+val = session.xenapi.cpu_pool.get_proposed_CPUs(pool1)
|
|
+if '5' in val:
|
|
+ FAIL("cpu_pool.get_proposed_CPUs() returns wrong value; %s in %s" % ('5',val))
|
|
+
|
|
+session.xenapi.cpu_pool.set_name_label(pool1, 'New-Pool-1')
|
|
+if 'New-Pool-1' != session.xenapi.cpu_pool.get_name_label(pool1):
|
|
+ FAIL("cpu_pool.get_name_label() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.set_ncpu(pool1, 4)
|
|
+if '4' != session.xenapi.cpu_pool.get_ncpu(pool1):
|
|
+ FAIL("cpu_pool.get_ncpu() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.set_other_config(pool1, {'test' : 'ok'})
|
|
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
+if other_config.get('test') != 'ok':
|
|
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.add_to_other_config(pool1, 'new_entry', 'added')
|
|
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
+if other_config.get('new_entry') != 'added':
|
|
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.remove_from_other_config(pool1, 'new_entry')
|
|
+other_config = session.xenapi.cpu_pool.get_other_config(pool1)
|
|
+if other_config.get('new_entry') != None:
|
|
+ FAIL("cpu_pool.get_other_config() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.set_sched_policy(pool1, 'credit')
|
|
+if 'credit' != session.xenapi.cpu_pool.get_sched_policy(pool1):
|
|
+ FAIL("cpu_pool.get_sched_policy() returns wrong value")
|
|
+
|
|
+session.xenapi.cpu_pool.destroy(pool1)
|
|
+if pool1 in session.xenapi.cpu_pool.get_all():
|
|
+ FAIL("cpu_pool.destroy() has not removed pool")
|
|
+
|
|
Index: xen-4.0.2-testing/tools/xm-test/tests/xapi/Makefile.am
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/xm-test/tests/xapi/Makefile.am
|
|
+++ xen-4.0.2-testing/tools/xm-test/tests/xapi/Makefile.am
|
|
@@ -3,7 +3,8 @@ SUBDIRS =
|
|
TESTS = 01_xapi-vm_basic.test \
|
|
02_xapi-vbd_basic.test \
|
|
03_xapi-network_pos.test \
|
|
- 04_xapi-data_uri_handling.test
|
|
+ 04_xapi-data_uri_handling.test \
|
|
+ 20_xapi-cpu_pool_basic.test
|
|
|
|
XFAIL_TESTS =
|
|
|