X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=qaapi%2Fqa%2FConfig.py;h=7aa108ac7b8d68a85ec6b836b8c640e9c66d2799;hb=4297f83e55247a16c587d1aae4205f198d17fd69;hp=0e3c74742cb78af9336867461d1cca21dbb91006;hpb=4e4ecc675bcec87675d97999a7ba5564d520d2d3;p=tests.git diff --git a/qaapi/qa/Config.py b/qaapi/qa/Config.py index 0e3c747..7aa108a 100644 --- a/qaapi/qa/Config.py +++ b/qaapi/qa/Config.py @@ -4,50 +4,82 @@ import sys import re import socket import utils +import copy +from logger import logfile, Logfile +from Table import Table +from PLCs import PLC, PLCs +from Sites import Site, Sites +from Nodes import Node, Nodes +from Slices import Slice, Slices +from Persons import Person, Persons +from TestScripts import TestScript + +path = os.path.dirname(os.path.abspath(__file__)) class Config: path = os.path.dirname(os.path.abspath(__file__)) - tests_path = path + os.sep + 'tests' - node_tests_path = tests_path + os.sep + 'node' - slice_tests_path = tests_path + os.sep + 'slice' - - def update_api(self): + tests_path = path + os.sep + 'tests' + os.sep + node_tests_path = tests_path + os.sep + 'node' + os.sep + slice_tests_path = tests_path + os.sep + 'slice' + os.sep + vserver_scripts_path = path + os.sep + 'vserver' + os.sep + + def update_api(self, plc = None): # Set up API acccess - # Try importing the API shell for direct api access. - # If that fails fall back to using xmlrpm - try: - sys.path.append('/usr/share/plc_api') - from PLC.Shell import Shell - shell = Shell(globals = globals()) + # If plc is specified, find its configuration + # and use its API + if plc is not None: + protocol, host, path, port = 'http', plc['host'], plc['api_path'], plc['port'] + if port in ['443']: + protocol = 'https' + api_server = "%(protocol)s://%(host)s:%(port)s/%(path)s" % locals() + self.api = xmlrpclib.Server(api_server, allow_none = 1) + self.api_type = 'xmlrpc' + else: + + # Try importing the API shell for direct api access. + # If that fails fall back to using xmlrpm + try: + sys.path.append('/usr/share/plc_api') + from PLC.Shell import Shell + shell = Shell(globals = globals()) - # test it - shell.GetRoles() - self.api = shell - self.api_type = 'direct' - except: - self.api = xmlrpclib.Server('https://%s/PLCAPI/' % self.PLC_API_HOST, allow_none = 1) - self.api_type = 'xmlrpc' + # test it + shell.GetRoles() + self.api = shell + self.api_type = 'direct' + except: + self.api = xmlrpclib.Server('https://%s/PLCAPI/' % self.PLC_API_HOST, allow_none = 1) + self.api_type = 'xmlrpc' - def __init__(self, config_file = path+os.sep+'qa_config'): + def __init__(self, config_file = path+os.sep+'qa_config', logdir = "/var/log"): # Load config file try: execfile(config_file, self.__dict__) except: raise "Could not find system config in %s" % config_file - + + self.logdir = logdir + log_filename = logdir + os.sep + "qaapi.log" + self.update_logfile(log_filename) self.auth = {} self.auth['Username'] = self.PLC_ROOT_USER self.auth['AuthString'] = self.PLC_ROOT_PASSWORD self.auth['AuthMethod'] = 'password' - self.verbose = self.VERBOSE + self.verbose = self.VERBOSE + + attributes = ['plcs', 'sites', 'slices', 'nodes', 'persons', 'nodegroups'] + for attribute in attributes: + setattr(self, attribute, []) # try setting hostname and ip self.hostname = socket.gethostname() - (stdout, stderr) = utils.popen("/sbin/ifconfig eth0 | grep 'inet addr'") - inet_addr = re.findall('inet addr:[0-9\.^\w]*', stdout[0])[0] - parts = inet_addr.split(":") - self.ip = parts[1] + try: + command = "/sbin/ifconfig eth0 | grep -v inet6 | grep inet | awk '{print$2;}'" + (status, output) = utils.commands(command, logfile = self.logfile) + self.ip = re.findall(r'[0-9\.]+', output)[0] + except: + self.ip = '127.0.0.1' api_host = self.__dict__.get("PLC_API_HOST",self.ip) self.PLC_API_HOST=api_host @@ -60,3 +92,94 @@ class Config: node_test_files = os.listdir(self.node_tests_path) self.node_test_files = filter(valid_node_test_files, node_test_files) + def update_logfile(self, filename): + self.logfile = Logfile(filename) + filename_parts = self.logfile.filename.split(os.sep) + self.logdir = os.sep + os.sep.join(filename_parts[:-1]) + os.sep + + def get_plc(self, plc_name): + plc = PLC(self) + if hasattr(self, 'plcs') and plc_name in self.plcs.keys(): + plc.update(self.plcs[plc_name]) + plc.update_api() + return plc + + def get_node(self, hostname): + node = Node(self) + if hasattr(self, 'nodes') and hostname in self.nodes.keys(): + node.update(self.nodes[hostname]) + node.__init_logfile__() + return node + + def get_node_test(self, testscript): + script = TestScript({'name': testscript}) + if hasattr(self, 'node_tests') and testscript in self.node_tests.keys(): + script.update(self.node_tests[testscript]) + return script + + def get_slice_test(self, testscript): + script = TestScript() + if hasattr(self, 'slice_tests') and testscript in self.slice_tests.keys(): + script.update(self.slice_tests[testscript]) + return script + + + def load(self, conffile): + + confdata = {} + try: execfile(conffile, confdata) + except: raise + + from Nodes import Nodes + from PLCs import PLCs + loadables = ['plcs', 'sites', 'nodes', 'nodegroups', 'slices', 'persons'] + config = Config(logdir = self.logdir) + for element in confdata.keys(): + if element in ['plcs'] and confdata.has_key(element): + setattr(self, element, PLCs(config, confdata[element]).dict('name')) + setattr(config, element, PLCs(config, confdata[element]).dict('name')) + elif element in ['nodes'] and confdata.has_key(element): + setattr(self, element, Nodes(config, confdata[element]).dict('hostname')) + setattr(config, element, Nodes(config, confdata[element]).dict('hostname')) + elif element in ['nodegroups'] and confdata.has_key(element): + setattr(self, element, Table(confdata[element]).dict('name')) + setattr(config, element, Table(confdata[element]).dict('name')) + elif element in ['sites'] and confdata.has_key(element): + setattr(self, element, Sites(confdata[element]).dict('login_base')) + setattr(config, element, Sites(confdata[element]).dict('login_base')) + elif element in ['slices'] and confdata.has_key(element): + setattr(self, element, Slices(config, confdata[element]).dict('name')) + setattr(config, element, Slices(config, confdata[element]).dict('name')) + elif element in ['persons'] and confdata.has_key(element): + setattr(self, element, Persons(confdata[element]).dict('email')) + setattr(config, element, Persons(confdata[element]).dict('email')) + elif element in ['node_tests'] and confdata.has_key(element): + setattr(self, element, TestScripts(confdata[element]).dict('name')) + setattr(config, element, TestScripts(confdata[element]).dict('name')) + elif element in ['slice_tests'] and confdata.has_key(element): + setattr(self, element, TestScripts(confdata[element]).dict('name')) + setattr(config, element, TestScripts(confdata[element]).dict('name')) + + def archive_scripts(self, prefix): + valid_prefix = ['slice', 'node'] + if prefix not in valid_prefix: + raise "Error. Invalid prefix %s. Must be in %s" % (prefix, valid_prefix) + + scripts_dir = self.path + os.sep + 'tests' +os.sep + prefix + os.sep + workdir = '/tmp' + os.sep + archive_path = workdir + os.sep + prefix + os.sep + archive_filename = prefix + ".tar.gz" + + if self.verbose: + utils.header("Creating/Updating %s archive %s" % (prefix, archive_path + archive_filename), logfile = self.logfile) + utils.commands("mkdir -p %(archive_path)s" % locals(), logfile = self.logfile) + utils.commands("cp -Rf %(scripts_dir)s* %(archive_path)s" % locals(), logfile = self.logfile) + tar_cmd = "cd %(workdir)s && tar -czf %(workdir)s/%(archive_filename)s %(prefix)s" % locals() + utils.commands(tar_cmd, logfile = self.logfile) + return (archive_filename, workdir+archive_filename) + + def archive_slice_tests(self): + return self.archive_scripts('slice') + + def archive_node_tests(self): + return self.archive_scripts('node')