Skip to content

Commit

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

New Resource: `azurerm_api_management_api_operation`
  • Loading branch information
tombuildsstuff committed Mar 26, 2019
2 parents ed0fd61 + 09d0075 commit 0f75b5f
Show file tree
Hide file tree
Showing 7 changed files with 1,333 additions and 0 deletions.
5 changes: 5 additions & 0 deletions azurerm/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ type ArmClient struct {

// API Management
apiManagementApiClient apimanagement.APIClient
apiManagementApiOperationsClient apimanagement.APIOperationClient
apiManagementGroupClient apimanagement.GroupClient
apiManagementGroupUsersClient apimanagement.GroupUserClient
apiManagementLoggerClient apimanagement.LoggerClient
Expand Down Expand Up @@ -502,6 +503,10 @@ func (c *ArmClient) registerApiManagementServiceClients(endpoint, subscriptionId
c.configureClient(&apisClient.Client, auth)
c.apiManagementApiClient = apisClient

apiOperationsClient := apimanagement.NewAPIOperationClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&apiOperationsClient.Client, auth)
c.apiManagementApiOperationsClient = apiOperationsClient

groupsClient := apimanagement.NewGroupClientWithBaseURI(endpoint, subscriptionId)
c.configureClient(&groupsClient.Client, auth)
c.apiManagementGroupClient = groupsClient
Expand Down
227 changes: 227 additions & 0 deletions azurerm/helpers/azure/api_management.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package azure

import (
"fmt"
"strings"

"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/validate"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func SchemaApiManagementName() *schema.Schema {
Expand Down Expand Up @@ -70,3 +75,225 @@ func SchemaApiManagementUserDataSourceName() *schema.Schema {
ValidateFunc: validate.ApiManagementUserName,
}
}

func SchemaApiManagementOperationRepresentation() *schema.Schema {
return &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"content_type": {
Type: schema.TypeString,
Required: true,
},

"form_parameter": SchemaApiManagementOperationParameterContract(),

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

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

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

func ExpandApiManagementOperationRepresentation(input []interface{}) (*[]apimanagement.RepresentationContract, error) {
if len(input) == 0 {
return &[]apimanagement.RepresentationContract{}, nil
}

outputs := make([]apimanagement.RepresentationContract, 0)

for _, v := range input {
vs := v.(map[string]interface{})

contentType := vs["content_type"].(string)
formParametersRaw := vs["form_parameter"].([]interface{})
formParameters := ExpandApiManagementOperationParameterContract(formParametersRaw)
sample := vs["sample"].(string)
schemaId := vs["schema_id"].(string)
typeName := vs["type_name"].(string)

output := apimanagement.RepresentationContract{
ContentType: utils.String(contentType),
Sample: utils.String(sample),
}

contentTypeIsFormData := strings.EqualFold(contentType, "multipart/form-data") || strings.EqualFold(contentType, "application/x-www-form-urlencoded")

// Representation formParameters can only be specified for form data content types (multipart/form-data, application/x-www-form-urlencoded)
if contentTypeIsFormData {
output.FormParameters = formParameters
} else if len(*formParameters) > 0 {
return nil, fmt.Errorf("`form_parameter` cannot be specified for form data content types (multipart/form-data, application/x-www-form-urlencoded)")
}

// Representation schemaId can only be specified for non form data content types (multipart/form-data, application/x-www-form-urlencoded).
// Representation typeName can only be specified for non form data content types (multipart/form-data, application/x-www-form-urlencoded).
if !contentTypeIsFormData {
output.SchemaID = utils.String(schemaId)
output.TypeName = utils.String(typeName)
} else if schemaId != "" {
return nil, fmt.Errorf("`schema_id` cannot be specified for non-form data content types (multipart/form-data, application/x-www-form-urlencoded)")
} else if typeName != "" {
return nil, fmt.Errorf("`type_name` cannot be specified for non-form data content types (multipart/form-data, application/x-www-form-urlencoded)")
}

outputs = append(outputs, output)
}

return &outputs, nil
}

func FlattenApiManagementOperationRepresentation(input *[]apimanagement.RepresentationContract) []interface{} {
if input == nil {
return []interface{}{}
}

outputs := make([]interface{}, 0)

for _, v := range *input {
output := make(map[string]interface{})

if v.ContentType != nil {
output["content_type"] = *v.ContentType
}

output["form_parameter"] = FlattenApiManagementOperationParameterContract(v.FormParameters)

if v.Sample != nil {
output["sample"] = *v.Sample
}

if v.SchemaID != nil {
output["schema_id"] = *v.SchemaID
}

if v.TypeName != nil {
output["type_name"] = *v.TypeName
}

outputs = append(outputs, output)
}

return outputs
}

func SchemaApiManagementOperationParameterContract() *schema.Schema {
return &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"required": {
Type: schema.TypeBool,
Required: true,
},

"description": {
Type: schema.TypeString,
Optional: true,
},
"type": {
Type: schema.TypeString,
Required: true,
},
"default_value": {
Type: schema.TypeString,
Optional: true,
},
"values": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Set: schema.HashString,
},
},
},
}
}

func ExpandApiManagementOperationParameterContract(input []interface{}) *[]apimanagement.ParameterContract {
if len(input) == 0 {
return &[]apimanagement.ParameterContract{}
}

outputs := make([]apimanagement.ParameterContract, 0)

for _, v := range input {
vs := v.(map[string]interface{})

name := vs["name"].(string)
description := vs["description"].(string)
paramType := vs["type"].(string)
defaultValue := vs["default_value"].(string)
required := vs["required"].(bool)
valuesRaw := vs["values"].(*schema.Set).List()

output := apimanagement.ParameterContract{
Name: utils.String(name),
Description: utils.String(description),
Type: utils.String(paramType),
Required: utils.Bool(required),
DefaultValue: utils.String(defaultValue),
Values: utils.ExpandStringArray(valuesRaw),
}
outputs = append(outputs, output)
}

return &outputs
}

func FlattenApiManagementOperationParameterContract(input *[]apimanagement.ParameterContract) []interface{} {
if input == nil {
return []interface{}{}
}

outputs := make([]interface{}, 0)
for _, v := range *input {
output := map[string]interface{}{}

if v.Name != nil {
output["name"] = *v.Name
}

if v.Description != nil {
output["description"] = *v.Description
}

if v.Type != nil {
output["type"] = *v.Type
}

if v.Required != nil {
output["required"] = *v.Required
}

if v.DefaultValue != nil {
output["default_value"] = *v.DefaultValue
}

output["values"] = schema.NewSet(schema.HashString, utils.FlattenStringArray(v.Values))

outputs = append(outputs, output)
}

return outputs
}
1 change: 1 addition & 0 deletions azurerm/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ func Provider() terraform.ResourceProvider {
ResourcesMap: map[string]*schema.Resource{
"azurerm_api_management": resourceArmApiManagementService(),
"azurerm_api_management_api": resourceArmApiManagementApi(),
"azurerm_api_management_api_operation": resourceArmApiManagementApiOperation(),
"azurerm_api_management_group": resourceArmApiManagementGroup(),
"azurerm_api_management_group_user": resourceArmApiManagementGroupUser(),
"azurerm_api_management_logger": resourceArmApiManagementLogger(),
Expand Down
Loading

0 comments on commit 0f75b5f

Please sign in to comment.