于 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
