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