summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Meneguello <1322552+bkmeneguello@users.noreply.github.com>2020-03-02 19:52:19 -0300
committerGitHub <noreply@github.com>2020-03-02 14:52:19 -0800
commitcddecf8c056436292a5c62df790db03808666471 (patch)
tree8939ff26c92c6bab0bfd19adf6d8853600509bd0
parenta24dcf232c2eea2791f4b010da0dc5d0a84cbd9d (diff)
downloadansible-cddecf8c056436292a5c62df790db03808666471.tar.gz
Backport/2.9/60508 (#67531)
* route53: improve octal encoded characters handling * Update changelogs/fragments/60508-route53-improve-octal-characters-handling.yml Co-Authored-By: Felix Fontein <felix@fontein.de> Co-authored-by: Felix Fontein <felix@fontein.de>
-rw-r--r--changelogs/fragments/60508-route53-improve-octal-characters-handling.yml3
-rw-r--r--lib/ansible/modules/cloud/amazon/route53.py60
2 files changed, 37 insertions, 26 deletions
diff --git a/changelogs/fragments/60508-route53-improve-octal-characters-handling.yml b/changelogs/fragments/60508-route53-improve-octal-characters-handling.yml
new file mode 100644
index 0000000000..4f99f4474b
--- /dev/null
+++ b/changelogs/fragments/60508-route53-improve-octal-characters-handling.yml
@@ -0,0 +1,3 @@
+---
+bugfixes:
+- route53 - improve handling of octal encoded characters
diff --git a/lib/ansible/modules/cloud/amazon/route53.py b/lib/ansible/modules/cloud/amazon/route53.py
index fcc5c4cf4d..bc38c056e8 100644
--- a/lib/ansible/modules/cloud/amazon/route53.py
+++ b/lib/ansible/modules/cloud/amazon/route53.py
@@ -458,6 +458,37 @@ def invoke_with_throttling_retries(function_ref, *argv, **kwargs):
retries += 1
+def decode_name(name):
+ # Due to a bug in either AWS or Boto, "special" characters are returned as octals, preventing round
+ # tripping of things like * and @.
+ return name.encode().decode('unicode_escape')
+
+
+def to_dict(rset, zone_in, zone_id):
+ record = dict()
+ record['zone'] = zone_in
+ record['type'] = rset.type
+ record['record'] = decode_name(rset.name)
+ record['ttl'] = str(rset.ttl)
+ record['identifier'] = rset.identifier
+ record['weight'] = rset.weight
+ record['region'] = rset.region
+ record['failover'] = rset.failover
+ record['health_check'] = rset.health_check
+ record['hosted_zone_id'] = zone_id
+ if rset.alias_dns_name:
+ record['alias'] = True
+ record['value'] = rset.alias_dns_name
+ record['values'] = [rset.alias_dns_name]
+ record['alias_hosted_zone_id'] = rset.alias_hosted_zone_id
+ record['alias_evaluate_target_health'] = rset.alias_evaluate_target_health
+ else:
+ record['alias'] = False
+ record['value'] = ','.join(sorted(rset.resource_records))
+ record['values'] = sorted(rset.resource_records)
+ return record
+
+
def main():
argument_spec = ec2_argument_spec()
argument_spec.update(dict(
@@ -601,41 +632,18 @@ def main():
rset = invoke_with_throttling_retries(next, sets_iter)
except StopIteration:
break
- # Due to a bug in either AWS or Boto, "special" characters are returned as octals, preventing round
- # tripping of things like * and @.
- decoded_name = rset.name.replace(r'\052', '*')
- decoded_name = decoded_name.replace(r'\100', '@')
# Need to save this changes in rset, because of comparing rset.to_xml() == wanted_rset.to_xml() in next block
- rset.name = decoded_name
+ rset.name = decode_name(rset.name)
if identifier_in is not None:
identifier_in = str(identifier_in)
- if rset.type == type_in and decoded_name.lower() == record_in.lower() and rset.identifier == identifier_in:
+ if rset.type == type_in and rset.name.lower() == record_in.lower() and rset.identifier == identifier_in:
if need_to_sort_records:
# Sort records
rset.resource_records = sorted(rset.resource_records)
found_record = True
- record['zone'] = zone_in
- record['type'] = rset.type
- record['record'] = decoded_name
- record['ttl'] = rset.ttl
- record['identifier'] = rset.identifier
- record['weight'] = rset.weight
- record['region'] = rset.region
- record['failover'] = rset.failover
- record['health_check'] = rset.health_check
- record['hosted_zone_id'] = zone_id
- if rset.alias_dns_name:
- record['alias'] = True
- record['value'] = rset.alias_dns_name
- record['values'] = [rset.alias_dns_name]
- record['alias_hosted_zone_id'] = rset.alias_hosted_zone_id
- record['alias_evaluate_target_health'] = rset.alias_evaluate_target_health
- else:
- record['alias'] = False
- record['value'] = ','.join(sorted(rset.resource_records))
- record['values'] = sorted(rset.resource_records)
+ record = to_dict(rset, zone_in, zone_id)
if command_in == 'create' and rset.to_xml() == wanted_rset.to_xml():
module.exit_json(changed=False)