podman_image_info - Do not fail when nonexistant image name is provided (#57962)

* Account for older versions of Podman lacking 'exists'
This commit is contained in:
Sam Doran 2019-06-26 17:04:26 -04:00 committed by GitHub
parent 3fc0694ffc
commit 9ba7015458
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 12 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- podman_image_facts - do not fail if invalid or non-existant image name is provided (https://github.com/ansible/ansible/issues/57899)

View file

@ -154,20 +154,49 @@ import json
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
def get_image_info(module, executable, name): def image_exists(module, executable, name):
command = [executable, 'image', 'exists', name]
if not isinstance(name, list):
name = [name]
command = [executable, 'image', 'inspect']
command.extend(name)
rc, out, err = module.run_command(command) rc, out, err = module.run_command(command)
if rc == 1:
return False
elif 'Command "exists" not found' in err:
# The 'exists' test is available in podman >= 0.12.1
command = [executable, 'image', 'ls', '-q', name]
rc2, out2, err2 = module.run_command(command)
if rc2 != 0:
return False
return True
if rc != 0:
module.fail_json(msg="Unable to gather info for '{0}': {1}".format(', '.join(name), err))
return out def filter_invalid_names(module, executable, name):
valid_names = []
names = name
if not isinstance(name, list):
names = [name]
for name in names:
if image_exists(module, executable, name):
valid_names.append(name)
return valid_names
def get_image_info(module, executable, name):
names = name
if not isinstance(name, list):
names = [name]
if len(names) > 0:
command = [executable, 'image', 'inspect']
command.extend(names)
rc, out, err = module.run_command(command)
if rc != 0:
module.fail_json(msg="Unable to gather info for '{0}': {1}".format(', '.join(names), err))
return out
else:
return json.dumps([])
def get_all_image_info(module, executable): def get_all_image_info(module, executable):
@ -193,7 +222,8 @@ def main():
executable = module.get_bin_path(executable, required=True) executable = module.get_bin_path(executable, required=True)
if name: if name:
results = json.loads(get_image_info(module, executable, name)) valid_names = filter_invalid_names(module, executable, name)
results = json.loads(get_image_info(module, executable, valid_names))
else: else:
results = json.loads(get_all_image_info(module, executable)) results = json.loads(get_all_image_info(module, executable))

View file

@ -24,3 +24,30 @@
- all_image_result.images | length > 0 - all_image_result.images | length > 0
- named_image_result.images | length == 1 - named_image_result.images | length == 1
- "'dnsmasq' in named_image_result.images[0]['RepoTags'][0]" - "'dnsmasq' in named_image_result.images[0]['RepoTags'][0]"
- name: Get info on single image that does not exist
podman_image_info:
name: nope
register: single_nonexistant
- name: Get info on multiple images that do not exist
podman_image_info:
name:
- nope
- reallynope
register: multiple_nonexistant
- name: Get info with one image that does not exist
podman_image_info:
name:
- dnsmasq
- nope
- etcd
register: mixed_nonexistant
- name: Ensure image info was returned when non-existant image info was requisted
assert:
that:
- single_nonexistant.images | length == 0
- multiple_nonexistant.images | length == 0
- mixed_nonexistant.images | length == 2