github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/alicloud/tags.go (about) 1 package alicloud 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/denverdino/aliyungo/ecs" 8 "github.com/hashicorp/terraform/helper/schema" 9 "strings" 10 ) 11 12 func String(v string) *string { 13 return &v 14 } 15 16 // tagsSchema returns the schema to use for tags. 17 // 18 func tagsSchema() *schema.Schema { 19 return &schema.Schema{ 20 Type: schema.TypeMap, 21 //Elem: &schema.Schema{Type: schema.TypeString}, 22 Optional: true, 23 } 24 } 25 26 // setTags is a helper to set the tags for a resource. It expects the 27 // tags field to be named "tags" 28 func setTags(client *AliyunClient, resourceType ecs.TagResourceType, d *schema.ResourceData) error { 29 30 conn := client.ecsconn 31 32 if d.HasChange("tags") { 33 oraw, nraw := d.GetChange("tags") 34 o := oraw.(map[string]interface{}) 35 n := nraw.(map[string]interface{}) 36 create, remove := diffTags(tagsFromMap(o), tagsFromMap(n)) 37 38 // Set tags 39 if len(remove) > 0 { 40 log.Printf("[DEBUG] Removing tags: %#v from %s", remove, d.Id()) 41 err := RemoveTags(conn, &RemoveTagsArgs{ 42 RegionId: client.Region, 43 ResourceId: d.Id(), 44 ResourceType: resourceType, 45 Tag: remove, 46 }) 47 if err != nil { 48 return fmt.Errorf("Remove tags got error: %s", err) 49 } 50 } 51 52 if len(create) > 0 { 53 log.Printf("[DEBUG] Creating tags: %s for %s", create, d.Id()) 54 err := AddTags(conn, &AddTagsArgs{ 55 RegionId: client.Region, 56 ResourceId: d.Id(), 57 ResourceType: resourceType, 58 Tag: create, 59 }) 60 if err != nil { 61 return fmt.Errorf("Creating tags got error: %s", err) 62 } 63 } 64 } 65 66 return nil 67 } 68 69 // diffTags takes our tags locally and the ones remotely and returns 70 // the set of tags that must be created, and the set of tags that must 71 // be destroyed. 72 func diffTags(oldTags, newTags []Tag) ([]Tag, []Tag) { 73 // First, we're creating everything we have 74 create := make(map[string]interface{}) 75 for _, t := range newTags { 76 create[t.Key] = t.Value 77 } 78 79 // Build the list of what to remove 80 var remove []Tag 81 for _, t := range oldTags { 82 old, ok := create[t.Key] 83 if !ok || old != t.Value { 84 // Delete it! 85 remove = append(remove, t) 86 } 87 } 88 89 return tagsFromMap(create), remove 90 } 91 92 // tagsFromMap returns the tags for the given map of data. 93 func tagsFromMap(m map[string]interface{}) []Tag { 94 result := make([]Tag, 0, len(m)) 95 for k, v := range m { 96 result = append(result, Tag{ 97 Key: k, 98 Value: v.(string), 99 }) 100 } 101 102 return result 103 } 104 105 func tagsToMap(tags []ecs.TagItemType) map[string]string { 106 result := make(map[string]string) 107 for _, t := range tags { 108 result[t.TagKey] = t.TagValue 109 } 110 111 return result 112 } 113 114 func tagsToString(tags []ecs.TagItemType) string { 115 result := make([]string, 0, len(tags)) 116 117 for _, tag := range tags { 118 ecsTags := ecs.TagItemType{ 119 TagKey: tag.TagKey, 120 TagValue: tag.TagValue, 121 } 122 result = append(result, ecsTags.TagKey+":"+ecsTags.TagValue) 123 } 124 125 return strings.Join(result, ",") 126 }