Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fix --docker-volume-basedir being ignored for sam local #4186

Merged
merged 10 commits into from
Sep 9, 2022
5 changes: 5 additions & 0 deletions samcli/commands/local/cli_common/invoke_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
)
Expand Down
44 changes: 40 additions & 4 deletions tests/unit/commands/local/cli_common/test_invoke_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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)])
Expand Down Expand Up @@ -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)])
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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)])
Expand Down Expand Up @@ -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):
Expand Down