From f1a5c411d9beef3d9a29a9529c7e8dfcbeebf7b6 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Thu, 29 Apr 2021 15:12:23 -0400 Subject: [PATCH] Fix sequence lookup message and add tests (#74472) * add test for bad kv arg value * add simple form parsing tests and make error messages the same * add changelog --- .../fragments/74472-sequence-lookup.yaml | 3 + lib/ansible/plugins/lookup/sequence.py | 6 +- .../targets/lookup_sequence/tasks/main.yml | 135 ++++++++++++++++++ 3 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/74472-sequence-lookup.yaml diff --git a/changelogs/fragments/74472-sequence-lookup.yaml b/changelogs/fragments/74472-sequence-lookup.yaml new file mode 100644 index 00000000000..0694fc4ff17 --- /dev/null +++ b/changelogs/fragments/74472-sequence-lookup.yaml @@ -0,0 +1,3 @@ +bugfixes: + - sequence - fix error message so that unrecognized options to the plugin display correctly as a list + and normalize error messages. diff --git a/lib/ansible/plugins/lookup/sequence.py b/lib/ansible/plugins/lookup/sequence.py index e2ea2194913..7dac37bd528 100644 --- a/lib/ansible/plugins/lookup/sequence.py +++ b/lib/ansible/plugins/lookup/sequence.py @@ -159,15 +159,15 @@ class LookupModule(LookupBase): setattr(self, arg, arg_cooked) except ValueError: raise AnsibleError( - "can't parse arg %s=%r as integer" + "can't parse %s=%s as integer" % (arg, arg_raw) ) if 'format' in args: self.format = args.pop("format") if args: raise AnsibleError( - "unrecognized arguments to with_sequence: %r" - % args.keys() + "unrecognized arguments to with_sequence: %s" + % list(args.keys()) ) def parse_simple_args(self, term): diff --git a/test/integration/targets/lookup_sequence/tasks/main.yml b/test/integration/targets/lookup_sequence/tasks/main.yml index 72181a42b8b..bd0a4d80795 100644 --- a/test/integration/targets/lookup_sequence/tasks/main.yml +++ b/test/integration/targets/lookup_sequence/tasks/main.yml @@ -61,3 +61,138 @@ - "ws_z_6 == 'stride_6'" - "ws_z_host07 == 'host07'" - "ws_z_host08 == 'host08'" + +- block: + - name: EXPECTED FAILURE - test invalid arg + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=0 junk=3 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test invalid arg" + - ansible_failed_result.msg in [expected1, expected2] + vars: + expected1: "unrecognized arguments to with_sequence: ['junk']" + expected2: "unrecognized arguments to with_sequence: [u'junk']" + +- block: + - name: EXPECTED FAILURE - test bad kv value + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=A end=3 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test bad kv value" + - ansible_failed_result.msg == "can't parse start=A as integer" + +- block: + - name: EXPECTED FAILURE - test bad simple form start value + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: A-4/2 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test bad simple form start value" + - ansible_failed_result.msg == "can't parse start=A as integer" + +- block: + - name: EXPECTED FAILURE - test bad simple form end value + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: 1-B/2 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test bad simple form end value" + - ansible_failed_result.msg == "can't parse end=B as integer" + +- block: + - name: EXPECTED FAILURE - test bad simple form stride value + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: 1-4/C + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test bad simple form stride value" + - ansible_failed_result.msg == "can't parse stride=C as integer" + +- block: + - name: EXPECTED FAILURE - test no count or end + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=1 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test no count or end" + - ansible_failed_result.msg == "must specify count or end in with_sequence" + +- block: + - name: EXPECTED FAILURE - test both count and end + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=1 end=4 count=2 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test both count and end" + - ansible_failed_result.msg == "can't specify both count and end in with_sequence" + +- block: + - name: EXPECTED FAILURE - test count backwards message + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=4 end=1 stride=2 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test count backwards message" + - ansible_failed_result.msg == "to count backwards make stride negative" + +- block: + - name: EXPECTED FAILURE - test count forward message + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=1 end=4 stride=-2 + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test count forward message" + - ansible_failed_result.msg == "to count forward don't make stride negative" + +- block: + - name: EXPECTED FAILURE - test bad format string message + set_fact: "{{ 'x' + item }}={{ item }}" + with_sequence: start=1 end=4 format=d + + - fail: + msg: "should not get here" + rescue: + - assert: + that: + - ansible_failed_task.name == "EXPECTED FAILURE - test bad format string message" + - ansible_failed_result.msg == expected + vars: + expected: "bad formatting string: d" \ No newline at end of file