github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_api_gateway_rest_api.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 resourceAwsApiGatewayRestApi() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsApiGatewayRestApiCreate, 18 Read: resourceAwsApiGatewayRestApiRead, 19 Update: resourceAwsApiGatewayRestApiUpdate, 20 Delete: resourceAwsApiGatewayRestApiDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "name": { 24 Type: schema.TypeString, 25 Required: true, 26 }, 27 28 "description": { 29 Type: schema.TypeString, 30 Optional: true, 31 }, 32 33 "binary_media_types": { 34 Type: schema.TypeList, 35 Optional: true, 36 ForceNew: true, 37 Elem: &schema.Schema{Type: schema.TypeString}, 38 }, 39 40 "root_resource_id": { 41 Type: schema.TypeString, 42 Computed: true, 43 }, 44 45 "created_date": { 46 Type: schema.TypeString, 47 Computed: true, 48 }, 49 }, 50 } 51 } 52 53 func resourceAwsApiGatewayRestApiCreate(d *schema.ResourceData, meta interface{}) error { 54 conn := meta.(*AWSClient).apigateway 55 log.Printf("[DEBUG] Creating API Gateway") 56 57 var description *string 58 if d.Get("description").(string) != "" { 59 description = aws.String(d.Get("description").(string)) 60 } 61 62 params := &apigateway.CreateRestApiInput{ 63 Name: aws.String(d.Get("name").(string)), 64 Description: description, 65 } 66 67 binaryMediaTypes, binaryMediaTypesOk := d.GetOk("binary_media_types") 68 if binaryMediaTypesOk { 69 params.BinaryMediaTypes = expandStringList(binaryMediaTypes.([]interface{})) 70 } 71 72 gateway, err := conn.CreateRestApi(params) 73 if err != nil { 74 return fmt.Errorf("Error creating API Gateway: %s", err) 75 } 76 77 d.SetId(*gateway.Id) 78 79 if err = resourceAwsApiGatewayRestApiRefreshResources(d, meta); err != nil { 80 return err 81 } 82 83 return resourceAwsApiGatewayRestApiRead(d, meta) 84 } 85 86 func resourceAwsApiGatewayRestApiRefreshResources(d *schema.ResourceData, meta interface{}) error { 87 conn := meta.(*AWSClient).apigateway 88 89 resp, err := conn.GetResources(&apigateway.GetResourcesInput{ 90 RestApiId: aws.String(d.Id()), 91 }) 92 if err != nil { 93 return err 94 } 95 96 for _, item := range resp.Items { 97 if *item.Path == "/" { 98 d.Set("root_resource_id", item.Id) 99 break 100 } 101 } 102 103 return nil 104 } 105 106 func resourceAwsApiGatewayRestApiRead(d *schema.ResourceData, meta interface{}) error { 107 conn := meta.(*AWSClient).apigateway 108 log.Printf("[DEBUG] Reading API Gateway %s", d.Id()) 109 110 api, err := conn.GetRestApi(&apigateway.GetRestApiInput{ 111 RestApiId: aws.String(d.Id()), 112 }) 113 if err != nil { 114 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { 115 d.SetId("") 116 return nil 117 } 118 return err 119 } 120 121 d.Set("name", api.Name) 122 d.Set("description", api.Description) 123 d.Set("binary_media_types", api.BinaryMediaTypes) 124 125 if err := d.Set("created_date", api.CreatedDate.Format(time.RFC3339)); err != nil { 126 log.Printf("[DEBUG] Error setting created_date: %s", err) 127 } 128 129 return nil 130 } 131 132 func resourceAwsApiGatewayRestApiUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation { 133 operations := make([]*apigateway.PatchOperation, 0) 134 135 if d.HasChange("name") { 136 operations = append(operations, &apigateway.PatchOperation{ 137 Op: aws.String("replace"), 138 Path: aws.String("/name"), 139 Value: aws.String(d.Get("name").(string)), 140 }) 141 } 142 143 if d.HasChange("description") { 144 operations = append(operations, &apigateway.PatchOperation{ 145 Op: aws.String("replace"), 146 Path: aws.String("/description"), 147 Value: aws.String(d.Get("description").(string)), 148 }) 149 } 150 151 return operations 152 } 153 154 func resourceAwsApiGatewayRestApiUpdate(d *schema.ResourceData, meta interface{}) error { 155 conn := meta.(*AWSClient).apigateway 156 log.Printf("[DEBUG] Updating API Gateway %s", d.Id()) 157 158 _, err := conn.UpdateRestApi(&apigateway.UpdateRestApiInput{ 159 RestApiId: aws.String(d.Id()), 160 PatchOperations: resourceAwsApiGatewayRestApiUpdateOperations(d), 161 }) 162 163 if err != nil { 164 return err 165 } 166 log.Printf("[DEBUG] Updated API Gateway %s", d.Id()) 167 168 return resourceAwsApiGatewayRestApiRead(d, meta) 169 } 170 171 func resourceAwsApiGatewayRestApiDelete(d *schema.ResourceData, meta interface{}) error { 172 conn := meta.(*AWSClient).apigateway 173 log.Printf("[DEBUG] Deleting API Gateway: %s", d.Id()) 174 175 return resource.Retry(5*time.Minute, func() *resource.RetryError { 176 _, err := conn.DeleteRestApi(&apigateway.DeleteRestApiInput{ 177 RestApiId: aws.String(d.Id()), 178 }) 179 if err == nil { 180 return nil 181 } 182 183 if apigatewayErr, ok := err.(awserr.Error); ok && apigatewayErr.Code() == "NotFoundException" { 184 return nil 185 } 186 187 return resource.NonRetryableError(err) 188 }) 189 }