github.com/cbroglie/terraform@v0.7.0-rc3.0.20170410193827-735dfc416d46/builtin/providers/kubernetes/structures.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"strings"
     7  
     8  	"encoding/base64"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	api "k8s.io/kubernetes/pkg/api/v1"
    11  )
    12  
    13  func idParts(id string) (string, string) {
    14  	parts := strings.Split(id, "/")
    15  	return parts[0], parts[1]
    16  }
    17  
    18  func buildId(meta api.ObjectMeta) string {
    19  	return meta.Namespace + "/" + meta.Name
    20  }
    21  
    22  func expandMetadata(in []interface{}) api.ObjectMeta {
    23  	meta := api.ObjectMeta{}
    24  	if len(in) < 1 {
    25  		return meta
    26  	}
    27  	m := in[0].(map[string]interface{})
    28  
    29  	meta.Annotations = expandStringMap(m["annotations"].(map[string]interface{}))
    30  	meta.Labels = expandStringMap(m["labels"].(map[string]interface{}))
    31  
    32  	if v, ok := m["generate_name"]; ok {
    33  		meta.GenerateName = v.(string)
    34  	}
    35  	if v, ok := m["name"]; ok {
    36  		meta.Name = v.(string)
    37  	}
    38  	if v, ok := m["namespace"]; ok {
    39  		meta.Namespace = v.(string)
    40  	}
    41  
    42  	return meta
    43  }
    44  
    45  func patchMetadata(keyPrefix, pathPrefix string, d *schema.ResourceData) PatchOperations {
    46  	ops := make([]PatchOperation, 0, 0)
    47  	if d.HasChange(keyPrefix + "annotations") {
    48  		oldV, newV := d.GetChange(keyPrefix + "annotations")
    49  		diffOps := diffStringMap(pathPrefix+"annotations", oldV.(map[string]interface{}), newV.(map[string]interface{}))
    50  		ops = append(ops, diffOps...)
    51  	}
    52  	if d.HasChange(keyPrefix + "labels") {
    53  		oldV, newV := d.GetChange(keyPrefix + "labels")
    54  		diffOps := diffStringMap(pathPrefix+"labels", oldV.(map[string]interface{}), newV.(map[string]interface{}))
    55  		ops = append(ops, diffOps...)
    56  	}
    57  	return ops
    58  }
    59  
    60  func expandStringMap(m map[string]interface{}) map[string]string {
    61  	result := make(map[string]string)
    62  	for k, v := range m {
    63  		result[k] = v.(string)
    64  	}
    65  	return result
    66  }
    67  
    68  func flattenMetadata(meta api.ObjectMeta) []map[string]interface{} {
    69  	m := make(map[string]interface{})
    70  	m["annotations"] = filterAnnotations(meta.Annotations)
    71  	m["generate_name"] = meta.GenerateName
    72  	m["labels"] = meta.Labels
    73  	m["name"] = meta.Name
    74  	m["resource_version"] = meta.ResourceVersion
    75  	m["self_link"] = meta.SelfLink
    76  	m["uid"] = fmt.Sprintf("%v", meta.UID)
    77  	m["generation"] = meta.Generation
    78  
    79  	if meta.Namespace != "" {
    80  		m["namespace"] = meta.Namespace
    81  	}
    82  
    83  	return []map[string]interface{}{m}
    84  }
    85  
    86  func filterAnnotations(m map[string]string) map[string]string {
    87  	for k, _ := range m {
    88  		if isInternalAnnotationKey(k) {
    89  			delete(m, k)
    90  		}
    91  	}
    92  	return m
    93  }
    94  
    95  func isInternalAnnotationKey(annotationKey string) bool {
    96  	u, err := url.Parse("//" + annotationKey)
    97  	if err == nil && strings.HasSuffix(u.Hostname(), "kubernetes.io") {
    98  		return true
    99  	}
   100  
   101  	return false
   102  }
   103  
   104  func byteMapToStringMap(m map[string][]byte) map[string]string {
   105  	result := make(map[string]string)
   106  	for k, v := range m {
   107  		result[k] = string(v)
   108  	}
   109  	return result
   110  }
   111  
   112  func base64EncodeStringMap(m map[string]interface{}) map[string]interface{} {
   113  	result := make(map[string]interface{})
   114  	for k, v := range m {
   115  		value := v.(string)
   116  		result[k] = (base64.StdEncoding.EncodeToString([]byte(value)))
   117  	}
   118  	return result
   119  }