From c33810f5cee2a54956d98c1153f0dbae6b6ed30f Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Fri, 14 Apr 2017 15:19:22 -0700 Subject: [PATCH 1/2] Updated test to include the scenario --- .../azurerm/resource_arm_subnet_test.go | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/builtin/providers/azurerm/resource_arm_subnet_test.go b/builtin/providers/azurerm/resource_arm_subnet_test.go index 5f1f2bcbe..264b0a540 100644 --- a/builtin/providers/azurerm/resource_arm_subnet_test.go +++ b/builtin/providers/azurerm/resource_arm_subnet_test.go @@ -13,7 +13,7 @@ import ( func TestAccAzureRMSubnet_basic(t *testing.T) { ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri) + config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri, ri, ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -33,7 +33,7 @@ func TestAccAzureRMSubnet_basic(t *testing.T) { func TestAccAzureRMSubnet_disappears(t *testing.T) { ri := acctest.RandInt() - config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri) + config := fmt.Sprintf(testAccAzureRMSubnet_basic, ri, ri, ri, ri, ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -152,5 +152,22 @@ resource "azurerm_subnet" "test" { resource_group_name = "${azurerm_resource_group.test.name}" virtual_network_name = "${azurerm_virtual_network.test.name}" address_prefix = "10.0.2.0/24" + route_table_id = "${azurerm_route_table.test.id}" +} + +resource "azurerm_route_table" "test" { + name = "acctestroutetable%d" + resource_group_name = "${azurerm_resource_group.test.name}" + location = "West US" +} + +resource "azurerm_route" "test" { + name = "acctestroute%d" + resource_group_name = "${azurerm_resource_group.test.name}" + route_table_name = "${azurerm_route_table.test.name}" + + address_prefix = "10.100.0.0/14" + next_hop_type = "VirtualAppliance" + next_hop_in_ip_address = "10.10.1.1" } ` From 279b00dd12cafc4b54dc6612373312bc449678a9 Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Fri, 14 Apr 2017 16:50:46 -0700 Subject: [PATCH 2/2] Lock Route Table / Subnets --- .../providers/azurerm/resource_arm_subnet.go | 21 +++++++++++++++++++ builtin/providers/azurerm/resourceid.go | 10 +++++++++ 2 files changed, 31 insertions(+) diff --git a/builtin/providers/azurerm/resource_arm_subnet.go b/builtin/providers/azurerm/resource_arm_subnet.go index c5329b9f8..769e7ebd8 100644 --- a/builtin/providers/azurerm/resource_arm_subnet.go +++ b/builtin/providers/azurerm/resource_arm_subnet.go @@ -96,6 +96,15 @@ func resourceArmSubnetCreate(d *schema.ResourceData, meta interface{}) error { properties.RouteTable = &network.RouteTable{ ID: &rtId, } + + routeTableName, err := parseRouteTableName(rtId) + + if err != nil { + return err + } + + armMutexKV.Lock(routeTableName) + defer armMutexKV.Unlock(routeTableName) } subnet := network.Subnet{ @@ -182,6 +191,18 @@ func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error { name := id.Path["subnets"] vnetName := id.Path["virtualNetworks"] + if v, ok := d.GetOk("route_table_id"); ok { + rtId := v.(string) + routeTableName, err := parseRouteTableName(rtId) + + if err != nil { + return err + } + + armMutexKV.Lock(routeTableName) + defer armMutexKV.Unlock(routeTableName) + } + armMutexKV.Lock(vnetName) defer armMutexKV.Unlock(vnetName) diff --git a/builtin/providers/azurerm/resourceid.go b/builtin/providers/azurerm/resourceid.go index b05f4d75f..af0f35091 100644 --- a/builtin/providers/azurerm/resourceid.go +++ b/builtin/providers/azurerm/resourceid.go @@ -95,3 +95,13 @@ func parseAzureResourceID(id string) (*ResourceID, error) { return idObj, nil } + +func parseRouteTableName(routeTableId string) (string, error) { + id, err := parseAzureResourceID(routeTableId) + + if err != nil { + return "", fmt.Errorf("[ERROR] Unable to parse Route Table ID '%s': %+v", routeTableId, err) + } + + return id.Path["routeTables"], nil +}