From 131e088ea5f33442e1136b57940af65433e29099 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Sat, 15 Feb 2020 09:00:17 +0100 Subject: [PATCH 1/9] Add API Management vnet integration --- .../resource_arm_api_management.go | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/azurerm/internal/services/apimanagement/resource_arm_api_management.go b/azurerm/internal/services/apimanagement/resource_arm_api_management.go index f52e5682ee56..52fbeb20edda 100644 --- a/azurerm/internal/services/apimanagement/resource_arm_api_management.go +++ b/azurerm/internal/services/apimanagement/resource_arm_api_management.go @@ -112,6 +112,32 @@ func resourceArmApiManagementService() *schema.Resource { }, }, + "virtual_network_type": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ValidateFunc: validation.StringInSlice([]string{ + string(apimanagement.VirtualNetworkTypeNone), + string(apimanagement.VirtualNetworkTypeExternal), + string(apimanagement.VirtualNetworkTypeInternal), + }, false), + }, + + "virtual_network_configuration": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "subnet_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + }, + }, + "notification_sender_email": { Type: schema.TypeString, Optional: true, @@ -414,6 +440,7 @@ func resourceArmApiManagementServiceCreateUpdate(d *schema.ResourceData, meta in publisherName := d.Get("publisher_name").(string) publisherEmail := d.Get("publisher_email").(string) notificationSenderEmail := d.Get("notification_sender_email").(string) + virtualNetworkType := d.Get("virtual_network_type").(string) customProperties := expandApiManagementCustomProperties(d) certificates := expandAzureRmApiManagementCertificates(d) @@ -444,6 +471,18 @@ func resourceArmApiManagementServiceCreateUpdate(d *schema.ResourceData, meta in properties.ServiceProperties.NotificationSenderEmail = ¬ificationSenderEmail } + if virtualNetworkType != "" { + properties.ServiceProperties.VirtualNetworkType = apimanagement.VirtualNetworkType(virtualNetworkType) + + if virtualNetworkType != string(apimanagement.VirtualNetworkTypeNone) { + virtualNetworkConfiguration := expandAzureRmApiManagementVirtualNetworkConfigurations(d) + if virtualNetworkConfiguration == nil { + return fmt.Errorf("You must specify 'virtual_network_configuration' when 'virtual_network_type' is %q", virtualNetworkType) + } + properties.ServiceProperties.VirtualNetworkConfiguration = virtualNetworkConfiguration + } + } + future, err := client.CreateOrUpdate(ctx, resourceGroup, name, properties) if err != nil { return fmt.Errorf("creating/updating API Management Service %q (Resource Group %q): %+v", name, resourceGroup, err) @@ -570,6 +609,8 @@ func resourceArmApiManagementServiceRead(d *schema.ResourceData, meta interface{ d.Set("management_api_url", props.ManagementAPIURL) d.Set("scm_url", props.ScmURL) d.Set("public_ip_addresses", props.PublicIPAddresses) + d.Set("private_ip_addresses", props.PrivateIPAddresses) + d.Set("virtual_network_type", props.VirtualNetworkType) if err := d.Set("security", flattenApiManagementSecurityCustomProperties(props.CustomProperties)); err != nil { return fmt.Errorf("setting `security`: %+v", err) @@ -587,6 +628,10 @@ func resourceArmApiManagementServiceRead(d *schema.ResourceData, meta interface{ if err := d.Set("additional_location", flattenApiManagementAdditionalLocations(props.AdditionalLocations)); err != nil { return fmt.Errorf("setting `additional_location`: %+v", err) } + + if err := d.Set("virtual_network_configuration", flattenApiManagementVirtualNetworkConfiguration(props.VirtualNetworkConfiguration)); err != nil { + return fmt.Errorf("Error setting `virtual_network_configuration`: %+v", err) + } } if err := d.Set("sku_name", flattenApiManagementServiceSkuName(resp.Sku)); err != nil { @@ -942,6 +987,20 @@ func expandApiManagementCustomProperties(d *schema.ResourceData) map[string]*str return customProperties } +func expandAzureRmApiManagementVirtualNetworkConfigurations(d *schema.ResourceData) *apimanagement.VirtualNetworkConfiguration { + vs := d.Get("virtual_network_configuration").([]interface{}) + if len(vs) == 0 { + return nil + } + + v := vs[0].(map[string]interface{}) + subnetResourceId := v["subnet_id"].(string) + + return &apimanagement.VirtualNetworkConfiguration{ + SubnetResourceID: &subnetResourceId, + } +} + func flattenApiManagementSecurityCustomProperties(input map[string]*string) []interface{} { output := make(map[string]interface{}) @@ -964,6 +1023,20 @@ func flattenApiManagementProtocolsCustomProperties(input map[string]*string) []i return []interface{}{output} } +func flattenApiManagementVirtualNetworkConfiguration(input *apimanagement.VirtualNetworkConfiguration) []interface{} { + if input == nil { + return []interface{}{} + } + + virtualNetworkConfiguration := make(map[string]interface{}) + + if input.SubnetResourceID != nil { + virtualNetworkConfiguration["subnet_id"] = *input.SubnetResourceID + } + + return []interface{}{virtualNetworkConfiguration} +} + func apiManagementResourceHostnameSchema(schemaName string) map[string]*schema.Schema { return map[string]*schema.Schema{ "host_name": { From a664951ee02ef97f66495914b4f97ccfabfc5a94 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Sat, 15 Feb 2020 09:21:54 +0100 Subject: [PATCH 2/9] Add tests --- .../tests/resource_arm_api_management_test.go | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go index 2bb414ff7982..afc825daf9a9 100644 --- a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go +++ b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go @@ -163,6 +163,26 @@ func TestAccAzureRMApiManagement_policy(t *testing.T) { }) } +func TestAccAzureRMApiManagement_virtualNetworkInternal(t *testing.T) { + data := acceptance.BuildTestData(t, "azurerm_api_management", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMApiManagementDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAzureRMApiManagement_virtualNetworkInternal(data), + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMApiManagementExists(data.ResourceName), + resource.TestCheckResourceAttr(data.ResourceName, "virtual_network_type", "Internal"), + ), + }, + data.ImportStep(), + }, + }) +} + func testCheckAzureRMApiManagementDestroy(s *terraform.State) error { conn := acceptance.AzureProvider.Meta().(*clients.Client).ApiManagement.ServiceClient ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext @@ -506,3 +526,41 @@ resource "azurerm_api_management" "test" { } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.Locations.Secondary, data.RandomInteger, data.Locations.Ternary, data.RandomInteger) } + +func testAccAzureRMApiManagement_virtualNetworkInternal(data acceptance.TestData) string { + return fmt.Sprintf(` +resource "azurerm_resource_group" "test" { + name = "acctestRG-%d" + location = "%s" +} + +resource "azurerm_virtual_network" "test" { + name = "acctestVNET-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + address_space = ["10.0.0.0/16"] +} + +resource "azurerm_subnet" "test" { + name = "acctestSNET-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + virtual_network_name = "${azurerm_virtual_network.test.name}" + address_prefix = "10.0.1.0/24" +} + +resource "azurerm_api_management" "test" { + name = "acctestAM-%d" + location = "${azurerm_resource_group.test.location}" + resource_group_name = "${azurerm_resource_group.test.name}" + publisher_name = "pub1" + publisher_email = "pub1@email.com" + + sku_name = "Developer_1" + + virtual_network_type = "Internal" + virtual_network_configuration { + subnet_id = azurerm_subnet.test.id + } +} +`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomInteger, data.RandomInteger) +} From 560f38368ab1aa030724a7668b37ffd37a14e1b5 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Sat, 15 Feb 2020 09:47:33 +0100 Subject: [PATCH 3/9] Add website documentation --- website/docs/r/api_management.html.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/website/docs/r/api_management.html.markdown b/website/docs/r/api_management.html.markdown index e4a863dec148..796b47c74638 100644 --- a/website/docs/r/api_management.html.markdown +++ b/website/docs/r/api_management.html.markdown @@ -79,6 +79,10 @@ The following arguments are supported: * `sign_up` - (Optional) A `sign_up` block as defined below. +* `virtual_network_type` - (Optional) The type of virtual network you want to use, valid values include: `None`, `External`, `Internal`. + +* `virtual_network_configuration` - (Optional) A `virtual_network_configuration` block as defined below. Required when `virtual_network_type` is `External` or `Internal`. + * `tags` - (Optional) A mapping of tags assigned to the resource. --- @@ -244,6 +248,12 @@ A `sign_up` block supports the following: --- +A `virtual_network_configuration` block supports the following: + +* `subnet_id` - (Required) The id of the subnet that will be used for the API Management. + +--- + A `terms_of_service` block supports the following: * `consent_required` - (Required) Should the user be asked for consent during sign up? From 66e6d13c78186905edba697ccdf840728b05d6c3 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Thu, 23 Apr 2020 13:06:33 +0200 Subject: [PATCH 4/9] Add private_ip_addresses in schema --- .../services/apimanagement/resource_arm_api_management.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/azurerm/internal/services/apimanagement/resource_arm_api_management.go b/azurerm/internal/services/apimanagement/resource_arm_api_management.go index 52fbeb20edda..a3c783970452 100644 --- a/azurerm/internal/services/apimanagement/resource_arm_api_management.go +++ b/azurerm/internal/services/apimanagement/resource_arm_api_management.go @@ -64,6 +64,14 @@ func resourceArmApiManagementService() *schema.Resource { }, }, + "private_ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "publisher_name": { Type: schema.TypeString, Required: true, From 06db1d3715e15e6bf3a98862a37c8ae6e5daccab Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Thu, 23 Apr 2020 13:09:07 +0200 Subject: [PATCH 5/9] Add provider to tests --- .../apimanagement/tests/resource_arm_api_management_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go index afc825daf9a9..1d92f218eeb6 100644 --- a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go +++ b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go @@ -529,6 +529,10 @@ resource "azurerm_api_management" "test" { func testAccAzureRMApiManagement_virtualNetworkInternal(data acceptance.TestData) string { return fmt.Sprintf(` +provider "azurerm" { + features {} +} + resource "azurerm_resource_group" "test" { name = "acctestRG-%d" location = "%s" From 76de8e1ef9cd23ef3b70bde7c04c0766c3444fdb Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Thu, 23 Apr 2020 13:12:28 +0200 Subject: [PATCH 6/9] Add subnet_id validation --- .../services/apimanagement/resource_arm_api_management.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/azurerm/internal/services/apimanagement/resource_arm_api_management.go b/azurerm/internal/services/apimanagement/resource_arm_api_management.go index a3c783970452..efcdd322c283 100644 --- a/azurerm/internal/services/apimanagement/resource_arm_api_management.go +++ b/azurerm/internal/services/apimanagement/resource_arm_api_management.go @@ -138,9 +138,10 @@ func resourceArmApiManagementService() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "subnet_id": { - Type: schema.TypeString, - Required: true, - ForceNew: true, + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: azure.ValidateResourceID, }, }, }, From 8100760a27838e05c31aa95b7de60d1e70e94fa9 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Thu, 23 Apr 2020 13:15:39 +0200 Subject: [PATCH 7/9] Change error message to adhere conventions --- .../services/apimanagement/resource_arm_api_management.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/apimanagement/resource_arm_api_management.go b/azurerm/internal/services/apimanagement/resource_arm_api_management.go index efcdd322c283..35cc4b799cb4 100644 --- a/azurerm/internal/services/apimanagement/resource_arm_api_management.go +++ b/azurerm/internal/services/apimanagement/resource_arm_api_management.go @@ -639,7 +639,7 @@ func resourceArmApiManagementServiceRead(d *schema.ResourceData, meta interface{ } if err := d.Set("virtual_network_configuration", flattenApiManagementVirtualNetworkConfiguration(props.VirtualNetworkConfiguration)); err != nil { - return fmt.Errorf("Error setting `virtual_network_configuration`: %+v", err) + return fmt.Errorf("setting `virtual_network_configuration`: %+v", err) } } From 900f9459fa80fcd28d46321f10c514414aa76902 Mon Sep 17 00:00:00 2001 From: Francesco Persico Date: Thu, 23 Apr 2020 13:21:55 +0200 Subject: [PATCH 8/9] Use .12 syntax for tests --- .../tests/resource_arm_api_management_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go index 1d92f218eeb6..dca3bcafe011 100644 --- a/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go +++ b/azurerm/internal/services/apimanagement/tests/resource_arm_api_management_test.go @@ -540,22 +540,22 @@ resource "azurerm_resource_group" "test" { resource "azurerm_virtual_network" "test" { name = "acctestVNET-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name address_space = ["10.0.0.0/16"] } resource "azurerm_subnet" "test" { name = "acctestSNET-%d" - resource_group_name = "${azurerm_resource_group.test.name}" - virtual_network_name = "${azurerm_virtual_network.test.name}" + resource_group_name = azurerm_resource_group.test.name + virtual_network_name = azurerm_virtual_network.test.name address_prefix = "10.0.1.0/24" } resource "azurerm_api_management" "test" { name = "acctestAM-%d" - location = "${azurerm_resource_group.test.location}" - resource_group_name = "${azurerm_resource_group.test.name}" + location = azurerm_resource_group.test.location + resource_group_name = azurerm_resource_group.test.name publisher_name = "pub1" publisher_email = "pub1@email.com" From 9f165bab51efa9532dcf9b83b8c812748a1ca115 Mon Sep 17 00:00:00 2001 From: kt Date: Thu, 23 Apr 2020 12:51:58 -0700 Subject: [PATCH 9/9] add default to apim network type --- .../resource_arm_api_management.go | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/azurerm/internal/services/apimanagement/resource_arm_api_management.go b/azurerm/internal/services/apimanagement/resource_arm_api_management.go index 35cc4b799cb4..8beb983b5f2f 100644 --- a/azurerm/internal/services/apimanagement/resource_arm_api_management.go +++ b/azurerm/internal/services/apimanagement/resource_arm_api_management.go @@ -56,22 +56,6 @@ func resourceArmApiManagementService() *schema.Resource { "location": azure.SchemaLocation(), - "public_ip_addresses": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - - "private_ip_addresses": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - "publisher_name": { Type: schema.TypeString, Required: true, @@ -123,6 +107,7 @@ func resourceArmApiManagementService() *schema.Resource { "virtual_network_type": { Type: schema.TypeString, Optional: true, + Default: string(apimanagement.VirtualNetworkTypeNone), ForceNew: true, ValidateFunc: validation.StringInSlice([]string{ string(apimanagement.VirtualNetworkTypeNone), @@ -388,24 +373,38 @@ func resourceArmApiManagementService() *schema.Resource { }, }, - "tags": tags.Schema(), - "gateway_url": { Type: schema.TypeString, Computed: true, }, - "gateway_regional_url": { + "management_api_url": { Type: schema.TypeString, Computed: true, }, - "portal_url": { + "gateway_regional_url": { Type: schema.TypeString, Computed: true, }, - "management_api_url": { + "public_ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + + "private_ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + + "portal_url": { Type: schema.TypeString, Computed: true, }, @@ -414,6 +413,8 @@ func resourceArmApiManagementService() *schema.Resource { Type: schema.TypeString, Computed: true, }, + + "tags": tags.Schema(), }, } }