于 2011年11月18日 15:04, Xu He Jie 写道:
>   the different with last version:
>   * Move url argument to last position for virsh_*.
>   * Add driver_type 'default', and 'default' as default value for driver_type.
>   * When VM.remove() failed, it will raise an exception. And add new 
> exception 'VMRemoveError'.
>   * Other small fix.
>
>  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.
>
> Signed-off-by: Xu He Jie <[email protected]>
> ---
>  client/tests/libvirt/tests_base.cfg.sample |    3 +
>  client/virt/libvirt_vm.py                  |  160 
> +++++++++++++++++-----------
>  client/virt/virt_env_process.py            |    8 +-
>  client/virt/virt_vm.py                     |    2 +
>  4 files changed, 106 insertions(+), 67 deletions(-)
>
> diff --git a/client/tests/libvirt/tests_base.cfg.sample 
> b/client/tests/libvirt/tests_base.cfg.sample
> index 409fe80..5096bdd 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 = default
> +
>  # 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..41b0e14 100644
> --- a/client/virt/libvirt_vm.py
> +++ b/client/virt/libvirt_vm.py
> @@ -30,88 +30,94 @@ def libvirtd_restart():
>          return False
>
>
> -def virsh_cmd(cmd):
> +def virsh_cmd(cmd, url = ""):
>      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():
>              logging.debug("stdout: %s", cmd_result.stdout.strip())
>          if cmd_result.stderr.strip():
>              logging.debug("stderr: %s", cmd_result.stderr.strip())
> +
>      return cmd_result.stdout.strip()
>
>
> -def virsh_uri():
> +def virsh_uri(url = ""):
>      """
>      Return the hypervisor canonical URI.
>      """
> -    return virsh_cmd("uri")
> +    return virsh_cmd("uri", url)
>
>
> -def virsh_hostname():
> +def virsh_hostname(url = ""):
>      """
>      Return the hypervisor hostname.
>      """
> -    return virsh_cmd("hostname")
> +    return virsh_cmd("hostname", url)
>
>
> -def virsh_domstate(name):
> +def virsh_domstate(name, url = ""):
>      """
>      Return the state about a running domain.
>
>      @param name: VM name
>      """
> -    return virsh_cmd("domstate %s" % name)
> +    return virsh_cmd("domstate %s" % name, url)
>
>
> -def virsh_uuid(name):
> +def virsh_uuid(name, url = ""):
>      """
>      Return the Converted domain name or id to the domain UUID.
>
>      @param name: VM name
>      """
> -    return virsh_cmd("domuuid %s" % name)
> +    return virsh_cmd("domuuid %s" % name, url)
>
>
> -def virsh_screenshot(name, filename):
> -    virsh_cmd("screenshot %s %s" % (name, filename))
> +def virsh_screenshot(name, filename, url = ""):
> +    virsh_cmd("screenshot %s %s" % (name, filename), url)
>      return filename
>
>
> -def virsh_dumpxml(name):
> +def virsh_dumpxml(name, url = ""):
>      """
>      Return the domain information as an XML dump.
>
>      @param name: VM name
>      """
> -    return virsh_cmd("dumpxml %s" % name)
> +    return virsh_cmd("dumpxml %s" % name, url)
>
>
> -def virsh_is_alive(name):
> +def virsh_is_alive(name, url = ""):
>      """
>      Return True if the domain is started/alive.
>
>      @param name: VM name
>      """
> -    return not virsh_is_dead(name)
> +    return not virsh_is_dead(name, url)
>
>
> -def virsh_is_dead(name):
> +def virsh_is_dead(name, url = ""):
>      """
>      Return True if the domain is not started/dead.
>
>      @param name: VM name
>      """
> -    state = virsh_domstate(name)
> +    state = virsh_domstate(name, url)
>      if state in ('running', 'idle', 'no state'):
>          return False
>      else:
>          return True
>
>
> -def virsh_suspend(name):
> +def virsh_suspend(name, url = ""):
>      """
>      Return True on successful domain suspention of VM.
>
> @@ -120,7 +126,7 @@ def virsh_suspend(name):
>      @param name: VM name
>      """
>      try:
> -        utils.run("virsh suspend %s" % (name))
> +        virsh_cmd("suspend %s" % (name), url)
>          if virsh_domstate(name) == 'paused':
Oops, forgot adding 'url' to that 'virsh_domstate'.
Waiting for review, then I will send patch V3. :)
>              logging.debug("Suspended VM %s", name)
>              return True
> @@ -131,7 +137,7 @@ def virsh_suspend(name):
>          return False
>
>
> -def virsh_resume(name):
> +def virsh_resume(name, url = ""):
>      """
>      Return True on successful domain resumption of VM.
>
> @@ -140,8 +146,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), url)
> +        if virsh_is_alive(name, url):
>              logging.debug("Resumed VM %s", name)
>              return True
>          else:
> @@ -151,7 +157,7 @@ def virsh_resume(name):
>          return False
>
>
> -def virsh_start(name, vm):
> +def virsh_start(name, url = ""):
>      """
>      Return True on successful domain start.
>
> @@ -159,17 +165,17 @@ def virsh_start(name, vm):
>
>      @param name: VM name
>      """
> -    if virsh_is_alive(name):
> +    if virsh_is_alive(name, url):
>          return
>      try:
> -        utils.run("virsh start %s" % (name))
> +        virsh_cmd("start %s" % (name), url)
>          return True
>      except error.CmdError:
>          logging.error("Start VM %s failed", name)
>          return False
>
>
> -def virsh_shutdown(name):
> +def virsh_shutdown(name, url = ""):
>      """
>      Return True on successful domain shutdown.
>
> @@ -177,17 +183,17 @@ def virsh_shutdown(name):
>
>      @param name: VM name
>      """
> -    if virsh_domstate(name) == 'shut off':
> +    if virsh_domstate(name, url) == 'shut off':
>          return True
>      try:
> -        utils.run("virsh shutdown %s" % (name))
> +        virsh_cmd("virsh shutdown %s" % (name), url)
>          return True
>      except error.CmdError:
>          logging.error("Shutdown VM %s failed", name)
>          return False
>
>
> -def virsh_destroy(name):
> +def virsh_destroy(name, url = ""):
>      """
>      Return True on successful domain destroy.
>
> @@ -196,17 +202,17 @@ def virsh_destroy(name):
>
>      @param name: VM name
>      """
> -    if virsh_domstate(name) == 'shut off':
> +    if virsh_domstate(name, url) == 'shut off':
>          return True
>      try:
> -        utils.run("virsh destroy %s" % (name))
> +        virsh_cmd("virsh destroy %s" % (name), url)
>          return True
>      except error.CmdError:
>          logging.error("Destroy VM %s failed", name)
>          return False
>
>
> -def virsh_undefine(name):
> +def virsh_undefine(name, url = ""):
>      """
>      Return True on successful domain undefine.
>
> @@ -216,7 +222,7 @@ def virsh_undefine(name):
>      @param name: VM name
>      """
>      try:
> -        utils.run("virsh undefine %s" % (name))
> +        virsh_cmd("undefine %s" % (name), url)
>          logging.debug("undefined VM %s", name)
>          return True
>      except error.CmdError:
> @@ -224,46 +230,45 @@ def virsh_undefine(name):
>          return False
>
>
> -def virsh_remove_domain(name):
> +def virsh_remove_domain(name, url = ""):
>      """
>      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(name, url):
> +        if virsh_is_alive(name, url):
> +            virsh_destroy(name, url)
> +        virsh_undefine(name, url)
>      return True
>
>
> -def virsh_domain_exists(name):
> +def virsh_domain_exists(name, url = ""):
>      """
>      Return True if a domain exits.
>
>      @param name: VM name
>      """
>      try:
> -        utils.run("virsh domstate %s" % name)
> +        virsh_cmd("domstate %s" % name, url)
>          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 default, qemu and xen.
> +    LIBVIRT_DEFAULT = "default"
> +    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 +302,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_DEFAULT)
> +
> +        default_url = virsh_uri()
> +        if not self.driver_type:
> +            if default_url == "qemu:///system":
> +                self.driver_type = self.LIBVIRT_QEMU
> +            elif default_url == "xen:///":
> +                self.driver_type = self.LIBVIRT_XEN
> +            else:
> +                self.driver_type = self.LIBVIRT_DEFAULT
> +
> +        #   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 +332,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.name, 
> self.connect_url))
>
>
>      def is_alive(self):
>          """
>          Return True if VM is alive.
>          """
> -        return virsh_is_alive(self.name)
> +        return virsh_is_alive(self.name, self.connect_url)
>
>
>      def is_dead(self):
>          """
>          Return True if VM is dead.
>          """
> -        return virsh_is_dead(self.name)
> +        return virsh_is_dead(self.name, self.connect_url)
>
>
>      def clone(self, name=None, params=None, root_dir=None, 
> address_cache=None,
> @@ -647,7 +672,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 +724,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 +943,7 @@ class VM(virt_vm.BaseVM):
>                      finally:
>                          session.close()
>
> -            virsh_destroy(self.name)
> +            virsh_destroy(self.name, self.connect_url)
>
>          finally:
>              if self.serial_console:
> @@ -939,6 +964,15 @@ 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.name, self.connect_url):
> +                raise virt_vm.VMRemoveError("VM can not be destroy")
> +
> +        if not virsh_undefine(self.name, self.connect_url):
> +            raise virt_vm.VMRemoveError("VM removed fault")
> +        
> +        logging.debug("VM '%s' is removed", self.name)
>
>      def get_address(self, index=0):
>          """
> @@ -1018,7 +1052,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.name, self.connect_url)
>          dom = minidom.parseString(thexml)
>          count = 0
>          for node in dom.getElementsByTagName('interface'):
> @@ -1151,7 +1185,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.name, filename, self.connect_url)
>
>
>      def wait_for_start(self, count=60):
> @@ -1168,7 +1202,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.name, self.connect_url):
>                      session = self.wait_for_login(timeout=60)
>                      session.close()
>                      logging.debug("Start took %d seconds", timeout - count)
> @@ -1183,7 +1217,7 @@ class VM(virt_vm.BaseVM):
>          """
>          Starts this VM.
>          """
> -        if virsh_start(self.name):
> +        if virsh_start(self.name, self.connect_url):
>              if self.wait_for_start():
>                  logging.debug("Started VM %s", self.name)
>                  return True
> @@ -1209,7 +1243,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.name, self.connect_url):
>                      logging.debug("Shutdown took %d seconds", timeout - 
> count)
>                      return True
>              count -= 1
> @@ -1222,7 +1256,7 @@ class VM(virt_vm.BaseVM):
>          """
>          Shuts down this VM.
>          """
> -        if virsh_shutdown(self.name):
> +        if virsh_shutdown(self.name, self.connect_url):
>              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..bc72796 100644
> --- a/client/virt/virt_env_process.py
> +++ b/client/virt/virt_env_process.py
> @@ -65,8 +65,8 @@ 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:
> +        vm.remove()
>
>      start_vm = False
>
> @@ -80,7 +80,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 +95,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" %
> diff --git a/client/virt/virt_vm.py b/client/virt/virt_vm.py
> index 4a20ff4..60536e5 100644
> --- a/client/virt/virt_vm.py
> +++ b/client/virt/virt_vm.py
> @@ -204,6 +204,8 @@ class VMRebootError(VMError):
>  class VMStatusError(VMError):
>      pass
>
> +class VMRemoveError(VMError):
> +    pass
>
>  def get_image_blkdebug_filename(params, root_dir):
>      """

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to