diff --git a/ansible/library/kolla_toolbox.py b/ansible/library/kolla_toolbox.py index 85c9fb2457..8873ea2156 100644 --- a/ansible/library/kolla_toolbox.py +++ b/ansible/library/kolla_toolbox.py @@ -16,7 +16,6 @@ import docker import json -import re from ansible.module_utils.basic import AnsibleModule @@ -90,13 +89,6 @@ EXAMPLES = ''' ''' -JSON_REG = re.compile('^(?P\w+) \| (?P\w+)!? =>(?P.*)$', - re.MULTILINE | re.DOTALL) -NON_JSON_REG = re.compile(('^(?P\w+) \| (?P\w+)!? \| ' - 'rc=(?P\d+) >>\n(?P.*)\n$'), - re.MULTILINE | re.DOTALL) - - def gen_commandline(params): command = ['ansible', 'localhost'] if params.get('module_name'): @@ -138,23 +130,43 @@ def main(): module.fail_json(msg='kolla_toolbox container is not running.') kolla_toolbox = kolla_toolbox[0] - job = client.exec_create(kolla_toolbox, command_line) - output = client.exec_start(job) + # Use the JSON output formatter, so that we can parse it. + environment = {"ANSIBLE_STDOUT_CALLBACK": "json", + "ANSIBLE_LOAD_CALLBACK_PLUGINS": "True"} + job = client.exec_create(kolla_toolbox, command_line, + environment=environment) + json_output = client.exec_start(job) - for exp in [JSON_REG, NON_JSON_REG]: - m = exp.match(output) - if m: - inner_output = m.groupdict().get('stdout') - break - else: - module.fail_json( - msg='Can not parse the inner module output: %s' % output) - - ret = dict() try: - ret = json.loads(inner_output) - except ValueError: - ret['stdout'] = inner_output + output = json.loads(json_output) + except Exception as e: + module.fail_json( + msg='Can not parse the inner module output: %s' % json_output) + + # Expected format is the following: + # { + # "plays": [ + # { + # "tasks": [ + # { + # "hosts": { + # "localhost": { + # + # } + # } + # } + # ] + # { + # ] + # } + try: + ret = output['plays'][0]['tasks'][0]['hosts']['localhost'] + except (KeyError, IndexError) as e: + module.fail_json( + msg='Ansible JSON output has unexpected format: %s' % output) + + # Remove Ansible's internal variables from returned fields. + ret.pop('_ansible_no_log', None) module.exit_json(**ret) diff --git a/tests/test-kolla-toolbox.yml b/tests/test-kolla-toolbox.yml new file mode 100644 index 0000000000..50a60afdeb --- /dev/null +++ b/tests/test-kolla-toolbox.yml @@ -0,0 +1,81 @@ +--- +- name: Test the kolla_toolbox module + hosts: localhost + gather_facts: false + tasks: + - name: Test successful & unchanged + kolla_toolbox: + module_name: debug + module_args: + msg: hi + register: result + + - name: Assert result is successful + assert: + that: result is successful + + - name: Assert result is not changed + assert: + that: result is not changed + + - name: Test successful & changed + kolla_toolbox: + module_name: command + module_args: + echo hi + register: result + + - name: Assert result is successful + assert: + that: result is successful + + - name: Assert result is changed + assert: + that: result is changed + + - name: Test unsuccessful + kolla_toolbox: + module_name: command + module_args: + foo + register: result + ignore_errors: true + + - name: Assert result is failed + assert: + that: result is failed + + - name: Test invalid module parameters + kolla_toolbox: + module_name: debug + module_args: + foo: bar + register: result + ignore_errors: true + + - name: Assert result is failed + assert: + that: result is failed + + - name: Setup for Test successful & changed (JSON format) + kolla_toolbox: + module_name: file + module_args: + path: /tmp/foo + state: absent + + - name: Test successful & changed (JSON format) + kolla_toolbox: + module_name: file + module_args: + path: /tmp/foo + state: directory + register: result + + - name: Assert result is successful + assert: + that: result is successful + + - name: Assert result is changed + assert: + that: result is changed