From b112c5ee22b1bf9419b17b4a83459702618b1b07 Mon Sep 17 00:00:00 2001 From: KasimBaybikov Date: Sun, 26 Mar 2023 22:00:30 +0300 Subject: [PATCH] 3.5.2 --- CHANGELOG.md | 11 ++- Makefile | 2 +- .../provider/cloudapi/data_sources_map.go | 1 + internal/service/cloudapi/kvmvm/api.go | 1 + .../data_source_compute_snapshot_usage.go | 73 +++++++++++++++++++ internal/service/cloudapi/kvmvm/flattens.go | 14 ++++ .../kvmvm/resource_check_input_values.go | 4 - .../cloudapi/kvmvm/resource_compute.go | 35 ++++++++- .../kvmvm/utility_compute_snapshot_usage.go | 33 +++++++++ internal/service/cloudapi/rg/resource_rg.go | 7 +- 10 files changed, 171 insertions(+), 10 deletions(-) create mode 100644 internal/service/cloudapi/kvmvm/data_source_compute_snapshot_usage.go create mode 100644 internal/service/cloudapi/kvmvm/utility_compute_snapshot_usage.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b7ccb3..050fe3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ -### Version 3.5.1 +## Version 3.5.2 -## Bug Fix +### Features +- Add new datasource decort_kvmvm_snapshot_usage +- Add the ability to change the size in the 'disks' block in the decort_kvmvm resource. Now when you change 'size' field in the block, the disk size on the platform will also be changed -- Authentication via jwt token does not work +## Bug Fix +- rule "release" in Makefile don't create the necessary archives +- field "register_computes" in resource decort_resgroup is not used when creating the resource +- removed unused optional fields in datasources diff --git a/Makefile b/Makefile index 34735e5..78c8b09 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ZIPDIR = ./zip BINARY=${NAME}.exe WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH} MAINPATH = ./cmd/decort/ -VERSION=3.5.1 +VERSION=3.5.2 #OS_ARCH=darwin_amd64 OS_ARCH=windows_amd64 #OS_ARCH=linux_amd64 diff --git a/internal/provider/cloudapi/data_sources_map.go b/internal/provider/cloudapi/data_sources_map.go index f1a9590..206ab57 100644 --- a/internal/provider/cloudapi/data_sources_map.go +++ b/internal/provider/cloudapi/data_sources_map.go @@ -48,6 +48,7 @@ func NewDataSourcesMap() map[string]*schema.Resource { "decort_kvmvm_get_log": kvmvm.DataSourceComputeGetLog(), "decort_kvmvm_pfw_list": kvmvm.DataSourceComputePfwList(), "decort_kvmvm_user_list": kvmvm.DataSourceComputeUserList(), + "decort_kvmvm_snapshot_usage": kvmvm.DataSourceComputeSnapshotUsage(), "decort_k8s": k8s.DataSourceK8s(), "decort_k8s_list": k8s.DataSourceK8sList(), "decort_k8s_list_deleted": k8s.DataSourceK8sListDeleted(), diff --git a/internal/service/cloudapi/kvmvm/api.go b/internal/service/cloudapi/kvmvm/api.go index 72b93cf..cb88155 100644 --- a/internal/service/cloudapi/kvmvm/api.go +++ b/internal/service/cloudapi/kvmvm/api.go @@ -77,6 +77,7 @@ const ( ComputeUserRevokeAPI = "/restmachine/cloudapi/compute/userRevoke" ComputeSnapshotCreateAPI = "/restmachine/cloudapi/compute/snapshotCreate" ComputeSnapshotDeleteAPI = "/restmachine/cloudapi/compute/snapshotCreate" + ComputeSnapshotUsageAPI = "/restmachine/cloudapi/compute/snapshotUsage" ComputeSnapshotRollbackAPI = "/restmachine/cloudapi/compute/snapshotRollback" ComputePauseAPI = "/restmachine/cloudapi/compute/pause" ComputeResumeAPI = "/restmachine/cloudapi/compute/resume" diff --git a/internal/service/cloudapi/kvmvm/data_source_compute_snapshot_usage.go b/internal/service/cloudapi/kvmvm/data_source_compute_snapshot_usage.go new file mode 100644 index 0000000..0af3cf0 --- /dev/null +++ b/internal/service/cloudapi/kvmvm/data_source_compute_snapshot_usage.go @@ -0,0 +1,73 @@ +package kvmvm + +import ( + "context" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" +) + +func dataSourceComputeSnapshotUsageRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + computeSnapshotUsage, err := utilityComputeSnapshotUasgeCheckPresence(ctx, d, m) + if err != nil { + return diag.FromErr(err) + } + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenSnapshotUsage(computeSnapshotUsage)) + return nil +} + +func dataSourceComputeSnapshotUsagSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "compute_id": { + Type: schema.TypeInt, + Required: true, + }, + "label": { + Type: schema.TypeString, + Optional: true, + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "count": { + Type: schema.TypeInt, + Computed: true, + }, + "stored": { + Type: schema.TypeFloat, + Computed: true, + }, + "label": { + Type: schema.TypeString, + Computed: true, + }, + "timestamp": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } +} + +func DataSourceComputeSnapshotUsage() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceComputeSnapshotUsageRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceComputeSnapshotUsagSchemaMake(), + } +} diff --git a/internal/service/cloudapi/kvmvm/flattens.go b/internal/service/cloudapi/kvmvm/flattens.go index de85fc3..1eb30be 100644 --- a/internal/service/cloudapi/kvmvm/flattens.go +++ b/internal/service/cloudapi/kvmvm/flattens.go @@ -660,3 +660,17 @@ func flattenComputeGetAudits(computeAudits ListShortAudits) []map[string]interfa } return res } + +func flattenSnapshotUsage(computeSnapshotUasges ListUsageSnapshots) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, computeUsage := range computeSnapshotUasges { + temp := map[string]interface{}{ + "count": computeUsage.Count, + "stored": computeUsage.Stored, + "label": computeUsage.Label, + "timestamp": computeUsage.Timestamp, + } + res = append(res, temp) + } + return res +} diff --git a/internal/service/cloudapi/kvmvm/resource_check_input_values.go b/internal/service/cloudapi/kvmvm/resource_check_input_values.go index f47608e..a0377f2 100644 --- a/internal/service/cloudapi/kvmvm/resource_check_input_values.go +++ b/internal/service/cloudapi/kvmvm/resource_check_input_values.go @@ -38,12 +38,10 @@ import ( "net/url" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - log "github.com/sirupsen/logrus" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" ) func existRgID(ctx context.Context, d *schema.ResourceData, m interface{}) bool { - log.Debugf("resourceComputeCreate: check access for RG ID: %v", d.Get("rg_id").(int)) c := m.(*controller.ControllerCfg) urlValues := &url.Values{} rgList := []struct { @@ -70,7 +68,6 @@ func existRgID(ctx context.Context, d *schema.ResourceData, m interface{}) bool } func existImageId(ctx context.Context, d *schema.ResourceData, m interface{}) bool { - log.Debugf("resourceComputeCreate: check access for image ID: %v", d.Get("image_id").(int)) c := m.(*controller.ControllerCfg) urlValues := &url.Values{} imageList := []struct { @@ -106,7 +103,6 @@ func existVinsIdInList(vinsId int, vinsList []struct { } func existVinsId(ctx context.Context, d *schema.ResourceData, m interface{}) (int, bool) { - log.Debugf("resourceComputeCreate: check access for vinses IDs") c := m.(*controller.ControllerCfg) urlValues := &url.Values{} diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go index d8775e5..b6dbdee 100644 --- a/internal/service/cloudapi/kvmvm/resource_compute.go +++ b/internal/service/cloudapi/kvmvm/resource_compute.go @@ -38,12 +38,12 @@ import ( "net/url" "strconv" + log "github.com/sirupsen/logrus" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/statefuncs" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/status" - log "github.com/sirupsen/logrus" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -645,6 +645,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf if d.HasChange("disks") { deletedDisks := make([]interface{}, 0) addedDisks := make([]interface{}, 0) + updatedDisks := make([]interface{}, 0) oldDisks, newDisks := d.GetChange("disks") oldConv := oldDisks.([]interface{}) @@ -659,6 +660,10 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf for _, el := range newConv { if !isContainsDisk(oldConv, el) { addedDisks = append(addedDisks, el) + } else { + if isChangeDisk(oldConv, el) { + updatedDisks = append(updatedDisks, el) + } } } @@ -727,6 +732,22 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf urlValues = &url.Values{} } } + + if len(updatedDisks) > 0 { + for _, disk := range updatedDisks { + diskConv := disk.(map[string]interface{}) + if diskConv["disk_name"].(string) == "bootdisk" { + continue + } + urlValues = &url.Values{} + urlValues.Add("diskId", strconv.Itoa(diskConv["disk_id"].(int))) + urlValues.Add("size", strconv.Itoa(diskConv["size"].(int))) + _, err := c.DecortAPICall(ctx, "POST", DisksResizeAPI, urlValues) + if err != nil { + return diag.FromErr(err) + } + } + } } if d.HasChange("started") { @@ -1176,6 +1197,18 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf return resourceComputeRead(ctx, d, m) } +func isChangeDisk(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(map[string]interface{}) + elConv := el.(map[string]interface{}) + if elOldConv["disk_id"].(int) == elConv["disk_id"].(int) && + elOldConv["size"].(int) != elConv["size"].(int) { + return true + } + } + return false +} + func isContainsDisk(els []interface{}, el interface{}) bool { for _, elOld := range els { elOldConv := elOld.(map[string]interface{}) diff --git a/internal/service/cloudapi/kvmvm/utility_compute_snapshot_usage.go b/internal/service/cloudapi/kvmvm/utility_compute_snapshot_usage.go new file mode 100644 index 0000000..9e9dcdd --- /dev/null +++ b/internal/service/cloudapi/kvmvm/utility_compute_snapshot_usage.go @@ -0,0 +1,33 @@ +package kvmvm + +import ( + "context" + "encoding/json" + "net/url" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityComputeSnapshotUasgeCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListUsageSnapshots, error) { + c := m.(*controller.ControllerCfg) + urlValues := &url.Values{} + UsageSnapshotList := &ListUsageSnapshots{} + + urlValues.Add("computeId", strconv.Itoa(d.Get("compute_id").(int))) + if label, ok := d.GetOk("label"); ok { + urlValues.Add("label", label.(string)) + } + computeSnapshotUsage, err := c.DecortAPICall(ctx, "POST", ComputeSnapshotUsageAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(computeSnapshotUsage), &UsageSnapshotList) + if err != nil { + return nil, err + } + return *UsageSnapshotList, err + +} diff --git a/internal/service/cloudapi/rg/resource_rg.go b/internal/service/cloudapi/rg/resource_rg.go index 9ddd074..d8d414b 100644 --- a/internal/service/cloudapi/rg/resource_rg.go +++ b/internal/service/cloudapi/rg/resource_rg.go @@ -38,12 +38,12 @@ import ( "net/url" "strconv" + log "github.com/sirupsen/logrus" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/location" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/status" - log "github.com/sirupsen/logrus" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" @@ -170,6 +170,11 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter urlValues.Add("extIp", extIp.(string)) } + regComputes, argSet := d.GetOk("register_computes") + if argSet { + urlValues.Add("registerComputes", strconv.FormatBool(regComputes.(bool))) + } + apiResp, err := c.DecortAPICall(ctx, "POST", ResgroupCreateAPI, urlValues) if err != nil { return diag.FromErr(err)