Adds ulimit to the docker module

The ulimit will be specified as a list and separated by colons. The
hard limit is optional, in which case it is equal to the soft limit.

The ulimits are compared to the ulimits of the container and added
or adjusted accordingly on by a reload.

The module ensures that ulimits are available in the capabilities
iff ulimits is passes as a parameter.
This commit is contained in:
Daan Oosterveld 2016-02-09 10:19:59 +01:00
parent 08fd378479
commit 90153a2ca5

View file

@ -370,6 +370,14 @@ options:
required: false
default: 0
version_added: "2.1"
ulimits:
description:
- ulimits, list ulimits with name, soft and optionally
hard limit separated by colons. e.g. nofile:1024:2048
Requires docker-py >= 1.2.0 and docker >= 1.6.0
required: false
default: null
version_added: "2.1"
author:
- "Cove Schneider (@cove)"
@ -378,6 +386,7 @@ author:
- "Ash Wilson (@smashwilson)"
- "Thomas Steinbach (@ThomasSteinbach)"
- "Philippe Jandot (@zfil)"
- "Daan Oosterveld (@dusdanig)
requirements:
- "python >= 2.6"
- "docker-py >= 0.3.0"
@ -660,6 +669,7 @@ class DockerManager(object):
'read_only': ((1, 0, 0), '1.17'),
'labels': ((1, 2, 0), '1.18'),
'stop_timeout': ((0, 5, 0), '1.0'),
'ulimits': ((1, 2, 0), '1.18'),
# Clientside only
'insecure_registry': ((0, 5, 0), '0.0')
}
@ -714,6 +724,19 @@ class DockerManager(object):
self.env = self.module.params.get('env', None)
self.ulimits = None
if self.module.params.get('ulimits'):
self.ulimits = []
ulimits = self.module.params.get('ulimits')
for ulimit in ulimits:
parts = ulimit.split(":")
if len(parts) == 2:
self.ulimits.append({'name': parts[0], 'soft': int(parts[1]), 'hard': int(parts[1])})
elif len(parts) == 3:
self.ulimits.append({'name': parts[0], 'soft': int(parts[1]), 'hard': int(parts[2])})
else:
self.module.fail_json(msg='ulimits support 2 to 3 arguments')
# Connect to the docker server using any configured host and TLS settings.
env_host = os.getenv('DOCKER_HOST')
@ -1165,6 +1188,16 @@ class DockerManager(object):
differing.append(container)
continue
# ULIMITS
expected_ulimit_keys = set(map(lambda x: '%s:%s:%s' % (x['name'],x['soft'],x['hard']), self.ulimits or []))
actual_ulimit_keys = set(map(lambda x: '%s:%s:%s' % (x['Name'],x['Soft'],x['Hard']), (container['HostConfig']['Ulimits'] or [])))
if actual_ulimit_keys != expected_ulimit_keys:
self.reload_reasons.append('ulimits ({0} => {1})'.format(actual_ulimit_keys, expected_ulimit_keys))
differing.append(container)
continue
# CPU_SHARES
expected_cpu_shares = self.module.params.get('cpu_shares')
@ -1566,6 +1599,9 @@ class DockerManager(object):
else:
params['host_config']['Memory'] = mem_limit
if self.ulimits is not None:
self.ensure_capability('ulimits')
params['host_config']['ulimits'] = self.ulimits
def do_create(count, params):
results = []
@ -1813,6 +1849,7 @@ def main():
labels = dict(default={}, type='dict'),
stop_timeout = dict(default=10, type='int'),
timeout = dict(required=False, default=DEFAULT_TIMEOUT_SECONDS, type='int'),
ulimits = dict(default=None, type='list'),
),
required_together = (
['tls_client_cert', 'tls_client_key'],