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  }