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)), ¶meters); 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 }