Skip to content

Commit

Permalink
provider/aws: Re-implement api gateway parameter handling (#7794)
Browse files Browse the repository at this point in the history
* provider/aws: Re-implement api gateway parameter handling

this PR cleans up some left overs from PR #4295, namely the parameter handling.

now that GH-2143 is finally closed this PR does away with the ugly
`request_parameters_in_json` and `response_parameters_in_json` hack.

* Add deprecation message and conflictsWith settings

following @radeksimko s advice, keeping the old code around with a deprecation
warning.

this should be cleaned up in a few releases

* provider/aws: fix missing append operation

* provider/aws: mark old parameters clearly as deprecated

* provider/aws work around #8104

following @radeksimko s lead

* provider/aws fix cnp error
  • Loading branch information
nicolai86 authored and radeksimko committed Aug 11, 2016
1 parent d7285d1 commit 66a14cb
Show file tree
Hide file tree
Showing 13 changed files with 201 additions and 78 deletions.
23 changes: 19 additions & 4 deletions builtin/providers/aws/resource_aws_api_gateway_integration.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,18 @@ func resourceAwsApiGatewayIntegration() *schema.Resource {
Elem: schema.TypeString,
},

"request_parameters": &schema.Schema{
Type: schema.TypeMap,
Elem: schema.TypeString,
Optional: true,
ConflictsWith: []string{"request_parameters_in_json"},
},

"request_parameters_in_json": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"request_parameters"},
Deprecated: "Use field request_parameters instead",
},

"passthrough_behavior": &schema.Schema{
Expand Down Expand Up @@ -107,6 +116,12 @@ func resourceAwsApiGatewayIntegrationCreate(d *schema.ResourceData, meta interfa
}

parameters := make(map[string]string)
if kv, ok := d.GetOk("request_parameters"); ok {
for k, v := range kv.(map[string]interface{}) {
parameters[k] = v.(string)
}
}

if v, ok := d.GetOk("request_parameters_in_json"); ok {
if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
return fmt.Errorf("Error unmarshaling request_parameters_in_json: %s", err)
Expand All @@ -129,8 +144,7 @@ func resourceAwsApiGatewayIntegrationCreate(d *schema.ResourceData, meta interfa
RestApiId: aws.String(d.Get("rest_api_id").(string)),
Type: aws.String(d.Get("type").(string)),
IntegrationHttpMethod: integrationHttpMethod,
Uri: uri,
// TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented
Uri: uri,
RequestParameters: aws.StringMap(parameters),
RequestTemplates: aws.StringMap(templates),
Credentials: credentials,
Expand Down Expand Up @@ -175,6 +189,7 @@ func resourceAwsApiGatewayIntegrationRead(d *schema.ResourceData, meta interface
d.Set("credentials", integration.Credentials)
d.Set("type", integration.Type)
d.Set("uri", integration.Uri)
d.Set("request_parameters", aws.StringValueMap(integration.RequestParameters))
d.Set("request_parameters_in_json", aws.StringValueMap(integration.RequestParameters))
d.Set("passthrough_behavior", integration.PassthroughBehavior)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,18 @@ func resourceAwsApiGatewayIntegrationResponse() *schema.Resource {
Elem: schema.TypeString,
},

"response_parameters": &schema.Schema{
Type: schema.TypeMap,
Elem: schema.TypeString,
Optional: true,
ConflictsWith: []string{"response_parameters_in_json"},
},

"response_parameters_in_json": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"response_parameters"},
Deprecated: "Use field response_parameters instead",
},
},
}
Expand All @@ -73,19 +82,23 @@ func resourceAwsApiGatewayIntegrationResponseCreate(d *schema.ResourceData, meta
}

parameters := make(map[string]string)
if kv, ok := d.GetOk("response_parameters"); ok {
for k, v := range kv.(map[string]interface{}) {
parameters[k] = v.(string)
}
}
if v, ok := d.GetOk("response_parameters_in_json"); ok {
if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
return fmt.Errorf("Error unmarshaling response_parameters_in_json: %s", err)
}
}

