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 }