summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2018-10-22 10:27:52 -0500
committerToshio Kuratomi <a.badger@gmail.com>2018-10-22 16:32:26 -0700
commit0e933f76ba4edb0e06f0779f5fb4b0ea85191e8b (patch)
treecebdede99aa5cce9463af2697be49f53e4d32b82
parentce16286dee0af539749ea776b13e10cca7eb4c3c (diff)
downloadansible-0e933f76ba4edb0e06f0779f5fb4b0ea85191e8b.tar.gz
[stable-2.7] Handle sets differently than lists in wrap_var. Fixes #47372.
(cherry picked from commit c58de75f385dcfcef0531fc7c0cbb13bfdef0e83) Co-authored-by: Matt Martz <matt@sivel.net>
-rw-r--r--changelogs/fragments/unsafe-set-wrap.yaml2
-rw-r--r--lib/ansible/utils/unsafe_proxy.py8
-rw-r--r--test/integration/targets/loops/tasks/main.yml10
3 files changed, 19 insertions, 1 deletions
diff --git a/changelogs/fragments/unsafe-set-wrap.yaml b/changelogs/fragments/unsafe-set-wrap.yaml
new file mode 100644
index 0000000000..5e3a491632
--- /dev/null
+++ b/changelogs/fragments/unsafe-set-wrap.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+- unsafe - Add special casing to sets, to support wrapping elements of sets correctly in Python 3 (https://github.com/ansible/ansible/issues/47372)
diff --git a/lib/ansible/utils/unsafe_proxy.py b/lib/ansible/utils/unsafe_proxy.py
index 963798a087..9f7de697e4 100644
--- a/lib/ansible/utils/unsafe_proxy.py
+++ b/lib/ansible/utils/unsafe_proxy.py
@@ -96,11 +96,17 @@ def _wrap_list(v):
return v
+def _wrap_set(v):
+ return set(item if item is None else wrap_var(item) for item in v)
+
+
def wrap_var(v):
if isinstance(v, Mapping):
v = _wrap_dict(v)
- elif isinstance(v, (MutableSequence, Set)):
+ elif isinstance(v, MutableSequence):
v = _wrap_list(v)
+ elif isinstance(v, Set):
+ v = _wrap_set(v)
elif v is not None and not isinstance(v, AnsibleUnsafe):
v = UnsafeProxy(v)
return v
diff --git a/test/integration/targets/loops/tasks/main.yml b/test/integration/targets/loops/tasks/main.yml
index 1b8a745050..423a8b3ad2 100644
--- a/test/integration/targets/loops/tasks/main.yml
+++ b/test/integration/targets/loops/tasks/main.yml
@@ -252,3 +252,13 @@
loop: "{{ fake_var }}"
register: result
failed_when: result is not skipped
+
+# https://github.com/ansible/ansible/issues/47372
+- name: Loop unsafe list
+ debug:
+ var: item
+ with_items: "{{ things|map('string')|unique }}"
+ vars:
+ things:
+ - !unsafe foo
+ - !unsafe bar