Path: blob/develop/tests/unit/customizations/test_sessionmanager.py
1567 views
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.1#2# Licensed under the Apache License, Version 2.0 (the "License"). You3# may not use this file except in compliance with the License. A copy of4# the License is located at5#6# http://aws.amazon.com/apache2.0/7#8# or in the "license" file accompanying this file. This file is9# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF10# ANY KIND, either express or implied. See the License for the specific11# language governing permissions and limitations under the License.12import botocore.session13import errno14import json15import pytest16import subprocess1718from awscli.customizations import sessionmanager19from awscli.testutils import mock, unittest202122class TestSessionManager(unittest.TestCase):2324def setUp(self):25self.session = mock.Mock(botocore.session.Session)26self.client = mock.Mock()27self.region = 'us-west-2'28self.profile = 'testProfile'29self.endpoint_url = 'testUrl'30self.client.meta.region_name = self.region31self.client.meta.endpoint_url = self.endpoint_url32self.session.create_client.return_value = self.client33self.session.profile = self.profile34self.caller = sessionmanager.StartSessionCaller(self.session)3536self.parsed_globals = mock.Mock()37self.parsed_globals.profile = 'user_profile'3839def test_start_session_when_non_custom_start_session_fails(self):40self.client.start_session.side_effect = Exception('some exception')41params = {}42with self.assertRaisesRegex(Exception, 'some exception'):43self.caller.invoke('ssm', 'StartSession', params, mock.Mock())4445@mock.patch("awscli.customizations.sessionmanager.check_output")46@mock.patch('awscli.customizations.sessionmanager.check_call')47def test_start_session_success_scenario(48self, mock_check_call, mock_check_output49):50mock_check_output.return_value = "1.2.0.0\n"51mock_check_call.return_value = 05253start_session_params = {54"Target": "i-123456789"55}5657start_session_response = {58"SessionId": "session-id",59"TokenValue": "token-value",60"StreamUrl": "stream-url"61}6263self.client.start_session.return_value = start_session_response6465rc = self.caller.invoke('ssm', 'StartSession',66start_session_params, self.parsed_globals)67self.assertEqual(rc, 0)68self.client.start_session.assert_called_with(**start_session_params)6970mock_check_output_list = mock_check_output.call_args[0]71self.assertEqual(72mock_check_output_list[0], ["session-manager-plugin", "--version"]73)7475mock_check_call_list = mock_check_call.call_args[0][0]76mock_check_call_list[1] = json.loads(mock_check_call_list[1])77self.assertEqual(78mock_check_call_list,79['session-manager-plugin',80start_session_response,81self.region,82'StartSession',83self.parsed_globals.profile,84json.dumps(start_session_params),85self.endpoint_url]86)8788@mock.patch("awscli.customizations.sessionmanager.check_output")89@mock.patch('awscli.customizations.sessionmanager.check_call')90def test_start_session_when_check_call_fails(91self, mock_check_call, mock_check_output92):93mock_check_output.return_value = "1.2.0.0\n"94mock_check_call.side_effect = OSError(errno.ENOENT, 'some error')9596start_session_params = {97"Target": "i-123456789"98}99100start_session_response = {101"SessionId": "session-id",102"TokenValue": "token-value",103"StreamUrl": "stream-url"104}105106terminate_session_params = {107"SessionId": "session-id"108}109110self.client.start_session.return_value = start_session_response111112with self.assertRaises(ValueError):113self.caller.invoke('ssm', 'StartSession',114start_session_params, self.parsed_globals)115116self.client.start_session.assert_called_with(117**start_session_params)118self.client.terminate_session.assert_called_with(119**terminate_session_params)120121mock_check_call_list = mock_check_call.call_args[0][0]122mock_check_call_list[1] = json.loads(mock_check_call_list[1])123self.assertEqual(124mock_check_call_list,125['session-manager-plugin',126start_session_response,127self.region,128'StartSession',129self.parsed_globals.profile,130json.dumps(start_session_params),131self.endpoint_url]132)133134@mock.patch('awscli.customizations.sessionmanager.check_call')135@mock.patch("awscli.customizations.sessionmanager.check_output")136def test_start_session_when_no_profile_is_passed(137self, mock_check_output, mock_check_call138):139mock_check_output.return_value = "1.2.500.0\n"140self.session.profile = "session_profile"141self.parsed_globals.profile = None142mock_check_call.return_value = 0143144start_session_params = {145"Target": "i-123456789"146}147148start_session_response = {149"SessionId": "session-id",150"TokenValue": "token-value",151"StreamUrl": "stream-url"152}153ssm_env_name = "AWS_SSM_START_SESSION_RESPONSE"154155self.client.start_session.return_value = start_session_response156157rc = self.caller.invoke('ssm', 'StartSession',158start_session_params, self.parsed_globals)159self.assertEqual(rc, 0)160self.client.start_session.assert_called_with(**start_session_params)161mock_check_call_list = mock_check_call.call_args[0][0]162self.assertEqual(163mock_check_call_list,164[165"session-manager-plugin",166ssm_env_name,167self.region,168"StartSession",169"",170json.dumps(start_session_params),171self.endpoint_url,172],173)174175@mock.patch("awscli.customizations.sessionmanager.check_call")176@mock.patch("awscli.customizations.sessionmanager.check_output")177def test_start_session_with_env_variable_success_scenario(178self, mock_check_output, mock_check_call179):180mock_check_output.return_value = "1.2.500.0\n"181mock_check_call.return_value = 0182183start_session_params = {184"Target": "i-123456789"185}186187start_session_response = {188"SessionId": "session-id",189"TokenValue": "token-value",190"StreamUrl": "stream-url",191}192ssm_env_name = "AWS_SSM_START_SESSION_RESPONSE"193194self.client.start_session.return_value = start_session_response195rc = self.caller.invoke(196"ssm", "StartSession", start_session_params, self.parsed_globals197)198self.assertEqual(rc, 0)199self.client.start_session.assert_called_with(**start_session_params)200201mock_check_output_list = mock_check_output.call_args[0]202self.assertEqual(203mock_check_output_list[0], ["session-manager-plugin", "--version"]204)205206mock_check_call_list = mock_check_call.call_args[0][0]207self.assertEqual(208mock_check_call_list,209[210"session-manager-plugin",211ssm_env_name,212self.region,213"StartSession",214self.parsed_globals.profile,215json.dumps(start_session_params),216self.endpoint_url,217],218)219env_variable = mock_check_call.call_args[1]220self.assertEqual(221env_variable["env"][ssm_env_name],222json.dumps(start_session_response)223)224225@mock.patch("awscli.customizations.sessionmanager.check_call")226@mock.patch("awscli.customizations.sessionmanager.check_output")227def test_start_session_when_check_output_fails(228self, mock_check_output, mock_check_call229):230mock_check_output.side_effect = subprocess.CalledProcessError(231returncode=1, cmd="session-manager-plugin", output="some error"232)233234start_session_params = {235"Target": "i-123456789"236}237start_session_response = {238"SessionId": "session-id",239"TokenValue": "token-value",240"StreamUrl": "stream-url",241}242243self.client.start_session.return_value = start_session_response244with self.assertRaises(subprocess.CalledProcessError):245self.caller.invoke(246"ssm",247"StartSession",248start_session_params,249self.parsed_globals250)251252self.client.start_session.assert_called_with(**start_session_params)253self.client.terminate_session.assert_not_called()254mock_check_output.assert_called_with(255["session-manager-plugin", "--version"], text=True256)257mock_check_call.assert_not_called()258259@mock.patch("awscli.customizations.sessionmanager.check_call")260@mock.patch("awscli.customizations.sessionmanager.check_output")261def test_start_session_when_response_not_json(262self, mock_check_output, mock_check_call263):264mock_check_output.return_value = "1.2.500.0\n"265start_session_params = {266"Target": "i-123456789"267}268start_session_response = {269"SessionId": "session-id",270"TokenValue": "token-value",271"StreamUrl": "stream-url",272"para2": {"Not a json format"},273}274expected_env_value = {275"SessionId": "session-id",276"TokenValue": "token-value",277"StreamUrl": "stream-url",278}279280ssm_env_name = "AWS_SSM_START_SESSION_RESPONSE"281282self.client.start_session.return_value = start_session_response283rc = self.caller.invoke(284"ssm", "StartSession", start_session_params, self.parsed_globals285)286self.assertEqual(rc, 0)287self.client.start_session.assert_called_with(**start_session_params)288289mock_check_output_list = mock_check_output.call_args[0]290self.assertEqual(291mock_check_output_list[0], ["session-manager-plugin", "--version"]292)293294mock_check_call_list = mock_check_call.call_args[0][0]295self.assertEqual(296mock_check_call_list,297[298"session-manager-plugin",299ssm_env_name,300self.region,301"StartSession",302self.parsed_globals.profile,303json.dumps(start_session_params),304self.endpoint_url,305],306)307env_variable = mock_check_call.call_args[1]308self.assertEqual(309env_variable["env"][ssm_env_name], json.dumps(expected_env_value)310)311312@mock.patch("awscli.customizations.sessionmanager.check_call")313@mock.patch("awscli.customizations.sessionmanager.check_output")314def test_start_session_when_invalid_plugin_version(315self, mock_check_output, mock_check_call316):317mock_check_output.return_value = "InvalidVersion"318319start_session_params = {320"Target": "i-123456789"321}322start_session_response = {323"SessionId": "session-id",324"TokenValue": "token-value",325"StreamUrl": "stream-url",326}327328self.client.start_session.return_value = start_session_response329self.caller.invoke(330"ssm", "StartSession", start_session_params, self.parsed_globals331)332self.client.start_session.assert_called_with(**start_session_params)333self.client.terminate_session.assert_not_called()334mock_check_output.assert_called_with(335["session-manager-plugin", "--version"], text=True336)337338mock_check_call_list = mock_check_call.call_args[0][0]339self.assertEqual(340mock_check_call_list,341[342"session-manager-plugin",343json.dumps(start_session_response),344self.region,345"StartSession",346self.parsed_globals.profile,347json.dumps(start_session_params),348self.endpoint_url,349],350)351352353class TestVersionRequirement:354version_requirement = \355sessionmanager.VersionRequirement(min_version="1.2.497.0")356357@pytest.mark.parametrize(358"version, expected_result",359[360("2.0.0.0", True),361("2.1", True),362("2", True),363("1.3.1.1", True),364("\r\n1. 3.1.1", True),365("1.3.1.0", True),366("1.3", True),367("1.2.498.1", True),368("1.2.498", True),369("1.2.497.1", True),370("1.2.497.0", False),371("1.2.497", False),372("1.2.1.1", False),373("1.2.1", False),374("1.2", False),375("1.1.1.0", False),376("1.1.1", False),377("1.0.497.0", False),378("1.0. 497.0\r\n", False),379("1", False),380("0.3.497.0", False),381],382)383def test_meets_requirement(self, version, expected_result):384assert expected_result == \385self.version_requirement.meets_requirement(version)386387@pytest.mark.parametrize(388"version, expected_result",389[390("\r\n1.3.1.1", "1.3.1.1"),391("\r1.3 .1.1", "1.3.1.1"),392("1 .3.1.1", "1.3.1.1"),393(" 1.3.1.1", "1.3.1.1"),394("1.3.1.1 ", "1.3.1.1"),395(" 1.3.1.1 ", "1.3.1.1"),396("\n1.3.1.1 ", "1.3.1.1"),397("1.3.1.1\n", "1.3.1.1"),398("1.3\r\n.1.1", "1.3.1.1"),399(" 1\r. 3", "1.3"),400(" 1. 3. ", "1.3."),401("1.1.1\r\n", "1.1.1"),402("1\r", "1"),403],404)405def test_sanitize_plugin_version(self, version, expected_result):406assert expected_result == \407self.version_requirement._sanitize_plugin_version(version)408409@pytest.mark.parametrize(410"version, expected_result",411[412("999.99999.99.9", True),413("2", True),414("1.1.1.1", True),415("1.1.1", True),416("1.1", True),417("1.1.1.1.1", False),418("1.1.1.1.0", False),419("1.1.1.a", False),420("1.a.1.1", False),421("1-1.1.1", False),422("1.1.", False),423("invalid_version", False),424],425)426def test_is_valid_version(self, version, expected_result):427assert expected_result == \428self.version_requirement._is_valid_version(version)429430431