github.com/rjeczalik/terraform@v0.6.7-0.20160812060014-e251d5c7bd39/builtin/providers/aws/resource_aws_api_gateway_method.go (about)

     1  package aws
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"log"
     7  	"strconv"
     8  	"time"
     9  
    10  	"github.com/aws/aws-sdk-go/aws"
    11  	"github.com/aws/aws-sdk-go/aws/awserr"
    12  	"github.com/aws/aws-sdk-go/service/apigateway"
    13  	"github.com/hashicorp/terraform/helper/resource"
    14  	"github.com/hashicorp/terraform/helper/schema"
    15  )
    16  
    17  func resourceAwsApiGatewayMethod() *schema.Resource {
    18  	return &schema.Resource{
    19  		Create: resourceAwsApiGatewayMethodCreate,
    20  		Read:   resourceAwsApiGatewayMethodRead,
    21  		Update: resourceAwsApiGatewayMethodUpdate,
    22  		Delete: resourceAwsApiGatewayMethodDelete,
    23  
    24  		Schema: map[string]*schema.Schema{
    25  			"rest_api_id": &schema.Schema{
    26  				Type:     schema.TypeString,
    27  				Required: true,
    28  				ForceNew: true,
    29  			},
    30  
    31  			"resource_id": &schema.Schema{
    32  				Type:     schema.TypeString,
    33  				Required: true,
    34  				ForceNew: true,
    35  			},
    36  
    37  			"http_method": &schema.Schema{
    38  				Type:         schema.TypeString,
    39  				Required:     true,
    40  				ForceNew:     true,
    41  				ValidateFunc: validateHTTPMethod,
    42  			},
    43  
    44  			"authorization": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Required: true,
    47  			},
    48  
    49  			"api_key_required": &schema.Schema{
    50  				Type:     schema.TypeBool,
    51  				Optional: true,
    52  				Default:  false,
    53  			},
    54  
    55  			"request_models": &schema.Schema{
    56  				Type:     schema.TypeMap,
    57  				Optional: true,
    58  				Elem:     schema.TypeString,
    59  			},
    60  
    61  			"request_parameters": &schema.Schema{
    62  				Type:          schema.TypeMap,
    63  				Elem:          schema.TypeBool,
    64  				Optional:      true,
    65  				ConflictsWith: []string{"request_parameters_in_json"},
    66  			},
    67  
    68  			"request_parameters_in_json": &schema.Schema{
    69  				Type:          schema.TypeString,
    70  				Optional:      true,
    71  				ConflictsWith: []string{"request_parameters"},
    72  				Deprecated:    "Use field request_parameters instead",
    73  			},
    74  		},
    75  	}
    76  }
    77  
    78  func resourceAwsApiGatewayMethodCreate(d *schema.ResourceData, meta interface{}) error {
    79  	conn := meta.(*AWSClient).apigateway
    80  
    81  	models := make(map[string]string)
    82  	for k, v := range d.Get("request_models").(map[string]interface{}) {
    83  		models[k] = v.(string)
    84  	}
    85  
    86  	parameters := make(map[string]bool)
    87  	if kv, ok := d.GetOk("request_parameters"); ok {
    88  		for k, v := range kv.(map[string]interface{}) {
    89  			parameters[k], ok = v.(bool)
    90  			if !ok {
    91  				value, _ := strconv.ParseBool(v.(string))
    92  				parameters[k] = value
    93  			}
    94  		}
    95  	}
    96  	if v, ok := d.GetOk("request_parameters_in_json"); ok {
    97  		if err := json.Unmarshal([]byte(v.(string)), &parameters); err != nil {
    98  			return fmt.Errorf("Error unmarshaling request_parameters_in_json: %s", err)
    99  		}
   100  	}
   101  
   102  	_, err := conn.PutMethod(&apigateway.PutMethodInput{
   103  		AuthorizationType: aws.String(d.Get("authorization").(string)),
   104  		HttpMethod:        aws.String(d.Get("http_method").(string)),
   105  		ResourceId:        aws.String(d.Get("resource_id").(string)),
   106  		RestApiId:         aws.String(d.Get("rest_api_id").(string)),
   107  		RequestModels:     aws.StringMap(models),
   108  		RequestParameters: aws.BoolMap(parameters),
   109  		ApiKeyRequired:    aws.Bool(d.Get("api_key_required").(bool)),
   110  	})
   111  	if err != nil {
   112  		return fmt.Errorf("Error creating API Gateway Method: %s", err)
   113  	}
   114  
   115  	d.SetId(fmt.Sprintf("agm-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string)))
   116  	log.Printf("[DEBUG] API Gateway Method ID: %s", d.Id())
   117  
   118  	return nil
   119  }
   120  
   121  func resourceAwsApiGatewayMethodRead(d *schema.ResourceData, meta interface{}) error {
   122  	conn := meta.(*AWSClient).apigateway
   123  
   124  	log.Printf("[DEBUG] Reading API Gateway Method %s", d.Id())
   125  	out, err := conn.GetMethod(&apigateway.GetMethodInput{
   126  		HttpMethod: aws.String(d.Get("http_method").(string)),
   127  		ResourceId: aws.String(d.Get("resource_id").(string)),
   128  		RestApiId:  aws.String(d.Get("rest_api_id").(string)),
   129  	})
   130  	if err != nil {
   131  		if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" {
   132  			d.SetId("")
   133  			return nil
   134  		}
   135  		return err
   136  	}
   137  	log.Printf("[DEBUG] Received API Gateway Method: %s", out)
   138  	d.SetId(fmt.Sprintf("agm-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string)))
   139  	d.Set("request_parameters", aws.BoolValueMap(out.RequestParameters))
   140  	d.Set("request_parameters_in_json", aws.BoolValueMap(out.RequestParameters))
   141  
   142  	return nil
   143  }
   144  
   145  func resourceAwsApiGatewayMethodUpdate(d *schema.ResourceData, meta interface{}) error {
   146  	conn := meta.(*AWSClient).apigateway
   147  
   148  	log.Printf("[DEBUG] Reading API Gateway Method %s", d.Id())
   149  	operations := make([]*apigateway.PatchOperation, 0)
   150  	if d.HasChange("resource_id") {
   151  		operations = append(operations, &apigateway.PatchOperation{
   152  			Op:    aws.String("replace"),
   153  			Path:  aws.String("/resourceId"),
   154  			Value: aws.String(d.Get("resource_id").(string)),
   155  		})
   156  	}
   157  
   158  	if d.HasChange("request_models") {
   159  		operations = append(operations, expandApiGatewayRequestResponseModelOperations(d, "request_models", "requestModels")...)
   160  	}
   161  
   162  	if d.HasChange("request_parameters_in_json") {
   163  		ops, err := deprecatedExpandApiGatewayMethodParametersJSONOperations(d, "request_parameters_in_json", "requestParameters")
   164  		if err != nil {
   165  			return err
   166  		}
   167  		operations = append(operations, ops...)
   168  	}
   169  
   170  	if d.HasChange("request_parameters") {
   171  		parameters := make(map[string]bool)
   172  		var ok bool
   173  		for k, v := range d.Get("request_parameters").(map[string]interface{}) {
   174  			parameters[k], ok = v.(bool)
   175  			if !ok {
   176  				value, _ := strconv.ParseBool(v.(string))
   177  				parameters[k] = value
   178  			}
   179  		}
   180  		ops, err := expandApiGatewayMethodParametersOperations(d, "request_parameters", "requestParameters")
   181  		if err != nil {
   182  			return err
   183  		}
   184  		operations = append(operations, ops...)
   185  	}
   186  
   187  	method, err := conn.UpdateMethod(&apigateway.UpdateMethodInput{
   188  		HttpMethod:      aws.String(d.Get("http_method").(string)),
   189  		ResourceId:      aws.String(d.Get("resource_id").(string)),
   190  		RestApiId:       aws.String(d.Get("rest_api_id").(string)),
   191  		PatchOperations: operations,
   192  	})
   193  
   194  	if err != nil {
   195  		return err
   196  	}
   197  
   198  	log.Printf("[DEBUG] Received API Gateway Method: %s", method)
   199  
   200  	return resourceAwsApiGatewayMethodRead(d, meta)
   201  }
   202  
   203  func resourceAwsApiGatewayMethodDelete(d *schema.ResourceData, meta interface{}) error {
   204  	conn := meta.(*AWSClient).apigateway
   205  	log.Printf("[DEBUG] Deleting API Gateway Method: %s", d.Id())
   206  
   207  	return resource.Retry(5*time.Minute, func() *resource.RetryError {
   208  		_, err := conn.DeleteMethod(&apigateway.DeleteMethodInput{
   209  			HttpMethod: aws.String(d.Get("http_method").(string)),
   210  			ResourceId: aws.String(d.Get("resource_id").(string)),
   211  			RestApiId:  aws.String(d.Get("rest_api_id").(string)),
   212  		})
   213  		if err == nil {
   214  			return nil
   215  		}
   216  
   217  		apigatewayErr, ok := err.(awserr.Error)
   218  		if apigatewayErr.Code() == "NotFoundException" {
   219  			return nil
   220  		}
   221  
   222  		if !ok {
   223  			return resource.NonRetryableError(err)
   224  		}
   225  
   226  		return resource.NonRetryableError(err)
   227  	})
   228  }