[PATCH 0 of 2] [TEST] #2 [Resending] Adding new test RPCS/10_create_storagevolume.py

# HG changeset patch # User Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> # Date 1251275502 25200 # Node ID bd5411ebb634f6cf0945aa4e2f6896eb4221c03f # Parent 3c09a49a30f4bc1e6544736612508d3f99308083 [TEST] Adding vol_list to xm_virt_util.py. Tested with KVM on F11 with current sources. Signed-off-by: Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> diff -r 3c09a49a30f4 -r bd5411ebb634 suites/libvirt-cim/lib/XenKvmLib/xm_virt_util.py --- a/suites/libvirt-cim/lib/XenKvmLib/xm_virt_util.py Mon Aug 24 13:28:13 2009 -0700 +++ b/suites/libvirt-cim/lib/XenKvmLib/xm_virt_util.py Wed Aug 26 01:31:42 2009 -0700 @@ -237,6 +237,17 @@ return names +def vol_list(server, virt="KVM", pool_name=None): + """ Function to list the volumes part of a pool""" + + cmd = " virsh -c %s vol-list %s | sed -e '1,2 d' -e '$ d'" \ + % (virt2uri(virt), pool_name) + ret, out = utils.run_remote(server, cmd) + if ret != 0: + return None + + return out + def virsh_vcpuinfo(server, dom, virt="Xen"): cmd = "virsh -c %s vcpuinfo %s | grep VCPU | wc -l" % (virt2uri(virt), dom)

