From c9cfc9be07361fc4db379fa3a386a73f83198c65 Mon Sep 17 00:00:00 2001 From: Andrew Klaus Date: Wed, 16 Aug 2017 12:32:13 -0600 Subject: [PATCH] os_recordset fix for names with multiple DNS record types (#19588) * Fix for os_recordset.py to filter based on record type. Fixes https://github.com/ansible/ansible/issues/19572 * remove redundant variable * Needing to use recordset ID to update and delete records. Using the record name for update/delete causes issues when A and AAAA records exist for a name * Adding exception handling for dictionary item --- .../modules/cloud/openstack/os_recordset.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/ansible/modules/cloud/openstack/os_recordset.py b/lib/ansible/modules/cloud/openstack/os_recordset.py index 211c3ff467..00de26ccaa 100644 --- a/lib/ansible/modules/cloud/openstack/os_recordset.py +++ b/lib/ansible/modules/cloud/openstack/os_recordset.py @@ -189,11 +189,22 @@ def main(): try: cloud = shade.openstack_cloud(**module.params) - recordset = cloud.get_recordset(zone, name + '.' + zone) + recordset_type = module.params.get('recordset_type') + recordset_filter = { 'type': recordset_type } + recordsets = cloud.search_recordsets(zone, name_or_id=name + '.' + zone, filters=recordset_filter) + + if len(recordsets) == 1: + recordset = recordsets[0] + try: + recordset_id = recordset['id'] + except KeyError as e: + module.fail_json(msg=str(e)) + else: + # recordsets is filtered by type and should never be more than 1 return + recordset = None if state == 'present': - recordset_type = module.params.get('recordset_type') records = module.params.get('records') description = module.params.get('description') ttl = module.params.get('ttl') @@ -219,10 +230,11 @@ def main(): zone, pre_update_recordset) if changed: zone = cloud.update_recordset( - zone, name + '.' + zone, + zone, recordset_id, records=records, description=description, ttl=ttl) + module.exit_json(changed=changed, recordset=recordset) elif state == 'absent': @@ -235,7 +247,7 @@ def main(): if recordset is None: changed=False else: - cloud.delete_recordset(zone, name + '.' + zone) + cloud.delete_recordset(zone, recordset_id) changed=True module.exit_json(changed=changed)