diff --git a/glareclient/shell.py b/glareclient/shell.py index 4e136bb..756bd9b 100644 --- a/glareclient/shell.py +++ b/glareclient/shell.py @@ -1,4 +1,4 @@ -# Copyright 2015 - StackStorm, Inc. +# Copyright 2017 - Nokia Networks # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -261,17 +261,28 @@ class GlareShell(app.App): self._clear_shell_commands() self._set_shell_commands(self._get_commands()) - do_help = ('help' in argv) or ('-h' in argv) or not argv + # bash-completion and help messages should not require client creation + need_client = not ( + ('bash-completion' in argv) or + ('help' in argv) or + ('-h' in argv) or + ('--help' in argv) or + not argv) - # Set default for auth_url if not supplied. The default is not - # set at the parser to support use cases where auth is not enabled. - # An example use case would be a developer's environment. + self.client = self._create_client() if need_client else None - # bash-completion should not require authentification. - if do_help or ('bash-completion' in argv): - self.options.auth_url = None + # Adding client_manager variable to make glare client work with + # unified OpenStack client. + ClientManager = type( + 'ClientManager', + (object,), + dict(artifact=self.client) + ) - self.client = client.Client( + self.client_manager = ClientManager() + + def _create_client(self): + return client.Client( endpoint=self.options.glare_url, auth_token=self.options.auth_token, keycloak_auth_url=self.options.keycloak_auth_url, @@ -285,16 +296,6 @@ class GlareShell(app.App): insecure=self.options.insecure ) - # Adding client_manager variable to make glare client work with - # unified OpenStack client. - ClientManager = type( - 'ClientManager', - (object,), - dict(artifact=self.client) - ) - - self.client_manager = ClientManager() - def _set_shell_commands(self, cmds_dict): for k, v in cmds_dict.items(): self.command_manager.add_command(k, v) diff --git a/glareclient/tests/unit/test_shell.py b/glareclient/tests/unit/test_shell.py new file mode 100644 index 0000000..ecca37b --- /dev/null +++ b/glareclient/tests/unit/test_shell.py @@ -0,0 +1,59 @@ +# Copyright 2015 Huawei Technologies Co., Ltd. +# +# 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 mock +import os +import sys + +import six +import testtools + +from glareclient import shell + + +class TestShell(testtools.TestCase): + + def shell(self, argstr): + orig = (sys.stdout, sys.stderr) + clean_env = {} + _old_env, os.environ = os.environ, clean_env.copy() + + try: + sys.stdout = six.moves.cStringIO() + sys.stderr = six.moves.cStringIO() + _shell = shell.GlareShell() + _shell.run(argstr.split()) + except SystemExit: + exc_type, exc_value, exc_traceback = sys.exc_info() + self.assertEqual(0, exc_value.code) + finally: + stdout = sys.stdout.getvalue() + stderr = sys.stderr.getvalue() + sys.stdout.close() + sys.stderr.close() + sys.stdout, sys.stderr = orig + os.environ = _old_env + + return stdout, stderr + + def test_help(self): + """Test that client is not created for help and bash complete""" + for command in ('-h', + '--help', + 'help', + 'help workbook-list', + 'bash-completion'): + with mock.patch('glareclient.client.Client') as client_mock: + self.shell(command) + self.assertFalse(client_mock.called)