github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/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 }