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? > 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
