From b8a6987cd5fc254a71db4505398479ceef2d15c8 Mon Sep 17 00:00:00 2001 From: Khushiyant Date: Thu, 4 Jan 2024 00:14:53 +0530 Subject: [PATCH] fix: keyerror when creating new config (#3200) Closes #3110. --------- Signed-off-by: Khushiyant --- docker/models/configs.py | 1 + tests/unit/fake_api.py | 9 +++++++++ tests/unit/fake_api_client.py | 1 + tests/unit/models_configs_test.py | 10 ++++++++++ 4 files changed, 21 insertions(+) create mode 100644 tests/unit/models_configs_test.py diff --git a/docker/models/configs.py b/docker/models/configs.py index 3588c8b5..5ef13778 100644 --- a/docker/models/configs.py +++ b/docker/models/configs.py @@ -30,6 +30,7 @@ class ConfigCollection(Collection): def create(self, **kwargs): obj = self.client.api.create_config(**kwargs) + obj.setdefault("Spec", {})["Name"] = kwargs.get("name") return self.prepare_model(obj) create.__doc__ = APIClient.create_config.__doc__ diff --git a/tests/unit/fake_api.py b/tests/unit/fake_api.py index 0524becd..03e53cc6 100644 --- a/tests/unit/fake_api.py +++ b/tests/unit/fake_api.py @@ -19,6 +19,8 @@ FAKE_VOLUME_NAME = 'perfectcherryblossom' FAKE_NODE_ID = '24ifsmvkjbyhk' FAKE_SECRET_ID = 'epdyrw4tsi03xy3deu8g8ly6o' FAKE_SECRET_NAME = 'super_secret' +FAKE_CONFIG_ID = 'sekvs771242jfdjnvfuds8232' +FAKE_CONFIG_NAME = 'super_config' # Each method is prefixed with HTTP method (get, post...) # for clarity and readability @@ -512,6 +514,11 @@ def post_fake_secret(): response = {'ID': FAKE_SECRET_ID} return status_code, response +def post_fake_config(): + status_code = 200 + response = {'ID': FAKE_CONFIG_ID} + return status_code, response + # Maps real api url to fake response callback prefix = 'http+docker://localhost' @@ -630,4 +637,6 @@ fake_responses = { post_fake_network_disconnect, f'{prefix}/{CURRENT_VERSION}/secrets/create': post_fake_secret, + f'{prefix}/{CURRENT_VERSION}/configs/create': + post_fake_config, } diff --git a/tests/unit/fake_api_client.py b/tests/unit/fake_api_client.py index 95cf63b4..79799421 100644 --- a/tests/unit/fake_api_client.py +++ b/tests/unit/fake_api_client.py @@ -37,6 +37,7 @@ def make_fake_api_client(overrides=None): 'create_host_config.side_effect': api_client.create_host_config, 'create_network.return_value': fake_api.post_fake_network()[1], 'create_secret.return_value': fake_api.post_fake_secret()[1], + 'create_config.return_value': fake_api.post_fake_config()[1], 'exec_create.return_value': fake_api.post_fake_exec_create()[1], 'exec_start.return_value': fake_api.post_fake_exec_start()[1], 'images.return_value': fake_api.get_fake_images()[1], diff --git a/tests/unit/models_configs_test.py b/tests/unit/models_configs_test.py new file mode 100644 index 00000000..6960397f --- /dev/null +++ b/tests/unit/models_configs_test.py @@ -0,0 +1,10 @@ +import unittest + +from .fake_api_client import make_fake_client +from .fake_api import FAKE_CONFIG_NAME + +class CreateConfigsTest(unittest.TestCase): + def test_create_config(self): + client = make_fake_client() + config = client.configs.create(name="super_config", data="config") + assert config.__repr__() == "".format(FAKE_CONFIG_NAME)