github.com/minamijoyo/terraform@v0.7.8-0.20161029001309-18b3736ba44b/builtin/providers/aws/resource_aws_api_gateway_deployment.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 resourceAwsApiGatewayDeployment() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsApiGatewayDeploymentCreate, 18 Read: resourceAwsApiGatewayDeploymentRead, 19 Update: resourceAwsApiGatewayDeploymentUpdate, 20 Delete: resourceAwsApiGatewayDeploymentDelete, 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 "stage_name": &schema.Schema{ 30 Type: schema.TypeString, 31 Required: true, 32 ForceNew: true, 33 }, 34 35 "description": &schema.Schema{ 36 Type: schema.TypeString, 37 Optional: true, 38 }, 39 40 "stage_description": &schema.Schema{ 41 Type: schema.TypeString, 42 Optional: true, 43 ForceNew: true, 44 }, 45 46 "variables": &schema.Schema{ 47 Type: schema.TypeMap, 48 Optional: true, 49 ForceNew: true, 50 Elem: schema.TypeString, 51 }, 52 }, 53 } 54 } 55 56 func resourceAwsApiGatewayDeploymentCreate(d *schema.ResourceData, meta interface{}) error { 57 conn := meta.(*AWSClient).apigateway 58 // Create the gateway 59 log.Printf("[DEBUG] Creating API Gateway Deployment") 60 61 variables := make(map[string]string) 62 for k, v := range d.Get("variables").(map[string]interface{}) { 63 variables[k] = v.(string) 64 } 65 66 var err error 67 deployment, err := conn.CreateDeployment(&apigateway.CreateDeploymentInput{ 68 RestApiId: aws.String(d.Get("rest_api_id").(string)), 69 StageName: aws.String(d.Get("stage_name").(string)), 70 Description: aws.String(d.Get("description").(string)), 71 StageDescription: aws.String(d.Get("stage_description").(string)), 72 Variables: aws.StringMap(variables), 73 }) 74 if err != nil { 75 return fmt.Errorf("Error creating API Gateway Deployment: %s", err) 76 } 77 78 d.SetId(*deployment.Id) 79 log.Printf("[DEBUG] API Gateway Deployment ID: %s", d.Id()) 80 81 return nil 82 } 83 84 func resourceAwsApiGatewayDeploymentRead(d *schema.ResourceData, meta interface{}) error { 85 conn := meta.(*AWSClient).apigateway 86 87 log.Printf("[DEBUG] Reading API Gateway Deployment %s", d.Id()) 88 out, err := conn.GetDeployment(&apigateway.GetDeploymentInput{ 89 RestApiId: aws.String(d.Get("rest_api_id").(string)), 90 DeploymentId: aws.String(d.Id()), 91 }) 92 if err != nil { 93 if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { 94 d.SetId("") 95 return nil 96 } 97 return err 98 } 99 log.Printf("[DEBUG] Received API Gateway Deployment: %s", out) 100 d.SetId(*out.Id) 101 d.Set("description", out.Description) 102 103 return nil 104 } 105 106 func resourceAwsApiGatewayDeploymentUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation { 107 operations := make([]*apigateway.PatchOperation, 0) 108 109 if d.HasChange("description") { 110 operations = append(operations, &apigateway.PatchOperation{ 111 Op: aws.String("replace"), 112 Path: aws.String("/description"), 113 Value: aws.String(d.Get("description").(string)), 114 }) 115 } 116 117 return operations 118 } 119 120 func resourceAwsApiGatewayDeploymentUpdate(d *schema.ResourceData, meta interface{}) error { 121 conn := meta.(*AWSClient).apigateway 122 123 log.Printf("[DEBUG] Updating API Gateway API Key: %s", d.Id()) 124 125 _, err := conn.UpdateDeployment(&apigateway.UpdateDeploymentInput{ 126 DeploymentId: aws.String(d.Id()), 127 RestApiId: aws.String(d.Get("rest_api_id").(string)), 128 PatchOperations: resourceAwsApiGatewayDeploymentUpdateOperations(d), 129 }) 130 if err != nil { 131 return err 132 } 133 134 return resourceAwsApiGatewayDeploymentRead(d, meta) 135 } 136 137 func resourceAwsApiGatewayDeploymentDelete(d *schema.ResourceData, meta interface{}) error { 138 conn := meta.(*AWSClient).apigateway 139 log.Printf("[DEBUG] Deleting API Gateway Deployment: %s", d.Id()) 140 141 return resource.Retry(5*time.Minute, func() *resource.RetryError { 142 log.Printf("[DEBUG] schema is %#v", d) 143 if _, err := conn.DeleteStage(&apigateway.DeleteStageInput{ 144 StageName: aws.String(d.Get("stage_name").(string)), 145 RestApiId: aws.String(d.Get("rest_api_id").(string)), 146 }); err == nil { 147 return nil 148 } 149 150 _, err := conn.DeleteDeployment(&apigateway.DeleteDeploymentInput{ 151 DeploymentId: aws.String(d.Id()), 152 RestApiId: aws.String(d.Get("rest_api_id").(string)), 153 }) 154 if err == nil { 155 return nil 156 } 157 158 apigatewayErr, ok := err.(awserr.Error) 159 if apigatewayErr.Code() == "NotFoundException" { 160 return nil 161 } 162 163 if !ok { 164 return resource.NonRetryableError(err) 165 } 166 167 return resource.NonRetryableError(err) 168 }) 169 }