github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/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  }