use configure file rather than arguments to organize the configuration 03/22003/1
authorSerenaFeng <feng.xiaowei@zte.com.cn>
Wed, 21 Sep 2016 06:56:08 +0000 (14:56 +0800)
committerSerenaFeng <feng.xiaowei@zte.com.cn>
Wed, 21 Sep 2016 06:56:08 +0000 (14:56 +0800)
JIRA: FUNCTEST-480

Change-Id: Id5706de5f05d6841a1e9d8bafae7df0255c22a26
Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>
utils/test/scripts/config.ini [new file with mode: 0644]
utils/test/scripts/config.py [new file with mode: 0644]
utils/test/scripts/create_kibana_dashboards.py
utils/test/scripts/mongo_to_elasticsearch.py
utils/test/scripts/testcases_parser.py [moved from utils/test/scripts/conf_utils.py with 100% similarity]

diff --git a/utils/test/scripts/config.ini b/utils/test/scripts/config.ini
new file mode 100644 (file)
index 0000000..63d283d
--- /dev/null
@@ -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 (file)
index 0000000..2d447a7
--- /dev/null
@@ -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)
index efa6e17..19d5b5e 100644 (file)
@@ -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()
 
index 3af7c0f..777eda6 100644 (file)
@@ -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