From 9873984d340289ab3adcd3a7abf26ea93fc87ac1 Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Wed, 21 Sep 2016 14:56:08 +0800 Subject: use configure file rather than arguments to organize the configuration JIRA: FUNCTEST-480 Change-Id: Id5706de5f05d6841a1e9d8bafae7df0255c22a26 Signed-off-by: SerenaFeng --- utils/test/scripts/conf_utils.py | 24 ------- utils/test/scripts/config.ini | 14 ++++ utils/test/scripts/config.py | 88 ++++++++++++++++++++++++++ utils/test/scripts/create_kibana_dashboards.py | 40 +++++------- utils/test/scripts/mongo_to_elasticsearch.py | 50 ++++++++------- utils/test/scripts/testcases_parser.py | 24 +++++++ 6 files changed, 168 insertions(+), 72 deletions(-) delete mode 100644 utils/test/scripts/conf_utils.py create mode 100644 utils/test/scripts/config.ini create mode 100644 utils/test/scripts/config.py create mode 100644 utils/test/scripts/testcases_parser.py (limited to 'utils/test') diff --git a/utils/test/scripts/conf_utils.py b/utils/test/scripts/conf_utils.py deleted file mode 100644 index cf9599858..000000000 --- a/utils/test/scripts/conf_utils.py +++ /dev/null @@ -1,24 +0,0 @@ -import yaml - - -with open('./testcases.yaml') as f: - testcases_yaml = yaml.safe_load(f) -f.close() - - -def compose_format(fmt): - return 'format_' + fmt.strip() - - -def get_format(project, case): - testcases = testcases_yaml.get(project) - if isinstance(testcases, list): - for case_dict in testcases: - if case_dict['name'] == case: - return compose_format(case_dict['format']) - return None - - -if __name__ == '__main__': - fmt = get_format('functest', 'vping_ssh') - print fmt diff --git a/utils/test/scripts/config.ini b/utils/test/scripts/config.ini new file mode 100644 index 000000000..63d283dc8 --- /dev/null +++ b/utils/test/scripts/config.ini @@ -0,0 +1,14 @@ +# to add a new parameter in the config file, +# the CONF object in config.ini must be updated +[elastic] +url = http://localhost:9200 +creds = + +[output] +# elasticsearch or console +destination = elasticsearch + +[kibana] +url = http://10.63.243.17/kibana/app/kibana +js = true +js_path = /usr/share/nginx/html/kibana_dashboards/conf.js diff --git a/utils/test/scripts/config.py b/utils/test/scripts/config.py new file mode 100644 index 000000000..2d447a7ba --- /dev/null +++ b/utils/test/scripts/config.py @@ -0,0 +1,88 @@ +#! /usr/bin/env python + +from ConfigParser import SafeConfigParser, NoOptionError + + +class ParseError(Exception): + """ + Custom exception class for config file + """ + + def __init__(self, message): + self.msg = message + + def __str__(self): + return 'error parsing config file : %s' % self.msg + + +class APIConfig: + """ + The purpose of this class is to load values correctly from the config file. + Each key is declared as an attribute in __init__() and linked in parse() + """ + + def __init__(self): + self._default_config_location = "./config.ini" + self.elastic_url = 'http://localhost:9200' + self.elastic_creds = None + self.destination = 'elasticsearch' + self.kibana_url = None + self.is_js = True + self.js_path = None + + def _get_str_parameter(self, section, param): + try: + return self._parser.get(section, param) + except NoOptionError: + raise ParseError("[%s.%s] parameter not found" % (section, param)) + + def _get_int_parameter(self, section, param): + try: + return int(self._get_str_parameter(section, param)) + except ValueError: + raise ParseError("[%s.%s] not an int" % (section, param)) + + def _get_bool_parameter(self, section, param): + result = self._get_str_parameter(section, param) + if str(result).lower() == 'true': + return True + if str(result).lower() == 'false': + return False + + raise ParseError( + "[%s.%s : %s] not a boolean" % (section, param, result)) + + @staticmethod + def parse(config_location=None): + obj = APIConfig() + + if config_location is None: + config_location = obj._default_config_location + + obj._parser = SafeConfigParser() + obj._parser.read(config_location) + if not obj._parser: + raise ParseError("%s not found" % config_location) + + # Linking attributes to keys from file with their sections + obj.elastic_url = obj._get_str_parameter("elastic", "url") + obj.elastic_creds = obj._get_str_parameter("elastic", "creds") + obj.destination = obj._get_str_parameter("output", "destination") + obj.kibana_url = obj._get_str_parameter("kibana", "url") + obj.is_js = obj._get_bool_parameter("kibana", "js") + obj.js_path = obj._get_str_parameter("kibana", "js_path") + + return obj + + def __str__(self): + return "elastic_url = %s \n" \ + "elastic_creds = %s \n" \ + "destination = %s \n" \ + "kibana_url = %s \n" \ + "is_js = %s \n" \ + "js_path = %s \n" % (self.elastic_url, + self.elastic_creds, + self.destination, + self.kibana_url, + self.is_js, + self.js_path) diff --git a/utils/test/scripts/create_kibana_dashboards.py b/utils/test/scripts/create_kibana_dashboards.py index efa6e177e..19d5b5e52 100644 --- a/utils/test/scripts/create_kibana_dashboards.py +++ b/utils/test/scripts/create_kibana_dashboards.py @@ -4,12 +4,21 @@ import urlparse import argparse -import conf_utils import logger_utils import shared_utils +import testcases_parser +from config import APIConfig logger = logger_utils.KibanaDashboardLogger('elastic2kibana').get +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--config-file", + dest='config_file', + help="Config file location") + +args = parser.parse_args() +CONF = APIConfig().parse(args.config_file) + _installers = {'fuel', 'apex', 'compass', 'joid'} @@ -303,7 +312,7 @@ def construct_dashboards(): :return: list of KibanaDashboards """ kibana_dashboards = [] - for project, case_dicts in conf_utils.testcases_yaml.items(): + for project, case_dicts in testcases_parser.testcases_yaml.items(): for case in case_dicts: case_name = case.get('name') visualizations = case.get('visualizations') @@ -351,28 +360,11 @@ def generate_js_inputs(js_file_path, kibana_url, dashboards): if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Create Kibana dashboards from data in elasticsearch') - parser.add_argument('-e', '--elasticsearch-url', default='http://localhost:9200', - help='the url of elasticsearch, defaults to http://localhost:9200') - - parser.add_argument('-js', '--generate_js_inputs', action='store_true', - help='Use this argument to generate javascript inputs for kibana landing page') - - parser.add_argument('--js_path', default='/usr/share/nginx/html/kibana_dashboards/conf.js', - help='Path of javascript file with inputs for kibana landing page') - - parser.add_argument('-k', '--kibana_url', default='https://testresults.opnfv.org/kibana/app/kibana', - help='The url of kibana for javascript inputs') - - parser.add_argument('-u', '--elasticsearch-username', default=None, - help='The username with password for elasticsearch in format username:password') - - args = parser.parse_args() - base_elastic_url = args.elasticsearch_url - generate_inputs = args.generate_js_inputs - input_file_path = args.js_path - kibana_url = args.kibana_url - es_creds = args.elasticsearch_username + base_elastic_url = CONF.elastic_url + generate_inputs = CONF.is_js + input_file_path = CONF.js_path + kibana_url = CONF.kibana_url + es_creds = CONF.elastic_creds dashboards = construct_dashboards() diff --git a/utils/test/scripts/mongo_to_elasticsearch.py b/utils/test/scripts/mongo_to_elasticsearch.py index 3af7c0fa8..777eda6ad 100644 --- a/utils/test/scripts/mongo_to_elasticsearch.py +++ b/utils/test/scripts/mongo_to_elasticsearch.py @@ -10,31 +10,29 @@ import uuid import argparse -import conf_utils import logger_utils import mongo2elastic_format import shared_utils +import testcases_parser +from config import APIConfig logger = logger_utils.KibanaDashboardLogger('mongo2elastic').get -parser = argparse.ArgumentParser(description='Modify and filter mongo json data for elasticsearch') -parser.add_argument('-od', '--output-destination', - default='elasticsearch', - choices=('elasticsearch', 'stdout'), - help='defaults to elasticsearch') - -parser.add_argument('-ml', '--merge-latest', default=0, type=int, metavar='N', +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--config-file", + dest='config_file', + help="Config file location") +parser.add_argument('-ld', '--latest-days', + default=0, + type=int, + metavar='N', help='get entries old at most N days from mongodb and' ' parse those that are not already in elasticsearch.' ' If not present, will get everything from mongodb, which is the default') -parser.add_argument('-e', '--elasticsearch-url', default='http://localhost:9200', - help='the url of elasticsearch, defaults to http://localhost:9200') - -parser.add_argument('-u', '--elasticsearch-username', default=None, - help='The username with password for elasticsearch in format username:password') - args = parser.parse_args() +CONF = APIConfig().parse(args.config_file) + tmp_docs_file = './mongo-{}.json'.format(uuid.uuid4()) @@ -177,8 +175,8 @@ class DocumentsPublisher: self.existed_docs = [] def export(self): - if days > 0: - past_time = datetime.datetime.today() - datetime.timedelta(days=days) + if self.days > 0: + past_time = datetime.datetime.today() - datetime.timedelta(days=self.days) query = '''{{ "project_name": "{}", "case_name": "{}", @@ -203,7 +201,7 @@ class DocumentsPublisher: exit(-1) def get_existed_docs(self): - self.existed_docs = shared_utils.get_elastic_docs_by_days(self.elastic_url, self.creds, days) + self.existed_docs = shared_utils.get_elastic_docs_by_days(self.elastic_url, self.creds, self.days) return self def publish(self): @@ -224,19 +222,19 @@ class DocumentsPublisher: os.remove(tmp_docs_file) -if __name__ == '__main__': - base_elastic_url = urlparse.urljoin(args.elasticsearch_url, '/test_results/mongo2elastic') - to = args.output_destination - days = args.merge_latest - es_creds = args.elasticsearch_username +def main(): + base_elastic_url = urlparse.urljoin(CONF.elastic_url, '/test_results/mongo2elastic') + to = CONF.destination + days = args.latest_days + es_creds = CONF.elastic_creds if to == 'elasticsearch': to = base_elastic_url - for project, case_dicts in conf_utils.testcases_yaml.items(): + for project, case_dicts in testcases_parser.testcases_yaml.items(): for case_dict in case_dicts: case = case_dict.get('name') - fmt = conf_utils.compose_format(case_dict.get('format')) + fmt = testcases_parser.compose_format(case_dict.get('format')) DocumentsPublisher(project, case, fmt, @@ -244,3 +242,7 @@ if __name__ == '__main__': base_elastic_url, es_creds, to).export().get_existed_docs().publish() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/utils/test/scripts/testcases_parser.py b/utils/test/scripts/testcases_parser.py new file mode 100644 index 000000000..cf9599858 --- /dev/null +++ b/utils/test/scripts/testcases_parser.py @@ -0,0 +1,24 @@ +import yaml + + +with open('./testcases.yaml') as f: + testcases_yaml = yaml.safe_load(f) +f.close() + + +def compose_format(fmt): + return 'format_' + fmt.strip() + + +def get_format(project, case): + testcases = testcases_yaml.get(project) + if isinstance(testcases, list): + for case_dict in testcases: + if case_dict['name'] == case: + return compose_format(case_dict['format']) + return None + + +if __name__ == '__main__': + fmt = get_format('functest', 'vping_ssh') + print fmt -- cgit 1.2.3-korg