-
Notifications
You must be signed in to change notification settings - Fork 9.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add aws_api_gateway_deployment resource
- Loading branch information
Showing
6 changed files
with
452 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
169 changes: 169 additions & 0 deletions
169
builtin/providers/aws/resource_aws_api_gateway_deployment.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
package aws | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"time" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/aws/awserr" | ||
"github.com/aws/aws-sdk-go/service/apigateway" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/helper/schema" | ||
) | ||
|
||
func resourceAwsApiGatewayDeployment() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceAwsApiGatewayDeploymentCreate, | ||
Read: resourceAwsApiGatewayDeploymentRead, | ||
Update: resourceAwsApiGatewayDeploymentUpdate, | ||
Delete: resourceAwsApiGatewayDeploymentDelete, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"rest_api_id": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
|
||
"stage_name": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
|
||
"description": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
}, | ||
|
||
"stage_description": &schema.Schema{ | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
}, | ||
|
||
"variables": &schema.Schema{ | ||
Type: schema.TypeMap, | ||
Optional: true, | ||
ForceNew: true, | ||
Elem: schema.TypeString, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceAwsApiGatewayDeploymentCreate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).apigateway | ||
// Create the gateway | ||
log.Printf("[DEBUG] Creating API Gateway Deployment") | ||
|
||
variables := make(map[string]string) | ||
for k, v := range d.Get("variables").(map[string]interface{}) { | ||
variables[k] = v.(string) | ||
} | ||
|
||
var err error | ||
deployment, err := conn.CreateDeployment(&apigateway.CreateDeploymentInput{ | ||
RestApiId: aws.String(d.Get("rest_api_id").(string)), | ||
StageName: aws.String(d.Get("stage_name").(string)), | ||
Description: aws.String(d.Get("description").(string)), | ||
StageDescription: aws.String(d.Get("stage_description").(string)), | ||
Variables: aws.StringMap(variables), | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("Error creating API Gateway Deployment: %s", err) | ||
} | ||
|
||
d.SetId(*deployment.Id) | ||
log.Printf("[DEBUG] API Gateway Deployment ID: %s", d.Id()) | ||
|
||
return nil | ||
} | ||
|
||
func resourceAwsApiGatewayDeploymentRead(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).apigateway | ||
|
||
log.Printf("[DEBUG] Reading API Gateway Deployment %s", d.Id()) | ||
out, err := conn.GetDeployment(&apigateway.GetDeploymentInput{ | ||
RestApiId: aws.String(d.Get("rest_api_id").(string)), | ||
DeploymentId: aws.String(d.Id()), | ||
}) | ||
if err != nil { | ||
if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { | ||
d.SetId("") | ||
return nil | ||
} | ||
return err | ||
} | ||
log.Printf("[DEBUG] Received API Gateway Deployment: %s", out) | ||
d.SetId(*out.Id) | ||
d.Set("description", out.Description) | ||
|
||
return nil | ||
} | ||
|
||
func resourceAwsApiGatewayDeploymentUpdateOperations(d *schema.ResourceData) []*apigateway.PatchOperation { | ||
operations := make([]*apigateway.PatchOperation, 0) | ||
|
||
if d.HasChange("description") { | ||
operations = append(operations, &apigateway.PatchOperation{ | ||
Op: aws.String("replace"), | ||
Path: aws.String("/description"), | ||
Value: aws.String(d.Get("description").(string)), | ||
}) | ||
} | ||
|
||
return operations | ||
} | ||
|
||
func resourceAwsApiGatewayDeploymentUpdate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).apigateway | ||
|
||
log.Printf("[DEBUG] Updating API Gateway API Key: %s", d.Id()) | ||
|
||
_, err := conn.UpdateDeployment(&apigateway.UpdateDeploymentInput{ | ||
DeploymentId: aws.String(d.Id()), | ||
RestApiId: aws.String(d.Get("rest_api_id").(string)), | ||
PatchOperations: resourceAwsApiGatewayDeploymentUpdateOperations(d), | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return resourceAwsApiGatewayDeploymentRead(d, meta) | ||
} | ||
|
||
func resourceAwsApiGatewayDeploymentDelete(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).apigateway | ||
log.Printf("[DEBUG] Deleting API Gateway Deployment: %s", d.Id()) | ||
|
||
return resource.Retry(5*time.Minute, func() error { | ||
log.Printf("[DEBUG] schema is %#v", d) | ||
if _, err := conn.DeleteStage(&apigateway.DeleteStageInput{ | ||
StageName: aws.String(d.Get("stage_name").(string)), | ||
RestApiId: aws.String(d.Get("rest_api_id").(string)), | ||
}); err == nil { | ||
return nil | ||
} | ||
|
||
_, err := conn.DeleteDeployment(&apigateway.DeleteDeploymentInput{ | ||
DeploymentId: aws.String(d.Id()), | ||
RestApiId: aws.String(d.Get("rest_api_id").(string)), | ||
}) | ||
if err == nil { | ||
return nil | ||
} | ||
|
||
apigatewayErr, ok := err.(awserr.Error) | ||
if apigatewayErr.Code() == "NotFoundException" { | ||
return nil | ||
} | ||
|
||
if !ok { | ||
return resource.RetryError{Err: err} | ||
} | ||
|
||
return resource.RetryError{Err: err} | ||
}) | ||
} |
157 changes: 157 additions & 0 deletions
157
builtin/providers/aws/resource_aws_api_gateway_deployment_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
package aws | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/aws/awserr" | ||
"github.com/aws/aws-sdk-go/service/apigateway" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/terraform" | ||
) | ||
|
||
func TestAccAWSAPIGatewayDeployment_basic(t *testing.T) { | ||
var conf apigateway.Deployment | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckAWSAPIGatewayDeploymentDestroy, | ||
Steps: []resource.TestStep{ | ||
resource.TestStep{ | ||
Config: testAccAWSAPIGatewayDeploymentConfig, | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckAWSAPIGatewayDeploymentExists("aws_api_gateway_deployment.test", &conf), | ||
resource.TestCheckResourceAttr( | ||
"aws_api_gateway_deployment.test", "stage_name", "test"), | ||
resource.TestCheckResourceAttr( | ||
"aws_api_gateway_deployment.test", "description", "This is a test"), | ||
resource.TestCheckResourceAttr( | ||
"aws_api_gateway_deployment.test", "variables.a", "2"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccCheckAWSAPIGatewayDeploymentExists(n string, res *apigateway.Deployment) resource.TestCheckFunc { | ||
return func(s *terraform.State) error { | ||
rs, ok := s.RootModule().Resources[n] | ||
if !ok { | ||
return fmt.Errorf("Not found: %s", n) | ||
} | ||
|
||
if rs.Primary.ID == "" { | ||
return fmt.Errorf("No API Gateway Deployment ID is set") | ||
} | ||
|
||
conn := testAccProvider.Meta().(*AWSClient).apigateway | ||
|
||
req := &apigateway.GetDeploymentInput{ | ||
DeploymentId: aws.String(rs.Primary.ID), | ||
RestApiId: aws.String(s.RootModule().Resources["aws_api_gateway_rest_api.test"].Primary.ID), | ||
} | ||
describe, err := conn.GetDeployment(req) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if *describe.Id != rs.Primary.ID { | ||
return fmt.Errorf("APIGateway Deployment not found") | ||
} | ||
|
||
*res = *describe | ||
|
||
return nil | ||
} | ||
} | ||
|
||
func testAccCheckAWSAPIGatewayDeploymentDestroy(s *terraform.State) error { | ||
conn := testAccProvider.Meta().(*AWSClient).apigateway | ||
|
||
for _, rs := range s.RootModule().Resources { | ||
if rs.Type != "aws_api_gateway_resource" { | ||
continue | ||
} | ||
|
||
req := &apigateway.GetDeploymentsInput{ | ||
RestApiId: aws.String(s.RootModule().Resources["aws_api_gateway_rest_api.test"].Primary.ID), | ||
} | ||
describe, err := conn.GetDeployments(req) | ||
|
||
if err == nil { | ||
if len(describe.Items) != 0 && | ||
*describe.Items[0].Id == rs.Primary.ID { | ||
return fmt.Errorf("API Gateway Deployment still exists") | ||
} | ||
} | ||
|
||
aws2err, ok := err.(awserr.Error) | ||
if !ok { | ||
return err | ||
} | ||
if aws2err.Code() != "NotFoundException" { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
|
||
return nil | ||
} | ||
|
||
const testAccAWSAPIGatewayDeploymentConfig = ` | ||
resource "aws_api_gateway_rest_api" "test" { | ||
name = "test" | ||
} | ||
resource "aws_api_gateway_resource" "test" { | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
parent_id = "${aws_api_gateway_rest_api.test.root_resource_id}" | ||
path_part = "test" | ||
} | ||
resource "aws_api_gateway_method" "test" { | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
resource_id = "${aws_api_gateway_resource.test.id}" | ||
http_method = "GET" | ||
authorization = "NONE" | ||
} | ||
resource "aws_api_gateway_method_response" "error" { | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
resource_id = "${aws_api_gateway_resource.test.id}" | ||
http_method = "${aws_api_gateway_method.test.http_method}" | ||
status_code = "400" | ||
} | ||
resource "aws_api_gateway_integration" "test" { | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
resource_id = "${aws_api_gateway_resource.test.id}" | ||
http_method = "${aws_api_gateway_method.test.http_method}" | ||
type = "HTTP" | ||
uri = "https://www.google.de" | ||
integration_http_method = "GET" | ||
} | ||
resource "aws_api_gateway_integration_response" "test" { | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
resource_id = "${aws_api_gateway_resource.test.id}" | ||
http_method = "${aws_api_gateway_integration.test.http_method}" | ||
status_code = "${aws_api_gateway_method_response.error.status_code}" | ||
} | ||
resource "aws_api_gateway_deployment" "test" { | ||
depends_on = ["aws_api_gateway_integration.test"] | ||
rest_api_id = "${aws_api_gateway_rest_api.test.id}" | ||
stage_name = "test" | ||
description = "This is a test" | ||
variables = { | ||
"a" = "2" | ||
} | ||
} | ||
` |
Oops, something went wrong.