input := apigateway.PutIntegrationResponseInput{
HttpMethod: aws.String(d.Get("http_method").(string)),
ResourceId: aws.String(d.Get("resource_id").(string)),
RestApiId: aws.String(d.Get("rest_api_id").(string)),
StatusCode: aws.String(d.Get("status_code").(string)),
ResponseTemplates: aws.StringMap(templates),
// TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented
HttpMethod: aws.String(d.Get("http_method").(string)),
ResourceId: aws.String(d.Get("resource_id").(string)),
RestApiId: aws.String(d.Get("rest_api_id").(string)),
StatusCode: aws.String(d.Get("status_code").(string)),
ResponseTemplates: aws.StringMap(templates),
ResponseParameters: aws.StringMap(parameters),
}
if v, ok := d.GetOk("selection_pattern"); ok {
Expand Down Expand Up @@ -125,6 +138,7 @@ func resourceAwsApiGatewayIntegrationResponseRead(d *schema.ResourceData, meta i
d.SetId(fmt.Sprintf("agir-%s-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string), d.Get("status_code").(string)))
d.Set("response_templates", integrationResponse.ResponseTemplates)
d.Set("selection_pattern", integrationResponse.SelectionPattern)
d.Set("response_parameters", aws.StringValueMap(integrationResponse.ResponseParameters))
d.Set("response_parameters_in_json", aws.StringValueMap(integrationResponse.ResponseParameters))
return nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,9 @@ resource "aws_api_gateway_method_response" "error" {
"application/json" = "Error"
}
response_parameters_in_json = <<PARAMS
{
"method.response.header.Content-Type": true
response_parameters = {
"method.response.header.Content-Type" = true
}
PARAMS
}
resource "aws_api_gateway_integration" "test" {
Expand Down Expand Up @@ -217,11 +215,9 @@ resource "aws_api_gateway_integration_response" "test" {
"application/xml" = "#set($inputRoot = $input.path('$'))\n{ }"
}
response_parameters_in_json = <<PARAMS
{
"method.response.header.Content-Type": "integration.response.body.type"
response_parameters = {
"method.response.header.Content-Type" = "integration.response.body.type"
}
PARAMS
}
`

Expand Down Expand Up @@ -257,11 +253,9 @@ resource "aws_api_gateway_method_response" "error" {
"application/json" = "Error"
}
response_parameters_in_json = <<PARAMS
{
"method.response.header.Content-Type": true
response_parameters = {
"method.response.header.Content-Type" = true
}
PARAMS
}
resource "aws_api_gateway_integration" "test" {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,9 @@ resource "aws_api_gateway_integration" "test" {
"application/xml" = "#set($inputRoot = $input.path('$'))\n{ }"
}
request_parameters_in_json = <<PARAMS
{
"integration.request.header.X-Authorization": "'static'"
request_parameters = {
"integration.request.header.X-Authorization" = "'static'"
}
PARAMS
type = "HTTP"
uri = "https://www.google.de"
Expand Down Expand Up @@ -228,11 +226,9 @@ resource "aws_api_gateway_integration" "test" {
resource_id = "${aws_api_gateway_resource.test.id}"
http_method = "${aws_api_gateway_method.test.http_method}"
request_parameters_in_json = <<PARAMS
{
"integration.request.header.X-Authorization": "'updated'"
request_parameters = {
"integration.request.header.X-Authorization" = "'updated'"
}
PARAMS
type = "MOCK"
passthrough_behavior = "NEVER"
Expand Down
44 changes: 40 additions & 4 deletions builtin/providers/aws/resource_aws_api_gateway_method.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"log"
"strconv"
"time"

"github.com/aws/aws-sdk-go/aws"
Expand Down Expand Up @@ -57,9 +58,18 @@ func resourceAwsApiGatewayMethod() *schema.Resource {
Elem: schema.TypeString,
},

"request_parameters": &schema.Schema{
Type: schema.TypeMap,
Elem: schema.TypeBool,
Optional: true,
ConflictsWith: []string{"request_parameters_in_json"},
},

"request_parameters_in_json": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"request_parameters"},
Deprecated: "Use field request_parameters instead",
},
},
}
Expand All @@ -74,6 +84,15 @@ func resourceAwsApiGatewayMethodCreate(d *schema.ResourceData, meta interface{})
}

parameters := make(map[string]bool)
if kv, ok := d.GetOk("request_parameters"); ok {
for k, v := range kv.(map[string]interface{}) {
parameters[k], ok = v.(bool)
if !ok {
value, _ := strconv.ParseBool(v.(string))
parameters[k] = value
}
}
}
if v, ok := d.GetOk("request_parameters_in_json"); ok {
if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
return fmt.Errorf("Error unmarshaling request_parameters_in_json: %s", err)
Expand All @@ -86,7 +105,6 @@ func resourceAwsApiGatewayMethodCreate(d *schema.ResourceData, meta interface{})
ResourceId: aws.String(d.Get("resource_id").(string)),
RestApiId: aws.String(d.Get("rest_api_id").(string)),
RequestModels: aws.StringMap(models),
// TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented
RequestParameters: aws.BoolMap(parameters),
ApiKeyRequired: aws.Bool(d.Get("api_key_required").(bool)),
})
Expand Down Expand Up @@ -118,6 +136,7 @@ func resourceAwsApiGatewayMethodRead(d *schema.ResourceData, meta interface{}) e
}
log.Printf("[DEBUG] Received API Gateway Method: %s", out)
d.SetId(fmt.Sprintf("agm-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string)))
d.Set("request_parameters", aws.BoolValueMap(out.RequestParameters))
d.Set("request_parameters_in_json", aws.BoolValueMap(out.RequestParameters))

return nil
Expand All @@ -141,7 +160,24 @@ func resourceAwsApiGatewayMethodUpdate(d *schema.ResourceData, meta interface{})
}

if d.HasChange("request_parameters_in_json") {
ops, err := expandApiGatewayMethodParametersJSONOperations(d, "request_parameters_in_json", "requestParameters")
ops, err := deprecatedExpandApiGatewayMethodParametersJSONOperations(d, "request_parameters_in_json", "requestParameters")
if err != nil {
return err
}
operations = append(operations, ops...)
}

if d.HasChange("request_parameters") {
parameters := make(map[string]bool)
var ok bool
for k, v := range d.Get("request_parameters").(map[string]interface{}) {
parameters[k], ok = v.(bool)
if !ok {
value, _ := strconv.ParseBool(v.(string))
parameters[k] = value
}
}
ops, err := expandApiGatewayMethodParametersOperations(d, "request_parameters", "requestParameters")
if err != nil {
return err
}
Expand Down
45 changes: 36 additions & 9 deletions builtin/providers/aws/resource_aws_api_gateway_method_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"log"
"strconv"
"time"

"github.com/aws/aws-sdk-go/aws"
Expand Down Expand Up @@ -51,9 +52,18 @@ func resourceAwsApiGatewayMethodResponse() *schema.Resource {
Elem: schema.TypeString,
},

"response_parameters": &schema.Schema{
Type: schema.TypeMap,
Elem: schema.TypeBool,
Optional: true,
ConflictsWith: []string{"response_parameters_in_json"},
},

"response_parameters_in_json": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"response_parameters"},
Deprecated: "Use field response_parameters instead",
},
},
}
Expand All @@ -68,19 +78,27 @@ func resourceAwsApiGatewayMethodResponseCreate(d *schema.ResourceData, meta inte
}

parameters := make(map[string]bool)
if kv, ok := d.GetOk("response_parameters"); ok {
for k, v := range kv.(map[string]interface{}) {
parameters[k], ok = v.(bool)
if !ok {
value, _ := strconv.ParseBool(v.(string))
parameters[k] = value
}
}
}
if v, ok := d.GetOk("response_parameters_in_json"); ok {
if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
return fmt.Errorf("Error unmarshaling request_parameters_in_json: %s", err)
}
}

_, err := conn.PutMethodResponse(&apigateway.PutMethodResponseInput{
HttpMethod: aws.String(d.Get("http_method").(string)),
ResourceId: aws.String(d.Get("resource_id").(string)),
RestApiId: aws.String(d.Get("rest_api_id").(string)),
StatusCode: aws.String(d.Get("status_code").(string)),
ResponseModels: aws.StringMap(models),
// TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented
HttpMethod: aws.String(d.Get("http_method").(string)),
ResourceId: aws.String(d.Get("resource_id").(string)),
RestApiId: aws.String(d.Get("rest_api_id").(string)),
StatusCode: aws.String(d.Get("status_code").(string)),
ResponseModels: aws.StringMap(models),
ResponseParameters: aws.BoolMap(parameters),
})
if err != nil {
Expand Down Expand Up @@ -113,6 +131,7 @@ func resourceAwsApiGatewayMethodResponseRead(d *schema.ResourceData, meta interf

log.Printf("[DEBUG] Received API Gateway Method: %s", methodResponse)
d.Set("response_models", aws.StringValueMap(methodResponse.ResponseModels))
d.Set("response_parameters", aws.BoolValueMap(methodResponse.ResponseParameters))
d.Set("response_parameters_in_json", aws.BoolValueMap(methodResponse.ResponseParameters))
d.SetId(fmt.Sprintf("agmr-%s-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string), d.Get("status_code").(string)))

Expand All @@ -130,7 +149,15 @@ func resourceAwsApiGatewayMethodResponseUpdate(d *schema.ResourceData, meta inte
}

if d.HasChange("response_parameters_in_json") {
ops, err := expandApiGatewayMethodParametersJSONOperations(d, "response_parameters_in_json", "responseParameters")
ops, err := deprecatedExpandApiGatewayMethodParametersJSONOperations(d, "response_parameters_in_json", "responseParameters")
if err != nil {
return err
}
operations = append(operations, ops...)
}

if d.HasChange("response_parameters") {
ops, err := expandApiGatewayMethodParametersOperations(d, "response_parameters", "responseParameters")
if err != nil {
return err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,9 @@ resource "aws_api_gateway_method_response" "error" {
"application/json" = "Error"
}
response_parameters_in_json = <<PARAMS
{
"method.response.header.Content-Type": true
response_parameters = {
"method.response.header.Content-Type" = true
}
PARAMS
}
`

Expand Down Expand Up @@ -224,11 +222,8 @@ resource "aws_api_gateway_method_response" "error" {
"application/json" = "Empty"
}
response_parameters_in_json = <<PARAMS
{
"method.response.header.Host": true
response_parameters = {
"method.response.header.Host" = true
}
PARAMS
}
`
Loading

0 comments on commit 66a14cb

Please sign in to comment.