diff --git a/compose/config/config_schema_v3.7.json b/compose/config/config_schema_v3.7.json index cd7882f5b24..98ce670b056 100644 --- a/compose/config/config_schema_v3.7.json +++ b/compose/config/config_schema_v3.7.json @@ -250,6 +250,7 @@ } }, "sysctls": {"$ref": "#/definitions/list_or_dict"}, + "runtime": {"type": "string"}, "stdin_open": {"type": "boolean"}, "stop_grace_period": {"type": "string", "format": "duration"}, "stop_signal": {"type": "string"}, diff --git a/tests/integration/project_test.py b/tests/integration/project_test.py index 63939676e78..7290e51b065 100644 --- a/tests/integration/project_test.py +++ b/tests/integration/project_test.py @@ -27,6 +27,7 @@ from compose.const import COMPOSEFILE_V2_2 as V2_2 from compose.const import COMPOSEFILE_V2_3 as V2_3 from compose.const import COMPOSEFILE_V3_1 as V3_1 +from compose.const import COMPOSEFILE_V3_7 as V3_7 from compose.const import LABEL_PROJECT from compose.const import LABEL_SERVICE from compose.container import Container @@ -37,6 +38,7 @@ from compose.service import ConvergenceStrategy from tests.integration.testcases import if_runtime_available from tests.integration.testcases import is_cluster +from tests.integration.testcases import min_version_skip from tests.integration.testcases import no_cluster from tests.integration.testcases import v2_1_only from tests.integration.testcases import v2_2_only @@ -1150,6 +1152,67 @@ def test_up_with_nvidia_runtime(self): service_container = project.get_service('web').containers(stopped=True)[0] assert service_container.inspect()['HostConfig']['Runtime'] == 'nvidia' + @min_version_skip(V3_7) + @if_runtime_available('runc') + def test_up_with_runtime_3(self): + self.require_api_version('1.30') + config_data = build_config( + version=V3_7, + services=[{ + 'name': 'web', + 'image': 'busybox:latest', + 'runtime': 'runc' + }], + ) + project = Project.from_config( + client=self.client, + name='composetest', + config_data=config_data + ) + project.up(detached=True) + service_container = project.get_service('web').containers(stopped=True)[0] + assert service_container.inspect()['HostConfig']['Runtime'] == 'runc' + + @min_version_skip(V3_7) + def test_up_with_invalid_runtime_3(self): + self.require_api_version('1.30') + config_data = build_config( + version=V3_7, + services=[{ + 'name': 'web', + 'image': 'busybox:latest', + 'runtime': 'foobar' + }], + ) + project = Project.from_config( + client=self.client, + name='composetest', + config_data=config_data + ) + with pytest.raises(ProjectError): + project.up() + + @min_version_skip(V3_7) + @if_runtime_available('nvidia') + def test_up_with_nvidia_runtime_3(self): + self.require_api_version('1.30') + config_data = build_config( + version=V3_7, + services=[{ + 'name': 'web', + 'image': 'busybox:latest', + 'runtime': 'nvidia' + }], + ) + project = Project.from_config( + client=self.client, + name='composetest', + config_data=config_data + ) + project.up(detached=True) + service_container = project.get_service('web').containers(stopped=True)[0] + assert service_container.inspect()['HostConfig']['Runtime'] == 'nvidia' + @v2_only() def test_project_up_with_network_internal(self): self.require_api_version('1.23')