From 5b7963138097d94d799cfefbc10ad25b490db63a Mon Sep 17 00:00:00 2001 From: Zim Kalinowski Date: Wed, 20 Mar 2019 14:38:18 +0800 Subject: [PATCH] Getting latest API version if not specified in azure_rm_resource (#54022) --- .../modules/cloud/azure/azure_rm_resource.py | 23 ++++++++++++++++--- .../cloud/azure/azure_rm_resource_facts.py | 22 +++++++++++++++--- .../targets/azure_rm_resource/tasks/main.yml | 16 +++++++++++-- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/lib/ansible/modules/cloud/azure/azure_rm_resource.py b/lib/ansible/modules/cloud/azure/azure_rm_resource.py index d510c18cead..6ef23fce1f2 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_resource.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_resource.py @@ -30,7 +30,6 @@ options: api_version: description: - Specific API version to be used. - required: yes provider: description: - Provider type. @@ -163,8 +162,7 @@ class AzureRMResource(AzureRMModuleBase): default=[] ), api_version=dict( - type='str', - required=True + type='str' ), method=dict( type='str', @@ -260,6 +258,25 @@ class AzureRMResource(AzureRMModuleBase): if orphan is not None: self.url += '/' + orphan + + # if api_version was not specified, get latest one + if not self.api_version: + try: + # extract provider and resource type + if "/providers/" in self.url: + provider = self.url.split("/providers/")[1].split("/")[0] + resourceType = self.url.split(provider + "/")[1].split("/")[0] + url = "/subscriptions/" + self.subscription_id + "/providers/" + provider + api_versions = json.loads(self.mgmt_client.query(url, "GET", {'api-version': '2015-01-01'}, None, None, [200], 0, 0).text) + for rt in api_versions['resourceTypes']: + if rt['resourceType'].lower() == resourceType.lower(): + self.api_version = rt['apiVersions'][0] + break + if not self.api_version: + self.fail("Couldn't find api version for {0}/{1}".format(provider, resourceType)) + except Exception as exc: + self.fail("Failed to obtain API version: {0}".format(str(exc))) + query_parameters = {} query_parameters['api-version'] = self.api_version diff --git a/lib/ansible/modules/cloud/azure/azure_rm_resource_facts.py b/lib/ansible/modules/cloud/azure/azure_rm_resource_facts.py index 94251ce4618..c86c553e31a 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_resource_facts.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_resource_facts.py @@ -30,7 +30,6 @@ options: api_version: description: - Specific API version to be used. - required: yes provider: description: - Provider type, should be specified in no URL is given @@ -121,8 +120,7 @@ class AzureRMResourceFacts(AzureRMModuleBase): default=[] ), api_version=dict( - type='str', - required=True + type='str' ) ) # store the results of the module operation @@ -176,6 +174,24 @@ class AzureRMResourceFacts(AzureRMModuleBase): if orphan is not None: self.url += '/' + orphan + # if api_version was not specified, get latest one + if not self.api_version: + try: + # extract provider and resource type + if "/providers/" in self.url: + provider = self.url.split("/providers/")[1].split("/")[0] + resourceType = self.url.split(provider + "/")[1].split("/")[0] + url = "/subscriptions/" + self.subscription_id + "/providers/" + provider + api_versions = json.loads(self.mgmt_client.query(url, "GET", {'api-version': '2015-01-01'}, None, None, [200], 0, 0).text) + for rt in api_versions['resourceTypes']: + if rt['resourceType'].lower() == resourceType.lower(): + self.api_version = rt['apiVersions'][0] + break + if not self.api_version: + self.fail("Couldn't find api version for {0}/{1}".format(provider, resourceType)) + except Exception as exc: + self.fail("Failed to obtain API version: {0}".format(str(exc))) + self.results['url'] = self.url query_parameters = {} diff --git a/test/integration/targets/azure_rm_resource/tasks/main.yml b/test/integration/targets/azure_rm_resource/tasks/main.yml index 7db8f51ee83..920ffe45f85 100644 --- a/test/integration/targets/azure_rm_resource/tasks/main.yml +++ b/test/integration/targets/azure_rm_resource/tasks/main.yml @@ -86,6 +86,19 @@ - output.response[0]['name'] != None - output.response | length >= 1 +- name: Try to query a list - same without API version + azure_rm_resource_facts: + resource_group: "{{ resource_group }}" + provider: network + resource_type: networksecuritygroups + register: output +- name: Assert value was returned + assert: + that: + - not output.changed + - output.response[0]['name'] != None + - output.response | length >= 1 + - name: Create storage account that requires LRO polling azure_rm_resource: polling_timeout: 600 @@ -123,12 +136,11 @@ assert: that: keys['response']['keys'][0]['value'] | length > 0 -- name: Delete storage +- name: Delete storage - without API version azure_rm_resource: polling_timeout: 600 polling_interval: 60 method: DELETE - api_version: '2018-07-01' resource_group: "{{ resource_group }}" provider: Storage resource_type: storageAccounts