# HG changeset patch
# User Deepti B. Kalakeri<deeptik(a)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(a)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(a)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())
+