Signed-off-by: Yu Mingfei <[email protected]>
---
 libvirt/tests/virsh_setmaxmem.py | 221 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 221 insertions(+)
 create mode 100644 libvirt/tests/virsh_setmaxmem.py

diff --git a/libvirt/tests/virsh_setmaxmem.py b/libvirt/tests/virsh_setmaxmem.py
new file mode 100644
index 0000000..6ba3791
--- /dev/null
+++ b/libvirt/tests/virsh_setmaxmem.py
@@ -0,0 +1,221 @@
+import logging
+from autotest.client.shared import utils, error
+from virttest import virsh, virt_vm
+from virttest.libvirt_xml import vm_xml
+
+
+def run_virsh_setmaxmem(test, params, env):
+    """
+    Test command: virsh setmaxmem.
+
+    1) Prepare vm environment.
+    2) Handle params
+    3) Run test command and get vm started then get maxmem.
+    4) Recover environment.
+    5) Check result.
+    TODO: support more options:--live,--config,--current.
+    """
+
+    def vmxml_max_mem(vm_name):
+        vmxml = vm_xml.VMXML.new_from_dumpxml(vm_name)
+        return int(vmxml.max_mem)
+
+
+    def make_domref(domarg, vm_ref, domid, vm_name, domuuid):
+        # Specify domain as argument or parameter
+        if domarg == "yes":
+            dom_darg_key = "domainarg"
+        else:
+            dom_darg_key = "domain"
+
+        # How to reference domain
+        if vm_ref == "domid":
+            dom_darg_value = domid
+        elif vm_ref == "domname":
+            dom_darg_value = vm_name
+        elif vm_ref == "domuuid":
+            dom_darg_value = domuuid
+        elif vm_ref == "none":
+            dom_darg_value = None
+        elif vm_ref == "emptystring":
+            dom_darg_value = '""'
+        else: # stick in value directly
+            dom_darg_value = vm_ref
+
+        return {dom_darg_key:dom_darg_value}
+
+
+    def make_sizeref(sizearg, mem_ref, original_mem):
+        if sizearg == "yes":
+            size_darg_key = "sizearg"
+        else:
+            size_darg_key = "size"
+
+        if mem_ref == "halfless":
+            size_darg_value = "%d" % (original_mem / 2)
+        elif mem_ref == "halfmore":
+            size_darg_value = "%d" % int(original_mem * 1.5)
+        elif mem_ref == "same":
+            size_darg_value = "%d" % original_mem
+        elif mem_ref == "emptystring":
+            size_darg_value = '""'
+        elif mem_ref == "zero":
+            size_darg_value = "0"
+        elif mem_ref == "toosmall":
+            size_darg_value = "1024"
+        elif mem_ref == "toobig":
+            size_darg_value = "1099511627776" # (KiB) One Petabyte
+        elif mem_ref == "none":
+            size_darg_value = None
+        else: # stick in value directly
+            size_darg_value = mem_ref
+
+        return {size_darg_key:size_darg_value}
+
+
+    def is_old_libvirt():
+        regex = r'\s+\[--size\]\s+'
+        return bool( not virsh.has_command_help_match('setmaxmem', regex) )
+
+
+    def is_xen_host():
+        check_cmd = "ls /dev/kvm"
+        return utils.run(check_cmd, ignore_status=True).exit_status
+
+
+    def is_in_range(actual, expected, error_percent):
+        deviation = 100 - (100 * (float(actual) / float(expected)))
+        logging.debug("Deviation: %0.2f%%" % float(deviation))
+        return float(deviation) <= float(error_percent)
+
+
+    def print_debug_stats(original_vmxml_mem, original_dominfo_mem,
+                          expected_mem, test_vmxml_mem, test_dominfo_mem):
+        dbgmsg = ("Original vmxml mem : %d KiB\n"
+                  "Original dominfo mem : %d KiB\n"
+                  "Expected max mem : %d KiB\n"
+                  "Actual vmxml mem   : %d KiB\n"
+                  "Actual dominfo mem   : %d KiB\n" % (
+                  original_vmxml_mem,
+                  original_dominfo_mem,
+                  expected_mem,
+                  test_vmxml_mem,
+                  test_dominfo_mem))
+        for dbgline in dbgmsg.splitlines():
+            logging.debug(dbgline)
+
+
+    ### MAIN TEST CODE ###
+
+
+    # Process cartesian parameters
+    vm_ref = params.get("setmaxmem_vm_ref", "")
+    mem_ref = params.get("setmaxmem_mem_ref", "")
+    status_error = "yes" == params.get("status_error", "no")
+    flags = params.get("setmaxmem_flags", "")
+    domarg = params.get("setmaxmem_domarg", "no")
+    sizearg = params.get("setmaxmem_sizearg", "no")
+    delta_per = params.get("setmaxmem_delta_per", "10")
+    vm_name = params.get("main_vm")
+
+    # Gather environment parameters
+    vm = env.get_vm(vm_name)
+    original_vmxml_mem = vmxml_max_mem(vm_name)
+
+    original_dominfo_mem = vm.get_max_mem()
+    domid = vm.get_id()
+    domuuid = vm.get_uuid()
+    uri = vm.connect_uri
+
+    old_libvirt = is_old_libvirt()
+    if old_libvirt:
+        logging.info("Running test on older libvirt")
+        use_kilobytes = True
+    else:
+        logging.info("Running test on newer libvirt")
+        use_kilobytes = False
+
+    xen_host = is_xen_host()
+    if xen_host:
+        logging.info("Running on xen host, %s offset is allowed.", delta_per)
+
+    # Argument pattern is complex, build with dargs
+    dargs = {'flagstr':flags,
+             'use_kilobytes':use_kilobytes,
+             'uri':uri, 'ignore_status':True, "debug":True}
+    dargs.update( make_domref(domarg, vm_ref, domid, vm_name, domuuid) )
+    dargs.update( make_sizeref(sizearg, mem_ref, original_dominfo_mem) )
+
+    if status_error:
+        logging.info("Error Test: Expecting an error to occur!")
+
+    result = virsh.setmaxmem(**dargs)
+    status = result.exit_status
+
+    # Gather status if not running error test
+    start_status = 0     # Check can guest be started after maxmem-modified.
+    if not status_error:
+        if vm.state() == "shut off":
+            try:
+                vm.start()
+            except virt_vm.VMStartError, detail:
+                start_status = 1
+                logging.error("Start after VM's max mem modified failed:%s",
+                              detail)
+
+        # Actual results
+        test_vmxml_mem = vmxml_max_mem(vm_name)
+        test_dominfo_mem = vm.get_max_mem()
+
+        # Expected results for both vmxml and dominfo
+        if sizearg == "yes":
+            expected_mem = int(dargs["sizearg"])
+        else:
+            expected_mem = int(dargs["size"])
+
+        print_debug_stats(original_vmxml_mem, original_dominfo_mem,
+                          expected_mem, test_vmxml_mem, test_dominfo_mem)
+
+    else:
+        if vm.state() == "paused":
+            vm.resume()
+
+    # Restore need vm to be shut off.
+    if vm.state() != "shut off":
+        vm.destroy()
+
+    if status is 0: # Restore original memory
+        restore_status = virsh.setmaxmem(domainarg=vm_name,
+                                         sizearg=original_dominfo_mem,
+                                         ignore_status=True).exit_status
+        if restore_status:
+            logging.warning("Failed to restore VM's original memory to "
+                            "%s KiB", original_dominfo_mem)
+    else:
+        # virsh setmaxmem failed, no need to restore
+        pass
+
+    # Don't care about memory comparison on error test
+    if status_error:
+        if status is 0:
+            raise error.TestFail("Error test did not result in an error.")
+    else:
+        vmxml_match = (test_vmxml_mem == expected_mem)
+        if xen_host:
+            dominfo_match = is_in_range(test_dominfo_mem, expected_mem,
+                                        delta_per)
+        else:
+            dominfo_match = (test_dominfo_mem == expected_mem)
+        if (status or start_status or not vmxml_match or not dominfo_match):
+            msg = "test conditions not met: "
+            if status:
+                msg += "Non-zero virsh setmaxmem exit code. "
+            if not vmxml_match:
+                msg += "Max memory in VM's xml is not matched. "
+            if not dominfo_match:
+                msg += "Max memory in dominfo's output is not matched. "
+            if start_status:
+                msg += "Start after VM's max mem is modified failed."
+            raise error.TestFail(msg)
+
+    logging.info("Test end normally.")
-- 
1.7.11.7

_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to