Skip to content

Commit

Permalink
Merge pull request #3143 from terraform-providers/f/api-management-op…
Browse files Browse the repository at this point in the history
…enidconnect

New Resource: `azurerm_api_management_openid_connect_provider`
  • Loading branch information
tombuildsstuff authored Mar 29, 2019
2 parents 6631cb8 + 600ff88 commit 7132256
Show file tree
Hide file tree
Showing 8 changed files with 545 additions and 1 deletion.
5 changes: 5 additions & 0 deletions azurerm/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ type ArmClient struct {
apiManagementGroupClient apimanagement.GroupClient
apiManagementGroupUsersClient apimanagement.GroupUserClient
apiManagementLoggerClient apimanagement.LoggerClient
apiManagementOpenIdConnectClient apimanagement.OpenIDConnectProviderClient
apiManagementProductsClient apimanagement.ProductClient
apiManagementProductApisClient apimanagement.ProductAPIClient
apiManagementProductGroupsClient apimanagement.ProductGroupClient
Expand Down Expand Up @@ -523,6 +524,10 @@ func (c *ArmClient) registerApiManagementServiceClients(endpoint, subscriptionId
c.configureClient(&serviceClient.Client, auth)
c.apiManagementServiceClient = serviceClient

openIdConnectClient := apimanagement.NewOpenIDConnectProviderClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&openIdConnectClient.Client, auth)
c.apiManagementOpenIdConnectClient = openIdConnectClient

productsClient := apimanagement.NewProductClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&productsClient.Client, auth)
c.apiManagementProductsClient = productsClient
Expand Down
1 change: 1 addition & 0 deletions azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ func Provider() terraform.ResourceProvider {
"azurerm_api_management_group": resourceArmApiManagementGroup(),
"azurerm_api_management_group_user": resourceArmApiManagementGroupUser(),
"azurerm_api_management_logger": resourceArmApiManagementLogger(),
"azurerm_api_management_openid_connect_provider": resourceArmApiManagementOpenIDConnectProvider(),
"azurerm_api_management_product": resourceArmApiManagementProduct(),
"azurerm_api_management_product_api": resourceArmApiManagementProductApi(),
"azurerm_api_management_product_group": resourceArmApiManagementProductGroup(),
Expand Down
17 changes: 16 additions & 1 deletion azurerm/resource_arm_api_management_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/Azure/azure-sdk-for-go/services/apimanagement/mgmt/2018-01-01/apimanagement"
"github.com/hashicorp/terraform/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/helpers/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)
Expand Down Expand Up @@ -100,6 +101,19 @@ func resourceArmApiManagementLoggerCreate(d *schema.ResourceData, meta interface
return fmt.Errorf("Either `eventhub` or `application_insights` is required")
}

if requireResourcesToBeImported && d.IsNewResource() {
existing, err := client.Get(ctx, resourceGroup, serviceName, name)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("Error checking for presence of existing Logger %q (API Management Service %q / Resource Group %q): %s", name, serviceName, resourceGroup, err)
}
}

if existing.ID != nil && *existing.ID != "" {
return tf.ImportAsExistsError("azurerm_api_management_logger", *existing.ID)
}
}