# HG changeset patch # User Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> # Date 1251350089 25200 # Node ID 7fa9b3a3bca5106d4f4a16278ca9169816a44526 # Parent bd5411ebb634f6cf0945aa4e2f6896eb4221c03f [TEST]#2 Adding new test RPCS/10_create_storagevolume.py Patch 2: -------- 1) Added code to verify the StoVol template RASD. 2) Seperated the SDC query into a function. 3) Used the default_disk_pool for DIR type pools This test verifies the creation of StorageVol in the dir pool. Tested with KVM on F11 with current sources. Signed-off-by: Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> diff -r bd5411ebb634 -r 7fa9b3a3bca5 suites/libvirt-cim/cimtest/ResourcePoolConfigurationService/10_create_storagevolume.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/suites/libvirt-cim/cimtest/ResourcePoolConfigurationService/10_create_storagevolume.py Wed Aug 26 22:14:49 2009 -0700 @@ -0,0 +1,229 @@ +#!/usr/bin/python +# +# Copyright 2009 IBM Corp. +# +# Authors: +# Deepti B. Kalakeri<dkalaker@in.ibm.com> +# +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# This test case verifies the creation of the StorageVol using the +# CreateResourceInPool method of RPCS. +# +# -Date: 21-08-2009 + +import sys +import os +from VirtLib import utils +from CimTest.Globals import logger +from CimTest.ReturnCodes import FAIL, PASS, SKIP +from XenKvmLib.const import do_main, platform_sup, default_pool_name, \ + get_provider_version +from XenKvmLib.vsms import RASD_TYPE_STOREVOL +from XenKvmLib.rasd import libvirt_rasd_storagepool_changes +from XenKvmLib import rpcs_service +from XenKvmLib.assoc import Associators +from XenKvmLib.enumclass import GetInstance, EnumNames +from XenKvmLib.xm_virt_util import virsh_version, vol_list +from XenKvmLib.classes import get_typed_class, inst_to_mof +from XenKvmLib.common_util import destroy_diskpool +from XenKvmLib.pool import create_pool, undefine_diskpool, DIR_POOL + +pool_attr = { 'Path' : "/tmp" } +vol_name = "cimtest-vol.img" + +def get_stovol_rasd_from_sdc(virt, server, dp_inst_id): + rasd = None + ac_cn = get_typed_class(virt, "AllocationCapabilities") + an_cn = get_typed_class(virt, "SettingsDefineCapabilities") + key_list = {"InstanceID" : dp_inst_id} + + try: + inst = GetInstance(server, ac_cn, key_list) + rasd = Associators(server, an_cn, ac_cn, InstanceID=inst.InstanceID) + except Exception, detail: + logger.error("Exception: %s", detail) + return FAIL, None + + return PASS, rasd + +def get_stovol_settings(server, virt, dp_id, pool_name): + status, dp_rasds = get_stovol_rasd_from_sdc(virt, server, dp_id) + if status != PASS: + logger.error("Failed to get the StorageVol RASD's") + return None + + for dpool_rasd in dp_rasds: + if dpool_rasd['ResourceType'] == RASD_TYPE_STOREVOL and \ + 'Default' in dpool_rasd['InstanceID']: + + dpool_rasd['PoolID'] = dp_id + dpool_rasd['Path'] = pool_attr['Path'] + dpool_rasd['VolumeName'] = vol_name + break + + if not pool_name in dpool_rasd['PoolID']: + return None + + stovol_settings = inst_to_mof(dpool_rasd) + + return stovol_settings + +def get_diskpool(server, virt, dp_cn, dp_inst_id): + disk_pool_inst = None + dpool_cn = get_typed_class(virt, dp_cn) + pools = EnumNames(server, dpool_cn) + for pool in pools: + if pool['InstanceID'] == dp_inst_id: + disk_pool_inst = pool + break + + return disk_pool_inst + +def verify_vol(server, virt, pool_name, exp_vol_path, found): + vols = vol_list(server, virt, pool_name) + if vols == None: + raise Exception("Failed to get the volume information") + + for vol in vols.split('\n'): + res_vol_name, res_vol_path = vol.split() + if res_vol_name != vol_name and res_vol_path != exp_vol_path: + continue + else: + found += 1 + + if found != 1: + logger.error("Failed to get the vol information") + + return found + +def verify_sto_vol_rasd(virt, server, dp_inst_id, exp_vol_path): + dv_rasds = [] + status, rasds = get_stovol_rasd_from_sdc(virt, server, dp_inst_id) + if status != PASS: + logger.error("Failed to get the StorageVol for '%s' vol", exp_vol_path) + return FAIL + + for item in rasds: + if item['Address'] == exp_vol_path and item['PoolID'] == dp_inst_id: + dv_rasds.append(item) + + if len(dv_rasds) != 4: + logger.error("Got '%s' StorageVolRASD's expected 4", len(dv_rasds)) + return FAIL + + return PASS + + +def cleanup_pool_vol(server, virt, pool_name, clean_vol, exp_vol_path): + try: + if clean_vol == True: + status = destroy_diskpool(server, virt, pool_name) + if status != PASS: + raise Exception("Unable to destroy diskpool '%s'" % pool_name) + else: + status = undefine_diskpool(server, virt, pool_name) + if status != PASS: + raise Exception("Unable to undefine diskpool '%s'" \ + % pool_name) + except Exception, details: + logger.error("Exception details: %s", details) + return FAIL + + if os.path.exists(exp_vol_path): + cmd = "rm -rf %s" % exp_vol_path + ret, out = utils.run_remote(server, cmd) + if ret != 0: + logger.info("'%s' was not removed, please remove it manually", + exp_vol_path) + return PASS + +@do_main(platform_sup) +def main(): + options = main.options + server = options.ip + virt = options.virt + + libvirt_ver = virsh_version(server, virt) + cim_rev, changeset = get_provider_version(virt, server) + if libvirt_ver < "0.4.1" and cim_rev < libvirt_rasd_storagepool_changes: + logger.info("Storage Volume creation support is available with Libvirt" + "version >= 0.4.1 and Libvirt-CIM rev '%s'", + libvirt_rasd_storagepool_changes) + return SKIP + + dp_cn = "DiskPool" + exp_vol_path = "%s/%s" % (pool_attr['Path'], vol_name) + + # For now the test case support only the creation of dir type based + # vol creation, we can extend dp_types to include netfs etc + dp_types = { "DISK_POOL_DIR" : DIR_POOL } + + for pool_name, pool_type in dp_types.iteritems(): + status = FAIL + res = [FAIL] + found = 0 + clean_pool=True + try: + if pool_type == DIR_POOL: + pool_name = default_pool_name + clean_pool=False + else: + status = create_pool(server, virt, pool_name, pool_attr, + mode_type=pool_type, pool_type="DiskPool") + + if status != PASS: + logger.error("Failed to create pool '%s'", pool_name) + return status + + dp_inst_id = "%s/%s" % (dp_cn, pool_name) + stovol_settings = get_stovol_settings(server, virt, + dp_inst_id, pool_name) + if stovol_settings == None: + raise Exception("Failed to get the defualt StorageVolRASD info") + + disk_pool_inst = get_diskpool(server, virt, dp_cn, dp_inst_id) + if disk_pool_inst == None: + raise Exception("DiskPool instance for '%s' not found!" \ + % pool_name) + + rpcs = get_typed_class(virt, "ResourcePoolConfigurationService") + rpcs_conn = eval("rpcs_service." + rpcs)(server) + res = rpcs_conn.CreateResourceInPool(Settings=stovol_settings, + Pool=disk_pool_inst) + if res[0] != PASS: + raise Exception("Failed to create the Vol %s" % vol_name) + + found = verify_vol(server, virt, pool_name, exp_vol_path, found) + stovol_status = verify_sto_vol_rasd(virt, server, dp_inst_id, + exp_vol_path) + + except Exception, details: + logger.error("Exception details: %s", details) + status = FAIL + + ret = cleanup_pool_vol(server, virt, pool_name, + clean_pool, exp_vol_path) + if res[0] == PASS and found == 1 and \ + ret == PASS and stovol_status == PASS: + status = PASS + else: + return FAIL + + return status +if __name__ == "__main__": + sys.exit(main())
participants (1)
-
Deepti B. Kalakeri