
# HG changeset patch # User Deepti B. Kalakeri<deeptik@linux.vnet.ibm.com> # Date 1258744084 28800 # Node ID b4b4e5f9b7efad90d37e06a2583d2a426b291d8e # Parent c7561bf6112633f00d6bfb2ba1871ef63855d529 [TEST] Adding new tc to verify Libvirt-CIM profile advertisement via slp. Tested with KVM and current sources on rhel5.4. Signed-off-by: Deepti B. Kalakeri <deeptik@linux.vnet.ibm.com> diff -r c7561bf61126 -r b4b4e5f9b7ef suites/libvirt-cim/cimtest/Profile/04_verify_libvirt_cim_slp_profiles.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/suites/libvirt-cim/cimtest/Profile/04_verify_libvirt_cim_slp_profiles.py Fri Nov 20 11:08:04 2009 -0800 @@ -0,0 +1,188 @@ +#! /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 +# +# The following test case is used to verify the profiles registered by +# Libvirt-CIM are advertised via slp tool. +# +# Date : 20-10-2009 + +import sys +import os +import string +from sets import Set +from socket import gethostbyaddr +from VirtLib.utils import run_remote +from XenKvmLib import enumclass +from XenKvmLib.classes import get_typed_class +from CimTest import Globals +from CimTest.Globals import logger +from XenKvmLib.const import do_main +from CimTest.ReturnCodes import PASS, FAIL, SKIP + +sup_types = ['Xen', 'KVM', 'XenFV', 'LXC'] +slp_path="/usr/bin/slptool" + +def get_slp_info(server): + + if not os.path.exists(slp_path): + logger.error("Slp tool does not exist on the machine ") + return SKIP + + logger.info("Slp tool found on the machine ....") + + # The test is written to work with Pegasus for now. + # In future we can include sfcb support as well + # When sfcb support will be planned then replace the following check + # with check_cimom() fn of common_util.py lib + cmd = "ps -ef | grep -v grep | grep cimserver" + rc, out = run_remote(server, cmd) + if rc != 0: + logger.error("cimserver not found on '%s'", server) + return FAIL + + cmd = "cimconfig -l -p | grep slp" + rc, out = run_remote(server, cmd) + if rc != 0: + logger.error("slp is not enabled in the cimserver on '%s'", server) + return FAIL + + return PASS + +def get_slp_attrs(server): + slp_attrs = None + status = FAIL + + cmd = "%s findsrvs service:wbem | grep -w http | "\ + "grep -e '%s'" % (slp_path, server) + rc, out = run_remote(server, cmd) + if rc != 0: + logger.error("Failed to find slp service on '%s'", server) + return status, slp_attrs + + attrs_in = out.rsplit(",") + slp_query = attrs_in[0] + cmd = "%s findattrs %s" % (slp_path, slp_query) + rc, slp_attrs = run_remote(server, cmd) + if len(slp_attrs) == 0: + # Getting the query and the port details + slp_query_info = slp_query.rsplit(":", 1) + slp_service_query = slp_query_info[0] + port_used = slp_query_info[1] + logger.info("Did not get the profile information for '%s'", slp_query) + logger.info("Trying with ports other than '%s'....", port_used) + + # Remove the already used port information + ports = attrs_in.remove(slp_query) + for port in attrs_in: + new_slp_query = slp_service_query + ":" + port + cmd = "%s findattrs %s" % (slp_path, new_slp_query) + rc, slp_attrs = run_remote(server, cmd) + if len(slp_attrs) != 0: + break + + if len(slp_attrs) != 0: + status = PASS + + return status, slp_attrs + +def filter_reg_name_from_slp(slp_attrs): + slp_profile_list = [] + + for line in slp_attrs.split('\n'): + lines=line.split("RegisteredProfilesSupported") + dmtf_profiles=lines[1].split("DMTF") + for profile in dmtf_profiles: + temp_reg_ele = profile.rsplit(":", 1)[1].rstrip(",") + reg_prof_name = temp_reg_ele.rstrip(")") + slp_profile_list.append(reg_prof_name) + + slp_profile_list = Set(slp_profile_list) + + return slp_profile_list + +def get_libvirt_cim_profile_info(server, virt): + libvirt_cim_reg_list = None + status = FAIL + prev_namespace = Globals.CIM_NS + Globals.CIM_NS = 'root/interop' + cn = get_typed_class(virt, 'RegisteredProfile') + + try: + proflist = enumclass.EnumInstances(server, cn) + except Exception, detail: + logger.error(CIM_ERROR_ENUMERATE, get_typed_class(virt, cn)) + logger.error("Exception: %s", detail) + Globals.CIM_NS = prev_namespace + return status, libvirt_cim_reg_list + + Globals.CIM_NS = prev_namespace + + libvirt_cim_reg_list = Set([str(x.RegisteredName) for x in proflist]) + if len(libvirt_cim_reg_list) != 0: + status = PASS + + return status, libvirt_cim_reg_list + + +@do_main(sup_types) +def main(): + options = main.options + server = options.ip + virt = options.virt + status = FAIL + + # Making sure that the server information passed is + # hostname or ip address + if server == "localhost": + logger.error("Please specify hostname or ip address, than '%s'", + server) + return SKIP + + status = get_slp_info(server) + if status != PASS: + return status + + ip_addr = gethostbyaddr(server)[2][0] + status, slp_attrs = get_slp_attrs(ip_addr) + if status != PASS: + logger.error("Failed to get slp attributes on %s", server) + return status + + slp_profile_list = filter_reg_name_from_slp(slp_attrs) + + status, libvirt_cim_reg_list = get_libvirt_cim_profile_info(server, virt) + if status != PASS: + logger.error("Failed to enumerate profile information on %s", server) + return status + + # Make sure all the Libvirt-CIM profiles are advertised via slp + if (libvirt_cim_reg_list) <= (slp_profile_list): + logger.info("Successfully verified the Libvirt-CIM profiles") + return PASS + else: + logger.error("Mismatch in the profiles registered") + logger.error("Slp returned profile --> %s,\n Libvirt-CIM expected " + "profiles %s", slp_profile_list, libvirt_cim_reg_list) + return FAIL + +if __name__=="__main__": + sys.exit(main()) +