github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/tagsRedshift.go (about)

     1  package aws
     2  
     3  import (
     4  	"log"
     5  
     6  	"github.com/aws/aws-sdk-go/aws"
     7  	"github.com/aws/aws-sdk-go/service/redshift"
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  )
    10  
    11  func setTagsRedshift(conn *redshift.Redshift, d *schema.ResourceData, arn string) error {
    12  	if d.HasChange("tags") {
    13  		oraw, nraw := d.GetChange("tags")
    14  		o := oraw.(map[string]interface{})
    15  		n := nraw.(map[string]interface{})
    16  		create, remove := diffTagsRedshift(tagsFromMapRedshift(o), tagsFromMapRedshift(n))
    17  
    18  		// Set tags
    19  		if len(remove) > 0 {
    20  			log.Printf("[DEBUG] Removing tags: %#v", remove)
    21  			k := make([]*string, len(remove), len(remove))
    22  			for i, t := range remove {
    23  				k[i] = t.Key
    24  			}
    25  
    26  			_, err := conn.DeleteTags(&redshift.DeleteTagsInput{
    27  				ResourceName: aws.String(arn),
    28  				TagKeys:      k,
    29  			})
    30  			if err != nil {
    31  				return err
    32  			}
    33  		}
    34  		if len(create) > 0 {
    35  			log.Printf("[DEBUG] Creating tags: %#v", create)
    36  			_, err := conn.CreateTags(&redshift.CreateTagsInput{
    37  				ResourceName: aws.String(arn),
    38  				Tags:         create,
    39  			})
    40  			if err != nil {
    41  				return err
    42  			}
    43  		}
    44  	}
    45  
    46  	return nil
    47  }
    48  
    49  func diffTagsRedshift(oldTags, newTags []*redshift.Tag) ([]*redshift.Tag, []*redshift.Tag) {
    50  	// First, we're creating everything we have
    51  	create := make(map[string]interface{})
    52  	for _, t := range newTags {
    53  		create[*t.Key] = *t.Value
    54  	}
    55  
    56  	// Build the list of what to remove
    57  	var remove []*redshift.Tag
    58  	for _, t := range oldTags {
    59  		old, ok := create[*t.Key]
    60  		if !ok || old != *t.Value {
    61  			// Delete it!
    62  			remove = append(remove, t)
    63  		}
    64  	}
    65  
    66  	return tagsFromMapRedshift(create), remove
    67  }
    68  
    69  func tagsFromMapRedshift(m map[string]interface{}) []*redshift.Tag {
    70  	result := make([]*redshift.Tag, 0, len(m))
    71  	for k, v := range m {
    72  		result = append(result, &redshift.Tag{
    73  			Key:   aws.String(k),
    74  			Value: aws.String(v.(string)),
    75  		})
    76  	}
    77  
    78  	return result
    79  }
    80  
    81  func tagsToMapRedshift(ts []*redshift.Tag) map[string]string {
    82  	result := make(map[string]string)
    83  	for _, t := range ts {
    84  		result[*t.Key] = *t.Value
    85  	}
    86  
    87  	return result
    88  }