diff --git a/magnum/common/docker_utils.py b/magnum/common/docker_utils.py index bca0c60b0c..54cfe6d849 100644 --- a/magnum/common/docker_utils.py +++ b/magnum/common/docker_utils.py @@ -70,6 +70,12 @@ def is_docker_library_version_atleast(version): return False +def is_docker_api_version_atleast(docker, version): + if utils.compare_version(docker.version()['ApiVersion'], version) <= 0: + return True + return False + + @contextlib.contextmanager def docker_for_container(context, container): if magnum_utils.is_uuid_like(container): diff --git a/magnum/conductor/handlers/docker_conductor.py b/magnum/conductor/handlers/docker_conductor.py index 49a7625b0a..7e4d716ab0 100644 --- a/magnum/conductor/handlers/docker_conductor.py +++ b/magnum/conductor/handlers/docker_conductor.py @@ -80,11 +80,18 @@ class Handler(object): image_repo, image_tag = docker_utils.parse_docker_image(image) docker.pull(image_repo, tag=image_tag) docker.inspect_image(self._encode_utf8(container.image)) - docker.create_container(image, name=name, - hostname=container_uuid, - command=container.command, - mem_limit=container.memory, - environment=container.environment) + kwargs = {'name': name, + 'hostname': container_uuid, + 'command': container.command, + 'environment': container.environment} + if docker_utils.is_docker_api_version_atleast(docker, '1.19'): + if container.memory is not None: + kwargs['host_config'] = {'mem_limit': + container.memory} + else: + kwargs['mem_limit'] = container.memory + + docker.create_container(image, **kwargs) container.status = fields.ContainerStatus.STOPPED return container except errors.APIError: diff --git a/magnum/tests/unit/common/test_docker_utils.py b/magnum/tests/unit/common/test_docker_utils.py index bc36f12e9c..f20114a03e 100644 --- a/magnum/tests/unit/common/test_docker_utils.py +++ b/magnum/tests/unit/common/test_docker_utils.py @@ -147,6 +147,16 @@ class TestDockerUtils(base.BaseTestCase): CONF.docker.docker_remote_api_version, CONF.docker.default_timeout) + def test_is_docker_api_version_atleast(self): + + def fake_version(): + return {'ApiVersion': '1.18'} + + docker = mock.MagicMock() + docker.version.side_effect = fake_version + res = docker_utils.is_docker_api_version_atleast(docker, '1.19') + self.assertFalse(res) + class DockerClientTestCase(base.BaseTestCase): def test_docker_client_init(self): diff --git a/magnum/tests/unit/conductor/handlers/test_docker_conductor.py b/magnum/tests/unit/conductor/handlers/test_docker_conductor.py index afb11bbacb..cb0a4eea05 100644 --- a/magnum/tests/unit/conductor/handlers/test_docker_conductor.py +++ b/magnum/tests/unit/conductor/handlers/test_docker_conductor.py @@ -36,9 +36,14 @@ class TestDockerHandler(base.BaseTestCase): self.dfc_context_manager.__enter__.return_value = self.mock_docker self.addCleanup(dfc_patcher.stop) - def _test_container_create( - self, container_dict, expected_kwargs, expected_image='test_image', - expected_tag='some_tag'): + @mock.patch.object(docker_utils, 'is_docker_api_version_atleast') + def _test_container_create(self, container_dict, expected_kwargs, + mock_version, expected_image='test_image', + expected_tag='some_tag', + api_version='1.18'): + + mock_version.return_value = (float(api_version) > 1.18) + name = container_dict.pop('name') mock_container = mock.MagicMock(**container_dict) type(mock_container).name = mock.PropertyMock(return_value=name) @@ -72,6 +77,25 @@ class TestDockerHandler(base.BaseTestCase): } self._test_container_create(container_dict, expected_kwargs) + def test_container_create_api_1_19(self): + container_dict = { + 'name': 'some-name', + 'uuid': 'some-uuid', + 'image': 'test_image:some_tag', + 'command': None, + 'memory': 512, + 'environment': None, + } + expected_kwargs = { + 'name': 'some-name', + 'hostname': 'some-uuid', + 'command': None, + 'host_config': {'mem_limit': 512}, + 'environment': None, + } + self._test_container_create(container_dict, expected_kwargs, + api_version='1.19') + def test_container_create_with_command(self): container_dict = { 'name': 'some-name',