github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_api_gateway_integration.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 resourceAwsApiGatewayIntegration() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsApiGatewayIntegrationCreate, 18 Read: resourceAwsApiGatewayIntegrationRead, 19 Update: resourceAwsApiGatewayIntegrationUpdate, 20 Delete: resourceAwsApiGatewayIntegrationDelete, 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 "type": &schema.Schema{ 43 Type: schema.TypeString, 44 Required: true, 45 ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { 46 value := v.(string) 47 if value != "MOCK" && value != "AWS" && value != "HTTP" { 48 errors = append(errors, fmt.Errorf( 49 "%q must be one of 'AWS', 'MOCK', 'HTTP'", k)) 50 } 51 return 52 }, 53 }, 54 55 "uri": &schema.Schema{ 56 Type: schema.TypeString, 57 Optional: true, 58 }, 59 60 "credentials": &schema.Schema{ 61 Type: schema.TypeString, 62 Optional: true, 63 }, 64 65 "integration_http_method": &schema.Schema{ 66 Type: schema.TypeString, 67 Optional: true, 68 ValidateFunc: validateHTTPMethod, 69 }, 70 71 "request_templates": &schema.Schema{ 72 Type: schema.TypeMap, 73 Optional: true, 74 Elem: schema.TypeString, 75 }, 76 }, 77 } 78 } 79 80 func resourceAwsApiGatewayIntegrationCreate(d *schema.ResourceData, meta interface{}) error { 81 conn := meta.(*AWSClient).apigateway 82 83 var integrationHttpMethod *string 84 if v, ok := d.GetOk("integration_http_method"); ok { 85 integrationHttpMethod = aws.String(v.(string)) 86 } 87 var uri *string 88 if v, ok := d.GetOk("uri"); ok { 89 uri = aws.String(v.(string)) 90 } 91 templates := make(map[string]string) 92 for k, v := range d.Get("request_templates").(map[string]interface{}) { 93 templates[k] = v.(string) 94 } 95 96 var credentials *string 97 if val, ok := d.GetOk("credentials"); ok { 98 credentials = aws.String(val.(string)) 99 } 100 101 _, err := conn.PutIntegration(&apigateway.PutIntegrationInput{ 102 HttpMethod: aws.String(d.Get("http_method").(string)), 103 ResourceId: aws.String(d.Get("resource_id").(string)), 104 RestApiId: aws.String(d.Get("rest_api_id").(string)), 105 Type: aws.String(d.Get("type").(string)), 106 IntegrationHttpMethod: integrationHttpMethod, 107 Uri: uri, 108 // TODO implement once [GH-2143](https://github.com/hashicorp/terraform/issues/2143) has been implemented 109 RequestParameters: nil, 110 RequestTemplates: aws.StringMap(templates), 111 Credentials: credentials, 112 CacheNamespace: nil, 113 CacheKeyParameters: nil, 114 }) 115 if err != nil { 116 return fmt.Errorf("Error creating API Gateway Integration: %s", err) 117 } 118 119 d.SetId(fmt.Sprintf("agi-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string))) 120 121 return nil 122 } 123 124 func resourceAwsApiGatewayIntegrationRead(d *schema.ResourceData, meta interface{}) error { 125 conn := meta.(*AWSClient).apigateway 126 127 log.Printf("[DEBUG] Reading API Gateway Integration %s", d.Id()) 128 integration, err := conn.GetIntegration(&apigateway.GetIntegrationInput{ 129 HttpMethod: aws.String(d.Get("http_method").(string)), 130 ResourceId: aws.String(d.Get("resource_id").(string)), 131 RestApiId: aws.String(d.Get("rest_api_id").(string)), 132 }) 133 if err != nil { 134 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { 135 d.SetId("") 136 return nil 137 } 138 return err 139 } 140 log.Printf("[DEBUG] Received API Gateway Integration: %s", integration) 141 d.SetId(fmt.Sprintf("agi-%s-%s-%s", d.Get("rest_api_id").(string), d.Get("resource_id").(string), d.Get("http_method").(string))) 142 143 // AWS converts "" to null on their side, convert it back 144 if v, ok := integration.RequestTemplates["application/json"]; ok && v == nil { 145 integration.RequestTemplates["application/json"] = aws.String("") 146 } 147 148 d.Set("request_templates", aws.StringValueMap(integration.RequestTemplates)) 149 d.Set("credentials", integration.Credentials) 150 d.Set("type", integration.Type) 151 d.Set("uri", integration.Uri) 152 153 return nil 154 } 155 156 func resourceAwsApiGatewayIntegrationUpdate(d *schema.ResourceData, meta interface{}) error { 157 return resourceAwsApiGatewayIntegrationCreate(d, meta) 158 } 159 160 func resourceAwsApiGatewayIntegrationDelete(d *schema.ResourceData, meta interface{}) error { 161 conn := meta.(*AWSClient).apigateway 162 log.Printf("[DEBUG] Deleting API Gateway Integration: %s", d.Id()) 163 164 return resource.Retry(5*time.Minute, func() *resource.RetryError { 165 _, err := conn.DeleteIntegration(&apigateway.DeleteIntegrationInput{ 166 HttpMethod: aws.String(d.Get("http_method").(string)), 167 ResourceId: aws.String(d.Get("resource_id").(string)), 168 RestApiId: aws.String(d.Get("rest_api_id").(string)), 169 }) 170 if err == nil { 171 return nil 172 } 173 174 apigatewayErr, ok := err.(awserr.Error) 175 if apigatewayErr.Code() == "NotFoundException" { 176 return nil 177 } 178 179 if !ok { 180 return resource.NonRetryableError(err) 181 } 182 183 return resource.NonRetryableError(err) 184 }) 185 }