
# HG changeset patch # User Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> # Date 1252950808 25200 # Node ID dd9934ef45513152cea0848d3caab08440199c43 # Parent c97d63289d40f9b64c8ab3b2a2c33538b9ad5907 [TEST] Add new tc to verify the err values for RPCS DeleteResourceInPool() Tested with KVM and current sources on SLES11. Signed-off-by: Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> diff -r c97d63289d40 -r dd9934ef4551 suites/libvirt-cim/cimtest/ResourcePoolConfigurationService/14_delete_storagevolume_errs.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/suites/libvirt-cim/cimtest/ResourcePoolConfigurationService/14_delete_storagevolume_errs.py Mon Sep 14 10:53:28 2009 -0700 @@ -0,0 +1,193 @@ +#!/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 deletion of the StorageVol using the +# DeleteResourceInPool method of RPCS returns error when invalid values are +# passed. +# +# -Date: 08-09-2009 + +import sys +import os +from VirtLib import utils +from CimTest.Globals import logger +from pywbem import CIM_ERR_FAILED, CIM_ERR_INVALID_PARAMETER, CIMError +from CimTest.ReturnCodes import FAIL, PASS, SKIP +from XenKvmLib.xm_virt_util import virsh_version +from XenKvmLib.const import do_main, platform_sup, default_pool_name, \ + get_provider_version +from XenKvmLib import rpcs_service +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, \ + libvirt_rasd_spool_del_changes, get_diskpool, \ + get_stovol_default_settings, \ + get_stovol_rasd_from_sdc + +pool_attr = { 'Path' : "/tmp" } +vol_name = "cimtest-vol.img" +invalid_scen = { "INVALID_ADDRESS" : { 'val' : 'Junkvol_path', + 'msg' : 'no storage vol with '\ + 'matching path' }, + "NO_ADDRESS_FIELD" : { 'msg' :'Missing Address in '\ + 'resource RASD' }, + "MISSING_RESOURCE" : { 'msg' :"Missing argument `Resource'"}, + "MISSING_POOL" : { 'msg' :"Missing argument `Pool'"} + } + + +def get_sto_vol_rasd(virt, server, dp_cn, pool_name, exp_vol_path): + dv_rasds = None + dp_inst_id = "%s/%s" % (dp_cn, pool_name) + 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 = item + break + + return dv_rasds + + +def verify_rpcs_err_val(virt, server, rpcs_conn, dp_cn, pool_name, + exp_vol_path, dp_inst): + for err_scen in invalid_scen.keys(): + logger.info("Verifying errors for '%s'....", err_scen) + status = FAIL + del_res = [FAIL] + try: + res_settings = get_sto_vol_rasd(virt, server, dp_cn, + pool_name, exp_vol_path) + if res_settings == None: + raise Exception("Failed to get the resource settings for '%s'" \ + " Vol" % vol_name) + + if not "MISSING" in err_scen: + exp_err_no = CIM_ERR_FAILED + if "NO_ADDRESS_FIELD" in err_scen: + del res_settings['Address'] + elif "INVALID_ADDRESS" in err_scen: + res_settings['Address'] = invalid_scen[err_scen]['val'] + + resource = inst_to_mof(res_settings) + del_res = rpcs_conn.DeleteResourceInPool(Resource=resource, + Pool=dp_inst) + else: + exp_err_no = CIM_ERR_INVALID_PARAMETER + if err_scen == "MISSING_RESOURCE": + del_res = rpcs_conn.DeleteResourceInPool(Pool=dp_inst) + elif err_scen == "MISSING_POOL": + resource = inst_to_mof(res_settings) + del_res = rpcs_conn.DeleteResourceInPool(Resource=resource) + + except CIMError, (err_no, err_desc): + if del_res[0] != PASS and invalid_scen[err_scen]['msg'] in err_desc\ + and exp_err_no == err_no: + logger.error("Got the expected error message: '%s' for '%s'", + err_desc, err_scen) + status = PASS + else: + logger.error("Failed to get the error message '%s'", + invalid_scen[err_scen]['msg']) + + if del_res[0] == PASS: + logger.error("Should not have been able to delete Vol %s", vol_name) + return FAIL + + return status + +def cleanup_vol(server, exp_vol_path): + try: + if os.path.exists(exp_vol_path): + cmd = "rm -rf %s" % exp_vol_path + ret, out = utils.run_remote(server, cmd) + if ret != 0: + raise Exception("'%s' was not removed, please remove it " \ + "manually" % exp_vol_path) + except Exception, details: + logger.error("Exception details: %s", details) + return FAIL + + 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_spool_del_changes: + logger.info("Storage Volume deletion support is available with Libvirt" + "version >= 0.4.1 and Libvirt-CIM rev '%s'", + libvirt_rasd_spool_del_changes) + return SKIP + + dp_cn = "DiskPool" + exp_vol_path = "%s/%s" % (pool_attr['Path'], vol_name) + + pool_name = default_pool_name + pool_type = DIR_POOL + status = FAIL + res = del_res = [FAIL] + try: + sv_rasd = get_stovol_default_settings(virt, server, dp_cn, pool_name, + exp_vol_path, vol_name) + if sv_rasd == None: + raise Exception("Failed to get the defualt StorageVolRASD info") + + sv_settings = inst_to_mof(sv_rasd) + + dp_inst = get_diskpool(server, virt, dp_cn, pool_name) + if dp_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=sv_settings, + Pool=dp_inst) + if res[0] != PASS: + raise Exception("Failed to create the Vol %s" % vol_name) + + status = verify_rpcs_err_val(virt, server, rpcs_conn, dp_cn, + pool_name, exp_vol_path, dp_inst) + if status != PASS : + raise Exception("Failed to verify the error") + + except Exception, details: + logger.error("Exception details: %s", details) + status = FAIL + + ret = cleanup_vol(server, exp_vol_path) + if status != PASS or ret != PASS: + return FAIL + + return PASS +if __name__ == "__main__": + sys.exit(main())