Merge pull request #51724 from clinta/docker-create-with-ip

add networking_config to container create fixes #51723
This commit is contained in:
Shane Lee 2019-03-21 17:06:54 -06:00 committed by GitHub
commit d2fd84fca0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 0 deletions

View file

@ -846,6 +846,13 @@ def _get_create_kwargs(skip_translate=None,
Take input kwargs and return a kwargs dict to pass to docker-py's
create_container() function.
'''
networks = kwargs.pop('networks', {})
if kwargs.get('network_mode', '') in networks:
networks = {kwargs['network_mode']: networks[kwargs['network_mode']]}
else:
networks = {}
kwargs = __utils__['docker.translate_input'](
salt.utils.docker.translate.container,
skip_translate=skip_translate,
@ -853,6 +860,9 @@ def _get_create_kwargs(skip_translate=None,
validate_ip_addrs=validate_ip_addrs,
**__utils__['args.clean_kwargs'](**kwargs))
if networks:
kwargs['networking_config'] = _create_networking_config(networks)
if client_args is None:
try:
client_args = get_client_args(['create_container', 'host_config'])
@ -2388,6 +2398,11 @@ def version():
return ret
def _create_networking_config(networks):
log.debug("creating networking config from {}".format(networks))
return _client_wrapper('create_networking_config',
{k: _client_wrapper('create_endpoint_config', **v) for k, v in networks.items()})
# Functions to manage containers
@_refresh_mine_cache
def create(image,

View file

@ -1673,6 +1673,8 @@ def running(name,
try:
networks = _parse_networks(networks)
if networks:
kwargs['networks'] = networks
image_id = _resolve_image(ret, image, client_timeout)
except CommandExecutionError as exc:
ret['result'] = False

View file

@ -599,6 +599,33 @@ class DockerContainerTestCase(ModuleCase, SaltReturnAssertsMixin):
self.assertTrue('VAR2=value2' in ret['Config']['Env'])
self.assertTrue('VAR3=value3' not in ret['Config']['Env'])
@with_network(subnet='10.247.197.96/27', create=True)
@container_name
def test_static_ip_one_network(self, container_name, net):
'''
Ensure that if a network is created and specified as network_mode, that is the only network, and
the static IP is applied.
'''
requested_ip = '10.247.197.100'
kwargs = {
'name': container_name,
'image': self.image,
'network_mode': net.name,
'networks': [{net.name: [{'ipv4_address': requested_ip}]}],
'shutdown_timeout': 1,
}
# Create a container
ret = self.run_state('docker_container.running', **kwargs)
self.assertSaltTrueReturn(ret)
inspect_result = self.run_function('docker.inspect_container',
[container_name])
connected_networks = inspect_result['NetworkSettings']['Networks']
self.assertEqual(list(connected_networks.keys()), [net.name])
self.assertEqual(inspect_result['HostConfig']['NetworkMode'], net.name)
self.assertEqual(connected_networks[net.name]['IPAMConfig']['IPv4Address'], requested_ip)
def _test_running(self, container_name, *nets):
'''
DRY function for testing static IPs