diff options
author | Adrian Likins <alikins@redhat.com> | 2016-08-22 10:39:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-22 10:39:38 -0400 |
commit | a4785c2691290df6047da5294632a8c428e67476 (patch) | |
tree | 6d0ab4fd7661959062268a68a0c13c00ca5b4b8c /lib/ansible/plugins/connection/docker.py | |
parent | 7ce4165671f3d3c66ad6be340375bd4847b10b7b (diff) | |
download | ansible-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.py | 43 |
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) |