[libvirt] [test-API][PATCH v2] Add test case for start domain on nfs storage
Guannan Ren
gren at redhat.com
Thu Sep 15 07:35:12 UTC 2011
On 09/15/2011 11:11 AM, Alex Jia wrote:
> On 09/14/2011 07:07 PM, Wayne Sun wrote:
>> * This test is for start a domain with img file on nfs storage.
>> Under SElinux boolean virt_use_nfs on or off, combine with
>> setting the dynamic_ownership in /etc/libvirt/qemu.conf,
>> check whether the guest can be started or not. The nfs could
>> be root_squash or no_root_squash. SElinux should be enabled
>> and enforcing on host.
>> ---
>> repos/sVirt/domain_nfs_start.py | 485
>> +++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 485 insertions(+), 0 deletions(-)
>> create mode 100644 repos/sVirt/__init__.py
>> create mode 100644 repos/sVirt/domain_nfs_start.py
>>
>> diff --git a/repos/sVirt/__init__.py b/repos/sVirt/__init__.py
>> new file mode 100644
>> index 0000000..e69de29
>> diff --git a/repos/sVirt/domain_nfs_start.py
>> b/repos/sVirt/domain_nfs_start.py
>> new file mode 100644
>> index 0000000..e4bc867
>> --- /dev/null
>> +++ b/repos/sVirt/domain_nfs_start.py
>> @@ -0,0 +1,485 @@
>> +#!/usr/bin/env python
>> +"""This test is for start a guest with img file on nfs storage.
>> + Under SElinux boolean virt_use_nfs on or off, combine with
>> + setting the dynamic_ownership in /etc/libvirt/qemu.conf,
>> + check whether the guest can be started or not. The nfs could
>> + be root_squash or no_root_squash. SElinux should be enabled
>> + and enforcing on host.
>> + sVirt:domain_nfs_start
>> + guestname
>> + #GUESTNAME#
>> + dynamic_ownership
>> + enable|disable
>> + virt_use_nfs
>> + on|off
>> + root_squash
>> + yes|no
>> +"""
>> +
>> +__author__ = 'Wayne Sun: gsun at redhat.com'
>> +__date__ = 'Mon Sep 2, 2011'
>> +__version__ = '0.1.0'
>> +__credits__ = 'Copyright (C) 2011 Red Hat, Inc.'
>> +__all__ = ['domain_nfs_start']
>> +
>> +import os
>> +import re
>> +import sys
>> +
>> +QEMU_CONF = "/etc/libvirt/qemu.conf"
>> +
>> +def append_path(path):
>> + """Append root path of package"""
>> + if path not in sys.path:
>> + sys.path.append(path)
>> +
>> +from lib import connectAPI
>> +from lib import domainAPI
>> +from utils.Python import utils
>> +from exception import LibvirtAPI
>> +from shutil import copy
>> +
>> +pwd = os.getcwd()
>> +result = re.search('(.*)libvirt-test-API', pwd)
>> +append_path(result.group(0))
>> +
>> +def return_close(conn, logger, ret):
>> + """close hypervisor connection and return the given value"""
>> + conn.close()
>> + logger.info("closed hypervisor connection")
>> + return ret
>> +
>> +def check_params(params):
>> + """Verify inputing parameter dictionary"""
>> + logger = params['logger']
>> + keys = ['guestname', 'dynamic_ownership', 'virt_use_nfs',
>> 'root_squash']
>> + for key in keys:
>> + if key not in params:
>> + logger.error("%s is required" %key)
>> + return 1
>> + return 0
>> +
>> +def nfs_setup(util, root_squash, logger):
>> + """setup nfs on localhost
>> + """
>> + logger.info("set nfs service")
>> + if root_squash == "yes":
>> + option = "root_squash"
>> + elif root_squash == "no":
>> + option = "no_root_squash"
>> + else:
>> + logger.error("wrong root_squash value")
>> + return 1
>> +
>> + cmd = "echo /tmp *\(rw,%s\)>> /etc/exports" % option
>> + ret, out = util.exec_cmd(cmd, shell=True)
>> + if ret:
>> + logger.error("failed to config nfs export")
>> + return 1
>> +
>> + logger.info("restart nfs service")
>> + cmd = "service nfs restart"
>> + ret, out = util.exec_cmd(cmd, shell=True)
>> + if ret:
>> + logger.error("failed to restart nfs service")
>> + return 1
>> + else:
>> + for i in range(len(out)):
>> + logger.info(out[i])
>> +
>> + return 0
>> +
>> +def prepare_env(util, d_ownership, virt_use_nfs, guestname,
>> root_squash, \
>> + disk_file, img_dir, logger):
>> + """set virt_use_nfs SElinux boolean, configure
>> + dynamic_ownership in /etc/libvirt/qemu.conf
>> + """
>> + logger.info("set virt_use_nfs selinux boolean")
>> + cmd = "setsebool virt_use_nfs %s" % virt_use_nfs
>> + ret, out = util.exec_cmd(cmd, shell=True)
>> + if ret:
>> + logger.error("failed to set virt_use_nfs SElinux boolean")
>> + return 1
>> +
>> + logger.info("set the dynamic ownership in %s as %s" % \
>> + (QEMU_CONF, d_ownership))
>> + if d_ownership == "enable":
>> + option = 1
>> + elif d_ownership == "disable":
>> + option = 0
>> + else:
>> + logger.error("wrong dynamic_ownership value")
>> + return 1
>> +
>> + set_cmd = "echo dynamic_ownership = %s>> %s" % \
>> + (option, QEMU_CONF)
>> + ret, out = util.exec_cmd(set_cmd, shell=True)
>> + if ret:
>> + logger.error("failed to set dynamic ownership")
>> + return 1
>> +
>> + logger.info("restart libvirtd")
>> + restart_cmd = "service libvirtd restart"
>> + ret, out = util.exec_cmd(restart_cmd, shell=True)
>> + if ret:
>> + logger.error("failed to restart libvirtd")
>> + for i in range(len(out)):
>> + logger.info(out[i])
>> + return 1
>> + else:
>> + for i in range(len(out)):
>> + logger.info(out[i])
>> +
>> + file_name = os.path.basename(disk_file)
>> + filepath = "/tmp/%s" % file_name
>> + if os.path.exists(filepath):
>> + os.remove(filepath)
>> +
>> + logger.info("copy %s img file to nfs path" % guestname)
>> + copy(disk_file, "/tmp")
>> +
>> + logger.info("set up nfs service on localhost")
>> + ret = nfs_setup(util, root_squash, logger)
>> + if ret:
>> + return 1
>> +
>> + logger.info("mount nfs to img dir path")
>> + mount_cmd = "mount -o vers=3 127.0.0.1:/tmp %s" % img_dir
>> + ret, out = util.exec_cmd(mount_cmd, shell=True)
>> + if ret:
>> + logger.error("Failed to mount the nfs path")
>> + for i in range(len(out)):
>> + logger.info(out[i])
>> + return 1
>> +
>> + return 0
>> +
>> +def domain_nfs_start(params):
>> + """start domain with img on nfs"""
>> + # Initiate and check parameters
>> + params_check_result = check_params(params)
>> + if params_check_result:
>> + return 1
>> +
>> + logger = params['logger']
>> + guestname = params['guestname']
>> + dynamic_ownership = params['dynamic_ownership']
>> + virt_use_nfs = params['virt_use_nfs']
>> + root_squash = params['root_squash']
>> +
>> + util = utils.Utils()
>> +
>> + # Connect to local hypervisor connection URI
>> + uri = util.get_uri('127.0.0.1')
>> + conn = connectAPI.ConnectAPI()
>> + virconn = conn.open(uri)
>> + domobj = domainAPI.DomainAPI(virconn)
>> +
>> + logger.info("get the domain state")
>> + try:
>> + state = domobj.get_state(guestname)
>> + logger.info("domain %s is %s" % (guestname, state))
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code is %s" % \
>> + (e.response()['message'], e.response()['code']))
>> + logger.error("Error: fail to get domain %s state" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + if state != "shutoff":
>> + logger.info("shut down the domain %s" % guestname)
>> + try:
>> + domobj.destroy(guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Error: fail to destroy domain %s" %
>> guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + logger.info("get guest img file path")
>> + try:
>> + dom_xml = domobj.get_xml_desc(guestname)
>> + disk_file = util.get_disk_path(dom_xml)
>> + logger.info("%s disk file path is %s" % (guestname, disk_file))
>> + img_dir = os.path.dirname(disk_file)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code is %s" % \
>> + (e.response()['message'], e.response()['code']))
>> + logger.error("Error: fail to get domain %s xml" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + # close connection before restart libvirtd
>> + conn.close()
>> +
>> + # set env
>> + logger.info("prepare the environment")
>> + ret = prepare_env(util, dynamic_ownership, virt_use_nfs,
>> guestname,\
> Comma not followed by a space.
>> + root_squash, disk_file, img_dir, logger)
>> + if ret:
>> + logger.error("failed to prepare the environment")
>> + return return_close(conn, logger, 1)
>> +
>> + # reconnect
>> + conn = connectAPI.ConnectAPI()
>> + virconn = conn.open(uri)
>> + domobj = domainAPI.DomainAPI(virconn)
>> +
>> + logger.info("begin to test start domain from nfs storage")
>> + logger.info("First, start the domain without chown the img file
>> to qemu")
>> + logger.info("start domain %s" % guestname)
>> + if root_squash == "yes":
>> + if virt_use_nfs == "on":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> + elif virt_use_nfs == "off":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> + elif root_squash == "no":
>> + if virt_use_nfs == "on":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.info("Success start domain %s" % guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Fail to start domain %s" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> + elif virt_use_nfs == "off":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + logger.info("get the domain state")
>> + try:
>> + state = domobj.get_state(guestname)
>> + logger.info("domain %s is %s" % (guestname, state))
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code is %s" % \
>> + (e.response()['message'], e.response()['code']))
>> + logger.error("Error: fail to get domain %s state" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + if state != "shutoff":
>> + logger.info("shut down the domain %s" % guestname)
>> + try:
>> + domobj.destroy(guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Error: fail to destroy domain %s" %
>> guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + logger.info("Second, start the domain after chown the img file
>> to qemu")
>> +
>> + file_name = os.path.basename(disk_file)
>> + filepath = "/tmp/%s" % file_name
>> + logger.info("set chown of %s as 107:107" % filepath)
>> + chown_cmd = "chown 107:107 %s" % filepath
>> + ret, out = util.exec_cmd(chown_cmd, shell=True)
> Unused variable 'out'.
>> + if ret:
>> + logger.error("failed to chown %s to qemu:qemu" % filepath)
>> + return return_close(conn, logger, 1)
>> +
>> + logger.info("start domain %s" % guestname)
>> + if root_squash == "yes":
>> + if virt_use_nfs == "on":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.info("Success start domain %s" % guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Fail to start domain %s" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.info("Success start domain %s" % guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Fail to start domain %s" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + elif virt_use_nfs == "off":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> + elif root_squash == "no":
>> + if virt_use_nfs == "on":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.info("Success start domain %s" % guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Fail to start domain %s" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.info("Success start Domain %s" % guestname)
>> + except LibvirtAPI, e:
>> + logger.error("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.error("Fail to start domain %s" % guestname)
>> + return return_close(conn, logger, 1)
>> +
>> + elif virt_use_nfs == "off":
>> + if dynamic_ownership == "enable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + elif dynamic_ownership == "disable":
>> + try:
>> + domobj.start(guestname)
>> + logger.error("Domain %s started, this is not
>> expected" % \
>> + guestname)
>> + return return_close(conn, logger, 1)
>> + except LibvirtAPI, e:
>> + logger.info("API error message: %s, error code
>> is %s" % \
>> + (e.response()['message'],
>> e.response()['code']))
>> + logger.info("Fail to start domain %s, this is
>> expected" % \
>> + guestname)
>> +
>> + return return_close(conn, logger, 0)
>> +
>> +def domain_nfs_start_clean(params):
>> + """clean testing environment"""
>> + logger = params['logger']
>> + guestname = params['guestname']
>> +
>> + util = utils.Utils()
>> +
>> + # Connect to local hypervisor connection URI
>> + uri = util.get_uri('127.0.0.1')
>> + conn = connectAPI.ConnectAPI()
>> + virconn = conn.open(uri)
>> + domobj = domainAPI.DomainAPI(virconn)
>> +
>> + if domobj.get_state(guestname) != "shutoff":
>> + domobj.destroy(guestname)
>> +
>> + dom_xml = domobj.get_xml_desc(guestname)
>> + disk_file = util.get_disk_path(dom_xml)
>> + img_dir = os.path.dirname(disk_file)
>> + file_name = os.path.basename(disk_file)
>> + temp_file = "/tmp/%s" % file_name
>> +
>> + if os.path.ismount(img_dir):
>> + umount_cmd = "umount -f %s" % img_dir
>> + ret, out = util.exec_cmd(umount_cmd, shell=True)
> Same as above.
>> + if ret:
>> + logger.error("failed to umount %s" % img_dir)
>> +
>> + if os.path.exists(temp_file):
>> + os.remove(temp_file)
>> +
>> + conn.close()
>> +
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
ACK and pushed with these small modification.
Guannan Ren
More information about the libvir-list
mailing list