From d3b4b58a4772c19c0995149e5a423395deb44073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Wed, 26 Feb 2020 19:01:39 +0100 Subject: [PATCH 01/17] Adds Resource azurerm_app_service_virtual_network_swift_connection_slot --- CHANGELOG.md | 4 + azurerm/internal/services/web/registration.go | 27 +- ...ervice_virtual_network_swift_connection.go | 16 +- ...e_virtual_network_swift_connection_slot.go | 216 +++++++++++++ ...e_slot_virtual_network_association_test.go | 285 ++++++++++++++++++ ...ervice_virtual_network_association_test.go | 1 + ...etwork_swift_connection_slot.html.markdown | 109 +++++++ 7 files changed, 637 insertions(+), 21 deletions(-) create mode 100644 azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go create mode 100644 azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go create mode 100644 website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown diff --git a/CHANGELOG.md b/CHANGELOG.md index e59f9b33c11e..3086467be72c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,6 +120,10 @@ FEATURES: * **New Resource:** `azurerm_dev_test_global_shutdown_schedule` ([#5536](https://github.com/terraform-providers/terraform-provider-azurerm/issues/5536)) * **New Resource:** `azurerm_nat_gateway_public_ip_association` ([#6450](https://github.com/terraform-providers/terraform-provider-azurerm/issues/6450)) +FEATURES: + +* **New Resource:** `azurerm_app_service_virtual_network_swift_connection_slot` [GH-5458] + IMPROVEMENTS: * Data Source: `azurerm_kubernetes_cluster` - exposing the `oms_agent_identity` block within the `addon_profile` block ([#7056](https://github.com/terraform-providers/terraform-provider-azurerm/issues/7056)) diff --git a/azurerm/internal/services/web/registration.go b/azurerm/internal/services/web/registration.go index fbfabf656b54..b9e6c48ae7f6 100644 --- a/azurerm/internal/services/web/registration.go +++ b/azurerm/internal/services/web/registration.go @@ -33,18 +33,19 @@ func (r Registration) SupportedDataSources() map[string]*schema.Resource { // SupportedResources returns the supported Resources supported by this Service func (r Registration) SupportedResources() map[string]*schema.Resource { return map[string]*schema.Resource{ - "azurerm_app_service_active_slot": resourceArmAppServiceActiveSlot(), - "azurerm_app_service_certificate": resourceArmAppServiceCertificate(), - "azurerm_app_service_certificate_order": resourceArmAppServiceCertificateOrder(), - "azurerm_app_service_custom_hostname_binding": resourceArmAppServiceCustomHostnameBinding(), - "azurerm_app_service_environment": resourceArmAppServiceEnvironment(), - "azurerm_app_service_hybrid_connection": resourceArmAppServiceHybridConnection(), - "azurerm_app_service_plan": resourceArmAppServicePlan(), - "azurerm_app_service_slot": resourceArmAppServiceSlot(), - "azurerm_app_service_source_control_token": resourceArmAppServiceSourceControlToken(), - "azurerm_app_service_virtual_network_swift_connection": resourceArmAppServiceVirtualNetworkSwiftConnection(), - "azurerm_app_service": resourceArmAppService(), - "azurerm_function_app": resourceArmFunctionApp(), - "azurerm_function_app_slot": resourceArmFunctionAppSlot(), + "azurerm_app_service_active_slot": resourceArmAppServiceActiveSlot(), + "azurerm_app_service_certificate": resourceArmAppServiceCertificate(), + "azurerm_app_service_certificate_order": resourceArmAppServiceCertificateOrder(), + "azurerm_app_service_custom_hostname_binding": resourceArmAppServiceCustomHostnameBinding(), + "azurerm_app_service_environment": resourceArmAppServiceEnvironment(), + "azurerm_app_service_hybrid_connection": resourceArmAppServiceHybridConnection(), + "azurerm_app_service_plan": resourceArmAppServicePlan(), + "azurerm_app_service_slot": resourceArmAppServiceSlot(), + "azurerm_app_service_source_control_token": resourceArmAppServiceSourceControlToken(), + "azurerm_app_service_virtual_network_swift_connection": resourceArmAppServiceVirtualNetworkSwiftConnection(), + "azurerm_app_service_virtual_network_swift_connection_slot": resourceArmAppServiceVirtualNetworkSwiftConnectionSlot(), + "azurerm_app_service": resourceArmAppService(), + "azurerm_function_app": resourceArmFunctionApp(), + "azurerm_function_app_slot": resourceArmFunctionAppSlot(), } } diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go index 47c6963be53b..6cda31ada4da 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go @@ -4,13 +4,13 @@ import ( "fmt" "time" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" - "github.com/Azure/azure-sdk-for-go/services/web/mgmt/2019-08-01/web" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -60,7 +60,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionCreateUpdate(d *schema.Re } subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) } resourceGroup := id.ResourceGroup name := id.Path["sites"] @@ -119,19 +119,19 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionRead(d *schema.ResourceDa } return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", name, resourceGroup, err) } - resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + swiftVnet, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) if err != nil { - if utils.ResponseWasNotFound(resp.Response) { + if utils.ResponseWasNotFound(swiftVnet.Response) { d.SetId("") return nil } return fmt.Errorf("Error retrieving App Service VNet association for %q (Resource Group %q): %s", name, resourceGroup, err) } - if resp.SwiftVirtualNetworkProperties == nil { + if swiftVnet.SwiftVirtualNetworkProperties == nil { return fmt.Errorf("Error retrieving virtual network properties (App Service %q / Resource Group %q): `properties` was nil", name, resourceGroup) } - props := *resp.SwiftVirtualNetworkProperties + props := *swiftVnet.SwiftVirtualNetworkProperties subnetID := props.SubnetResourceID if subnetID == nil || *subnetID == "" { d.SetId("") @@ -153,7 +153,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionDelete(d *schema.Resource } subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) } resourceGroup := id.ResourceGroup name := id.Path["sites"] diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go new file mode 100644 index 000000000000..6410796049db --- /dev/null +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go @@ -0,0 +1,216 @@ +package web + +import ( + "fmt" + "time" + + "github.com/Azure/azure-sdk-for-go/services/web/mgmt/2019-08-01/web" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func resourceArmAppServiceVirtualNetworkSwiftConnectionSlot() *schema.Resource { + return &schema.Resource{ + Create: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate, + Read: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead, + Update: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate, + Delete: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(30 * time.Minute), + Read: schema.DefaultTimeout(5 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(30 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "app_service_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: azure.ValidateResourceID, + }, + "subnet_id": { + Type: schema.TypeString, + Required: true, + ForceNew: false, + ValidateFunc: azure.ValidateResourceID, + }, + "slot_name": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + }, + }, + } +} + +func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Web.AppServicesClient + ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) + } + resourceGroup := id.ResourceGroup + name := id.Path["sites"] + subnetName := subnetID.Path["subnets"] + virtualNetworkName := subnetID.Path["virtualNetworks"] + slotName := d.Get("slot_name").(string) + + locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) + defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) + + locks.ByName(subnetName, network.SubnetResourceName) + defer locks.UnlockByName(subnetName, network.SubnetResourceName) + + appServiceExists, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(appServiceExists.Response) { + return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): App Service not found in resource group", name, resourceGroup) + } + return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", name, resourceGroup, err) + } + + slotExists, err := client.GetSlot(ctx, resourceGroup, name, slotName) + if err != nil { + if utils.ResponseWasNotFound(slotExists.Response) { + return fmt.Errorf("Error retrieving existing App Service Slot %q (App Service %q / Resource Group %q): App Service not found in resource group", slotName, name, resourceGroup) + } + return fmt.Errorf("Error retrieving existing App Service Slot %q (App Service %q / Resource Group %q): %s", slotName, name, resourceGroup, err) + } + + connectionEnvelope := web.SwiftVirtualNetwork{ + SwiftVirtualNetworkProperties: &web.SwiftVirtualNetworkProperties{ + SubnetResourceID: utils.String(d.Get("subnet_id").(string)), + }, + } + if _, err = client.CreateOrUpdateSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, connectionEnvelope, slotName); err != nil { + return fmt.Errorf("Error creating/updating App Service Slot VNet association between %q (App Service %q / Resource Group %q) and Virtual Network %q: %s", slotName, name, resourceGroup, virtualNetworkName, err) + } + + read, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + if err != nil { + return fmt.Errorf("Error retrieving App Service Slot VNet association between %q (App Service %q / Resource Group %q) and Virtual Network %q: %s", slotName, name, resourceGroup, virtualNetworkName, err) + } + d.SetId(*read.ID) + + return resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d, meta) +} + +func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Web.AppServicesClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseAzureResourceID(d.Id()) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + resourceGroup := id.ResourceGroup + name := id.Path["sites"] + slotName := id.Path["slots"] + + slot, err := client.GetSlot(ctx, resourceGroup, name, slotName) + if err != nil { + if utils.ResponseWasNotFound(slot.Response) { + d.SetId("") + return nil + } + return fmt.Errorf("Error retrieving existing App Service Slot %q (App Service %q / Resource Group %q): %s", slotName, name, resourceGroup, err) + } + appService, err := client.Get(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(appService.Response) { + d.SetId("") + return nil + } + return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", name, resourceGroup, err) + } + swiftVnet, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + if err != nil { + if utils.ResponseWasNotFound(swiftVnet.Response) { + d.SetId("") + return nil + } + return fmt.Errorf("Error retrieving App Service Slot VNet association for %q (App Service %q / Resource Group %q): %s", slotName, name, resourceGroup, err) + } + + if swiftVnet.SwiftVirtualNetworkProperties == nil { + return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", slotName, name, resourceGroup) + } + props := *swiftVnet.SwiftVirtualNetworkProperties + subnetID := props.SubnetResourceID + if subnetID == nil || *subnetID == "" { + d.SetId("") + return nil + } + d.Set("subnet_id", subnetID) + d.Set("app_service_id", appService.ID) + d.Set("slot_name", slot.Name) + return nil +} + +func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Web.AppServicesClient + ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) + defer cancel() + + id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) + } + slotName := d.Get("slot_name").(string) + resourceGroup := id.ResourceGroup + name := id.Path["sites"] + subnetName := subnetID.Path["subnets"] + virtualNetworkName := subnetID.Path["virtualNetworks"] + + locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) + defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) + + locks.ByName(subnetName, network.SubnetResourceName) + defer locks.UnlockByName(subnetName, network.SubnetResourceName) + + read, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + if err != nil { + return fmt.Errorf("Error making read request on virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", slotName, name, resourceGroup, err) + } + if read.SwiftVirtualNetworkProperties == nil { + return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", slotName, name, resourceGroup) + } + props := *read.SwiftVirtualNetworkProperties + subnet := props.SubnetResourceID + if subnet == nil || *subnet == "" { + // assume deleted + return nil + } + + resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, resourceGroup, name, slotName) + if err != nil { + if !utils.ResponseWasNotFound(resp) { + return fmt.Errorf("Error deleting virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", slotName, name, resourceGroup, err) + } + } + + return nil +} diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go new file mode 100644 index 000000000000..e0c6fba875a9 --- /dev/null +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -0,0 +1,285 @@ +package tests + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" +) + +func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), + ), + }, + data.ImportStep(), + }, + }) +} + +func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), + ), + }, + { + Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), + ), + }, + }, + }) +} + +func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_disappears(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(data.ResourceName), + resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDisappears(data.ResourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + +func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + // Ensure we have enough information in state to look up in API + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Not found: %s", resourceName) + } + + id := rs.Primary.Attributes["id"] + parsedID, err := azure.ParseAzureResourceID(id) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + name := parsedID.Path["sites"] + resourceGroup := parsedID.ResourceGroup + + resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Bad: App Service Virtual Network Association %q (Resource Group: %q) does not exist", name, resourceGroup) + } + + return fmt.Errorf("Bad: Get on appServicesClient: %+v", err) + } + + return nil + } +} + +func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDisappears(resourceName string) resource.TestCheckFunc { + return func(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + // Ensure we have enough information in state to look up in API + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Not found: %s", resourceName) + } + + id := rs.Primary.Attributes["id"] + parsedID, err := azure.ParseAzureResourceID(id) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + name := parsedID.Path["sites"] + resourceGroup := parsedID.ResourceGroup + + resp, err := client.DeleteSwiftVirtualNetwork(ctx, resourceGroup, name) + if err != nil { + if !utils.ResponseWasNotFound(resp) { + return fmt.Errorf("Bad: Delete on appServicesClient: %+v", err) + } + } + + return nil + } +} + +func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy(s *terraform.State) error { + client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient + ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext + + for _, rs := range s.RootModule().Resources { + if rs.Type != "azurerm_app_service_virtual_network_swift_connection_slot" { + continue + } + + id := rs.Primary.Attributes["id"] + parsedID, err := azure.ParseAzureResourceID(id) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + name := parsedID.Path["sites"] + resourceGroup := parsedID.ResourceGroup + + resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return nil + } + return err + } + + return nil + } + + return nil +} + +func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data acceptance.TestData) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-appservice-%d" + location = "%s" +} + +resource "azurerm_virtual_network" "test" { + name = "acctest-VNET-%d" + address_space = ["10.0.0.0/16"] + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + lifecycle { + ignore_changes = ["ddos_protection_plan"] + } +} + +resource "azurerm_subnet" "test1" { + name = "acctestSubnet1" + resource_group_name = azurerm_resource_group.test.name + virtual_network_name = azurerm_virtual_network.test.name + address_prefix = "10.0.1.0/24" + + delegation { + name = "acctestdelegation" + + service_delegation { + name = "Microsoft.Web/serverFarms" + actions = ["Microsoft.Network/virtualNetworks/subnets/action"] + } + } +} + +resource "azurerm_subnet" "test2" { + name = "acctestSubnet2" + resource_group_name = azurerm_resource_group.test.name + virtual_network_name = azurerm_virtual_network.test.name + address_prefix = "10.0.2.0/24" + + delegation { + name = "acctestdelegation" + + service_delegation { + name = "Microsoft.Web/serverFarms" + actions = ["Microsoft.Network/virtualNetworks/subnets/action"] + } + } +} + +resource "azurerm_app_service_plan" "test" { + name = "acctest-ASP-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + + sku { + tier = "Standard" + size = "S1" + } +} + +resource "azurerm_app_service" "test" { + name = "acctest-AS-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id +} + +resource "azurerm_app_service" "test" { + name = "acctest-AS-%d" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id +} + +resource "azurerm_app_service_slot" "test-staging" { + name = "acctest-AS-%d-staging" + app_service_name = azurerm_app_service.test.name + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id +} +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} + +func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data acceptance.TestData) string { + template := testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data) + return fmt.Sprintf(` +%s + +resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { + slot_name = azurerm_app_service_slot.test-staging.name + app_service_id = azurerm_app_service.test.id + subnet_id = azurerm_subnet.test1.id +} +`, template) +} + +func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(data acceptance.TestData) string { + template := testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data) + return fmt.Sprintf(` +%s + +resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { + slot_name = azurerm_app_service_slot.test-staging.name + app_service_id = azurerm_app_service.test.id + subnet_id = azurerm_subnet.test2.id +} +`, template) +} diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go index 3ea415bb12d5..793bc579f335 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go @@ -6,6 +6,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" diff --git a/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown b/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown new file mode 100644 index 000000000000..9311a137e77f --- /dev/null +++ b/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown @@ -0,0 +1,109 @@ +--- +subcategory: "App Service (Web Apps)" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_app_service_virtual_network_swift_connection_slot" +description: |- + Manages an App Service Virtual Network Association. + +--- + +# azurerm_app_service_virtual_network_swift_connection_slot + +Manages an App Service Virtual Network Association (this is for the [Regional VNet Integration](https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration) which is still in preview). + +## Example Usage + +```hcl +resource "azurerm_resource_group" "test" { + name = "example-resources" + location = "uksouth" +} + +resource "azurerm_virtual_network" "test" { + name = "acctestvnet" + address_space = ["10.0.0.0/16"] + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name +} + +resource "azurerm_subnet" "test1" { + name = "acctestsubnet1" + resource_group_name = azurerm_resource_group.test.name + virtual_network_name = azurerm_virtual_network.test.name + address_prefix = "10.0.1.0/24" + + delegation { + name = "acctestdelegation" + + service_delegation { + name = "Microsoft.Web/serverFarms" + actions = ["Microsoft.Network/virtualNetworks/subnets/action"] + } + } +} + +resource "azurerm_app_service_plan" "test" { + name = "acctestasp" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + + sku { + tier = "Standard" + size = "S1" + } +} + +resource "azurerm_app_service" "test" { + name = "acctestas" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id +} + +resource "azurerm_app_service_slot" "test-staging" { + name = "staging" + app_service_name = azurerm_app_service.test.name + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name + app_service_plan_id = azurerm_app_service_plan.test.id +} + +resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { + slot_name = azurerm_app_service_slot.test-staging.name + app_service_id = azurerm_app_service.test.id + subnet_id = azurerm_subnet.test1.id +} +``` + +## Argument Reference + +The following arguments are supported: + +* `slot_name` - (Required) The name of the App Service Slot. + +* `app_service_id` - (Required) The ID of the App Service to associate to the VNet. Changing this forces a new resource to be created. + +* `subnet_id` - (Required) The ID of the subnet the app service will be associated to (the subnet must have a `service_delegation` configured for `Microsoft.Web/serverFarms`). + +## Attributes Reference + +The following attributes are exported: + +* `id` - The ID of the App Service Virtual Network Association + +## Timeouts + +The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: + +* `create` - (Defaults to 30 minutes) Used when creating the App Service Virtual Network Association. +* `update` - (Defaults to 30 minutes) Used when updating the App Service Virtual Network Association. +* `read` - (Defaults to 5 minutes) Used when retrieving the App Service Virtual Network Association. +* `delete` - (Defaults to 30 minutes) Used when deleting the App Service Virtual Network Association. + +## Import + +App Service Virtual Network Associations can be imported using the `resource id`, e.g. + +```shell +terraform import azurerm_app_service_virtual_network_swift_connection_slot.myassociation /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork +``` From 8c6bf1b75b79cf9b1a91c579346ec0d3f416282d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 08:26:13 +0100 Subject: [PATCH 02/17] Remove CHANGELOG entry This is done by the maintainers after the PR is merged. --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3086467be72c..e59f9b33c11e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,10 +120,6 @@ FEATURES: * **New Resource:** `azurerm_dev_test_global_shutdown_schedule` ([#5536](https://github.com/terraform-providers/terraform-provider-azurerm/issues/5536)) * **New Resource:** `azurerm_nat_gateway_public_ip_association` ([#6450](https://github.com/terraform-providers/terraform-provider-azurerm/issues/6450)) -FEATURES: - -* **New Resource:** `azurerm_app_service_virtual_network_swift_connection_slot` [GH-5458] - IMPROVEMENTS: * Data Source: `azurerm_kubernetes_cluster` - exposing the `oms_agent_identity` block within the `addon_profile` block ([#7056](https://github.com/terraform-providers/terraform-provider-azurerm/issues/7056)) From f2a8d06d55dbbecd2dfbf29da0b4e47509352df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 08:27:55 +0100 Subject: [PATCH 03/17] Nicer examples The examples for the `virtual_network_swift_connect` and `virtual_network_swift_connect_slot` have been updated to be nicer to read. I.e. everything _test_ has been replaced by _example_. --- ...ual_network_swift_connection.html.markdown | 44 ++++++------ ...etwork_swift_connection_slot.html.markdown | 69 ++++++++++--------- 2 files changed, 59 insertions(+), 54 deletions(-) diff --git a/website/docs/r/app_service_virtual_network_swift_connection.html.markdown b/website/docs/r/app_service_virtual_network_swift_connection.html.markdown index 4450494cef1a..e20cf5c4104d 100644 --- a/website/docs/r/app_service_virtual_network_swift_connection.html.markdown +++ b/website/docs/r/app_service_virtual_network_swift_connection.html.markdown @@ -14,26 +14,26 @@ Manages an App Service Virtual Network Association (this is for the [Regional VN ## Example Usage ```hcl -resource "azurerm_resource_group" "test" { +resource "azurerm_resource_group" "example" { name = "example-resources" location = "uksouth" } -resource "azurerm_virtual_network" "test" { - name = "acctestvnet" +resource "azurerm_virtual_network" "example" { + name = "example-virtual-network" address_space = ["10.0.0.0/16"] - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name } -resource "azurerm_subnet" "test1" { - name = "acctestsubnet1" - resource_group_name = azurerm_resource_group.test.name - virtual_network_name = azurerm_virtual_network.test.name +resource "azurerm_subnet" "example" { + name = "example-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example.name address_prefix = "10.0.1.0/24" delegation { - name = "acctestdelegation" + name = "example-delegation" service_delegation { name = "Microsoft.Web/serverFarms" @@ -42,10 +42,10 @@ resource "azurerm_subnet" "test1" { } } -resource "azurerm_app_service_plan" "test" { - name = "acctestasp" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name +resource "azurerm_app_service_plan" "example" { + name = "example-app-service-plan" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name sku { tier = "Standard" @@ -53,16 +53,16 @@ resource "azurerm_app_service_plan" "test" { } } -resource "azurerm_app_service" "test" { - name = "acctestas" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id +resource "azurerm_app_service" "example" { + name = "example-app-service" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + app_service_plan_id = azurerm_app_service_plan.example.id } -resource "azurerm_app_service_virtual_network_swift_connection" "test" { - app_service_id = azurerm_app_service.test.id - subnet_id = azurerm_subnet.test1.id +resource "azurerm_app_service_virtual_network_swift_connection" "example" { + app_service_id = azurerm_app_service.example.id + subnet_id = azurerm_subnet.example.id } ``` diff --git a/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown b/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown index 9311a137e77f..fe26e19506d4 100644 --- a/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown +++ b/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown @@ -3,37 +3,37 @@ subcategory: "App Service (Web Apps)" layout: "azurerm" page_title: "Azure Resource Manager: azurerm_app_service_virtual_network_swift_connection_slot" description: |- - Manages an App Service Virtual Network Association. + Manages an App Service's Slot Virtual Network Association. --- # azurerm_app_service_virtual_network_swift_connection_slot -Manages an App Service Virtual Network Association (this is for the [Regional VNet Integration](https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration) which is still in preview). +Manages an App Service Slot's Virtual Network Association (this is for the [Regional VNet Integration](https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration) which is still in preview). ## Example Usage ```hcl -resource "azurerm_resource_group" "test" { +resource "azurerm_resource_group" "example" { name = "example-resources" location = "uksouth" } -resource "azurerm_virtual_network" "test" { - name = "acctestvnet" +resource "azurerm_virtual_network" "example" { + name = "example-virtual-network" address_space = ["10.0.0.0/16"] - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name } -resource "azurerm_subnet" "test1" { - name = "acctestsubnet1" - resource_group_name = azurerm_resource_group.test.name - virtual_network_name = azurerm_virtual_network.test.name +resource "azurerm_subnet" "example" { + name = "example-subnet" + resource_group_name = azurerm_resource_group.example.name + virtual_network_name = azurerm_virtual_network.example.name address_prefix = "10.0.1.0/24" delegation { - name = "acctestdelegation" + name = "example-delegation" service_delegation { name = "Microsoft.Web/serverFarms" @@ -42,10 +42,10 @@ resource "azurerm_subnet" "test1" { } } -resource "azurerm_app_service_plan" "test" { - name = "acctestasp" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name +resource "azurerm_app_service_plan" "example" { + name = "example-service-plan" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name sku { tier = "Standard" @@ -53,25 +53,30 @@ resource "azurerm_app_service_plan" "test" { } } -resource "azurerm_app_service" "test" { - name = "acctestas" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id +resource "azurerm_app_service" "example" { + name = "example-app-service" + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + app_service_plan_id = azurerm_app_service_plan.example.id } -resource "azurerm_app_service_slot" "test-staging" { +resource "azurerm_app_service_virtual_network_swift_connection" "example" { + app_service_id = azurerm_app_service.example.id + subnet_id = azurerm_subnet.example.id +} + +resource "azurerm_app_service_slot" "example-staging" { name = "staging" - app_service_name = azurerm_app_service.test.name - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id + app_service_name = azurerm_app_service.example.name + location = azurerm_resource_group.example.location + resource_group_name = azurerm_resource_group.example.name + app_service_plan_id = azurerm_app_service_plan.example.id } -resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { - slot_name = azurerm_app_service_slot.test-staging.name - app_service_id = azurerm_app_service.test.id - subnet_id = azurerm_subnet.test1.id +resource "azurerm_app_service_virtual_network_swift_connection_slot" "example" { + slot_name = azurerm_app_service_slot.example-staging.name + app_service_id = azurerm_app_service.example.id + subnet_id = azurerm_subnet.example.id } ``` @@ -89,7 +94,7 @@ The following arguments are supported: The following attributes are exported: -* `id` - The ID of the App Service Virtual Network Association +* `id` - The ID of the App Service Slot Virtual Network Association ## Timeouts @@ -102,7 +107,7 @@ The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/d ## Import -App Service Virtual Network Associations can be imported using the `resource id`, e.g. +App Service Slot Virtual Network Associations can be imported using the `resource id`, e.g. ```shell terraform import azurerm_app_service_virtual_network_swift_connection_slot.myassociation /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork From 4a176e8c155fefb4cb84da0d474ad768915da0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 08:36:59 +0100 Subject: [PATCH 04/17] Fix sprintf number of args Fixes the following error in the tests: "azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go:178:9: Sprintf format %d reads arg #6, but call has 5 args" --- ...rce_arm_app_service_slot_virtual_network_association_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index e0c6fba875a9..aeada4f76104 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -255,7 +255,7 @@ resource "azurerm_app_service_slot" "test-staging" { resource_group_name = azurerm_resource_group.test.name app_service_plan_id = azurerm_app_service_plan.test.id } -`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger) } func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data acceptance.TestData) string { From bd4140ebd7dc0e7b1e9d8dc599511154939e26f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 09:12:03 +0100 Subject: [PATCH 05/17] Add missing side navigation link --- website/azurerm.erb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/azurerm.erb b/website/azurerm.erb index 833df21d6457..ba6354ba5b25 100644 --- a/website/azurerm.erb +++ b/website/azurerm.erb @@ -830,6 +830,10 @@ azurerm_app_service_virtual_network_swift_connection +
  • + azurerm_app_service_virtual_network_swift_connection_slot +
  • +
  • azurerm_function_app
  • From a37f2c38544c7004ceb0da9773985fe34eb90c96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 10:26:42 +0100 Subject: [PATCH 06/17] Rename Tests for TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot ... to TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection. The reason is that otherwise it's not possible to just run the test for `TestAccAzureRMAppServiceVirtualNetworkSwiftConnection`, as the `TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot` also matches that filter. --- ...e_slot_virtual_network_association_test.go | 53 ++++++++----------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index aeada4f76104..7d61387f4e21 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -13,18 +13,18 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(t *testing.T) { +func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, Providers: acceptance.SupportedProviders, - CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + CheckDestroy: testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data), Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(data.ResourceName), resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), ), }, @@ -33,25 +33,25 @@ func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(t *testing. }) } -func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(t *testing.T) { +func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, Providers: acceptance.SupportedProviders, - CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + CheckDestroy: testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data), Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(data.ResourceName), resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), ), }, { - Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(data), + Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(data), Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(data.ResourceName), + testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(data.ResourceName), resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), ), }, @@ -59,20 +59,20 @@ func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(t *testing }) } -func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_disappears(t *testing.T) { +func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_disappears(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, Providers: acceptance.SupportedProviders, - CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy, + CheckDestroy: testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy, Steps: []resource.TestStep{ { - Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data), + Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data), Check: resource.ComposeTestCheckFunc( testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(data.ResourceName), resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), - testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDisappears(data.ResourceName), + testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDisappears(data.ResourceName), ), ExpectNonEmptyPlan: true, }, @@ -80,7 +80,7 @@ func TestAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_disappears(t *tes }) } -func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(resourceName string) resource.TestCheckFunc { +func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext @@ -112,7 +112,7 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotExists(resourceN } } -func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDisappears(resourceName string) resource.TestCheckFunc { +func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDisappears(resourceName string) resource.TestCheckFunc { return func(s *terraform.State) error { client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext @@ -142,7 +142,7 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDisappears(resou } } -func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy(s *terraform.State) error { +func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terraform.State) error { client := acceptance.AzureProvider.Meta().(*clients.Client).Web.AppServicesClient ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext @@ -174,7 +174,7 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionSlotDestroy(s *terra return nil } -func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data acceptance.TestData) string { +func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_base(data acceptance.TestData) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { name = "acctestRG-appservice-%d" @@ -241,13 +241,6 @@ resource "azurerm_app_service" "test" { app_service_plan_id = azurerm_app_service_plan.test.id } -resource "azurerm_app_service" "test" { - name = "acctest-AS-%d" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - app_service_plan_id = azurerm_app_service_plan.test.id -} - resource "azurerm_app_service_slot" "test-staging" { name = "acctest-AS-%d-staging" app_service_name = azurerm_app_service.test.name @@ -255,11 +248,11 @@ resource "azurerm_app_service_slot" "test-staging" { resource_group_name = azurerm_resource_group.test.name app_service_plan_id = azurerm_app_service_plan.test.id } -`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger) +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger, data.RandomInteger) } -func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_basic(data acceptance.TestData) string { - template := testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data) +func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data acceptance.TestData) string { + template := testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_base(data) return fmt.Sprintf(` %s @@ -271,8 +264,8 @@ resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { `, template) } -func testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_update(data acceptance.TestData) string { - template := testAccAzureRMAppServiceVirtualNetworkSwiftConnectionSlot_base(data) +func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(data acceptance.TestData) string { + template := testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_base(data) return fmt.Sprintf(` %s From 08fe31d9cbd8dc9d0f722932094ee7556db553bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 10:29:33 +0100 Subject: [PATCH 07/17] Retain correct slot name The value `slot.Name` contains "app_service_name/slot_name". If this were retained as `slot_name` in the Terraform state then terraform would try to re-create the resource in every run. Thankfully, this was caught during the integration tests. --- ...rce_arm_app_service_virtual_network_swift_connection_slot.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go index 6410796049db..c9b23a761729 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go @@ -162,7 +162,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.Resour } d.Set("subnet_id", subnetID) d.Set("app_service_id", appService.ID) - d.Set("slot_name", slot.Name) + d.Set("slot_name", slotName) return nil } From 5b0ffb1abac87654db189b7422ca9c81fc51cc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 27 Feb 2020 13:24:27 +0100 Subject: [PATCH 08/17] Fix acceptance test --- ...e_slot_virtual_network_association_test.go | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index 7d61387f4e21..b1dbb0643e40 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -70,7 +70,7 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_disappears(t *tes { Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data), Check: resource.ComposeTestCheckFunc( - testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(data.ResourceName), + testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(data.ResourceName), resource.TestCheckResourceAttrSet(data.ResourceName, "subnet_id"), testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDisappears(data.ResourceName), ), @@ -91,15 +91,12 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(resourceN return fmt.Errorf("Not found: %s", resourceName) } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + err, name, slotName, resourceGroup := parseResourceId(rs) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { return fmt.Errorf("Bad: App Service Virtual Network Association %q (Resource Group: %q) does not exist", name, resourceGroup) @@ -123,15 +120,12 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDisappears(resou return fmt.Errorf("Not found: %s", resourceName) } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + err, name, slotName, resourceGroup := parseResourceId(rs) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.DeleteSwiftVirtualNetwork(ctx, resourceGroup, name) + resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, resourceGroup, name, slotName) if err != nil { if !utils.ResponseWasNotFound(resp) { return fmt.Errorf("Bad: Delete on appServicesClient: %+v", err) @@ -151,15 +145,12 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terra continue } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + err, name, slotName, resourceGroup := parseResourceId(rs) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { @@ -174,6 +165,18 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terra return nil } +func parseResourceId(rs *terraform.ResourceState) (error, string, string, string) { + id := rs.Primary.Attributes["id"] + parsedID, err := azure.ParseAzureResourceID(id) + if err != nil { + return fmt.Errorf("Error parsing Azure Resource ID %q", id), "", "", "" + } + name := parsedID.Path["sites"] + slotName := parsedID.Path["slots"] + resourceGroup := parsedID.ResourceGroup + return err, name, slotName, resourceGroup +} + func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_base(data acceptance.TestData) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { From e7938d5bb2b66b5dd6c2c52800227ad1828bb040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Tue, 7 Apr 2020 21:46:53 +0200 Subject: [PATCH 09/17] Extract ID parsing into a function --- .../virtual_network_switch_connection.go | 29 ++++++++ .../virtual_network_switch_connection_slot.go | 34 +++++++++ ...ual_network_switch_connection_slot_test.go | 73 +++++++++++++++++++ .../virtual_network_switch_connection_test.go | 57 +++++++++++++++ ...ervice_virtual_network_swift_connection.go | 34 ++++----- ...e_virtual_network_swift_connection_slot.go | 42 +++++------ 6 files changed, 228 insertions(+), 41 deletions(-) create mode 100644 azurerm/internal/services/web/parse/virtual_network_switch_connection.go create mode 100644 azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go create mode 100644 azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go create mode 100644 azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection.go b/azurerm/internal/services/web/parse/virtual_network_switch_connection.go new file mode 100644 index 000000000000..a1f0e4bd9116 --- /dev/null +++ b/azurerm/internal/services/web/parse/virtual_network_switch_connection.go @@ -0,0 +1,29 @@ +package parse + +import ( + "fmt" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" +) + +type VirtualNetworkSwitchConnectionId struct { + SiteName string + ResourceGroup string +} + +func VirtualNetworkSwitchConnectionID(resourceId string) (*VirtualNetworkSwitchConnectionId, error) { + id, err := azure.ParseAzureResourceID(resourceId) + if err != nil { + return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + + virtualNetworkId := &VirtualNetworkSwitchConnectionId{ + ResourceGroup: id.ResourceGroup, + } + + if virtualNetworkId.SiteName, err = id.PopSegment("sites"); err != nil { + return nil, err + } + + return virtualNetworkId, nil +} diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go b/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go new file mode 100644 index 000000000000..342172dbf376 --- /dev/null +++ b/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go @@ -0,0 +1,34 @@ +package parse + +import ( + "fmt" + + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" +) + +type VirtualNetworkSwitchConnectionSlotId struct { + VirtualNetworkSwitchConnectionId + SlotName string +} + +func VirtualNetworkSwitchConnectionSlotID(ID string) (*VirtualNetworkSwitchConnectionSlotId, error) { + id, err := azure.ParseAzureResourceID(ID) + if err != nil { + return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) + } + + virtualNetworkId, err := VirtualNetworkSwitchConnectionID(ID) + if err != nil { + return nil, err + } + + slotVirtualNetworkId := &VirtualNetworkSwitchConnectionSlotId{ + VirtualNetworkSwitchConnectionId: *virtualNetworkId, + } + + if slotVirtualNetworkId.SlotName, err = id.PopSegment("slots"); err != nil { + return nil, err + } + + return slotVirtualNetworkId, nil +} diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go b/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go new file mode 100644 index 000000000000..4c9a94131f95 --- /dev/null +++ b/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go @@ -0,0 +1,73 @@ +package parse + +import ( + "testing" +) + +func TestVirtualNetworkSwitchConnectionSlotID(t *testing.T) { + testData := []struct { + Name string + Input string + Expected *VirtualNetworkSwitchConnectionSlotId + }{ + { + Name: "Empty", + Input: "", + Expected: nil, + }, + { + Name: "No Resource Groups Segemt", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000", + Expected: nil, + }, + { + Name: "No Sites Segment", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web", + Expected: nil, + }, + { + Name: "No Slot Segment", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1", + Expected: nil, + }, + { + Name: "Valid Network Association But No Slot Segment", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/networkconfig/virtualNetwork", + Expected: nil, + }, + { + Name: "Slot Virtual Network Association", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork", + Expected: &VirtualNetworkSwitchConnectionSlotId{ + VirtualNetworkSwitchConnectionId: VirtualNetworkSwitchConnectionId{ + SiteName: "instance1", + ResourceGroup: "mygroup1", + }, + SlotName: "stageing", + }, + }, + } + + for _, v := range testData { + t.Logf("[DEBUG] Testing %q", v.Name) + + actual, err := VirtualNetworkSwitchConnectionSlotID(v.Input) + if err != nil { + if v.Expected == nil { + continue + } + + t.Fatalf("Expected a value but got an error: %s", err) + } + + if actual.SiteName != v.Expected.SiteName { + t.Fatalf("Expected %q but got %q for Name", v.Expected.SiteName, actual.SiteName) + } + if actual.ResourceGroup != v.Expected.ResourceGroup { + t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expected.ResourceGroup, actual.ResourceGroup) + } + if actual.SlotName != v.Expected.SlotName { + t.Fatalf("Expected %q but got %q for SlotName", v.Expected.SlotName, actual.SlotName) + } + } +} diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go b/azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go new file mode 100644 index 000000000000..860c09b1f05f --- /dev/null +++ b/azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go @@ -0,0 +1,57 @@ +package parse + +import ( + "testing" +) + +func TestVirtualNetworkSwitchConnectionID(t *testing.T) { + testData := []struct { + Name string + Input string + Expected *VirtualNetworkSwitchConnectionId + }{ + { + Name: "Empty", + Input: "", + Expected: nil, + }, + { + Name: "No Resource Groups Segemt", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000", + Expected: nil, + }, + { + Name: "No Sites Segment", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/", + Expected: nil, + }, + { + Name: "Virtual Network Association", + Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/networkconfig/virtualNetwork", + Expected: &VirtualNetworkSwitchConnectionId{ + SiteName: "instance1", + ResourceGroup: "mygroup1", + }, + }, + } + + for _, v := range testData { + t.Logf("[DEBUG] Testing %q", v.Name) + + actual, err := VirtualNetworkSwitchConnectionID(v.Input) + if err != nil { + if v.Expected == nil { + continue + } + + t.Fatalf("Expected a value but got an error: %s", err) + } + + if actual.SiteName != v.Expected.SiteName { + t.Fatalf("Expected %q but got %q for Name", v.Expected.SiteName, actual.SiteName) + } + if actual.ResourceGroup != v.Expected.ResourceGroup { + t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expected.ResourceGroup, actual.ResourceGroup) + } + } +} diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go index 6cda31ada4da..0581a19ffc74 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go @@ -11,6 +11,7 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -104,32 +105,30 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionRead(d *schema.ResourceDa ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Id()) + id, err := parse.VirtualNetworkSwitchConnectionID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } - resourceGroup := id.ResourceGroup - name := id.Path["sites"] - appService, err := client.Get(ctx, resourceGroup, name) + appService, err := client.Get(ctx, id.ResourceGroup, id.SiteName) if err != nil { if utils.ResponseWasNotFound(appService.Response) { d.SetId("") return nil } - return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", name, resourceGroup, err) + return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", id.SiteName, id.ResourceGroup, err) } - swiftVnet, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + swiftVnet, err := client.GetSwiftVirtualNetworkConnection(ctx, id.ResourceGroup, id.SiteName) if err != nil { if utils.ResponseWasNotFound(swiftVnet.Response) { d.SetId("") return nil } - return fmt.Errorf("Error retrieving App Service VNet association for %q (Resource Group %q): %s", name, resourceGroup, err) + return fmt.Errorf("Error retrieving App Service VNet association for %q (Resource Group %q): %s", id.SiteName, id.ResourceGroup, err) } if swiftVnet.SwiftVirtualNetworkProperties == nil { - return fmt.Errorf("Error retrieving virtual network properties (App Service %q / Resource Group %q): `properties` was nil", name, resourceGroup) + return fmt.Errorf("Error retrieving virtual network properties (App Service %q / Resource Group %q): `properties` was nil", id.SiteName, id.ResourceGroup) } props := *swiftVnet.SwiftVirtualNetworkProperties subnetID := props.SubnetResourceID @@ -147,16 +146,15 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionDelete(d *schema.Resource ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + id, err := parse.VirtualNetworkSwitchConnectionID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } + subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) } - resourceGroup := id.ResourceGroup - name := id.Path["sites"] subnetName := subnetID.Path["subnets"] virtualNetworkName := subnetID.Path["virtualNetworks"] @@ -166,12 +164,12 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionDelete(d *schema.Resource locks.ByName(subnetName, network.SubnetResourceName) defer locks.UnlockByName(subnetName, network.SubnetResourceName) - read, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + read, err := client.GetSwiftVirtualNetworkConnection(ctx, id.ResourceGroup, id.SiteName) if err != nil { - return fmt.Errorf("Error making read request on virtual network properties (App Service %q / Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error making read request on virtual network properties (App Service %q / Resource Group %q): %+v", id.SiteName, id.ResourceGroup, err) } if read.SwiftVirtualNetworkProperties == nil { - return fmt.Errorf("Error retrieving virtual network properties (App Service %q / Resource Group %q): `properties` was nil", name, resourceGroup) + return fmt.Errorf("Error retrieving virtual network properties (App Service %q / Resource Group %q): `properties` was nil", id.SiteName, id.ResourceGroup) } props := *read.SwiftVirtualNetworkProperties subnet := props.SubnetResourceID @@ -180,10 +178,10 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionDelete(d *schema.Resource return nil } - resp, err := client.DeleteSwiftVirtualNetwork(ctx, resourceGroup, name) + resp, err := client.DeleteSwiftVirtualNetwork(ctx, id.ResourceGroup, id.SiteName) if err != nil { if !utils.ResponseWasNotFound(resp) { - return fmt.Errorf("Error deleting virtual network properties (App Service %q / Resource Group %q): %+v", name, resourceGroup, err) + return fmt.Errorf("Error deleting virtual network properties (App Service %q / Resource Group %q): %+v", id.SiteName, id.ResourceGroup, err) } } diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go index c9b23a761729..85d8491fdb33 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go @@ -11,6 +11,7 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -118,41 +119,38 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.Resour ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Id()) + id, err := parse.VirtualNetworkSwitchConnectionSlotID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } - resourceGroup := id.ResourceGroup - name := id.Path["sites"] - slotName := id.Path["slots"] - slot, err := client.GetSlot(ctx, resourceGroup, name, slotName) + slot, err := client.GetSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { if utils.ResponseWasNotFound(slot.Response) { d.SetId("") return nil } - return fmt.Errorf("Error retrieving existing App Service Slot %q (App Service %q / Resource Group %q): %s", slotName, name, resourceGroup, err) + return fmt.Errorf("Error retrieving existing App Service Slot %q (App Service %q / Resource Group %q): %s", id.SlotName, id.SiteName, id.ResourceGroup, err) } - appService, err := client.Get(ctx, resourceGroup, name) + appService, err := client.Get(ctx, id.ResourceGroup, id.SiteName) if err != nil { if utils.ResponseWasNotFound(appService.Response) { d.SetId("") return nil } - return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", name, resourceGroup, err) + return fmt.Errorf("Error retrieving existing App Service %q (Resource Group %q): %s", id.SiteName, id.ResourceGroup, err) } - swiftVnet, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + swiftVnet, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { if utils.ResponseWasNotFound(swiftVnet.Response) { d.SetId("") return nil } - return fmt.Errorf("Error retrieving App Service Slot VNet association for %q (App Service %q / Resource Group %q): %s", slotName, name, resourceGroup, err) + return fmt.Errorf("Error retrieving App Service Slot VNet association for %q (App Service %q / Resource Group %q): %s", id.SlotName, id.SiteName, id.ResourceGroup, err) } if swiftVnet.SwiftVirtualNetworkProperties == nil { - return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", slotName, name, resourceGroup) + return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", id.SlotName, id.SiteName, id.ResourceGroup) } props := *swiftVnet.SwiftVirtualNetworkProperties subnetID := props.SubnetResourceID @@ -162,7 +160,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.Resour } d.Set("subnet_id", subnetID) d.Set("app_service_id", appService.ID) - d.Set("slot_name", slotName) + d.Set("slot_name", id.SlotName) return nil } @@ -171,17 +169,15 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete(d *schema.Reso ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + id, err := parse.VirtualNetworkSwitchConnectionSlotID(d.Id()) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return err } + subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) } - slotName := d.Get("slot_name").(string) - resourceGroup := id.ResourceGroup - name := id.Path["sites"] subnetName := subnetID.Path["subnets"] virtualNetworkName := subnetID.Path["virtualNetworks"] @@ -191,12 +187,12 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete(d *schema.Reso locks.ByName(subnetName, network.SubnetResourceName) defer locks.UnlockByName(subnetName, network.SubnetResourceName) - read, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + read, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { - return fmt.Errorf("Error making read request on virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", slotName, name, resourceGroup, err) + return fmt.Errorf("Error making read request on virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", id.SlotName, id.SiteName, id.ResourceGroup, err) } if read.SwiftVirtualNetworkProperties == nil { - return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", slotName, name, resourceGroup) + return fmt.Errorf("Error retrieving virtual network properties (Slot Name %q / App Service %q / Resource Group %q): `properties` was nil", id.SlotName, id.SiteName, id.ResourceGroup) } props := *read.SwiftVirtualNetworkProperties subnet := props.SubnetResourceID @@ -205,10 +201,10 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete(d *schema.Reso return nil } - resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, resourceGroup, name, slotName) + resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { if !utils.ResponseWasNotFound(resp) { - return fmt.Errorf("Error deleting virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", slotName, name, resourceGroup, err) + return fmt.Errorf("Error deleting virtual network properties (Slot Name %q / App Service %q / Resource Group %q): %+v", id.SlotName, id.SiteName, id.ResourceGroup, err) } } From 1f31b3daecb4fb434963e251c0311cb83593a5b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Thu, 14 May 2020 13:25:05 +0200 Subject: [PATCH 10/17] Rename to azurerm_app_service_slot_virtual_network_swift_connection --- ...slot_virtual_network_switch_connection.go} | 10 ++++----- ...virtual_network_switch_connection_test.go} | 8 +++---- azurerm/internal/services/web/registration.go | 2 +- ..._slot_virtual_network_swift_connection.go} | 22 +++++++++---------- ...e_slot_virtual_network_association_test.go | 12 +++++----- website/azurerm.erb | 2 +- ...al_network_swift_connection.html.markdown} | 8 +++---- 7 files changed, 32 insertions(+), 32 deletions(-) rename azurerm/internal/services/web/parse/{virtual_network_switch_connection_slot.go => slot_virtual_network_switch_connection.go} (58%) rename azurerm/internal/services/web/parse/{virtual_network_switch_connection_slot_test.go => slot_virtual_network_switch_connection_test.go} (89%) rename azurerm/internal/services/web/{resource_arm_app_service_virtual_network_swift_connection_slot.go => resource_arm_app_service_slot_virtual_network_swift_connection.go} (91%) rename website/docs/r/{app_service_virtual_network_swift_connection_slot.html.markdown => app_service_slot_virtual_network_swift_connection.html.markdown} (91%) diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go b/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go similarity index 58% rename from azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go rename to azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go index 342172dbf376..fb407a3f7c67 100644 --- a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go @@ -6,23 +6,23 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" ) -type VirtualNetworkSwitchConnectionSlotId struct { +type SlotVirtualNetworkSwitchConnectionId struct { VirtualNetworkSwitchConnectionId SlotName string } -func VirtualNetworkSwitchConnectionSlotID(ID string) (*VirtualNetworkSwitchConnectionSlotId, error) { - id, err := azure.ParseAzureResourceID(ID) +func SlotVirtualNetworkSwitchConnectionID(resourceId string) (*SlotVirtualNetworkSwitchConnectionId, error) { + id, err := azure.ParseAzureResourceID(resourceId) if err != nil { return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) } - virtualNetworkId, err := VirtualNetworkSwitchConnectionID(ID) + virtualNetworkId, err := VirtualNetworkSwitchConnectionID(resourceId) if err != nil { return nil, err } - slotVirtualNetworkId := &VirtualNetworkSwitchConnectionSlotId{ + slotVirtualNetworkId := &SlotVirtualNetworkSwitchConnectionId{ VirtualNetworkSwitchConnectionId: *virtualNetworkId, } diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go b/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go similarity index 89% rename from azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go rename to azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go index 4c9a94131f95..cce587e8ff84 100644 --- a/azurerm/internal/services/web/parse/virtual_network_switch_connection_slot_test.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go @@ -4,11 +4,11 @@ import ( "testing" ) -func TestVirtualNetworkSwitchConnectionSlotID(t *testing.T) { +func TestSlotVirtualNetworkSwitchConnectionID(t *testing.T) { testData := []struct { Name string Input string - Expected *VirtualNetworkSwitchConnectionSlotId + Expected *SlotVirtualNetworkSwitchConnectionId }{ { Name: "Empty", @@ -38,7 +38,7 @@ func TestVirtualNetworkSwitchConnectionSlotID(t *testing.T) { { Name: "Slot Virtual Network Association", Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork", - Expected: &VirtualNetworkSwitchConnectionSlotId{ + Expected: &SlotVirtualNetworkSwitchConnectionId{ VirtualNetworkSwitchConnectionId: VirtualNetworkSwitchConnectionId{ SiteName: "instance1", ResourceGroup: "mygroup1", @@ -51,7 +51,7 @@ func TestVirtualNetworkSwitchConnectionSlotID(t *testing.T) { for _, v := range testData { t.Logf("[DEBUG] Testing %q", v.Name) - actual, err := VirtualNetworkSwitchConnectionSlotID(v.Input) + actual, err := SlotVirtualNetworkSwitchConnectionID(v.Input) if err != nil { if v.Expected == nil { continue diff --git a/azurerm/internal/services/web/registration.go b/azurerm/internal/services/web/registration.go index b9e6c48ae7f6..496a3972595c 100644 --- a/azurerm/internal/services/web/registration.go +++ b/azurerm/internal/services/web/registration.go @@ -43,7 +43,7 @@ func (r Registration) SupportedResources() map[string]*schema.Resource { "azurerm_app_service_slot": resourceArmAppServiceSlot(), "azurerm_app_service_source_control_token": resourceArmAppServiceSourceControlToken(), "azurerm_app_service_virtual_network_swift_connection": resourceArmAppServiceVirtualNetworkSwiftConnection(), - "azurerm_app_service_virtual_network_swift_connection_slot": resourceArmAppServiceVirtualNetworkSwiftConnectionSlot(), + "azurerm_app_service_slot_virtual_network_swift_connection": resourceArmAppServiceSlotVirtualNetworkSwiftConnection(), "azurerm_app_service": resourceArmAppService(), "azurerm_function_app": resourceArmFunctionApp(), "azurerm_function_app_slot": resourceArmFunctionAppSlot(), diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go similarity index 91% rename from azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go rename to azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go index 85d8491fdb33..2d5051de1f69 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection_slot.go +++ b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go @@ -16,12 +16,12 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -func resourceArmAppServiceVirtualNetworkSwiftConnectionSlot() *schema.Resource { +func resourceArmAppServiceSlotVirtualNetworkSwiftConnection() *schema.Resource { return &schema.Resource{ - Create: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate, - Read: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead, - Update: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate, - Delete: resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete, + Create: resourceArmAppServiceSlotVirtualNetworkSwiftConnectionCreateUpdate, + Read: resourceArmAppServiceSlotVirtualNetworkSwiftConnectionRead, + Update: resourceArmAppServiceSlotVirtualNetworkSwiftConnectionCreateUpdate, + Delete: resourceArmAppServiceSlotVirtualNetworkSwiftConnectionDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, @@ -55,7 +55,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlot() *schema.Resource { } } -func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionCreateUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*clients.Client).Web.AppServicesClient ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) defer cancel() @@ -111,15 +111,15 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotCreateUpdate(d *schem } d.SetId(*read.ID) - return resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d, meta) + return resourceArmAppServiceSlotVirtualNetworkSwiftConnectionRead(d, meta) } -func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.ResourceData, meta interface{}) error { +func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*clients.Client).Web.AppServicesClient ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.VirtualNetworkSwitchConnectionSlotID(d.Id()) + id, err := parse.SlotVirtualNetworkSwitchConnectionID(d.Id()) if err != nil { return err } @@ -164,12 +164,12 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotRead(d *schema.Resour return nil } -func resourceArmAppServiceVirtualNetworkSwiftConnectionSlotDelete(d *schema.ResourceData, meta interface{}) error { +func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*clients.Client).Web.AppServicesClient ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.VirtualNetworkSwitchConnectionSlotID(d.Id()) + id, err := parse.SlotVirtualNetworkSwitchConnectionID(d.Id()) if err != nil { return err } diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index b1dbb0643e40..7d093beec78e 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -14,7 +14,7 @@ import ( ) func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing.T) { - data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + data := acceptance.BuildTestData(t, "azurerm_app_service_slot_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -34,7 +34,7 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing. } func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(t *testing.T) { - data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + data := acceptance.BuildTestData(t, "azurerm_app_service_slot_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -60,7 +60,7 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(t *testing } func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_disappears(t *testing.T) { - data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection_slot", "test") + data := acceptance.BuildTestData(t, "azurerm_app_service_slot_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, @@ -141,7 +141,7 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terra ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext for _, rs := range s.RootModule().Resources { - if rs.Type != "azurerm_app_service_virtual_network_swift_connection_slot" { + if rs.Type != "azurerm_app_service_slot_virtual_network_swift_connection" { continue } @@ -259,7 +259,7 @@ func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data accept return fmt.Sprintf(` %s -resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { +resource "azurerm_app_service_slot_virtual_network_swift_connection" "test" { slot_name = azurerm_app_service_slot.test-staging.name app_service_id = azurerm_app_service.test.id subnet_id = azurerm_subnet.test1.id @@ -272,7 +272,7 @@ func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(data accep return fmt.Sprintf(` %s -resource "azurerm_app_service_virtual_network_swift_connection_slot" "test" { +resource "azurerm_app_service_slot_virtual_network_swift_connection" "test" { slot_name = azurerm_app_service_slot.test-staging.name app_service_id = azurerm_app_service.test.id subnet_id = azurerm_subnet.test2.id diff --git a/website/azurerm.erb b/website/azurerm.erb index ba6354ba5b25..a27c0675e1e3 100644 --- a/website/azurerm.erb +++ b/website/azurerm.erb @@ -831,7 +831,7 @@
  • - azurerm_app_service_virtual_network_swift_connection_slot + azurerm_app_service_slot_virtual_network_swift_connection
  • diff --git a/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown b/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown similarity index 91% rename from website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown rename to website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown index fe26e19506d4..b3652cf63017 100644 --- a/website/docs/r/app_service_virtual_network_swift_connection_slot.html.markdown +++ b/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown @@ -1,13 +1,13 @@ --- subcategory: "App Service (Web Apps)" layout: "azurerm" -page_title: "Azure Resource Manager: azurerm_app_service_virtual_network_swift_connection_slot" +page_title: "Azure Resource Manager: azurerm_app_service_slot_virtual_network_swift_connection" description: |- Manages an App Service's Slot Virtual Network Association. --- -# azurerm_app_service_virtual_network_swift_connection_slot +# azurerm_app_service_slot_virtual_network_swift_connection Manages an App Service Slot's Virtual Network Association (this is for the [Regional VNet Integration](https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration) which is still in preview). @@ -73,7 +73,7 @@ resource "azurerm_app_service_slot" "example-staging" { app_service_plan_id = azurerm_app_service_plan.example.id } -resource "azurerm_app_service_virtual_network_swift_connection_slot" "example" { +resource "azurerm_app_service_slot_virtual_network_swift_connection" "example" { slot_name = azurerm_app_service_slot.example-staging.name app_service_id = azurerm_app_service.example.id subnet_id = azurerm_subnet.example.id @@ -110,5 +110,5 @@ The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/d App Service Slot Virtual Network Associations can be imported using the `resource id`, e.g. ```shell -terraform import azurerm_app_service_virtual_network_swift_connection_slot.myassociation /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork +terraform import azurerm_app_service_slot_virtual_network_swift_connection.myassociation /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork ``` From e63a15791cfa2e4e14c892b7b95add2ab45afffc Mon Sep 17 00:00:00 2001 From: jackofallops Date: Thu, 2 Jul 2020 15:33:02 +0100 Subject: [PATCH 11/17] fixup resources and tests --- ... slot_virtual_network_swift_connection.go} | 8 +-- ..._virtual_network_swift_connection_test.go} | 6 +- ...go => virtual_network_swift_connection.go} | 6 +- ... virtual_network_swift_connection_test.go} | 8 +-- ...e_slot_virtual_network_swift_connection.go | 47 +++++++++----- ...ervice_virtual_network_swift_connection.go | 49 +++++++++------ ...e_slot_virtual_network_association_test.go | 61 ++++++++++++------- ...ervice_virtual_network_association_test.go | 59 ++++++++++++------ 8 files changed, 156 insertions(+), 88 deletions(-) rename azurerm/internal/services/web/parse/{slot_virtual_network_switch_connection.go => slot_virtual_network_swift_connection.go} (67%) rename azurerm/internal/services/web/parse/{slot_virtual_network_switch_connection_test.go => slot_virtual_network_swift_connection_test.go} (91%) rename azurerm/internal/services/web/parse/{virtual_network_switch_connection.go => virtual_network_swift_connection.go} (69%) rename azurerm/internal/services/web/parse/{virtual_network_switch_connection_test.go => virtual_network_swift_connection_test.go} (85%) diff --git a/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go similarity index 67% rename from azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go rename to azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go index fb407a3f7c67..44d34d34ed9f 100644 --- a/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go @@ -7,23 +7,23 @@ import ( ) type SlotVirtualNetworkSwitchConnectionId struct { - VirtualNetworkSwitchConnectionId + VirtualNetworkSwiftConnectionId SlotName string } -func SlotVirtualNetworkSwitchConnectionID(resourceId string) (*SlotVirtualNetworkSwitchConnectionId, error) { +func SlotVirtualNetworkSwiftConnectionID(resourceId string) (*SlotVirtualNetworkSwitchConnectionId, error) { id, err := azure.ParseAzureResourceID(resourceId) if err != nil { return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) } - virtualNetworkId, err := VirtualNetworkSwitchConnectionID(resourceId) + virtualNetworkId, err := VirtualNetworkSwiftConnectionID(resourceId) if err != nil { return nil, err } slotVirtualNetworkId := &SlotVirtualNetworkSwitchConnectionId{ - VirtualNetworkSwitchConnectionId: *virtualNetworkId, + VirtualNetworkSwiftConnectionId: *virtualNetworkId, } if slotVirtualNetworkId.SlotName, err = id.PopSegment("slots"); err != nil { diff --git a/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go similarity index 91% rename from azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go rename to azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go index cce587e8ff84..e7ec6f76dcf0 100644 --- a/azurerm/internal/services/web/parse/slot_virtual_network_switch_connection_test.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func TestSlotVirtualNetworkSwitchConnectionID(t *testing.T) { +func TestSlotVirtualNetworkSwiftConnectionID(t *testing.T) { testData := []struct { Name string Input string @@ -39,7 +39,7 @@ func TestSlotVirtualNetworkSwitchConnectionID(t *testing.T) { Name: "Slot Virtual Network Association", Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork", Expected: &SlotVirtualNetworkSwitchConnectionId{ - VirtualNetworkSwitchConnectionId: VirtualNetworkSwitchConnectionId{ + VirtualNetworkSwiftConnectionId: VirtualNetworkSwiftConnectionId{ SiteName: "instance1", ResourceGroup: "mygroup1", }, @@ -51,7 +51,7 @@ func TestSlotVirtualNetworkSwitchConnectionID(t *testing.T) { for _, v := range testData { t.Logf("[DEBUG] Testing %q", v.Name) - actual, err := SlotVirtualNetworkSwitchConnectionID(v.Input) + actual, err := SlotVirtualNetworkSwiftConnectionID(v.Input) if err != nil { if v.Expected == nil { continue diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection.go b/azurerm/internal/services/web/parse/virtual_network_swift_connection.go similarity index 69% rename from azurerm/internal/services/web/parse/virtual_network_switch_connection.go rename to azurerm/internal/services/web/parse/virtual_network_swift_connection.go index a1f0e4bd9116..f8e0bc854b99 100644 --- a/azurerm/internal/services/web/parse/virtual_network_switch_connection.go +++ b/azurerm/internal/services/web/parse/virtual_network_swift_connection.go @@ -6,18 +6,18 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" ) -type VirtualNetworkSwitchConnectionId struct { +type VirtualNetworkSwiftConnectionId struct { SiteName string ResourceGroup string } -func VirtualNetworkSwitchConnectionID(resourceId string) (*VirtualNetworkSwitchConnectionId, error) { +func VirtualNetworkSwiftConnectionID(resourceId string) (*VirtualNetworkSwiftConnectionId, error) { id, err := azure.ParseAzureResourceID(resourceId) if err != nil { return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) } - virtualNetworkId := &VirtualNetworkSwitchConnectionId{ + virtualNetworkId := &VirtualNetworkSwiftConnectionId{ ResourceGroup: id.ResourceGroup, } diff --git a/azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go b/azurerm/internal/services/web/parse/virtual_network_swift_connection_test.go similarity index 85% rename from azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go rename to azurerm/internal/services/web/parse/virtual_network_swift_connection_test.go index 860c09b1f05f..f1b7abe14e7d 100644 --- a/azurerm/internal/services/web/parse/virtual_network_switch_connection_test.go +++ b/azurerm/internal/services/web/parse/virtual_network_swift_connection_test.go @@ -4,11 +4,11 @@ import ( "testing" ) -func TestVirtualNetworkSwitchConnectionID(t *testing.T) { +func TestVirtualNetworkSwiftConnectionID(t *testing.T) { testData := []struct { Name string Input string - Expected *VirtualNetworkSwitchConnectionId + Expected *VirtualNetworkSwiftConnectionId }{ { Name: "Empty", @@ -28,7 +28,7 @@ func TestVirtualNetworkSwitchConnectionID(t *testing.T) { { Name: "Virtual Network Association", Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/networkconfig/virtualNetwork", - Expected: &VirtualNetworkSwitchConnectionId{ + Expected: &VirtualNetworkSwiftConnectionId{ SiteName: "instance1", ResourceGroup: "mygroup1", }, @@ -38,7 +38,7 @@ func TestVirtualNetworkSwitchConnectionID(t *testing.T) { for _, v := range testData { t.Logf("[DEBUG] Testing %q", v.Name) - actual, err := VirtualNetworkSwitchConnectionID(v.Input) + actual, err := VirtualNetworkSwiftConnectionID(v.Input) if err != nil { if v.Expected == nil { continue diff --git a/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go index 2d5051de1f69..2b66d5c1f191 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go @@ -6,11 +6,12 @@ import ( "github.com/Azure/azure-sdk-for-go/services/web/mgmt/2019-08-01/web" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" + subnetParse "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" @@ -43,7 +44,6 @@ func resourceArmAppServiceSlotVirtualNetworkSwiftConnection() *schema.Resource { "subnet_id": { Type: schema.TypeString, Required: true, - ForceNew: false, ValidateFunc: azure.ValidateResourceID, }, "slot_name": { @@ -57,23 +57,38 @@ func resourceArmAppServiceSlotVirtualNetworkSwiftConnection() *schema.Resource { func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionCreateUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*clients.Client).Web.AppServicesClient - ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + appID, err := ParseAppServiceID(d.Get("app_service_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return fmt.Errorf("Error parsing Azure Resource ID %q", appID) } - subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + + subnetID, err := subnetParse.SubnetID(d.Get("subnet_id").(string)) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) } - resourceGroup := id.ResourceGroup - name := id.Path["sites"] - subnetName := subnetID.Path["subnets"] - virtualNetworkName := subnetID.Path["virtualNetworks"] + + resourceGroup := appID.ResourceGroup + name := appID.Name + subnetName := subnetID.Name + virtualNetworkName := subnetID.VirtualNetworkName slotName := d.Get("slot_name").(string) + if d.IsNewResource() { + existing, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + if err != nil { + if !utils.ResponseWasNotFound(existing.Response) { + return fmt.Errorf("failed checking for presence of existing App Service Slot Swift Network Connection %q (Resource Group %q)", name, resourceGroup) + } + } + + if existing.SwiftVirtualNetworkProperties.SubnetResourceID != nil && *existing.SwiftVirtualNetworkProperties.SubnetResourceID != "" { + return tf.ImportAsExistsError("azurerm_app_service_slot_virtual_network_swift_connection", *existing.ID) + } + } + locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) @@ -119,7 +134,7 @@ func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionRead(d *schema.Resour ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.SlotVirtualNetworkSwitchConnectionID(d.Id()) + id, err := parse.SlotVirtualNetworkSwiftConnectionID(d.Id()) if err != nil { return err } @@ -169,17 +184,17 @@ func resourceArmAppServiceSlotVirtualNetworkSwiftConnectionDelete(d *schema.Reso ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.SlotVirtualNetworkSwitchConnectionID(d.Id()) + id, err := parse.SlotVirtualNetworkSwiftConnectionID(d.Id()) if err != nil { return err } - subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + subnetID, err := subnetParse.SubnetID(d.Get("subnet_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) + return fmt.Errorf("Error parsing Subnet Resource ID %q", subnetID) } - subnetName := subnetID.Path["subnets"] - virtualNetworkName := subnetID.Path["virtualNetworks"] + subnetName := subnetID.Name + virtualNetworkName := subnetID.VirtualNetworkName locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) diff --git a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go index 0581a19ffc74..a50b9827ec09 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/resource_arm_app_service_virtual_network_swift_connection.go @@ -6,11 +6,12 @@ import ( "github.com/Azure/azure-sdk-for-go/services/web/mgmt/2019-08-01/web" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/locks" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" + subnetParse "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" @@ -43,7 +44,6 @@ func resourceArmAppServiceVirtualNetworkSwiftConnection() *schema.Resource { "subnet_id": { Type: schema.TypeString, Required: true, - ForceNew: false, ValidateFunc: azure.ValidateResourceID, }, }, @@ -52,21 +52,36 @@ func resourceArmAppServiceVirtualNetworkSwiftConnection() *schema.Resource { func resourceArmAppServiceVirtualNetworkSwiftConnectionCreateUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*clients.Client).Web.AppServicesClient - ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d) + ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := azure.ParseAzureResourceID(d.Get("app_service_id").(string)) + appID, err := ParseAppServiceID(d.Get("app_service_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id) + return fmt.Errorf("Error parsing App Service Resource ID %q", appID) } - subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + + subnetID, err := subnetParse.SubnetID(d.Get("subnet_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) + return fmt.Errorf("Error parsing Subnet Resource ID %q", subnetID) + } + + resourceGroup := appID.ResourceGroup + name := appID.Name + subnetName := subnetID.Name + virtualNetworkName := subnetID.VirtualNetworkName + + if d.IsNewResource() { + existing, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + if err != nil { + if !utils.ResponseWasNotFound(existing.Response) { + return fmt.Errorf("failed checking for presence of existing App Service Swift Network Connection %q (Resource Group %q)", name, resourceGroup) + } + } + + if existing.SwiftVirtualNetworkProperties.SubnetResourceID != nil && *existing.SwiftVirtualNetworkProperties.SubnetResourceID != "" { + return tf.ImportAsExistsError("azurerm_app_service_virtual_network_swift_connection", *existing.ID) + } } - resourceGroup := id.ResourceGroup - name := id.Path["sites"] - subnetName := subnetID.Path["subnets"] - virtualNetworkName := subnetID.Path["virtualNetworks"] locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) @@ -105,7 +120,7 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionRead(d *schema.ResourceDa ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.VirtualNetworkSwitchConnectionID(d.Id()) + id, err := parse.VirtualNetworkSwiftConnectionID(d.Id()) if err != nil { return err } @@ -146,17 +161,17 @@ func resourceArmAppServiceVirtualNetworkSwiftConnectionDelete(d *schema.Resource ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d) defer cancel() - id, err := parse.VirtualNetworkSwitchConnectionID(d.Id()) + id, err := parse.VirtualNetworkSwiftConnectionID(d.Id()) if err != nil { return err } - subnetID, err := azure.ParseAzureResourceID(d.Get("subnet_id").(string)) + subnetID, err := subnetParse.SubnetID(d.Get("subnet_id").(string)) if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", subnetID) + return fmt.Errorf("Error parsing Subnet Resource ID %q", subnetID) } - subnetName := subnetID.Path["subnets"] - virtualNetworkName := subnetID.Path["virtualNetworks"] + subnetName := subnetID.Name + virtualNetworkName := subnetID.VirtualNetworkName locks.ByName(virtualNetworkName, network.VirtualNetworkResourceName) defer locks.UnlockByName(virtualNetworkName, network.VirtualNetworkResourceName) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index 7d093beec78e..a7d47362b65f 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -6,10 +6,9 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" - - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -33,6 +32,25 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing. }) } +func TestAccAzureRmAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(data.ResourceName), + ), + }, + data.RequiresImportErrorStep(testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_requiresImport), + }, + }) +} + func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_slot_virtual_network_swift_connection", "test") @@ -91,15 +109,15 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionExists(resourceN return fmt.Errorf("Not found: %s", resourceName) } - err, name, slotName, resourceGroup := parseResourceId(rs) + id, err := parse.SlotVirtualNetworkSwiftConnectionID(rs.Primary.ID) if err != nil { return err } - resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: App Service Virtual Network Association %q (Resource Group: %q) does not exist", name, resourceGroup) + return fmt.Errorf("Bad: App Service Slot Virtual Network Association %q (Site: %q, Resource Group: %q) does not exist", id.SlotName, id.SiteName, id.ResourceGroup) } return fmt.Errorf("Bad: Get on appServicesClient: %+v", err) @@ -120,12 +138,12 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDisappears(resou return fmt.Errorf("Not found: %s", resourceName) } - err, name, slotName, resourceGroup := parseResourceId(rs) + id, err := parse.SlotVirtualNetworkSwiftConnectionID(rs.Primary.ID) if err != nil { return err } - resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, resourceGroup, name, slotName) + resp, err := client.DeleteSwiftVirtualNetworkSlot(ctx, id.ResourceGroup, id.SiteName, id.SlotName) if err != nil { if !utils.ResponseWasNotFound(resp) { return fmt.Errorf("Bad: Delete on appServicesClient: %+v", err) @@ -145,12 +163,12 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terra continue } - err, name, slotName, resourceGroup := parseResourceId(rs) + id, err := parse.SlotVirtualNetworkSwiftConnectionID(rs.Primary.ID) if err != nil { return err } - resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, resourceGroup, name, slotName) + resp, err := client.GetSwiftVirtualNetworkConnectionSlot(ctx, id.ResourceGroup, id.SiteName, id.SiteName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { @@ -165,18 +183,6 @@ func testCheckAzureRMAppServiceSlotVirtualNetworkSwiftConnectionDestroy(s *terra return nil } -func parseResourceId(rs *terraform.ResourceState) (error, string, string, string) { - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) - if err != nil { - return fmt.Errorf("Error parsing Azure Resource ID %q", id), "", "", "" - } - name := parsedID.Path["sites"] - slotName := parsedID.Path["slots"] - resourceGroup := parsedID.ResourceGroup - return err, name, slotName, resourceGroup -} - func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_base(data acceptance.TestData) string { return fmt.Sprintf(` resource "azurerm_resource_group" "test" { @@ -279,3 +285,16 @@ resource "azurerm_app_service_slot_virtual_network_swift_connection" "test" { } `, template) } + +func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(data acceptance.TestData) string { + template := testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(data) + return fmt.Sprintf(` +%s + +resource "azurerm_app_service_slot_virtual_network_swift_connection" "test" { + slot_name = azurerm_app_service_slot_virtual_network_swift_connection.test.slot_name + app_service_id = azurerm_app_service_slot_virtual_network_swift_connection.test.app_service_id + subnet_id = azurerm_app_service_slot_virtual_network_swift_connection.test.subnet_id +} +`, template) +} diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go index 793bc579f335..9538575268ba 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go @@ -6,15 +6,12 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/terraform" - - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) -// TODO: requires import - func TestAccAzureRMAppServiceVirtualNetworkSwiftConnection_basic(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") @@ -35,6 +32,25 @@ func TestAccAzureRMAppServiceVirtualNetworkSwiftConnection_basic(t *testing.T) { }) } +func TestAccAzureRmAppServiceVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMAppServiceVirtualNetworkSwiftConnection_basic(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(data.ResourceName), + ), + }, + data.RequiresImportErrorStep(testAccAzureRMAppServiceVirtualNetworkSwiftConnection_requiresImport), + }, + }) +} + func TestAccAzureRMAppServiceVirtualNetworkSwiftConnection_update(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") @@ -93,18 +109,15 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionExists(resourceName return fmt.Errorf("Not found: %s", resourceName) } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + id, err := parse.VirtualNetworkSwiftConnectionID(rs.Primary.Attributes["id"]) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", id) } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + resp, err := client.GetSwiftVirtualNetworkConnection(ctx, id.ResourceGroup, id.SiteName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { - return fmt.Errorf("Bad: App Service Virtual Network Association %q (Resource Group: %q) does not exist", name, resourceGroup) + return fmt.Errorf("Bad: App Service Virtual Network Association %q (Resource Group: %q) does not exist", id.SiteName, id.ResourceGroup) } return fmt.Errorf("Bad: Get on appServicesClient: %+v", err) @@ -125,15 +138,12 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionDisappears(resourceN return fmt.Errorf("Not found: %s", resourceName) } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + id, err := parse.VirtualNetworkSwiftConnectionID(rs.Primary.Attributes["id"]) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", id) } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.DeleteSwiftVirtualNetwork(ctx, resourceGroup, name) + resp, err := client.DeleteSwiftVirtualNetwork(ctx, id.ResourceGroup, id.SiteName) if err != nil { if !utils.ResponseWasNotFound(resp) { return fmt.Errorf("Bad: Delete on appServicesClient: %+v", err) @@ -153,15 +163,12 @@ func testCheckAzureRMAppServiceVirtualNetworkSwiftConnectionDestroy(s *terraform continue } - id := rs.Primary.Attributes["id"] - parsedID, err := azure.ParseAzureResourceID(id) + id, err := parse.VirtualNetworkSwiftConnectionID(rs.Primary.Attributes["id"]) if err != nil { return fmt.Errorf("Error parsing Azure Resource ID %q", id) } - name := parsedID.Path["sites"] - resourceGroup := parsedID.ResourceGroup - resp, err := client.GetSwiftVirtualNetworkConnection(ctx, resourceGroup, name) + resp, err := client.GetSwiftVirtualNetworkConnection(ctx, id.ResourceGroup, id.SiteName) if err != nil { if utils.ResponseWasNotFound(resp.Response) { @@ -272,3 +279,15 @@ resource "azurerm_app_service_virtual_network_swift_connection" "test" { } `, template) } + +func testAccAzureRMAppServiceVirtualNetworkSwiftConnection_requiresImport(data acceptance.TestData) string { + template := testAccAzureRMAppServiceVirtualNetworkSwiftConnection_basic(data) + return fmt.Sprintf(` +%s + +resource "azurerm_app_service_virtual_network_swift_connection" "import" { + app_service_id = azurerm_app_service_virtual_network_swift_connection.test.app_service_id + subnet_id = azurerm_app_service_virtual_network_swift_connection.test.subnet_id +} +`, template) +} From e0afabe31cc552a78038144d6d3eb3c53f833df4 Mon Sep 17 00:00:00 2001 From: jackofallops Date: Thu, 2 Jul 2020 15:50:30 +0100 Subject: [PATCH 12/17] added validation to slot name --- ...m_app_service_slot_virtual_network_swift_connection.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go index 2b66d5c1f191..2a453dd36e73 100644 --- a/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/resource_arm_app_service_slot_virtual_network_swift_connection.go @@ -13,6 +13,7 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network" subnetParse "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/network/parse" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/parse" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/web/validate" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" ) @@ -47,9 +48,10 @@ func resourceArmAppServiceSlotVirtualNetworkSwiftConnection() *schema.Resource { ValidateFunc: azure.ValidateResourceID, }, "slot_name": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validate.AppServiceName, }, }, } From 4e9bec2d40c8368b7cb6884fdec63b402b248789 Mon Sep 17 00:00:00 2001 From: jackofallops Date: Thu, 2 Jul 2020 15:51:30 +0100 Subject: [PATCH 13/17] tweaked slot example, updated arg order to alphabetical --- ...e_slot_virtual_network_swift_connection.html.markdown | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown b/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown index b3652cf63017..253fde4ebb53 100644 --- a/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown +++ b/website/docs/r/app_service_slot_virtual_network_swift_connection.html.markdown @@ -60,11 +60,6 @@ resource "azurerm_app_service" "example" { app_service_plan_id = azurerm_app_service_plan.example.id } -resource "azurerm_app_service_virtual_network_swift_connection" "example" { - app_service_id = azurerm_app_service.example.id - subnet_id = azurerm_subnet.example.id -} - resource "azurerm_app_service_slot" "example-staging" { name = "staging" app_service_name = azurerm_app_service.example.name @@ -84,10 +79,10 @@ resource "azurerm_app_service_slot_virtual_network_swift_connection" "example" { The following arguments are supported: -* `slot_name` - (Required) The name of the App Service Slot. - * `app_service_id` - (Required) The ID of the App Service to associate to the VNet. Changing this forces a new resource to be created. +* `slot_name` - (Required) The name of the App Service Slot. Changing this forces a new resource to be created. + * `subnet_id` - (Required) The ID of the subnet the app service will be associated to (the subnet must have a `service_delegation` configured for `Microsoft.Web/serverFarms`). ## Attributes Reference From 79ab0db56dc131c4ebfa4d8943f6bc6d70089072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4der?= Date: Fri, 3 Jul 2020 09:43:12 +0200 Subject: [PATCH 14/17] Fix typo in SlotVirtualNetworkSwiftConnectionId type's name --- .../web/parse/slot_virtual_network_swift_connection.go | 6 +++--- .../web/parse/slot_virtual_network_swift_connection_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go index 44d34d34ed9f..39c9096fba05 100644 --- a/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection.go @@ -6,12 +6,12 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" ) -type SlotVirtualNetworkSwitchConnectionId struct { +type SlotVirtualNetworkSwiftConnectionId struct { VirtualNetworkSwiftConnectionId SlotName string } -func SlotVirtualNetworkSwiftConnectionID(resourceId string) (*SlotVirtualNetworkSwitchConnectionId, error) { +func SlotVirtualNetworkSwiftConnectionID(resourceId string) (*SlotVirtualNetworkSwiftConnectionId, error) { id, err := azure.ParseAzureResourceID(resourceId) if err != nil { return nil, fmt.Errorf("Error parsing Azure Resource ID %q", id) @@ -22,7 +22,7 @@ func SlotVirtualNetworkSwiftConnectionID(resourceId string) (*SlotVirtualNetwork return nil, err } - slotVirtualNetworkId := &SlotVirtualNetworkSwitchConnectionId{ + slotVirtualNetworkId := &SlotVirtualNetworkSwiftConnectionId{ VirtualNetworkSwiftConnectionId: *virtualNetworkId, } diff --git a/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go index e7ec6f76dcf0..68abdbba617f 100644 --- a/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go +++ b/azurerm/internal/services/web/parse/slot_virtual_network_swift_connection_test.go @@ -8,7 +8,7 @@ func TestSlotVirtualNetworkSwiftConnectionID(t *testing.T) { testData := []struct { Name string Input string - Expected *SlotVirtualNetworkSwitchConnectionId + Expected *SlotVirtualNetworkSwiftConnectionId }{ { Name: "Empty", @@ -38,7 +38,7 @@ func TestSlotVirtualNetworkSwiftConnectionID(t *testing.T) { { Name: "Slot Virtual Network Association", Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/mygroup1/providers/Microsoft.Web/sites/instance1/slots/stageing/networkconfig/virtualNetwork", - Expected: &SlotVirtualNetworkSwitchConnectionId{ + Expected: &SlotVirtualNetworkSwiftConnectionId{ VirtualNetworkSwiftConnectionId: VirtualNetworkSwiftConnectionId{ SiteName: "instance1", ResourceGroup: "mygroup1", From 96ade3c4916d874dd31a1fe0110a680e43bdb04e Mon Sep 17 00:00:00 2001 From: jackofallops Date: Mon, 6 Jul 2020 07:46:08 +0100 Subject: [PATCH 15/17] typo in test name prefix --- ...rce_arm_app_service_slot_virtual_network_association_test.go | 2 +- ...resource_arm_app_service_virtual_network_association_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index a7d47362b65f..fe656512e897 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -32,7 +32,7 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing. }) } -func TestAccAzureRmAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { +func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go index 9538575268ba..3883bb55cb7f 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_virtual_network_association_test.go @@ -32,7 +32,7 @@ func TestAccAzureRMAppServiceVirtualNetworkSwiftConnection_basic(t *testing.T) { }) } -func TestAccAzureRmAppServiceVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { +func TestAccAzureRMAppServiceVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ From 9c7acbeb7757d426fec83f3ede88798280d6b1a6 Mon Sep 17 00:00:00 2001 From: jackofallops Date: Mon, 6 Jul 2020 08:04:42 +0100 Subject: [PATCH 16/17] fix slot import test config --- ...rce_arm_app_service_slot_virtual_network_association_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index fe656512e897..eb9c4e7070d3 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -291,7 +291,7 @@ func testAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(da return fmt.Sprintf(` %s -resource "azurerm_app_service_slot_virtual_network_swift_connection" "test" { +resource "azurerm_app_service_slot_virtual_network_swift_connection" "import" { slot_name = azurerm_app_service_slot_virtual_network_swift_connection.test.slot_name app_service_id = azurerm_app_service_slot_virtual_network_swift_connection.test.app_service_id subnet_id = azurerm_app_service_slot_virtual_network_swift_connection.test.subnet_id From 62812dd64429478311888bf719a1ee5c89ed605f Mon Sep 17 00:00:00 2001 From: jackofallops Date: Mon, 6 Jul 2020 08:17:52 +0100 Subject: [PATCH 17/17] fix slot import test data --- ...rce_arm_app_service_slot_virtual_network_association_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go index eb9c4e7070d3..2bcdc3f4aefd 100644 --- a/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go +++ b/azurerm/internal/services/web/tests/resource_arm_app_service_slot_virtual_network_association_test.go @@ -33,7 +33,7 @@ func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_basic(t *testing. } func TestAccAzureRMAppServiceSlotVirtualNetworkSwiftConnection_requiresImport(t *testing.T) { - data := acceptance.BuildTestData(t, "azurerm_app_service_virtual_network_swift_connection", "test") + data := acceptance.BuildTestData(t, "azurerm_app_service_slot_virtual_network_swift_connection", "test") resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) },