From 3bee4752a3eb0e37797af14464d755269ad399ab Mon Sep 17 00:00:00 2001 From: techcon65 Date: Tue, 3 Aug 2021 16:43:57 +0530 Subject: [PATCH 1/2] Added metadata support for dnsrecordset --- plugins/modules/azure_rm_dnsrecordset.py | 64 ++++++++++++++++--- plugins/modules/azure_rm_dnsrecordset_info.py | 14 +++- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/plugins/modules/azure_rm_dnsrecordset.py b/plugins/modules/azure_rm_dnsrecordset.py index ab170bbad..9beb4a1fb 100644 --- a/plugins/modules/azure_rm_dnsrecordset.py +++ b/plugins/modules/azure_rm_dnsrecordset.py @@ -24,14 +24,17 @@ description: - Name of resource group. required: true + type: str zone_name: description: - Name of the existing DNS zone in which to manage the record set. required: true + type: str relative_name: description: - Relative name of the record set. required: true + type: str record_type: description: - The type of record set to create or delete. @@ -47,10 +50,12 @@ - CAA - SOA required: true + type: str record_mode: description: - Whether existing record values not sent to the module should be purged. default: purge + type: str choices: - append - purge @@ -58,16 +63,28 @@ description: - Assert the state of the record set. Use C(present) to create or update and C(absent) to delete. default: present + type: str choices: - absent - present + metadata: + description: + - The metadata tags for the record sets. + type: dict + append_metadata: + description: Whether metadata should be appended or not + type: bool + default: True time_to_live: description: - Time to live of the record set in seconds. default: 3600 + type: int records: description: - List of records to be created depending on the type of record (set). + type: list + elements: dict suboptions: preference: description: @@ -183,43 +200,43 @@ fqdn: description: - Fully qualified domain name of the record set. - return: always + returned: always type: str sample: www.b57dc95985712e4523282.com etag: description: - The etag of the record set. - return: always + returned: always type: str sample: 692c3e92-a618-46fc-aecd-8f888807cd6c provisioning_state: description: - The DNS record set state. - return: always + returned: always type: str sample: Succeeded target_resource: description: - The target resource of the record set. - return: always + returned: always type: dict sample: {} ttl: description: - The TTL(time-to-live) of the records in the records set. - return: always + returned: always type: int sample: 3600 type: description: - The type of DNS record in this record set. - return: always + returned: always type: str sample: A arecords: description: - A list of records in the record set. - return: always + returned: always type: list sample: [ { @@ -236,6 +253,7 @@ import inspect import sys +import copy from ansible.module_utils.basic import _load_params from ansible.module_utils.six import iteritems @@ -324,7 +342,9 @@ def __init__(self): record_mode=dict(choices=['append', 'purge'], default='purge'), state=dict(choices=['present', 'absent'], default='present', type='str'), time_to_live=dict(type='int', default=3600), - records=dict(type='list', elements='dict') + records=dict(type='list', elements='dict'), + metadata=dict(type='dict'), + append_metadata=dict(type='bool', default=True) ) required_if = [ @@ -352,6 +372,7 @@ def __init__(self): self.state = None self.time_to_live = None self.records = None + self.metadata = None # rerun validation and actually run the module this time super(AzureRMRecordSet, self).__init__(self.module_arg_spec, required_if=required_if, supports_check_mode=True) @@ -392,7 +413,11 @@ def exec_module(self, **kwargs): # also check top-level recordset properties changed |= record_set.ttl != self.time_to_live - # FUTURE: add metadata/tag check on recordset + old_metadata = self.results['state']['metadata'] if 'metadata' in self.results['state'] else dict() + update_metadata, self.results['state']['metadata'] = self.update_metadata(old_metadata) + if update_metadata: + changed = True + self.metadata = self.results['state']['metadata'] self.results['changed'] |= changed @@ -412,6 +437,8 @@ def exec_module(self, **kwargs): record_set_args[record_type_metadata['attrname']] = self.input_sdk_records if record_type_metadata['is_list'] else self.input_sdk_records[0] record_set = self.dns_models.RecordSet(**record_set_args) + if self.metadata: + record_set.metadata = self.metadata self.results['state'] = self.create_or_update(record_set) @@ -472,6 +499,25 @@ def recordset_to_dict(self, recordset): result['type'] = result['type'].strip('Microsoft.Network/dnszones/') return result + def update_metadata(self, metadata): + metadata = metadata or dict() + new_metadata = copy.copy(metadata) if isinstance(metadata, dict) else dict() + param_metadata = self.metadata if isinstance(self.metadata, dict) else dict() + append_metadata = self.append_metadata if self.metadata is not None else True + changed = False + # check add or update metadata + for key, value in param_metadata.items(): + if not new_metadata.get(key) or new_metadata[key] != value: + changed = True + new_metadata[key] = value + # check remove + if not append_metadata: + for key, value in metadata.items(): + if not param_metadata.get(key): + new_metadata.pop(key) + changed = True + return changed, new_metadata + def main(): AzureRMRecordSet() diff --git a/plugins/modules/azure_rm_dnsrecordset_info.py b/plugins/modules/azure_rm_dnsrecordset_info.py index 17058b598..8b33ce5d4 100644 --- a/plugins/modules/azure_rm_dnsrecordset_info.py +++ b/plugins/modules/azure_rm_dnsrecordset_info.py @@ -22,15 +22,19 @@ relative_name: description: - Only show results for a Record Set. + type: str resource_group: description: - Limit results by resource group. Required when filtering by name or type. + type: str zone_name: description: - Limit results by zones. Required when filtering by name or type. + type: str record_type: description: - Limit record sets by record type. + type: str top: description: - Limit the maximum number of record sets to return. @@ -96,24 +100,29 @@ id: description: - ID of the dns recordset. + type: str sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/dnszones/newzone. com/A/servera" relative_name: description: - Name of the dns recordset. + type: str sample: servera record_type: description: - The type of the record set. - Can be C(A), C(AAAA), C(CNAME), C(MX), C(NS), C(SRV), C(TXT), C(PTR). + type: str sample: A time_to_live: description: - Time to live of the record set in seconds. + type: int sample: 12900 records: description: - List of records depending on the type of recordset. + type: dict sample: [ { "ipv4Address": "10.4.5.7" @@ -125,10 +134,12 @@ provisioning_state: description: - Provision state of the resource. + type: str sample: Successed fqdn: description: - Fully qualified domain name of the record set. + type: str sample: www.newzone.com ''' @@ -281,7 +292,8 @@ def record_to_dict(self, record): records=[x.as_dict() for x in records], time_to_live=record.ttl, fqdn=record.fqdn, - provisioning_state=record.provisioning_state + provisioning_state=record.provisioning_state, + metadata=record.metadata ) From 63eeb06e12de77afdce8e91694900d86d9cf8e14 Mon Sep 17 00:00:00 2001 From: techcon65 Date: Mon, 9 Aug 2021 13:39:55 +0530 Subject: [PATCH 2/2] Addressed review comments --- plugins/modules/azure_rm_dnsrecordset.py | 11 +++++++++++ tests/sanity/ignore-2.10.txt | 6 ------ tests/sanity/ignore-2.11.txt | 6 ------ tests/sanity/ignore-2.12.txt | 6 ------ tests/sanity/ignore-2.9.txt | 3 --- 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/plugins/modules/azure_rm_dnsrecordset.py b/plugins/modules/azure_rm_dnsrecordset.py index 9beb4a1fb..40d4b891a 100644 --- a/plugins/modules/azure_rm_dnsrecordset.py +++ b/plugins/modules/azure_rm_dnsrecordset.py @@ -132,6 +132,17 @@ zone_name: testing.com state: absent +- name: create A record set with metadata information + azure_rm_dnsrecordset: + resource_group: myResourceGroup + relative_name: www + zone_name: zone1.com + record_type: A + records: + - entry: 192.168.100.104 + metadata: + key1: "value1" + - name: create multiple "A" record sets with multiple records azure_rm_dnsrecordset: resource_group: myResourceGroup diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt index fe4e61dd7..8c30df62d 100644 --- a/tests/sanity/ignore-2.10.txt +++ b/tests/sanity/ignore-2.10.txt @@ -52,13 +52,7 @@ plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-do plugins/modules/azure_rm_deployment.py validate-modules:return-syntax-error plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_deployment_info.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type -plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnsrecordset.py validate-modules:invalid-ansiblemodule-schema -plugins/modules/azure_rm_dnsrecordset.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:return-syntax-error plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt index 4b4dba7af..f60c5ba6d 100644 --- a/tests/sanity/ignore-2.11.txt +++ b/tests/sanity/ignore-2.11.txt @@ -53,13 +53,7 @@ plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-do plugins/modules/azure_rm_deployment.py validate-modules:return-syntax-error plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_deployment_info.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type -plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnsrecordset.py validate-modules:invalid-ansiblemodule-schema -plugins/modules/azure_rm_dnsrecordset.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:return-syntax-error plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec diff --git a/tests/sanity/ignore-2.12.txt b/tests/sanity/ignore-2.12.txt index 947aa8f8c..279ad35cc 100644 --- a/tests/sanity/ignore-2.12.txt +++ b/tests/sanity/ignore-2.12.txt @@ -52,13 +52,7 @@ plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-do plugins/modules/azure_rm_deployment.py validate-modules:return-syntax-error plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_deployment_info.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type -plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnsrecordset.py validate-modules:invalid-ansiblemodule-schema -plugins/modules/azure_rm_dnsrecordset.py validate-modules:return-syntax-error -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:return-syntax-error plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone.py validate-modules:doc-elements-mismatch plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index b4b10b032..9e029591d 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -32,9 +32,6 @@ plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:undoc plugins/modules/azure_rm_datalakestore.py validate-modules:nonexistent-parameter-documented plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type -plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-type-not-in-doc