github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/kubernetes/resource_kubernetes_config_map.go (about) 1 package kubernetes 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "k8s.io/apimachinery/pkg/api/errors" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 pkgApi "k8s.io/apimachinery/pkg/types" 11 api "k8s.io/kubernetes/pkg/api/v1" 12 kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" 13 ) 14 15 func resourceKubernetesConfigMap() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceKubernetesConfigMapCreate, 18 Read: resourceKubernetesConfigMapRead, 19 Exists: resourceKubernetesConfigMapExists, 20 Update: resourceKubernetesConfigMapUpdate, 21 Delete: resourceKubernetesConfigMapDelete, 22 Importer: &schema.ResourceImporter{ 23 State: schema.ImportStatePassthrough, 24 }, 25 26 Schema: map[string]*schema.Schema{ 27 "metadata": namespacedMetadataSchema("config map", true), 28 "data": { 29 Type: schema.TypeMap, 30 Description: "A map of the configuration data.", 31 Optional: true, 32 }, 33 }, 34 } 35 } 36 37 func resourceKubernetesConfigMapCreate(d *schema.ResourceData, meta interface{}) error { 38 conn := meta.(*kubernetes.Clientset) 39 40 metadata := expandMetadata(d.Get("metadata").([]interface{})) 41 cfgMap := api.ConfigMap{ 42 ObjectMeta: metadata, 43 Data: expandStringMap(d.Get("data").(map[string]interface{})), 44 } 45 log.Printf("[INFO] Creating new config map: %#v", cfgMap) 46 out, err := conn.CoreV1().ConfigMaps(metadata.Namespace).Create(&cfgMap) 47 if err != nil { 48 return err 49 } 50 log.Printf("[INFO] Submitted new config map: %#v", out) 51 d.SetId(buildId(out.ObjectMeta)) 52 53 return resourceKubernetesConfigMapRead(d, meta) 54 } 55 56 func resourceKubernetesConfigMapRead(d *schema.ResourceData, meta interface{}) error { 57 conn := meta.(*kubernetes.Clientset) 58 59 namespace, name := idParts(d.Id()) 60 log.Printf("[INFO] Reading config map %s", name) 61 cfgMap, err := conn.CoreV1().ConfigMaps(namespace).Get(name, metav1.GetOptions{}) 62 if err != nil { 63 log.Printf("[DEBUG] Received error: %#v", err) 64 return err 65 } 66 log.Printf("[INFO] Received config map: %#v", cfgMap) 67 err = d.Set("metadata", flattenMetadata(cfgMap.ObjectMeta)) 68 if err != nil { 69 return err 70 } 71 d.Set("data", cfgMap.Data) 72 73 return nil 74 } 75 76 func resourceKubernetesConfigMapUpdate(d *schema.ResourceData, meta interface{}) error { 77 conn := meta.(*kubernetes.Clientset) 78 79 namespace, name := idParts(d.Id()) 80 81 ops := patchMetadata("metadata.0.", "/metadata/", d) 82 if d.HasChange("data") { 83 oldV, newV := d.GetChange("data") 84 diffOps := diffStringMap("/data/", oldV.(map[string]interface{}), newV.(map[string]interface{})) 85 ops = append(ops, diffOps...) 86 } 87 data, err := ops.MarshalJSON() 88 if err != nil { 89 return fmt.Errorf("Failed to marshal update operations: %s", err) 90 } 91 log.Printf("[INFO] Updating config map %q: %v", name, string(data)) 92 out, err := conn.CoreV1().ConfigMaps(namespace).Patch(name, pkgApi.JSONPatchType, data) 93 if err != nil { 94 return fmt.Errorf("Failed to update Config Map: %s", err) 95 } 96 log.Printf("[INFO] Submitted updated config map: %#v", out) 97 d.SetId(buildId(out.ObjectMeta)) 98 99 return resourceKubernetesConfigMapRead(d, meta) 100 } 101 102 func resourceKubernetesConfigMapDelete(d *schema.ResourceData, meta interface{}) error { 103 conn := meta.(*kubernetes.Clientset) 104 105 namespace, name := idParts(d.Id()) 106 log.Printf("[INFO] Deleting config map: %#v", name) 107 err := conn.CoreV1().ConfigMaps(namespace).Delete(name, &metav1.DeleteOptions{}) 108 if err != nil { 109 return err 110 } 111 112 log.Printf("[INFO] Config map %s deleted", name) 113 114 d.SetId("") 115 return nil 116 } 117 118 func resourceKubernetesConfigMapExists(d *schema.ResourceData, meta interface{}) (bool, error) { 119 conn := meta.(*kubernetes.Clientset) 120 121 namespace, name := idParts(d.Id()) 122 log.Printf("[INFO] Checking config map %s", name) 123 _, err := conn.CoreV1().ConfigMaps(namespace).Get(name, metav1.GetOptions{}) 124 if err != nil { 125 if statusErr, ok := err.(*errors.StatusError); ok && statusErr.ErrStatus.Code == 404 { 126 return false, nil 127 } 128 log.Printf("[DEBUG] Received error: %#v", err) 129 } 130 return true, err 131 }