github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/kubernetes/resource_kubernetes_namespace.go (about) 1 package kubernetes 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/helper/schema" 10 "k8s.io/apimachinery/pkg/api/errors" 11 meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 pkgApi "k8s.io/apimachinery/pkg/types" 13 api "k8s.io/kubernetes/pkg/api/v1" 14 kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" 15 ) 16 17 func resourceKubernetesNamespace() *schema.Resource { 18 return &schema.Resource{ 19 Create: resourceKubernetesNamespaceCreate, 20 Read: resourceKubernetesNamespaceRead, 21 Exists: resourceKubernetesNamespaceExists, 22 Update: resourceKubernetesNamespaceUpdate, 23 Delete: resourceKubernetesNamespaceDelete, 24 Importer: &schema.ResourceImporter{ 25 State: schema.ImportStatePassthrough, 26 }, 27 28 Schema: map[string]*schema.Schema{ 29 "metadata": metadataSchema("namespace", true), 30 }, 31 } 32 } 33 34 func resourceKubernetesNamespaceCreate(d *schema.ResourceData, meta interface{}) error { 35 conn := meta.(*kubernetes.Clientset) 36 37 metadata := expandMetadata(d.Get("metadata").([]interface{})) 38 namespace := api.Namespace{ 39 ObjectMeta: metadata, 40 } 41 log.Printf("[INFO] Creating new namespace: %#v", namespace) 42 out, err := conn.CoreV1().Namespaces().Create(&namespace) 43 if err != nil { 44 return err 45 } 46 log.Printf("[INFO] Submitted new namespace: %#v", out) 47 d.SetId(out.Name) 48 49 return resourceKubernetesNamespaceRead(d, meta) 50 } 51 52 func resourceKubernetesNamespaceRead(d *schema.ResourceData, meta interface{}) error { 53 conn := meta.(*kubernetes.Clientset) 54 55 name := d.Id() 56 log.Printf("[INFO] Reading namespace %s", name) 57 namespace, err := conn.CoreV1().Namespaces().Get(name, meta_v1.GetOptions{}) 58 if err != nil { 59 log.Printf("[DEBUG] Received error: %#v", err) 60 return err 61 } 62 log.Printf("[INFO] Received namespace: %#v", namespace) 63 err = d.Set("metadata", flattenMetadata(namespace.ObjectMeta)) 64 if err != nil { 65 return err 66 } 67 68 return nil 69 } 70 71 func resourceKubernetesNamespaceUpdate(d *schema.ResourceData, meta interface{}) error { 72 conn := meta.(*kubernetes.Clientset) 73 74 ops := patchMetadata("metadata.0.", "/metadata/", d) 75 data, err := ops.MarshalJSON() 76 if err != nil { 77 return fmt.Errorf("Failed to marshal update operations: %s", err) 78 } 79 80 log.Printf("[INFO] Updating namespace: %s", ops) 81 out, err := conn.CoreV1().Namespaces().Patch(d.Id(), pkgApi.JSONPatchType, data) 82 if err != nil { 83 return err 84 } 85 log.Printf("[INFO] Submitted updated namespace: %#v", out) 86 d.SetId(out.Name) 87 88 return resourceKubernetesNamespaceRead(d, meta) 89 } 90 91 func resourceKubernetesNamespaceDelete(d *schema.ResourceData, meta interface{}) error { 92 conn := meta.(*kubernetes.Clientset) 93 94 name := d.Id() 95 log.Printf("[INFO] Deleting namespace: %#v", name) 96 err := conn.CoreV1().Namespaces().Delete(name, &meta_v1.DeleteOptions{}) 97 if err != nil { 98 return err 99 } 100 101 stateConf := &resource.StateChangeConf{ 102 Target: []string{}, 103 Pending: []string{"Terminating"}, 104 Timeout: 5 * time.Minute, 105 Refresh: func() (interface{}, string, error) { 106 out, err := conn.CoreV1().Namespaces().Get(name, meta_v1.GetOptions{}) 107 if err != nil { 108 if statusErr, ok := err.(*errors.StatusError); ok && statusErr.ErrStatus.Code == 404 { 109 return nil, "", nil 110 } 111 log.Printf("[ERROR] Received error: %#v", err) 112 return out, "Error", err 113 } 114 115 statusPhase := fmt.Sprintf("%v", out.Status.Phase) 116 log.Printf("[DEBUG] Namespace %s status received: %#v", out.Name, statusPhase) 117 return out, statusPhase, nil 118 }, 119 } 120 _, err = stateConf.WaitForState() 121 if err != nil { 122 return err 123 } 124 log.Printf("[INFO] Namespace %s deleted", name) 125 126 d.SetId("") 127 return nil 128 } 129 130 func resourceKubernetesNamespaceExists(d *schema.ResourceData, meta interface{}) (bool, error) { 131 conn := meta.(*kubernetes.Clientset) 132 133 name := d.Id() 134 log.Printf("[INFO] Checking namespace %s", name) 135 _, err := conn.CoreV1().Namespaces().Get(name, meta_v1.GetOptions{}) 136 if err != nil { 137 if statusErr, ok := err.(*errors.StatusError); ok && statusErr.ErrStatus.Code == 404 { 138 return false, nil 139 } 140 log.Printf("[DEBUG] Received error: %#v", err) 141 } 142 log.Printf("[INFO] Namespace %s exists", name) 143 return true, err 144 }