于 2011年11月17日 21:56, Lucas Meneghel Rodrigues 写道: > On 11/17/2011 08:01 AM, Xu He Jie wrote: >> When I run libvirt test, the driver of libvirt will decide >> by virsh. >> >> So I add option of 'driver_type' that can specify which driver >> libvirt will connect to. >> >> but now just can specify two type of driver 'qemu and xen', >> if specify other driver will use default driver that >> detected by virsh. > > This looks reasonable, though by default I'd prefer to leave virsh > choose, which might mean driver_type on tests_base.cfg could be > 'default' rather than 'qemu', what do you think? You mean add value 'default' for driver_type? > >> Signed-off-by: Xu He Jie<[email protected]> >> --- >> client/tests/libvirt/tests_base.cfg.sample | 3 + >> client/virt/libvirt_vm.py | 161 +++++++++++++++++----------- >> client/virt/virt_env_process.py | 9 +- >> 3 files changed, 107 insertions(+), 66 deletions(-) >> >> diff --git a/client/tests/libvirt/tests_base.cfg.sample >> b/client/tests/libvirt/tests_base.cfg.sample >> index 409fe80..da46cc4 100644 >> --- a/client/tests/libvirt/tests_base.cfg.sample >> +++ b/client/tests/libvirt/tests_base.cfg.sample >> @@ -80,6 +80,9 @@ image_raw_device = no >> # NFS directory of guests' images >> images_good = 0.0.0.0:/autotest/images_good >> >> +# libvirt >> +driver_type = qemu >> + >> # libvirt (virt-install optional arguments) >> use_connect_uri = yes >> use_autostart = no >> diff --git a/client/virt/libvirt_vm.py b/client/virt/libvirt_vm.py >> index 0c32551..f2cf4a1 100644 >> --- a/client/virt/libvirt_vm.py >> +++ b/client/virt/libvirt_vm.py >> @@ -30,10 +30,15 @@ def libvirtd_restart(): >> return False >> >> >> -def virsh_cmd(cmd): >> +def virsh_cmd(url, cmd): >> if VIRSH_EXEC is None: >> raise ValueError('Missing command: virsh') >> - cmd_result = utils.run("%s %s" % (VIRSH_EXEC, cmd), >> ignore_status=True, >> + >> + url_arg = "" >> + if url != "": >> + url_arg = "-c " + url >> + >> + cmd_result = utils.run("%s %s %s" % (VIRSH_EXEC, url_arg, cmd), >> ignore_status=True, >> verbose=DEBUG) >> if DEBUG: >> if cmd_result.stdout.strip(): >> @@ -43,75 +48,75 @@ def virsh_cmd(cmd): >> return cmd_result.stdout.strip() >> >> >> -def virsh_uri(): >> +def virsh_uri(url): >> """ >> Return the hypervisor canonical URI. >> """ >> - return virsh_cmd("uri") >> + return virsh_cmd(url, "uri") >> >> >> -def virsh_hostname(): >> +def virsh_hostname(url): >> """ >> Return the hypervisor hostname. >> """ >> - return virsh_cmd("hostname") >> + return virsh_cmd(url, "hostname") >> >> >> -def virsh_domstate(name): >> +def virsh_domstate(url, name): >> """ >> Return the state about a running domain. >> >> @param name: VM name >> """ >> - return virsh_cmd("domstate %s" % name) >> + return virsh_cmd(url, "domstate %s" % name) >> >> >> -def virsh_uuid(name): >> +def virsh_uuid(url, name): >> """ >> Return the Converted domain name or id to the domain UUID. >> >> @param name: VM name >> """ >> - return virsh_cmd("domuuid %s" % name) >> + return virsh_cmd(url, "domuuid %s" % name) >> >> >> -def virsh_screenshot(name, filename): >> - virsh_cmd("screenshot %s %s" % (name, filename)) >> +def virsh_screenshot(url, name, filename): >> + virsh_cmd(url, "screenshot %s %s" % (name, filename)) >> return filename >> >> >> -def virsh_dumpxml(name): >> +def virsh_dumpxml(url, name): >> """ >> Return the domain information as an XML dump. >> >> @param name: VM name >> """ >> - return virsh_cmd("dumpxml %s" % name) >> + return virsh_cmd(url, "dumpxml %s" % name) >> >> >> -def virsh_is_alive(name): >> +def virsh_is_alive(url, name): >> """ >> Return True if the domain is started/alive. >> >> @param name: VM name >> """ >> - return not virsh_is_dead(name) >> + return not virsh_is_dead(url, name) >> >> >> -def virsh_is_dead(name): >> +def virsh_is_dead(url, name): >> """ >> Return True if the domain is not started/dead. >> >> @param name: VM name >> """ >> - state = virsh_domstate(name) >> + state = virsh_domstate(url, name) >> if state in ('running', 'idle', 'no state'): >> return False >> else: >> return True >> >> >> -def virsh_suspend(name): >> +def virsh_suspend(url, name): >> """ >> Return True on successful domain suspention of VM. >> >> @@ -120,7 +125,7 @@ def virsh_suspend(name): >> @param name: VM name >> """ >> try: >> - utils.run("virsh suspend %s" % (name)) >> + virsh_cmd(url, "suspend %s" % (name)) >> if virsh_domstate(name) == 'paused': >> logging.debug("Suspended VM %s", name) >> return True >> @@ -131,7 +136,7 @@ def virsh_suspend(name): >> return False >> >> >> -def virsh_resume(name): >> +def virsh_resume(url, name): >> """ >> Return True on successful domain resumption of VM. >> >> @@ -140,8 +145,8 @@ def virsh_resume(name): >> @param name: VM name >> """ >> try: >> - utils.run("virsh resume %s" % (name)) >> - if virsh_is_alive(name): >> + virsh_cmd("resume %s" % (name)) >> + if virsh_is_alive(name, url): >> logging.debug("Resumed VM %s", name) >> return True >> else: >> @@ -151,7 +156,7 @@ def virsh_resume(name): >> return False >> >> >> -def virsh_start(name, vm): >> +def virsh_start(url, name): >> """ >> Return True on successful domain start. >> >> @@ -159,17 +164,17 @@ def virsh_start(name, vm): >> >> @param name: VM name >> """ >> - if virsh_is_alive(name): >> + if virsh_is_alive(url, name): >> return >> try: >> - utils.run("virsh start %s" % (name)) >> + virsh_cmd(url, "start %s" % (name)) >> return True >> except error.CmdError: >> logging.error("Start VM %s failed", name) >> return False >> >> >> -def virsh_shutdown(name): >> +def virsh_shutdown(url, name): >> """ >> Return True on successful domain shutdown. >> >> @@ -187,7 +192,7 @@ def virsh_shutdown(name): >> return False >> >> >> -def virsh_destroy(name): >> +def virsh_destroy(url, name): >> """ >> Return True on successful domain destroy. >> >> @@ -196,7 +201,7 @@ def virsh_destroy(name): >> >> @param name: VM name >> """ >> - if virsh_domstate(name) == 'shut off': >> + if virsh_domstate(url, name) == 'shut off': >> return True >> try: >> utils.run("virsh destroy %s" % (name)) >> @@ -206,7 +211,7 @@ def virsh_destroy(name): >> return False >> >> >> -def virsh_undefine(name): >> +def virsh_undefine(url, name): >> """ >> Return True on successful domain undefine. >> >> @@ -216,7 +221,7 @@ def virsh_undefine(name): >> @param name: VM name >> """ >> try: >> - utils.run("virsh undefine %s" % (name)) >> + virsh_cmd(url, "undefine %s" % (name)) >> logging.debug("undefined VM %s", name) >> return True >> except error.CmdError: >> @@ -224,46 +229,47 @@ def virsh_undefine(name): >> return False >> >> >> -def virsh_remove_domain(name): >> +def virsh_remove_domain(url, name): >> """ >> Return True after forcefully removing a domain if it exists. >> >> @param name: VM name >> """ >> - if virsh_domain_exists(name): >> - if virsh_is_alive(name): >> - virsh_destroy(name) >> - virsh_undefine(name) >> + if virsh_domain_exists(url, name): >> + if virsh_is_alive(url, name): >> + virsh_destroy(url, name) >> + virsh_undefine(url, name) >> return True >> >> >> -def virsh_domain_exists(name): >> +def virsh_domain_exists(url, name): >> """ >> Return True if a domain exits. >> >> @param name: VM name >> """ >> try: >> - utils.run("virsh domstate %s" % name) >> + virsh_cmd(url, "domstate %s" % name) >> return True >> except error.CmdError: >> logging.warning("VM %s does not exist", name) >> return False >> >> -VIRSH_DEFAULT_URI = virsh_uri() >> -LIBVIRT_QEMU = False >> -LIBVIRT_XEN = False >> - >> -if VIRSH_DEFAULT_URI == 'qemu:///system': >> - LIBVIRT_QEMU = True >> -elif VIRSH_DEFAULT_URI == 'xen:///': >> - LIBVIRT_XEN = True >> - >> >> class VM(virt_vm.BaseVM): >> """ >> This class handles all basic VM operations for libvirt. >> """ >> + >> + """ >> + constant for libirt driver type >> + >> + now it only supports qemu and xen >> + """ >> + LIBVIRT_NONE = "" >> + LIBVIRT_QEMU = "qemu" >> + LIBVIRT_XEN = "xen" >> + >> def __init__(self, name, params, root_dir, address_cache, state=None): >> """ >> Initialize the object and set a few attributes. >> @@ -297,7 +303,27 @@ class VM(virt_vm.BaseVM): >> self.address_cache = address_cache >> # For now, libvirt does not have a monitor property. >> self.monitor = None >> - >> + self.driver_type = params.get("driver_type", self.LIBVIRT_NONE) >> + >> + default_url = virsh_uri("") >> + if self.driver_type == self.LIBVIRT_NONE: >> + if default_url == "qemu:///system": >> + self.driver_type = self.LIBVIRT_QEMU >> + elif default_url == "xen:///": >> + self.driver_type = self.LIBVIRT_XEN >> + >> + """ >> + if driver_type is not supported, just use the default url that >> + was detected by virsh >> + """ >> + if self.driver_type == self.LIBVIRT_QEMU: >> + self.connect_url = "qemu:///system" >> + elif self.driver_type == self.LIBVIRT_XEN: >> + self.connect_url = "xen:///" >> + else: >> + self.connect_url = default_url >> + >> + logging.info("VM '%s' with url '%s'" % (name, self.connect_url)) >> >> def verify_alive(self): >> """ >> @@ -307,21 +333,21 @@ class VM(virt_vm.BaseVM): >> """ >> if not self.is_alive(): >> raise virt_vm.VMDeadError("Domain %s is inactive" % self.name, >> - virsh_domstate(self.name)) >> + virsh_domstate(self.connect_url, self.name)) >> >> >> def is_alive(self): >> """ >> Return True if VM is alive. >> """ >> - return virsh_is_alive(self.name) >> + return virsh_is_alive(self.connect_url, self.name) >> >> >> def is_dead(self): >> """ >> Return True if VM is dead. >> """ >> - return virsh_is_dead(self.name) >> + return virsh_is_dead(self.connect_url, self.name) >> >> >> def clone(self, name=None, params=None, root_dir=None, >> address_cache=None, >> @@ -647,7 +673,7 @@ class VM(virt_vm.BaseVM): >> image_params.get("drive_cache"), >> image_params.get("image_format")) >> >> - if LIBVIRT_QEMU: >> + if self.driver_type == self.LIBVIRT_QEMU: >> for cdrom in params.objects("cdroms"): >> cdrom_params = params.object_params(cdrom) >> iso = cdrom_params.get("cdrom") >> @@ -699,9 +725,9 @@ class VM(virt_vm.BaseVM): >> virt_install_cmd += " --mac %s" % mac >> self.nic_mac = mac >> >> - if LIBVIRT_XEN: >> + if self.driver_type == self.LIBVIRT_XEN: >> virt_install_cmd += (" --network=%s" % params.get("virsh_network")) >> - elif LIBVIRT_QEMU: >> + elif self.driver_type == self.LIBVIRT_QEMU: >> virt_install_cmd += (" --network=%s,model=%s" % >> (params.get("virsh_network"), >> params.get("nic_model"))) >> @@ -918,7 +944,7 @@ class VM(virt_vm.BaseVM): >> finally: >> session.close() >> >> - virsh_destroy(self.name) >> + virsh_destroy(self.connect_url, self.name) >> >> finally: >> if self.serial_console: >> @@ -939,7 +965,18 @@ class VM(virt_vm.BaseVM): >> for vlan in range(num_nics): >> self.free_mac_address(vlan) >> >> - >> + def remove(self): >> + if self.is_alive(): >> + if not virsh_destroy(self.connect_url, self.name): >> + return False >> + >> + if virsh_undefine(self.connect_url, self.name): >> + logging.debug("VM '%s' is removed", self.name) >> + return True >> + else: >> + logging.error("VM '%s' can not be removed", self.name) >> + return False >> + >> def get_address(self, index=0): >> """ >> Return the address of a NIC of the guest, in host space. >> @@ -1018,7 +1055,7 @@ class VM(virt_vm.BaseVM): >> @raise VMMACAddressMissingError: If no MAC address is defined for the >> requested NIC >> """ >> - thexml = virsh_dumpxml(self.name) >> + thexml = virsh_dumpxml(self.connect_url, self.name) >> dom = minidom.parseString(thexml) >> count = 0 >> for node in dom.getElementsByTagName('interface'): >> @@ -1151,7 +1188,7 @@ class VM(virt_vm.BaseVM): >> def screendump(self, filename, debug=False): >> if debug: >> logging.debug("Requesting screenshot %s" % filename) >> - return virsh_screenshot(self.name, filename) >> + return virsh_screenshot(self.connect_url, self.name, filename) >> >> >> def wait_for_start(self, count=60): >> @@ -1168,7 +1205,7 @@ class VM(virt_vm.BaseVM): >> while count> 0: >> # check every 5 seconds >> if count % 5 == 0: >> - if virsh_is_alive(self.name): >> + if virsh_is_alive(self.connect_url, self.name): >> session = self.wait_for_login(timeout=60) >> session.close() >> logging.debug("Start took %d seconds", timeout - count) >> @@ -1183,7 +1220,7 @@ class VM(virt_vm.BaseVM): >> """ >> Starts this VM. >> """ >> - if virsh_start(self.name): >> + if virsh_start(self.connect_url, self.name): >> if self.wait_for_start(): >> logging.debug("Started VM %s", self.name) >> return True >> @@ -1209,7 +1246,7 @@ class VM(virt_vm.BaseVM): >> while count> 0: >> # check every 5 seconds >> if count % 5 == 0: >> - if virsh_is_dead(self.name): >> + if virsh_is_dead(self.connect_url, self.name): >> logging.debug("Shutdown took %d seconds", timeout - count) >> return True >> count -= 1 >> @@ -1222,7 +1259,7 @@ class VM(virt_vm.BaseVM): >> """ >> Shuts down this VM. >> """ >> - if virsh_shutdown(self.name): >> + if virsh_shutdown(self.connect_url, self.name): >> if self.wait_for_shutdown(): >> logging.debug("VM %s shut down", self.name) >> return True >> diff --git a/client/virt/virt_env_process.py >> b/client/virt/virt_env_process.py >> index 1e7ea57..98feb82 100644 >> --- a/client/virt/virt_env_process.py >> +++ b/client/virt/virt_env_process.py >> @@ -65,8 +65,9 @@ def preprocess_vm(test, params, env, name): >> logging.debug("'force_remove_vm' specified; removing VM...") >> remove_vm = True >> >> - if remove_vm and not libvirt_vm.virsh_remove_domain(name): >> - raise error.TestError("Could not remove VM") >> + if remove_vm: >> + if not vm.remove(): >> + raise error.TestError("Could not remove VM") >> >> start_vm = False >> >> @@ -80,7 +81,7 @@ def preprocess_vm(test, params, env, name): >> elif params.get("start_vm") == "yes": >> # need to deal with libvirt VM differently than qemu >> if vm_type == 'libvirt': >> - if not libvirt_vm.virsh_is_alive(name): >> + if not vm.is_alive(): >> logging.debug("VM is not alive; starting it...") >> start_vm = True >> else: >> @@ -95,7 +96,7 @@ def preprocess_vm(test, params, env, name): >> if start_vm: >> if vm_type == "libvirt" and params.get("type") != "unattended_install": >> vm.params = params >> - libvirt_vm.virsh_start(name, vm) >> + vm.start() >> # Wait for the domain to be created >> virt_utils.wait_for(func=vm.is_alive, timeout=60, >> text=("waiting for domain %s to start" % >
_______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
