Merge pull request #13791 from whiskeyjay/subnetRTFix

provider/azurerm: Locking route table on subnet create/delete
This commit is contained in:
Tom Harvey 2017-04-20 12:39:59 +01:00 committed by GitHub
commit 1775d48381
5 changed files with 65 additions and 3 deletions

View File

@ -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) },

View File

@ -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)

View File

@ -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"
}
`

View File

@ -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
}

View File

@ -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,