provider/aws: Add support for tags to aws_cloudfront_distribution
Fixes #8959 ``` % make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSCloudFrontDistribution_S3OriginWithTags' ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2016/09/23 16:30:31 Generated command/internal_plugin_list.go TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSCloudFrontDistribution_S3OriginWithTags -timeout 120m === RUN TestAccAWSCloudFrontDistribution_S3OriginWithTags --- PASS: TestAccAWSCloudFrontDistribution_S3OriginWithTags (1234.66s) PASS ok github.com/hashicorp/terraform/builtin/providers/aws 1234.680s ```
This commit is contained in:
parent
582ba66e6c
commit
13cf370d07
|
@ -87,6 +87,7 @@ func expandDistributionConfig(d *schema.ResourceData) *cloudfront.DistributionCo
|
|||
} else {
|
||||
distributionConfig.WebACLId = aws.String("")
|
||||
}
|
||||
|
||||
return distributionConfig
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,10 @@ func resourceAwsCloudFrontDistribution() *schema.Resource {
|
|||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"arn": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
"aliases": &schema.Schema{
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
|
@ -485,17 +489,23 @@ func resourceAwsCloudFrontDistribution() *schema.Resource {
|
|||
Optional: true,
|
||||
Default: false,
|
||||
},
|
||||
|
||||
"tags": tagsSchema(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func resourceAwsCloudFrontDistributionCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
conn := meta.(*AWSClient).cloudfrontconn
|
||||
params := &cloudfront.CreateDistributionInput{
|
||||
|
||||
params := &cloudfront.CreateDistributionWithTagsInput{
|
||||
DistributionConfigWithTags: &cloudfront.DistributionConfigWithTags{
|
||||
DistributionConfig: expandDistributionConfig(d),
|
||||
Tags: tagsFromMapCloudFront(d.Get("tags").(map[string]interface{})),
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := conn.CreateDistribution(params)
|
||||
resp, err := conn.CreateDistributionWithTags(params)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -530,6 +540,21 @@ func resourceAwsCloudFrontDistributionRead(d *schema.ResourceData, meta interfac
|
|||
d.Set("last_modified_time", aws.String(resp.Distribution.LastModifiedTime.String()))
|
||||
d.Set("in_progress_validation_batches", resp.Distribution.InProgressInvalidationBatches)
|
||||
d.Set("etag", resp.ETag)
|
||||
d.Set("arn", resp.Distribution.ARN)
|
||||
|
||||
cloudFrontArn := resp.Distribution.ARN
|
||||
tagResp, tagErr := conn.ListTagsForResource(&cloudfront.ListTagsForResourceInput{
|
||||
Resource: cloudFrontArn,
|
||||
})
|
||||
|
||||
if tagErr != nil {
|
||||
log.Printf("[DEBUG] Error retrieving tags for ARN: %s", cloudFrontArn)
|
||||
}
|
||||
|
||||
if tagResp != nil {
|
||||
d.Set("tags", tagsToMapCloudFront(tagResp.Tags))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -545,6 +570,10 @@ func resourceAwsCloudFrontDistributionUpdate(d *schema.ResourceData, meta interf
|
|||
return err
|
||||
}
|
||||
|
||||
if err := setTagsCloudFront(conn, d, d.Get("arn").(string)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return resourceAwsCloudFrontDistributionRead(d, meta)
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/cloudfront"
|
||||
"github.com/hashicorp/terraform/helper/acctest"
|
||||
"github.com/hashicorp/terraform/helper/resource"
|
||||
"github.com/hashicorp/terraform/terraform"
|
||||
)
|
||||
|
@ -41,6 +42,46 @@ func TestAccAWSCloudFrontDistribution_S3Origin(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestAccAWSCloudFrontDistribution_S3OriginWithTags(t *testing.T) {
|
||||
ri := acctest.RandInt()
|
||||
preConfig := fmt.Sprintf(testAccAWSCloudFrontDistributionS3ConfigWithTags, ri, testAccAWSCloudFrontDistributionRetainConfig())
|
||||
postConfig := fmt.Sprintf(testAccAWSCloudFrontDistributionS3ConfigWithTagsUpdated, ri, testAccAWSCloudFrontDistributionRetainConfig())
|
||||
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
Providers: testAccProviders,
|
||||
CheckDestroy: testAccCheckCloudFrontDistributionDestroy,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
Config: preConfig,
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testAccCheckCloudFrontDistributionExistence(
|
||||
"aws_cloudfront_distribution.s3_distribution",
|
||||
),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_cloudfront_distribution.s3_distribution", "tags.%", "2"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_cloudfront_distribution.s3_distribution", "tags.environment", "production"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_cloudfront_distribution.s3_distribution", "tags.account", "main"),
|
||||
),
|
||||
},
|
||||
{
|
||||
Config: postConfig,
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testAccCheckCloudFrontDistributionExistence(
|
||||
"aws_cloudfront_distribution.s3_distribution",
|
||||
),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_cloudfront_distribution.s3_distribution", "tags.%", "1"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"aws_cloudfront_distribution.s3_distribution", "tags.environment", "dev"),
|
||||
),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// TestAccAWSCloudFrontDistribution_customOriginruns an
|
||||
// aws_cloudfront_distribution acceptance test with a single custom origin.
|
||||
//
|
||||
|
@ -262,6 +303,107 @@ resource "aws_cloudfront_distribution" "s3_distribution" {
|
|||
}
|
||||
`, rand.New(rand.NewSource(time.Now().UnixNano())).Int(), testAccAWSCloudFrontDistributionRetainConfig())
|
||||
|
||||
var testAccAWSCloudFrontDistributionS3ConfigWithTags = `
|
||||
variable rand_id {
|
||||
default = %d
|
||||
}
|
||||
|
||||
resource "aws_s3_bucket" "s3_bucket" {
|
||||
bucket = "mybucket.${var.rand_id}.s3.amazonaws.com"
|
||||
acl = "public-read"
|
||||
}
|
||||
|
||||
resource "aws_cloudfront_distribution" "s3_distribution" {
|
||||
origin {
|
||||
domain_name = "${aws_s3_bucket.s3_bucket.id}"
|
||||
origin_id = "myS3Origin"
|
||||
}
|
||||
enabled = true
|
||||
default_root_object = "index.html"
|
||||
aliases = [ "mysite.${var.rand_id}.example.com", "yoursite.${var.rand_id}.example.com" ]
|
||||
default_cache_behavior {
|
||||
allowed_methods = [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ]
|
||||
cached_methods = [ "GET", "HEAD" ]
|
||||
target_origin_id = "myS3Origin"
|
||||
forwarded_values {
|
||||
query_string = false
|
||||
cookies {
|
||||
forward = "none"
|
||||
}
|
||||
}
|
||||
viewer_protocol_policy = "allow-all"
|
||||
min_ttl = 0
|
||||
default_ttl = 3600
|
||||
max_ttl = 86400
|
||||
}
|
||||
price_class = "PriceClass_200"
|
||||
restrictions {
|
||||
geo_restriction {
|
||||
restriction_type = "whitelist"
|
||||
locations = [ "US", "CA", "GB", "DE" ]
|
||||
}
|
||||
}
|
||||
viewer_certificate {
|
||||
cloudfront_default_certificate = true
|
||||
}
|
||||
tags {
|
||||
environment = "production"
|
||||
account = "main"
|
||||
}
|
||||
%s
|
||||
}
|
||||
`
|
||||
|
||||
var testAccAWSCloudFrontDistributionS3ConfigWithTagsUpdated = `
|
||||
variable rand_id {
|
||||
default = %d
|
||||
}
|
||||
|
||||
resource "aws_s3_bucket" "s3_bucket" {
|
||||
bucket = "mybucket.${var.rand_id}.s3.amazonaws.com"
|
||||
acl = "public-read"
|
||||
}
|
||||
|
||||
resource "aws_cloudfront_distribution" "s3_distribution" {
|
||||
origin {
|
||||
domain_name = "${aws_s3_bucket.s3_bucket.id}"
|
||||
origin_id = "myS3Origin"
|
||||
}
|
||||
enabled = true
|
||||
default_root_object = "index.html"
|
||||
aliases = [ "mysite.${var.rand_id}.example.com", "yoursite.${var.rand_id}.example.com" ]
|
||||
default_cache_behavior {
|
||||
allowed_methods = [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ]
|
||||
cached_methods = [ "GET", "HEAD" ]
|
||||
target_origin_id = "myS3Origin"
|
||||
forwarded_values {
|
||||
query_string = false
|
||||
cookies {
|
||||
forward = "none"
|
||||
}
|
||||
}
|
||||
viewer_protocol_policy = "allow-all"
|
||||
min_ttl = 0
|
||||
default_ttl = 3600
|
||||
max_ttl = 86400
|
||||
}
|
||||
price_class = "PriceClass_200"
|
||||
restrictions {
|
||||
geo_restriction {
|
||||
restriction_type = "whitelist"
|
||||
locations = [ "US", "CA", "GB", "DE" ]
|
||||
}
|
||||
}
|
||||
viewer_certificate {
|
||||
cloudfront_default_certificate = true
|
||||
}
|
||||
tags {
|
||||
environment = "dev"
|
||||
}
|
||||
%s
|
||||
}
|
||||
`
|
||||
|
||||
var testAccAWSCloudFrontDistributionCustomConfig = fmt.Sprintf(`
|
||||
variable rand_id {
|
||||
default = %d
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
package aws
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/cloudfront"
|
||||
"github.com/hashicorp/terraform/helper/schema"
|
||||
)
|
||||
|
||||
func setTagsCloudFront(conn *cloudfront.CloudFront, d *schema.ResourceData, arn string) error {
|
||||
if d.HasChange("tags") {
|
||||
oraw, nraw := d.GetChange("tags")
|
||||
o := oraw.(map[string]interface{})
|
||||
n := nraw.(map[string]interface{})
|
||||
create, remove := diffTagsCloudFront(tagsFromMapCloudFront(o), tagsFromMapCloudFront(n))
|
||||
|
||||
if len(remove) > 0 {
|
||||
log.Printf("[DEBUG] Removing tags: %s", remove)
|
||||
k := make([]*string, 0, len(remove))
|
||||
for _, t := range remove {
|
||||
k = append(k, t.Key)
|
||||
}
|
||||
|
||||
_, err := conn.UntagResource(&cloudfront.UntagResourceInput{
|
||||
Resource: aws.String(arn),
|
||||
TagKeys: &cloudfront.TagKeys{
|
||||
Items: k,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if len(create) > 0 {
|
||||
log.Printf("[DEBUG] Creating tags: %s", create)
|
||||
_, err := conn.TagResource(&cloudfront.TagResourceInput{
|
||||
Resource: aws.String(arn),
|
||||
Tags: &cloudfront.Tags{
|
||||
Items: create,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
func diffTagsCloudFront(oldTags, newTags *cloudfront.Tags) ([]*cloudfront.Tag, []*cloudfront.Tag) {
|
||||
// First, we're creating everything we have
|
||||
create := make(map[string]interface{})
|
||||
for _, t := range newTags.Items {
|
||||
create[*t.Key] = *t.Value
|
||||
}
|
||||
|
||||
// Build the list of what to remove
|
||||
var remove []*cloudfront.Tag
|
||||
for _, t := range oldTags.Items {
|
||||
old, ok := create[*t.Key]
|
||||
if !ok || old != *t.Value {
|
||||
// Delete it!
|
||||
remove = append(remove, t)
|
||||
}
|
||||
}
|
||||
|
||||
createTags := tagsFromMapCloudFront(create)
|
||||
return createTags.Items, remove
|
||||
}
|
||||
|
||||
func tagsFromMapCloudFront(m map[string]interface{}) *cloudfront.Tags {
|
||||
result := make([]*cloudfront.Tag, 0, len(m))
|
||||
for k, v := range m {
|
||||
result = append(result, &cloudfront.Tag{
|
||||
Key: aws.String(k),
|
||||
Value: aws.String(v.(string)),
|
||||
})
|
||||
}
|
||||
|
||||
tags := &cloudfront.Tags{
|
||||
Items: result,
|
||||
}
|
||||
|
||||
return tags
|
||||
}
|
||||
|
||||
func tagsToMapCloudFront(ts *cloudfront.Tags) map[string]string {
|
||||
result := make(map[string]string)
|
||||
|
||||
for _, t := range ts.Items {
|
||||
result[*t.Key] = *t.Value
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
Loading…
Reference in New Issue