diff --git a/samcli/commands/local/cli_common/invoke_context.py b/samcli/commands/local/cli_common/invoke_context.py index 6c0198ac56..166b7dc90b 100644 --- a/samcli/commands/local/cli_common/invoke_context.py +++ b/samcli/commands/local/cli_common/invoke_context.py @@ -221,6 +221,11 @@ def __enter__(self) -> "InvokeContext": ContainersMode.COLD: [self._stacks], } + # don't resolve the code URI immediately if we passed in docker vol by passing True for use_raw_codeuri + # this way at the end the code URI will get resolved against the basedir option + if self._docker_volume_basedir: + _function_providers_args[self._containers_mode].append(True) + self._function_provider = _function_providers_class[self._containers_mode]( *_function_providers_args[self._containers_mode] ) diff --git a/tests/unit/commands/local/cli_common/test_invoke_context.py b/tests/unit/commands/local/cli_common/test_invoke_context.py index 585b0ad125..a182fcd949 100644 --- a/tests/unit/commands/local/cli_common/test_invoke_context.py +++ b/tests/unit/commands/local/cli_common/test_invoke_context.py @@ -4,6 +4,8 @@ import errno import os +from parameterized import parameterized + from samcli.commands._utils.template import TemplateFailedParsingException from samcli.commands.local.cli_common.invoke_context import ( InvokeContext, @@ -86,7 +88,7 @@ def test_must_read_from_necessary_files(self, SamFunctionProviderMock, Container self.assertEqual(invoke_context._invoke_images, {None: "image"}) invoke_context._get_stacks.assert_called_once() - SamFunctionProviderMock.assert_called_with(stacks) + SamFunctionProviderMock.assert_called_with(stacks, True) self.assertEqual(invoke_context._global_parameter_overrides, {"AWS::Region": "region"}) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual(invoke_context._get_env_vars_value.call_args_list, [call(env_vars_file), call(None)]) @@ -172,7 +174,9 @@ def test_must_initialize_all_containers_if_warm_containers_is_enabled( self.assertEqual(invoke_context._invoke_images, {None: "image"}) invoke_context._get_stacks.assert_called_once() - RefreshableSamFunctionProviderMock.assert_called_with(stacks, parameter_overrides, global_parameter_overrides) + RefreshableSamFunctionProviderMock.assert_called_with( + stacks, parameter_overrides, global_parameter_overrides, True + ) self.assertEqual(invoke_context._global_parameter_overrides, global_parameter_overrides) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual(invoke_context._get_env_vars_value.call_args_list, [call(env_vars_file), call(None)]) @@ -259,7 +263,9 @@ def test_must_set_debug_function_if_warm_containers_enabled_no_debug_function_pr self.assertEqual(invoke_context._invoke_images, {None: "image"}) invoke_context._get_stacks.assert_called_once() - RefreshableSamFunctionProviderMock.assert_called_with(stacks, parameter_overrides, global_parameter_overrides) + RefreshableSamFunctionProviderMock.assert_called_with( + stacks, parameter_overrides, global_parameter_overrides, True + ) self.assertEqual(invoke_context._global_parameter_overrides, global_parameter_overrides) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual( @@ -344,7 +350,9 @@ def test_no_container_will_be_initialized_if_lazy_containers_is_enabled( self.assertEqual(invoke_context._invoke_images, {None: "image"}) invoke_context._get_stacks.assert_called_once() - RefreshableSamFunctionProviderMock.assert_called_with(stacks, parameter_overrides, global_parameter_overrides) + RefreshableSamFunctionProviderMock.assert_called_with( + stacks, parameter_overrides, global_parameter_overrides, True + ) self.assertEqual(invoke_context._global_parameter_overrides, global_parameter_overrides) self.assertEqual(invoke_context._get_env_vars_value.call_count, 2) self.assertEqual(invoke_context._get_env_vars_value.call_args_list, [call(env_vars_file), call(None)]) @@ -421,6 +429,34 @@ def test_must_raise_if_template_cannot_be_parsed(self, get_buildable_stacks_mock with self.assertRaises(TemplateFailedParsingException) as ex_ctx: invoke_context.__enter__() + @parameterized.expand( + [ + (None, "/my/cool/path", True), + ("LAZY", "/my/cool/path", True), + (None, None, False), + ] + ) + @patch("samcli.lib.providers.sam_function_provider.SamFunctionProvider._extract_functions") + @patch("samcli.lib.utils.file_observer.SingletonFileObserver.start") + def test_docker_volume_basedir_set_use_raw_codeuri( + self, container_mode, docker_volume_basedir, expected, observer_mock, extract_func_mock + ): + invoke_context = InvokeContext( + "template", + warm_container_initialization_mode=container_mode, + docker_volume_basedir=docker_volume_basedir, + shutdown=True, + ) + + invoke_context._initialize_all_functions_containers = Mock() + invoke_context._get_container_manager = Mock(return_value=Mock()) + invoke_context._get_debug_context = Mock(return_value=Mock()) + invoke_context._get_stacks = Mock(return_value=[]) + + invoke_context.__enter__() + + extract_func_mock.assert_called_with([], expected, False, False) + class TestInvokeContext__exit__(TestCase): def test_must_close_opened_logfile(self):