This is an automated email from the ASF dual-hosted git repository. davidjumani pushed a commit to branch add-cks-versions in repository https://gitbox.apache.org/repos/asf/cloudstack-terraform-provider.git
commit 069d8e9340d4e3080eb037e4358457f250105cf1 Author: davidjumani <[email protected]> AuthorDate: Fri Jun 10 14:37:02 2022 +0530 Adding support for Kubernetes ISOs --- .gitignore | 2 + cloudstack/provider.go | 1 + .../resource_cloudstack_kubernetes_version.go | 209 +++++++++++++++++++++ go.mod | 2 +- go.sum | 2 + 5 files changed, 215 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5982d2c..b6b0f36 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ website/vendor # Test exclusions !command/test-fixtures/**/*.tfstate !command/test-fixtures/**/.terraform/ +.terraform.lock.hcl +provider.tf diff --git a/cloudstack/provider.go b/cloudstack/provider.go index 534e03a..4949c2f 100644 --- a/cloudstack/provider.go +++ b/cloudstack/provider.go @@ -90,6 +90,7 @@ func Provider() terraform.ResourceProvider { "cloudstack_instance": resourceCloudStackInstance(), "cloudstack_ipaddress": resourceCloudStackIPAddress(), "cloudstack_kubernetes_cluster": resourceCloudStackKubernetesCluster(), + "cloudstack_kubernetes_version": resourceCloudStackKubernetesVersion(), "cloudstack_loadbalancer_rule": resourceCloudStackLoadBalancerRule(), "cloudstack_network": resourceCloudStackNetwork(), "cloudstack_network_acl": resourceCloudStackNetworkACL(), diff --git a/cloudstack/resource_cloudstack_kubernetes_version.go b/cloudstack/resource_cloudstack_kubernetes_version.go new file mode 100644 index 0000000..96eb42d --- /dev/null +++ b/cloudstack/resource_cloudstack_kubernetes_version.go @@ -0,0 +1,209 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package cloudstack + +import ( + "fmt" + "log" + "strings" + + "github.com/apache/cloudstack-go/v2/cloudstack" + "github.com/hashicorp/terraform/helper/schema" +) + +func resourceCloudStackKubernetesVersion() *schema.Resource { + return &schema.Resource{ + Create: resourceCloudStackKubernetesVersionCreate, + Read: resourceCloudStackKubernetesVersionRead, + Update: resourceCloudStackKubernetesVersionUpdate, + Delete: resourceCloudStackKubernetesVersionDelete, + Importer: &schema.ResourceImporter{ + State: importStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + + "semantic_version": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "url": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + + "min_cpu": { + Type: schema.TypeInt, + Required: true, + ForceNew: true, + }, + + "min_memory": { + Type: schema.TypeInt, + Required: true, + ForceNew: true, + }, + + // Optional Params + "name": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + }, + + "zone": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ForceNew: true, + }, + + "checksum": { + Type: schema.TypeString, + Optional: true, + }, + + "state": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + }, + } +} + +func resourceCloudStackKubernetesVersionCreate(d *schema.ResourceData, meta interface{}) error { + cs := meta.(*cloudstack.CloudStackClient) + + // State is always Enabled when created + if state, ok := d.GetOk("state"); ok { + if state.(string) != "Enabled" { + return fmt.Errorf("State must be 'Enabled' when first creating a cluster") + } + } + + semanticVersion := d.Get("semantic_version").(string) + url := d.Get("url").(string) + minCpu := d.Get("min_cpu").(int) + minMemory := d.Get("min_memory").(int) + + p := cs.Kubernetes.NewAddKubernetesSupportedVersionParams(minCpu, minMemory, semanticVersion) + p.SetUrl(url) + + if name, ok := d.GetOk("name"); ok { + p.SetName(name.(string)) + } + if checksum, ok := d.GetOk("checksum"); ok { + p.SetName(checksum.(string)) + } + if zone, ok := d.GetOk("zone"); ok { + zoneID, e := retrieveID(cs, "zone", zone.(string)) + if e != nil { + return e.Error() + } + p.SetZoneid(zoneID) + } + + log.Printf("[DEBUG] Creating Kubernetes Version %s", semanticVersion) + r, err := cs.Kubernetes.AddKubernetesSupportedVersion(p) + if err != nil { + return err + } + + log.Printf("[DEBUG] Kubernetes Version %s successfully created", semanticVersion) + d.SetId(r.Id) + return resourceCloudStackKubernetesVersionRead(d, meta) +} + +func resourceCloudStackKubernetesVersionRead(d *schema.ResourceData, meta interface{}) error { + cs := meta.(*cloudstack.CloudStackClient) + + log.Printf("[DEBUG] Retrieving Kubernetes Version %s", d.Get("semantic_version").(string)) + fmt.Println(d.Id()) + + // Get the Kubernetes Version details + version, count, err := cs.Kubernetes.GetKubernetesSupportedVersionByID( + d.Id(), + ) + fmt.Println(version, count, err) + + if err != nil { + if count == 0 { + log.Printf("[DEBUG] Kubernetes Version %s does not longer exist", d.Get("semantic_version").(string)) + d.SetId("") + return nil + } + + return err + } + + // Update the config + d.SetId(version.Id) + d.Set("semantic_version", version.Semanticversion) + d.Set("name", version.Name) + d.Set("min_cpu", version.Mincpunumber) + d.Set("min_memory", version.Minmemory) + d.Set("state", version.State) + + setValueOrID(d, "zone", version.Zonename, version.Zoneid) + return nil +} + +func resourceCloudStackKubernetesVersionUpdate(d *schema.ResourceData, meta interface{}) error { + cs := meta.(*cloudstack.CloudStackClient) + d.Partial(true) + + if d.HasChange("state") { + p := cs.Kubernetes.NewUpdateKubernetesSupportedVersionParams(d.Id(), d.Get("state").(string)) + _, err := cs.Kubernetes.UpdateKubernetesSupportedVersion(p) + if err != nil { + return fmt.Errorf( + "Error Updating Kubernetes Version %s: %s", d.Id(), err) + } + d.SetPartial("state") + } + return resourceCloudStackKubernetesVersionRead(d, meta) +} + +func resourceCloudStackKubernetesVersionDelete(d *schema.ResourceData, meta interface{}) error { + cs := meta.(*cloudstack.CloudStackClient) + + // Create a new parameter struct + p := cs.Kubernetes.NewDeleteKubernetesSupportedVersionParams(d.Id()) + + // Delete the Kubernetes Version + _, err := cs.Kubernetes.DeleteKubernetesSupportedVersion(p) + if err != nil { + // This is a very poor way to be told the ID does no longer exist :( + if strings.Contains(err.Error(), fmt.Sprintf( + "Invalid parameter id value=%s due to incorrect long value format, "+ + "or entity does not exist", d.Id())) { + return nil + } + + return fmt.Errorf("Error deleting Kubernetes Version: %s", err) + } + + return nil +} diff --git a/go.mod b/go.mod index d91a136..4552838 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/terraform-providers/terraform-provider-cloudstack require ( - github.com/apache/cloudstack-go/v2 v2.13.1 + github.com/apache/cloudstack-go/v2 v2.13.2-0.20220610072700-22535d4613e0 github.com/go-ini/ini v1.40.0 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect github.com/hashicorp/go-multierror v1.0.0 diff --git a/go.sum b/go.sum index 45648b4..0e15391 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/apache/cloudstack-go/v2 v2.11.0 h1:IHekkdpeN/i4LY0/FkJX/PUR19ZthLza7e github.com/apache/cloudstack-go/v2 v2.11.0/go.mod h1:/u2vUqwD9endDgacTn4d2XxxVtu648f9edcYsM9wKGg= github.com/apache/cloudstack-go/v2 v2.13.1 h1:UHhNJ+5coUsgk9D5WBbqbY8hYfJ1bXgNxaSg2uGz4Ns= github.com/apache/cloudstack-go/v2 v2.13.1/go.mod h1:aosD8Svfu5nhH5Sp4zcsVV1hT5UGt3mTgRXM8YqTKe0= +github.com/apache/cloudstack-go/v2 v2.13.2-0.20220610072700-22535d4613e0 h1:2k9a1M5rjZsdbp/4HK2vIpShK68O+aFnu3j7ssRAB3k= +github.com/apache/cloudstack-go/v2 v2.13.2-0.20220610072700-22535d4613e0/go.mod h1:aosD8Svfu5nhH5Sp4zcsVV1hT5UGt3mTgRXM8YqTKe0= github.com/apparentlymart/go-cidr v1.0.0 h1:lGDvXx8Lv9QHjrAVP7jyzleG4F9+FkRhJcEsDFxeb8w= github.com/apparentlymart/go-cidr v1.0.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
