# Copyright 2019 Nokia # # 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. # pylint: disable=redefined-outer-name import os import json from collections import namedtuple import pytest from . openstackcli import ( OpenStack, OpenStackCliError) class MockResult(namedtuple('MockResult', ['status', 'stdout', 'stderr'])): def __str__(self): return ', '.join([ '{n}: {v!r}'.format(n=n, v=v) for n, v in self._asdict().items()]) def get_output(): return _get_content('service_show_neutron_expected_output.txt') def _get_content(fname): with open(os.path.join(os.path.dirname(__file__), fname)) as f: return f.read() @pytest.mark.parametrize('return_value', [ MockResult(status=0, stdout=get_output(), stderr=''), MockResult(status='0', stdout=get_output(), stderr='')]) def test_openstack_run(cliwrapper, return_value): cliwrapper.set_exec_func_and_return_value( cliwrapper.remotesession.execute_command_in_target, return_value=return_value) cliwrapper.set_expected_cmd_postfix(' -f json') ret = cliwrapper.run_with_verify(cliwrapper.cli.run, 'service show neutron') runner_out = return_value.stdout assert json.loads(runner_out) == ret def test_run_ignore_output(cliwrapper): return_value = MockResult(status=0, stdout='', stderr='') cliwrapper.set_exec_func_and_return_value( cliwrapper.remotesession.execute_command_in_target, return_value=return_value) cliwrapper.run_with_verify(cliwrapper.cli.run_ignore_output, 'cmd') def test_run_raw(cliwrapper): return_value = MockResult(status=0, stdout='output', stderr='') cliwrapper.set_exec_func_and_return_value( cliwrapper.remotesession.execute_command_in_target, return_value=return_value) assert cliwrapper.run_with_verify(cliwrapper.cli.run_raw, 'cmd') == return_value.stdout def test_openstack_run_nohup(cliwrapper): runner = cliwrapper.remotesession.get_remoterunner.return_value return_value = 'pid' cliwrapper.set_exec_func_and_return_value( runner.execute_nohup_background_in_target, return_value=return_value) assert cliwrapper.run_with_verify(cliwrapper.cli.run_nohup, 'cmd') == return_value @pytest.fixture def openstack(mock_remotesession): n = OpenStack() n.initialize(mock_remotesession) return n class RemoteException(Exception): pass def raise_remoteexception(): raise RemoteException('message') def test_openstack_run_runner_raises(mock_remotesession, openstack): mock_remotesession.execute_command_in_target.side_effect = ( lambda cmd, target: raise_remoteexception()) with pytest.raises(OpenStackCliError) as excinfo: openstack.run('cmd') assert str(excinfo.value) == ( "Remote command 'openstack --os-cloud default cmd -f json' " "in target 'default' failed: RemoteException: message") @pytest.fixture(params=[ MockResult(status=1, stdout='out', stderr=''), MockResult(status=0, stdout='out', stderr='err'), MockResult(status='zero', stdout='out', stderr='')]) def bad_mock_remotesession(request, mock_remotesession): mock_remotesession.execute_command_in_target.return_value = ( request.param) return mock_remotesession def test_openstack_run_result_fail(bad_mock_remotesession, methodfmt): with pytest.raises(OpenStackCliError) as excinfo: methodfmt.method('cmd') execute = bad_mock_remotesession.execute_command_in_target assert str(excinfo.value) == ( "Remote command 'openstack --os-cloud default cmd{fmt}' " "in target 'default' failed: {return_value}".format( fmt=methodfmt.fmt, return_value=execute.return_value)) def test_run_nohup_runner_raises(mock_remotesession, openstack): runner = mock_remotesession.get_remoterunner.return_value runner.execute_nohup_background_in_target.side_effect = ( lambda cmd, target: raise_remoteexception()) with pytest.raises(OpenStackCliError) as excinfo: openstack.run_nohup('cmd') assert str(excinfo.value) == ( "Remote command 'openstack --os-cloud default cmd' " "in target 'default' failed: RemoteException: message")