package kubernetes import ( "fmt" "net/url" "strings" "encoding/base64" "github.com/hashicorp/terraform/helper/schema" api "k8s.io/kubernetes/pkg/api/v1" ) func idParts(id string) (string, string) { parts := strings.Split(id, "/") return parts[0], parts[1] } func buildId(meta api.ObjectMeta) string { return meta.Namespace + "/" + meta.Name } func expandMetadata(in []interface{}) api.ObjectMeta { meta := api.ObjectMeta{} if len(in) < 1 { return meta } m := in[0].(map[string]interface{}) meta.Annotations = expandStringMap(m["annotations"].(map[string]interface{})) meta.Labels = expandStringMap(m["labels"].(map[string]interface{})) if v, ok := m["generate_name"]; ok { meta.GenerateName = v.(string) } if v, ok := m["name"]; ok { meta.Name = v.(string) } if v, ok := m["namespace"]; ok { meta.Namespace = v.(string) } return meta } func patchMetadata(keyPrefix, pathPrefix string, d *schema.ResourceData) PatchOperations { ops := make([]PatchOperation, 0, 0) if d.HasChange(keyPrefix + "annotations") { oldV, newV := d.GetChange(keyPrefix + "annotations") diffOps := diffStringMap(pathPrefix+"annotations", oldV.(map[string]interface{}), newV.(map[string]interface{})) ops = append(ops, diffOps...) } if d.HasChange(keyPrefix + "labels") { oldV, newV := d.GetChange(keyPrefix + "labels") diffOps := diffStringMap(pathPrefix+"labels", oldV.(map[string]interface{}), newV.(map[string]interface{})) ops = append(ops, diffOps...) } return ops } func expandStringMap(m map[string]interface{}) map[string]string { result := make(map[string]string) for k, v := range m { result[k] = v.(string) } return result } func flattenMetadata(meta api.ObjectMeta) []map[string]interface{} { m := make(map[string]interface{}) m["annotations"] = filterAnnotations(meta.Annotations) if meta.GenerateName != "" { m["generate_name"] = meta.GenerateName } m["labels"] = meta.Labels m["name"] = meta.Name m["resource_version"] = meta.ResourceVersion m["self_link"] = meta.SelfLink m["uid"] = fmt.Sprintf("%v", meta.UID) m["generation"] = meta.Generation if meta.Namespace != "" { m["namespace"] = meta.Namespace } return []map[string]interface{}{m} } func filterAnnotations(m map[string]string) map[string]string { for k, _ := range m { if isInternalAnnotationKey(k) { delete(m, k) } } return m } func isInternalAnnotationKey(annotationKey string) bool { u, err := url.Parse("//" + annotationKey) if err == nil && strings.HasSuffix(u.Hostname(), "kubernetes.io") { return true } return false } func byteMapToStringMap(m map[string][]byte) map[string]string { result := make(map[string]string) for k, v := range m { result[k] = string(v) } return result } func base64EncodeStringMap(m map[string]interface{}) map[string]interface{} { result := make(map[string]interface{}) for k, v := range m { value := v.(string) result[k] = (base64.StdEncoding.EncodeToString([]byte(value))) } return result }