github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/builtin/providers/kubernetes/resource_kubernetes_horizontal_pod_autoscaler.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_v1 "k8s.io/kubernetes/pkg/api/v1"
    11  	api "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
    12  	kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
    13  )
    14  
    15  func resourceKubernetesHorizontalPodAutoscaler() *schema.Resource {
    16  	return &schema.Resource{
    17  		Create: resourceKubernetesHorizontalPodAutoscalerCreate,
    18  		Read:   resourceKubernetesHorizontalPodAutoscalerRead,
    19  		Exists: resourceKubernetesHorizontalPodAutoscalerExists,
    20  		Update: resourceKubernetesHorizontalPodAutoscalerUpdate,
    21  		Delete: resourceKubernetesHorizontalPodAutoscalerDelete,
    22  		Importer: &schema.ResourceImporter{
    23  			State: schema.ImportStatePassthrough,
    24  		},
    25  
    26  		Schema: map[string]*schema.Schema{
    27  			"metadata": namespacedMetadataSchema("horizontal pod autoscaler", true),
    28  			"spec": {
    29  				Type:        schema.TypeList,
    30  				Description: "Behaviour of the autoscaler. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status.",
    31  				Required:    true,
    32  				MaxItems:    1,
    33  				Elem: &schema.Resource{
    34  					Schema: map[string]*schema.Schema{
    35  						"max_replicas": {
    36  							Type:        schema.TypeInt,
    37  							Description: "Upper limit for the number of pods that can be set by the autoscaler.",
    38  							Required:    true,
    39  						},
    40  						"min_replicas": {
    41  							Type:        schema.TypeInt,
    42  							Description: "Lower limit for the number of pods that can be set by the autoscaler, defaults to `1`.",
    43  							Optional:    true,
    44  							Default:     1,
    45  						},
    46  						"scale_target_ref": {
    47  							Type:        schema.TypeList,
    48  							Description: "Reference to scaled resource. e.g. Replication Controller",
    49  							Required:    true,
    50  							MaxItems:    1,
    51  							Elem: &schema.Resource{
    52  								Schema: map[string]*schema.Schema{
    53  									"api_version": {
    54  										Type:        schema.TypeString,
    55  										Description: "API version of the referent",
    56  										Optional:    true,
    57  									},
    58  									"kind": {
    59  										Type:        schema.TypeString,
    60  										Description: "Kind of the referent. e.g. `ReplicationController`. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds",
    61  										Required:    true,
    62  									},
    63  									"name": {
    64  										Type:        schema.TypeString,
    65  										Description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names",
    66  										Required:    true,
    67  									},
    68  								},
    69  							},
    70  						},
    71  						"target_cpu_utilization_percentage": {
    72  							Type:        schema.TypeInt,
    73  							Description: "Target average CPU utilization (represented as a percentage of requested CPU) over all the pods. If not specified the default autoscaling policy will be used.",
    74  							Optional:    true,
    75  						},
    76  					},
    77  				},
    78  			},
    79  		},
    80  	}
    81  }
    82  
    83  func resourceKubernetesHorizontalPodAutoscalerCreate(d *schema.ResourceData, meta interface{}) error {
    84  	conn := meta.(*kubernetes.Clientset)
    85  
    86  	metadata := expandMetadata(d.Get("metadata").([]interface{}))
    87  	svc := api.HorizontalPodAutoscaler{
    88  		ObjectMeta: metadata,
    89  		Spec:       expandHorizontalPodAutoscalerSpec(d.Get("spec").([]interface{})),
    90  	}
    91  	log.Printf("[INFO] Creating new horizontal pod autoscaler: %#v", svc)
    92  	out, err := conn.AutoscalingV1().HorizontalPodAutoscalers(metadata.Namespace).Create(&svc)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	log.Printf("[INFO] Submitted new horizontal pod autoscaler: %#v", out)
    98  	d.SetId(buildId(out.ObjectMeta))
    99  
   100  	return resourceKubernetesHorizontalPodAutoscalerRead(d, meta)
   101  }
   102  
   103  func resourceKubernetesHorizontalPodAutoscalerRead(d *schema.ResourceData, meta interface{}) error {
   104  	conn := meta.(*kubernetes.Clientset)
   105  
   106  	namespace, name := idParts(d.Id())
   107  	log.Printf("[INFO] Reading horizontal pod autoscaler %s", name)
   108  	svc, err := conn.AutoscalingV1().HorizontalPodAutoscalers(namespace).Get(name)
   109  	if err != nil {
   110  		log.Printf("[DEBUG] Received error: %#v", err)
   111  		return err
   112  	}
   113  	log.Printf("[INFO] Received horizontal pod autoscaler: %#v", svc)
   114  	err = d.Set("metadata", flattenMetadata(svc.ObjectMeta))
   115  	if err != nil {
   116  		return err
   117  	}
   118  
   119  	flattened := flattenHorizontalPodAutoscalerSpec(svc.Spec)
   120  	log.Printf("[DEBUG] Flattened horizontal pod autoscaler spec: %#v", flattened)
   121  	err = d.Set("spec", flattened)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	return nil
   127  }
   128  
   129  func resourceKubernetesHorizontalPodAutoscalerUpdate(d *schema.ResourceData, meta interface{}) error {
   130  	conn := meta.(*kubernetes.Clientset)
   131  
   132  	namespace, name := idParts(d.Id())
   133  
   134  	ops := patchMetadata("metadata.0.", "/metadata/", d)
   135  	if d.HasChange("spec") {
   136  		diffOps := patchHorizontalPodAutoscalerSpec("spec.0.", "/spec", d)
   137  		ops = append(ops, diffOps...)
   138  	}
   139  	data, err := ops.MarshalJSON()
   140  	if err != nil {
   141  		return fmt.Errorf("Failed to marshal update operations: %s", err)
   142  	}
   143  	log.Printf("[INFO] Updating horizontal pod autoscaler %q: %v", name, string(data))
   144  	out, err := conn.AutoscalingV1().HorizontalPodAutoscalers(namespace).Patch(name, pkgApi.JSONPatchType, data)
   145  	if err != nil {
   146  		return fmt.Errorf("Failed to update horizontal pod autoscaler: %s", err)
   147  	}
   148  	log.Printf("[INFO] Submitted updated horizontal pod autoscaler: %#v", out)
   149  	d.SetId(buildId(out.ObjectMeta))
   150  
   151  	return resourceKubernetesHorizontalPodAutoscalerRead(d, meta)
   152  }
   153  
   154  func resourceKubernetesHorizontalPodAutoscalerDelete(d *schema.ResourceData, meta interface{}) error {
   155  	conn := meta.(*kubernetes.Clientset)
   156  
   157  	namespace, name := idParts(d.Id())
   158  	log.Printf("[INFO] Deleting horizontal pod autoscaler: %#v", name)
   159  	err := conn.AutoscalingV1().HorizontalPodAutoscalers(namespace).Delete(name, &api_v1.DeleteOptions{})
   160  	if err != nil {
   161  		return err
   162  	}
   163  
   164  	log.Printf("[INFO] Horizontal Pod Autoscaler %s deleted", name)
   165  
   166  	d.SetId("")
   167  	return nil
   168  }
   169  
   170  func resourceKubernetesHorizontalPodAutoscalerExists(d *schema.ResourceData, meta interface{}) (bool, error) {
   171  	conn := meta.(*kubernetes.Clientset)
   172  
   173  	namespace, name := idParts(d.Id())
   174  	log.Printf("[INFO] Checking horizontal pod autoscaler %s", name)
   175  	_, err := conn.AutoscalingV1().HorizontalPodAutoscalers(namespace).Get(name)
   176  	if err != nil {
   177  		if statusErr, ok := err.(*errors.StatusError); ok && statusErr.ErrStatus.Code == 404 {
   178  			return false, nil
   179  		}
   180  		log.Printf("[DEBUG] Received error: %#v", err)
   181  	}
   182  	return true, err
   183  }