github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/kubernetes/resource_kubernetes_limit_range.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	pkgApi "k8s.io/kubernetes/pkg/api"
     9  	"k8s.io/kubernetes/pkg/api/errors"
    10  	api "k8s.io/kubernetes/pkg/api/v1"
    11  	kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
    12  )
    13  
    14  func resourceKubernetesLimitRange() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceKubernetesLimitRangeCreate,
    17  		Read:   resourceKubernetesLimitRangeRead,
    18  		Exists: resourceKubernetesLimitRangeExists,
    19  		Update: resourceKubernetesLimitRangeUpdate,
    20  		Delete: resourceKubernetesLimitRangeDelete,
    21  		Importer: &schema.ResourceImporter{
    22  			State: schema.ImportStatePassthrough,
    23  		},
    24  
    25  		Schema: map[string]*schema.Schema{
    26  			"metadata": namespacedMetadataSchema("limit range", true),
    27  			"spec": {
    28  				Type:        schema.TypeList,
    29  				Description: "Spec defines the limits enforced. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status",
    30  				Optional:    true,
    31  				MaxItems:    1,
    32  				Elem: &schema.Resource{
    33  					Schema: map[string]*schema.Schema{
    34  						"limit": {
    35  							Type:        schema.TypeList,
    36  							Description: "Limits is the list of objects that are enforced.",
    37  							Optional:    true,
    38  							Elem: &schema.Resource{
    39  								Schema: map[string]*schema.Schema{
    40  									"default": {
    41  										Type:        schema.TypeMap,
    42  										Description: "Default resource requirement limit value by resource name if resource limit is omitted.",
    43  										Optional:    true,
    44  									},
    45  									"default_request": {
    46  										Type:        schema.TypeMap,
    47  										Description: "The default resource requirement request value by resource name if resource request is omitted.",
    48  										Optional:    true,
    49  										Computed:    true,
    50  									},
    51  									"max": {
    52  										Type:        schema.TypeMap,
    53  										Description: "Max usage constraints on this kind by resource name.",
    54  										Optional:    true,
    55  									},
    56  									"max_limit_request_ratio": {
    57  										Type:        schema.TypeMap,
    58  										Description: "The named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.",
    59  										Optional:    true,
    60  									},
    61  									"min": {
    62  										Type:        schema.TypeMap,
    63  										Description: "Min usage constraints on this kind by resource name.",
    64  										Optional:    true,
    65  									},
    66  									"type": {
    67  										Type:        schema.TypeString,
    68  										Description: "Type of resource that this limit applies to.",
    69  										Optional:    true,
    70  									},
    71  								},
    72  							},
    73  						},
    74  					},
    75  				},
    76  			},
    77  		},
    78  	}
    79  }
    80  
    81  func resourceKubernetesLimitRangeCreate(d *schema.ResourceData, meta interface{}) error {
    82  	conn := meta.(*kubernetes.Clientset)
    83  
    84  	metadata := expandMetadata(d.Get("metadata").([]interface{}))
    85  	spec, err := expandLimitRangeSpec(d.Get("spec").([]interface{}), d.IsNewResource())
    86  	if err != nil {
    87  		return err
    88  	}
    89  	limitRange := api.LimitRange{
    90  		ObjectMeta: metadata,
    91  		Spec:       spec,
    92  	}
    93  	log.Printf("[INFO] Creating new limit range: %#v", limitRange)
    94  	out, err := conn.CoreV1().LimitRanges(metadata.Namespace).Create(&limitRange)
    95  	if err != nil {
    96  		return fmt.Errorf("Failed to create limit range: %s", err)
    97  	}
    98  	log.Printf("[INFO] Submitted new limit range: %#v", out)
    99  	d.SetId(buildId(out.ObjectMeta))
   100  
   101  	return resourceKubernetesLimitRangeRead(d, meta)
   102  }
   103  
   104  func resourceKubernetesLimitRangeRead(d *schema.ResourceData, meta interface{}) error {
   105  	conn := meta.(*kubernetes.Clientset)
   106  
   107  	namespace, name := idParts(d.Id())
   108  	log.Printf("[INFO] Reading limit range %s", name)
   109  	limitRange, err := conn.CoreV1().LimitRanges(namespace).Get(name)
   110  	if err != nil {
   111  		log.Printf("[DEBUG] Received error: %#v", err)
   112  		return err
   113  	}
   114  	log.Printf("[INFO] Received limit range: %#v", limitRange)
   115  
   116  	err = d.Set("metadata", flattenMetadata(limitRange.ObjectMeta))
   117  	if err != nil {
   118  		return err
   119  	}
   120  	err = d.Set("spec", flattenLimitRangeSpec(limitRange.Spec))
   121  	if err != nil {
   122  		return err
   123  	}
   124  
   125  	return nil
   126  }
   127  
   128  func resourceKubernetesLimitRangeUpdate(d *schema.ResourceData, meta interface{}) error {
   129  	conn := meta.(*kubernetes.Clientset)
   130  
   131  	namespace, name := idParts(d.Id())
   132  
   133  	ops := patchMetadata("metadata.0.", "/metadata/", d)
   134  	if d.HasChange("spec") {
   135  		spec, err := expandLimitRangeSpec(d.Get("spec").([]interface{}), d.IsNewResource())
   136  		if err != nil {
   137  			return err
   138  		}
   139  		ops = append(ops, &ReplaceOperation{
   140  			Path:  "/spec",
   141  			Value: spec,
   142  		})
   143  	}
   144  	data, err := ops.MarshalJSON()
   145  	if err != nil {
   146  		return fmt.Errorf("Failed to marshal update operations: %s", err)
   147  	}
   148  	log.Printf("[INFO] Updating limit range %q: %v", name, string(data))
   149  	out, err := conn.CoreV1().LimitRanges(namespace).Patch(name, pkgApi.JSONPatchType, data)
   150  	if err != nil {
   151  		return fmt.Errorf("Failed to update limit range: %s", err)
   152  	}
   153  	log.Printf("[INFO] Submitted updated limit range: %#v", out)
   154  	d.SetId(buildId(out.ObjectMeta))
   155  
   156  	return resourceKubernetesLimitRangeRead(d, meta)
   157  }
   158  
   159  func resourceKubernetesLimitRangeDelete(d *schema.ResourceData, meta interface{}) error {
   160  	conn := meta.(*kubernetes.Clientset)
   161  
   162  	namespace, name := idParts(d.Id())
   163  	log.Printf("[INFO] Deleting limit range: %#v", name)
   164  	err := conn.CoreV1().LimitRanges(namespace).Delete(name, &api.DeleteOptions{})
   165  	if err != nil {
   166  		return err
   167  	}
   168  
   169  	log.Printf("[INFO] Limit range %s deleted", name)
   170  
   171  	d.SetId("")
   172  	return nil
   173  }
   174  
   175  func resourceKubernetesLimitRangeExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   176  	conn := meta.(*kubernetes.Clientset)
   177  
   178  	namespace, name := idParts(d.Id())
   179  	log.Printf("[INFO] Checking limit range %s", name)
   180  	_, err := conn.CoreV1().LimitRanges(namespace).Get(name)
   181  	if err != nil {
   182  		if statusErr, ok := err.(*errors.StatusError); ok && statusErr.ErrStatus.Code == 404 {
   183  			return false, nil
   184  		}
   185  		log.Printf("[DEBUG] Received error: %#v", err)
   186  	}
   187  	return true, err
   188  }