summaryrefslogtreecommitdiff
path: root/lib/ansible/plugins/connection/docker.py
diff options
context:
space:
mode:
authorAdrian Likins <alikins@redhat.com>2016-08-22 10:39:38 -0400
committerGitHub <noreply@github.com>2016-08-22 10:39:38 -0400
commita4785c2691290df6047da5294632a8c428e67476 (patch)
tree6d0ab4fd7661959062268a68a0c13c00ca5b4b8c /lib/ansible/plugins/connection/docker.py
parent7ce4165671f3d3c66ad6be340375bd4847b10b7b (diff)
downloadansible-a4785c2691290df6047da5294632a8c428e67476.tar.gz
Fix docker connection plugin version tests and py2.6 compat (#16841)
* Rm py2.7+ code in docker connection plugin The docker connection plugin was using subprocess.check_output which only exists in python 2.7 and later. Connection plugins need to support python2.6 so this replaces it with Popen/communicate() * Handle docker ver errors in docker connection Add unit tests for DockerConnection Fixes #16971
Diffstat (limited to 'lib/ansible/plugins/connection/docker.py')
-rw-r--r--lib/ansible/plugins/connection/docker.py43
1 files changed, 29 insertions, 14 deletions
diff --git a/lib/ansible/plugins/connection/docker.py b/lib/ansible/plugins/connection/docker.py
index 62404fb43c..7db04cba3e 100644
--- a/lib/ansible/plugins/connection/docker.py
+++ b/lib/ansible/plugins/connection/docker.py
@@ -104,28 +104,43 @@ class Connection(ConnectionBase):
def _sanitize_version(version):
return re.sub('[^0-9a-zA-Z\.]', '', version)
- def _get_docker_version(self):
+ def _old_docker_version(self):
+ cmd_args = []
+ if self._play_context.docker_extra_args:
+ cmd_args += self._play_context.docker_extra_args.split(' ')
+
+ old_version_subcommand = ['version']
+
+ old_docker_cmd = [self.docker_cmd] + cmd_args + old_version_subcommand
+ p = subprocess.Popen(old_docker_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ cmd_output, err = p.communicate()
- cmd = [self.docker_cmd]
+ return old_docker_cmd, cmd_output, err, p.returncode
+ def _new_docker_version(self):
+ # no result yet, must be newer Docker version
+ cmd_args = []
if self._play_context.docker_extra_args:
- cmd += self._play_context.docker_extra_args.split(' ')
+ cmd_args += self._play_context.docker_extra_args.split(' ')
- cmd += ['version']
+ new_version_subcommand = ['version', '--format', "'{{.Server.Version}}'"]
- cmd_output = subprocess.check_output(cmd)
+ new_docker_cmd = [self.docker_cmd] + cmd_args + new_version_subcommand
+ p = subprocess.Popen(new_docker_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ cmd_output, err = p.communicate()
+ return new_docker_cmd, cmd_output, err, p.returncode
- for line in cmd_output.split('\n'):
- if line.startswith('Server version:'): # old docker versions
- return self._sanitize_version(line.split()[2])
+ def _get_docker_version(self):
- # no result yet, must be newer Docker version
- new_docker_cmd = [
- self.docker_cmd,
- 'version', '--format', "'{{.Server.Version}}'"
- ]
+ cmd, cmd_output, err, returncode = self._old_docker_version()
+ if returncode == 0:
+ for line in cmd_output.split('\n'):
+ if line.startswith('Server version:'): # old docker versions
+ return self._sanitize_version(line.split()[2])
- cmd_output = subprocess.check_output(new_docker_cmd)
+ cmd, cmd_output, err, returncode = self._new_docker_version()
+ if returncode:
+ raise AnsibleError('Docker version check (%s) failed: %s' % (cmd, err))
return self._sanitize_version(cmd_output)