Adding option of 'driver_type' that can specify which driver libvirt will connect to.
Signed-off-by: Xu He Jie <[email protected]> --- client/tests/libvirt/base.cfg.sample | 4 +- client/virt/libvirt_vm.py | 171 +++++++++++++++++++++------------- client/virt/virt_env_process.py | 8 +- client/virt/virt_vm.py | 2 + 4 files changed, 116 insertions(+), 69 deletions(-) diff --git a/client/tests/libvirt/base.cfg.sample b/client/tests/libvirt/base.cfg.sample index a754bce..81ca925 100644 --- a/client/tests/libvirt/base.cfg.sample +++ b/client/tests/libvirt/base.cfg.sample @@ -80,8 +80,10 @@ image_raw_device = no # NFS directory of guests' images images_good = 0.0.0.0:/autotest/images_good +# libvirt driver +driver_type = default + # libvirt (virt-install optional arguments) -use_connect_uri = yes use_autostart = no use_check_cpu = yes use_debug = yes diff --git a/client/virt/libvirt_vm.py b/client/virt/libvirt_vm.py index 0c32551..32bbfd8 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, uri = ""): if VIRSH_EXEC is None: raise ValueError('Missing command: virsh') - cmd_result = utils.run("%s %s" % (VIRSH_EXEC, cmd), ignore_status=True, + + uri_arg = "" + if uri: + uri_arg = "-c " + uri + + cmd_result = utils.run("%s %s %s" % (VIRSH_EXEC, uri_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(uri = ""): """ Return the hypervisor canonical URI. """ - return virsh_cmd("uri") + return virsh_cmd("uri", uri) -def virsh_hostname(): +def virsh_hostname(uri = ""): """ Return the hypervisor hostname. """ - return virsh_cmd("hostname") + return virsh_cmd("hostname", uri) -def virsh_domstate(name): +def virsh_domstate(name, uri = ""): """ Return the state about a running domain. @param name: VM name """ - return virsh_cmd("domstate %s" % name) + return virsh_cmd("domstate %s" % name, uri) -def virsh_uuid(name): +def virsh_uuid(name, uri = ""): """ 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, uri) -def virsh_screenshot(name, filename): - virsh_cmd("screenshot %s %s" % (name, filename)) +def virsh_screenshot(name, filename, uri = ""): + virsh_cmd("screenshot %s %s" % (name, filename), uri) return filename -def virsh_dumpxml(name): +def virsh_dumpxml(name, uri = ""): """ Return the domain information as an XML dump. @param name: VM name """ - return virsh_cmd("dumpxml %s" % name) + return virsh_cmd("dumpxml %s" % name, uri) -def virsh_is_alive(name): +def virsh_is_alive(name, uri = ""): """ Return True if the domain is started/alive. @param name: VM name """ - return not virsh_is_dead(name) + return not virsh_is_dead(name, uri) -def virsh_is_dead(name): +def virsh_is_dead(name, uri = ""): """ Return True if the domain is not started/dead. @param name: VM name """ - state = virsh_domstate(name) + state = virsh_domstate(name, uri) if state in ('running', 'idle', 'no state'): return False else: return True -def virsh_suspend(name): +def virsh_suspend(name, uri = ""): """ Return True on successful domain suspention of VM. @@ -120,8 +126,8 @@ def virsh_suspend(name): @param name: VM name """ try: - utils.run("virsh suspend %s" % (name)) - if virsh_domstate(name) == 'paused': + virsh_cmd("suspend %s" % (name), uri) + if virsh_domstate(name, uri) == 'paused': logging.debug("Suspended VM %s", name) return True else: @@ -131,7 +137,7 @@ def virsh_suspend(name): return False -def virsh_resume(name): +def virsh_resume(name, uri = ""): """ 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), uri) + if virsh_is_alive(name, uri): 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, uri = ""): """ 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, uri): return try: - utils.run("virsh start %s" % (name)) + virsh_cmd("start %s" % (name), uri) return True except error.CmdError: logging.error("Start VM %s failed", name) return False -def virsh_shutdown(name): +def virsh_shutdown(name, uri = ""): """ 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, uri) == 'shut off': return True try: - utils.run("virsh shutdown %s" % (name)) + virsh_cmd("virsh shutdown %s" % (name), uri) return True except error.CmdError: logging.error("Shutdown VM %s failed", name) return False -def virsh_destroy(name): +def virsh_destroy(name, uri = ""): """ 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, uri) == 'shut off': return True try: - utils.run("virsh destroy %s" % (name)) + virsh_cmd("virsh destroy %s" % (name), uri) return True except error.CmdError: logging.error("Destroy VM %s failed", name) return False -def virsh_undefine(name): +def virsh_undefine(name, uri = ""): """ 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), uri) 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, uri = ""): """ 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, uri): + if virsh_is_alive(name, uri): + virsh_destroy(name, uri) + virsh_undefine(name, uri) return True -def virsh_domain_exists(name): +def virsh_domain_exists(name, uri = ""): """ Return True if a domain exits. @param name: VM name """ try: - utils.run("virsh domstate %s" % name) + virsh_cmd("domstate %s" % name, uri) 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_uri = virsh_uri() + if not self.driver_type: + if default_uri == "qemu:///system": + self.driver_type = self.LIBVIRT_QEMU + elif default_uri == "xen:///": + self.driver_type = self.LIBVIRT_XEN + else: + self.driver_type = self.LIBVIRT_DEFAULT + + # if driver_type is not supported, just use the default uri that + # was detected by virsh + if self.driver_type == self.LIBVIRT_QEMU: + self.connect_uri = "qemu:///system" + elif self.driver_type == self.LIBVIRT_XEN: + self.connect_uri = "xen:///" + else: + self.connect_uri = default_uri + logging.info("VM '%s' with uri '%s'" % (name, self.connect_uri)) 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_uri)) def is_alive(self): """ Return True if VM is alive. """ - return virsh_is_alive(self.name) + return virsh_is_alive(self.name, self.connect_uri) def is_dead(self): """ Return True if VM is dead. """ - return virsh_is_dead(self.name) + return virsh_is_dead(self.name, self.connect_uri) def clone(self, name=None, params=None, root_dir=None, address_cache=None, @@ -521,6 +546,12 @@ class VM(virt_vm.BaseVM): def add_kernel_cmdline(help, cmdline): return " -append %s" % cmdline + def add_connect_uri(help, uri): + if has_option(help, "connect"): + return " --connect=%s" % uri + else: + return "" + # End of command line option wrappers if name is None: @@ -548,6 +579,9 @@ class VM(virt_vm.BaseVM): # Add the qemu binary virt_install_cmd += virt_install_binary + # set connect uri + virt_install_cmd += add_connect_uri(help, self.connect_uri) + # hvm or pv specificed by libvirt switch (pv used by Xen only) hvm_or_pv = params.get("hvm_or_pv") if hvm_or_pv: @@ -647,7 +681,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 +733,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 +952,7 @@ class VM(virt_vm.BaseVM): finally: session.close() - virsh_destroy(self.name) + virsh_destroy(self.name, self.connect_uri) finally: if self.serial_console: @@ -939,6 +973,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_uri): + raise virt_vm.VMRemoveError("VM can not be destroy") + + if not virsh_undefine(self.name, self.connect_uri): + raise virt_vm.VMRemoveError("VM removed fault") + + logging.debug("VM '%s' is removed", self.name) def get_address(self, index=0): """ @@ -1018,7 +1061,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_uri) dom = minidom.parseString(thexml) count = 0 for node in dom.getElementsByTagName('interface'): @@ -1151,7 +1194,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_uri) def wait_for_start(self, count=60): @@ -1168,7 +1211,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_uri): session = self.wait_for_login(timeout=60) session.close() logging.debug("Start took %d seconds", timeout - count) @@ -1183,7 +1226,7 @@ class VM(virt_vm.BaseVM): """ Starts this VM. """ - if virsh_start(self.name): + if virsh_start(self.name, self.connect_uri): if self.wait_for_start(): logging.debug("Started VM %s", self.name) return True @@ -1209,7 +1252,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_uri): logging.debug("Shutdown took %d seconds", timeout - count) return True count -= 1 @@ -1222,7 +1265,7 @@ class VM(virt_vm.BaseVM): """ Shuts down this VM. """ - if virsh_shutdown(self.name): + if virsh_shutdown(self.name, self.connect_uri): 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): """ -- 1.7.7.1 _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
