From 827c146a67635822a4b0ea3087df3efae0e8237c Mon Sep 17 00:00:00 2001 From: asafc64 Date: Tue, 21 Feb 2017 14:55:06 +0200 Subject: [PATCH 01/14] Update qs_config.ini --- cloudshell/core/logger/qs_config.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudshell/core/logger/qs_config.ini b/cloudshell/core/logger/qs_config.ini index 26135aa..ebd60fd 100644 --- a/cloudshell/core/logger/qs_config.ini +++ b/cloudshell/core/logger/qs_config.ini @@ -1,5 +1,5 @@ [Logging] -LOG_LEVEL='DEBUG' +LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' LOG_PATH='../../Logs' From c95d5a204cab78de405d6ec8ecb7de69a0d0af9a Mon Sep 17 00:00:00 2001 From: asafc64 Date: Tue, 21 Feb 2017 15:03:25 +0200 Subject: [PATCH 02/14] Update qs_logger.py --- cloudshell/core/logger/qs_logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index c9bf424..4bf578d 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -24,7 +24,7 @@ # default settings DEFAULT_FORMAT = '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' DEFAULT_TIME_FORMAT = '%Y%m%d%H%M%S' -DEFAULT_LEVEL = 'DEBUG' +DEFAULT_LEVEL = 'INFO' # DEFAULT_LOG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../', 'Logs') LOG_SECTION = 'Logging' From 5aab1c674d183b77a3b37afdbb3f870aa810bfe3 Mon Sep 17 00:00:00 2001 From: Anthony Piddubny Date: Mon, 3 Apr 2017 17:52:59 +0300 Subject: [PATCH 03/14] change logs default directory --- cloudshell/core/logger/qs_config.ini | 4 +-- cloudshell/core/logger/qs_logger.py | 37 +++++++++++++++----- tests/core/logger/config/test_qs_config.ini | 3 +- tests/core/logger/test_qs_config_parser.py | 3 +- tests/core/logger/test_qs_logger.py | 38 ++++++++++++++++++++- 5 files changed, 71 insertions(+), 14 deletions(-) diff --git a/cloudshell/core/logger/qs_config.ini b/cloudshell/core/logger/qs_config.ini index ebd60fd..814a0af 100644 --- a/cloudshell/core/logger/qs_config.ini +++ b/cloudshell/core/logger/qs_config.ini @@ -2,5 +2,5 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' -LOG_PATH='../../Logs' -#LOG_PATH = 'x:/Logs/' +WINDOWS_LOG_PATH='{APPDATA}\..\qualisystems\logs\commands' +UNIX_LOG_PATH='/var/logs/qualisystems' diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index 4bf578d..627c64c 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -27,6 +27,7 @@ DEFAULT_LEVEL = 'INFO' # DEFAULT_LOG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../', 'Logs') LOG_SECTION = 'Logging' +WINDOWS_OS_FAMILY = "nt" _LOGGER_CONTAINER = {} _LOGGER_LOCK = threading.Lock() @@ -47,9 +48,11 @@ def get_settings(): log_format = QSConfigParser.get_setting(LOG_SECTION, 'LOG_FORMAT') or DEFAULT_FORMAT config['FORMAT'] = log_format - # log_path - log_path = QSConfigParser.get_setting(LOG_SECTION, 'LOG_PATH') - config['LOG_PATH'] = log_path + # UNIX log path + config['UNIX_LOG_PATH'] = QSConfigParser.get_setting(LOG_SECTION, 'UNIX_LOG_PATH') + + # Windows log path + config['WINDOWS_LOG_PATH'] = QSConfigParser.get_setting(LOG_SECTION, 'WINDOWS_LOG_PATH') # Time format time_format = QSConfigParser.get_setting(LOG_SECTION, 'TIME_FORMAT') or DEFAULT_TIME_FORMAT @@ -58,6 +61,25 @@ def get_settings(): return config +def _get_log_path(config): + """Get log path based on the environment variable or Windows/Unix config setting + + :param dict[str] config: + :rtype: str + """ + if 'LOG_PATH' in os.environ: + return os.environ['LOG_PATH'] + + if os.name == WINDOWS_OS_FAMILY: + tpl = config.get('WINDOWS_LOG_PATH') + try: + return tpl.format(**os.environ) + except KeyError: + print "Environment variable is not defined in the template {}".format(tpl) + else: + return config.get('UNIX_LOG_PATH') + + # return accessable log path or None def get_accessible_log_path(reservation_id='Autoload', handler='default'): """Generate log path for the logger and verify that it's accessible using LOG_PATH/reservation_id/handler-%timestamp%.log @@ -66,15 +88,12 @@ def get_accessible_log_path(reservation_id='Autoload', handler='default'): :param handler: handler name for logger :return: generated log path """ - accessible_log_path = None config = get_settings() - if 'LOG_PATH' in os.environ: - log_path = os.environ['LOG_PATH'] - elif 'LOG_PATH' in config and config['LOG_PATH']: - log_path = config['LOG_PATH'] - else: + log_path = _get_log_path(config) + + if not log_path: return None if log_path.startswith('..'): diff --git a/tests/core/logger/config/test_qs_config.ini b/tests/core/logger/config/test_qs_config.ini index f2a0b76..814a0af 100644 --- a/tests/core/logger/config/test_qs_config.ini +++ b/tests/core/logger/config/test_qs_config.ini @@ -2,4 +2,5 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' -LOG_PATH='../../Logs' +WINDOWS_LOG_PATH='{APPDATA}\..\qualisystems\logs\commands' +UNIX_LOG_PATH='/var/logs/qualisystems' diff --git a/tests/core/logger/test_qs_config_parser.py b/tests/core/logger/test_qs_config_parser.py index b6d3d04..197b1de 100644 --- a/tests/core/logger/test_qs_config_parser.py +++ b/tests/core/logger/test_qs_config_parser.py @@ -14,7 +14,8 @@ class TestQSConfigParser(TestCase): exp_response = {'Logging': {'time_format': '%d-%b-%Y--%H-%M-%S', - 'log_path': '../../Logs', + 'windows_log_path': r'{APPDATA}\..\qualisystems\logs\commands', + 'unix_log_path': '/var/logs/qualisystems', 'log_format': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s', 'log_level': 'INFO'}} diff --git a/tests/core/logger/test_qs_logger.py b/tests/core/logger/test_qs_logger.py index 669fc61..fbb8449 100644 --- a/tests/core/logger/test_qs_logger.py +++ b/tests/core/logger/test_qs_logger.py @@ -10,6 +10,7 @@ import shutil from mock import MagicMock +import mock from unittest import TestCase from cloudshell.core.logger import qs_logger @@ -66,13 +67,48 @@ def tearDown(self): def test_get_settings(self): """ Test suite for get_settings method """ - exp_response = {'LOG_PATH': '../../Logs', + exp_response = {'WINDOWS_LOG_PATH': r'{APPDATA}\..\qualisystems\logs\commands', + 'UNIX_LOG_PATH': '/var/logs/qualisystems', 'TIME_FORMAT': '%d-%b-%Y--%H-%M-%S', 'LOG_LEVEL': 'INFO', 'FORMAT': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s'} self.assertEqual(qs_logger.get_settings(), exp_response) + @mock.patch("cloudshell.core.logger.qs_logger.os") + def test_get_log_path_from_environment_variable(self, os): + """Check that method will primarily return log path from the environment variable if such exists""" + config = {} + expected_path = MagicMock() + os.environ = {'LOG_PATH': expected_path} + # act + result = qs_logger._get_log_path(config=config) + # verify + self.assertEqual(result, expected_path) + + @mock.patch("cloudshell.core.logger.qs_logger.os") + def test_get_log_path_for_windows_os(self, os): + """Check that method will return windows log path setting with substituted environment variables""" + os.name = qs_logger.WINDOWS_OS_FAMILY + os.environ = {"SOME_EN_VARIABLE": "C:\\some_path"} + expected_path = "{SOME_EN_VARIABLE}\\qualisystems\\logs\\commands" + config = {"WINDOWS_LOG_PATH": expected_path} + # act + result = qs_logger._get_log_path(config=config) + # verify + self.assertEqual(result, "C:\\some_path\\qualisystems\\logs\\commands") + + @mock.patch("cloudshell.core.logger.qs_logger.os") + def test_get_log_path_for_unix_os(self, os): + """Check that method will return unix log path setting for posix OS""" + os.name = "posix" + expected_path = MagicMock() + config = {"UNIX_LOG_PATH": expected_path} + # act + result = qs_logger._get_log_path(config=config) + # verify + self.assertEqual(result, expected_path) + def test_get_accessible_log_path_default_params(self): """ Test suite for get_accessible_log_path method """ From 067f800112f8d780bc81c5fa725c0126fb9136e9 Mon Sep 17 00:00:00 2001 From: Anthony Piddubny Date: Tue, 4 Apr 2017 11:49:57 +0300 Subject: [PATCH 04/14] change logs location from AppData to ProgramData --- cloudshell/core/logger/qs_config.ini | 3 +- cloudshell/core/logger/qs_logger.py | 73 +++++++++++++-------- tests/core/logger/config/test_qs_config.ini | 1 + tests/core/logger/test_qs_config_parser.py | 1 + tests/core/logger/test_qs_logger.py | 13 ++-- 5 files changed, 57 insertions(+), 34 deletions(-) diff --git a/cloudshell/core/logger/qs_config.ini b/cloudshell/core/logger/qs_config.ini index 814a0af..4c3e4f1 100644 --- a/cloudshell/core/logger/qs_config.ini +++ b/cloudshell/core/logger/qs_config.ini @@ -2,5 +2,6 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' -WINDOWS_LOG_PATH='{APPDATA}\..\qualisystems\logs\commands' +WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\Logs\Commands' UNIX_LOG_PATH='/var/logs/qualisystems' +DEFAULT_LOG_PATH='../../Logs' diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index 627c64c..6601b6e 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -54,6 +54,9 @@ def get_settings(): # Windows log path config['WINDOWS_LOG_PATH'] = QSConfigParser.get_setting(LOG_SECTION, 'WINDOWS_LOG_PATH') + # Default log path for all systems + config['DEFAULT_LOG_PATH'] = QSConfigParser.get_setting(LOG_SECTION, 'DEFAULT_LOG_PATH') + # Time format time_format = QSConfigParser.get_setting(LOG_SECTION, 'TIME_FORMAT') or DEFAULT_TIME_FORMAT config['TIME_FORMAT'] = time_format @@ -61,7 +64,7 @@ def get_settings(): return config -def _get_log_path(config): +def _get_log_path_config(config): """Get log path based on the environment variable or Windows/Unix config setting :param dict[str] config: @@ -71,53 +74,69 @@ def _get_log_path(config): return os.environ['LOG_PATH'] if os.name == WINDOWS_OS_FAMILY: - tpl = config.get('WINDOWS_LOG_PATH') - try: - return tpl.format(**os.environ) - except KeyError: - print "Environment variable is not defined in the template {}".format(tpl) + if 'WINDOWS_LOG_PATH' in config: + tpl = config['WINDOWS_LOG_PATH'] + try: + return tpl.format(**os.environ) + except KeyError: + print "Environment variable is not defined in the template {}".format(tpl) else: return config.get('UNIX_LOG_PATH') -# return accessable log path or None -def get_accessible_log_path(reservation_id='Autoload', handler='default'): - """Generate log path for the logger and verify that it's accessible using LOG_PATH/reservation_id/handler-%timestamp%.log +def _prepare_log_path(log_path, reservation_id, log_file_name): + """Create logs directory if needed and return full path to the log file - :param reservation_id: part of log path - :param handler: handler name for logger - :return: generated log path + :param str log_path: + :param str reservation_id: + :param str log_file_name: + :rtype: str """ - accessible_log_path = None - config = get_settings() - - log_path = _get_log_path(config) - - if not log_path: - return None - if log_path.startswith('..'): log_path = os.path.join(os.path.dirname(__file__), log_path) - time_format = config['TIME_FORMAT'] or DEFAULT_TIME_FORMAT - - log_file_name = '{0}--{1}.log'.format(handler, datetime.now().strftime(time_format)) log_path = os.path.join(log_path, reservation_id) - log_file = os.path.join(log_path, log_file_name) # print(log_file) if os.path.isdir(log_path): if os.access(log_path, os.W_OK): - accessible_log_path = log_file + return log_file else: try: os.makedirs(log_path) - accessible_log_path = log_file + return log_file except: pass - return accessible_log_path + +# return accessable log path or None +def get_accessible_log_path(reservation_id='Autoload', handler='default'): + """Generate log path for the logger and verify that it's accessible using LOG_PATH/reservation_id/handler-%timestamp%.log + + :param reservation_id: part of log path + :param handler: handler name for logger + :return: generated log path + """ + config = get_settings() + time_format = config['TIME_FORMAT'] or DEFAULT_TIME_FORMAT + log_file_name = '{0}--{1}.log'.format(handler, datetime.now().strftime(time_format)) + + log_path = _get_log_path_config(config) + + if log_path: + path = _prepare_log_path(log_path=log_path, + reservation_id=reservation_id, + log_file_name=log_file_name) + if path: + return path + + default_log_path = config.get('DEFAULT_LOG_PATH') + + if default_log_path: + return _prepare_log_path(log_path=default_log_path, + reservation_id=reservation_id, + log_file_name=log_file_name) def log_execution_info(logger_hdlr, exec_info): diff --git a/tests/core/logger/config/test_qs_config.ini b/tests/core/logger/config/test_qs_config.ini index 814a0af..52b6ead 100644 --- a/tests/core/logger/config/test_qs_config.ini +++ b/tests/core/logger/config/test_qs_config.ini @@ -4,3 +4,4 @@ LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' WINDOWS_LOG_PATH='{APPDATA}\..\qualisystems\logs\commands' UNIX_LOG_PATH='/var/logs/qualisystems' +DEFAULT_LOG_PATH='../../Logs' diff --git a/tests/core/logger/test_qs_config_parser.py b/tests/core/logger/test_qs_config_parser.py index 197b1de..e913302 100644 --- a/tests/core/logger/test_qs_config_parser.py +++ b/tests/core/logger/test_qs_config_parser.py @@ -16,6 +16,7 @@ class TestQSConfigParser(TestCase): {'time_format': '%d-%b-%Y--%H-%M-%S', 'windows_log_path': r'{APPDATA}\..\qualisystems\logs\commands', 'unix_log_path': '/var/logs/qualisystems', + 'default_log_path': '../../Logs', 'log_format': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s', 'log_level': 'INFO'}} diff --git a/tests/core/logger/test_qs_logger.py b/tests/core/logger/test_qs_logger.py index fbb8449..fa81771 100644 --- a/tests/core/logger/test_qs_logger.py +++ b/tests/core/logger/test_qs_logger.py @@ -69,6 +69,7 @@ def test_get_settings(self): """ Test suite for get_settings method """ exp_response = {'WINDOWS_LOG_PATH': r'{APPDATA}\..\qualisystems\logs\commands', 'UNIX_LOG_PATH': '/var/logs/qualisystems', + 'DEFAULT_LOG_PATH': '../../Logs', 'TIME_FORMAT': '%d-%b-%Y--%H-%M-%S', 'LOG_LEVEL': 'INFO', 'FORMAT': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s'} @@ -76,36 +77,36 @@ def test_get_settings(self): self.assertEqual(qs_logger.get_settings(), exp_response) @mock.patch("cloudshell.core.logger.qs_logger.os") - def test_get_log_path_from_environment_variable(self, os): + def test_get_log_path_config_from_environment_variable(self, os): """Check that method will primarily return log path from the environment variable if such exists""" config = {} expected_path = MagicMock() os.environ = {'LOG_PATH': expected_path} # act - result = qs_logger._get_log_path(config=config) + result = qs_logger._get_log_path_config(config=config) # verify self.assertEqual(result, expected_path) @mock.patch("cloudshell.core.logger.qs_logger.os") - def test_get_log_path_for_windows_os(self, os): + def test_get_log_path_config_for_windows_os(self, os): """Check that method will return windows log path setting with substituted environment variables""" os.name = qs_logger.WINDOWS_OS_FAMILY os.environ = {"SOME_EN_VARIABLE": "C:\\some_path"} expected_path = "{SOME_EN_VARIABLE}\\qualisystems\\logs\\commands" config = {"WINDOWS_LOG_PATH": expected_path} # act - result = qs_logger._get_log_path(config=config) + result = qs_logger._get_log_path_config(config=config) # verify self.assertEqual(result, "C:\\some_path\\qualisystems\\logs\\commands") @mock.patch("cloudshell.core.logger.qs_logger.os") - def test_get_log_path_for_unix_os(self, os): + def test_get_log_path_config_for_unix_os(self, os): """Check that method will return unix log path setting for posix OS""" os.name = "posix" expected_path = MagicMock() config = {"UNIX_LOG_PATH": expected_path} # act - result = qs_logger._get_log_path(config=config) + result = qs_logger._get_log_path_config(config=config) # verify self.assertEqual(result, expected_path) From 999db62405f2233550298613304167ed3db19969 Mon Sep 17 00:00:00 2001 From: Anthony Piddubny Date: Tue, 4 Apr 2017 15:23:38 +0300 Subject: [PATCH 05/14] add directory with a shell name to the logs path --- cloudshell/core/logger/qs_config.ini | 2 +- cloudshell/core/logger/qs_logger.py | 10 +++++----- tests/core/logger/config/test_qs_config.ini | 2 +- tests/core/logger/test_qs_config_parser.py | 2 +- tests/core/logger/test_qs_logger.py | 9 ++++----- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/cloudshell/core/logger/qs_config.ini b/cloudshell/core/logger/qs_config.ini index 4c3e4f1..62d6f1d 100644 --- a/cloudshell/core/logger/qs_config.ini +++ b/cloudshell/core/logger/qs_config.ini @@ -2,6 +2,6 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' -WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\Logs\Commands' +WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\logs' UNIX_LOG_PATH='/var/logs/qualisystems' DEFAULT_LOG_PATH='../../Logs' diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index 6601b6e..b222e74 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -84,18 +84,16 @@ def _get_log_path_config(config): return config.get('UNIX_LOG_PATH') -def _prepare_log_path(log_path, reservation_id, log_file_name): +def _prepare_log_path(log_path, log_file_name): """Create logs directory if needed and return full path to the log file :param str log_path: - :param str reservation_id: :param str log_file_name: :rtype: str """ if log_path.startswith('..'): log_path = os.path.join(os.path.dirname(__file__), log_path) - log_path = os.path.join(log_path, reservation_id) log_file = os.path.join(log_path, log_file_name) # print(log_file) @@ -125,8 +123,10 @@ def get_accessible_log_path(reservation_id='Autoload', handler='default'): log_path = _get_log_path_config(config) if log_path: + env_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "..", "..", "..") + shell_name = os.path.basename(os.path.abspath(env_folder)) + log_path = os.path.join(log_path, reservation_id, shell_name) path = _prepare_log_path(log_path=log_path, - reservation_id=reservation_id, log_file_name=log_file_name) if path: return path @@ -134,8 +134,8 @@ def get_accessible_log_path(reservation_id='Autoload', handler='default'): default_log_path = config.get('DEFAULT_LOG_PATH') if default_log_path: + default_log_path = os.path.join(log_path, reservation_id) return _prepare_log_path(log_path=default_log_path, - reservation_id=reservation_id, log_file_name=log_file_name) diff --git a/tests/core/logger/config/test_qs_config.ini b/tests/core/logger/config/test_qs_config.ini index 52b6ead..62d6f1d 100644 --- a/tests/core/logger/config/test_qs_config.ini +++ b/tests/core/logger/config/test_qs_config.ini @@ -2,6 +2,6 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' -WINDOWS_LOG_PATH='{APPDATA}\..\qualisystems\logs\commands' +WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\logs' UNIX_LOG_PATH='/var/logs/qualisystems' DEFAULT_LOG_PATH='../../Logs' diff --git a/tests/core/logger/test_qs_config_parser.py b/tests/core/logger/test_qs_config_parser.py index e913302..9068dfc 100644 --- a/tests/core/logger/test_qs_config_parser.py +++ b/tests/core/logger/test_qs_config_parser.py @@ -14,7 +14,7 @@ class TestQSConfigParser(TestCase): exp_response = {'Logging': {'time_format': '%d-%b-%Y--%H-%M-%S', - 'windows_log_path': r'{APPDATA}\..\qualisystems\logs\commands', + 'windows_log_path': r'{ALLUSERSPROFILE}\QualiSystems\logs', 'unix_log_path': '/var/logs/qualisystems', 'default_log_path': '../../Logs', 'log_format': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s', diff --git a/tests/core/logger/test_qs_logger.py b/tests/core/logger/test_qs_logger.py index fa81771..5bcc193 100644 --- a/tests/core/logger/test_qs_logger.py +++ b/tests/core/logger/test_qs_logger.py @@ -67,7 +67,7 @@ def tearDown(self): def test_get_settings(self): """ Test suite for get_settings method """ - exp_response = {'WINDOWS_LOG_PATH': r'{APPDATA}\..\qualisystems\logs\commands', + exp_response = {'WINDOWS_LOG_PATH': r'{ALLUSERSPROFILE}\QualiSystems\logs', 'UNIX_LOG_PATH': '/var/logs/qualisystems', 'DEFAULT_LOG_PATH': '../../Logs', 'TIME_FORMAT': '%d-%b-%Y--%H-%M-%S', @@ -112,9 +112,8 @@ def test_get_log_path_config_for_unix_os(self, os): def test_get_accessible_log_path_default_params(self): """ Test suite for get_accessible_log_path method """ - path = qs_logger.get_accessible_log_path() - self.assertTrue(re.search(r"Logs[\\/]Autoload[\\/]default--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log", path)) + self.assertRegexpMatches(path, r"Logs[\\/]Autoload[\\/].*[\\/]default--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log") self.assertTrue(os.path.dirname(path)) def test_get_accessible_log_path_path_creation(self): @@ -125,9 +124,9 @@ def test_get_accessible_log_path_path_creation(self): def test_get_accessible_log_path(self): """ Test suite for get_accessible_log_path method """ - path = qs_logger.get_accessible_log_path(qs_logger.get_accessible_log_path("reservation_id", "handler_name")) - self.assertTrue(re.search(r"Logs[\\/]reservation_id[\\/]handler_name--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log", path)) + self.assertRegexpMatches(path, r"Logs[\\/]reservation_id[\\/].*[\\/]" + r"handler_name--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log") def test_get_accessible_log_path_log_path_setting_missing(self): """ Test suite for get_accessible_log_path method """ From fbe2d59f02eb3bead3b60e584521b92a5b4ee30b Mon Sep 17 00:00:00 2001 From: CoYe Date: Wed, 17 May 2017 19:33:41 +0300 Subject: [PATCH 06/14] small fix for logger, fixed logger unit tests, and path on Linux --- cloudshell/core/logger/qs_config.ini | 2 +- cloudshell/core/logger/qs_logger.py | 8 ++++---- tests/core/logger/config/test_qs_config.ini | 2 +- tests/core/logger/test_qs_config_parser.py | 2 +- tests/core/logger/test_qs_logger.py | 8 ++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cloudshell/core/logger/qs_config.ini b/cloudshell/core/logger/qs_config.ini index 62d6f1d..0366ec8 100644 --- a/cloudshell/core/logger/qs_config.ini +++ b/cloudshell/core/logger/qs_config.ini @@ -3,5 +3,5 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\logs' -UNIX_LOG_PATH='/var/logs/qualisystems' +UNIX_LOG_PATH='/var/log/qualisystems' DEFAULT_LOG_PATH='../../Logs' diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index b222e74..53da8ca 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -74,8 +74,8 @@ def _get_log_path_config(config): return os.environ['LOG_PATH'] if os.name == WINDOWS_OS_FAMILY: - if 'WINDOWS_LOG_PATH' in config: - tpl = config['WINDOWS_LOG_PATH'] + tpl = config.get('WINDOWS_LOG_PATH') + if tpl: try: return tpl.format(**os.environ) except KeyError: @@ -134,7 +134,7 @@ def get_accessible_log_path(reservation_id='Autoload', handler='default'): default_log_path = config.get('DEFAULT_LOG_PATH') if default_log_path: - default_log_path = os.path.join(log_path, reservation_id) + default_log_path = os.path.join(default_log_path, reservation_id) return _prepare_log_path(log_path=default_log_path, log_file_name=log_file_name) @@ -151,7 +151,7 @@ def log_execution_info(logger_hdlr, exec_info): logger_hdlr.info('-----------------------------------------------------------\n') -def get_qs_logger(log_group='Ungrouped', log_category ='QS', log_file_prefix='QS'): +def get_qs_logger(log_group='Ungrouped', log_category='QS', log_file_prefix='QS'): """Create cloudshell specific singleton logger :param log_group: This folder will be grouped under this name. The default implementation of the group is a folder diff --git a/tests/core/logger/config/test_qs_config.ini b/tests/core/logger/config/test_qs_config.ini index 62d6f1d..0366ec8 100644 --- a/tests/core/logger/config/test_qs_config.ini +++ b/tests/core/logger/config/test_qs_config.ini @@ -3,5 +3,5 @@ LOG_LEVEL='INFO' LOG_FORMAT= '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s' TIME_FORMAT= '%d-%b-%Y--%H-%M-%S' WINDOWS_LOG_PATH='{ALLUSERSPROFILE}\QualiSystems\logs' -UNIX_LOG_PATH='/var/logs/qualisystems' +UNIX_LOG_PATH='/var/log/qualisystems' DEFAULT_LOG_PATH='../../Logs' diff --git a/tests/core/logger/test_qs_config_parser.py b/tests/core/logger/test_qs_config_parser.py index 9068dfc..965c097 100644 --- a/tests/core/logger/test_qs_config_parser.py +++ b/tests/core/logger/test_qs_config_parser.py @@ -15,7 +15,7 @@ class TestQSConfigParser(TestCase): exp_response = {'Logging': {'time_format': '%d-%b-%Y--%H-%M-%S', 'windows_log_path': r'{ALLUSERSPROFILE}\QualiSystems\logs', - 'unix_log_path': '/var/logs/qualisystems', + 'unix_log_path': '/var/log/qualisystems', 'default_log_path': '../../Logs', 'log_format': '%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s', 'log_level': 'INFO'}} diff --git a/tests/core/logger/test_qs_logger.py b/tests/core/logger/test_qs_logger.py index 5bcc193..05586c7 100644 --- a/tests/core/logger/test_qs_logger.py +++ b/tests/core/logger/test_qs_logger.py @@ -68,7 +68,7 @@ def tearDown(self): def test_get_settings(self): """ Test suite for get_settings method """ exp_response = {'WINDOWS_LOG_PATH': r'{ALLUSERSPROFILE}\QualiSystems\logs', - 'UNIX_LOG_PATH': '/var/logs/qualisystems', + 'UNIX_LOG_PATH': '/var/log/qualisystems', 'DEFAULT_LOG_PATH': '../../Logs', 'TIME_FORMAT': '%d-%b-%Y--%H-%M-%S', 'LOG_LEVEL': 'INFO', @@ -113,7 +113,7 @@ def test_get_log_path_config_for_unix_os(self, os): def test_get_accessible_log_path_default_params(self): """ Test suite for get_accessible_log_path method """ path = qs_logger.get_accessible_log_path() - self.assertRegexpMatches(path, r"Logs[\\/]Autoload[\\/].*[\\/]default--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log") + self.assertRegexpMatches(path, r"Logs[\\/]Autoload[\\/](.*[\\/])?default--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log") self.assertTrue(os.path.dirname(path)) def test_get_accessible_log_path_path_creation(self): @@ -124,8 +124,8 @@ def test_get_accessible_log_path_path_creation(self): def test_get_accessible_log_path(self): """ Test suite for get_accessible_log_path method """ - path = qs_logger.get_accessible_log_path(qs_logger.get_accessible_log_path("reservation_id", "handler_name")) - self.assertRegexpMatches(path, r"Logs[\\/]reservation_id[\\/].*[\\/]" + path = qs_logger.get_accessible_log_path("reservation_id", "handler_name") + self.assertRegexpMatches(path, r"Logs[\\/]reservation_id[\\/](.*[\\/])?" r"handler_name--\d{2}-\w+-\d{4}--\d{2}-\d{2}-\d{2}\.log") def test_get_accessible_log_path_log_path_setting_missing(self): From 28db5637ed42091859396ad5917cdb432e97576f Mon Sep 17 00:00:00 2001 From: Constantine Yevdyukhin Date: Thu, 1 Nov 2018 13:24:12 +0200 Subject: [PATCH 07/14] Update version.txt --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7f20734..c1bdbdd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.1 \ No newline at end of file +2.2.180 From 40a6ee8e2c614522fba532f1843020eda5b6bfe3 Mon Sep 17 00:00:00 2001 From: Tomer Admon Date: Thu, 14 Feb 2019 13:56:33 +0200 Subject: [PATCH 08/14] support both python 3 & 2 --- cloudshell/core/logger/qs_config_parser.py | 7 ++++++- cloudshell/core/logger/qs_logger.py | 13 +++++++------ setup.py | 3 +++ tests/core/logger/test_qs_logger.py | 12 +++++++++--- version.txt | 2 +- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/cloudshell/core/logger/qs_config_parser.py b/cloudshell/core/logger/qs_config_parser.py index d9b21a1..9c520d6 100644 --- a/cloudshell/core/logger/qs_config_parser.py +++ b/cloudshell/core/logger/qs_config_parser.py @@ -1,11 +1,16 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -import ConfigParser import os +import sys DEFAULT_CONFIG_PATH = 'qs_config.ini' +if (sys.version_info >= (3,0)): + import configparser as ConfigParser +else: + import ConfigParser + class QSConfigParser: _configDict = None diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index 53da8ca..caadbb9 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -5,6 +5,7 @@ from logging import StreamHandler import threading import traceback +from builtins import str import os import re @@ -79,7 +80,7 @@ def _get_log_path_config(config): try: return tpl.format(**os.environ) except KeyError: - print "Environment variable is not defined in the template {}".format(tpl) + print ("Environment variable is not defined in the template {}".format(tpl)) else: return config.get('UNIX_LOG_PATH') @@ -279,7 +280,7 @@ def normalize_buffer(input_buffer): result_buffer = '' - if not isinstance(input_buffer, basestring): + if not isinstance(input_buffer, str): input_buffer = str(input_buffer) match_iter = color_pattern.finditer(input_buffer) @@ -320,10 +321,10 @@ def format(self, record): s = logging.Formatter.format(self, record) header, footer = s.rsplit(record.message, self.MAX_SPLIT) s = s.replace('\n', '\n' + header) - except Exception, e: - print traceback.format_exc() - print 'logger.format: Unexpected error: ' + str(e) - print 'record = {}<<<'.format(traceback.format_exc()) + except Exception as e: + print (traceback.format_exc()) + print ('logger.format: Unexpected error: ' + str(e)) + print ('record = {}<<<'.format(traceback.format_exc())) return s diff --git a/setup.py b/setup.py index e161cd0..216b680 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,5 @@ +import sys + from setuptools import setup, find_packages import os @@ -27,6 +29,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.0", "Topic :: Software Development :: Libraries", "License :: OSI Approved :: Apache Software License", ] diff --git a/tests/core/logger/test_qs_logger.py b/tests/core/logger/test_qs_logger.py index 05586c7..349cf26 100644 --- a/tests/core/logger/test_qs_logger.py +++ b/tests/core/logger/test_qs_logger.py @@ -8,10 +8,16 @@ import os import re import shutil +import sys + +if (sys.version_info >= (3,0)): + from unittest.mock import MagicMock + from unittest import TestCase, mock +else: + from mock import MagicMock + import mock + from unittest import TestCase -from mock import MagicMock -import mock -from unittest import TestCase from cloudshell.core.logger import qs_logger from cloudshell.core.logger.interprocess_logger import MultiProcessingLog diff --git a/version.txt b/version.txt index c1bdbdd..66a6a14 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.2.180 +3.0.001 \ No newline at end of file From 9bed501ba985bcc01c84208eb78a475124d5a11b Mon Sep 17 00:00:00 2001 From: Tomer Admon Date: Thu, 14 Feb 2019 14:09:29 +0200 Subject: [PATCH 09/14] from builtins import str ImportError: No module named builtins --- cloudshell/core/logger/qs_logger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cloudshell/core/logger/qs_logger.py b/cloudshell/core/logger/qs_logger.py index caadbb9..e3b6ad6 100644 --- a/cloudshell/core/logger/qs_logger.py +++ b/cloudshell/core/logger/qs_logger.py @@ -5,7 +5,6 @@ from logging import StreamHandler import threading import traceback -from builtins import str import os import re From bd500a998183c2a90c68bf4e93cedd5af403d693 Mon Sep 17 00:00:00 2001 From: Tomer Admon Date: Tue, 19 Feb 2019 09:33:57 +0200 Subject: [PATCH 10/14] Update .travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index beb708d..7f531db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: python python: - '2.7' +- '3.6' before_install: - pip install -r test_requirements.txt -i https://testpypi.python.org/pypi @@ -18,4 +19,4 @@ script: - pip install cloudshell-core -f dist after_success: - - coveralls \ No newline at end of file + - coveralls From f692b32089e0d51beee70c281a5a9f6fd7dab4fe Mon Sep 17 00:00:00 2001 From: Tomer Admon Date: Tue, 19 Feb 2019 09:37:20 +0200 Subject: [PATCH 11/14] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7f531db..fed365f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - '2.7' -- '3.6' +- '3.7' before_install: - pip install -r test_requirements.txt -i https://testpypi.python.org/pypi From b097a2600a65d557a1b86db70911989cd98a528c Mon Sep 17 00:00:00 2001 From: Tomer Admon Date: Tue, 19 Feb 2019 09:42:04 +0200 Subject: [PATCH 12/14] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fed365f..7f531db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - '2.7' -- '3.7' +- '3.6' before_install: - pip install -r test_requirements.txt -i https://testpypi.python.org/pypi From 2382cdc717ae2eac767775e51bbc69cb0f8629d6 Mon Sep 17 00:00:00 2001 From: Kyrylo Maksymenko Date: Wed, 10 Jul 2019 10:59:26 +0300 Subject: [PATCH 13/14] install mock on python2 --- test_requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test_requirements.txt b/test_requirements.txt index e69de29..db10e58 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -0,0 +1 @@ +mock; python_version <= '2.7' \ No newline at end of file From a180ad5a9bfb96a8870716f1421bc2e164d07cb1 Mon Sep 17 00:00:00 2001 From: Kyrylo Maksymenko Date: Wed, 10 Jul 2019 11:04:33 +0300 Subject: [PATCH 14/14] waffle don't work anymore --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 0731bdf..b43da2e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Coverage Status](https://coveralls.io/repos/github/QualiSystems/cloudshell-core/badge.svg?branch=dev)](https://coveralls.io/github/QualiSystems/cloudshell-core?branch=dev) [![PyPI version](https://badge.fury.io/py/cloudshell-core.svg)](https://badge.fury.io/py/cloudshell-core) [![Dependency Status](https://dependencyci.com/github/QualiSystems/cloudshell-core/badge)](https://dependencyci.com/github/QualiSystems/cloudshell-core) -[![Stories in Ready](https://badge.waffle.io/QualiSystems/cloudshell-core.svg?label=ready&title=Ready)](http://waffle.io/QualiSystems/cloudshell-core)