mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
Merge pull request #42006 from redmatter/fix-dockerng-network-matching-2017.7
Fix dockerng.network_* name matching
This commit is contained in:
commit
7d385f8bdc
2 changed files with 70 additions and 4 deletions
|
@ -90,8 +90,20 @@ def present(name, driver=None, containers=None):
|
|||
# map containers to container's Ids.
|
||||
containers = [__salt__['docker.inspect_container'](c)['Id'] for c in containers]
|
||||
networks = __salt__['docker.networks'](names=[name])
|
||||
log.trace(
|
||||
'docker_network.present: current networks: {0}'.format(networks)
|
||||
)
|
||||
|
||||
# networks will contain all Docker networks which partially match 'name'.
|
||||
# We need to loop through to find the matching network, if there is one.
|
||||
network = None
|
||||
if networks:
|
||||
network = networks[0] # we expect network's name to be unique
|
||||
for network_iter in networks:
|
||||
if network_iter['Name'] == name:
|
||||
network = network_iter
|
||||
break
|
||||
|
||||
if network is not None:
|
||||
if all(c in network['Containers'] for c in containers):
|
||||
ret['result'] = True
|
||||
ret['comment'] = 'Network \'{0}\' already exists.'.format(name)
|
||||
|
@ -154,7 +166,20 @@ def absent(name, driver=None):
|
|||
'comment': ''}
|
||||
|
||||
networks = __salt__['docker.networks'](names=[name])
|
||||
if not networks:
|
||||
log.trace(
|
||||
'docker_network.absent: current networks: {0}'.format(networks)
|
||||
)
|
||||
|
||||
# networks will contain all Docker networks which partially match 'name'.
|
||||
# We need to loop through to find the matching network, if there is one.
|
||||
network = None
|
||||
if networks:
|
||||
for network_iter in networks:
|
||||
if network_iter['Name'] == name:
|
||||
network = network_iter
|
||||
break
|
||||
|
||||
if network is None:
|
||||
ret['result'] = True
|
||||
ret['comment'] = 'Network \'{0}\' already absent'.format(name)
|
||||
return ret
|
||||
|
|
|
@ -43,10 +43,18 @@ class DockerNetworkTestCase(TestCase, LoaderModuleMockMixin):
|
|||
docker_create_network = Mock(return_value='created')
|
||||
docker_connect_container_to_network = Mock(return_value='connected')
|
||||
docker_inspect_container = Mock(return_value={'Id': 'abcd'})
|
||||
# Get docker.networks to return a network with a name which is a superset of the name of
|
||||
# the network which is to be created, despite this network existing we should still expect
|
||||
# that the new network will be created.
|
||||
# Regression test for #41982.
|
||||
docker_networks = Mock(return_value=[{
|
||||
'Name': 'network_foobar',
|
||||
'Containers': {'container': {}}
|
||||
}])
|
||||
__salt__ = {'docker.create_network': docker_create_network,
|
||||
'docker.inspect_container': docker_inspect_container,
|
||||
'docker.connect_container_to_network': docker_connect_container_to_network,
|
||||
'docker.networks': Mock(return_value=[]),
|
||||
'docker.networks': docker_networks,
|
||||
}
|
||||
with patch.dict(docker_state.__dict__,
|
||||
{'__salt__': __salt__}):
|
||||
|
@ -69,10 +77,14 @@ class DockerNetworkTestCase(TestCase, LoaderModuleMockMixin):
|
|||
'''
|
||||
docker_remove_network = Mock(return_value='removed')
|
||||
docker_disconnect_container_from_network = Mock(return_value='disconnected')
|
||||
docker_networks = Mock(return_value=[{
|
||||
'Name': 'network_foo',
|
||||
'Containers': {'container': {}}
|
||||
}])
|
||||
__salt__ = {
|
||||
'docker.remove_network': docker_remove_network,
|
||||
'docker.disconnect_container_from_network': docker_disconnect_container_from_network,
|
||||
'docker.networks': Mock(return_value=[{'Containers': {'container': {}}}]),
|
||||
'docker.networks': docker_networks,
|
||||
}
|
||||
with patch.dict(docker_state.__dict__,
|
||||
{'__salt__': __salt__}):
|
||||
|
@ -85,3 +97,32 @@ class DockerNetworkTestCase(TestCase, LoaderModuleMockMixin):
|
|||
'changes': {'disconnected': 'disconnected',
|
||||
'removed': 'removed'},
|
||||
'result': True})
|
||||
|
||||
def test_absent_with_matching_network(self):
|
||||
'''
|
||||
Test docker_network.absent when the specified network does not exist,
|
||||
but another network with a name which is a superset of the specified
|
||||
name does exist. In this case we expect there to be no attempt to remove
|
||||
any network.
|
||||
Regression test for #41982.
|
||||
'''
|
||||
docker_remove_network = Mock(return_value='removed')
|
||||
docker_disconnect_container_from_network = Mock(return_value='disconnected')
|
||||
docker_networks = Mock(return_value=[{
|
||||
'Name': 'network_foobar',
|
||||
'Containers': {'container': {}}
|
||||
}])
|
||||
__salt__ = {
|
||||
'docker.remove_network': docker_remove_network,
|
||||
'docker.disconnect_container_from_network': docker_disconnect_container_from_network,
|
||||
'docker.networks': docker_networks,
|
||||
}
|
||||
with patch.dict(docker_state.__dict__,
|
||||
{'__salt__': __salt__}):
|
||||
ret = docker_state.absent('network_foo')
|
||||
docker_disconnect_container_from_network.assert_not_called()
|
||||
docker_remove_network.assert_not_called()
|
||||
self.assertEqual(ret, {'name': 'network_foo',
|
||||
'comment': 'Network \'network_foo\' already absent',
|
||||
'changes': {},
|
||||
'result': True})
|
||||
|
|
Loading…
Add table
Reference in a new issue