Another question, if I want to use remote URI like virsh -c
qemu+ssh://${ip}/system,
how to do this? Considering expansibility, your codes should support both local
URI and
remote URI, and ${ip} should be a optional, because it's not necessary for
local host.
Of course, it's just my idea.
Regards,
Alex
----- Original Message -----
From: "Xu He Jie" <[email protected]>
To: [email protected]
Sent: Thursday, November 17, 2011 6:01:37 PM
Subject: [Autotest] [PATCH] Add 'driver_type' option for libvirt test
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 | 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" %
--
1.7.5.4
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest