docker_swarm_service: use exact name match when finding services (#50665)

* docker_swarm_service: use exact name match when finding services

The Docker API's filtering support allows filtering for substring
matches which means that when we filter the list of running services we
may accidentally match a service called "foobar" when looking for a
service named "foo".

Fix this by filtering the list of services returned from the Docker API
so that name matches are exact. It is still worth passing the filter
parameter to the Docker API because it reduces the number of results
passed back which may be important for remote Docker connections.

Closes 50654.

* add changelog fragment for #50654
This commit is contained in:
Rich Wareham 2019-01-14 11:00:34 +00:00 committed by René Moser
parent cde292cc43
commit fd32760d7a
2 changed files with 12 additions and 1 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- "docker_swarm_service - fix use of Docker API so that services are not detected as present if there is an existing service whose name is a substring of the desired service"

View file

@ -875,7 +875,16 @@ class DockerServiceManager():
return [{'name': n['Name'], 'id': n['Id']} for n in self.client.networks()] return [{'name': n['Name'], 'id': n['Id']} for n in self.client.networks()]
def get_service(self, name): def get_service(self, name):
raw_data = self.client.services(filters={'name': name}) # The Docker API allows filtering services by name but the filter looks
# for a substring match, not an exact match. (Filtering for "foo" would
# return information for services "foobar" and "foobuzz" even if the
# service "foo" doesn't exist.) Avoid incorrectly determining that a
# service is present by filtering the list of services returned from the
# Docker API so that the name must be an exact match.
raw_data = [
service for service in self.client.services(filters={'name': name})
if service['Spec']['Name'] == name
]
if len(raw_data) == 0: if len(raw_data) == 0:
return None return None