parameters := apimanagement.LoggerContract{
LoggerContractProperties: &apimanagement.LoggerContractProperties{
IsBuffered: utils.Bool(d.Get("buffered").(bool)),
Expand Down Expand Up @@ -207,8 +221,9 @@ func resourceArmApiManagementLoggerDelete(d *schema.ResourceData, meta interface

id, err := parseAzureResourceID(d.Id())
if err != nil {
return fmt.Errorf("Error parsing API Management Logger ID %q: %+v", d.Id(), err)
return err
}

resourceGroup := id.ResourceGroup
serviceName := id.Path["service"]
name := id.Path["loggers"]
Expand Down
51 changes: 51 additions & 0 deletions azurerm/resource_arm_api_management_logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,39 @@ func TestAccAzureRMApiManagementLogger_basicEventHub(t *testing.T) {
})
}

func TestAccAzureRMApiManagementLogger_requiresImport(t *testing.T) {
if !requireResourcesToBeImported {
t.Skip("Skipping since resources aren't required to be imported")
return
}

resourceName := "azurerm_api_management_logger.test"
ri := tf.AccRandTimeInt()
location := testLocation()

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testCheckAzureRMApiManagementLoggerDestroy,
Steps: []resource.TestStep{
{
Config: testAccAzureRMApiManagementLogger_basicEventHub(ri, location),
Check: resource.ComposeTestCheckFunc(
testCheckAzureRMApiManagementLoggerExists(resourceName),
resource.TestCheckResourceAttr(resourceName, "buffered", "true"),
resource.TestCheckResourceAttr(resourceName, "eventhub.#", "1"),
resource.TestCheckResourceAttrSet(resourceName, "eventhub.0.name"),
resource.TestCheckResourceAttrSet(resourceName, "eventhub.0.connection_string"),
),
},
{
Config: testAccAzureRMApiManagementLogger_requiresImport(ri, location),
ExpectError: testRequiresImportError("azurerm_api_management_logger"),
},
},
})
}

func TestAccAzureRMApiManagementLogger_basicApplicationInsights(t *testing.T) {
resourceName := "azurerm_api_management_logger.test"
ri := tf.AccRandTimeInt()
Expand Down Expand Up @@ -279,6 +312,24 @@ resource "azurerm_api_management_logger" "test" {
`, rInt, location, rInt, rInt, rInt, rInt)
}

func testAccAzureRMApiManagementLogger_requiresImport(rInt int, location string) string {
template := testAccAzureRMApiManagementLogger_basicEventHub(rInt, location)
return fmt.Sprintf(`
%s
resource "azurerm_api_management_logger" "import" {
name = "${azurerm_api_management_logger.test.name}"
api_management_name = "${azurerm_api_management_logger.test.api_management_name}"
resource_group_name = "${azurerm_api_management_logger.test.resource_group_name}"
eventhub {
name = "${azurerm_eventhub.test.name}"
connection_string = "${azurerm_eventhub_namespace.test.default_primary_connection_string}"
}
}
`, template)
}

func testAccAzureRMApiManagementLogger_basicApplicationInsights(rInt int, location string) string {
return fmt.Sprintf(`
resource "azurerm_resource_group" "test" {
Expand Down
170 changes: 170 additions & 0 deletions azurerm/resource_arm_api_management_openid_connect_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
package azurerm

import (
"fmt"
"log"

"github.com/Azure/azure-sdk-for-go/services/apimanagement/mgmt/2018-01-01/apimanagement"
"github.com/hashicorp/terraform/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/helpers/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func resourceArmApiManagementOpenIDConnectProvider() *schema.Resource {
return &schema.Resource{
Create: resourceArmApiManagementOpenIDConnectProviderCreateUpdate,
Read: resourceArmApiManagementOpenIDConnectProviderRead,
Update: resourceArmApiManagementOpenIDConnectProviderCreateUpdate,
Delete: resourceArmApiManagementOpenIDConnectProviderDelete,

Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": azure.SchemaApiManagementChildName(),

"resource_group_name": resourceGroupNameSchema(),

"api_management_name": azure.SchemaApiManagementName(),

"client_id": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
ValidateFunc: validate.NoEmptyStrings,
},

"client_secret": {
Type: schema.TypeString,
Required: true,
Sensitive: true,
ValidateFunc: validate.NoEmptyStrings,
},

"display_name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validate.NoEmptyStrings,
},

"metadata_endpoint": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validate.NoEmptyStrings,
},

"description": {
Type: schema.TypeString,
Optional: true,
},
},
}
}

