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 }