github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/builtin/providers/aws/resource_aws_api_gateway_method_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 resourceAwsApiGatewayMethodResponse() *schema.Resource { 17 return &schema.Resource{ 18 Create: resourceAwsApiGatewayMethodResponseCreate, 19 Read: resourceAwsApiGatewayMethodResponseRead, 20 Update: resourceAwsApiGatewayMethodResponseUpdate, 21 Delete: resourceAwsApiGatewayMethodResponseDelete, 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 "response_models": &schema.Schema{ 49 Type: schema.TypeMap, 50 Optional: true, 51 Elem: schema.TypeString, 52 }, 53 54 "response_parameters_in_json": &schema.Schema{ 55 Type: schema.TypeString, 56 Optional: true, 57 }, 58 }, 59 } 60 } 61 62 func resourceAwsApiGatewayMethodResponseCreate(d *schema.ResourceData, meta interface{}) error { 63 conn := meta.(*AWSClient).apigateway 64 65 models := make(map[string]string) 66 for k, v := range d.Get("response_models").(map[string]interface{}) { 67 models[k] = v.(string) 68 } 69 70 parameters := make(map[string]bool) 71 if v, ok := d.GetOk("response_parameters_in_json"); ok { 72 if err := json.Unmarshal([]byte(v.(string)), ¶meters); err != nil { 73 return fmt.Errorf("Error unmarshaling request_parameters_in_json: %s", err) 74 } 75 } 76 77 _, err := conn.PutMethodResponse(&apigateway.PutMethodResponseInput{ 78 HttpMethod: aws.String(d.Get("http_method").(string)), 79 ResourceId: aws.String(d.Get("resource_id").(string)), 80 RestApiId: aws.String(d.Get("rest_api_id").(string)), 81 StatusCode: aws.String(d.Get("status_code").(string)), 82 ResponseModels: aws.StringMap(models), 83 // TODO reimplement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented 84 ResponseParameters: aws.BoolMap(parameters), 85 }) 86 if err != nil { 87 return fmt.Errorf("Error creating API Gateway Method Response: %s", err) 88 } 89 90 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))) 91 log.Printf("[DEBUG] API Gateway Method ID: %s", d.Id()) 92 93 return nil 94 } 95 96 func resourceAwsApiGatewayMethodResponseRead(d *schema.ResourceData, meta interface{}) error { 97 conn := meta.(*AWSClient).apigateway 98 99 log.Printf("[DEBUG] Reading API Gateway Method %s", d.Id()) 100 methodResponse, err := conn.GetMethodResponse(&apigateway.GetMethodResponseInput{ 101 HttpMethod: aws.String(d.Get("http_method").(string)), 102 ResourceId: aws.String(d.Get("resource_id").(string)), 103 RestApiId: aws.String(d.Get("rest_api_id").(string)), 104 StatusCode: aws.String(d.Get("status_code").(string)), 105 }) 106 if err != nil { 107 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { 108 d.SetId("") 109 return nil 110 } 111 return err 112 } 113 114 log.Printf("[DEBUG] Received API Gateway Method: %s", methodResponse) 115 d.Set("response_models", aws.StringValueMap(methodResponse.ResponseModels)) 116 d.Set("response_parameters_in_json", aws.BoolValueMap(methodResponse.ResponseParameters)) 117 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))) 118 119 return nil 120 } 121 122 func resourceAwsApiGatewayMethodResponseUpdate(d *schema.ResourceData, meta interface{}) error { 123 conn := meta.(*AWSClient).apigateway 124 125 log.Printf("[DEBUG] Updating API Gateway Method Response %s", d.Id()) 126 operations := make([]*apigateway.PatchOperation, 0) 127 128 if d.HasChange("response_models") { 129 operations = append(operations, expandApiGatewayRequestResponseModelOperations(d, "response_models", "responseModels")...) 130 } 131 132 if d.HasChange("response_parameters_in_json") { 133 ops, err := expandApiGatewayMethodParametersJSONOperations(d, "response_parameters_in_json", "responseParameters") 134 if err != nil { 135 return err 136 } 137 operations = append(operations, ops...) 138 } 139 140 out, err := conn.UpdateMethodResponse(&apigateway.UpdateMethodResponseInput{ 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 PatchOperations: operations, 146 }) 147 148 if err != nil { 149 return err 150 } 151 152 log.Printf("[DEBUG] Received API Gateway Method Response: %s", out) 153 154 return resourceAwsApiGatewayMethodResponseRead(d, meta) 155 } 156 157 func resourceAwsApiGatewayMethodResponseDelete(d *schema.ResourceData, meta interface{}) error { 158 conn := meta.(*AWSClient).apigateway 159 log.Printf("[DEBUG] Deleting API Gateway Method Response: %s", d.Id()) 160 161 return resource.Retry(5*time.Minute, func() *resource.RetryError { 162 _, err := conn.DeleteMethodResponse(&apigateway.DeleteMethodResponseInput{ 163 HttpMethod: aws.String(d.Get("http_method").(string)), 164 ResourceId: aws.String(d.Get("resource_id").(string)), 165 RestApiId: aws.String(d.Get("rest_api_id").(string)), 166 StatusCode: aws.String(d.Get("status_code").(string)), 167 }) 168 if err == nil { 169 return nil 170 } 171 172 apigatewayErr, ok := err.(awserr.Error) 173 if apigatewayErr.Code() == "NotFoundException" { 174 return nil 175 } 176 177 if !ok { 178 return resource.NonRetryableError(err) 179 } 180 181 return resource.NonRetryableError(err) 182 }) 183 }