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"
|
resourceName := "azurerm_subnet.test"
|
||||||
|
|
||||||
ri := acctest.RandInt()
|
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{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
|
|
@ -104,6 +104,14 @@ func resourceArmSubnetCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
properties.RouteTable = &network.RouteTable{
|
properties.RouteTable = &network.RouteTable{
|
||||||
ID: &rtId,
|
ID: &rtId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
routeTableName, err := parseRouteTableName(rtId)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
armMutexKV.Lock(routeTableName)
|
||||||
|
defer armMutexKV.Unlock(routeTableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
subnet := network.Subnet{
|
subnet := network.Subnet{
|
||||||
|
@ -201,6 +209,17 @@ func resourceArmSubnetDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
defer armMutexKV.Unlock(networkSecurityGroupName)
|
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)
|
armMutexKV.Lock(vnetName)
|
||||||
defer armMutexKV.Unlock(vnetName)
|
defer armMutexKV.Unlock(vnetName)
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
func TestAccAzureRMSubnet_basic(t *testing.T) {
|
func TestAccAzureRMSubnet_basic(t *testing.T) {
|
||||||
|
|
||||||
ri := acctest.RandInt()
|
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{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
@ -33,7 +33,7 @@ func TestAccAzureRMSubnet_basic(t *testing.T) {
|
||||||
func TestAccAzureRMSubnet_disappears(t *testing.T) {
|
func TestAccAzureRMSubnet_disappears(t *testing.T) {
|
||||||
|
|
||||||
ri := acctest.RandInt()
|
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{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
@ -152,5 +152,22 @@ resource "azurerm_subnet" "test" {
|
||||||
resource_group_name = "${azurerm_resource_group.test.name}"
|
resource_group_name = "${azurerm_resource_group.test.name}"
|
||||||
virtual_network_name = "${azurerm_virtual_network.test.name}"
|
virtual_network_name = "${azurerm_virtual_network.test.name}"
|
||||||
address_prefix = "10.0.2.0/24"
|
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]
|
key := components[current]
|
||||||
value := components[current+1]
|
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"
|
// 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
|
// value in the ID which is the case for the Service Bus subscription resource
|
||||||
if key == "subscriptions" && subscriptionID == "" {
|
if key == "subscriptions" && subscriptionID == "" {
|
||||||
|
@ -104,3 +109,12 @@ func parseNetworkSecurityGroupName(networkSecurityGroupId string) (string, error
|
||||||
|
|
||||||
return id.Path["networkSecurityGroups"], nil
|
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
|
expectedResourceID *ResourceID
|
||||||
expectError bool
|
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",
|
"random",
|
||||||
nil,
|
nil,
|
||||||
|
|
Loading…
Reference in New Issue