github.com/sathiyas/terraform@v0.6.9-0.20151210233947-3330da00b997/builtin/providers/aws/tags_kinesis.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/kinesis" 8 "github.com/hashicorp/terraform/helper/schema" 9 ) 10 11 // setTags is a helper to set the tags for a resource. It expects the 12 // tags field to be named "tags" 13 func setTagsKinesis(conn *kinesis.Kinesis, d *schema.ResourceData) error { 14 15 sn := d.Get("name").(string) 16 17 if d.HasChange("tags") { 18 oraw, nraw := d.GetChange("tags") 19 o := oraw.(map[string]interface{}) 20 n := nraw.(map[string]interface{}) 21 create, remove := diffTagsKinesis(tagsFromMapKinesis(o), tagsFromMapKinesis(n)) 22 23 // Set tags 24 if len(remove) > 0 { 25 log.Printf("[DEBUG] Removing tags: %#v", remove) 26 k := make([]*string, len(remove), len(remove)) 27 for i, t := range remove { 28 k[i] = t.Key 29 } 30 31 _, err := conn.RemoveTagsFromStream(&kinesis.RemoveTagsFromStreamInput{ 32 StreamName: aws.String(sn), 33 TagKeys: k, 34 }) 35 if err != nil { 36 return err 37 } 38 } 39 40 if len(create) > 0 { 41 42 log.Printf("[DEBUG] Creating tags: %#v", create) 43 t := make(map[string]*string) 44 for _, tag := range create { 45 t[*tag.Key] = tag.Value 46 } 47 48 _, err := conn.AddTagsToStream(&kinesis.AddTagsToStreamInput{ 49 StreamName: aws.String(sn), 50 Tags: t, 51 }) 52 if err != nil { 53 return err 54 } 55 } 56 } 57 58 return nil 59 } 60 61 // diffTags takes our tags locally and the ones remotely and returns 62 // the set of tags that must be created, and the set of tags that must 63 // be destroyed. 64 func diffTagsKinesis(oldTags, newTags []*kinesis.Tag) ([]*kinesis.Tag, []*kinesis.Tag) { 65 // First, we're creating everything we have 66 create := make(map[string]interface{}) 67 for _, t := range newTags { 68 create[*t.Key] = *t.Value 69 } 70 71 // Build the list of what to remove 72 var remove []*kinesis.Tag 73 for _, t := range oldTags { 74 old, ok := create[*t.Key] 75 if !ok || old != *t.Value { 76 // Delete it! 77 remove = append(remove, t) 78 } 79 } 80 81 return tagsFromMapKinesis(create), remove 82 } 83 84 // tagsFromMap returns the tags for the given map of data. 85 func tagsFromMapKinesis(m map[string]interface{}) []*kinesis.Tag { 86 var result []*kinesis.Tag 87 for k, v := range m { 88 result = append(result, &kinesis.Tag{ 89 Key: aws.String(k), 90 Value: aws.String(v.(string)), 91 }) 92 } 93 94 return result 95 } 96 97 // tagsToMap turns the list of tags into a map. 98 func tagsToMapKinesis(ts []*kinesis.Tag) map[string]string { 99 result := make(map[string]string) 100 for _, t := range ts { 101 result[*t.Key] = *t.Value 102 } 103 104 return result 105 }