mirror of https://github.com/docker/docker-py.git
Merge pull request #644 from docker/memory-memswap-hostconfig
memory / memswap in hostconfig
This commit is contained in:
commit
ac90a874be
|
|
@ -450,11 +450,11 @@ class Client(requests.Session):
|
|||
|
||||
def create_container(self, image, command=None, hostname=None, user=None,
|
||||
detach=False, stdin_open=False, tty=False,
|
||||
mem_limit=0, ports=None, environment=None, dns=None,
|
||||
volumes=None, volumes_from=None,
|
||||
mem_limit=None, ports=None, environment=None,
|
||||
dns=None, volumes=None, volumes_from=None,
|
||||
network_disabled=False, name=None, entrypoint=None,
|
||||
cpu_shares=None, working_dir=None, domainname=None,
|
||||
memswap_limit=0, cpuset=None, host_config=None,
|
||||
memswap_limit=None, cpuset=None, host_config=None,
|
||||
mac_address=None, labels=None, volume_driver=None):
|
||||
|
||||
if isinstance(volumes, six.string_types):
|
||||
|
|
|
|||
|
|
@ -383,10 +383,21 @@ def create_host_config(
|
|||
dns=None, dns_search=None, volumes_from=None, network_mode=None,
|
||||
restart_policy=None, cap_add=None, cap_drop=None, devices=None,
|
||||
extra_hosts=None, read_only=None, pid_mode=None, ipc_mode=None,
|
||||
security_opt=None, ulimits=None, log_config=None
|
||||
security_opt=None, ulimits=None, log_config=None, mem_limit=None,
|
||||
memswap_limit=None
|
||||
):
|
||||
host_config = {}
|
||||
|
||||
if mem_limit is not None:
|
||||
if isinstance(mem_limit, six.string_types):
|
||||
mem_limit = parse_bytes(mem_limit)
|
||||
host_config['Memory'] = mem_limit
|
||||
|
||||
if memswap_limit is not None:
|
||||
if isinstance(memswap_limit, six.string_types):
|
||||
memswap_limit = parse_bytes(memswap_limit)
|
||||
host_config['MemorySwap'] = memswap_limit
|
||||
|
||||
if pid_mode not in (None, 'host'):
|
||||
raise errors.DockerException(
|
||||
'Invalid value for pid param: {0}'.format(pid_mode)
|
||||
|
|
@ -503,10 +514,10 @@ def create_host_config(
|
|||
|
||||
def create_container_config(
|
||||
version, image, command, hostname=None, user=None, detach=False,
|
||||
stdin_open=False, tty=False, mem_limit=0, ports=None, environment=None,
|
||||
stdin_open=False, tty=False, mem_limit=None, ports=None, environment=None,
|
||||
dns=None, volumes=None, volumes_from=None, network_disabled=False,
|
||||
entrypoint=None, cpu_shares=None, working_dir=None, domainname=None,
|
||||
memswap_limit=0, cpuset=None, host_config=None, mac_address=None,
|
||||
memswap_limit=None, cpuset=None, host_config=None, mac_address=None,
|
||||
labels=None, volume_driver=None
|
||||
):
|
||||
if isinstance(command, six.string_types):
|
||||
|
|
@ -522,10 +533,24 @@ def create_container_config(
|
|||
'labels were only introduced in API version 1.18'
|
||||
)
|
||||
|
||||
if volume_driver is not None and compare_version('1.19', version) < 0:
|
||||
raise errors.InvalidVersion(
|
||||
'Volume drivers were only introduced in API version 1.19'
|
||||
)
|
||||
if compare_version('1.19', version) < 0:
|
||||
if volume_driver is not None:
|
||||
raise errors.InvalidVersion(
|
||||
'Volume drivers were only introduced in API version 1.19'
|
||||
)
|
||||
mem_limit = mem_limit if mem_limit is not None else 0
|
||||
memswap_limit = memswap_limit if memswap_limit is not None else 0
|
||||
else:
|
||||
if mem_limit is not None:
|
||||
raise errors.InvalidVersion(
|
||||
'mem_limit has been moved to host_config in API version 1.19'
|
||||
)
|
||||
|
||||
if memswap_limit is not None:
|
||||
raise errors.InvalidVersion(
|
||||
'memswap_limit has been moved to host_config in API '
|
||||
'version 1.19'
|
||||
)
|
||||
|
||||
if isinstance(labels, list):
|
||||
labels = dict((lbl, six.text_type('')) for lbl in labels)
|
||||
|
|
|
|||
109
tests/test.py
109
tests/test.py
|
|
@ -124,11 +124,10 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
if not cmd:
|
||||
cmd = ['true']
|
||||
return {"Tty": False, "Image": img, "Cmd": cmd,
|
||||
"AttachStdin": False, "Memory": 0,
|
||||
"AttachStdin": False,
|
||||
"AttachStderr": True, "AttachStdout": True,
|
||||
"StdinOnce": False,
|
||||
"OpenStdin": False, "NetworkDisabled": False,
|
||||
"MemorySwap": 0
|
||||
}
|
||||
|
||||
def test_ctor(self):
|
||||
|
|
@ -337,11 +336,10 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": false, "Memory": 0,
|
||||
"AttachStdin": false,
|
||||
"AttachStderr": true, "AttachStdout": true,
|
||||
"StdinOnce": false,
|
||||
"OpenStdin": false, "NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"OpenStdin": false, "NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -361,12 +359,11 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls", "/mnt"], "AttachStdin": false,
|
||||
"Volumes": {"/mnt": {}}, "Memory": 0,
|
||||
"Volumes": {"/mnt": {}},
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -386,12 +383,11 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls", "/mnt"], "AttachStdin": false,
|
||||
"Volumes": {"/mnt": {}}, "Memory": 0,
|
||||
"Volumes": {"/mnt": {}},
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -409,7 +405,7 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls"], "AttachStdin": false,
|
||||
"Memory": 0, "ExposedPorts": {
|
||||
"ExposedPorts": {
|
||||
"1111/tcp": {},
|
||||
"2222/udp": {},
|
||||
"3333/tcp": {}
|
||||
|
|
@ -417,8 +413,7 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -436,13 +431,11 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["hello"], "AttachStdin": false,
|
||||
"Memory": 0,
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"Entrypoint": "cowsay",
|
||||
"MemorySwap": 0}'''))
|
||||
"Entrypoint": "cowsay"}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -460,13 +453,11 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls"], "AttachStdin": false,
|
||||
"Memory": 0,
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"CpuShares": 5,
|
||||
"MemorySwap": 0}'''))
|
||||
"CpuShares": 5}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -484,14 +475,12 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls"], "AttachStdin": false,
|
||||
"Memory": 0,
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"Cpuset": "0,1",
|
||||
"CpusetCpus": "0,1",
|
||||
"MemorySwap": 0}'''))
|
||||
"CpusetCpus": "0,1"}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -509,13 +498,11 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls"], "AttachStdin": false,
|
||||
"Memory": 0,
|
||||
"AttachStderr": true,
|
||||
"AttachStdout": true, "OpenStdin": false,
|
||||
"StdinOnce": false,
|
||||
"NetworkDisabled": false,
|
||||
"WorkingDir": "/root",
|
||||
"MemorySwap": 0}'''))
|
||||
"WorkingDir": "/root"}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -531,11 +518,10 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": true, "Memory": 0,
|
||||
"AttachStdin": true,
|
||||
"AttachStderr": true, "AttachStdout": true,
|
||||
"StdinOnce": true,
|
||||
"OpenStdin": true, "NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"OpenStdin": true, "NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
||||
|
|
@ -581,78 +567,95 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
|
|||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": false, "Memory": 0,
|
||||
"AttachStdin": false,
|
||||
"AttachStderr": true, "AttachStdout": true,
|
||||
"StdinOnce": false,
|
||||
"OpenStdin": false, "NetworkDisabled": false,
|
||||
"MemorySwap": 0}'''))
|
||||
"OpenStdin": false, "NetworkDisabled": false}'''))
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
self.assertEqual(args[1]['params'], {'name': 'marisa-kirisame'})
|
||||
|
||||
def test_create_container_with_mem_limit_as_int(self):
|
||||
try:
|
||||
self.client.create_container('busybox', 'true',
|
||||
mem_limit=128.0)
|
||||
self.client.create_container(
|
||||
'busybox', 'true', host_config=create_host_config(
|
||||
mem_limit=128.0
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
data = json.loads(args[1]['data'])
|
||||
self.assertEqual(data['Memory'], 128.0)
|
||||
self.assertEqual(data['HostConfig']['Memory'], 128.0)
|
||||
|
||||
def test_create_container_with_mem_limit_as_string(self):
|
||||
try:
|
||||
self.client.create_container('busybox', 'true',
|
||||
mem_limit='128')
|
||||
self.client.create_container(
|
||||
'busybox', 'true', host_config=create_host_config(
|
||||
mem_limit='128'
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
data = json.loads(args[1]['data'])
|
||||
self.assertEqual(data['Memory'], 128.0)
|
||||
self.assertEqual(data['HostConfig']['Memory'], 128.0)
|
||||
|
||||
def test_create_container_with_mem_limit_as_string_with_k_unit(self):
|
||||
try:
|
||||
self.client.create_container('busybox', 'true',
|
||||
mem_limit='128k')
|
||||
self.client.create_container(
|
||||
'busybox', 'true', host_config=create_host_config(
|
||||
mem_limit='128k'
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
data = json.loads(args[1]['data'])
|
||||
self.assertEqual(data['Memory'], 128.0 * 1024)
|
||||
self.assertEqual(data['HostConfig']['Memory'], 128.0 * 1024)
|
||||
|
||||
def test_create_container_with_mem_limit_as_string_with_m_unit(self):
|
||||
try:
|
||||
self.client.create_container('busybox', 'true',
|
||||
mem_limit='128m')
|
||||
self.client.create_container(
|
||||
'busybox', 'true', host_config=create_host_config(
|
||||
mem_limit='128m'
|
||||
)
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
data = json.loads(args[1]['data'])
|
||||
self.assertEqual(data['Memory'], 128.0 * 1024 * 1024)
|
||||
self.assertEqual(data['HostConfig']['Memory'], 128.0 * 1024 * 1024)
|
||||
|
||||
def test_create_container_with_mem_limit_as_string_with_g_unit(self):
|
||||
try:
|
||||
self.client.create_container('busybox', 'true',
|
||||
mem_limit='128g')
|
||||
self.client.create_container(
|
||||
'busybox', 'true', host_config=create_host_config(
|
||||
mem_limit='128g'
|
||||
)
|
||||
)
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
data = json.loads(args[1]['data'])
|
||||
self.assertEqual(data['Memory'], 128.0 * 1024 * 1024 * 1024)
|
||||
self.assertEqual(
|
||||
data['HostConfig']['Memory'], 128.0 * 1024 * 1024 * 1024
|
||||
)
|
||||
|
||||
def test_create_container_with_mem_limit_as_string_with_wrong_value(self):
|
||||
self.assertRaises(docker.errors.DockerException,
|
||||
self.client.create_container,
|
||||
'busybox', 'true', mem_limit='128p')
|
||||
self.assertRaises(
|
||||
docker.errors.DockerException, create_host_config, mem_limit='128p'
|
||||
)
|
||||
|
||||
self.assertRaises(docker.errors.DockerException,
|
||||
self.client.create_container,
|
||||
'busybox', 'true', mem_limit='1f28')
|
||||
self.assertRaises(
|
||||
docker.errors.DockerException, create_host_config, mem_limit='1f28'
|
||||
)
|
||||
|
||||
def test_start_container(self):
|
||||
try:
|
||||
|
|
|
|||
Loading…
Reference in New Issue