func resourceArmApiManagementOpenIDConnectProviderCreateUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).apiManagementOpenIdConnectClient
ctx := meta.(*ArmClient).StopContext

name := d.Get("name").(string)
resourceGroup := d.Get("resource_group_name").(string)
serviceName := d.Get("api_management_name").(string)

if requireResourcesToBeImported && d.IsNewResource() {
existing, err := client.Get(ctx, resourceGroup, serviceName, name)
if err != nil {
if !utils.ResponseWasNotFound(existing.Response) {
return fmt.Errorf("Error checking for presence of existing OpenID Connect Provider %q (API Management Service %q / Resource Group %q): %s", name, serviceName, resourceGroup, err)
}
}

if existing.ID != nil && *existing.ID != "" {
return tf.ImportAsExistsError("azurerm_api_management_openid_connect_provider", *existing.ID)
}
}

parameters := apimanagement.OpenidConnectProviderContract{
OpenidConnectProviderContractProperties: &apimanagement.OpenidConnectProviderContractProperties{
ClientID: utils.String(d.Get("client_id").(string)),
ClientSecret: utils.String(d.Get("client_secret").(string)),
Description: utils.String(d.Get("description").(string)),
DisplayName: utils.String(d.Get("display_name").(string)),
MetadataEndpoint: utils.String(d.Get("metadata_endpoint").(string)),
},
}

if _, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, parameters, ""); err != nil {
return fmt.Errorf("Error creating OpenID Connect Provider %q (Resource Group %q / API Management Service %q): %+v", name, resourceGroup, serviceName, err)
}

resp, err := client.Get(ctx, resourceGroup, serviceName, name)
if err != nil {
return fmt.Errorf("Error retrieving OpenID Connect Provider %q (Resource Group %q / API Management Service %q): %+v", name, resourceGroup, serviceName, err)
}
if resp.ID == nil {
return fmt.Errorf("Cannot read OpenID Connect Provider %q (Resource Group %q / API Management Service %q) ID", name, resourceGroup, serviceName)
}
d.SetId(*resp.ID)

return resourceArmApiManagementOpenIDConnectProviderRead(d, meta)
}

func resourceArmApiManagementOpenIDConnectProviderRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).apiManagementOpenIdConnectClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resourceGroup := id.ResourceGroup
serviceName := id.Path["service"]
name := id.Path["openidConnectProviders"]

resp, err := client.Get(ctx, resourceGroup, serviceName, name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
log.Printf("[INFO] OpenID Connect Provider %q (API Management Service %q / Resource Group %q) was not found - removing from state", name, serviceName, resourceGroup)
d.SetId("")
return nil
}
return fmt.Errorf("Error reading OpenID Connect Provider %q (API Management Service %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err)
}

d.Set("name", resp.Name)
d.Set("resource_group_name", resourceGroup)
d.Set("api_management_name", serviceName)

if props := resp.OpenidConnectProviderContractProperties; props != nil {
d.Set("client_id", props.ClientID)
d.Set("client_secret", props.ClientSecret)
d.Set("description", props.Description)
d.Set("display_name", props.DisplayName)
d.Set("metadata_endpoint", props.MetadataEndpoint)
}

return nil
}

func resourceArmApiManagementOpenIDConnectProviderDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient).apiManagementOpenIdConnectClient
ctx := meta.(*ArmClient).StopContext

id, err := parseAzureResourceID(d.Id())
if err != nil {
return err
}
resourceGroup := id.ResourceGroup
serviceName := id.Path["service"]
name := id.Path["openidConnectProviders"]

if resp, err := client.Delete(ctx, resourceGroup, serviceName, name, ""); err != nil {
if !utils.ResponseWasNotFound(resp) {
return fmt.Errorf("Error deleting OpenID Connect Provider %q (Resource Group %q / API Management Service %q): %+v", name, resourceGroup, serviceName, err)
}
}

return nil
}
Loading

0 comments on commit 7132256

Please sign in to comment.