Merge pull request #13791 from whiskeyjay/subnetRTFix
provider/azurerm: Locking route table on subnet create/delete
This commit is contained in:
commit
1775d48381
|
@ -12,7 +12,7 @@ func TestAccAzureRMSubnet_importBasic(t *testing.T) {
|
|||
resourceName := "azurerm_subnet.test"
|
||||
|
||||
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) },
|
||||
|
|
|
@ -104,6 +104,14 @@ 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{
|
||||
|
@ -201,6 +209,17 @@ func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error {
|
|||
defer armMutexKV.Unlock(networkSecurityGroupName)
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
`
|
||||
|
|
|
@ -53,6 +53,11 @@ func parseAzureResourceID(id string) (*ResourceID, error) {
|
|||
key := components[current]
|
||||
value := components[current+1]
|
||||
|
||||
// Check key/value for empty strings.
|
||||
if key == "" || value == "" {
|
||||
return nil, fmt.Errorf("Key/Value cannot be empty strings. Key: '%s', Value: '%s'", key, value)
|
||||
}
|
||||
|
||||
// Catch the subscriptionID before it can be overwritten by another "subscriptions"
|
||||
// value in the ID which is the case for the Service Bus subscription resource
|
||||
if key == "subscriptions" && subscriptionID == "" {
|
||||
|
@ -104,3 +109,12 @@ func parseNetworkSecurityGroupName(networkSecurityGroupId string) (string, error
|
|||
|
||||
return id.Path["networkSecurityGroups"], 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
|
||||
}
|
||||
|
|
|
@ -11,6 +11,18 @@ func TestParseAzureResourceID(t *testing.T) {
|
|||
expectedResourceID *ResourceID
|
||||
expectError bool
|
||||
}{
|
||||
{
|
||||
// Missing "resourceGroups".
|
||||
"/subscriptions/00000000-0000-0000-0000-000000000000//myResourceGroup/",
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
{
|
||||
// Empty resource group ID.
|
||||
"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups//",
|
||||
nil,
|
||||
true,
|
||||
},
|
||||
{
|
||||
"random",
|
||||
nil,
|
||||
|
|
Loading…
Reference in New Issue