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  }