Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion samcli/lib/constants.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
DOCKER_MIN_API_VERSION = "1.35"
DOCKER_MIN_API_VERSION = "1.44"
12 changes: 7 additions & 5 deletions samcli/local/docker/container_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class ContainerClient(docker.DockerClient, ABC):
# Initialize socket_path
socket_path: Optional[str] = None

def __init__(self, base_url=None):
def __init__(self, client_version, base_url=None):
"""
Initialize the container client with environment variable processing and overrides.

Expand Down Expand Up @@ -94,7 +94,7 @@ def __init__(self, base_url=None):
client_params["base_url"] = base_url

# Specify minimum version
client_params["version"] = DOCKER_MIN_API_VERSION
client_params["version"] = client_version

# Initialize DockerClient with processed parameters
LOG.debug(f"Creating container client with parameters: {client_params}")
Expand Down Expand Up @@ -292,10 +292,10 @@ def __init__(self):

if socket_path:
LOG.debug(f"Creating Docker container client with base_url={socket_path}.")
super().__init__(base_url=socket_path)
super().__init__(base_url=socket_path, client_version=DOCKER_MIN_API_VERSION)
else:
LOG.debug("Creating Docker container client from environment variable.")
super().__init__()
super().__init__(client_version=DOCKER_MIN_API_VERSION)

def get_runtime_type(self) -> str:
"""
Expand Down Expand Up @@ -504,7 +504,9 @@ def __init__(self):
return None

LOG.debug(f"Creating Finch container client with base_url={socket_path}")
super().__init__(base_url=socket_path)
super().__init__(
base_url=socket_path, client_version="1.35"
) # TODO: Placeholder until Finch updates to Docker's min latest version

def get_socket_path(self) -> str:
"""
Expand Down
20 changes: 11 additions & 9 deletions tests/unit/local/docker/test_container_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
ContainerArchiveImageLoadFailedException,
ContainerInvalidSocketPathException,
)
from samcli.lib.constants import DOCKER_MIN_API_VERSION


class BaseContainerClientTestCase(TestCase):
Expand All @@ -31,7 +32,8 @@ def setUp(self):
"""Set up common test fixtures"""
self.finch_socket = "unix:///tmp/finch.sock"
self.docker_socket = "unix:///var/run/docker.sock"
self.default_version = "1.35"
self.docker_version = DOCKER_MIN_API_VERSION
self.finch_version = "1.35" # TODO: Update when Finch updates to latest Docker API version

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably be another variable FINCH_MIN_API_VERSION or something like that to be used in all places, but we can do that separately if we want to push this soon.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah I left it hardcoded bc the Finch team said they would update to the Docker min version soon, so ideally it should just take DOCKER_MIN_API_VERSION


def create_mock_container_client(self, client_class, methods_to_bind=None):
"""Create a mock container client with bound methods for testing."""
Expand Down Expand Up @@ -163,7 +165,7 @@ def test_init_success_no_docker_host(self, mock_docker_init):
# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.docker_version)

@patch("docker.DockerClient.__init__", return_value=None)
def test_init_success_with_docker_host(self, mock_docker_init):
Expand All @@ -176,7 +178,7 @@ def test_init_success_with_docker_host(self, mock_docker_init):
# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.docker_version)
self.assertEqual(call_kwargs["base_url"], self.docker_socket)

def test_init_raises_exception_when_docker_host_points_to_finch(self):
Expand Down Expand Up @@ -208,7 +210,7 @@ def test_init_with_various_docker_host_values(self, docker_host, mock_log, mock_
# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.docker_version)
self.assertEqual(call_kwargs["base_url"], docker_host)

# Verify log call
Expand Down Expand Up @@ -678,7 +680,7 @@ def test_init_with_socket_path_success(self, mock_log, mock_docker_init):
# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.finch_version)
self.assertEqual(call_kwargs["base_url"], self.finch_socket)

# Verify log call
Expand Down Expand Up @@ -719,12 +721,12 @@ class TestContainerClientBaseInit(BaseContainerClientTestCase):
def test_init_no_overrides(self, mock_log, mock_docker_init):
"""Test ContainerClient init with no environment overrides"""
with patch.dict("os.environ", {}, clear=True):
client = ConcreteContainerClient()
client = ConcreteContainerClient(client_version=self.docker_version)

# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.docker_version)
self.assertTrue(mock_log.debug.called)

@patch("docker.DockerClient.__init__", return_value=None)
Expand All @@ -734,12 +736,12 @@ def test_init_with_base_url_override(self, mock_log, mock_docker_init):
override_url = "unix:///tmp/finch.sock"

with patch.dict("os.environ", {}, clear=True):
client = ConcreteContainerClient(base_url=override_url)
client = ConcreteContainerClient(client_version=self.docker_version, base_url=override_url)

# Verify DockerClient.__init__ was called with expected parameters
mock_docker_init.assert_called_once()
call_kwargs = mock_docker_init.call_args.kwargs
self.assertEqual(call_kwargs["version"], self.default_version)
self.assertEqual(call_kwargs["version"], self.docker_version)
self.assertEqual(call_kwargs["base_url"], override_url)
self.assertTrue(mock_log.debug.called)

Expand Down
Loading