Merge "container_manage: catch more containers with wrong return code"
This commit is contained in:
commit
b0bfed7732
|
@ -197,7 +197,8 @@ class FilterModule(object):
|
||||||
|
|
||||||
return to_delete
|
return to_delete
|
||||||
|
|
||||||
def haskey(self, data, attribute, value=None, reverse=False, any=False):
|
def haskey(self, data, attribute, value=None, reverse=False, any=False,
|
||||||
|
excluded_keys=[]):
|
||||||
"""Return dict data with a specific key.
|
"""Return dict data with a specific key.
|
||||||
|
|
||||||
This filter will take a list of dictionaries (data)
|
This filter will take a list of dictionaries (data)
|
||||||
|
@ -207,10 +208,21 @@ class FilterModule(object):
|
||||||
which have the attribute.
|
which have the attribute.
|
||||||
If any is set to True, the returned list will match any value in
|
If any is set to True, the returned list will match any value in
|
||||||
the list of values for "value" parameter which has to be a list.
|
the list of values for "value" parameter which has to be a list.
|
||||||
|
If we want to exclude items which have certain key(s); these keys
|
||||||
|
should be added to the excluded_keys list. If excluded_keys is used
|
||||||
|
with reverse, we'll just exclude the items which had a key from
|
||||||
|
excluded_keys in the reversed list.
|
||||||
"""
|
"""
|
||||||
return_list = []
|
return_list = []
|
||||||
for i in data:
|
for i in data:
|
||||||
|
to_skip = False
|
||||||
for k, v in json.loads(json.dumps(i)).items():
|
for k, v in json.loads(json.dumps(i)).items():
|
||||||
|
for e in excluded_keys:
|
||||||
|
if e in v:
|
||||||
|
to_skip = True
|
||||||
|
break
|
||||||
|
if to_skip:
|
||||||
|
break
|
||||||
if attribute in v and not reverse:
|
if attribute in v and not reverse:
|
||||||
if value is None:
|
if value is None:
|
||||||
return_list.append(i)
|
return_list.append(i)
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
tripleo_container_manage_debug: true
|
tripleo_container_manage_debug: true
|
||||||
tripleo_container_manage_config_patterns: '*.json'
|
tripleo_container_manage_config_patterns: '*.json'
|
||||||
tripleo_container_manage_systemd_order: true
|
tripleo_container_manage_systemd_order: true
|
||||||
|
tripleo_container_manage_valid_exit_code: [0]
|
||||||
tasks:
|
tasks:
|
||||||
- include_role:
|
- include_role:
|
||||||
name: tripleo_container_manage
|
name: tripleo_container_manage
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
{
|
{
|
||||||
"image": "fedora:latest",
|
"image": "fedora:latest",
|
||||||
"net": "host",
|
"net": "host",
|
||||||
"command": "sleep 3600"
|
"command": "sleep 5"
|
||||||
}
|
}
|
||||||
dest: '/tmp/container-configs/fedora_bis.json'
|
dest: '/tmp/container-configs/fedora_bis.json'
|
||||||
- name: Create a third configuration file for a fedora container
|
- name: Create a third configuration file for a fedora container
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
{
|
{
|
||||||
"image": "fedora:latest",
|
"image": "fedora:latest",
|
||||||
"net": "host",
|
"net": "host",
|
||||||
"command": "sleep 3600"
|
"command": "sleep 5"
|
||||||
}
|
}
|
||||||
dest: '/tmp/container-configs/fedora_three.json'
|
dest: '/tmp/container-configs/fedora_three.json'
|
||||||
- name: Create old healthcheck service for fedora container
|
- name: Create old healthcheck service for fedora container
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
- name: "Wait for containers to be exited"
|
- name: "Wait for containers to be exited"
|
||||||
podman_container_info:
|
podman_container_info:
|
||||||
name: "{{ batched_container_data | haskey(attribute='action', reverse=True) | list_of_keys }}"
|
name: "{{ containers_with_exit_code }}"
|
||||||
register: podman_containers_infos
|
register: podman_containers_infos
|
||||||
until: ( podman_containers_infos.containers | selectattr('State.Running', 'equalto', True) |list|length ) == 0
|
until: ( podman_containers_infos.containers | selectattr('State.Running', 'equalto', True) |list|length ) == 0
|
||||||
# Retry 30 times every 10 seconds so we wait 5 min in total
|
# Retry 30 times every 10 seconds so we wait 5 min in total
|
||||||
|
|
|
@ -97,10 +97,11 @@
|
||||||
when:
|
when:
|
||||||
- not ansible_check_mode|bool
|
- not ansible_check_mode|bool
|
||||||
|
|
||||||
- name: "Create facts for containers which changed or failed"
|
- name: "Create facts for containers which changed or failed or which require rc check"
|
||||||
set_fact:
|
set_fact:
|
||||||
containers_changed: "{{ create_async_poll_results.results | get_changed_containers }}"
|
containers_changed: "{{ create_async_poll_results.results | get_changed_containers }}"
|
||||||
containers_failed: "{{ create_async_poll_results.results | get_failed_containers }}"
|
containers_failed: "{{ create_async_poll_results.results | get_failed_containers }}"
|
||||||
|
containers_to_check: "{{ batched_container_data | haskey(attribute='command', excluded_keys=['action', 'restart']) | list_of_keys | default([]) }}"
|
||||||
|
|
||||||
- name: Print the containers that failed to start
|
- name: Print the containers that failed to start
|
||||||
fail:
|
fail:
|
||||||
|
@ -120,6 +121,9 @@
|
||||||
|
|
||||||
- name: "Block for container exit codes"
|
- name: "Block for container exit codes"
|
||||||
when:
|
when:
|
||||||
- tripleo_container_manage_valid_exit_code|length != 0
|
|
||||||
- not ansible_check_mode|bool
|
- not ansible_check_mode|bool
|
||||||
|
- tripleo_container_manage_valid_exit_code|length != 0
|
||||||
|
- containers_to_check|length != 0
|
||||||
include_tasks: podman/check_exit_code.yml
|
include_tasks: podman/check_exit_code.yml
|
||||||
|
vars:
|
||||||
|
containers_with_exit_code: "{{ containers_to_check }}"
|
||||||
|
|
|
@ -200,6 +200,90 @@ class TestHelperFilters(tests_base.TestCase):
|
||||||
attribute='restart', value='always')
|
attribute='restart', value='always')
|
||||||
self.assertEqual(result, expected_list)
|
self.assertEqual(result, expected_list)
|
||||||
|
|
||||||
|
def test_haskey_exclude(self):
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
'keystone': {
|
||||||
|
'start_order': 1,
|
||||||
|
'image': 'quay.io/tripleo/keystone',
|
||||||
|
'command': 'sleep 10',
|
||||||
|
'restart': 'always'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'nova': {
|
||||||
|
'start_order': 1,
|
||||||
|
'image': 'quay.io/tripleo/nova',
|
||||||
|
'command': 'sleep 10',
|
||||||
|
'action': 'exec'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'mysql': {
|
||||||
|
'start_order': 0,
|
||||||
|
'command': 'sleep 10',
|
||||||
|
'image': 'quay.io/tripleo/mysql'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'haproxy': {
|
||||||
|
'start_order': 0,
|
||||||
|
'image': 'quay.io/tripleo/haproxy'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
expected_list = [
|
||||||
|
{
|
||||||
|
'mysql': {
|
||||||
|
'start_order': 0,
|
||||||
|
'command': 'sleep 10',
|
||||||
|
'image': 'quay.io/tripleo/mysql'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
result = self.filters.haskey(data=data,
|
||||||
|
attribute='command',
|
||||||
|
excluded_keys=['action', 'restart'])
|
||||||
|
self.assertEqual(result, expected_list)
|
||||||
|
|
||||||
|
def test_haskey_reverse_exclude(self):
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
'keystone': {
|
||||||
|
'start_order': 1,
|
||||||
|
'image': 'quay.io/tripleo/keystone',
|
||||||
|
'restart': 'always'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'nova': {
|
||||||
|
'start_order': 1,
|
||||||
|
'image': 'quay.io/tripleo/nova',
|
||||||
|
'action': 'exec'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'mysql': {
|
||||||
|
'start_order': 0,
|
||||||
|
'image': 'quay.io/tripleo/mysql'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
expected_list = [
|
||||||
|
{
|
||||||
|
'mysql': {
|
||||||
|
'start_order': 0,
|
||||||
|
'image': 'quay.io/tripleo/mysql'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
result = self.filters.haskey(data=data,
|
||||||
|
attribute='restart',
|
||||||
|
value='always',
|
||||||
|
reverse=True,
|
||||||
|
excluded_keys=['action'])
|
||||||
|
self.assertEqual(result, expected_list)
|
||||||
|
|
||||||
def test_haskey_reverse(self):
|
def test_haskey_reverse(self):
|
||||||
data = [
|
data = [
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue