diff --git a/LCU/Maintenance/MDB_tools/cli/mdb_loader.py b/LCU/Maintenance/MDB_tools/cli/mdb_loader.py index 305bb215d943acbbee07748c69f98c2f6d5bfd3e..1de3ac588e0ae2e6476d6c7d8e9824b8d0c923c6 100644 --- a/LCU/Maintenance/MDB_tools/cli/mdb_loader.py +++ b/LCU/Maintenance/MDB_tools/cli/mdb_loader.py @@ -15,6 +15,7 @@ logger = logging.getLogger('probe_mdb') This program is meant to load the station tests and RTSM present in a certain directory to the database """ + def setup_argument_parser(): parser = argparse.ArgumentParser(prog='probe_mdb') parser.add_argument('path', help='format and path format of the file to load. es. /where/is/stored/*.dat') @@ -63,8 +64,8 @@ def perform_request(args, content): logging.debug('request content %s', json_content) response = requests.post(full_address, data=content) logging.info('response acknowledged: status code is %s, reason %s, content %s', response.status_code, - response.reason, - response.content) + response.reason, + response.content) if response.status_code == 200: return True else: @@ -81,8 +82,8 @@ def create_query_string(args): return query -if __name__=='__main__': - logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.DEBUG) +if __name__ == '__main__': + logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s", level=logging.DEBUG) parser = setup_argument_parser() args = parse_arguments(parser) @@ -93,4 +94,4 @@ if __name__=='__main__': logging.info('file %s processed', filename) else: logging.error('error on file %s', filename) - sys.exit(1) \ No newline at end of file + sys.exit(1) diff --git a/LCU/Maintenance/MDB_tools/cli/probe_mdb.py b/LCU/Maintenance/MDB_tools/cli/probe_mdb.py index feb75b06ac97783d74cfa8d42decb0cc8cad7d9e..f26f218be6f3bb6223e6958ab7a665291df9229b 100644 --- a/LCU/Maintenance/MDB_tools/cli/probe_mdb.py +++ b/LCU/Maintenance/MDB_tools/cli/probe_mdb.py @@ -1,11 +1,11 @@ -import logging import argparse -import requests -import sys import json -from pandas.io.json import json_normalize - +import logging +import sys from datetime import datetime +import pprint +import requests +from pandas.io.json import json_normalize logger = logging.getLogger('probe_mdb') @@ -17,18 +17,17 @@ time and on a certain station name def setup_argument_parser(): parser = argparse.ArgumentParser(prog='probe_mdb') - parser.add_argument('--address', help='address of the server. default [localhost]:8000', default='http://localhost:8000') - parser.add_argument('-s', '--station_test', help='probe station tests', action='store_false') - parser.add_argument('-r', '--rtsm', help='probe rtsm tests', action='store_false') - parser.add_argument('-f', help='tests from date [YYYY-MM-DD]', default=None) - parser.add_argument('-t', help='tests to date [YYYY-MM-DD]', default=None) + parser.add_argument('--address', help='address of the server. default [localhost]:8000', + default='http://localhost:8000') + parser.add_argument('--from_date', help='tests from date [YYYY-MM-DD]', default=None) + parser.add_argument('--to_date', help='tests to date [YYYY-MM-DD]', default=None) parser.add_argument('--station', help='select a specific station. es. CS001C', default=None) - parser.add_argument('--station_type', help='select a specific station type. es. I', choices=['C','R', 'I']) + parser.add_argument('--station_type', help='select a specific station type. es. I', choices=['C', 'R', 'I']) parser.add_argument('--to_csv', help='prints results into a csv file', default=None) - return parser + def parse_arguments(parser): args = parser.parse_args() if args.station_test or args.rtsm: @@ -37,9 +36,14 @@ def parse_arguments(parser): parser.print_help() -def perform_query(args): - address = args.address - full_address = '/'.join([address,create_query_string(args)]) +def perform_query(query_string, address): + """ + Execute the query string to the specified address + :param query_string: the query string to be done + :param address: the address at which it will be done + :return: a list of dicts or an empty list + """ + full_address = '/'.join([address, query_string]) logging.info('performing query %s', full_address) response = requests.get(full_address) logging.info('response acknowledged: status code is %s', response.status_code) @@ -70,46 +74,134 @@ def result_to_pandas(result): return dataframe -def create_query_string(args): +def get_query_string_for_time_limit(from_date, to_date): + """ + Create the query string to query the data in a certain time stamp + + :param from_date: date from which the results are queried + :param to_date: date to which the results are queries + :return: the query string + """ query = '' - if args.station_test: + try: + date = datetime.strptime(from_date, '%Y-%m-%d') + query += '&start_time__year__gte=%d' % (date.year) + query += '&start_time__month__gte=%d' % (date.month) + query += '&start_time__day__gte=%d' % (date.day) + + except ValueError: + logger.error('format of from date not valid; YYYY-MM-DD es. 2016-15-12') + sys.exit(1) + + try: + date = datetime.strptime(to_date, '%Y-%m-%d') + query += '&start_time__year__lte=%d' % (date.year) + query += '&start_time__month__lte=%d' % (date.month) + query += '&start_time__day__lte=%d' % (date.day) + + except ValueError: + logger.error('format of to date not valid; YYYY-MM-DD es. 2016-15-12') + sys.exit(1) + return query + + +def get_query_string_for_type(station_type): + """ + Create the query string to probe a certain station time in the time range [start_time, end_time] + :param station_type: it can be RTSM or STATION_TEST + :param start_time: date from which the results are queried + :param end_time: date to which the results are queried + :return: + """ + query = '' + if station_type == 'RTSM': query += 'rtsm?' - elif args.rtsm: + elif station_type == 'STATION_TEST': query += 'stationtests?' + else: + logger.error('please specify an station_type=[RTSM|STATION_TEST]') + raise ValueError('please specify an station_type=[RTSM|STATION_TEST]') + return query - if args.f: - try: - date = datetime.strptime(args.f, '%Y-%m-%d') - query += '&start_time__year__gte=%d' % (date.year) - query += '&start_time__month__gte=%d' % (date.month) - query += '&start_time__day__gte=%d' % (date.day) - except ValueError: - logger.error('format of from date not valid; YYYY-MM-DD es. 2016-15-12') - sys.exit(1) +def get_query_string_for_station_name(station_name): + """ + Return the query string to filter the results to a specific station name + :param station_name: + :return: + """ + query = '&station_name={}'.format(station_name.strip(' \'\"')) + return query - if args.t: - try: - date = datetime.strptime(args.f, '%Y-%m-%d') - query += '&start_time__year__lte=%d' % (date.year) - query += '&start_time__month__lte=%d' % (date.month) - query += '&start_time__day__lte=%d' % (date.day) - except ValueError: - logger.error('format of to date not valid; YYYY-MM-DD es. 2016-15-12') - sys.exit(1) +class TestType(): + """ + Enum class + """ + + STATION_TEST = 'STATION_TEST' + RTSM = 'RTSM' + + +def query_station_test(address, from_time, to_time, station_name=""): + """ + Queries the station test for a given time span and a station name + """ + query_string = get_query_string_for_type(TestType.STATION_TEST) + + query_string += get_query_string_for_time_limit(from_time, to_time) + if station_name: + query_string += get_query_string_for_station_name(station_name) + + return perform_query(query_string, address) + + +def query_rtsm(address, from_time, to_time, station_name=""): + """ + Queries the station test for a given time span and a station name + """ + query_string = get_query_string_for_type(TestType.RTSM) + + query_string += get_query_string_for_time_limit(from_time, to_time) + if station_name: + query_string += get_query_string_for_station_name(station_name) + + return perform_query(query_string, address) - return query +def print_out_station_test_summary(station_test): + summary_fields = ['station_name', 'station_type', 'start_time', 'end_time', 'performed checks'] -if __name__=='__main__': - logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s",level=logging.DEBUG) + values = [station_test[item] for item in summary_fields] + + for field_name, value in zip(summary_fields, values): + pprint.pprint(" = ".join([field_name, value]), indent=5) + print(field_name, value) + + +def print_out(station_test_results, rtsm_results): + """ + Prints out the formatted station test results and RTSM results + :param station_test_results: + :param rtsm_results: + :return: + """ + for station_test_result in station_test_results: + print_out_station_test_summary(station_test_result) + + +def probe_mdb(): parser = setup_argument_parser() args = parse_arguments(parser) if args is None: sys.exit(1) - result = perform_query(args) - print(result) - pandas_table = result_to_pandas(result) - if args.to_csv: - pandas_table.to_csv(args.to_csv) \ No newline at end of file + + station_test_results = query_station_test(args.address, args.from_date, args.to_date, args.station) + + rtsm_results = query_rtsm(args.address, args.from_date, args.to_date, args.station) + + print_out(station_test_results, rtsm_results) + +if __name__ == '__main__': + logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s", level=logging.DEBUG) + probe_mdb()