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

Reply via email to