github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/builtin/providers/aws/resource_aws_api_gateway_integration_response.go (about)

     1  package aws
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"log"
     7  	"time"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/aws/awserr"
    11  	"github.com/aws/aws-sdk-go/service/apigateway"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/helper/schema"
    14  )
    15  
    16  func resourceAwsApiGatewayIntegrationResponse() *schema.Resource {
    17  	return &schema.Resource{
    18  		Create: resourceAwsApiGatewayIntegrationResponseCreate,
    19  		Read:   resourceAwsApiGatewayIntegrationResponseRead,
    20  		Update: resourceAwsApiGatewayIntegrationResponseUpdate,
    21  		Delete: resourceAwsApiGatewayIntegrationResponseDelete,
    22  
    23  		Schema: map[string]*schema.Schema{
    24  			"rest_api_id": &schema.Schema{
    25  				Type:     schema.TypeString,
    26  				Required: true,
    27  				ForceNew: true,
    28  			},
    29  
    30  			"resource_id": &schema.Schema{
    31  				Type:     schema.TypeString,
    32  				Required: true,
    33  				ForceNew: true,
    34  			},
    35  
    36  			"http_method": &schema.Schema{
    37  				Type:         schema.TypeString,
    38  				Required:     true,
    39  				ForceNew:     true,
    40  				ValidateFunc: validateHTTPMethod,
    41  			},
    42  
    43  			"status_code": &schema.Schema{
    44  				Type:     schema.TypeString,
    45  				Required: true,
    46  			},
    47  
    48  			"selection_pattern": &schema.Schema{
    49  				Type:     schema.TypeString,
    50  				Optional: true,
    51  			},
    52  
    53  			"response_templates": &schema.Schema{
    54  				Type:     schema.TypeMap,
    55  				Optional: true,
    56  				Elem:     schema.TypeString,
    57  			},
    58  
    59  			"response_parameters_in_json": &schema.Schema{
    60  				Type:     schema.TypeString,
    61  				Optional: true,
    62  			},
    63  		},
    64  	}
    65  }
    66  
    67  func resourceAwsApiGatewayIntegrationResponseCreate(d *schema.ResourceData, meta interface{}) error {
    68  	conn := meta.(*AWSClient).apigateway
    69  
    70  	templates := make(map[string]string)
    71  	for k, v := range d.Get("response_templates").(map[string]interface{}) {
    72  		templates[k] = v.(string)
    73  	}
    74  
    75  	parameters := make(map[string]string)
    76  	if v, ok := d.GetOk("response_parameters_in_json"); ok {
    77  		if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
    78  			return fmt.Errorf("Error unmarshaling response_parameters_in_json: %s", err)
    79  		}
    80  	}
    81  
    82  	input := apigateway.PutIntegrationResponseInput{
    83  		HttpMethod:        aws.String(d.Get("http_method").(string)),
    84  		ResourceId:        aws.String(d.Get("resource_id").(string)),
    85  		RestApiId:         aws.String(d.Get("rest_api_id").(string)),
    86  		StatusCode:        aws.String(d.Get("status_code").(string)),
    87  		ResponseTemplates: aws.StringMap(templates),
    88  		// TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented
    89  		ResponseParameters: aws.StringMap(parameters),
    90  	}
    91  	if v, ok := d.GetOk("selection_pattern"); ok {
    92  		input.SelectionPattern = aws.String(v.(string))
    93  	}
    94  	_, err := conn.PutIntegrationResponse(&input)
    95  	if err != nil {
    96  		return fmt.Errorf("Error creating API Gateway Integration Response: %s", err)
    97  	}
    98  
    99  	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)))
   100  	log.Printf("[DEBUG] API Gateway Integration Response ID: %s", d.Id())
   101  
   102  	return resourceAwsApiGatewayIntegrationResponseRead(d, meta)
   103  }
   104  
   105  func resourceAwsApiGatewayIntegrationResponseRead(d *schema.ResourceData, meta interface{}) error {
   106  	conn := meta.(*AWSClient).apigateway
   107  
   108  	log.Printf("[DEBUG] Reading API Gateway Integration Response %s", d.Id())
   109  	integrationResponse, err := conn.GetIntegrationResponse(&apigateway.GetIntegrationResponseInput{
   110  		HttpMethod: aws.String(d.Get("http_method").(string)),
   111  		ResourceId: aws.String(d.Get("resource_id").(string)),
   112  		RestApiId:  aws.String(d.Get("rest_api_id").(string)),
   113  		StatusCode: aws.String(d.Get("status_code").(string)),
   114  	})
   115  	if err != nil {
   116  		if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" {
   117  			d.SetId("")
   118  			return nil
   119  		}
   120  		return err
   121  	}
   122  
   123  	log.Printf("[DEBUG] Received API Gateway Integration Response: %s", integrationResponse)
   124  
   125  	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)))
   126  	d.Set("response_templates", integrationResponse.ResponseTemplates)
   127  	d.Set("selection_pattern", integrationResponse.SelectionPattern)
   128  	d.Set("response_parameters_in_json", aws.StringValueMap(integrationResponse.ResponseParameters))
   129  	return nil
   130  }
   131  
   132  func resourceAwsApiGatewayIntegrationResponseUpdate(d *schema.ResourceData, meta interface{}) error {
   133  	return resourceAwsApiGatewayIntegrationResponseCreate(d, meta)
   134  }
   135  
   136  func resourceAwsApiGatewayIntegrationResponseDelete(d *schema.ResourceData, meta interface{}) error {
   137  	conn := meta.(*AWSClient).apigateway
   138  	log.Printf("[DEBUG] Deleting API Gateway Integration Response: %s", d.Id())
   139  
   140  	return resource.Retry(5*time.Minute, func() *resource.RetryError {
   141  		_, err := conn.DeleteIntegrationResponse(&apigateway.DeleteIntegrationResponseInput{
   142  			HttpMethod: aws.String(d.Get("http_method").(string)),
   143  			ResourceId: aws.String(d.Get("resource_id").(string)),
   144  			RestApiId:  aws.String(d.Get("rest_api_id").(string)),
   145  			StatusCode: aws.String(d.Get("status_code").(string)),
   146  		})
   147  		if err == nil {
   148  			return nil
   149  		}
   150  
   151  		apigatewayErr, ok := err.(awserr.Error)
   152  		if apigatewayErr.Code() == "NotFoundException" {
   153  			return nil
   154  		}
   155  
   156  		if !ok {
   157  			return resource.NonRetryableError(err)
   158  		}
   159  
   160  		return resource.NonRetryableError(err)
   161  	})
   162  }