summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToshio Kuratomi <toshio@fedoraproject.org>2015-01-26 20:37:20 -0800
committerJames Cammarata <jimi@sngx.net>2015-02-17 14:01:42 -0600
commitac0de5a9db56ac01c1f5261897cff2f139314d15 (patch)
treebb7c4f37ec5e5eea6a2669b86b34f94f7ba0a2f7
parent8b8700d36517de3fa88a5c5d6afd5337473d54f6 (diff)
downloadansible-ac0de5a9db56ac01c1f5261897cff2f139314d15.tar.gz
jinja2 cannot handle byte strs with non-ascii. So we need to transform potential byte str into unicode type. This fix is for dynamic inventory.
Fixes #10007 Conflicts: v2/ansible/inventory/script.py v2/ansible/module_utils/basic.py
-rw-r--r--lib/ansible/callbacks.py2
-rw-r--r--lib/ansible/inventory/script.py4
-rw-r--r--lib/ansible/module_utils/basic.py18
3 files changed, 22 insertions, 2 deletions
diff --git a/lib/ansible/callbacks.py b/lib/ansible/callbacks.py
index a4b62fb005..6469401c92 100644
--- a/lib/ansible/callbacks.py
+++ b/lib/ansible/callbacks.py
@@ -456,6 +456,8 @@ class PlaybookRunnerCallbacks(DefaultRunnerCallbacks):
item = None
if type(results) == dict:
item = results.get('item', None)
+ host = utils.to_bytes(host)
+ results = utils.to_bytes(results)
if item:
msg = "fatal: [%s] => (item=%s) => %s" % (host, item, results)
else:
diff --git a/lib/ansible/inventory/script.py b/lib/ansible/inventory/script.py
index 6239be0140..c599791e7d 100644
--- a/lib/ansible/inventory/script.py
+++ b/lib/ansible/inventory/script.py
@@ -22,7 +22,7 @@ import subprocess
import ansible.constants as C
from ansible.inventory.host import Host
from ansible.inventory.group import Group
-from ansible.module_utils.basic import json_dict_unicode_to_bytes
+from ansible.module_utils.basic import json_dict_bytes_to_unicode
from ansible import utils
from ansible import errors
import sys
@@ -55,7 +55,7 @@ class InventoryScript(object):
# not passing from_remote because data from CMDB is trusted
self.raw = utils.parse_json(self.data)
- self.raw = json_dict_unicode_to_bytes(self.raw)
+ self.raw = json_dict_bytes_to_unicode(self.raw)
all = Group('all')
groups = dict(all=all)
diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py
index 6707381f53..61b5b68b3b 100644
--- a/lib/ansible/module_utils/basic.py
+++ b/lib/ansible/module_utils/basic.py
@@ -251,6 +251,24 @@ def json_dict_unicode_to_bytes(d):
else:
return d
+def json_dict_bytes_to_unicode(d):
+ ''' Recursively convert dict keys and values to byte str
+
+ Specialized for json return because this only handles, lists, tuples,
+ and dict container types (the containers that the json module returns)
+ '''
+
+ if isinstance(d, str):
+ return unicode(d, 'utf-8')
+ elif isinstance(d, dict):
+ return dict(map(json_dict_bytes_to_unicode, d.iteritems()))
+ elif isinstance(d, list):
+ return list(map(json_dict_bytes_to_unicode, d))
+ elif isinstance(d, tuple):
+ return tuple(map(json_dict_bytes_to_unicode, d))
+ else:
+ return d
+
class AnsibleModule(object):