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 }