diff options
| author | Joffrey F <f.joffrey@gmail.com> | 2017-05-02 14:52:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-05-02 14:52:47 -0700 |
| commit | 67f12bd114c3d74430506f624d4c0b04253b134f (patch) | |
| tree | 1ea8045348368a3186375add19b1854b628add25 | |
| parent | 35b8c0a750fc28ac9a8c90fd7a813c1f69639c02 (diff) | |
| parent | 2a0a7adeced6120cf53ed10936769748cdb3a34a (diff) | |
| download | docker-py-67f12bd114c3d74430506f624d4c0b04253b134f.tar.gz | |
Merge pull request #1583 from delcypher/cpuset_fixes
CPUset* parameter fixes
| -rw-r--r-- | docker/api/container.py | 2 | ||||
| -rw-r--r-- | docker/models/containers.py | 3 | ||||
| -rw-r--r-- | docker/types/containers.py | 15 | ||||
| -rw-r--r-- | tests/unit/api_container_test.py | 29 | ||||
| -rw-r--r-- | tests/unit/models_containers_test.py | 2 |
5 files changed, 47 insertions, 4 deletions
diff --git a/docker/api/container.py b/docker/api/container.py index 85e5e90..97b5405 100644 --- a/docker/api/container.py +++ b/docker/api/container.py @@ -479,6 +479,8 @@ class ContainerApiMixin(object): cpu_shares (int): CPU shares (relative weight). cpuset_cpus (str): CPUs in which to allow execution (``0-3``, ``0,1``). + cpuset_mems (str): Memory nodes (MEMs) in which to allow execution + (``0-3``, ``0,1``). Only effective on NUMA systems. device_read_bps: Limit read rate (bytes per second) from a device in the form of: `[{"Path": "device_path", "Rate": rate}]` device_read_iops: Limit read rate (IO per second) from a device. diff --git a/docker/models/containers.py b/docker/models/containers.py index f1c0fd2..2213583 100644 --- a/docker/models/containers.py +++ b/docker/models/containers.py @@ -483,6 +483,8 @@ class ContainerCollection(Collection): cpu_shares (int): CPU shares (relative weight). cpuset_cpus (str): CPUs in which to allow execution (``0-3``, ``0,1``). + cpuset_mems (str): Memory nodes (MEMs) in which to allow execution + (``0-3``, ``0,1``). Only effective on NUMA systems. detach (bool): Run container in the background and return a :py:class:`Container` object. device_read_bps: Limit read rate (bytes per second) from a device @@ -829,6 +831,7 @@ RUN_HOST_CONFIG_KWARGS = [ 'cpu_quota', 'cpu_shares', 'cpuset_cpus', + 'cpuset_mems', 'device_read_bps', 'device_read_iops', 'device_write_bps', diff --git a/docker/types/containers.py b/docker/types/containers.py index 9f1a04d..06d0ee4 100644 --- a/docker/types/containers.py +++ b/docker/types/containers.py @@ -119,7 +119,8 @@ class HostConfig(dict): cpuset_cpus=None, userns_mode=None, pids_limit=None, isolation=None, auto_remove=False, storage_opt=None, init=None, init_path=None, volume_driver=None, - cpu_count=None, cpu_percent=None, nano_cpus=None): + cpu_count=None, cpu_percent=None, nano_cpus=None, + cpuset_mems=None): if mem_limit is not None: self['Memory'] = parse_bytes(mem_limit) @@ -326,7 +327,17 @@ class HostConfig(dict): if version_lt(version, '1.18'): raise host_config_version_error('cpuset_cpus', '1.18') - self['CpuSetCpus'] = cpuset_cpus + self['CpusetCpus'] = cpuset_cpus + + if cpuset_mems: + if version_lt(version, '1.19'): + raise host_config_version_error('cpuset_mems', '1.19') + + if not isinstance(cpuset_mems, str): + raise host_config_type_error( + 'cpuset_mems', cpuset_mems, 'str' + ) + self['CpusetMems'] = cpuset_mems if blkio_weight: if not isinstance(blkio_weight, int): diff --git a/tests/unit/api_container_test.py b/tests/unit/api_container_test.py index 901934e..662d3f5 100644 --- a/tests/unit/api_container_test.py +++ b/tests/unit/api_container_test.py @@ -332,7 +332,34 @@ class CreateContainerTest(BaseAPIClientTest): "StdinOnce": false, "NetworkDisabled": false, "HostConfig": { - "CpuSetCpus": "0,1", + "CpusetCpus": "0,1", + "NetworkMode": "default" + }}''')) + self.assertEqual(args[1]['headers'], + {'Content-Type': 'application/json'}) + + @requires_api_version('1.19') + def test_create_container_with_host_config_cpuset_mems(self): + self.client.create_container( + 'busybox', 'ls', host_config=self.client.create_host_config( + cpuset_mems='0' + ) + ) + + args = fake_request.call_args + self.assertEqual(args[0][1], + url_prefix + 'containers/create') + + self.assertEqual(json.loads(args[1]['data']), + json.loads(''' + {"Tty": false, "Image": "busybox", + "Cmd": ["ls"], "AttachStdin": false, + "AttachStderr": true, + "AttachStdout": true, "OpenStdin": false, + "StdinOnce": false, + "NetworkDisabled": false, + "HostConfig": { + "CpusetMems": "0", "NetworkMode": "default" }}''')) self.assertEqual(args[1]['headers'], diff --git a/tests/unit/models_containers_test.py b/tests/unit/models_containers_test.py index c594606..4f4dc0f 100644 --- a/tests/unit/models_containers_test.py +++ b/tests/unit/models_containers_test.py @@ -135,7 +135,7 @@ class ContainerCollectionTest(unittest.TestCase): 'CpuPeriod': 1, 'CpuQuota': 2, 'CpuShares': 5, - 'CpuSetCpus': '0-3', + 'CpusetCpus': '0-3', 'Devices': [{'PathOnHost': '/dev/sda', 'CgroupPermissions': 'rwm', 'PathInContainer': '/dev/xvda'}], |
