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  }