From fd2ea344445e6f70361d01abfc25236fd337a1ca Mon Sep 17 00:00:00 2001 From: Yunge Zhu <37337818+yungezz@users.noreply.github.com> Date: Sun, 28 Apr 2019 13:07:25 +0800 Subject: [PATCH] fix cross subs vnet peering (#55854) --- .../azure/azure_rm_virtualnetworkpeering.py | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/lib/ansible/modules/cloud/azure/azure_rm_virtualnetworkpeering.py b/lib/ansible/modules/cloud/azure/azure_rm_virtualnetworkpeering.py index 7b514641425..9838eb51123 100644 --- a/lib/ansible/modules/cloud/azure/azure_rm_virtualnetworkpeering.py +++ b/lib/ansible/modules/cloud/azure/azure_rm_virtualnetworkpeering.py @@ -108,6 +108,7 @@ id: try: from msrestazure.azure_exceptions import CloudError + from msrestazure.tools import is_valid_resource_id from msrest.polling import LROPoller except ImportError: # This is handled in azure_rm_common @@ -234,7 +235,7 @@ class AzureRMVirtualNetworkPeering(AzureRMModuleBase): self.fail('Resource group of virtual_network is not same as param resource_group') # parse remote virtual_network - self.remote_virtual_network = self.parse_resource_to_dict(self.remote_virtual_network) + self.remote_virtual_network = self.format_vnet_id(self.remote_virtual_network) # get vnet peering response = self.get_vnet_peering() @@ -248,9 +249,7 @@ class AzureRMVirtualNetworkPeering(AzureRMModuleBase): self.fail("Cannot update virtual_network of Virtual Network Peering!") # check remote vnet id not changed - exisiting_remote_vnet = self.parse_resource_to_dict(response['remote_virtual_network']) - if exisiting_remote_vnet['resource_group'] != self.remote_virtual_network['resource_group'] or \ - exisiting_remote_vnet['name'] != self.remote_virtual_network['name']: + if response['remote_virtual_network'].lower() != self.remote_virtual_network.lower(): self.fail("Cannot update remote_virtual_network of Virtual Network Peering!") # check if update @@ -266,12 +265,6 @@ class AzureRMVirtualNetworkPeering(AzureRMModuleBase): self.fail("Virtual network {0} in resource group {1} does not exist!".format( self.virtual_network['name'], self.virtual_network['resource_group'])) - # check if remote vnet exists - remote_virtual_network = self.get_vnet(self.remote_virtual_network['resource_group'], self.remote_virtual_network['name']) - if not remote_virtual_network: - self.fail("Virtual network {0} in resource group {1} does not exist!".format( - self.remote_virtual_network['name'], self.remote_virtual_network['resource_group'])) - elif self.state == 'absent': if response: self.log('Delete Azure Virtual Network Peering') @@ -297,6 +290,28 @@ class AzureRMVirtualNetworkPeering(AzureRMModuleBase): return self.results + def format_vnet_id(self, vnet): + if not vnet: + return vnet + if isinstance(vnet, dict) and vnet.get('name') and vnet.get('resource_group'): + remote_vnet_id = format_resource_id(vnet['name'], + self.subscription_id, + 'Microsoft.Network', + 'virtualNetworks', + vnet['resource_group']) + elif isinstance(vnet, str): + if is_valid_resource_id(vnet): + remote_vnet_id = vnet + else: + remote_vnet_id = format_resource_id(vnet, + self.subscription_id, + 'Microsoft.Network', + 'virtualNetworks', + self.resource_group) + else: + self.fail("remote_virtual_network could be a valid resource id, dict of name and resource_group, name of virtual network in same resource group.") + return remote_vnet_id + def check_update(self, exisiting_vnet_peering): if self.allow_forwarded_traffic != exisiting_vnet_peering['allow_forwarded_traffic']: return True @@ -334,15 +349,10 @@ class AzureRMVirtualNetworkPeering(AzureRMModuleBase): 'Microsoft.Network', 'virtualNetworks', self.virtual_network['resource_group']) - remote_vnet_id = format_resource_id(self.remote_virtual_network['name'], - self.subscription_id, - 'Microsoft.Network', - 'virtualNetworks', - self.remote_virtual_network['resource_group']) peering = self.network_models.VirtualNetworkPeering( id=vnet_id, name=self.name, - remote_virtual_network=self.network_models.SubResource(id=remote_vnet_id), + remote_virtual_network=self.network_models.SubResource(id=self.remote_virtual_network), allow_virtual_network_access=self.allow_virtual_network_access, allow_gateway_transit=self.allow_gateway_transit, allow_forwarded_traffic=self.allow_forwarded_traffic,