From e23dd6de5854fcc8ff76fe1b51eb46162770d9cc Mon Sep 17 00:00:00 2001 From: Daisuke Fujita Date: Fri, 29 May 2015 20:39:24 +0900 Subject: Set up every time record log in file This will allow users to record logs of all their commands into a predefined log file, in clouds.yaml. The log should have a format similar to that of oslo.log. Change-Id: I1b334bf429d575fc25809c9706fc0b11116be3f1 Implements: blueprint every-time-record-log-in-file --- openstackclient/tests/common/test_context.py | 102 +++++++++++++++++++++++++++ openstackclient/tests/test_shell.py | 96 +++++++++++++++++++++++-- 2 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 openstackclient/tests/common/test_context.py (limited to 'openstackclient/tests') diff --git a/openstackclient/tests/common/test_context.py b/openstackclient/tests/common/test_context.py new file mode 100644 index 00000000..145546a3 --- /dev/null +++ b/openstackclient/tests/common/test_context.py @@ -0,0 +1,102 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +import logging +import mock +import os + +from openstackclient.common import context +from openstackclient.tests import utils + + +class TestContext(utils.TestCase): + + TEST_LOG_FILE = "/tmp/test_log_file" + + def setUp(self): + super(TestContext, self).setUp() + + def tearDown(self): + super(TestContext, self).tearDown() + if os.path.exists(self.TEST_LOG_FILE): + os.remove(self.TEST_LOG_FILE) + + def setup_handler_logging_level(self): + handler_type = logging.FileHandler + handler = logging.FileHandler(filename=self.TEST_LOG_FILE) + handler.setLevel(logging.ERROR) + logging.getLogger('').addHandler(handler) + context.setup_handler_logging_level(handler_type, logging.INFO) + self.log.info("test log") + ld = open(self.TEST_LOG_FILE) + line = ld.readlines() + ld.close() + if os.path.exists(self.TEST_LOG_FILE): + os.remove(self.TEST_LOG_FILE) + self.assertGreaterEqual(line.find("test log"), 0) + + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_setup_logging(self, setuph): + setuph.return_value = mock.MagicMock() + shell = mock.MagicMock() + cloud_config = mock.MagicMock() + cloud_config.auth = { + 'project_name': 'heart-o-gold', + 'username': 'zaphod' + } + cloud_config.config = { + 'log_level': 'debug', + 'log_file': self.TEST_LOG_FILE, + 'cloud': 'megadodo' + } + context.setup_logging(shell, cloud_config) + self.assertEqual(True, shell.enable_operation_logging) + + +class Test_LogContext(utils.TestCase): + def setUp(self): + super(Test_LogContext, self).setUp() + + def test_context(self): + ctx = context._LogContext() + self.assertTrue(ctx) + + def test_context_to_dict(self): + ctx = context._LogContext('cloudsName', 'projectName', 'userNmae') + ctx_dict = ctx.to_dict() + self.assertEqual('cloudsName', ctx_dict['clouds_name']) + self.assertEqual('projectName', ctx_dict['project_name']) + self.assertEqual('userNmae', ctx_dict['username']) + + +class Test_LogContextFormatter(utils.TestCase): + def setUp(self): + super(Test_LogContextFormatter, self).setUp() + self.ctx = context._LogContext('cloudsName', 'projectName', 'userNmae') + self.addfmt = "%(clouds_name)s %(project_name)s %(username)s" + + def test_contextrrormatter(self): + ctxfmt = context._LogContextFormatter() + self.assertTrue(ctxfmt) + + def test_context_format(self): + record = mock.MagicMock() + logging.Formatter.format = mock.MagicMock() + logging.Formatter.format.return_value = record + + ctxfmt = context._LogContextFormatter(context=self.ctx, + fmt=self.addfmt) + addctx = ctxfmt.format(record) + self.assertEqual('cloudsName', addctx.clouds_name) + self.assertEqual('projectName', addctx.project_name) + self.assertEqual('userNmae', addctx.username) diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py index e2f0580b..5b844753 100644 --- a/openstackclient/tests/test_shell.py +++ b/openstackclient/tests/test_shell.py @@ -77,6 +77,8 @@ CLOUD_2 = { 'username': 'zaphod', }, 'region_name': 'occ-cloud', + 'log_file': '/tmp/test_log_file', + 'log_level': 'debug', } } } @@ -621,9 +623,12 @@ class TestShellCli(TestShell): @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") - def test_shell_args_cloud_public(self, config_mock, public_mock): + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_cloud_public(self, setup_handler, config_mock, + public_mock): config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) public_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() _shell = make_shell() fake_execute( @@ -661,9 +666,12 @@ class TestShellCli(TestShell): @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") - def test_shell_args_precedence(self, config_mock, vendor_mock): + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_precedence(self, setup_handler, config_mock, + vendor_mock): config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() _shell = make_shell() # Test command option overriding config file value @@ -715,9 +723,12 @@ class TestShellCliEnv(TestShell): @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") - def test_shell_args_precedence_1(self, config_mock, vendor_mock): + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_precedence_1(self, setup_handler, config_mock, + vendor_mock): config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() _shell = make_shell() # Test env var @@ -756,9 +767,12 @@ class TestShellCliEnv(TestShell): @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") - def test_shell_args_precedence_2(self, config_mock, vendor_mock): + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_precedence_2(self, setup_handler, config_mock, + vendor_mock): config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() _shell = make_shell() # Test command option overriding config file value @@ -796,3 +810,77 @@ class TestShellCliEnv(TestShell): 'krikkit', _shell.cloud.config['region_name'], ) + + +class TestShellCliLogging(TestShell): + def setUp(self): + super(TestShellCliLogging, self).setUp() + + def tearDown(self): + super(TestShellCliLogging, self).tearDown() + + @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") + @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_precedence_1(self, setup_handler, config_mock, + vendor_mock): + config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) + vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() + _shell = make_shell() + + # These come from clouds.yaml + fake_execute( + _shell, + "--os-cloud megacloud list user", + ) + self.assertEqual( + 'megacloud', + _shell.cloud.name, + ) + + self.assertEqual( + '/tmp/test_log_file', + _shell.cloud.config['log_file'], + ) + self.assertEqual( + 'debug', + _shell.cloud.config['log_level'], + ) + + @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") + @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") + def test_shell_args_precedence_2(self, config_mock, vendor_mock): + config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_1)) + vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + _shell = make_shell() + + # Test operation_log_file not set + fake_execute( + _shell, + "--os-cloud scc list user", + ) + self.assertEqual( + False, + _shell.enable_operation_logging, + ) + + @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file") + @mock.patch("os_client_config.config.OpenStackConfig._load_config_file") + @mock.patch("openstackclient.common.context._setup_handler_for_logging") + def test_shell_args_precedence_3(self, setup_handler, config_mock, + vendor_mock): + config_mock.return_value = ('file.yaml', copy.deepcopy(CLOUD_2)) + vendor_mock.return_value = ('file.yaml', copy.deepcopy(PUBLIC_1)) + setup_handler.return_value = mock.MagicMock() + _shell = make_shell() + + # Test enable_operation_logging set + fake_execute( + _shell, + "--os-cloud megacloud list user", + ) + self.assertEqual( + True, + _shell.enable_operation_logging, + ) -- cgit v1.2.1