Last active
August 20, 2020 21:46
-
-
Save pa-yourserveradmin-com/f43219827dbabf33f43af2114838ee20 to your computer and use it in GitHub Desktop.
Patch to Ansible docker_swarm_service module which prevents Ansible from continuous attempts to update Swarm services which use host networks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- docker_swarm_service.py 2020-08-11 06:22:07.000000000 +0300 | |
+++ docker_swarm_service.py 2020-08-21 00:43:53.113259406 +0300 | |
@@ -1333,7 +1333,7 @@ | |
class DockerService(DockerBaseClass): | |
- def __init__(self, docker_api_version, docker_py_version): | |
+ def __init__(self, docker_api_version, docker_py_version, client): | |
super(DockerService, self).__init__() | |
self.image = "" | |
self.command = None | |
@@ -1389,6 +1389,8 @@ | |
self.docker_api_version = docker_api_version | |
self.docker_py_version = docker_py_version | |
+ self.client = client | |
+ | |
def get_facts(self): | |
return { | |
'image': self.image, | |
@@ -1659,8 +1661,9 @@ | |
network_ids, | |
docker_api_version, | |
docker_py_version, | |
+ client | |
): | |
- s = DockerService(docker_api_version, docker_py_version) | |
+ s = DockerService(docker_api_version, docker_py_version, client) | |
s.image = image_digest | |
s.args = ap['args'] | |
s.endpoint_mode = ap['endpoint_mode'] | |
@@ -1842,9 +1845,23 @@ | |
differences.add('configs', parameter=self.configs, active=os.configs) | |
if has_list_changed(self.secrets, os.secrets, sort_key='secret_name'): | |
differences.add('secrets', parameter=self.secrets, active=os.secrets) | |
+ | |
+ for s_n in self.networks: | |
+ new_network = self.client.get_network(network_id=s_n['id']) | |
+ if new_network['Driver'] == 'host' and new_network['Scope'] == 'local': | |
+ for old_network in os.networks: | |
+ old_network = self.client.get_network(network_id=old_network['id']) | |
+ if old_network['Name'] == new_network['Name']: | |
+ if old_network['Driver'] == new_network['Driver'] and old_network['Scope'] == 'swarm': | |
+ index = self.networks.index(s_n) | |
+ s_n['id'] = old_network['Id'] | |
+ self.networks[index] = s_n | |
+ break | |
+ | |
if have_networks_changed(self.networks, os.networks): | |
differences.add('networks', parameter=self.networks, active=os.networks) | |
needs_rebuild = not self.can_update_networks | |
+ | |
if self.replicas != os.replicas: | |
differences.add('replicas', parameter=self.replicas, active=os.replicas) | |
if has_list_changed(self.command, os.command, sort_lists=False): | |
@@ -2259,7 +2276,7 @@ | |
raw_data = self.client.inspect_service(name) | |
except NotFound: | |
return None | |
- ds = DockerService(self.client.docker_api_version, self.client.docker_py_version) | |
+ ds = DockerService(self.client.docker_api_version, self.client.docker_py_version, self.client) | |
task_template_data = raw_data['Spec']['TaskTemplate'] | |
ds.image = task_template_data['ContainerSpec']['Image'] | |
@@ -2573,6 +2590,7 @@ | |
secret_ids = self.get_missing_secret_ids() | |
config_ids = self.get_missing_config_ids() | |
network_ids = self.get_networks_names_ids() | |
+ | |
new_service = DockerService.from_ansible_params( | |
module.params, | |
current_service, | |
@@ -2581,7 +2599,8 @@ | |
config_ids, | |
network_ids, | |
self.client.docker_api_version, | |
- self.client.docker_py_version | |
+ self.client.docker_py_version, | |
+ self.client | |
) | |
except Exception as e: | |
return self.client.fail( |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment