From 5db1aa5ddbc237606c68437ba60a4e9584e2b66f Mon Sep 17 00:00:00 2001 From: Petr Krutov Date: Fri, 10 Jun 2022 11:59:05 +0300 Subject: [PATCH] v2.3.0 --- .github/workflows/release.yml | 2 +- .golangci.yml | 33 + CHANGELOG.md | 43 +- Jenkinsfile-sast | 6 +- README.md | 4 +- README_EN.md | 4 +- decort/controller.go | 7 +- decort/data_source_account.go | 441 ++++++++-- decort/data_source_account_audits_list.go | 114 +++ decort/data_source_account_computes_list.go | 189 +++++ decort/data_source_account_consumed_units.go | 98 +++ ...a_source_account_consumed_units_by_type.go | 78 ++ decort/data_source_account_deleted_list.go | 58 ++ decort/data_source_account_disks_list.go | 119 +++ decort/data_source_account_flipgroups_list.go | 194 +++++ decort/data_source_account_list.go | 306 +++++++ decort/data_source_account_reserved_units.go | 98 +++ decort/data_source_account_rg_list.go | 294 +++++++ decort/data_source_account_templates_list.go | 139 +++ decort/data_source_account_vins_list.go | 174 ++++ decort/data_source_bservice.go | 293 +++++++ decort/data_source_bservice_deleted_list.go | 58 ++ decort/data_source_bservice_group.go | 291 +++++++ decort/data_source_bservice_list.go | 215 +++++ decort/data_source_bservice_snapshot_list.go | 93 ++ decort/data_source_compute.go | 150 ---- decort/data_source_disk_list.go | 391 +++++++++ decort/data_source_extnet.go | 321 +++++++ decort/data_source_extnet_computes_list.go | 156 ++++ decort/data_source_extnet_default.go | 74 ++ decort/data_source_extnet_list.go | 112 +++ decort/data_source_grid.go | 1 - decort/data_source_image.go | 1 - decort/data_source_image_list_stacks.go | 2 +- decort/data_source_rg_list.go | 314 +++++++ decort/data_source_vins.go | 14 +- decort/data_source_vins_list.go | 178 ++++ decort/disk_subresource.go | 86 -- decort/interface_subresource.go | 331 -------- decort/models_api.go | 645 ++++++++++++-- decort/network_subresource.go | 31 +- decort/provider.go | 99 ++- decort/quota_subresource.go | 4 +- decort/resource_account.go | 794 ++++++++++++++++++ decort/resource_bservice.go | 554 ++++++++++++ decort/resource_bservice_group.go | 661 +++++++++++++++ decort/resource_cdrom_image.go | 25 +- decort/resource_compute.go | 46 +- decort/resource_disk.go | 87 +- decort/resource_image.go | 28 +- decort/resource_k8s.go | 6 +- decort/resource_k8s_wg.go | 6 +- decort/resource_pfw.go | 1 + decort/resource_rg.go | 23 +- decort/resource_sep.go | 22 +- decort/resource_sep_config.go | 4 +- decort/resource_snapshot.go | 2 +- decort/resource_vins.go | 71 +- decort/resource_virtual_image.go | 30 +- decort/ssh_subresource.go | 104 --- decort/utility_account.go | 126 +-- decort/utility_account_audits_list.go | 56 ++ decort/utility_account_computes_list.go | 56 ++ decort/utility_account_consumed_units.go | 56 ++ .../utility_account_consumed_units_by_type.go | 55 ++ decort/utility_account_deleted_list.go | 61 ++ decort/utility_account_disks_list.go | 56 ++ decort/utility_account_flip_groups.go | 56 ++ decort/utility_account_list.go | 89 ++ decort/utility_account_reserved_units.go | 56 ++ decort/utility_account_rg_list.go | 56 ++ decort/utility_account_templates_list.go | 56 ++ decort/utility_account_vins_list.go | 56 ++ decort/utility_bservicce_deleted_list.go | 67 ++ decort/utility_bservice.go | 60 ++ decort/utility_bservice_group.go | 61 ++ decort/utility_bservice_list.go | 67 ++ decort/utility_bservice_snapshot_list.go | 58 ++ decort/utility_compute.go | 48 +- decort/utility_disk.go | 46 +- decort/utility_disk_list.go | 68 ++ decort/utility_extnet.go | 56 ++ decort/utility_extnet_computes_list.go | 56 ++ decort/utility_extnet_default.go | 46 + decort/utility_extnet_list.go | 64 ++ decort/utility_general.go | 48 -- decort/utility_grid.go | 3 +- decort/utility_pcidevice.go | 13 +- decort/utility_pcidevice_list.go | 2 +- decort/utility_rg.go | 50 +- decort/utility_rg_list.go | 65 ++ decort/utility_vins.go | 40 +- decort/utility_vins_list.go | 64 ++ docs/data-sources/account.md | 111 ++- docs/data-sources/account_audits_list.md | 51 ++ docs/data-sources/account_computes_list.md | 66 ++ docs/data-sources/account_consumed_units.md | 44 + .../account_consumed_units_by_type.md | 40 + docs/data-sources/account_deleted_list.md | 63 ++ docs/data-sources/account_disks_list.md | 52 ++ docs/data-sources/account_flipgroups_list.md | 67 ++ docs/data-sources/account_list.md | 63 ++ docs/data-sources/account_reserved_units.md | 44 + docs/data-sources/account_rg_list.md | 115 +++ docs/data-sources/account_templates_list.md | 56 ++ docs/data-sources/account_vins_list.md | 63 ++ docs/data-sources/bservice.md | 90 ++ docs/data-sources/bservice_deleted_list.md | 68 ++ docs/data-sources/bservice_group.md | 88 ++ docs/data-sources/bservice_list.md | 68 ++ docs/data-sources/bservice_snapshot_list.md | 50 ++ docs/data-sources/disk_list.md | 105 +++ docs/data-sources/extnet.md | 98 +++ docs/data-sources/extnet_computes_list.md | 63 ++ docs/data-sources/extnet_default.md | 35 + docs/data-sources/extnet_list.md | 48 ++ docs/data-sources/pcidevice.md | 49 ++ docs/data-sources/pcidevice_list.md | 54 ++ docs/data-sources/rg_list.md | 94 +++ docs/data-sources/sep.md | 51 ++ docs/data-sources/sep_config.md | 39 + docs/data-sources/sep_consumption.md | 69 ++ docs/data-sources/sep_disk_list.md | 40 + docs/data-sources/sep_list.md | 58 ++ docs/data-sources/sep_pool.md | 40 + docs/data-sources/vgpu.md | 37 + docs/data-sources/vins_list.md | 61 ++ docs/resources/account.md | 164 ++++ docs/resources/bservice.md | 101 +++ docs/resources/bservice_group.md | 97 +++ docs/resources/disk.md | 8 +- docs/resources/pcidevice.md | 54 ++ docs/resources/sep.md | 69 ++ docs/resources/sep_config.md | 50 ++ samples/README.md | 27 + samples/data_account/main.tf | 39 + samples/data_account_audits_list/main.tf | 40 + samples/data_account_computes_list/main.tf | 39 + samples/data_account_consumed_units/main.tf | 37 + .../main.tf | 54 ++ samples/data_account_deleted_list/main.tf | 45 + samples/data_account_disks_list/main.tf | 39 + samples/data_account_flipgroups_list/main.tf | 38 + samples/data_account_list/main.tf | 45 + samples/data_account_reserved_units/main.tf | 38 + samples/data_account_rg_list/main.tf | 37 + samples/data_account_templates_list/main.tf | 38 + samples/data_account_vins_list/main.tf | 39 + samples/data_bservice/main.tf | 39 + samples/data_bservice_deleted_list/main.tf | 57 ++ samples/data_bservice_group/main.tf | 44 + samples/data_bservice_list/main.tf | 58 ++ samples/data_bservice_snapshot_list/main.tf | 39 + samples/data_disk_list/main.tf | 54 ++ samples/data_extnet/main.tf | 38 + samples/data_extnet_computes_list/main.tf | 37 + samples/data_extnet_default/main.tf | 36 + samples/data_extnet_list/main.tf | 48 ++ samples/data_rg_list/main.tf | 49 ++ samples/data_vins_list/main.tf | 51 ++ samples/resource_account/main.tf | 157 ++++ samples/resource_bservice/main.tf | 110 +++ samples/resource_bservice_group/main.tf | 150 ++++ 163 files changed, 13328 insertions(+), 1419 deletions(-) create mode 100644 .golangci.yml create mode 100644 decort/data_source_account_audits_list.go create mode 100644 decort/data_source_account_computes_list.go create mode 100644 decort/data_source_account_consumed_units.go create mode 100644 decort/data_source_account_consumed_units_by_type.go create mode 100644 decort/data_source_account_deleted_list.go create mode 100644 decort/data_source_account_disks_list.go create mode 100644 decort/data_source_account_flipgroups_list.go create mode 100644 decort/data_source_account_list.go create mode 100644 decort/data_source_account_reserved_units.go create mode 100644 decort/data_source_account_rg_list.go create mode 100644 decort/data_source_account_templates_list.go create mode 100644 decort/data_source_account_vins_list.go create mode 100644 decort/data_source_bservice.go create mode 100644 decort/data_source_bservice_deleted_list.go create mode 100644 decort/data_source_bservice_group.go create mode 100644 decort/data_source_bservice_list.go create mode 100644 decort/data_source_bservice_snapshot_list.go create mode 100644 decort/data_source_disk_list.go create mode 100644 decort/data_source_extnet.go create mode 100644 decort/data_source_extnet_computes_list.go create mode 100644 decort/data_source_extnet_default.go create mode 100644 decort/data_source_extnet_list.go create mode 100644 decort/data_source_rg_list.go create mode 100644 decort/data_source_vins_list.go delete mode 100644 decort/disk_subresource.go delete mode 100644 decort/interface_subresource.go create mode 100644 decort/resource_account.go create mode 100644 decort/resource_bservice.go create mode 100644 decort/resource_bservice_group.go delete mode 100644 decort/ssh_subresource.go create mode 100644 decort/utility_account_audits_list.go create mode 100644 decort/utility_account_computes_list.go create mode 100644 decort/utility_account_consumed_units.go create mode 100644 decort/utility_account_consumed_units_by_type.go create mode 100644 decort/utility_account_deleted_list.go create mode 100644 decort/utility_account_disks_list.go create mode 100644 decort/utility_account_flip_groups.go create mode 100644 decort/utility_account_list.go create mode 100644 decort/utility_account_reserved_units.go create mode 100644 decort/utility_account_rg_list.go create mode 100644 decort/utility_account_templates_list.go create mode 100644 decort/utility_account_vins_list.go create mode 100644 decort/utility_bservicce_deleted_list.go create mode 100644 decort/utility_bservice.go create mode 100644 decort/utility_bservice_group.go create mode 100644 decort/utility_bservice_list.go create mode 100644 decort/utility_bservice_snapshot_list.go create mode 100644 decort/utility_disk_list.go create mode 100644 decort/utility_extnet.go create mode 100644 decort/utility_extnet_computes_list.go create mode 100644 decort/utility_extnet_default.go create mode 100644 decort/utility_extnet_list.go delete mode 100644 decort/utility_general.go create mode 100644 decort/utility_rg_list.go create mode 100644 decort/utility_vins_list.go create mode 100644 docs/data-sources/account_audits_list.md create mode 100644 docs/data-sources/account_computes_list.md create mode 100644 docs/data-sources/account_consumed_units.md create mode 100644 docs/data-sources/account_consumed_units_by_type.md create mode 100644 docs/data-sources/account_deleted_list.md create mode 100644 docs/data-sources/account_disks_list.md create mode 100644 docs/data-sources/account_flipgroups_list.md create mode 100644 docs/data-sources/account_list.md create mode 100644 docs/data-sources/account_reserved_units.md create mode 100644 docs/data-sources/account_rg_list.md create mode 100644 docs/data-sources/account_templates_list.md create mode 100644 docs/data-sources/account_vins_list.md create mode 100644 docs/data-sources/bservice.md create mode 100644 docs/data-sources/bservice_deleted_list.md create mode 100644 docs/data-sources/bservice_group.md create mode 100644 docs/data-sources/bservice_list.md create mode 100644 docs/data-sources/bservice_snapshot_list.md create mode 100644 docs/data-sources/disk_list.md create mode 100644 docs/data-sources/extnet.md create mode 100644 docs/data-sources/extnet_computes_list.md create mode 100644 docs/data-sources/extnet_default.md create mode 100644 docs/data-sources/extnet_list.md create mode 100644 docs/data-sources/pcidevice.md create mode 100644 docs/data-sources/pcidevice_list.md create mode 100644 docs/data-sources/rg_list.md create mode 100644 docs/data-sources/sep.md create mode 100644 docs/data-sources/sep_config.md create mode 100644 docs/data-sources/sep_consumption.md create mode 100644 docs/data-sources/sep_disk_list.md create mode 100644 docs/data-sources/sep_list.md create mode 100644 docs/data-sources/sep_pool.md create mode 100644 docs/data-sources/vgpu.md create mode 100644 docs/data-sources/vins_list.md create mode 100644 docs/resources/account.md create mode 100644 docs/resources/bservice.md create mode 100644 docs/resources/bservice_group.md create mode 100644 docs/resources/pcidevice.md create mode 100644 docs/resources/sep.md create mode 100644 docs/resources/sep_config.md create mode 100644 samples/data_account/main.tf create mode 100644 samples/data_account_audits_list/main.tf create mode 100644 samples/data_account_computes_list/main.tf create mode 100644 samples/data_account_consumed_units/main.tf create mode 100644 samples/data_account_consumed_units_by_type/main.tf create mode 100644 samples/data_account_deleted_list/main.tf create mode 100644 samples/data_account_disks_list/main.tf create mode 100644 samples/data_account_flipgroups_list/main.tf create mode 100644 samples/data_account_list/main.tf create mode 100644 samples/data_account_reserved_units/main.tf create mode 100644 samples/data_account_rg_list/main.tf create mode 100644 samples/data_account_templates_list/main.tf create mode 100644 samples/data_account_vins_list/main.tf create mode 100644 samples/data_bservice/main.tf create mode 100644 samples/data_bservice_deleted_list/main.tf create mode 100644 samples/data_bservice_group/main.tf create mode 100644 samples/data_bservice_list/main.tf create mode 100644 samples/data_bservice_snapshot_list/main.tf create mode 100644 samples/data_disk_list/main.tf create mode 100644 samples/data_extnet/main.tf create mode 100644 samples/data_extnet_computes_list/main.tf create mode 100644 samples/data_extnet_default/main.tf create mode 100644 samples/data_extnet_list/main.tf create mode 100644 samples/data_rg_list/main.tf create mode 100644 samples/data_vins_list/main.tf create mode 100644 samples/resource_account/main.tf create mode 100644 samples/resource_bservice/main.tf create mode 100644 samples/resource_bservice_group/main.tf diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2a8f3ea..2acce9e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release to registry +name: Release on: push: tags: diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..808f9e1 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,33 @@ +linters: + enable: + - bodyclose + - decorder + - dogsled + - errorlint + - exportloopref + - gocognit + - goconst + - gocyclo + - gosec + - ifshort + - makezero + #- nestif - disabled till better times + - nilerr + - prealloc + - unconvert + - unparam + +linters-settings: + errcheck: + exclude-functions: + - (*github.com/hashicorp/terraform-plugin-sdk/helper/schema.ResourceData).Set + staticcheck: + go: "1.18" + checks: + - all + - -SA1019 + nestif: + min-complexity: 7 + +issues: + max-same-issues: 0 diff --git a/CHANGELOG.md b/CHANGELOG.md index faf455d..06aeaff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,35 @@ ### Bug fixes -- resgroup recreation if quotas unspecified +- changing boot\_disk\_size in kvmvm +- downsizing CPU and RAM in kvmvm +- pfw recreation if public\_port\_end unspecified ### New datasources -- vgpu -- pcidevice\_list -- pcidevice -- sep -- sep\_list -- sep\_disk\_list -- sep\_config -- sep\_pool -- sep\_consumption +- disk\_list +- rg\_list +- account\_list +- account\_computes\_list +- account\_disks\_list +- account\_vins\_list +- account\_audits\_list +- account +- account\_rg\_list +- account\_counsumed\_units +- account\_counsumed\_units\_by\_type +- account\_reserved\_units +- account\_templates\_list +- account\_deleted\_list +- bservice\_list +- bservice\_snapshot\_list +- bservice\_deleted\_list +- bservice +- bservice\_group +- extnet\_default +- extnet\_list +- extnet +- extnet\_computes\_list +- vins\_list ### New resources -- pcidevice -- sep -- sep\_config +- account +- bservice +- bservice\_group diff --git a/Jenkinsfile-sast b/Jenkinsfile-sast index 5a2cd93..8e6ae2a 100644 --- a/Jenkinsfile-sast +++ b/Jenkinsfile-sast @@ -21,13 +21,15 @@ spec: } steps { container('alpine') { - sh 'apk update && apk add openjdk11 java-postgresql-jdbc' - dependencyCheck additionalArguments: '-f JSON -f HTML -n --enableExperimental\ + sh 'apk update && apk add openjdk11 java-postgresql-jdbc go' + dependencyCheck additionalArguments: '-f JSON -f HTML -n --enableExperimental \ + -l deplog \ --dbDriverName org.postgresql.Driver \ --dbDriverPath /usr/share/java/postgresql-jdbc.jar \ --dbUser $DEPCHECKDB_USR \ --dbPassword $DEPCHECKDB_PSW \ --connectionString jdbc:postgresql://postgres-postgresql.postgres/depcheck', odcInstallation: 'depcheck' + sh 'cat deplog' } } } diff --git a/README.md b/README.md index a53f213..36687f1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,9 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с snapshots, - Работа с pcidevice, - Работа с sep, -- Работа с vgpu. +- Работа с vgpu, +- Работа с bservice, +- Работа с extnets. Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki diff --git a/README_EN.md b/README_EN.md index db2650f..396d151 100644 --- a/README_EN.md +++ b/README_EN.md @@ -17,7 +17,9 @@ NOTE: provider rc-1.25 is designed for DECORT API 3.7.x. For older API versions - Work with snapshots, - Work with pcidevice. - Work with sep, -- Work with vgpu. +- Work with vgpu, +- Work with bservice, +- Work with extnets. This provider supports Import operations on pre-existing resources. diff --git a/decort/controller.go b/decort/controller.go index addc6e3..25e27ea 100644 --- a/decort/controller.go +++ b/decort/controller.go @@ -94,8 +94,7 @@ func ControllerConfigure(d *schema.ResourceData) (*ControllerCfg, error) { decort_username: "", } - var allow_unverified_ssl bool - allow_unverified_ssl = d.Get("allow_unverified_ssl").(bool) + allow_unverified_ssl := d.Get("allow_unverified_ssl").(bool) if ret_config.controller_url == "" { return nil, fmt.Errorf("Empty DECORT cloud controller URL provided.") @@ -138,7 +137,7 @@ func ControllerConfigure(d *schema.ResourceData) (*ControllerCfg, error) { if allow_unverified_ssl { log.Warn("ControllerConfigure: allow_unverified_ssl is set - will not check certificates!") - transCfg := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} + transCfg := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}} //nolint:gosec ret_config.cc_client = &http.Client{ Transport: transCfg, Timeout: Timeout180s, @@ -336,7 +335,7 @@ func (config *ControllerCfg) validateLegacyUser() (bool, error) { return true, nil } -func (config *ControllerCfg) decortAPICall(method string, api_name string, url_values *url.Values) (json_resp string, err error) { +func (config *ControllerCfg) decortAPICall(method string, api_name string, url_values *url.Values) (json_resp string, err error) { //nolint:unparam // This is a convenience wrapper around standard HTTP request methods that is aware of the // authorization mode for which the provider was initialized and compiles request accordingly. diff --git a/decort/data_source_account.go b/decort/data_source_account.go index 735384f..39ef95c 100644 --- a/decort/data_source_account.go +++ b/decort/data_source_account.go @@ -1,6 +1,6 @@ /* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25,108 +25,393 @@ Visit https://github.com/rudecs/terraform-provider-decort for full source code p package decort import ( - "encoding/json" - "fmt" - // "net/url" - - log "github.com/sirupsen/logrus" - + "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) -func flattenAccount(d *schema.ResourceData, acc_facts string) error { - // NOTE: this function modifies ResourceData argument - as such it should never be called - // from resourceAccountExists(...) method - - // log.Debugf("flattenAccount: ready to decode response body from %q", CloudspacesGetAPI) - details := AccountRecord{} - err := json.Unmarshal([]byte(acc_facts), &details) +func dataSourceAccountRead(d *schema.ResourceData, m interface{}) error { + acc, err := utilityAccountCheckPresence(d, m) if err != nil { return err } - log.Debugf("flattenAccount: decoded Account name %q / ID %d, status %q", details.Name, details.ID, details.Status) - - d.SetId(fmt.Sprintf("%d", details.ID)) - d.Set("name", details.Name) - d.Set("status", details.Status) - + id := uuid.New() + d.SetId(id.String()) + d.Set("dc_location", acc.DCLocation) + d.Set("resources", flattenAccResources(acc.Resources)) + d.Set("ckey", acc.CKey) + d.Set("meta", flattenMeta(acc.Meta)) + d.Set("acl", flattenAccAcl(acc.Acl)) + d.Set("company", acc.Company) + d.Set("companyurl", acc.CompanyUrl) + d.Set("created_by", acc.CreatedBy) + d.Set("created_time", acc.CreatedTime) + d.Set("deactivation_time", acc.DeactiovationTime) + d.Set("deleted_by", acc.DeletedBy) + d.Set("deleted_time", acc.DeletedTime) + d.Set("displayname", acc.DisplayName) + d.Set("guid", acc.GUID) + d.Set("account_id", acc.ID) + d.Set("account_name", acc.Name) + d.Set("resource_limits", flattenRgResourceLimits(acc.ResourceLimits)) + d.Set("send_access_emails", acc.SendAccessEmails) + d.Set("service_account", acc.ServiceAccount) + d.Set("status", acc.Status) + d.Set("updated_time", acc.UpdatedTime) + d.Set("version", acc.Version) + d.Set("vins", acc.Vins) + d.Set("vinses", acc.Vinses) + d.Set("computes", flattenAccComputes(acc.Computes)) + d.Set("machines", flattenAccMachines(acc.Machines)) return nil } -func dataSourceAccountRead(d *schema.ResourceData, m interface{}) error { - acc_facts, err := utilityAccountCheckPresence(d, m) - if acc_facts == "" { - // if empty string is returned from utilityAccountCheckPresence then there is no - // such account and err tells so - just return it to the calling party - d.SetId("") // ensure ID is empty in this case - return err +func flattenAccComputes(acs Computes) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "started": acs.Started, + "stopped": acs.Stopped, } + res = append(res, temp) + return res +} - return flattenAccount(d, acc_facts) +func flattenAccMachines(ams Machines) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "running": ams.Running, + "halted": ams.Halted, + } + res = append(res, temp) + return res } -func dataSourceAccount() *schema.Resource { - return &schema.Resource{ - SchemaVersion: 1, +func flattenAccAcl(acls []AccountAclRecord) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, acls := range acls { + temp := map[string]interface{}{ + "can_be_deleted": acls.CanBeDeleted, + "explicit": acls.IsExplicit, + "guid": acls.Guid, + "right": acls.Rights, + "status": acls.Status, + "type": acls.Type, + "user_group_id": acls.UgroupID, + } + res = append(res, temp) + } + return res +} - Read: dataSourceAccountRead, +func flattenAccResources(r Resources) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "current": flattenAccResource(r.Current), + "reserved": flattenAccResource(r.Reserved), + } + res = append(res, temp) + return res +} - Timeouts: &schema.ResourceTimeout{ - Read: &Timeout30s, - Default: &Timeout60s, - }, +func flattenAccResource(r Resource) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "cpu": r.CPU, + "disksize": r.Disksize, + "extips": r.Extips, + "exttraffic": r.Exttraffic, + "gpu": r.GPU, + "ram": r.RAM, + } + res = append(res, temp) + return res +} - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Optional: true, - Description: "Name of the account. Names are case sensitive and unique.", +func dataSourceAccountSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + }, + "dc_location": { + Type: schema.TypeString, + Computed: true, + }, + "resources": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "current": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "reserved": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + }, }, - - "account_id": { - Type: schema.TypeInt, - Optional: true, - Description: "Unique ID of the account. If account ID is specified, then account name is ignored.", + }, + "ckey": { + Type: schema.TypeString, + Computed: true, + }, + "meta": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, }, - - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Current status of the account.", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "can_be_deleted": { + Type: schema.TypeBool, + Computed: true, + }, + "explicit": { + Type: schema.TypeBool, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "right": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + }, + }, }, - - /* We keep the following attributes commented out, as we are not implementing account - management with Terraform plugin, so we do not need this extra info. - - "quota": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: quotaRgSubresourceSchema(), // this is a dictionary + }, + "company": { + Type: schema.TypeString, + Computed: true, + }, + "companyurl": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deactivation_time": { + Type: schema.TypeFloat, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "displayname": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "resource_limits": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cu_c": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Computed: true, + }, }, - Description: "Quotas on the resources for this account and all its resource groups.", }, - - "resource_groups": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Schema { - Type: schema.TypeInt, + }, + "send_access_emails": { + Type: schema.TypeBool, + Computed: true, + }, + "service_account": { + Type: schema.TypeBool, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "version": { + Type: schema.TypeInt, + Computed: true, + }, + "vins": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "started": { + Type: schema.TypeInt, + Computed: true, + }, + "stopped": { + Type: schema.TypeInt, + Computed: true, + }, }, - Description: "IDs of resource groups in this account." }, - - "vins": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Schema { - Type: schema.TypeInt, + }, + "machines": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "halted": { + Type: schema.TypeInt, + Computed: true, + }, + "running": { + Type: schema.TypeInt, + Computed: true, + }, }, - Description: "IDs of VINSes created at the account level." }, - */ }, + "vinses": { + Type: schema.TypeInt, + Computed: true, + }, + } + return res +} + +func dataSourceAccount() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountSchemaMake(), } } diff --git a/decort/data_source_account_audits_list.go b/decort/data_source_account_audits_list.go new file mode 100644 index 0000000..c31e947 --- /dev/null +++ b/decort/data_source_account_audits_list.go @@ -0,0 +1,114 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountAuditsList(aal AccountAuditsList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, aa := range aal { + temp := map[string]interface{}{ + "call": aa.Call, + "responsetime": aa.ResponseTime, + "statuscode": aa.StatusCode, + "timestamp": aa.Timestamp, + "user": aa.User, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountAuditsListRead(d *schema.ResourceData, m interface{}) error { + accountAuditsList, err := utilityAccountAuditsListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountAuditsList(accountAuditsList)) + + return nil +} + +func dataSourceAccountAuditsListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "call": { + Type: schema.TypeString, + Computed: true, + }, + "responsetime": { + Type: schema.TypeFloat, + Computed: true, + }, + "statuscode": { + Type: schema.TypeInt, + Computed: true, + }, + "timestamp": { + Type: schema.TypeFloat, + Computed: true, + }, + "user": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountAuditsList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountAuditsListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountAuditsListSchemaMake(), + } +} diff --git a/decort/data_source_account_computes_list.go b/decort/data_source_account_computes_list.go new file mode 100644 index 0000000..8a7ba77 --- /dev/null +++ b/decort/data_source_account_computes_list.go @@ -0,0 +1,189 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountComputesList(acl AccountComputesList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, acc := range acl { + temp := map[string]interface{}{ + "account_id": acc.AccountId, + "account_name": acc.AccountName, + "cpus": acc.CPUs, + "created_by": acc.CreatedBy, + "created_time": acc.CreatedTime, + "deleted_by": acc.DeletedBy, + "deleted_time": acc.DeletedTime, + "compute_id": acc.ComputeId, + "compute_name": acc.ComputeName, + "ram": acc.RAM, + "registered": acc.Registered, + "rg_id": acc.RgId, + "rg_name": acc.RgName, + "status": acc.Status, + "tech_status": acc.TechStatus, + "total_disks_size": acc.TotalDisksSize, + "updated_by": acc.UpdatedBy, + "updated_time": acc.UpdatedTime, + "user_managed": acc.UserManaged, + "vins_connected": acc.VinsConnected, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountComputesListRead(d *schema.ResourceData, m interface{}) error { + accountComputesList, err := utilityAccountComputesListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountComputesList(accountComputesList)) + + return nil +} + +func dataSourceAccountComputesListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "cpus": { + Type: schema.TypeInt, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "compute_id": { + Type: schema.TypeInt, + Computed: true, + }, + "compute_name": { + Type: schema.TypeString, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + "registered": { + Type: schema.TypeBool, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "total_disks_size": { + Type: schema.TypeInt, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "user_managed": { + Type: schema.TypeBool, + Computed: true, + }, + "vins_connected": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountComputesList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountComputesListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountComputesListSchemaMake(), + } +} diff --git a/decort/data_source_account_consumed_units.go b/decort/data_source_account_consumed_units.go new file mode 100644 index 0000000..6723e17 --- /dev/null +++ b/decort/data_source_account_consumed_units.go @@ -0,0 +1,98 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAccountConsumedUnitsRead(d *schema.ResourceData, m interface{}) error { + accountConsumedUnits, err := utilityAccountConsumedUnitsCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("cu_c", accountConsumedUnits.CUC) + d.Set("cu_d", accountConsumedUnits.CUD) + d.Set("cu_i", accountConsumedUnits.CUI) + d.Set("cu_m", accountConsumedUnits.CUM) + d.Set("cu_np", accountConsumedUnits.CUNP) + d.Set("gpu_units", accountConsumedUnits.GpuUnits) + + return nil +} + +func dataSourceAccountConsumedUnitsSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "cu_c": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Computed: true, + }, + } + return res +} + +func dataSourceAccountConsumedUnits() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountConsumedUnitsRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountConsumedUnitsSchemaMake(), + } +} diff --git a/decort/data_source_account_consumed_units_by_type.go b/decort/data_source_account_consumed_units_by_type.go new file mode 100644 index 0000000..4b9ccd6 --- /dev/null +++ b/decort/data_source_account_consumed_units_by_type.go @@ -0,0 +1,78 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAccountConsumedUnitsByTypeRead(d *schema.ResourceData, m interface{}) error { + result, err := utilityAccountConsumedUnitsByTypeCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("cu_result", result) + + return nil +} + +func dataSourceAccountConsumedUnitsByTypeSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "cu_type": { + Type: schema.TypeString, + Required: true, + Description: "cloud unit resource type", + }, + "cu_result": { + Type: schema.TypeFloat, + Computed: true, + }, + } + return res +} + +func dataSourceAccountConsumedUnitsByType() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountConsumedUnitsByTypeRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountConsumedUnitsByTypeSchemaMake(), + } +} diff --git a/decort/data_source_account_deleted_list.go b/decort/data_source_account_deleted_list.go new file mode 100644 index 0000000..d2a57c5 --- /dev/null +++ b/decort/data_source_account_deleted_list.go @@ -0,0 +1,58 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAccountDeletedListRead(d *schema.ResourceData, m interface{}) error { + accountDeletedList, err := utilityAccountDeletedListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountList(accountDeletedList)) + + return nil +} + +func dataSourceAccountDeletedList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountDeletedListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountListSchemaMake(), + } +} diff --git a/decort/data_source_account_disks_list.go b/decort/data_source_account_disks_list.go new file mode 100644 index 0000000..def9676 --- /dev/null +++ b/decort/data_source_account_disks_list.go @@ -0,0 +1,119 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountDisksList(adl AccountDisksList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, ad := range adl { + temp := map[string]interface{}{ + "disk_id": ad.ID, + "disk_name": ad.Name, + "pool": ad.Pool, + "sep_id": ad.SepId, + "size_max": ad.SizeMax, + "type": ad.Type, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountDisksListRead(d *schema.ResourceData, m interface{}) error { + accountDisksList, err := utilityAccountDisksListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountDisksList(accountDisksList)) + + return nil +} + +func dataSourceAccountDisksListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "disk_id": { + Type: schema.TypeInt, + Computed: true, + }, + "disk_name": { + Type: schema.TypeString, + Computed: true, + }, + "pool": { + Type: schema.TypeString, + Computed: true, + }, + "sep_id": { + Type: schema.TypeInt, + Computed: true, + }, + "size_max": { + Type: schema.TypeInt, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountDisksList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountDisksListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountDisksListSchemaMake(), + } +} diff --git a/decort/data_source_account_flipgroups_list.go b/decort/data_source_account_flipgroups_list.go new file mode 100644 index 0000000..dd83716 --- /dev/null +++ b/decort/data_source_account_flipgroups_list.go @@ -0,0 +1,194 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountFlipGroupsList(afgl AccountFlipGroupsList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, afg := range afgl { + temp := map[string]interface{}{ + "account_id": afg.AccountId, + "client_type": afg.ClientType, + "conn_type": afg.ConnType, + "created_by": afg.CreatedBy, + "created_time": afg.CreatedTime, + "default_gw": afg.DefaultGW, + "deleted_by": afg.DeletedBy, + "deleted_time": afg.DeletedTime, + "desc": afg.Desc, + "gid": afg.GID, + "guid": afg.GUID, + "fg_id": afg.ID, + "ip": afg.IP, + "milestones": afg.Milestones, + "fg_name": afg.Name, + "net_id": afg.NetID, + "net_type": afg.NetType, + "netmask": afg.NetMask, + "status": afg.Status, + "updated_by": afg.UpdatedBy, + "updated_time": afg.UpdatedTime, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountFlipGroupsListRead(d *schema.ResourceData, m interface{}) error { + accountFlipGroupsList, err := utilityAccountFlipGroupsListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountFlipGroupsList(accountFlipGroupsList)) + + return nil +} + +func dataSourceAccountFlipGroupsListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "client_type": { + Type: schema.TypeString, + Computed: true, + }, + "conn_type": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "default_gw": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "fg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "ip": { + Type: schema.TypeString, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "fg_name": { + Type: schema.TypeString, + Computed: true, + }, + "net_id": { + Type: schema.TypeInt, + Computed: true, + }, + "net_type": { + Type: schema.TypeString, + Computed: true, + }, + "netmask": { + Type: schema.TypeInt, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountFlipGroupsList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountFlipGroupsListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountFlipGroupsListSchemaMake(), + } +} diff --git a/decort/data_source_account_list.go b/decort/data_source_account_list.go new file mode 100644 index 0000000..b587bda --- /dev/null +++ b/decort/data_source_account_list.go @@ -0,0 +1,306 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountList(al AccountCloudApiList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, acc := range al { + temp := map[string]interface{}{ + "acl": flattenRgAcl(acc.Acl), + "created_time": acc.CreatedTime, + "deleted_time": acc.DeletedTime, + "account_id": acc.ID, + "account_name": acc.Name, + "status": acc.Status, + "updated_time": acc.UpdatedTime, + } + res = append(res, temp) + } + return res +} + +/*uncomment for cloudbroker +func flattenAccountList(al AccountList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, acc := range al { + temp := map[string]interface{}{ + "dc_location": acc.DCLocation, + "ckey": acc.CKey, + "meta": flattenMeta(acc.Meta), + + "acl": flattenRgAcl(acc.Acl), + + "company": acc.Company, + "companyurl": acc.CompanyUrl, + "created_by": acc.CreatedBy, + + "created_time": acc.CreatedTime, + + "deactivation_time": acc.DeactiovationTime, + "deleted_by": acc.DeletedBy, + + "deleted_time": acc.DeletedTime, + + "displayname": acc.DisplayName, + "guid": acc.GUID, + + "account_id": acc.ID, + "account_name": acc.Name, + + "resource_limits": flattenRgResourceLimits(acc.ResourceLimits), + "send_access_emails": acc.SendAccessEmails, + "service_account": acc.ServiceAccount, + + "status": acc.Status, + "updated_time": acc.UpdatedTime, + + "version": acc.Version, + "vins": acc.Vins, + + } + res = append(res, temp) + } + return res +} +*/ + +func dataSourceAccountListRead(d *schema.ResourceData, m interface{}) error { + accountList, err := utilityAccountListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountList(accountList)) + + return nil +} + +func dataSourceAccountListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + /*uncomment for cloudbroker + "dc_location": { + Type: schema.TypeString, + Computed: true, + }, + "ckey": { + Type: schema.TypeString, + Computed: true, + }, + "meta": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + },*/ + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "explicit": { + Type: schema.TypeBool, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "right": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + /*uncomment for cloudbroker + "company": { + Type: schema.TypeString, + Computed: true, + }, + "companyurl": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + */ + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + /*uncomment for cloudbroker + "deactivation_time": { + Type: schema.TypeFloat, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + */ + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + /*uncomment for cloudbroker + "displayname": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + */ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + /*uncomment for cloudbroker + "resource_limits": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cu_c": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Computed: true, + }, + }, + }, + }, + "send_access_emails": { + Type: schema.TypeBool, + Computed: true, + }, + "service_account": { + Type: schema.TypeBool, + Computed: true, + }, + */ + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + /*uncomment for cloudbroker + "version": { + Type: schema.TypeInt, + Computed: true, + }, + "vins": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + */ + }, + }, + }, + } + return res +} + +func dataSourceAccountList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountListSchemaMake(), + } +} diff --git a/decort/data_source_account_reserved_units.go b/decort/data_source_account_reserved_units.go new file mode 100644 index 0000000..b4d48c9 --- /dev/null +++ b/decort/data_source_account_reserved_units.go @@ -0,0 +1,98 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceAccountReservedUnitsRead(d *schema.ResourceData, m interface{}) error { + accountReservedUnits, err := utilityAccountReservedUnitsCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("cu_c", accountReservedUnits.CUC) + d.Set("cu_d", accountReservedUnits.CUD) + d.Set("cu_i", accountReservedUnits.CUI) + d.Set("cu_m", accountReservedUnits.CUM) + d.Set("cu_np", accountReservedUnits.CUNP) + d.Set("gpu_units", accountReservedUnits.GpuUnits) + + return nil +} + +func dataSourceAccountReservedUnitsSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "cu_c": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Computed: true, + }, + } + return res +} + +func dataSourceAccountReservedUnits() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountReservedUnitsRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountReservedUnitsSchemaMake(), + } +} diff --git a/decort/data_source_account_rg_list.go b/decort/data_source_account_rg_list.go new file mode 100644 index 0000000..40e2284 --- /dev/null +++ b/decort/data_source_account_rg_list.go @@ -0,0 +1,294 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountRGList(argl AccountRGList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, arg := range argl { + temp := map[string]interface{}{ + "computes": flattenAccRGComputes(arg.Computes), + "resources": flattenAccRGResources(arg.Resources), + "created_by": arg.CreatedBy, + "created_time": arg.CreatedTime, + "deleted_by": arg.DeletedBy, + "deleted_time": arg.DeletedTime, + "rg_id": arg.RGID, + "milestones": arg.Milestones, + "rg_name": arg.RGName, + "status": arg.Status, + "updated_by": arg.UpdatedBy, + "updated_time": arg.UpdatedTime, + "vinses": arg.Vinses, + } + res = append(res, temp) + } + return res + +} + +func flattenAccRGComputes(argc AccountRGComputes) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "started": argc.Started, + "stopped": argc.Stopped, + } + res = append(res, temp) + return res +} + +func flattenAccRGResources(argr AccountRGResources) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "consumed": flattenAccResource(argr.Consumed), + "limits": flattenAccResource(argr.Limits), + "reserved": flattenAccResource(argr.Reserved), + } + res = append(res, temp) + return res +} + +func dataSourceAccountRGListRead(d *schema.ResourceData, m interface{}) error { + accountRGList, err := utilityAccountRGListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountRGList(accountRGList)) + + return nil +} + +func dataSourceAccountRGListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "computes": { + Type: schema.TypeList, + MaxItems: 1, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "started": { + Type: schema.TypeInt, + Computed: true, + }, + "stopped": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "resources": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "consumed": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + + "limits": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "reserved": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "vinses": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountRGList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountRGListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountRGListSchemaMake(), + } +} diff --git a/decort/data_source_account_templates_list.go b/decort/data_source_account_templates_list.go new file mode 100644 index 0000000..4071088 --- /dev/null +++ b/decort/data_source_account_templates_list.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountTemplatesList(atl AccountTemplatesList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, at := range atl { + temp := map[string]interface{}{ + "unc_path": at.UNCPath, + "account_id": at.AccountId, + "desc": at.Desc, + "template_id": at.ID, + "template_name": at.Name, + "public": at.Public, + "size": at.Size, + "status": at.Status, + "type": at.Type, + "username": at.Username, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountTemplatesListRead(d *schema.ResourceData, m interface{}) error { + accountTemplatesList, err := utilityAccountTemplatesListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountTemplatesList(accountTemplatesList)) + + return nil +} + +func dataSourceAccountTemplatesListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "unc_path": { + Type: schema.TypeString, + Computed: true, + }, + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "template_id": { + Type: schema.TypeInt, + Computed: true, + }, + "template_name": { + Type: schema.TypeString, + Computed: true, + }, + "public": { + Type: schema.TypeBool, + Computed: true, + }, + "size": { + Type: schema.TypeInt, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "username": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountTemplatessList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountTemplatesListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountTemplatesListSchemaMake(), + } +} diff --git a/decort/data_source_account_vins_list.go b/decort/data_source_account_vins_list.go new file mode 100644 index 0000000..e9d50e7 --- /dev/null +++ b/decort/data_source_account_vins_list.go @@ -0,0 +1,174 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenAccountVinsList(avl AccountVinsList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, av := range avl { + temp := map[string]interface{}{ + "account_id": av.AccountId, + "account_name": av.AccountName, + "computes": av.Computes, + "created_by": av.CreatedBy, + "created_time": av.CreatedTime, + "deleted_by": av.DeletedBy, + "deleted_time": av.DeletedTime, + "external_ip": av.ExternalIP, + "vin_id": av.ID, + "vin_name": av.Name, + "network": av.Network, + "pri_vnf_dev_id": av.PriVnfDevId, + "rg_id": av.RgId, + "rg_name": av.RgName, + "status": av.Status, + "updated_by": av.UpdatedBy, + "updated_time": av.UpdatedTime, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountVinsListRead(d *schema.ResourceData, m interface{}) error { + accountVinsList, err := utilityAccountVinsListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenAccountVinsList(accountVinsList)) + + return nil +} + +func dataSourceAccountVinsListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the account", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Description: "Search Result", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "computes": { + Type: schema.TypeInt, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "external_ip": { + Type: schema.TypeString, + Computed: true, + }, + "vin_id": { + Type: schema.TypeInt, + Computed: true, + }, + "vin_name": { + Type: schema.TypeString, + Computed: true, + }, + "network": { + Type: schema.TypeString, + Computed: true, + }, + "pri_vnf_dev_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceAccountVinsList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceAccountVinsListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountVinsListSchemaMake(), + } +} diff --git a/decort/data_source_bservice.go b/decort/data_source_bservice.go new file mode 100644 index 0000000..a013981 --- /dev/null +++ b/decort/data_source_bservice.go @@ -0,0 +1,293 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceBasicServiceRead(d *schema.ResourceData, m interface{}) error { + bs, err := utilityBasicServiceCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("account_id", bs.AccountId) + d.Set("account_name", bs.AccountName) + d.Set("base_domain", bs.BaseDomain) + d.Set("computes", flattenBasicServiceComputes(bs.Computes)) + d.Set("cpu_total", bs.CPUTotal) + d.Set("created_by", bs.CreatedBy) + d.Set("created_time", bs.CreatedTime) + d.Set("deleted_by", bs.DeletedBy) + d.Set("deleted_time", bs.DeletedTime) + d.Set("disk_total", bs.DiskTotal) + d.Set("gid", bs.GID) + d.Set("groups", bs.Groups) + d.Set("groups_name", bs.GroupsName) + d.Set("guid", bs.GUID) + d.Set("milestones", bs.Milestones) + d.Set("service_name", bs.Name) + d.Set("parent_srv_id", bs.ParentSrvId) + d.Set("parent_srv_type", bs.ParentSrvType) + d.Set("ram_total", bs.RamTotal) + d.Set("rg_id", bs.RGID) + d.Set("rg_name", bs.RGName) + d.Set("snapshots", flattenBasicServiceSnapshots(bs.Snapshots)) + d.Set("ssh_key", bs.SSHKey) + d.Set("ssh_user", bs.SSHUser) + d.Set("status", bs.Status) + d.Set("tech_status", bs.TechStatus) + d.Set("updated_by", bs.UpdatedBy) + d.Set("updated_time", bs.UpdatedTime) + d.Set("user_managed", bs.UserManaged) + return nil +} + +func flattenBasicServiceComputes(bscs BasicServiceComputes) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, bsc := range bscs { + temp := map[string]interface{}{ + "compgroup_id": bsc.CompGroupId, + "compgroup_name": bsc.CompGroupName, + "compgroup_role": bsc.CompGroupRole, + "id": bsc.ID, + "name": bsc.Name, + } + res = append(res, temp) + } + + return res +} + +func flattenBasicServiceSnapshots(bsrvss BasicServiceSnapshots) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, bsrvs := range bsrvss { + temp := map[string]interface{}{ + "guid": bsrvs.GUID, + "label": bsrvs.Label, + "timestamp": bsrvs.Timestamp, + "valid": bsrvs.Valid, + } + res = append(res, temp) + } + return res +} + +func dataSourceBasicServiceSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "service_id": { + Type: schema.TypeInt, + Required: true, + }, + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "base_domain": { + Type: schema.TypeString, + Computed: true, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "compgroup_id": { + Type: schema.TypeInt, + Computed: true, + }, + "compgroup_name": { + Type: schema.TypeString, + Computed: true, + }, + "compgroup_role": { + Type: schema.TypeString, + Computed: true, + }, + "id": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + + "cpu_total": { + Type: schema.TypeInt, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "disk_total": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "groups": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "groups_name": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "service_name": { + Type: schema.TypeString, + Computed: true, + }, + "parent_srv_id": { + Type: schema.TypeInt, + Computed: true, + }, + "parent_srv_type": { + Type: schema.TypeString, + Computed: true, + }, + "ram_total": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "snapshots": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "label": { + Type: schema.TypeString, + Computed: true, + }, + "timestamp": { + Type: schema.TypeInt, + Computed: true, + }, + "valid": { + Type: schema.TypeBool, + Computed: true, + }, + }, + }, + }, + + "ssh_key": { + Type: schema.TypeString, + Computed: true, + }, + "ssh_user": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "user_managed": { + Type: schema.TypeBool, + Computed: true, + }, + } + return res +} + +func dataSourceBasicService() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceBasicServiceRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceBasicServiceSchemaMake(), + } +} diff --git a/decort/data_source_bservice_deleted_list.go b/decort/data_source_bservice_deleted_list.go new file mode 100644 index 0000000..3f4dce8 --- /dev/null +++ b/decort/data_source_bservice_deleted_list.go @@ -0,0 +1,58 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceBasicServiceDeletedListRead(d *schema.ResourceData, m interface{}) error { + basicServiceDeletedList, err := utilityBasicServiceDeletedListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenBasicServiceList(basicServiceDeletedList)) + + return nil +} + +func dataSourceBasicServiceDeletedList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceBasicServiceDeletedListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceBasicServiceListSchemaMake(), + } +} diff --git a/decort/data_source_bservice_group.go b/decort/data_source_bservice_group.go new file mode 100644 index 0000000..b8c3d92 --- /dev/null +++ b/decort/data_source_bservice_group.go @@ -0,0 +1,291 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceBasicServiceGroupRead(d *schema.ResourceData, m interface{}) error { + bsg, err := utilityBasicServiceGroupCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("account_id", bsg.AccountId) + d.Set("account_name", bsg.AccountName) + d.Set("computes", flattenBSGroupComputes(bsg.Computes)) + d.Set("consistency", bsg.Consistency) + d.Set("cpu", bsg.CPU) + d.Set("created_by", bsg.CreatedBy) + d.Set("created_time", bsg.CreatedTime) + d.Set("deleted_by", bsg.DeletedBy) + d.Set("deleted_time", bsg.DeletedTime) + d.Set("disk", bsg.Disk) + d.Set("driver", bsg.Driver) + d.Set("extnets", bsg.Extnets) + d.Set("gid", bsg.GID) + d.Set("guid", bsg.GUID) + d.Set("image_id", bsg.ImageId) + d.Set("milestones", bsg.Milestones) + d.Set("compgroup_name", bsg.Name) + d.Set("parents", bsg.Parents) + d.Set("ram", bsg.RAM) + d.Set("rg_id", bsg.RGID) + d.Set("rg_name", bsg.RGName) + d.Set("role", bsg.Role) + d.Set("sep_id", bsg.SepId) + d.Set("seq_no", bsg.SeqNo) + d.Set("status", bsg.Status) + d.Set("tech_status", bsg.TechStatus) + d.Set("timeout_start", bsg.TimeoutStart) + d.Set("updated_by", bsg.UpdatedBy) + d.Set("updated_time", bsg.UpdatedTime) + d.Set("vinses", bsg.Vinses) + return nil +} + +func flattenBSGroupOSUsers(bsgosus BasicServiceGroupOSUsers) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, bsgosu := range bsgosus { + temp := map[string]interface{}{ + "login": bsgosu.Login, + "password": bsgosu.Password, + } + res = append(res, temp) + } + + return res +} + +func flattenBSGroupComputes(bsgcs BasicServiceGroupComputes) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, bsgc := range bsgcs { + temp := map[string]interface{}{ + "id": bsgc.ID, + "ip_addresses": bsgc.IPAdresses, + "name": bsgc.Name, + "os_users": flattenBSGroupOSUsers(bsgc.OSUsers), + } + res = append(res, temp) + } + return res +} + +func dataSourceBasicServiceGroupSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "service_id": { + Type: schema.TypeInt, + Required: true, + }, + "compgroup_id": { + Type: schema.TypeInt, + Required: true, + }, + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeInt, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "os_users": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "login": { + Type: schema.TypeString, + Computed: true, + }, + "password": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "consistency": { + Type: schema.TypeBool, + Computed: true, + }, + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "disk": { + Type: schema.TypeInt, + Computed: true, + }, + "driver": { + Type: schema.TypeString, + Computed: true, + }, + "extnets": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "image_id": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "compgroup_name": { + Type: schema.TypeString, + Computed: true, + }, + "parents": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "role": { + Type: schema.TypeString, + Computed: true, + }, + "sep_id": { + Type: schema.TypeInt, + Computed: true, + }, + "seq_no": { + Type: schema.TypeInt, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "timeout_start": { + Type: schema.TypeInt, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "vinses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + } + return res +} + +func dataSourceBasicServiceGroup() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceBasicServiceGroupRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceBasicServiceGroupSchemaMake(), + } +} diff --git a/decort/data_source_bservice_list.go b/decort/data_source_bservice_list.go new file mode 100644 index 0000000..21ead41 --- /dev/null +++ b/decort/data_source_bservice_list.go @@ -0,0 +1,215 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenBasicServiceList(bsl BasicServiceList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, bs := range bsl { + temp := map[string]interface{}{ + "account_id": bs.AccountId, + "account_name": bs.AccountName, + "base_domain": bs.BaseDomain, + "created_by": bs.CreatedBy, + "created_time": bs.CreatedTime, + "deleted_by": bs.DeletedBy, + "deleted_time": bs.DeletedTime, + "gid": bs.GID, + "groups": bs.Groups, + "guid": bs.GUID, + "service_id": bs.ID, + "service_name": bs.Name, + "parent_srv_id": bs.ParentSrvId, + "parent_srv_type": bs.ParentSrvType, + "rg_id": bs.RGID, + "rg_name": bs.RGName, + "ssh_user": bs.SSHUser, + "status": bs.Status, + "tech_status": bs.TechStatus, + "updated_by": bs.UpdatedBy, + "updated_time": bs.UpdatedTime, + "user_managed": bs.UserManaged, + } + res = append(res, temp) + } + return res +} + +func dataSourceBasicServiceListRead(d *schema.ResourceData, m interface{}) error { + basicServiceList, err := utilityBasicServiceListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenBasicServiceList(basicServiceList)) + + return nil +} + +func dataSourceBasicServiceListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the account to query for BasicService instances", + }, + "rg_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the resource group to query for BasicService instances", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "base_domain": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "groups": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "service_id": { + Type: schema.TypeInt, + Computed: true, + }, + "service_name": { + Type: schema.TypeString, + Computed: true, + }, + "parent_srv_id": { + Type: schema.TypeInt, + Computed: true, + }, + "parent_srv_type": { + Type: schema.TypeString, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "ssh_user": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "user_managed": { + Type: schema.TypeBool, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceBasicServiceList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceBasicServiceListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceBasicServiceListSchemaMake(), + } +} diff --git a/decort/data_source_bservice_snapshot_list.go b/decort/data_source_bservice_snapshot_list.go new file mode 100644 index 0000000..306ce99 --- /dev/null +++ b/decort/data_source_bservice_snapshot_list.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceBasicServiceSnapshotListRead(d *schema.ResourceData, m interface{}) error { + basicServiceSnapshotList, err := utilityBasicServiceSnapshotListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenBasicServiceSnapshots(basicServiceSnapshotList)) + + return nil +} + +func dataSourceBasicServiceSnapshotListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "service_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the BasicService instance", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "label": { + Type: schema.TypeString, + Computed: true, + }, + "timestamp": { + Type: schema.TypeInt, + Computed: true, + }, + "valid": { + Type: schema.TypeBool, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceBasicServiceSnapshotList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceBasicServiceSnapshotListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceBasicServiceSnapshotListSchemaMake(), + } +} diff --git a/decort/data_source_compute.go b/decort/data_source_compute.go index 8800308..e1b4169 100644 --- a/decort/data_source_compute.go +++ b/decort/data_source_compute.go @@ -66,60 +66,6 @@ func parseComputeDisksToExtraDisks(disks []DiskRecord) []interface{} { return result } -// NOTE: this is a legacy function, which is not used as of rc-1.10 -// Use "parseComputeDisksToExtraDisks" instead -func parseComputeDisks(disks []DiskRecord) []interface{} { - // Return value was designed to d.Set("disks",) item of dataSourceCompute schema - // However, this item was excluded from the schema as it is not directly - // managed through Terraform - length := len(disks) - log.Debugf("parseComputeDisks: called for %d disks", length) - - /* - if length == 1 && disks[0].Type == "B" { - // there is only one disk in the list and it is a boot disk - // as we skip boot disks, the result will be of 0 lenght - length = 0 - } - */ - - result := []interface{}{} - - if length == 0 { - return result - } - - for _, value := range disks { - /* - if value.Type == "B" { - // skip boot disk when parsing the list of disks - continue - } - */ - elem := make(map[string]interface{}) - // keys in this map should correspond to the Schema definition - // as returned by dataSourceDiskSchemaMake() - elem["name"] = value.Name - elem["disk_id"] = value.ID - elem["account_id"] = value.AccountID - elem["account_name"] = value.AccountName - elem["description"] = value.Desc - elem["image_id"] = value.ImageID - elem["size"] = value.SizeMax - elem["type"] = value.Type - elem["sep_id"] = value.SepID - elem["sep_type"] = value.SepType - elem["pool"] = value.Pool - // elem["status"] = value.Status - // elem["tech_status"] = value.TechStatus - elem["compute_id"] = value.ComputeID - - result = append(result, elem) - } - - return result -} - func parseBootDiskSize(disks []DiskRecord) int { // this return value will be used to d.Set("boot_disk_size",) item of dataSourceCompute schema if len(disks) == 0 { @@ -176,71 +122,6 @@ func parseComputeInterfacesToNetworks(ifaces []InterfaceRecord) []interface{} { return result } -/* -func parseComputeInterfacesToNetworks(ifaces []InterfaceRecord) []map[string]interface{} { - // return value will be used to d.Set("network") item of dataSourceCompute schema - length := len(ifaces) - log.Debugf("parseComputeInterfacesToNetworks: called for %d ifaces", length) - - result := make([]map[string]interface{}, length, length) - - for i, value := range ifaces { - elem := make(map[string]interface{}) - // Keys in this map should correspond to the Schema definition - // as returned by networkSubresourceSchemaMake() - elem["net_id"] = value.NetID - elem["net_type"] = value.NetType - elem["ip_address"] = value.IPAddress - elem["mac"] = value.MAC - - // log.Debugf(" element %d: net_id=%d, net_type=%s", i, value.NetID, value.NetType) - - result[i] = elem - } - - return result -} -*/ - -// NOTE: this function is retained for historical purposes and actually not used as of rc-1.10 -func parseComputeInterfaces(ifaces []InterfaceRecord) []map[string]interface{} { - // return value was designed to d.Set("interfaces",) item of dataSourceCompute schema - // However, this item was excluded from the schema as it is not directly - // managed through Terraform - length := len(ifaces) - log.Debugf("parseComputeInterfaces: called for %d ifaces", length) - - result := make([]map[string]interface{}, length, length) - - for i, value := range ifaces { - // Keys in this map should correspond to the Schema definition - // as returned by dataSourceInterfaceSchemaMake() - elem := make(map[string]interface{}) - - elem["net_id"] = value.NetID - elem["net_type"] = value.NetType - elem["ip_address"] = value.IPAddress - elem["netmask"] = value.NetMask - elem["mac"] = value.MAC - elem["default_gw"] = value.DefaultGW - elem["name"] = value.Name - elem["connection_id"] = value.ConnID - elem["connection_type"] = value.ConnType - - /* TODO: add code to parse QoS - qos_schema := interfaceQosSubresourceSchemaMake() - qos_schema.Set("egress_rate", value.QOS.ERate) - qos_schema.Set("ingress_rate", value.QOS.InRate) - qos_schema.Set("ingress_burst", value.QOS.InBurst) - elem["qos"] = qos_schema - */ - - result[i] = elem - } - - return result -} - func flattenCompute(d *schema.ResourceData, compFacts string) error { // This function expects that compFacts string contains response from API compute/get, // i.e. detailed information about compute instance. @@ -440,17 +321,6 @@ func dataSourceCompute() *schema.Resource { Description: "Network connection(s) for this compute.", }, - /* - "interfaces": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource{ - Schema: interfaceSubresourceSchemaMake(), - }, - Description: "Specification for the virtual NICs configured on this compute instance.", - }, - */ - "os_users": { Type: schema.TypeList, Computed: true, @@ -478,26 +348,6 @@ func dataSourceCompute() *schema.Resource { Default: true, Description: "Is compute started.", }, - - /* - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Current model status of this compute instance.", - }, - - "tech_status": { - Type: schema.TypeString, - Computed: true, - Description: "Current technical status of this compute instance.", - }, - - "internal_ip": { - Type: schema.TypeString, - Computed: true, - Description: "Internal IP address of this Compute.", - }, - */ }, } } diff --git a/decort/data_source_disk_list.go b/decort/data_source_disk_list.go new file mode 100644 index 0000000..fa118aa --- /dev/null +++ b/decort/data_source_disk_list.go @@ -0,0 +1,391 @@ +/* +Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Sergey Shubin, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenDiskList(dl DisksListResp) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, disk := range dl { + diskAcl, _ := json.Marshal(disk.Acl) + diskIotune, _ := json.Marshal(disk.IOTune) + temp := map[string]interface{}{ + "account_id": disk.AccountID, + "account_name": disk.AccountName, + "acl": string(diskAcl), + "boot_partition": disk.BootPartition, + "compute_id": disk.ComputeID, + "compute_name": disk.ComputeName, + "created_time": disk.CreatedTime, + "deleted_time": disk.DeletedTime, + "desc": disk.Desc, + "destruction_time": disk.DestructionTime, + "devicename": disk.DeviceName, + "disk_path": disk.DiskPath, + "gid": disk.GridID, + "guid": disk.GUID, + "disk_id": disk.ID, + "image_id": disk.ImageID, + "images": disk.Images, + "iotune": string(diskIotune), + "iqn": disk.IQN, + "login": disk.Login, + "machine_id": disk.MachineId, + "machine_name": disk.MachineName, + "milestones": disk.Milestones, + "name": disk.Name, + "order": disk.Order, + "params": disk.Params, + "parent_id": disk.ParentId, + "passwd": disk.Passwd, + "pci_slot": disk.PciSlot, + "pool": disk.Pool, + "purge_attempts": disk.PurgeAttempts, + "purge_time": disk.PurgeTime, + "reality_device_number": disk.RealityDeviceNumber, + "reference_id": disk.ReferenceId, + "res_id": disk.ResID, + "res_name": disk.ResName, + "role": disk.Role, + "sep_id": disk.SepID, + "sep_type": disk.SepType, + "size_max": disk.SizeMax, + "size_used": disk.SizeUsed, + "snapshots": flattendDiskSnapshotList(disk.Snapshots), + "status": disk.Status, + "tech_status": disk.TechStatus, + "type": disk.Type, + "vmid": disk.VMID, + "update_by": disk.UpdateBy, + } + res = append(res, temp) + } + return res + +} + +func flattendDiskSnapshotList(sl SnapshotRecordList) []interface{} { + res := make([]interface{}, 0) + for _, snapshot := range sl { + temp := map[string]interface{}{ + "guid": snapshot.Guid, + "label": snapshot.Label, + "res_id": snapshot.ResId, + "snap_set_guid": snapshot.SnapSetGuid, + "snap_set_time": snapshot.SnapSetTime, + "timestamp": snapshot.TimeStamp, + } + res = append(res, temp) + } + + return res + +} + +func dataSourceDiskListRead(d *schema.ResourceData, m interface{}) error { + diskList, err := utilityDiskListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenDiskList(diskList)) + + return nil +} + +func dataSourceDiskListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the account the disks belong to", + }, + "type": { + Type: schema.TypeString, + Optional: true, + Description: "type of the disks", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "acl": { + Type: schema.TypeString, + Computed: true, + }, + "boot_partition": { + Type: schema.TypeInt, + Computed: true, + }, + "compute_id": { + Type: schema.TypeInt, + Computed: true, + }, + "compute_name": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "destruction_time": { + Type: schema.TypeInt, + Computed: true, + }, + "devicename": { + Type: schema.TypeString, + Computed: true, + }, + "disk_path": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "disk_id": { + Type: schema.TypeInt, + Computed: true, + }, + "image_id": { + Type: schema.TypeInt, + Computed: true, + }, + "images": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "iotune": { + Type: schema.TypeString, + Computed: true, + }, + "iqn": { + Type: schema.TypeString, + Computed: true, + }, + "login": { + Type: schema.TypeString, + Computed: true, + }, + "machine_id": { + Type: schema.TypeInt, + Computed: true, + }, + "machine_name": { + Type: schema.TypeString, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "order": { + Type: schema.TypeInt, + Computed: true, + }, + "params": { + Type: schema.TypeString, + Computed: true, + }, + "parent_id": { + Type: schema.TypeInt, + Computed: true, + }, + "passwd": { + Type: schema.TypeString, + Computed: true, + }, + "pci_slot": { + Type: schema.TypeInt, + Computed: true, + }, + "pool": { + Type: schema.TypeString, + Computed: true, + }, + "purge_attempts": { + Type: schema.TypeInt, + Computed: true, + }, + "purge_time": { + Type: schema.TypeInt, + Computed: true, + }, + "reality_device_number": { + Type: schema.TypeInt, + Computed: true, + }, + "reference_id": { + Type: schema.TypeString, + Computed: true, + }, + "res_id": { + Type: schema.TypeString, + Computed: true, + }, + "res_name": { + Type: schema.TypeString, + Computed: true, + }, + "role": { + Type: schema.TypeString, + Computed: true, + }, + "sep_id": { + Type: schema.TypeInt, + Computed: true, + }, + "sep_type": { + Type: schema.TypeString, + Computed: true, + }, + "size_max": { + Type: schema.TypeInt, + Computed: true, + }, + "size_used": { + Type: schema.TypeInt, + Computed: true, + }, + "snapshots": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "label": { + Type: schema.TypeString, + Computed: true, + }, + "res_id": { + Type: schema.TypeString, + Computed: true, + }, + "snap_set_guid": { + Type: schema.TypeString, + Computed: true, + }, + "snap_set_time": { + Type: schema.TypeInt, + Computed: true, + }, + "timestamp": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "vmid": { + Type: schema.TypeInt, + Computed: true, + }, + "update_by": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceDiskList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceDiskListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceDiskListSchemaMake(), + } +} diff --git a/decort/data_source_extnet.go b/decort/data_source_extnet.go new file mode 100644 index 0000000..e28445f --- /dev/null +++ b/decort/data_source_extnet.go @@ -0,0 +1,321 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceExtnetRead(d *schema.ResourceData, m interface{}) error { + e, err := utilityExtnetCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("ckey", e.CKey) + d.Set("meta", flattenMeta(e.Meta)) + d.Set("check__ips", e.CheckIPs) + d.Set("check_ips", e.CheckIps) + d.Set("default", e.Default) + d.Set("default_qos", flattenExtnetDefaultQos(e.DefaultQos)) + d.Set("desc", e.Desc) + d.Set("dns", e.Dns) + d.Set("excluded", e.Excluded) + d.Set("free_ips", e.FreeIps) + d.Set("gateway", e.Gateway) + d.Set("gid", e.GID) + d.Set("guid", e.GUID) + d.Set("ipcidr", e.IPCidr) + d.Set("milestones", e.Milestones) + d.Set("net_name", e.Name) + d.Set("network", e.Network) + d.Set("network_id", e.NetworkId) + d.Set("pre_reservations_num", e.PreReservationsNum) + d.Set("prefix", e.Prefix) + d.Set("pri_vnf_dev_id", e.PriVnfDevId) + d.Set("reservations", flattenExtnetReservations(e.Reservations)) + d.Set("shared_with", e.SharedWith) + d.Set("status", e.Status) + d.Set("vlan_id", e.VlanID) + d.Set("vnfs", flattenExtnetVNFS(e.VNFS)) + return nil +} + +func flattenExtnetReservations(ers ExtnetReservations) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, er := range ers { + temp := map[string]interface{}{ + "client_type": er.ClientType, + "domainname": er.DomainName, + "hostname": er.HostName, + "desc": er.Desc, + "ip": er.IP, + "mac": er.MAC, + "type": er.Type, + "vm_id": er.VMID, + } + res = append(res, temp) + } + + return res +} + +func flattenExtnetDefaultQos(edqos ExtnetQos) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "e_rate": edqos.ERate, + "guid": edqos.GUID, + "in_burst": edqos.InBurst, + "in_rate": edqos.InRate, + } + res = append(res, temp) + return res +} + +func flattenExtnetVNFS(evnfs ExtnetVNFS) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "dhcp": evnfs.DHCP, + } + res = append(res, temp) + return res +} + +func dataSourceExtnetSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "net_id": { + Type: schema.TypeInt, + Required: true, + }, + "ckey": { + Type: schema.TypeString, + Computed: true, + }, + "meta": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + Description: "meta", + }, + "check__ips": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "check_ips": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "default": { + Type: schema.TypeBool, + Computed: true, + }, + "default_qos": { + Type: schema.TypeList, + MaxItems: 1, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "e_rate": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "in_burst": { + Type: schema.TypeInt, + Computed: true, + }, + "in_rate": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "dns": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "excluded": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "free_ips": { + Type: schema.TypeInt, + Computed: true, + }, + "gateway": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "ipcidr": { + Type: schema.TypeString, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "net_name": { + Type: schema.TypeString, + Computed: true, + }, + "network": { + Type: schema.TypeString, + Computed: true, + }, + "network_id": { + Type: schema.TypeInt, + Computed: true, + }, + "pre_reservations_num": { + Type: schema.TypeInt, + Computed: true, + }, + "prefix": { + Type: schema.TypeInt, + Computed: true, + }, + "pri_vnf_dev_id": { + Type: schema.TypeInt, + Computed: true, + }, + "reservations": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "client_type": { + Type: schema.TypeString, + Computed: true, + }, + "domainname": { + Type: schema.TypeString, + Computed: true, + }, + "hostname": { + Type: schema.TypeString, + Computed: true, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "ip": { + Type: schema.TypeString, + Computed: true, + }, + "mac": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "vm_id": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "shared_with": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "vlan_id": { + Type: schema.TypeInt, + Computed: true, + }, + "vnfs": { + Type: schema.TypeList, + MaxItems: 1, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dhcp": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceExtnet() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceExtnetRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceExtnetSchemaMake(), + } +} diff --git a/decort/data_source_extnet_computes_list.go b/decort/data_source_extnet_computes_list.go new file mode 100644 index 0000000..c963a61 --- /dev/null +++ b/decort/data_source_extnet_computes_list.go @@ -0,0 +1,156 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenExtnetsComputes(ecs ExtnetExtendList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, ec := range ecs { + temp := map[string]interface{}{ + "net_id": ec.ID, + "ipaddr": ec.IPAddr, + "ipcidr": ec.IPCidr, + "name": ec.Name, + } + res = append(res, temp) + } + return res +} + +func flattenExtnetComputesList(ecl ExtnetComputesList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, ec := range ecl { + temp := map[string]interface{}{ + "account_id": ec.AccountId, + "account_name": ec.AccountName, + "extnets": flattenExtnetsComputes(ec.Extnets), + "id": ec.ID, + "name": ec.Name, + "rg_id": ec.RGID, + "rg_name": ec.RGName, + } + res = append(res, temp) + } + return res +} + +func dataSourceExtnetComputesListRead(d *schema.ResourceData, m interface{}) error { + extnetComputesList, err := utilityExtnetComputesListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenExtnetComputesList(extnetComputesList)) + + return nil +} + +func dataSourceExtnetComputesListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Required: true, + Description: "filter by account ID", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "extnets": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "net_id": { + Type: schema.TypeInt, + Computed: true, + }, + "ipaddr": { + Type: schema.TypeString, + Computed: true, + }, + "ipcidr": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "id": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceExtnetComputesList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceExtnetComputesListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceExtnetComputesListSchemaMake(), + } +} diff --git a/decort/data_source_extnet_default.go b/decort/data_source_extnet_default.go new file mode 100644 index 0000000..de5585f --- /dev/null +++ b/decort/data_source_extnet_default.go @@ -0,0 +1,74 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "strconv" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceExtnetDefaultRead(d *schema.ResourceData, m interface{}) error { + extnetId, err := utilityExtnetDefaultCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + extnetIdInt, err := strconv.ParseInt(extnetId, 10, 32) + if err != nil { + return err + } + d.Set("net_id", extnetIdInt) + + return nil +} + +func dataSourceExtnetDefaultSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "net_id": { + Type: schema.TypeInt, + Computed: true, + }, + } + return res +} + +func dataSourceExtnetDefault() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceExtnetDefaultRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceExtnetDefaultSchemaMake(), + } +} diff --git a/decort/data_source_extnet_list.go b/decort/data_source_extnet_list.go new file mode 100644 index 0000000..4789f33 --- /dev/null +++ b/decort/data_source_extnet_list.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenExtnetList(el ExtnetList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, e := range el { + temp := map[string]interface{}{ + "net_id": e.ID, + "ipcidr": e.IPCidr, + "name": e.Name, + } + res = append(res, temp) + } + return res +} + +func dataSourceExtnetListRead(d *schema.ResourceData, m interface{}) error { + extnetList, err := utilityExtnetListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenExtnetList(extnetList)) + + return nil +} + +func dataSourceExtnetListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Optional: true, + Description: "filter by account ID", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "net_id": { + Type: schema.TypeInt, + Computed: true, + }, + "ipcidr": { + Type: schema.TypeString, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceExtnetList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceExtnetListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceExtnetListSchemaMake(), + } +} diff --git a/decort/data_source_grid.go b/decort/data_source_grid.go index cba38ed..2529e3f 100644 --- a/decort/data_source_grid.go +++ b/decort/data_source_grid.go @@ -37,7 +37,6 @@ func flattenGrid(d *schema.ResourceData, grid *Grid) { d.Set("guid", grid.Guid) d.Set("location_code", grid.LocationCode) d.Set("id", grid.Id) - return } func dataSourceGridRead(d *schema.ResourceData, m interface{}) error { diff --git a/decort/data_source_image.go b/decort/data_source_image.go index c7e7bd6..9a218e9 100644 --- a/decort/data_source_image.go +++ b/decort/data_source_image.go @@ -69,7 +69,6 @@ func flattenImage(d *schema.ResourceData, image *Image) { d.Set("meta", flattenMeta(image.Meta)) d.Set("desc", image.Desc) d.Set("shared_with", image.SharedWith) - return } func dataSourceImageRead(d *schema.ResourceData, m interface{}) error { diff --git a/decort/data_source_image_list_stacks.go b/decort/data_source_image_list_stacks.go index 508c7fd..7b37371 100644 --- a/decort/data_source_image_list_stacks.go +++ b/decort/data_source_image_list_stacks.go @@ -29,7 +29,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) -func flattenImageListStacks(d *schema.ResourceData, stack ImageListStacks) []map[string]interface{} { +func flattenImageListStacks(_ *schema.ResourceData, stack ImageListStacks) []map[string]interface{} { temp := make([]map[string]interface{}, 0) for _, item := range stack { t := map[string]interface{}{ diff --git a/decort/data_source_rg_list.go b/decort/data_source_rg_list.go new file mode 100644 index 0000000..73afce5 --- /dev/null +++ b/decort/data_source_rg_list.go @@ -0,0 +1,314 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenRgList(rgl ResgroupListResp) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, rg := range rgl { + temp := map[string]interface{}{ + "account_id": rg.AccountID, + "account_name": rg.AccountName, + "acl": flattenRgAcl(rg.ACLs), + "created_by": rg.CreatedBy, + "created_time": rg.CreatedTime, + "def_net_id": rg.DefaultNetID, + "def_net_type": rg.DefaultNetType, + "deleted_by": rg.DeletedBy, + "deleted_time": rg.DeletedTime, + "desc": rg.Decsription, + "gid": rg.GridID, + "guid": rg.GUID, + "rg_id": rg.ID, + "lock_status": rg.LockStatus, + "milestones": rg.Milestones, + "name": rg.Name, + "register_computes": rg.RegisterComputes, + "resource_limits": flattenRgResourceLimits(rg.ResourceLimits), + "secret": rg.Secret, + "status": rg.Status, + "updated_by": rg.UpdatedBy, + "updated_time": rg.UpdatedTime, + "vins": rg.Vins, + "vms": rg.Computes, + } + res = append(res, temp) + } + return res + +} + +func flattenRgAcl(rgAcls []AccountAclRecord) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, rgAcl := range rgAcls { + temp := map[string]interface{}{ + "explicit": rgAcl.IsExplicit, + "guid": rgAcl.Guid, + "right": rgAcl.Rights, + "status": rgAcl.Status, + "type": rgAcl.Type, + "user_group_id": rgAcl.UgroupID, + } + res = append(res, temp) + } + return res +} + +func flattenRgResourceLimits(rl ResourceLimits) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + temp := map[string]interface{}{ + "cu_c": rl.CUC, + "cu_d": rl.CUD, + "cu_i": rl.CUI, + "cu_m": rl.CUM, + "cu_np": rl.CUNP, + "gpu_units": rl.GpuUnits, + } + res = append(res, temp) + + return res + +} + +func dataSourceRgListRead(d *schema.ResourceData, m interface{}) error { + rgList, err := utilityRgListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenRgList(rgList)) + + return nil +} + +func dataSourceRgListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "includedeleted": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "included deleted resource groups", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "explicit": { + Type: schema.TypeBool, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "right": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "def_net_id": { + Type: schema.TypeInt, + Computed: true, + }, + "def_net_type": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "desc": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "lock_status": { + Type: schema.TypeString, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "register_computes": { + Type: schema.TypeBool, + Computed: true, + }, + "resource_limits": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cu_c": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Computed: true, + }, + }, + }, + }, + "secret": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "vins": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "vms": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + }, + }, + }, + } + return res +} + +func dataSourceRgList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceRgListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceRgListSchemaMake(), + } +} diff --git a/decort/data_source_vins.go b/decort/data_source_vins.go index 2fd712b..61fd3c5 100644 --- a/decort/data_source_vins.go +++ b/decort/data_source_vins.go @@ -48,13 +48,13 @@ func flattenVins(d *schema.ResourceData, vins_facts string) error { } log.Debugf("flattenVins: decoded ViNS name:ID %s:%d, account ID %d, RG ID %d", - vinsRecord.Name, vinsRecord.ID, vinsRecord.AccountID, vinsRecord.RgID) + vinsRecord.Name, vinsRecord.ID, vinsRecord.AccountID, vinsRecord.RgID) d.SetId(fmt.Sprintf("%d", vinsRecord.ID)) d.Set("name", vinsRecord.Name) d.Set("account_id", vinsRecord.AccountID) d.Set("account_name", vinsRecord.AccountName) - err = d.Set("rg_id", vinsRecord.RgID) + d.Set("rg_id", vinsRecord.RgID) d.Set("description", vinsRecord.Desc) d.Set("ipcidr", vinsRecord.IPCidr) @@ -117,11 +117,11 @@ func dataSourceVins() *schema.Resource { }, /* - "vins_id": { - Type: schema.TypeInt, - Optional: true, - Description: "Unique ID of the ViNS. If ViNS ID is specified, then ViNS name, rg_id and account_id are ignored.", - }, + "vins_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Unique ID of the ViNS. If ViNS ID is specified, then ViNS name, rg_id and account_id are ignored.", + }, */ "rg_id": { diff --git a/decort/data_source_vins_list.go b/decort/data_source_vins_list.go new file mode 100644 index 0000000..84a2c0b --- /dev/null +++ b/decort/data_source_vins_list.go @@ -0,0 +1,178 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func flattenVinsList(vl VinsList) []map[string]interface{} { + res := make([]map[string]interface{}, 0) + for _, v := range vl { + temp := map[string]interface{}{ + "account_id": v.AccountId, + "account_name": v.AccountName, + "created_by": v.CreatedBy, + "created_time": v.CreatedTime, + "deleted_by": v.DeletedBy, + "deleted_time": v.DeletedTime, + "external_ip": v.ExternalIP, + "vins_id": v.ID, + "vins_name": v.Name, + "network": v.Network, + "rg_id": v.RGID, + "rg_name": v.RGName, + "status": v.Status, + "updated_by": v.UpdatedBy, + "updated_time": v.UpdatedTime, + "vxlan_id": v.VXLanID, + } + res = append(res, temp) + } + return res +} + +func dataSourceVinsListRead(d *schema.ResourceData, m interface{}) error { + vinsList, err := utilityVinsListCheckPresence(d, m) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(id.String()) + d.Set("items", flattenVinsList(vinsList)) + + return nil +} + +func dataSourceVinsListSchemaMake() map[string]*schema.Schema { + res := map[string]*schema.Schema{ + "include_deleted": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "include deleted computes", + }, + "page": { + Type: schema.TypeInt, + Optional: true, + Description: "Page number", + }, + "size": { + Type: schema.TypeInt, + Optional: true, + Description: "Page size", + }, + "items": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "external_ip": { + Type: schema.TypeString, + Computed: true, + }, + "vins_id": { + Type: schema.TypeInt, + Computed: true, + }, + "vins_name": { + Type: schema.TypeString, + Computed: true, + }, + "network": { + Type: schema.TypeString, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "vxlan_id": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + } + return res +} + +func dataSourceVinsList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Read: dataSourceVinsListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceVinsListSchemaMake(), + } +} diff --git a/decort/disk_subresource.go b/decort/disk_subresource.go deleted file mode 100644 index cf3a5c5..0000000 --- a/decort/disk_subresource.go +++ /dev/null @@ -1,86 +0,0 @@ -/* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , - -Licensed 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 decort - -import ( - // log "github.com/sirupsen/logrus" - - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/helper/validation" -) - - -// ID, type, name, size, account ID, SEP ID, SEP type, pool, status, tech status, compute ID, image ID -func diskSubresourceSchemaMake() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Required: true, - Description: "Name of this disk.", - }, - - "size": { - Type: schema.TypeInt, - Required: true, - ValidateFunc: validation.IntAtLeast(1), - Description: "Size of the disk in GB.", - }, - - "account_id": { - Type: schema.TypeInt, - Computed: true, - ValidateFunc: validation.IntAtLeast(1), - Description: "ID of the account this disk belongs to.", - }, - - "type": { - Type: schema.TypeString, - Optional: true, - Description: "Type of this disk.", - }, - - "sep_id": { - Type: schema.TypeString, - Optional: true, - Default: "default", - Description: "ID of the storage end-point provider serving this disk.", - }, - - "sep_type": { - Type: schema.TypeString, - Optional: true, - Default: "default", - Description: "Type of the storage provider serving this disk.", - }, - - "pool": { - Type: schema.TypeString, - Optional: true, - Default: "default", - Description: "Pool on the storage where this disk is located.", - }, - - "image_id": { - Type: schema.TypeInt, - Computed: true, - Description: "ID of the binary Image this disk resource is cloned from (if any).", - }, - } - - return rets -} diff --git a/decort/interface_subresource.go b/decort/interface_subresource.go deleted file mode 100644 index d6f8a9b..0000000 --- a/decort/interface_subresource.go +++ /dev/null @@ -1,331 +0,0 @@ -/* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , - -Licensed 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. -*/ - -/* - This file contains definitions and code for handling Interface component of Compute schema -*/ - -package decort - -import ( - /* - "log" - "strconv" - "strings" - */ - - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" -) - -func interfaceSubresourceSchemaMake() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "net_id": { - Type: schema.TypeInt, - Computed: true, - Description: "ID of the network entity this interface is connected to.", - }, - - "net_type": { - Type: schema.TypeString, - Computed: true, - Description: "Type of the network entity this interface is connected to.", - }, - - "ip_address": { - Type: schema.TypeString, - Computed: true, - Description: "IP addresses assigned to this interface.", - }, - - "netmask": { - Type: schema.TypeInt, - Computed: true, - Description: "Network mask to be used with this interface.", - }, - - "mac": { - Type: schema.TypeString, - Computed: true, - Description: "MAC address of this interface.", - }, - - "default_gw": { - Type: schema.TypeString, - Computed: true, - Description: "Default gateway associated with this interface.", - }, - - "name": { - Type: schema.TypeString, - Computed: true, - Description: "Interface name.", - }, - - "connection_id": { - Type: schema.TypeInt, - Computed: true, - Description: "VxLAN or VLAN ID this interface is connected to.", - }, - - "connection_type": { - Type: schema.TypeString, - Computed: true, - Description: "Type of the segment (VLAN or VxLAN) this interface is connected to.", - }, - - "qos": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource{ - Schema: interfaceQosSubresourceSchemaMake(), - }, - Description: "QoS settings for this interface.", - }, - } - - return rets -} - -func interfaceQosSubresourceSchemaMake() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "egress_rate": { - Type: schema.TypeInt, - Computed: true, - Description: "Egress rate limit on this interface.", - }, - - "ingress_burst": { - Type: schema.TypeInt, - Computed: true, - Description: "Ingress burst limit on this interface.", - }, - - "ingress_rate": { - Type: schema.TypeInt, - Computed: true, - Description: "Ingress rate limit on this interface.", - }, - - "guid": { - Type: schema.TypeString, - Computed: true, - Description: "GUID of this QoS record.", - }, - } - - return rets -} - -/* -func flattenNetworks(nets []NicRecord) []interface{} { - // this function expects an array of NicRecord as returned by machines/get API call - // NOTE: it does NOT expect a strucutre as returned by externalnetwork/list - var length = 0 - var strarray []string - - for _, value := range nets { - if value.NicType == "PUBLIC" { - length += 1 - } - } - log.Debugf("flattenNetworks: found %d NICs with PUBLIC type", length) - - result := make([]interface{}, length) - if length == 0 { - return result - } - - elem := make(map[string]interface{}) - - var subindex = 0 - for index, value := range nets { - if value.NicType == "PUBLIC" { - // this will be changed as network segments entity - // value.Params for ext net comes in a form "gateway:176.118.165.1 externalnetworkId:6" - // for network_id we need to extract from this string - strarray = strings.Split(value.Params, " ") - substr := strings.Split(strarray[1], ":") - elem["network_id"], _ = strconv.Atoi(substr[1]) - elem["ip_range"] = value.IPAddress - // elem["label"] = ... - should be uncommented for the future release - log.Debugf("flattenNetworks: parsed element %d - network_id %d, ip_range %s", - index, elem["network_id"].(int), value.IPAddress) - result[subindex] = elem - subindex += 1 - } - } - - return result -} - -func makePortforwardsConfig(arg_list []interface{}) (pfws []PortforwardConfig, count int) { - count = len(arg_list) - if count < 1 { - return nil, 0 - } - - pfws = make([]PortforwardConfig, count) - var subres_data map[string]interface{} - for index, value := range arg_list { - subres_data = value.(map[string]interface{}) - // pfws[index].Label = subres_data["label"].(string) - should be uncommented for future release - pfws[index].ExtPort = subres_data["ext_port"].(int) - pfws[index].IntPort = subres_data["int_port"].(int) - pfws[index].Proto = subres_data["proto"].(string) - } - - return pfws, count -} - -func flattenPortforwards(pfws []PortforwardRecord) []interface{} { - result := make([]interface{}, len(pfws)) - elem := make(map[string]interface{}) - var port_num int - - for index, value := range pfws { - // elem["label"] = ... - should be uncommented for the future release - - // external port field is of TypeInt in the portforwardSubresourceSchema, but string is returned - // by portforwards/list API, so we need conversion here - port_num, _ = strconv.Atoi(value.ExtPort) - elem["ext_port"] = port_num - // internal port field is of TypeInt in the portforwardSubresourceSchema, but string is returned - // by portforwards/list API, so we need conversion here - port_num, _ = strconv.Atoi(value.IntPort) - elem["int_port"] = port_num - elem["proto"] = value.Proto - elem["ext_ip"] = value.ExtIP - elem["int_ip"] = value.IntIP - result[index] = elem - } - - return result -} - -func portforwardSubresourceSchema() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "label": { - Type: schema.TypeString, - Required: true, - Description: "Unique label of this network connection to identify it amnong other connections for this VM.", - }, - - "ext_port": { - Type: schema.TypeInt, - Required: true, - ValidateFunc: validation.IntBetween(1, 65535), - Description: "External port number for this port forwarding rule.", - }, - - "int_port": { - Type: schema.TypeInt, - Required: true, - ValidateFunc: validation.IntBetween(1, 65535), - Description: "Internal port number for this port forwarding rule.", - }, - - "proto": { - Type: schema.TypeString, - Required: true, - // ValidateFunc: validation.IntBetween(1, ), - Description: "Protocol type for this port forwarding rule. Should be either 'tcp' or 'udp'.", - }, - - "ext_ip": { - Type: schema.TypeString, - Computed: true, - Description: ".", - }, - - "int_ip": { - Type: schema.TypeString, - Computed: true, - Description: ".", - }, - } - - return rets -} - -func flattenNICs(nics []NicRecord) []interface{} { - var result = make([]interface{}, len(nics)) - elem := make(map[string]interface{}) - - for index, value := range nics { - elem["status"] = value.Status - elem["type"] = value.NicType - elem["mac"] = value.MacAddress - elem["ip_address"] = value.IPAddress - elem["parameters"] = value.Params - elem["reference_id"] = value.ReferenceID - elem["network_id"] = value.NetworkID - result[index] = elem - } - - return result -} - -func nicSubresourceSchema() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Current status of this NIC.", - }, - - "type": { - Type: schema.TypeString, - Computed: true, - Description: "Type of this NIC.", - }, - - "mac": { - Type: schema.TypeString, - Computed: true, - Description: "MAC address assigned to this NIC.", - }, - - "ip_address": { - Type: schema.TypeString, - Computed: true, - Description: "IP address assigned to this NIC.", - }, - - "parameters": { - Type: schema.TypeString, - Computed: true, - Description: "Additional NIC parameters.", - }, - - "reference_id": { - Type: schema.TypeString, - Computed: true, - Description: "Reference ID of this NIC.", - }, - - "network_id": { - Type: schema.TypeInt, - Computed: true, - Description: "Network ID which this NIC is connected to.", - }, - } - - return rets -} - -*/ diff --git a/decort/models_api.go b/decort/models_api.go index ee1e5e3..89e8676 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -51,33 +51,49 @@ type UserAclRecord struct { } type AccountAclRecord struct { - IsExplicit bool `json:"explicit"` - Guid string `json:"guid"` - Rights string `json:"right"` - Status string `json:"status"` - Type string `json:"type"` - UgroupID string `json:"userGroupId"` + IsExplicit bool `json:"explicit"` + Guid string `json:"guid"` + Rights string `json:"right"` + Status string `json:"status"` + Type string `json:"type"` + UgroupID string `json:"userGroupId"` + CanBeDeleted bool `json:"canBeDeleted"` +} + +type ResourceLimits struct { + CUC float64 `json:"CU_C"` + CUD float64 `json:"CU_D"` + CUI float64 `json:"CU_I"` + CUM float64 `json:"CU_M"` + CUNP float64 `json:"CU_NP"` + GpuUnits float64 `json:"gpu_units"` } type ResgroupRecord struct { - ACLs []UserAclRecord `json:"acl"` - Owner AccountAclRecord `json:"accountAcl"` - AccountID int `json:"accountId"` - AccountName string `json:"accountName"` - CreatedBy string `json:"createdBy"` - CreatedTime uint64 `json:"createdTime"` - DefaultNetID int `json:"def_net_id"` - DefaultNetType string `json:"def_net_type"` - Decsription string `json:"desc"` - GridID int `json:"gid"` - ID uint `json:"id"` - LockStatus string `json:"lockStatus"` - Name string `json:"name"` - Status string `json:"status"` - UpdatedBy string `json:"updatedBy"` - UpdatedTime uint64 `json:"updatedTime"` - Vins []int `json:"vins"` - Computes []int `json:"vms"` + ACLs []AccountAclRecord `json:"acl"` + AccountID int `json:"accountId"` + AccountName string `json:"accountName"` + CreatedBy string `json:"createdBy"` + CreatedTime uint64 `json:"createdTime"` + DefaultNetID int `json:"def_net_id"` + DefaultNetType string `json:"def_net_type"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + Decsription string `json:"desc"` + GridID int `json:"gid"` + GUID int `json:"guid"` + ID uint `json:"id"` + LockStatus string `json:"lockStatus"` + Milestones int `json:"milestones"` + Name string `json:"name"` + RegisterComputes bool `json:"registerComputes"` + ResourceLimits ResourceLimits `json:"resourceLimits"` + Secret string `json:"secret"` + Status string `json:"status"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime uint64 `json:"updatedTime"` + Vins []int `json:"vins"` + Computes []int `json:"vms"` } const ResgroupListAPI = "/restmachine/cloudapi/rg/list" @@ -298,46 +314,62 @@ const ComputeResizeAPI = "/restmachine/cloudapi/compute/resize" type SnapshotRecord struct { Guid string `json:"guid"` Label string `json:"label"` + ResId string `json:"resId"` SnapSetGuid string `json:"snapSetGuid"` SnapSetTime uint64 `json:"snapSetTime"` TimeStamp uint64 `json:"timestamp"` } +type SnapshotRecordList []SnapshotRecord + type DiskRecord struct { - // ACLs `json:"ACL"` - it is a dictionary, special parsing required - // was - Acl map[string]string `json:"acl"` - AccountID int `json:"accountId"` - AccountName string `json:"accountName"` // NOTE: absent from compute/get output - BootPartition int `json:"bootPartition"` - CreatedTime uint64 `json:"creationTime"` - DeletedTime uint64 `json:"deletionTime"` - Desc string `json:"desc"` - DestructionTime uint64 `json:"destructionTime"` - DiskPath string `json:"diskPath"` - GridID int `json:"gid"` - ID uint `json:"id"` - ImageID int `json:"imageId"` - Images []int `json:"images"` - // IOTune 'json:"iotune" - it is a dictionary - Name string `json:"name"` - // Order `json:"order"` - ParentId int `json:"parentId"` - PciSlot int `json:"pciSlot"` - // ResID string `json:"resId"` - // ResName string `json:"resName"` - // Params string `json:"params"` - Pool string `json:"pool"` - PurgeTime uint64 `json:"purgeTime"` - // Role string `json:"role"` - SepType string `json:"sepType"` - SepID int `json:"sepId"` // NOTE: absent from compute/get output - SizeMax int `json:"sizeMax"` - SizeUsed int `json:"sizeUsed"` // sum over all snapshots of this disk to report total consumed space - Snapshots []SnapshotRecord `json:"snapshots"` - Status string `json:"status"` - TechStatus string `json:"techStatus"` - Type string `json:"type"` - ComputeID int `json:"vmid"` + Acl map[string]interface{} `json:"acl"` + AccountID int `json:"accountId"` + AccountName string `json:"accountName"` + BootPartition int `json:"bootPartition"` + CreatedTime uint64 `json:"creationTime"` + ComputeID int `json:"computeId"` + ComputeName string `json:"computeName"` + DeletedTime uint64 `json:"deletionTime"` + DeviceName string `json:"devicename"` + Desc string `json:"desc"` + DestructionTime uint64 `json:"destructionTime"` + DiskPath string `json:"diskPath"` + GridID int `json:"gid"` + GUID int `json:"guid"` + ID uint `json:"id"` + ImageID int `json:"imageId"` + Images []int `json:"images"` + IOTune map[string]interface{} `json:"iotune"` + IQN string `json:"iqn"` + Login string `json:"login"` + Name string `json:"name"` + MachineId int `json:"machineId"` + MachineName string `json:"machineName"` + Milestones uint64 `json:"milestones"` + Order int `json:"order"` + Params string `json:"params"` + Passwd string `json:"passwd"` + ParentId int `json:"parentId"` + PciSlot int `json:"pciSlot"` + Pool string `json:"pool"` + PurgeTime uint64 `json:"purgeTime"` + PurgeAttempts uint64 `json:"purgeAttempts"` + RealityDeviceNumber int `json:"realityDeviceNumber"` + ReferenceId string `json:"referenceId"` + ResID string `json:"resId"` + ResName string `json:"resName"` + Role string `json:"role"` + SepType string `json:"sepType"` + SepID int `json:"sepId"` // NOTE: absent from compute/get output + SizeMax int `json:"sizeMax"` + SizeUsed int `json:"sizeUsed"` // sum over all snapshots of this disk to report total consumed space + Snapshots []SnapshotRecord `json:"snapshots"` + Status string `json:"status"` + TechStatus string `json:"techStatus"` + Type string `json:"type"` + UpdateBy uint64 `json:"updateBy"` + VMID int `json:"vmid"` } type OsUserRecord struct { @@ -502,6 +534,7 @@ const DisksCreateAPI = "/restmachine/cloudapi/disks/create" const DisksGetAPI = "/restmachine/cloudapi/disks/get" // Returns single DiskRecord on success const DisksListAPI = "/restmachine/cloudapi/disks/list" // Returns list of DiskRecord on success + type DisksListResp []DiskRecord // @@ -955,3 +988,499 @@ type SepConfig map[string]interface{} type SepList []Sep type SepPool map[string]interface{} + +/////////////////////// +///// ACCOUNTS //// +/////////////////////// + +const accountAddUserAPI = "/restmachine/cloudapi/account/addUser" +const accountAuditsAPI = "/restmachine/cloudapi/account/audits" +const accountCreateAPI = "/restmachine/cloudapi/account/create" +const accountDeleteAPI = "/restmachine/cloudapi/account/delete" +const accountDeleteUserAPI = "/restmachine/cloudapi/account/deleteUser" +const accountDisableAPI = "/restmachine/cloudapi/account/disable" +const accountEnableAPI = "/restmachine/cloudapi/account/enable" +const accountGetAPI = "/restmachine/cloudapi/account/get" +const accountGetConsumedUnitsAPI = "/restmachine/cloudapi/account/getConsumedAccountUnits" +const accountGetConsumedUnitsByTypeAPI = "/restmachine/cloudapi/account/getConsumedCloudUnitsByType" +const accountGetReservedUnitsAPI = "/restmachine/cloudapi/account/getReservedAccountUnits" +const accountListAPI = "/restmachine/cloudapi/account/list" +const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" +const accountListDeletedAPI = "/restmachine/cloudapi/account/listDeleted" +const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" +const accountListFlipGroupsAPI = "/restmachine/cloudapi/account/listFlipGroups" +const accountListRGAPI = "/restmachine/cloudapi/account/listRG" +const accountListTemplatesAPI = "/restmachine/cloudapi/account/listTemplates" +const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" +const accountRestoreAPI = "/restmachine/cloudapi/account/restore" +const accountUpdateAPI = "/restmachine/cloudapi/account/update" +const accountUpdateUserAPI = "/restmachine/cloudapi/account/updateUser" + +////Structs + +type Account struct { + DCLocation string `json:"DCLocation"` + CKey string `jspn:"_ckey"` + Meta []interface{} `json:"_meta"` + Acl []AccountAclRecord `json:"acl"` + Company string `json:"company"` + CompanyUrl string `json:"companyurl"` + CreatedBy string `jspn:"createdBy"` + CreatedTime int `json:"createdTime"` + DeactiovationTime float64 `json:"deactivationTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + DisplayName string `json:"displayname"` + GUID int `json:"guid"` + ID int `json:"id"` + Name string `json:"name"` + ResourceLimits ResourceLimits `json:"resourceLimits"` + SendAccessEmails bool `json:"sendAccessEmails"` + ServiceAccount bool `json:"serviceAccount"` + Status string `json:"status"` + UpdatedTime int `json:"updatedTime"` + Version int `json:"version"` + Vins []int `json:"vins"` +} + +type AccountList []Account + +type AccountCloudApi struct { + Acl []AccountAclRecord `json:"acl"` + CreatedTime int `json:"createdTime"` + DeletedTime int `json:"deletedTime"` + ID int `json:"id"` + Name string `json:"name"` + Status string `json:"status"` + UpdatedTime int `json:"updatedTime"` +} + +type AccountCloudApiList []AccountCloudApi + +type Resource struct { + CPU int `json:"cpu"` + Disksize int `json:"disksize"` + Extips int `json:"extips"` + Exttraffic int `json:"exttraffic"` + GPU int `json:"gpu"` + RAM int `json:"ram"` +} + +type Resources struct { + Current Resource `json:"Current"` + Reserved Resource `json:"Reserved"` +} + +type Computes struct { + Started int `json:"started"` + Stopped int `json:"stopped"` +} + +type Machines struct { + Running int `json:"running"` + Halted int `json:"halted"` +} + +type AccountWithResources struct { + Account + Resources Resources `json:"Resources"` + Computes Computes `json:"computes"` + Machines Machines `json:"machines"` + Vinses int `json:"vinses"` +} + +type AccountCompute struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + CPUs int `json:"cpus"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + ComputeId int `json:"id"` + ComputeName string `json:"name"` + RAM int `json:"ram"` + Registered bool `json:"registered"` + RgId int `json:"rgId"` + RgName string `json:"rgName"` + Status string `json:"status"` + TechStatus string `json:"techStatus"` + TotalDisksSize int `json:"totalDisksSize"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` + UserManaged bool `json:"userManaged"` + VinsConnected int `json:"vinsConnected"` +} + +type AccountComputesList []AccountCompute + +type AccountDisk struct { + ID int `json:"id"` + Name string `json:"name"` + Pool string `json:"pool"` + SepId int `json:"sepId"` + SizeMax int `json:"sizeMax"` + Type string `json:"type"` +} + +type AccountDisksList []AccountDisk + +type AccountVin struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + Computes int `json:"computes"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + ExternalIP string `json:"externalIP"` + ID int `json:"id"` + Name string `json:"name"` + Network string `json:"network"` + PriVnfDevId int `json:"priVnfDevId"` + RgId int `json:"rgId"` + RgName string `json:"rgName"` + Status string `json:"status"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` +} + +type AccountVinsList []AccountVin + +type AccountAudit struct { + Call string `json:"call"` + ResponseTime float64 `json:"responsetime"` + StatusCode int `json:"statuscode"` + Timestamp float64 `json:"timestamp"` + User string `json:"user"` +} + +type AccountAuditsList []AccountAudit + +type AccountRGComputes struct { + Started int `json:"Started"` + Stopped int `json:"Stopped"` +} + +type AccountRGResources struct { + Consumed Resource `json:"Consumed"` + Limits Resource `json:"Limits"` + Reserved Resource `json:"Reserved"` +} + +type AccountRG struct { + Computes AccountRGComputes `json:"Computes"` + Resources AccountRGResources `json:"Resources"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + RGID int `json:"id"` + Milestones int `json:"milestones"` + RGName string `json:"name"` + Status string `json:"status"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` + Vinses int `json:"vinses"` +} + +type AccountRGList []AccountRG + +type AccountTemplate struct { + UNCPath string `json:"UNCPath"` + AccountId int `json:"accountId"` + Desc string `json:"desc"` + ID int `json:"id"` + Name string `json:"name"` + Public bool `json:"public"` + Size int `json:"size"` + Status string `json:"status"` + Type string `json:"type"` + Username string `json:"username"` +} + +type AccountTemplatesList []AccountTemplate + +type AccountFlipGroup struct { + AccountId int `json:"accountId"` + ClientType string `json:"clientType"` + ConnType string `json:"connType"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DefaultGW string `json:"defaultGW"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + Desc string `json:"desc"` + GID int `json:"gid"` + GUID int `json:"guid"` + ID int `json:"id"` + IP string `json:"ip"` + Milestones int `json:"milestones"` + Name string `json:"name"` + NetID int `json:"netId"` + NetType string `json:"netType"` + NetMask int `json:"netmask"` + Status string `json:"status"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` +} + +type AccountFlipGroupsList []AccountFlipGroup + +//////////////////// +//// BSERVICE //// +//////////////////// + +const bserviceCreateAPI = "/restmachine/cloudapi/bservice/create" +const bserviceDeleteAPI = "/restmachine/cloudapi/bservice/delete" +const bserviceDisableAPI = "/restmachine/cloudapi/bservice/disable" +const bserviceEnableAPI = "/restmachine/cloudapi/bservice/enable" +const bserviceGetAPI = "/restmachine/cloudapi/bservice/get" +const bserviceGroupAddAPI = "/restmachine/cloudapi/bservice/groupAdd" +const bserviceGroupComputeRemoveAPI = "/restmachine/cloudapi/bservice/groupComputeRemove" +const bserviceGroupGetAPI = "/restmachine/cloudapi/bservice/groupGet" +const bserviceGroupParentAddAPI = "/restmachine/cloudapi/bservice/groupParentAdd" +const bserviceGroupParentRemoveAPI = "/restmachine/cloudapi/bservice/groupParentRemove" +const bserviceGroupRemoveAPI = "/restmachine/cloudapi/bservice/groupRemove" +const bserviceGroupResizeAPI = "/restmachine/cloudapi/bservice/groupResize" +const bserviceGroupStartAPI = "/restmachine/cloudapi/bservice/groupStart" +const bserviceGroupStopAPI = "/restmachine/cloudapi/bservice/groupStop" +const bserviceGroupUpdateAPI = "/restmachine/cloudapi/bservice/groupUpdate" +const bserviceGroupUpdateExtnetAPI = "/restmachine/cloudapi/bservice/groupUpdateExtnet" +const bserviceGroupUpdateVinsAPI = "/restmachine/cloudapi/bservice/groupUpdateVins" +const bserviceListAPI = "/restmachine/cloudapi/bservice/list" +const bserviceListDeletedAPI = "/restmachine/cloudapi/bservice/listDeleted" +const bserviceRestoreAPI = "/restmachine/cloudapi/bservice/restore" +const bserviceSnapshotCreateAPI = "/restmachine/cloudapi/bservice/snapshotCreate" +const bserviceSnapshotDeleteAPI = "/restmachine/cloudapi/bservice/snapshotDelete" +const bserviceSnapshotListAPI = "/restmachine/cloudapi/bservice/snapshotList" +const bserviceSnapshotRollbackAPI = "/restmachine/cloudapi/bservice/snapshotRollback" +const bserviceStartAPI = "/restmachine/cloudapi/bservice/start" +const bserviceStopAPI = "/restmachine/cloudapi/bservice/stop" + +///Structs + +type BasicServiceCompute struct { + CompGroupId int `json:"compgroupId"` + CompGroupName string `json:"compgroupName"` + CompGroupRole string `json:"compgroupRole"` + ID int `json:"id"` + Name string `json:"name"` +} + +type BasicServiceComputes []BasicServiceCompute + +type BasicServiceSnapshot struct { + GUID string `json:"guid"` + Label string `json:"label"` + Timestamp int `json:"timestamp"` + Valid bool `json:"valid"` +} + +type BasicServiceSnapshots []BasicServiceSnapshot + +type BasicService struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + BaseDomain string `json:"baseDomain"` + + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + GID int `json:"gid"` + Groups []int `json:"groups"` + GUID int `json:"guid"` + ID int `json:"id"` + Name string `json:"name"` + ParentSrvId int `json:"parentSrvId"` + ParentSrvType string `json:"parentSrvType"` + RGID int `json:"rgId"` + RGName string `json:"rgName"` + SSHUser string `json:"sshUser"` + Status string `json:"status"` + TechStatus string `json:"techStatus"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` + UserManaged bool `json:"userManaged"` +} + +type BasicServiceList []BasicService + +type BasicServiceExtend struct { + BasicService + Computes BasicServiceComputes `json:"computes"` + CPUTotal int `json:"cpuTotal"` + DiskTotal int `json:"diskTotal"` + GroupsName []string `json:"groupsName"` + Milestones int `json:"milestones"` + RamTotal int `json:"ramTotal"` + Snapshots BasicServiceSnapshots `json:"snapshots"` + SSHKey string `json:"sshKey"` +} + +type BasicServiceGroupOSUser struct { + Login string `json:"login"` + Password string `json:"password"` +} + +type BasicServiceGroupOSUsers []BasicServiceGroupOSUser + +type BasicServicceGroupCompute struct { + ID int `json:"id"` + IPAdresses []string `json:"ipAddresses"` + Name string `json:"name"` + OSUsers BasicServiceGroupOSUsers `json:"osUsers"` +} + +type BasicServiceGroupComputes []BasicServicceGroupCompute + +type BasicServiceGroup struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + Computes BasicServiceGroupComputes `json:"computes"` + Consistency bool `json:"consistency"` + CPU int `json:"cpu"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + Disk int `json:"disk"` + Driver string `json:"driver"` + Extnets []int `json:"extnets"` + GID int `json:"gid"` + GUID int `json:"guid"` + ID int `json:"id"` + ImageId int `json:"imageId"` + Milestones int `json:"milestones"` + Name string `json:"name"` + Parents []int `json:"parents"` + RAM int `json:"ram"` + RGID int `json:"rgId"` + RGName string `json:"rgName"` + Role string `json:"role"` + SepId int `json:"sepId"` + SeqNo int `json:"seqNo"` + ServiceId int `json:"serviceId"` + Status string `json:"status"` + TechStatus string `json:"techStatus"` + TimeoutStart int `json:"timeoutStart"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` + Vinses []int `json:"vinses"` +} + +/////////////////// +///// EXTNET ///// +/////////////////// + +const extnetListAPI = "/restmachine/cloudapi/extnet/list" +const extnetListComputesAPI = "/restmachine/cloudapi/extnet/listComputes" +const extnetGetDefaultAPI = "/restmachine/cloudapi/extnet/getDefault" +const extnetGetAPI = "/restmachine/cloudapi/extnet/get" + +type Extnet struct { + ID int `json:"id"` + IPCidr string `json:"ipcidr"` + Name string `json:"name"` +} +type ExtnetExtend struct { + Extnet + IPAddr string `json:"ipaddr"` +} + +type ExtnetList []Extnet +type ExtnetExtendList []ExtnetExtend + +type ExtnetComputes struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + Extnets ExtnetExtendList `json:"extnets"` + ID int `json:"id"` + Name string `json:"name"` + RGID int `json:"rgId"` + RGName string `json:"rgName"` +} + +type ExtnetComputesList []ExtnetComputes + +type ExtnetQos struct { + ERate int `json:"eRate"` + GUID string `json:"guid"` + InBurst int `json:"inBurst"` + InRate int `json:"inRate"` +} + +type ExtnetReservation struct { + ClientType string `json:"clientType"` + Desc string `json:"desc"` + DomainName string `json:"domainname"` + HostName string `json:"hostname"` + IP string `json:"ip"` + MAC string `json:"mac"` + Type string `json:"type"` + VMID int `json:"vmId"` +} + +type ExtnetReservations []ExtnetReservation + +type ExtnetVNFS struct { + DHCP int `json:"dhcp"` +} + +type ExtnetDetailed struct { + CKey string `json:"_ckey"` + Meta []interface{} `json:"_meta"` + CheckIPs []string `json:"checkIPs"` + CheckIps []string `json:"checkIps"` + Default bool `json:"default"` + DefaultQos ExtnetQos `json:"defaultQos"` + Desc string `json:"desc"` + Dns []string `json:"dns"` + Excluded []string `json:"excluded"` + FreeIps int `json:"free_ips"` + Gateway string `json:"gateway"` + GID int `json:"gid"` + GUID int `json:"guid"` + ID int `json:"id"` + IPCidr string `json:"ipcidr"` + Milestones int `json:"milestones"` + Name string `json:"name"` + Network string `json:"network"` + NetworkId int `json:"networkId"` + PreReservationsNum int `json:"preReservationsNum"` + Prefix int `json:"prefix"` + PriVnfDevId int `json:"priVnfDevId"` + Reservations ExtnetReservations `json:"reservations"` + SharedWith []int `json:"sharedWith"` + Status string `json:"status"` + VlanID int `json:"vlanId"` + VNFS ExtnetVNFS `json:"vnfs"` +} + +////////////// +//// VINS //// +////////////// + +const vinsListAPI = "/restmachine/cloudapi/vins/list" + +type Vins struct { + AccountId int `json:"accountId"` + AccountName string `json:"accountName"` + CreatedBy string `json:"createdBy"` + CreatedTime int `json:"createdTime"` + DeletedBy string `json:"deletedBy"` + DeletedTime int `json:"deletedTime"` + ExternalIP string `json:"externalIP"` + ID int `json:"id"` + Name string `json:"name"` + Network string `json:"network"` + RGID int `json:"rgId"` + RGName string `json:"rgName"` + Status string `json:"status"` + UpdatedBy string `json:"updatedBy"` + UpdatedTime int `json:"updatedTime"` + VXLanID int `json:"vxlanId"` +} + +type VinsList []Vins diff --git a/decort/network_subresource.go b/decort/network_subresource.go index 2e8ca3d..183fe5a 100644 --- a/decort/network_subresource.go +++ b/decort/network_subresource.go @@ -23,7 +23,9 @@ import ( // "fmt" "bytes" "hash/fnv" - log "github.com/sirupsen/logrus" + + log "github.com/sirupsen/logrus" + // "net/url" "sort" @@ -43,19 +45,19 @@ func networkSubresIPAddreDiffSupperss(key, oldVal, newVal string, d *schema.Reso return true // suppress difference } -// This function is based on the original Terraform SerializeResourceForHash found +// This function is based on the original Terraform SerializeResourceForHash found // in helper/schema/serialize.go -// It skips network subresource attributes, which are irrelevant for identification +// It skips network subresource attributes, which are irrelevant for identification // of unique network blocks func networkSubresourceSerialize(output *bytes.Buffer, val interface{}, resource *schema.Resource) { if val == nil { return } - + rs := resource.Schema m := val.(map[string]interface{}) - var keys []string + keys := make([]string, 0, len(rs)) allComputed := true for k, val := range rs { @@ -96,7 +98,7 @@ func networkSubresourceSerialize(output *bytes.Buffer, val interface{}, resource // from network subresource (e.g. in flattenCompute) // // This function is based on the original Terraform function HashResource from -// helper/schema/set.go +// helper/schema/set.go func HashNetworkSubresource(resource *schema.Resource) schema.SchemaSetFunc { return func(v interface{}) int { var serialized bytes.Buffer @@ -111,11 +113,11 @@ func HashNetworkSubresource(resource *schema.Resource) schema.SchemaSetFunc { func networkSubresourceSchemaMake() map[string]*schema.Schema { rets := map[string]*schema.Schema{ "net_type": { - Type: schema.TypeString, - Required: true, - StateFunc: stateFuncToUpper, + Type: schema.TypeString, + Required: true, + StateFunc: stateFuncToUpper, ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS"}, false), // observe case while validating - Description: "Type of the network for this connection, either EXTNET or VINS.", + Description: "Type of the network for this connection, either EXTNET or VINS.", }, "net_id": { @@ -125,11 +127,11 @@ func networkSubresourceSchemaMake() map[string]*schema.Schema { }, "ip_address": { - Type: schema.TypeString, - Optional: true, - Computed: true, + Type: schema.TypeString, + Optional: true, + Computed: true, DiffSuppressFunc: networkSubresIPAddreDiffSupperss, - Description: "Optional IP address to assign to this connection. This IP should belong to the selected network and free for use.", + Description: "Optional IP address to assign to this connection. This IP should belong to the selected network and free for use.", }, "mac": { @@ -137,7 +139,6 @@ func networkSubresourceSchemaMake() map[string]*schema.Schema { Computed: true, Description: "MAC address associated with this connection. MAC address is assigned automatically.", }, - } return rets } diff --git a/decort/provider.go b/decort/provider.go index c2a4aa1..1f47cbc 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -26,8 +26,6 @@ import ( // "github.com/hashicorp/terraform-plugin-sdk/terraform" ) -var decsController *ControllerCfg - func Provider() *schema.Provider { return &schema.Provider{ Schema: map[string]*schema.Schema{ @@ -99,44 +97,71 @@ func Provider() *schema.Provider { }, ResourcesMap: map[string]*schema.Resource{ - "decort_resgroup": resourceResgroup(), - "decort_kvmvm": resourceCompute(), - "decort_disk": resourceDisk(), - "decort_vins": resourceVins(), - "decort_pfw": resourcePfw(), - "decort_k8s": resourceK8s(), - "decort_k8s_wg": resourceK8sWg(), - "decort_image": resourceImage(), - "decort_virtual_image": resourceVirtualImage(), - "decort_cdrom_image": resourceCDROMImage(), - "decort_delete_images": resourceDeleteImages(), - "decort_snapshot": resourceSnapshot(), - "decort_pcidevice": resourcePcidevice(), - "decort_sep": resourceSep(), - "decort_sep_config": resourceSepConfig(), + "decort_resgroup": resourceResgroup(), + "decort_kvmvm": resourceCompute(), + "decort_disk": resourceDisk(), + "decort_vins": resourceVins(), + "decort_pfw": resourcePfw(), + "decort_k8s": resourceK8s(), + "decort_k8s_wg": resourceK8sWg(), + "decort_image": resourceImage(), + "decort_virtual_image": resourceVirtualImage(), + "decort_cdrom_image": resourceCDROMImage(), + "decort_delete_images": resourceDeleteImages(), + "decort_snapshot": resourceSnapshot(), + "decort_pcidevice": resourcePcidevice(), + "decort_sep": resourceSep(), + "decort_sep_config": resourceSepConfig(), + "decort_account": resourceAccount(), + "decort_bservice": resourceBasicService(), + "decort_bservice_group": resourceBasicServiceGroup(), }, DataSourcesMap: map[string]*schema.Resource{ - "decort_account": dataSourceAccount(), - "decort_resgroup": dataSourceResgroup(), - "decort_kvmvm": dataSourceCompute(), - "decort_image": dataSourceImage(), - "decort_disk": dataSourceDisk(), - "decort_vins": dataSourceVins(), - "decort_grid": dataSourceGrid(), - "decort_grid_list": dataSourceGridList(), - "decort_image_list": dataSourceImageList(), - "decort_image_list_stacks": dataSourceImageListStacks(), - "decort_snapshot_list": dataSourceSnapshotList(), - "decort_vgpu": dataSourceVGPU(), - "decort_pcidevice": dataSourcePcidevice(), - "decort_pcidevice_list": dataSourcePcideviceList(), - "decort_sep_list": dataSourceSepList(), - "decort_sep": dataSourceSep(), - "decort_sep_consumption": dataSourceSepConsumption(), - "decort_sep_disk_list": dataSourceSepDiskList(), - "decort_sep_config": dataSourceSepConfig(), - "decort_sep_pool": dataSourceSepPool(), + "decort_account": dataSourceAccount(), + "decort_resgroup": dataSourceResgroup(), + "decort_kvmvm": dataSourceCompute(), + "decort_image": dataSourceImage(), + "decort_disk": dataSourceDisk(), + "decort_vins": dataSourceVins(), + "decort_grid": dataSourceGrid(), + "decort_grid_list": dataSourceGridList(), + "decort_image_list": dataSourceImageList(), + "decort_image_list_stacks": dataSourceImageListStacks(), + "decort_snapshot_list": dataSourceSnapshotList(), + "decort_vgpu": dataSourceVGPU(), + "decort_pcidevice": dataSourcePcidevice(), + "decort_pcidevice_list": dataSourcePcideviceList(), + "decort_sep_list": dataSourceSepList(), + "decort_sep": dataSourceSep(), + "decort_sep_consumption": dataSourceSepConsumption(), + "decort_sep_disk_list": dataSourceSepDiskList(), + "decort_sep_config": dataSourceSepConfig(), + "decort_sep_pool": dataSourceSepPool(), + "decort_disk_list": dataSourceDiskList(), + "decort_rg_list": dataSourceRgList(), + "decort_account_list": dataSourceAccountList(), + "decort_account_computes_list": dataSourceAccountComputesList(), + "decort_account_disks_list": dataSourceAccountDisksList(), + "decort_account_vins_list": dataSourceAccountVinsList(), + "decort_account_audits_list": dataSourceAccountAuditsList(), + "decort_account_rg_list": dataSourceAccountRGList(), + "decort_account_consumed_units": dataSourceAccountConsumedUnits(), + "decort_account_consumed_units_by_type": dataSourceAccountConsumedUnitsByType(), + "decort_account_reserved_units": dataSourceAccountReservedUnits(), + "decort_account_templates_list": dataSourceAccountTemplatessList(), + "decort_account_deleted_list": dataSourceAccountDeletedList(), + "decort_account_flipgroups_list": dataSourceAccountFlipGroupsList(), + "decort_bservice_list": dataSourceBasicServiceList(), + "decort_bservice": dataSourceBasicService(), + "decort_bservice_snapshot_list": dataSourceBasicServiceSnapshotList(), + "decort_bservice_group": dataSourceBasicServiceGroup(), + "decort_bservice_deleted_list": dataSourceBasicServiceDeletedList(), + "decort_extnet_list": dataSourceExtnetList(), + "decort_extnet_computes_list": dataSourceExtnetComputesList(), + "decort_extnet": dataSourceExtnet(), + "decort_extnet_default": dataSourceExtnetDefault(), + "decort_vins_list": dataSourceVinsList(), // "decort_pfw": dataSourcePfw(), }, diff --git a/decort/quota_subresource.go b/decort/quota_subresource.go index 7395f7d..f6e2fc1 100644 --- a/decort/quota_subresource.go +++ b/decort/quota_subresource.go @@ -28,7 +28,7 @@ import ( // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) -func makeQuotaRecord(arg_list []interface{}) (QuotaRecord, int) { +func makeQuotaRecord(arg_list []interface{}) QuotaRecord { quota := QuotaRecord{ Cpu: -1, Ram: -1., // this is float64, but may change in the future @@ -63,7 +63,7 @@ func makeQuotaRecord(arg_list []interface{}) (QuotaRecord, int) { quota.GpuUnits = subres_data["gpu_units"].(int) } - return quota, 1 + return quota } func parseQuota(quota QuotaRecord) []interface{} { diff --git a/decort/resource_account.go b/decort/resource_account.go new file mode 100644 index 0000000..66fc97c --- /dev/null +++ b/decort/resource_account.go @@ -0,0 +1,794 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "errors" + "net/url" + "strconv" + "strings" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + log "github.com/sirupsen/logrus" +) + +func resourceAccountCreate(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceAccountCreate") + + if accountId, ok := d.GetOk("account_id"); ok { + if exists, err := resourceAccountExists(d, m); exists { + if err != nil { + return err + } + d.SetId(strconv.Itoa(accountId.(int))) + err = resourceAccountRead(d, m) + if err != nil { + return err + } + + return nil + } + return errors.New("provided account id does not exist") + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("name", d.Get("account_name").(string)) + urlValues.Add("username", d.Get("username").(string)) + + if emailaddress, ok := d.GetOk("emailaddress"); ok { + urlValues.Add("emailaddress", emailaddress.(string)) + } + if sendAccessEmails, ok := d.GetOk("send_access_emails"); ok { + urlValues.Add("sendAccessEmails", strconv.FormatBool(sendAccessEmails.(bool))) + } + if resLimits, ok := d.GetOk("resource_limits"); ok { + resLimit := resLimits.([]interface{})[0] + resLimitConv := resLimit.(map[string]interface{}) + if resLimitConv["cu_m"] != nil { + maxMemCap := int(resLimitConv["cu_m"].(float64)) + if maxMemCap == 0 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap)) + } + } + if resLimitConv["cu_d"] != nil { + maxDiskCap := int(resLimitConv["cu_d"].(float64)) + if maxDiskCap == 0 { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap)) + } + } + if resLimitConv["cu_c"] != nil { + maxCPUCap := int(resLimitConv["cu_c"].(float64)) + if maxCPUCap == 0 { + urlValues.Add("maxCPUCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap)) + } + + } + if resLimitConv["cu_i"] != nil { + maxNumPublicIP := int(resLimitConv["cu_i"].(float64)) + if maxNumPublicIP == 0 { + urlValues.Add("maxNumPublicIP", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP)) + } + + } + if resLimitConv["cu_np"] != nil { + maxNP := int(resLimitConv["cu_np"].(float64)) + if maxNP == 0 { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP)) + } + + } + if resLimitConv["gpu_units"] != nil { + gpuUnits := int(resLimitConv["gpu_units"].(float64)) + if gpuUnits == 0 { + urlValues.Add("gpu_units", strconv.Itoa(-1)) + } else { + urlValues.Add("gpu_units", strconv.Itoa(gpuUnits)) + } + } + } + + accountId, err := controller.decortAPICall("POST", accountCreateAPI, urlValues) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(accountId) + d.Set("account_id", accountId) + + err = resourceAccountRead(d, m) + if err != nil { + return err + } + + d.SetId(id.String()) + + return nil +} + +func resourceAccountRead(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceAccountRead") + + acc, err := utilityAccountCheckPresence(d, m) + if acc == nil { + d.SetId("") + return err + } + + d.Set("dc_location", acc.DCLocation) + d.Set("resources", flattenAccResources(acc.Resources)) + d.Set("ckey", acc.CKey) + d.Set("meta", flattenMeta(acc.Meta)) + d.Set("acl", flattenAccAcl(acc.Acl)) + d.Set("company", acc.Company) + d.Set("companyurl", acc.CompanyUrl) + d.Set("created_by", acc.CreatedBy) + d.Set("created_time", acc.CreatedTime) + d.Set("deactivation_time", acc.DeactiovationTime) + d.Set("deleted_by", acc.DeletedBy) + d.Set("deleted_time", acc.DeletedTime) + d.Set("displayname", acc.DisplayName) + d.Set("guid", acc.GUID) + d.Set("account_id", acc.ID) + d.Set("account_name", acc.Name) + d.Set("resource_limits", flattenRgResourceLimits(acc.ResourceLimits)) + d.Set("send_access_emails", acc.SendAccessEmails) + d.Set("service_account", acc.ServiceAccount) + d.Set("status", acc.Status) + d.Set("updated_time", acc.UpdatedTime) + d.Set("version", acc.Version) + d.Set("vins", acc.Vins) + d.Set("vinses", acc.Vinses) + d.Set("computes", flattenAccComputes(acc.Computes)) + d.Set("machines", flattenAccMachines(acc.Machines)) + + return nil +} + +func resourceAccountDelete(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceAccountDelete") + + account, err := utilityAccountCheckPresence(d, m) + if account == nil { + if err != nil { + return err + } + return nil + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + urlValues.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool))) + + _, err = controller.decortAPICall("POST", accountDeleteAPI, urlValues) + if err != nil { + return err + } + d.SetId("") + + return nil +} + +func resourceAccountExists(d *schema.ResourceData, m interface{}) (bool, error) { + log.Debugf("resourceAccountExists") + + account, err := utilityAccountCheckPresence(d, m) + if account == nil { + if err != nil { + return false, err + } + return false, nil + } + + return true, nil +} + +func resourceAccountEdit(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceAccountEdit") + c := m.(*ControllerCfg) + + urlValues := &url.Values{} + if d.HasChange("enable") { + api := accountDisableAPI + enable := d.Get("enable").(bool) + if enable { + api = accountEnableAPI + } + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + _, err := c.decortAPICall("POST", api, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("account_name") { + urlValues.Add("name", d.Get("account_name").(string)) + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + _, err := c.decortAPICall("POST", accountUpdateAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + if d.HasChange("resource_limits") { + resLimit := d.Get("resource_limits").([]interface{})[0] + resLimitConv := resLimit.(map[string]interface{}) + + if resLimitConv["cu_m"] != nil { + maxMemCap := int(resLimitConv["cu_m"].(float64)) + if maxMemCap == 0 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(maxMemCap)) + } + } + if resLimitConv["cu_d"] != nil { + maxDiskCap := int(resLimitConv["cu_d"].(float64)) + if maxDiskCap == 0 { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(maxDiskCap)) + } + } + if resLimitConv["cu_c"] != nil { + maxCPUCap := int(resLimitConv["cu_c"].(float64)) + if maxCPUCap == 0 { + urlValues.Add("maxCPUCapacity", strconv.Itoa(-1)) + } else { + urlValues.Add("maxCPUCapacity", strconv.Itoa(maxCPUCap)) + } + + } + if resLimitConv["cu_i"] != nil { + maxNumPublicIP := int(resLimitConv["cu_i"].(float64)) + if maxNumPublicIP == 0 { + urlValues.Add("maxNumPublicIP", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNumPublicIP", strconv.Itoa(maxNumPublicIP)) + } + + } + if resLimitConv["cu_np"] != nil { + maxNP := int(resLimitConv["cu_np"].(float64)) + if maxNP == 0 { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(-1)) + } else { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(maxNP)) + } + + } + if resLimitConv["gpu_units"] != nil { + gpuUnits := int(resLimitConv["gpu_units"].(float64)) + if gpuUnits == 0 { + urlValues.Add("gpu_units", strconv.Itoa(-1)) + } else { + urlValues.Add("gpu_units", strconv.Itoa(gpuUnits)) + } + } + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + _, err := c.decortAPICall("POST", accountUpdateAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("send_access_emails") { + urlValues.Add("sendAccessEmails", strconv.FormatBool(d.Get("send_access_emails").(bool))) + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + _, err := c.decortAPICall("POST", accountUpdateAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("restore") { + restore := d.Get("restore").(bool) + if restore { + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + _, err := c.decortAPICall("POST", accountRestoreAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if d.HasChange("users") { + deletedUsers := make([]interface{}, 0) + addedUsers := make([]interface{}, 0) + updatedUsers := make([]interface{}, 0) + + old, new := d.GetChange("users") + oldConv := old.([]interface{}) + newConv := new.([]interface{}) + for _, el := range oldConv { + if !isContainsUser(newConv, el) { + deletedUsers = append(deletedUsers, el) + } + } + for _, el := range newConv { + if !isContainsUser(oldConv, el) { + addedUsers = append(addedUsers, el) + } else { + if isChangedUser(oldConv, el) { + updatedUsers = append(updatedUsers, el) + } + } + } + + if len(deletedUsers) > 0 { + for _, user := range deletedUsers { + userConv := user.(map[string]interface{}) + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + urlValues.Add("userId", userConv["user_id"].(string)) + urlValues.Add("recursivedelete", strconv.FormatBool(userConv["recursive_delete"].(bool))) + _, err := c.decortAPICall("POST", accountDeleteUserAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if len(addedUsers) > 0 { + for _, user := range addedUsers { + userConv := user.(map[string]interface{}) + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + urlValues.Add("userId", userConv["user_id"].(string)) + urlValues.Add("accesstype", strings.ToUpper(userConv["access_type"].(string))) + _, err := c.decortAPICall("POST", accountAddUserAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if len(updatedUsers) > 0 { + for _, user := range updatedUsers { + userConv := user.(map[string]interface{}) + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + urlValues.Add("userId", userConv["user_id"].(string)) + urlValues.Add("accesstype", strings.ToUpper(userConv["access_type"].(string))) + _, err := c.decortAPICall("POST", accountUpdateUserAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + } + + return nil +} + +func isContainsUser(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(map[string]interface{}) + elConv := el.(map[string]interface{}) + if elOldConv["user_id"].(string) == elConv["user_id"].(string) { + return true + } + } + return false +} + +func isChangedUser(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(map[string]interface{}) + elConv := el.(map[string]interface{}) + if elOldConv["user_id"].(string) == elConv["user_id"].(string) && + (!strings.EqualFold(elOldConv["access_type"].(string), elConv["access_type"].(string)) || + elOldConv["recursive_delete"].(bool) != elConv["recursive_delete"].(bool)) { + return true + } + } + return false +} + +func resourceAccountSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "account_name": { + Type: schema.TypeString, + Required: true, + Description: "account name", + }, + "username": { + Type: schema.TypeString, + Required: true, + Description: "username of owner the account", + }, + "emailaddress": { + Type: schema.TypeString, + Optional: true, + Description: "email", + }, + "send_access_emails": { + Type: schema.TypeBool, + Optional: true, + Default: true, + Description: "if true send emails when a user is granted access to resources", + }, + "users": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "user_id": { + Type: schema.TypeString, + Required: true, + }, + "access_type": { + Type: schema.TypeString, + Required: true, + }, + "recursive_delete": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + }, + }, + }, + "restore": { + Type: schema.TypeBool, + Optional: true, + Description: "restore a deleted account", + }, + "permanently": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "whether to completely delete the account", + }, + "enable": { + Type: schema.TypeBool, + Optional: true, + Description: "enable/disable account", + }, + "resource_limits": { + Type: schema.TypeList, + Optional: true, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cu_c": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + "cu_d": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + "cu_i": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + "cu_m": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + "cu_np": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + "gpu_units": { + Type: schema.TypeFloat, + Optional: true, + Computed: true, + }, + }, + }, + }, + "account_id": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "dc_location": { + Type: schema.TypeString, + Computed: true, + }, + "resources": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "current": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "reserved": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cpu": { + Type: schema.TypeInt, + Computed: true, + }, + "disksize": { + Type: schema.TypeInt, + Computed: true, + }, + "extips": { + Type: schema.TypeInt, + Computed: true, + }, + "exttraffic": { + Type: schema.TypeInt, + Computed: true, + }, + "gpu": { + Type: schema.TypeInt, + Computed: true, + }, + "ram": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "ckey": { + Type: schema.TypeString, + Computed: true, + }, + "meta": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "can_be_deleted": { + Type: schema.TypeBool, + Computed: true, + }, + "explicit": { + Type: schema.TypeBool, + Computed: true, + }, + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "right": { + Type: schema.TypeString, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "type": { + Type: schema.TypeString, + Computed: true, + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "company": { + Type: schema.TypeString, + Computed: true, + }, + "companyurl": { + Type: schema.TypeString, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deactivation_time": { + Type: schema.TypeFloat, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "displayname": { + Type: schema.TypeString, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "service_account": { + Type: schema.TypeBool, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "version": { + Type: schema.TypeInt, + Computed: true, + }, + "vins": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "started": { + Type: schema.TypeInt, + Computed: true, + }, + "stopped": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "machines": { + Type: schema.TypeList, + Computed: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "halted": { + Type: schema.TypeInt, + Computed: true, + }, + "running": { + Type: schema.TypeInt, + Computed: true, + }, + }, + }, + }, + "vinses": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + +func resourceAccount() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Create: resourceAccountCreate, + Read: resourceAccountRead, + Update: resourceAccountEdit, + Delete: resourceAccountDelete, + Exists: resourceAccountExists, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &Timeout60s, + Read: &Timeout30s, + Update: &Timeout60s, + Delete: &Timeout60s, + Default: &Timeout60s, + }, + + Schema: resourceAccountSchemaMake(), + } +} diff --git a/decort/resource_bservice.go b/decort/resource_bservice.go new file mode 100644 index 0000000..9f0df09 --- /dev/null +++ b/decort/resource_bservice.go @@ -0,0 +1,554 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "errors" + "net/url" + "strconv" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + log "github.com/sirupsen/logrus" +) + +func resourceBasicServiceCreate(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceCreate") + + if serviceId, ok := d.GetOk("service_id"); ok { + if exists, err := resourceBasicServiceExists(d, m); exists { + if err != nil { + return err + } + id := uuid.New() + d.SetId(strconv.Itoa(serviceId.(int))) + d.Set("service_id", strconv.Itoa(serviceId.(int))) + err = resourceBasicServiceRead(d, m) + if err != nil { + return err + } + d.SetId(id.String()) + return nil + } + return errors.New("provided service id does not exist") + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("name", d.Get("service_name").(string)) + urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int))) + + if sshKey, ok := d.GetOk("ssh_key"); ok { + urlValues.Add("sshKey", sshKey.(string)) + } + if sshUser, ok := d.GetOk("ssh_user"); ok { + urlValues.Add("sshUser", sshUser.(string)) + } + + serviceId, err := controller.decortAPICall("POST", bserviceCreateAPI, urlValues) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(serviceId) + d.Set("service_id", serviceId) + + err = resourceBasicServiceRead(d, m) + if err != nil { + return err + } + + d.SetId(id.String()) + + return nil +} + +func resourceBasicServiceRead(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceRead") + + bs, err := utilityBasicServiceCheckPresence(d, m) + if bs == nil { + d.SetId("") + return err + } + + d.Set("account_id", bs.AccountId) + d.Set("account_name", bs.AccountName) + d.Set("base_domain", bs.BaseDomain) + d.Set("computes", flattenBasicServiceComputes(bs.Computes)) + d.Set("cpu_total", bs.CPUTotal) + d.Set("created_by", bs.CreatedBy) + d.Set("created_time", bs.CreatedTime) + d.Set("deleted_by", bs.DeletedBy) + d.Set("deleted_time", bs.DeletedTime) + d.Set("disk_total", bs.DiskTotal) + d.Set("gid", bs.GID) + d.Set("groups", bs.Groups) + d.Set("groups_name", bs.GroupsName) + d.Set("guid", bs.GUID) + d.Set("milestones", bs.Milestones) + d.Set("service_name", bs.Name) + d.Set("service_id", bs.ID) + d.Set("parent_srv_id", bs.ParentSrvId) + d.Set("parent_srv_type", bs.ParentSrvType) + d.Set("ram_total", bs.RamTotal) + d.Set("rg_id", bs.RGID) + d.Set("rg_name", bs.RGName) + d.Set("snapshots", flattenBasicServiceSnapshots(bs.Snapshots)) + d.Set("ssh_key", bs.SSHKey) + d.Set("ssh_user", bs.SSHUser) + d.Set("status", bs.Status) + d.Set("tech_status", bs.TechStatus) + d.Set("updated_by", bs.UpdatedBy) + d.Set("updated_time", bs.UpdatedTime) + d.Set("user_managed", bs.UserManaged) + + return nil +} + +func resourceBasicServiceDelete(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceDelete") + + bs, err := utilityBasicServiceCheckPresence(d, m) + if bs == nil { + if err != nil { + return err + } + return nil + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("permanently", strconv.FormatBool(d.Get("permanently").(bool))) + + _, err = controller.decortAPICall("POST", bserviceDeleteAPI, urlValues) + if err != nil { + return err + } + d.SetId("") + + return nil +} + +func resourceBasicServiceExists(d *schema.ResourceData, m interface{}) (bool, error) { + log.Debugf("resourceBasicServiceExists") + + bservice, err := utilityBasicServiceCheckPresence(d, m) + if bservice == nil { + if err != nil { + return false, err + } + return false, nil + } + + return true, nil +} + +func resourceBasicServiceEdit(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceEdit") + c := m.(*ControllerCfg) + + urlValues := &url.Values{} + if d.HasChange("enable") { + api := bserviceDisableAPI + enable := d.Get("enable").(bool) + if enable { + api = bserviceEnableAPI + } + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + + _, err := c.decortAPICall("POST", api, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("restore") { + restore := d.Get("restore").(bool) + if restore { + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + _, err := c.decortAPICall("POST", bserviceRestoreAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if d.HasChange("start") { + api := bserviceStopAPI + start := d.Get("start").(bool) + if start { + api = bserviceStartAPI + } + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + + _, err := c.decortAPICall("POST", api, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("snapshots") { + deletedSnapshots := make([]interface{}, 0) + addedSnapshots := make([]interface{}, 0) + updatedSnapshots := make([]interface{}, 0) + + old, new := d.GetChange("snapshots") + oldConv := old.([]interface{}) + newConv := new.([]interface{}) + for _, el := range oldConv { + if !isContainsSnapshot(newConv, el) { + deletedSnapshots = append(deletedSnapshots, el) + } + } + for _, el := range newConv { + if !isContainsSnapshot(oldConv, el) { + addedSnapshots = append(addedSnapshots, el) + } else { + if isRollback(oldConv, el) { + updatedSnapshots = append(updatedSnapshots, el) + } + } + } + + if len(deletedSnapshots) > 0 { + for _, snapshot := range deletedSnapshots { + snapshotConv := snapshot.(map[string]interface{}) + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("label", snapshotConv["label"].(string)) + _, err := c.decortAPICall("POST", bserviceSnapshotDeleteAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if len(addedSnapshots) > 0 { + for _, snapshot := range addedSnapshots { + snapshotConv := snapshot.(map[string]interface{}) + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("label", snapshotConv["label"].(string)) + _, err := c.decortAPICall("POST", bserviceSnapshotCreateAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if len(updatedSnapshots) > 0 { + for _, snapshot := range updatedSnapshots { + snapshotConv := snapshot.(map[string]interface{}) + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("label", snapshotConv["label"].(string)) + _, err := c.decortAPICall("POST", bserviceSnapshotRollbackAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + } + + return nil +} + +func isContainsSnapshot(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(map[string]interface{}) + elConv := el.(map[string]interface{}) + if elOldConv["guid"].(string) == elConv["guid"].(string) { + return true + } + } + return false +} + +func isRollback(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(map[string]interface{}) + elConv := el.(map[string]interface{}) + if elOldConv["guid"].(string) == elConv["guid"].(string) && + elOldConv["rollback"].(bool) != elConv["rollback"].(bool) && + elConv["rollback"].(bool) { + return true + } + } + return false +} + +func resourceBasicServiceSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "service_name": { + Type: schema.TypeString, + Required: true, + Description: "Name of the service", + }, + "rg_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the Resource Group where this service will be placed", + }, + "ssh_key": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "SSH key to deploy for the specified user. Same key will be deployed to all computes of the service.", + }, + "ssh_user": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "name of the user to deploy SSH key for. Pass empty string if no SSH key deployment is required", + }, + "permanently": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately", + }, + "enable": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately", + }, + "restore": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Restores BasicService instance", + }, + "start": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Start service. Starting a service technically means starting computes from all service groups according to group relations", + }, + "service_id": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "base_domain": { + Type: schema.TypeString, + Computed: true, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "compgroup_id": { + Type: schema.TypeInt, + Computed: true, + }, + "compgroup_name": { + Type: schema.TypeString, + Computed: true, + }, + "compgroup_role": { + Type: schema.TypeString, + Computed: true, + }, + "id": { + Type: schema.TypeInt, + Computed: true, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + + "cpu_total": { + Type: schema.TypeInt, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "disk_total": { + Type: schema.TypeString, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "groups": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "groups_name": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "parent_srv_id": { + Type: schema.TypeInt, + Computed: true, + }, + "parent_srv_type": { + Type: schema.TypeString, + Computed: true, + }, + "ram_total": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "snapshots": { + Type: schema.TypeList, + Computed: true, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "guid": { + Type: schema.TypeString, + Computed: true, + }, + "label": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "rollback": { + Type: schema.TypeBool, + Optional: true, + Default: false, + }, + "timestamp": { + Type: schema.TypeInt, + Computed: true, + }, + "valid": { + Type: schema.TypeBool, + Computed: true, + }, + }, + }, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + "user_managed": { + Type: schema.TypeBool, + Computed: true, + }, + } +} + +func resourceBasicService() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Create: resourceBasicServiceCreate, + Read: resourceBasicServiceRead, + Update: resourceBasicServiceEdit, + Delete: resourceBasicServiceDelete, + Exists: resourceBasicServiceExists, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &Timeout60s, + Read: &Timeout30s, + Update: &Timeout60s, + Delete: &Timeout60s, + Default: &Timeout60s, + }, + + Schema: resourceBasicServiceSchemaMake(), + } +} diff --git a/decort/resource_bservice_group.go b/decort/resource_bservice_group.go new file mode 100644 index 0000000..6bbff5a --- /dev/null +++ b/decort/resource_bservice_group.go @@ -0,0 +1,661 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "errors" + "net/url" + "strconv" + "strings" + + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + log "github.com/sirupsen/logrus" +) + +func resourceBasicServiceGroupCreate(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceGroupCreate") + + if compgroupId, ok := d.GetOk("compgroup_id"); ok { + if _, ok := d.GetOk("service_id"); ok { + if exists, err := resourceBasicServiceGroupExists(d, m); exists { + if err != nil { + return err + } + id := uuid.New() + d.SetId(strconv.Itoa(compgroupId.(int))) + d.Set("compgroup_id", strconv.Itoa(compgroupId.(int))) + err = resourceBasicServiceGroupRead(d, m) + if err != nil { + return err + } + d.SetId(id.String()) + return nil + } + return errors.New("provided compgroup id does not exist") + } + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("name", d.Get("compgroup_name").(string)) + + urlValues.Add("count", strconv.Itoa(d.Get("comp_count").(int))) + urlValues.Add("cpu", strconv.Itoa(d.Get("cpu").(int))) + urlValues.Add("ram", strconv.Itoa(d.Get("ram").(int))) + urlValues.Add("disk", strconv.Itoa(d.Get("disk").(int))) + urlValues.Add("imageId", strconv.Itoa(d.Get("image_id").(int))) + urlValues.Add("driver", strings.ToUpper(d.Get("driver").(string))) + + if role, ok := d.GetOk("role"); ok { + urlValues.Add("role", role.(string)) + } + + if timeoutStart, ok := d.GetOk("timeout_start"); ok { + urlValues.Add("timeoutStart", strconv.Itoa(timeoutStart.(int))) + } + + if vinses, ok := d.GetOk("vinses"); ok { + vs := vinses.([]interface{}) + temp := "" + l := len(vs) + for i, v := range vs { + s := strconv.Itoa(v.(int)) + if i != (l - 1) { + s += "," + } + temp = temp + s + } + temp = "[" + temp + "]" + urlValues.Add("vinses", temp) + } + if extnets, ok := d.GetOk("extnets"); ok { + es := extnets.([]interface{}) + temp := "" + l := len(es) + for i, e := range es { + s := strconv.Itoa(e.(int)) + if i != (l - 1) { + s += "," + } + temp = temp + s + } + temp = "[" + temp + "]" + urlValues.Add("extnets", temp) + } + + compgroupId, err := controller.decortAPICall("POST", bserviceGroupAddAPI, urlValues) + if err != nil { + return err + } + + id := uuid.New() + d.SetId(compgroupId) + d.Set("compgroup_id", compgroupId) + + err = resourceBasicServiceGroupRead(d, m) + if err != nil { + return err + } + + d.SetId(id.String()) + + return nil +} + +func resourceBasicServiceGroupRead(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceGroupRead") + + bsg, err := utilityBasicServiceGroupCheckPresence(d, m) + if bsg == nil { + d.SetId("") + return err + } + + d.Set("account_id", bsg.AccountId) + d.Set("account_name", bsg.AccountName) + d.Set("computes", flattenBSGroupComputes(bsg.Computes)) + d.Set("consistency", bsg.Consistency) + d.Set("cpu", bsg.CPU) + d.Set("created_by", bsg.CreatedBy) + d.Set("created_time", bsg.CreatedTime) + d.Set("deleted_by", bsg.DeletedBy) + d.Set("deleted_time", bsg.DeletedTime) + d.Set("disk", bsg.Disk) + d.Set("driver", bsg.Driver) + d.Set("extnets", bsg.Extnets) + d.Set("gid", bsg.GID) + d.Set("guid", bsg.GUID) + d.Set("image_id", bsg.ImageId) + d.Set("milestones", bsg.Milestones) + d.Set("compgroup_name", bsg.Name) + d.Set("compgroup_id", bsg.ID) + d.Set("parents", bsg.Parents) + d.Set("ram", bsg.RAM) + d.Set("rg_id", bsg.RGID) + d.Set("rg_name", bsg.RGName) + d.Set("role", bsg.Role) + d.Set("sep_id", bsg.SepId) + d.Set("seq_no", bsg.SeqNo) + d.Set("status", bsg.Status) + d.Set("tech_status", bsg.TechStatus) + d.Set("timeout_start", bsg.TimeoutStart) + d.Set("updated_by", bsg.UpdatedBy) + d.Set("updated_time", bsg.UpdatedTime) + d.Set("vinses", bsg.Vinses) + + return nil +} + +func resourceBasicServiceGroupDelete(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceGroupDelete") + + bsg, err := utilityBasicServiceGroupCheckPresence(d, m) + if bsg == nil { + if err != nil { + return err + } + return nil + } + + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + + _, err = controller.decortAPICall("POST", bserviceGroupRemoveAPI, urlValues) + if err != nil { + return err + } + d.SetId("") + + return nil +} + +func resourceBasicServiceGroupExists(d *schema.ResourceData, m interface{}) (bool, error) { + log.Debugf("resourceBasicServiceGroupExists") + + bserviceGroup, err := utilityBasicServiceGroupCheckPresence(d, m) + if bserviceGroup == nil { + if err != nil { + return false, err + } + return false, nil + } + + return true, nil +} + +func resourceBasicServiceGroupEdit(d *schema.ResourceData, m interface{}) error { + log.Debugf("resourceBasicServiceGroupEdit") + c := m.(*ControllerCfg) + + urlValues := &url.Values{} + + if d.HasChange("comp_count") { + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("count", strconv.Itoa(d.Get("comp_count").(int))) + urlValues.Add("mode", strings.ToUpper(d.Get("mode").(string))) + _, err := c.decortAPICall("POST", bserviceGroupResizeAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("start") { + api := bserviceGroupStopAPI + start := d.Get("start").(bool) + if start { + api = bserviceGroupStartAPI + } else { + urlValues.Add("force", strconv.FormatBool(d.Get("force_stop").(bool))) + } + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + + _, err := c.decortAPICall("POST", api, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChanges("compgroup_name", "ram", "cpu", "disk", "role") { + urlValues.Add("name", d.Get("compgroup_name").(string)) + urlValues.Add("cpu", strconv.Itoa(d.Get("cpu").(int))) + urlValues.Add("ram", strconv.Itoa(d.Get("ram").(int))) + urlValues.Add("disk", strconv.Itoa(d.Get("disk").(int))) + urlValues.Add("role", d.Get("role").(string)) + urlValues.Add("force", strconv.FormatBool(d.Get("force_update").(bool))) + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + + _, err := c.decortAPICall("POST", bserviceGroupUpdateAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("extnets") { + extnets := d.Get("extnets").([]interface{}) + temp := "" + l := len(extnets) + for i, e := range extnets { + s := strconv.Itoa(e.(int)) + if i != (l - 1) { + s += ",\n" + } else { + s += "\n" + } + temp = temp + s + } + temp = "[" + temp + "]" + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("extnets", temp) + _, err := c.decortAPICall("POST", bserviceGroupUpdateExtnetAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("vinses") { + vinses := d.Get("vinses").([]interface{}) + temp := "" + l := len(vinses) + for i, v := range vinses { + s := strconv.Itoa(v.(int)) + if i != (l - 1) { + s += ",\n" + } else { + s += "\n" + } + temp = temp + s + } + temp = "[" + temp + "]" + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("vinses", temp) + _, err := c.decortAPICall("POST", bserviceGroupUpdateVinsAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + + if d.HasChange("parents") { + deletedParents := make([]interface{}, 0) + addedParents := make([]interface{}, 0) + + old, new := d.GetChange("parents") + oldConv := old.([]interface{}) + newConv := new.([]interface{}) + for _, el := range oldConv { + if !isContainsParent(newConv, el) { + deletedParents = append(deletedParents, el) + } + } + for _, el := range newConv { + if !isContainsParent(oldConv, el) { + addedParents = append(addedParents, el) + } + } + + if len(deletedParents) > 0 { + for _, parent := range deletedParents { + parentConv := parent.(int) + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("parentId", strconv.Itoa(parentConv)) + + _, err := c.decortAPICall("POST", bserviceGroupParentRemoveAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + + if len(addedParents) > 0 { + for _, parent := range addedParents { + parentConv := parent.(int) + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("parentId", strconv.Itoa(parentConv)) + _, err := c.decortAPICall("POST", bserviceGroupParentAddAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + } + + if d.HasChange("remove_computes") { + rcs := d.Get("remove_computes").([]interface{}) + if len(rcs) > 0 { + for _, rc := range rcs { + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + urlValues.Add("computeId", strconv.Itoa(rc.(int))) + + _, err := c.decortAPICall("POST", bserviceGroupComputeRemoveAPI, urlValues) + if err != nil { + return err + } + + urlValues = &url.Values{} + } + } + } + + return nil +} + +func isContainsParent(els []interface{}, el interface{}) bool { + for _, elOld := range els { + elOldConv := elOld.(int) + elConv := el.(int) + if elOldConv == elConv { + return true + } + } + return false +} + +func resourceBasicServiceGroupSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "service_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the Basic Service to add a group to", + }, + "compgroup_name": { + Type: schema.TypeString, + Required: true, + Description: "name of the Compute Group to add", + }, + "comp_count": { + Type: schema.TypeInt, + Required: true, + Description: "computes number. Defines how many computes must be there in the group", + }, + "cpu": { + Type: schema.TypeInt, + Required: true, + Description: "compute CPU number. All computes in the group have the same CPU count", + }, + "ram": { + Type: schema.TypeInt, + Required: true, + Description: "compute RAM volume in MB. All computes in the group have the same RAM volume", + }, + "disk": { + Type: schema.TypeInt, + Required: true, + Description: "compute boot disk size in GB", + }, + "image_id": { + Type: schema.TypeInt, + Required: true, + Description: "OS image ID to create computes from", + }, + "driver": { + Type: schema.TypeString, + Required: true, + Description: "compute driver like a KVM_X86, KVM_PPC, etc.", + }, + "role": { + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "group role tag. Can be empty string, does not have to be unique", + }, + "timeout_start": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + Description: "time of Compute Group readiness", + }, + "extnets": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "list of external networks to connect computes to", + }, + "vinses": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "list of ViNSes to connect computes to", + }, + "mode": { + Type: schema.TypeString, + Optional: true, + Default: "RELATIVE", + ValidateFunc: validation.StringInSlice([]string{"RELATIVE", "ABSOLUTE"}, false), + Description: "(RELATIVE;ABSOLUTE) either delta or absolute value of computes", + }, + "start": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "Start the specified Compute Group within BasicService", + }, + "force_stop": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "force stop Compute Group", + }, + "force_update": { + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: "force resize Compute Group", + }, + "parents": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "remove_computes": { + Type: schema.TypeList, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + }, + "compgroup_id": { + Type: schema.TypeInt, + Optional: true, + Computed: true, + }, + "account_id": { + Type: schema.TypeInt, + Computed: true, + }, + "account_name": { + Type: schema.TypeString, + Computed: true, + }, + "computes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "id": { + Type: schema.TypeInt, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "os_users": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "login": { + Type: schema.TypeString, + Computed: true, + }, + "password": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "consistency": { + Type: schema.TypeBool, + Computed: true, + }, + "created_by": { + Type: schema.TypeString, + Computed: true, + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + }, + "deleted_by": { + Type: schema.TypeString, + Computed: true, + }, + "deleted_time": { + Type: schema.TypeInt, + Computed: true, + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + }, + "guid": { + Type: schema.TypeInt, + Computed: true, + }, + "milestones": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + }, + "rg_name": { + Type: schema.TypeString, + Computed: true, + }, + "sep_id": { + Type: schema.TypeInt, + Computed: true, + }, + "seq_no": { + Type: schema.TypeInt, + Computed: true, + }, + "status": { + Type: schema.TypeString, + Computed: true, + }, + "tech_status": { + Type: schema.TypeString, + Computed: true, + }, + "updated_by": { + Type: schema.TypeString, + Computed: true, + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + +func resourceBasicServiceGroup() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + Create: resourceBasicServiceGroupCreate, + Read: resourceBasicServiceGroupRead, + Update: resourceBasicServiceGroupEdit, + Delete: resourceBasicServiceGroupDelete, + Exists: resourceBasicServiceGroupExists, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: &Timeout60s, + Read: &Timeout30s, + Update: &Timeout60s, + Delete: &Timeout60s, + Default: &Timeout60s, + }, + + Schema: resourceBasicServiceGroupSchemaMake(), + } +} diff --git a/decort/resource_cdrom_image.go b/decort/resource_cdrom_image.go index 9711bf4..df93a21 100644 --- a/decort/resource_cdrom_image.go +++ b/decort/resource_cdrom_image.go @@ -385,16 +385,10 @@ func resourceCDROMImage() *schema.Resource { CustomizeDiff: customdiff.All( customdiff.IfValueChange("enabled", func(old, new, meta interface{}) bool { - if old.(bool) != new.(bool) { - return true - } - return false + return old.(bool) != new.(bool) }, resourceImageChangeEnabled), customdiff.IfValueChange("name", func(old, new, meta interface{}) bool { - if old.(string) != new.(string) && old.(string) != "" { - return true - } - return false + return old.(string) != new.(string) && old.(string) != "" }, resourceImageEditName), customdiff.IfValueChange("shared_with", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -411,16 +405,10 @@ func resourceCDROMImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageShare), customdiff.IfValueChange("computeci_id", func(old, new, meta interface{}) bool { - if old.(int) != new.(int) { - return true - } - return false + return old.(int) != new.(int) }, resourceImageChangeComputeci), customdiff.IfValueChange("enabled_stacks", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -437,10 +425,7 @@ func resourceCDROMImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageUpdateNodes), ), diff --git a/decort/resource_compute.go b/decort/resource_compute.go index 0631108..ea43785 100644 --- a/decort/resource_compute.go +++ b/decort/resource_compute.go @@ -132,7 +132,7 @@ func resourceComputeCreate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", argVal.(*schema.Set).Len()) err = controller.utilityComputeExtraDisksConfigure(d, false) // do_delta=false, as we are working on a new compute if err != nil { - log.Errorf("resourceComputeCreate: error when attaching extra disk(s) to a new Compute ID %s: %s", compId, err) + log.Errorf("resourceComputeCreate: error when attaching extra disk(s) to a new Compute ID %d: %v", compId, err) extraDisksOk = false } } @@ -167,8 +167,7 @@ func resourceComputeCreate(d *schema.ResourceData, m interface{}) error { reqValues := &url.Values{} reqValues.Add("computeId", fmt.Sprintf("%d", compId)) log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", compId) - apiResp, err = controller.decortAPICall("POST", ComputeStartAPI, reqValues) - if err != nil { + if _, err := controller.decortAPICall("POST", ComputeStartAPI, reqValues); err != nil { return err } } @@ -246,6 +245,7 @@ func resourceComputeUpdate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceComputeUpdate: changing CPU %d -> %d and/or RAM %d -> %d", oldCpu.(int), newCpu.(int), oldRam.(int), newRam.(int)) + params.Add("force", "true") _, err := controller.decortAPICall("POST", ComputeResizeAPI, params) if err != nil { return err @@ -262,13 +262,13 @@ func resourceComputeUpdate(d *schema.ResourceData, m interface{}) error { bdsParams.Add("size", fmt.Sprintf("%d", newSize.(int))) log.Debugf("resourceComputeUpdate: compute ID %s, boot disk ID %d resize %d -> %d", d.Id(), d.Get("boot_disk_id").(int), oldSize.(int), newSize.(int)) - _, err := controller.decortAPICall("POST", DisksResizeAPI, params) + _, err := controller.decortAPICall("POST", DisksResizeAPI, bdsParams) if err != nil { return err } d.SetPartial("boot_disk_size") } else if oldSize.(int) > newSize.(int) { - log.Warnf("resourceComputeUpdate: compute ID %d - shrinking boot disk is not allowed", d.Id()) + log.Warnf("resourceComputeUpdate: compute ID %s - shrinking boot disk is not allowed", d.Id()) } // 3. Calculate and apply changes to data disks @@ -319,6 +319,9 @@ func resourceComputeDelete(d *schema.ResourceData, m interface{}) error { compFacts, err := utilityComputeCheckPresence(d, m) if compFacts == "" { + if err != nil { + return err + } // the target Compute does not exist - in this case according to Terraform best practice // we exit from Destroy method without error return nil @@ -539,39 +542,6 @@ func resourceCompute() *schema.Resource { Default: true, Description: "Is compute started.", }, - - /* - "disks": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource{ - Schema: dataSourceDiskSchemaMake(), // ID, type, name, size, account ID, SEP ID, SEP type, pool, status, tech status, compute ID, image ID - }, - Description: "Detailed specification for all disks attached to this compute instance (including bood disk).", - }, - - "interfaces": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource{ - Schema: interfaceSubresourceSchemaMake(), - }, - Description: "Specification for the virtual NICs configured on this compute instance.", - }, - - - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Current model status of this compute instance.", - }, - - "tech_status": { - Type: schema.TypeString, - Computed: true, - Description: "Current technical status of this compute instance.", - }, - */ }, } } diff --git a/decort/resource_disk.go b/decort/resource_disk.go index a19bf08..efee695 100644 --- a/decort/resource_disk.go +++ b/decort/resource_disk.go @@ -47,13 +47,19 @@ func resourceDiskCreate(d *schema.ResourceData, m interface{}) error { urlValues.Add("name", d.Get("name").(string)) urlValues.Add("size", fmt.Sprintf("%d", d.Get("size").(int))) urlValues.Add("type", "D") // NOTE: only disks of Data type are managed via plugin - urlValues.Add("sep_id", fmt.Sprintf("%d", d.Get("sep_id").(int))) - urlValues.Add("pool", d.Get("pool").(string)) - + + if sepId, ok := d.GetOk("sep_id"); ok { + urlValues.Add("sep_id", strconv.Itoa(sepId.(int))) + } + + if poolName, ok := d.GetOk("pool"); ok { + urlValues.Add("pool", poolName.(string)) + } + argVal, argSet := d.GetOk("description") if argSet { urlValues.Add("description", argVal.(string)) - } + } apiResp, err := controller.decortAPICall("POST", DisksCreateAPI, urlValues) if err != nil { @@ -65,9 +71,9 @@ func resourceDiskCreate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceDiskCreate: new Disk ID / name %d / %s creation sequence complete", diskId, d.Get("name").(string)) - // We may reuse dataSourceDiskRead here as we maintain similarity + // We may reuse dataSourceDiskRead here as we maintain similarity // between Disk resource and Disk data source schemas - // Disk resource read function will also update resource ID on success, so that Terraform + // Disk resource read function will also update resource ID on success, so that Terraform // will know the resource exists (however, we already did it a few lines before) return dataSourceDiskRead(d, m) } @@ -100,8 +106,8 @@ func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error { oldSize, newSize := d.GetChange("size") if oldSize.(int) < newSize.(int) { - log.Debugf("resourceDiskUpdate: resizing disk ID %s - %d GB -> %d GB", - d.Id(), oldSize.(int), newSize.(int)) + log.Debugf("resourceDiskUpdate: resizing disk ID %s - %d GB -> %d GB", + d.Id(), oldSize.(int), newSize.(int)) sizeParams := &url.Values{} sizeParams.Add("diskId", d.Id()) sizeParams.Add("size", fmt.Sprintf("%d", newSize.(int))) @@ -116,8 +122,8 @@ func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error { oldName, newName := d.GetChange("name") if oldName.(string) != newName.(string) { - log.Debugf("resourceDiskUpdate: renaming disk ID %d - %s -> %s", - d.Get("disk_id").(int), oldName.(string), newName.(string)) + log.Debugf("resourceDiskUpdate: renaming disk ID %d - %s -> %s", + d.Get("disk_id").(int), oldName.(string), newName.(string)) renameParams := &url.Values{} renameParams.Add("diskId", d.Id()) renameParams.Add("name", newName.(string)) @@ -129,24 +135,24 @@ func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error { } /* - NOTE: plugin will manage disks of type "Data" only, and type cannot be changed once disk is created + NOTE: plugin will manage disks of type "Data" only, and type cannot be changed once disk is created - oldType, newType := d.GetChange("type") - if oldType.(string) != newType.(string) { - return fmt.Errorf("resourceDiskUpdate: Disk ID %s - changing type of existing disk not allowed", d.Id()) - } + oldType, newType := d.GetChange("type") + if oldType.(string) != newType.(string) { + return fmt.Errorf("resourceDiskUpdate: Disk ID %s - changing type of existing disk not allowed", d.Id()) + } */ d.Partial(false) - // we may reuse dataSourceDiskRead here as we maintain similarity + // we may reuse dataSourceDiskRead here as we maintain similarity // between Compute resource and Compute data source schemas - return dataSourceDiskRead(d, m) + return dataSourceDiskRead(d, m) } func resourceDiskDelete(d *schema.ResourceData, m interface{}) error { - // NOTE: this function tries to detach and destroy target Disk "permanently", so - // there is no way to restore it. + // NOTE: this function tries to detach and destroy target Disk "permanently", so + // there is no way to restore it. // If, however, the disk is attached to a compute, the method will // fail (by failing the underpinning DECORt API call, which is issued with detach=false) log.Debugf("resourceDiskDelete: called for Disk ID / name %d / %s, Account ID %d", @@ -154,6 +160,9 @@ func resourceDiskDelete(d *schema.ResourceData, m interface{}) error { diskFacts, err := utilityDiskCheckPresence(d, m) if diskFacts == "" { + if err != nil { + return err + } // the specified Disk does not exist - in this case according to Terraform best practice // we exit from Destroy method without error return nil @@ -166,8 +175,8 @@ func resourceDiskDelete(d *schema.ResourceData, m interface{}) error { // However, this may change in the future, as TF state management logic may want // to delete disk resource BEFORE it is detached from compute instance, and, while // perfectly OK from data preservation viewpoint, this is breaking expected TF workflow - // in the eyes of an experienced TF user - params.Add("detach", "0") + // in the eyes of an experienced TF user + params.Add("detach", "0") params.Add("permanently", "1") controller := m.(*ControllerCfg) @@ -198,7 +207,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { rets := map[string]*schema.Schema{ "name": { Type: schema.TypeString, - Optional: true, + Required: true, Description: "Name of this disk. NOTE: disk names are NOT unique within an account. If disk ID is specified, disk name is ignored.", }, @@ -210,34 +219,34 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { "account_id": { Type: schema.TypeInt, - Optional: true, + Required: true, Description: "ID of the account this disk belongs to.", }, "sep_id": { Type: schema.TypeInt, - Required: true, + Optional: true, + Computed: true, ForceNew: true, - ValidateFunc: validation.IntAtLeast(1), Description: "Storage end-point provider serving this disk. Cannot be changed for existing disk.", }, "pool": { Type: schema.TypeString, - Required: true, + Optional: true, + Computed: true, ForceNew: true, - ValidateFunc: validation.StringIsNotEmpty, Description: "Pool where this disk is located. Cannot be changed for existing disk.", }, "size": { - Type: schema.TypeInt, - Required: true, + Type: schema.TypeInt, + Required: true, ValidateFunc: validation.IntAtLeast(1), - Description: "Size of the disk in GB. Note, that existing disks can only be grown in size.", + Description: "Size of the disk in GB. Note, that existing disks can only be grown in size.", }, - /* We moved "type" attribute to computed attributes section, as plugin manages disks of only + /* We moved "type" attribute to computed attributes section, as plugin manages disks of only one type - "D", e.g. data disks. "type": { Type: schema.TypeString, @@ -256,7 +265,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { Description: "Optional user-defined text description of this disk.", }, - // The rest of the attributes are all computed + // The rest of the attributes are all computed "account_name": { Type: schema.TypeString, Computed: true, @@ -282,14 +291,14 @@ func resourceDiskSchemaMake() map[string]*schema.Schema { }, /* - "snapshots": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Resource { - Schema: snapshotSubresourceSchemaMake(), + "snapshots": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource { + Schema: snapshotSubresourceSchemaMake(), + }, + Description: "List of user-created snapshots for this disk." }, - Description: "List of user-created snapshots for this disk." - }, */ } diff --git a/decort/resource_image.go b/decort/resource_image.go index 6e206c4..cd4b970 100644 --- a/decort/resource_image.go +++ b/decort/resource_image.go @@ -87,8 +87,7 @@ func resourceImageCreate(d *schema.ResourceData, m interface{}) error { } api := "" - isSync := d.Get("sync").(bool) - if !isSync { + if isSync := d.Get("sync").(bool); !isSync { api = imageCreateAPI } else { api = imageSyncCreateAPI @@ -640,16 +639,10 @@ func resourceImage() *schema.Resource { }, CustomizeDiff: customdiff.All( customdiff.IfValueChange("enabled", func(old, new, meta interface{}) bool { - if old.(bool) != new.(bool) { - return true - } - return false + return old.(bool) != new.(bool) }, resourceImageChangeEnabled), customdiff.IfValueChange("name", func(old, new, meta interface{}) bool { - if old.(string) != new.(string) && old.(string) != "" { - return true - } - return false + return old.(string) != new.(string) && old.(string) != "" }, resourceImageEditName), customdiff.IfValueChange("shared_with", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -667,16 +660,10 @@ func resourceImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageShare), customdiff.IfValueChange("computeci_id", func(old, new, meta interface{}) bool { - if old.(int) != new.(int) { - return true - } - return false + return old.(int) != new.(int) }, resourceImageChangeComputeci), customdiff.IfValueChange("enabled_stacks", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -693,10 +680,7 @@ func resourceImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageUpdateNodes), ), diff --git a/decort/resource_k8s.go b/decort/resource_k8s.go index 109fc49..e0f3cb0 100644 --- a/decort/resource_k8s.go +++ b/decort/resource_k8s.go @@ -223,15 +223,13 @@ func resourceK8sUpdate(d *schema.ResourceData, m interface{}) error { if newWorkers.Num > wg.Num { urlValues.Add("num", strconv.Itoa(newWorkers.Num-wg.Num)) - _, err := controller.decortAPICall("POST", K8sWorkerAddAPI, urlValues) - if err != nil { + if _, err := controller.decortAPICall("POST", K8sWorkerAddAPI, urlValues); err != nil { return err } } else { for i := wg.Num - 1; i >= newWorkers.Num; i-- { urlValues.Set("workerId", strconv.Itoa(wg.DetailedInfo[i].ID)) - _, err := controller.decortAPICall("POST", K8sWorkerDeleteAPI, urlValues) - if err != nil { + if _, err := controller.decortAPICall("POST", K8sWorkerDeleteAPI, urlValues); err != nil { return err } } diff --git a/decort/resource_k8s_wg.go b/decort/resource_k8s_wg.go index 4ce3a0d..d9f4054 100644 --- a/decort/resource_k8s_wg.go +++ b/decort/resource_k8s_wg.go @@ -108,16 +108,14 @@ func resourceK8sWgUpdate(d *schema.ResourceData, m interface{}) error { wg, err := utilityK8sWgCheckPresence(d, m) if err != nil { - return nil + return err } urlValues := &url.Values{} urlValues.Add("k8sId", strconv.Itoa(d.Get("k8s_id").(int))) urlValues.Add("workersGroupId", d.Id()) - newNum := d.Get("num").(int) - - if newNum > wg.Num { + if newNum := d.Get("num").(int); newNum > wg.Num { urlValues.Add("num", strconv.Itoa(newNum-wg.Num)) _, err := controller.decortAPICall("POST", K8sWorkerAddAPI, urlValues) if err != nil { diff --git a/decort/resource_pfw.go b/decort/resource_pfw.go index 3c2cb6e..314bc1a 100644 --- a/decort/resource_pfw.go +++ b/decort/resource_pfw.go @@ -145,6 +145,7 @@ func resourcePfwSchemaMake() map[string]*schema.Schema { "public_port_end": { Type: schema.TypeInt, Optional: true, + Computed: true, ForceNew: true, ValidateFunc: validation.IntBetween(1, 65535), Description: "End port number (inclusive) for the ranged rule.", diff --git a/decort/resource_rg.go b/decort/resource_rg.go index 4a07cb6..cf5a9bc 100644 --- a/decort/resource_rg.go +++ b/decort/resource_rg.go @@ -39,10 +39,6 @@ func resourceResgroupCreate(d *schema.ResourceData, m interface{}) error { // Valid account ID is required to create new resource group // obtain Account ID by account name - it should not be zero on success - validated_account_id, err := utilityGetAccountIdBySchema(d, m) - if err != nil { - return err - } rg_name, arg_set := d.GetOk("name") if !arg_set { @@ -62,7 +58,7 @@ func resourceResgroupCreate(d *schema.ResourceData, m interface{}) error { // all required parameters are set in the schema - we can continue with RG creation log.Debugf("resourceResgroupCreate: called for RG name %s, account ID %d", - rg_name.(string), validated_account_id) + rg_name.(string), d.Get("account_id").(int)) // quota settings are optional set_quota := false @@ -70,17 +66,17 @@ func resourceResgroupCreate(d *schema.ResourceData, m interface{}) error { arg_value, arg_set := d.GetOk("quota") if arg_set { log.Debugf("resourceResgroupCreate: setting Quota on RG requested") - quota_record, _ = makeQuotaRecord(arg_value.([]interface{})) + quota_record = makeQuotaRecord(arg_value.([]interface{})) set_quota = true } controller := m.(*ControllerCfg) log.Debugf("resourceResgroupCreate: called by user %q for RG name %s, account ID %d", controller.getDecortUsername(), - rg_name.(string), validated_account_id) + rg_name.(string), d.Get("account_id").(int)) url_values := &url.Values{} - url_values.Add("accountId", fmt.Sprintf("%d", validated_account_id)) + url_values.Add("accountId", fmt.Sprintf("%d", d.Get("account_id").(int))) url_values.Add("name", rg_name.(string)) url_values.Add("gid", fmt.Sprintf("%d", DefaultGridID)) // use default Grid ID, similar to disk resource mgmt convention url_values.Add("owner", controller.getDecortUsername()) @@ -142,7 +138,7 @@ func resourceResgroupCreate(d *schema.ResourceData, m interface{}) error { } func resourceResgroupRead(d *schema.ResourceData, m interface{}) error { - log.Debugf("resourceResgroupRead: called for RG name %s, account ID %s", + log.Debugf("resourceResgroupRead: called for RG name %s, account ID %d", d.Get("name").(string), d.Get("account_id").(int)) rg_facts, err := utilityResgroupCheckPresence(d, m) @@ -199,9 +195,9 @@ func resourceResgroupUpdate(d *schema.ResourceData, m interface{}) error { quota_value, quota_set := d.GetOk("quota") if quota_set { log.Debugf("resourceResgroupUpdate: quota specified - looking for deltas from the old quota.") - quotarecord_new, _ := makeQuotaRecord(quota_value.([]interface{})) + quotarecord_new := makeQuotaRecord(quota_value.([]interface{})) quota_value_old, _ := d.GetChange("quota") // returns old as 1st, new as 2nd return value - quotarecord_old, _ := makeQuotaRecord(quota_value_old.([]interface{})) + quotarecord_old := makeQuotaRecord(quota_value_old.([]interface{})) if quotarecord_new.Cpu != quotarecord_old.Cpu { do_general_update = true @@ -260,11 +256,14 @@ func resourceResgroupUpdate(d *schema.ResourceData, m interface{}) error { func resourceResgroupDelete(d *schema.ResourceData, m interface{}) error { // NOTE: this method forcibly destroys target resource group with flag "permanently", so there is no way to // restore the destroyed resource group as well all Computes & VINSes that existed in it - log.Debugf("resourceResgroupDelete: called for RG name %s, account ID %s", + log.Debugf("resourceResgroupDelete: called for RG name %s, account ID %d", d.Get("name").(string), d.Get("account_id").(int)) rg_facts, err := utilityResgroupCheckPresence(d, m) if rg_facts == "" { + if err != nil { + return err + } // the target RG does not exist - in this case according to Terraform best practice // we exit from Destroy method without error return nil diff --git a/decort/resource_sep.go b/decort/resource_sep.go index 059198d..d3608e3 100644 --- a/decort/resource_sep.go +++ b/decort/resource_sep.go @@ -243,8 +243,7 @@ func resourceSepEdit(d *schema.ResourceData, m interface{}) error { } urlValues = &url.Values{} - err := resourceSepRead(d, m) - if err != nil { + if err := resourceSepRead(d, m); err != nil { return err } @@ -282,8 +281,6 @@ func resourceSepUpdateNodes(d *schema.ResourceDiff, m interface{}) error { urlValues := &url.Values{} t1, t2 := d.GetChange("consumed_by") - d1 := t1.([]interface{}) - d2 := t2.([]interface{}) urlValues.Add("sep_id", strconv.Itoa(d.Get("sep_id").(int))) @@ -291,7 +288,7 @@ func resourceSepUpdateNodes(d *schema.ResourceDiff, m interface{}) error { temp := "" api := "" - if len(d1) > len(d2) { + if d1, d2 := t1.([]interface{}), t2.([]interface{}); len(d1) > len(d2) { for _, n := range d2 { if !findElInt(d1, n) { consumedIds = append(consumedIds, n) @@ -510,10 +507,7 @@ func resourceSep() *schema.Resource { CustomizeDiff: customdiff.All( customdiff.IfValueChange("enable", func(old, new, meta interface{}) bool { - if old.(bool) != new.(bool) { - return true - } - return false + return old.(bool) != new.(bool) }, resourceSepChangeEnabled), customdiff.IfValueChange("consumed_by", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -530,10 +524,7 @@ func resourceSep() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceSepUpdateNodes), customdiff.IfValueChange("provided_by", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -550,10 +541,7 @@ func resourceSep() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceSepUpdateProviders), ), } diff --git a/decort/resource_sep_config.go b/decort/resource_sep_config.go index 9663291..c16b0f0 100644 --- a/decort/resource_sep_config.go +++ b/decort/resource_sep_config.go @@ -55,9 +55,7 @@ func resourceSepConfigCreate(d *schema.ResourceData, m interface{}) error { return errors.New("provided sep id config does not exist") } - resourceSepConfigRead(d, m) - - return nil + return resourceSepConfigRead(d, m) } func resourceSepConfigRead(d *schema.ResourceData, m interface{}) error { diff --git a/decort/resource_snapshot.go b/decort/resource_snapshot.go index 75f2b29..7a75867 100644 --- a/decort/resource_snapshot.go +++ b/decort/resource_snapshot.go @@ -191,7 +191,7 @@ func resourceSnapshot() *schema.Resource { CustomizeDiff: customdiff.All( customdiff.IfValueChange("rollback", func(old, new, meta interface{}) bool { o := old.(bool) - if o != new.(bool) && o == false { + if o != new.(bool) && !o { return true } return false diff --git a/decort/resource_vins.go b/decort/resource_vins.go index caa9b58..cdfb5f6 100644 --- a/decort/resource_vins.go +++ b/decort/resource_vins.go @@ -40,7 +40,7 @@ import ( func ipcidrDiffSupperss(key, oldVal, newVal string, d *schema.ResourceData) bool { if oldVal == "" && newVal != "" { // if old value for "ipcidr" resource is empty string, it means that we are creating new ViNS - // and there is a chance that the user will want specific IP address range for this ViNS - + // and there is a chance that the user will want specific IP address range for this ViNS - // check if "ipcidr" is explicitly set in TF file to a non-empty string. log.Debugf("ipcidrDiffSupperss: key=%s, oldVal=%q, newVal=%q -> suppress=FALSE", key, oldVal, newVal) return false // there is a difference between stored and new value @@ -51,7 +51,7 @@ func ipcidrDiffSupperss(key, oldVal, newVal string, d *schema.ResourceData) bool func resourceVinsCreate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceVinsCreate: called for ViNS name %s, Account ID %d, RG ID %d", - d.Get("name").(string), d.Get("account_id").(int), d.Get("rg_id").(int)) + d.Get("name").(string), d.Get("account_id").(int), d.Get("rg_id").(int)) apiToCall := VinsCreateInAccountAPI @@ -65,7 +65,7 @@ func resourceVinsCreate(d *schema.ResourceData, m interface{}) error { apiToCall = VinsCreateInRgAPI urlValues.Add("rgId", fmt.Sprintf("%d", argVal.(int))) } else { - // RG ID either not set at all or set to 0 - user may want ViNS at account level + // RG ID either not set at all or set to 0 - user may want ViNS at account level argVal, argSet = d.GetOk("account_id") if !argSet || argVal.(int) <= 0 { // No valid Account ID (and no RG ID either) - cannot create ViNS @@ -79,14 +79,14 @@ func resourceVinsCreate(d *schema.ResourceData, m interface{}) error { if argVal.(int) > 0 { // connect to specific external network urlValues.Add("extNetId", fmt.Sprintf("%d", argVal.(int))) - /* - Commented out, as we've made "ext_net_ip" parameter non-configurable via Terraform! - - // in case of specific ext net connection user may also want a particular IP address - argVal, argSet = d.GetOk("ext_net_ip") - if argSet && argVal.(string) != "" { - urlValues.Add("extIp", argVal.(string)) - } + /* + Commented out, as we've made "ext_net_ip" parameter non-configurable via Terraform! + + // in case of specific ext net connection user may also want a particular IP address + argVal, argSet = d.GetOk("ext_net_ip") + if argSet && argVal.(string) != "" { + urlValues.Add("extIp", argVal.(string)) + } */ } else { // ext_net_id is set to a negative value - connect to default external network @@ -100,7 +100,7 @@ func resourceVinsCreate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceVinsCreate: ipcidr is set to %s", argVal.(string)) urlValues.Add("ipcidr", argVal.(string)) } - + argVal, argSet = d.GetOk("description") if argSet { urlValues.Add("desc", argVal.(string)) @@ -116,9 +116,9 @@ func resourceVinsCreate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceVinsCreate: new ViNS ID / name %d / %s creation sequence complete", vinsId, d.Get("name").(string)) - // We may reuse dataSourceVinsRead here as we maintain similarity + // We may reuse dataSourceVinsRead here as we maintain similarity // between ViNS resource and ViNS data source schemas - // ViNS resource read function will also update resource ID on success, so that Terraform + // ViNS resource read function will also update resource ID on success, so that Terraform // will know the resource exists (however, we already did it a few lines before) return dataSourceVinsRead(d, m) } @@ -138,12 +138,12 @@ func resourceVinsRead(d *schema.ResourceData, m interface{}) error { func resourceVinsUpdate(d *schema.ResourceData, m interface{}) error { log.Debugf("resourceVinsUpdate: called for ViNS ID / name %s / %s, Account ID %d, RG ID %d", - d.Id(), d.Get("name").(string), d.Get("account_id").(int), d.Get("rg_id").(int)) + d.Id(), d.Get("name").(string), d.Get("account_id").(int), d.Get("rg_id").(int)) controller := m.(*ControllerCfg) d.Partial(true) - + // 1. Handle external network connection change oldExtNetId, newExtNedId := d.GetChange("ext_net_id") if oldExtNetId.(int) != newExtNedId.(int) { @@ -168,15 +168,15 @@ func resourceVinsUpdate(d *schema.ResourceData, m interface{}) error { return err } } - + d.SetPartial("ext_net_id") } d.Partial(false) - // we may reuse dataSourceVinsRead here as we maintain similarity + // we may reuse dataSourceVinsRead here as we maintain similarity // between Compute resource and Compute data source schemas - return dataSourceVinsRead(d, m) + return dataSourceVinsRead(d, m) } func resourceVinsDelete(d *schema.ResourceData, m interface{}) error { @@ -185,6 +185,9 @@ func resourceVinsDelete(d *schema.ResourceData, m interface{}) error { vinsFacts, err := utilityVinsCheckPresence(d, m) if vinsFacts == "" { + if err != nil { + return err + } // the specified ViNS does not exist - in this case according to Terraform best practice // we exit from Destroy method without error return nil @@ -192,8 +195,8 @@ func resourceVinsDelete(d *schema.ResourceData, m interface{}) error { params := &url.Values{} params.Add("vinsId", d.Id()) - params.Add("force", "1") // disconnect all computes before deleting ViNS - params.Add("permanently", "1") // delete ViNS immediately bypassing recycle bin + params.Add("force", "1") // disconnect all computes before deleting ViNS + params.Add("permanently", "1") // delete ViNS immediately bypassing recycle bin controller := m.(*ControllerCfg) _, err = controller.decortAPICall("POST", VinsDeleteAPI, params) @@ -222,10 +225,10 @@ func resourceVinsExists(d *schema.ResourceData, m interface{}) (bool, error) { func resourceVinsSchemaMake() map[string]*schema.Schema { rets := map[string]*schema.Schema{ "name": { - Type: schema.TypeString, - Required: true, + Type: schema.TypeString, + Required: true, ValidateFunc: validation.StringIsNotEmpty, - Description: "Name of the ViNS. Names are case sensitive and unique within the context of an account or resource group.", + Description: "Name of the ViNS. Names are case sensitive and unique within the context of an account or resource group.", }, /* we do not need ViNS ID as an argument because if we already know this ID, it is not practical to call resource provider. @@ -246,25 +249,25 @@ func resourceVinsSchemaMake() map[string]*schema.Schema { }, "account_id": { - Type: schema.TypeInt, - Required: true, - ForceNew: true, + Type: schema.TypeInt, + Required: true, + ForceNew: true, ValidateFunc: validation.IntAtLeast(1), - Description: "ID of the account, which this ViNS belongs to. For ViNS created at account level, resource group ID is 0.", + Description: "ID of the account, which this ViNS belongs to. For ViNS created at account level, resource group ID is 0.", }, "ext_net_id": { - Type: schema.TypeInt, - Required: true, + Type: schema.TypeInt, + Required: true, ValidateFunc: validation.IntAtLeast(0), - Description: "ID of the external network this ViNS is connected to. Pass 0 if no external connection required.", + Description: "ID of the external network this ViNS is connected to. Pass 0 if no external connection required.", }, "ipcidr": { - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, DiffSuppressFunc: ipcidrDiffSupperss, - Description: "Network address to use by this ViNS. This parameter is only valid when creating new ViNS.", + Description: "Network address to use by this ViNS. This parameter is only valid when creating new ViNS.", }, "description": { diff --git a/decort/resource_virtual_image.go b/decort/resource_virtual_image.go index b1cec35..5097db1 100644 --- a/decort/resource_virtual_image.go +++ b/decort/resource_virtual_image.go @@ -332,22 +332,13 @@ func resourceVirtualImage() *schema.Resource { CustomizeDiff: customdiff.All( customdiff.IfValueChange("enabled", func(old, new, meta interface{}) bool { - if old.(bool) != new.(bool) { - return true - } - return false + return old.(bool) != new.(bool) }, resourceImageChangeEnabled), customdiff.IfValueChange("link_to", func(old, new, meta interface{}) bool { - if old.(int) != new.(int) { - return true - } - return false + return old.(int) != new.(int) }, resourceImageLink), customdiff.IfValueChange("name", func(old, new, meta interface{}) bool { - if old.(string) != new.(string) && old.(string) != "" { - return true - } - return false + return old.(string) != new.(string) && old.(string) != "" }, resourceImageEditName), customdiff.IfValueChange("shared_with", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -364,16 +355,10 @@ func resourceVirtualImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageShare), customdiff.IfValueChange("computeci_id", func(old, new, meta interface{}) bool { - if old.(int) != new.(int) { - return true - } - return false + return old.(int) != new.(int) }, resourceImageChangeComputeci), customdiff.IfValueChange("enabled_stacks", func(old, new, meta interface{}) bool { o := old.([]interface{}) @@ -390,10 +375,7 @@ func resourceVirtualImage() *schema.Resource { count++ } } - if count == 0 { - return true - } - return false + return count == 0 }, resourceImageUpdateNodes), ), diff --git a/decort/ssh_subresource.go b/decort/ssh_subresource.go deleted file mode 100644 index 1ac97a4..0000000 --- a/decort/ssh_subresource.go +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , - -Licensed 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 decort - -import ( - "fmt" - - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" -) - -/* -func makeSshKeysConfig(arg_list []interface{}) (sshkeys []SshKeyConfig, count int) { - count = len(arg_list) - if count < 1 { - return nil, 0 - } - - sshkeys = make([]SshKeyConfig, count) - var subres_data map[string]interface{} - for index, value := range arg_list { - subres_data = value.(map[string]interface{}) - sshkeys[index].User = subres_data["user"].(string) - sshkeys[index].SshKey = subres_data["public_key"].(string) - sshkeys[index].UserShell = subres_data["shell"].(string) - } - - return sshkeys, count -} -*/ - -func makeSshKeysArgString(arg_list []interface{}) string { - // This function expects arg_list = data.Get("ssh_keys"), where "data" is a populated schema for Compute - // Resource (see func resourceCompute() definition) or Compute Data Source (see func dataSourceCompute()) - - // Prepare a string with username and public ssh key value in a format recognized by cloud-init utility. - // It is designed to be passed as "userdata" argument of virtual machine create API call. - // The following format is expected: - // '{"users": [{"ssh-authorized-keys": ["SSH_PUBCIC_KEY_VALUE"], "shell": "SHELL_VALUE", "name": "USERNAME_VALUE"}, {...}, ]}' - - /* - `%s\n - - name: %s\n - ssh-authorized-keys: - - %s\n - shell: /bin/bash` - */ - - if len(arg_list) < 1 { - return "" - } - - out := `{"users": [` - const UserdataTemplate = `%s{"ssh-authorized-keys": ["%s"], "shell": "%s", "name": "%s"}, ` - const out_suffix = `]}` - - for _, value := range arg_list { - subres_data := value.(map[string]interface{}) - - out = fmt.Sprintf(UserdataTemplate, out, subres_data["public_key"].(string), subres_data["shell"].(string), subres_data["user"].(string)) - } - out = fmt.Sprintf("%s %s", out, out_suffix) - return out -} - -func sshSubresourceSchemaMake() map[string]*schema.Schema { - rets := map[string]*schema.Schema{ - "user": { - Type: schema.TypeString, - Required: true, - Description: "Name of the guest OS user of a new compute, for which the following SSH key will be authorized.", - }, - - "public_key": { - Type: schema.TypeString, - Required: true, - Description: "Public SSH key to authorize to the specified guest OS user on the compute being created.", - }, - - "shell": { - Type: schema.TypeString, - Optional: true, - Default: "/bin/bash", - Description: "Guest user shell. This parameter is optional, default is /bin/bash.", - }, - } - - return rets -} diff --git a/decort/utility_account.go b/decort/utility_account.go index f1eaf34..136a939 100644 --- a/decort/utility_account.go +++ b/decort/utility_account.go @@ -1,6 +1,6 @@ /* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,131 +26,35 @@ package decort import ( "encoding/json" - "fmt" "net/url" + "strconv" log "github.com/sirupsen/logrus" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" - // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) -func utilityAccountCheckPresence(d *schema.ResourceData, m interface{}) (string, error) { +func utilityAccountCheckPresence(d *schema.ResourceData, m interface{}) (*AccountWithResources, error) { + account := &AccountWithResources{} controller := m.(*ControllerCfg) urlValues := &url.Values{} - accId, argSet := d.GetOk("account_id") - if argSet { - // get Account right away by its ID - log.Debugf("utilityAccountCheckPresence: locating Account by its ID %d", accId.(int)) - urlValues.Add("accountId", fmt.Sprintf("%d", accId.(int))) - apiResp, err := controller.decortAPICall("POST", AccountsGetAPI, urlValues) - if err != nil { - return "", err - } - return apiResp, nil + if (strconv.Itoa(d.Get("account_id").(int))) != "0" { + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + } else { + urlValues.Add("accountId", d.Id()) } - accName, argSet := d.GetOk("name") - if !argSet { - // neither ID nor name - no account for you! - return "", fmt.Errorf("Cannot check account presence if name is empty and no account ID specified") - } - - apiResp, err := controller.decortAPICall("POST", AccountsListAPI, urlValues) - if err != nil { - return "", err - } - // log.Debugf("%s", apiResp) - // log.Debugf("utilityAccountCheckPresence: ready to decode response body from %q", AccountsListAPI) - accList := AccountsListResp{} - err = json.Unmarshal([]byte(apiResp), &accList) + log.Debugf("utilityAccountCheckPresence: load account") + accountRaw, err := controller.decortAPICall("POST", accountGetAPI, urlValues) if err != nil { - return "", err - } - - log.Debugf("utilityAccountCheckPresence: traversing decoded Json of length %d", len(accList)) - for index, item := range accList { - // match by account name - if item.Name == accName.(string) { - log.Debugf("utilityAccountCheckPresence: match account name %q / ID %d at index %d", - item.Name, item.ID, index) - - // NB: unlike accounts/get API, accounts/list API returns abridged set of account info, - // for instance it does not return quotas - - reencodedItem, err := json.Marshal(item) - if err != nil { - return "", err - } - return string(reencodedItem[:]), nil - } + return nil, err } - return "", fmt.Errorf("Cannot find account name %q", accName.(string)) -} - -func utilityGetAccountIdBySchema(d *schema.ResourceData, m interface{}) (int, error) { - /* - This function expects schema that contains the following two elements: - - "account_name": &schema.Schema{ - Type: schema.TypeString, - Required: Optional, - Description: "Name of the account, ....", - }, - - "account_id": &schema.Schema{ - Type: schema.TypeInt, - Optional: true, - Description: "Unique ID of the account, ....", - }, - - Then it will check, which argument is set, and if account name is present, it will - initiate API calls to the DECORT cloud controller and try to match relevant account - by the name. - - NOTE that for some resources (most notably, Resource Group) "account_name" attribute is - marked as "Computed: true", so the only way to fully identify Resource Group is to specify - "account_id", which is marked as "Required: true" - - */ - - accId, argSet := d.GetOk("account_id") - if argSet { - if accId.(int) > 0 { - return accId.(int), nil - } - return 0, fmt.Errorf("Account ID must be positive") - } - - accName, argSet := d.GetOk("account_name") - if !argSet { - return 0, fmt.Errorf("Either non-empty account name or valid account ID must be specified") - } - - controller := m.(*ControllerCfg) - urlValues := &url.Values{} - apiResp, err := controller.decortAPICall("POST", AccountsListAPI, urlValues) - if err != nil { - return 0, err - } - - model := AccountsListResp{} - err = json.Unmarshal([]byte(apiResp), &model) + err = json.Unmarshal([]byte(accountRaw), &account) if err != nil { - return 0, err - } - - log.Debugf("utilityGetAccountIdBySchema: traversing decoded Json of length %d", len(model)) - for index, item := range model { - // need to match Account by name - if item.Name == accName.(string) { - log.Debugf("utilityGetAccountIdBySchema: match Account name %q / ID %d at index %d", - item.Name, item.ID, index) - return item.ID, nil - } + return nil, err } - return 0, fmt.Errorf("Cannot find account %q for the current user. Check account name and your access rights", accName.(string)) + return account, nil } diff --git a/decort/utility_account_audits_list.go b/decort/utility_account_audits_list.go new file mode 100644 index 0000000..283c513 --- /dev/null +++ b/decort/utility_account_audits_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountAuditsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountAuditsList, error) { + accountAuditsList := AccountAuditsList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountAuditsListCheckPresence: load account list") + accountAuditsListRaw, err := controller.decortAPICall("POST", accountAuditsAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountAuditsListRaw), &accountAuditsList) + if err != nil { + return nil, err + } + + return accountAuditsList, nil +} diff --git a/decort/utility_account_computes_list.go b/decort/utility_account_computes_list.go new file mode 100644 index 0000000..6c92590 --- /dev/null +++ b/decort/utility_account_computes_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountComputesListCheckPresence(d *schema.ResourceData, m interface{}) (AccountComputesList, error) { + accountComputesList := AccountComputesList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountComputesListCheckPresence: load account list") + accountComputesListRaw, err := controller.decortAPICall("POST", accountListComputesAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountComputesListRaw), &accountComputesList) + if err != nil { + return nil, err + } + + return accountComputesList, nil +} diff --git a/decort/utility_account_consumed_units.go b/decort/utility_account_consumed_units.go new file mode 100644 index 0000000..b5cdd1e --- /dev/null +++ b/decort/utility_account_consumed_units.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountConsumedUnitsCheckPresence(d *schema.ResourceData, m interface{}) (*ResourceLimits, error) { + accountConsumedUnits := &ResourceLimits{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountConsumedUnitsCheckPresence: load account list") + accountConsumedUnitsRaw, err := controller.decortAPICall("POST", accountGetConsumedUnitsAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountConsumedUnitsRaw), accountConsumedUnits) + if err != nil { + return nil, err + } + + return accountConsumedUnits, nil +} diff --git a/decort/utility_account_consumed_units_by_type.go b/decort/utility_account_consumed_units_by_type.go new file mode 100644 index 0000000..d0d65f2 --- /dev/null +++ b/decort/utility_account_consumed_units_by_type.go @@ -0,0 +1,55 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "net/url" + "strconv" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountConsumedUnitsByTypeCheckPresence(d *schema.ResourceData, m interface{}) (float64, error) { + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + urlValues.Add("cutype", strings.ToUpper(d.Get("cu_type").(string))) + + log.Debugf("utilityAccountConsumedUnitsByTypeCheckPresence") + resultRaw, err := controller.decortAPICall("POST", accountGetConsumedUnitsByTypeAPI, urlValues) + if err != nil { + return 0, err + } + result, err := strconv.ParseFloat(resultRaw, 64) + if err != nil { + return 0, err + } + + return result, nil +} diff --git a/decort/utility_account_deleted_list.go b/decort/utility_account_deleted_list.go new file mode 100644 index 0000000..7c82750 --- /dev/null +++ b/decort/utility_account_deleted_list.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountDeletedListCheckPresence(d *schema.ResourceData, m interface{}) (AccountCloudApiList, error) { + accountDeletedList := AccountCloudApiList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityAccountDeletedListCheckPresence: load") + accountDeletedListRaw, err := controller.decortAPICall("POST", accountListDeletedAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountDeletedListRaw), &accountDeletedList) + if err != nil { + return nil, err + } + + return accountDeletedList, nil +} diff --git a/decort/utility_account_disks_list.go b/decort/utility_account_disks_list.go new file mode 100644 index 0000000..941a2bc --- /dev/null +++ b/decort/utility_account_disks_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountDisksListCheckPresence(d *schema.ResourceData, m interface{}) (AccountDisksList, error) { + accountDisksList := AccountDisksList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountDisksListCheckPresence: load account list") + accountDisksListRaw, err := controller.decortAPICall("POST", accountListDisksAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountDisksListRaw), &accountDisksList) + if err != nil { + return nil, err + } + + return accountDisksList, nil +} diff --git a/decort/utility_account_flip_groups.go b/decort/utility_account_flip_groups.go new file mode 100644 index 0000000..df2c36b --- /dev/null +++ b/decort/utility_account_flip_groups.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountFlipGroupsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountFlipGroupsList, error) { + accountFlipGroupsList := AccountFlipGroupsList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountFlipGroupsListCheckPresence") + accountFlipGroupsListRaw, err := controller.decortAPICall("POST", accountListFlipGroupsAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountFlipGroupsListRaw), &accountFlipGroupsList) + if err != nil { + return nil, err + } + + return accountFlipGroupsList, nil +} diff --git a/decort/utility_account_list.go b/decort/utility_account_list.go new file mode 100644 index 0000000..0dd3514 --- /dev/null +++ b/decort/utility_account_list.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountListCheckPresence(d *schema.ResourceData, m interface{}) (AccountCloudApiList, error) { + accountList := AccountCloudApiList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityAccountListCheckPresence: load account list") + accountListRaw, err := controller.decortAPICall("POST", accountListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountListRaw), &accountList) + if err != nil { + return nil, err + } + + return accountList, nil +} + +/*uncomment for cloudbroker +func utilityAccountListCheckPresence(d *schema.ResourceData, m interface{}) (AccountList, error) { + accountList := AccountList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityAccountListCheckPresence: load account list") + accountListRaw, err := controller.decortAPICall("POST", accountListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountListRaw), &accountList) + if err != nil { + return nil, err + } + + return accountList, nil +} +*/ diff --git a/decort/utility_account_reserved_units.go b/decort/utility_account_reserved_units.go new file mode 100644 index 0000000..31bd4b9 --- /dev/null +++ b/decort/utility_account_reserved_units.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountReservedUnitsCheckPresence(d *schema.ResourceData, m interface{}) (*ResourceLimits, error) { + accountReservedUnits := &ResourceLimits{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountReservedUnitsCheckPresence: load units") + accountReservedUnitsRaw, err := controller.decortAPICall("POST", accountGetReservedUnitsAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountReservedUnitsRaw), accountReservedUnits) + if err != nil { + return nil, err + } + + return accountReservedUnits, nil +} diff --git a/decort/utility_account_rg_list.go b/decort/utility_account_rg_list.go new file mode 100644 index 0000000..0145b3a --- /dev/null +++ b/decort/utility_account_rg_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountRGListCheckPresence(d *schema.ResourceData, m interface{}) (AccountRGList, error) { + accountRGList := AccountRGList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountRGListCheckPresence: load account list") + accountRGListRaw, err := controller.decortAPICall("POST", accountListRGAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountRGListRaw), &accountRGList) + if err != nil { + return nil, err + } + + return accountRGList, nil +} diff --git a/decort/utility_account_templates_list.go b/decort/utility_account_templates_list.go new file mode 100644 index 0000000..2dd3a2e --- /dev/null +++ b/decort/utility_account_templates_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountTemplatesListCheckPresence(d *schema.ResourceData, m interface{}) (AccountTemplatesList, error) { + accountTemplatesList := AccountTemplatesList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountTemplatesListCheckPresence: load") + accountTemplatesListRaw, err := controller.decortAPICall("POST", accountListTemplatesAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountTemplatesListRaw), &accountTemplatesList) + if err != nil { + return nil, err + } + + return accountTemplatesList, nil +} diff --git a/decort/utility_account_vins_list.go b/decort/utility_account_vins_list.go new file mode 100644 index 0000000..31291ff --- /dev/null +++ b/decort/utility_account_vins_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityAccountVinsListCheckPresence(d *schema.ResourceData, m interface{}) (AccountVinsList, error) { + accountVinsList := AccountVinsList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityAccountVinsListCheckPresence: load account list") + accountVinsListRaw, err := controller.decortAPICall("POST", accountListVinsAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(accountVinsListRaw), &accountVinsList) + if err != nil { + return nil, err + } + + return accountVinsList, nil +} diff --git a/decort/utility_bservicce_deleted_list.go b/decort/utility_bservicce_deleted_list.go new file mode 100644 index 0000000..d52ebee --- /dev/null +++ b/decort/utility_bservicce_deleted_list.go @@ -0,0 +1,67 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityBasicServiceDeletedListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceList, error) { + basicServiceDeletedList := BasicServiceList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if accountId, ok := d.GetOk("account_id"); ok { + urlValues.Add("accountId", strconv.Itoa(accountId.(int))) + } + if rgId, ok := d.GetOk("rg_id"); ok { + urlValues.Add("rgId", strconv.Itoa(rgId.(int))) + } + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityBasicServiceDeletedListCheckPresence") + basicServiceDeletedListRaw, err := controller.decortAPICall("POST", bserviceListDeletedAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(basicServiceDeletedListRaw), &basicServiceDeletedList) + if err != nil { + return nil, err + } + + return basicServiceDeletedList, nil +} diff --git a/decort/utility_bservice.go b/decort/utility_bservice.go new file mode 100644 index 0000000..65c41d8 --- /dev/null +++ b/decort/utility_bservice.go @@ -0,0 +1,60 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityBasicServiceCheckPresence(d *schema.ResourceData, m interface{}) (*BasicServiceExtend, error) { + bservice := &BasicServiceExtend{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if (strconv.Itoa(d.Get("service_id").(int))) != "0" { + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + } else { + urlValues.Add("serviceId", d.Id()) + } + + log.Debugf("utilityBasicServiceCheckPresence") + bserviceRaw, err := controller.decortAPICall("POST", bserviceGetAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(bserviceRaw), &bservice) + if err != nil { + return nil, err + } + + return bservice, nil +} diff --git a/decort/utility_bservice_group.go b/decort/utility_bservice_group.go new file mode 100644 index 0000000..6f75dc0 --- /dev/null +++ b/decort/utility_bservice_group.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityBasicServiceGroupCheckPresence(d *schema.ResourceData, m interface{}) (*BasicServiceGroup, error) { + bserviceGroup := &BasicServiceGroup{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("serviceId", strconv.Itoa(d.Get("service_id").(int))) + if (strconv.Itoa(d.Get("compgroup_id").(int))) != "0" { + urlValues.Add("compgroupId", strconv.Itoa(d.Get("compgroup_id").(int))) + } else { + urlValues.Add("compgroupId", d.Id()) + } + + log.Debugf("utilityBasicServiceGroupCheckPresence") + bserviceGroupRaw, err := controller.decortAPICall("POST", bserviceGroupGetAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(bserviceGroupRaw), &bserviceGroup) + if err != nil { + return nil, err + } + + return bserviceGroup, nil +} diff --git a/decort/utility_bservice_list.go b/decort/utility_bservice_list.go new file mode 100644 index 0000000..efbe623 --- /dev/null +++ b/decort/utility_bservice_list.go @@ -0,0 +1,67 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityBasicServiceListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceList, error) { + basicServiceList := BasicServiceList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if accountId, ok := d.GetOk("account_id"); ok { + urlValues.Add("accountId", strconv.Itoa(accountId.(int))) + } + if rgId, ok := d.GetOk("rg_id"); ok { + urlValues.Add("rgId", strconv.Itoa(rgId.(int))) + } + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityBasicServiceListCheckPresence") + basicServiceListRaw, err := controller.decortAPICall("POST", bserviceListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(basicServiceListRaw), &basicServiceList) + if err != nil { + return nil, err + } + + return basicServiceList, nil +} diff --git a/decort/utility_bservice_snapshot_list.go b/decort/utility_bservice_snapshot_list.go new file mode 100644 index 0000000..1f310f3 --- /dev/null +++ b/decort/utility_bservice_snapshot_list.go @@ -0,0 +1,58 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityBasicServiceSnapshotListCheckPresence(d *schema.ResourceData, m interface{}) (BasicServiceSnapshots, error) { + basicServiceSnapshotList := BasicServiceSnapshots{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if serviceId, ok := d.GetOk("service_id"); ok { + urlValues.Add("serviceId", strconv.Itoa(serviceId.(int))) + } + + log.Debugf("utilityBasicServiceSnapshotListCheckPresence") + basicServiceSnapshotListRaw, err := controller.decortAPICall("POST", bserviceSnapshotListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(basicServiceSnapshotListRaw), &basicServiceSnapshotList) + if err != nil { + return nil, err + } + + return basicServiceSnapshotList, nil +} diff --git a/decort/utility_compute.go b/decort/utility_compute.go index 8767a25..d8b559d 100644 --- a/decort/utility_compute.go +++ b/decort/utility_compute.go @@ -38,14 +38,14 @@ import ( func (ctrl *ControllerCfg) utilityComputeExtraDisksConfigure(d *schema.ResourceData, do_delta bool) error { // d is filled with data according to computeResource schema, so extra disks config is retrieved via "extra_disks" key - // If do_delta is true, this function will identify changes between new and existing specs for extra disks and try to + // If do_delta is true, this function will identify changes between new and existing specs for extra disks and try to // update compute configuration accordingly - // Otherwise it will apply whatever is found in the new set of "extra_disks" right away. + // Otherwise it will apply whatever is found in the new set of "extra_disks" right away. // Primary use of do_delta=false is when calling this function from compute Create handler. - // Note that this function will not abort on API errors, but will continue to configure (attach / detach) other individual + // Note that this function will not abort on API errors, but will continue to configure (attach / detach) other individual // disks via atomic API calls. However, it will not retry failed manipulation on the same disk. - log.Debugf("utilityComputeExtraDisksConfigure: called for Compute ID %s with do_delta = %b", d.Id(), do_delta) + log.Debugf("utilityComputeExtraDisksConfigure: called for Compute ID %s with do_delta = %t", d.Id(), do_delta) // NB: as of rc-1.25 "extra_disks" are TypeSet with the elem of TypeInt old_set, new_set := d.GetChange("extra_disks") @@ -71,11 +71,11 @@ func (ctrl *ControllerCfg) utilityComputeExtraDisksConfigure(d *schema.ResourceD } if apiErrCount > 0 { - log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when attaching disks to Compute ID %s. Last error was: %s", - apiErrCount, d.Id(), lastSavedError) + log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when attaching disks to Compute ID %s. Last error was: %s", + apiErrCount, d.Id(), lastSavedError) return lastSavedError } - + return nil } @@ -110,8 +110,8 @@ func (ctrl *ControllerCfg) utilityComputeExtraDisksConfigure(d *schema.ResourceD } if apiErrCount > 0 { - log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when managing disks of Compute ID %s. Last error was: %s", - apiErrCount, d.Id(), lastSavedError) + log.Errorf("utilityComputeExtraDisksConfigure: there were %d error(s) when managing disks of Compute ID %s. Last error was: %s", + apiErrCount, d.Id(), lastSavedError) return lastSavedError } @@ -120,11 +120,11 @@ func (ctrl *ControllerCfg) utilityComputeExtraDisksConfigure(d *schema.ResourceD func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceData, do_delta bool) error { // "d" is filled with data according to computeResource schema, so extra networks config is retrieved via "network" key - // If do_delta is true, this function will identify changes between new and existing specs for network and try to + // If do_delta is true, this function will identify changes between new and existing specs for network and try to // update compute configuration accordingly - // Otherwise it will apply whatever is found in the new set of "network" right away. + // Otherwise it will apply whatever is found in the new set of "network" right away. // Primary use of do_delta=false is when calling this function from compute Create handler. - + old_set, new_set := d.GetChange("network") apiErrCount := 0 @@ -137,7 +137,7 @@ func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceDat for _, runner := range new_set.(*schema.Set).List() { urlValues := &url.Values{} - net_data := runner.(map[string]interface{}) + net_data := runner.(map[string]interface{}) urlValues.Add("computeId", d.Id()) urlValues.Add("netType", net_data["net_type"].(string)) urlValues.Add("netId", fmt.Sprintf("%d", net_data["net_id"].(int))) @@ -154,8 +154,8 @@ func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceDat } if apiErrCount > 0 { - log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s", - apiErrCount, d.Id(), lastSavedError) + log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s", + apiErrCount, d.Id(), lastSavedError) return lastSavedError } return nil @@ -172,8 +172,8 @@ func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceDat _, err := ctrl.decortAPICall("POST", ComputeNetDetachAPI, urlValues) if err != nil { // failed to detach this network - there will be partial resource update - log.Errorf("utilityComputeNetworksConfigure: failed to detach net ID %d of type %s from Compute ID %s: %s", - net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err) + log.Errorf("utilityComputeNetworksConfigure: failed to detach net ID %d of type %s from Compute ID %s: %s", + net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err) apiErrCount++ lastSavedError = err } @@ -185,7 +185,7 @@ func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceDat urlValues := &url.Values{} net_data := runner.(map[string]interface{}) urlValues.Add("computeId", d.Id()) - urlValues.Add("netId", fmt.Sprintf("%d",net_data["net_id"].(int))) + urlValues.Add("netId", fmt.Sprintf("%d", net_data["net_id"].(int))) urlValues.Add("netType", net_data["net_type"].(string)) if net_data["ip_address"].(string) != "" { urlValues.Add("ipAddr", net_data["ip_address"].(string)) @@ -193,16 +193,16 @@ func (ctrl *ControllerCfg) utilityComputeNetworksConfigure(d *schema.ResourceDat _, err := ctrl.decortAPICall("POST", ComputeNetAttachAPI, urlValues) if err != nil { // failed to attach this network - there will be partial resource update - log.Errorf("utilityComputeNetworksConfigure: failed to attach net ID %d of type %s to Compute ID %s: %s", - net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err) + log.Errorf("utilityComputeNetworksConfigure: failed to attach net ID %d of type %s to Compute ID %s: %s", + net_data["net_id"].(int), net_data["net_type"].(string), d.Id(), err) apiErrCount++ lastSavedError = err } } - + if apiErrCount > 0 { - log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s", - apiErrCount, d.Id(), lastSavedError) + log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s", + apiErrCount, d.Id(), lastSavedError) return lastSavedError } @@ -262,7 +262,7 @@ func utilityComputeCheckPresence(d *schema.ResourceData, m interface{}) (string, if !argSet { return "", fmt.Errorf("Cannot locate compute by name %s if no resource group ID is set", computeName.(string)) } - + urlValues.Add("rgId", fmt.Sprintf("%d", rgId)) apiResp, err := controller.decortAPICall("POST", RgListComputesAPI, urlValues) if err != nil { diff --git a/decort/utility_disk.go b/decort/utility_disk.go index 1422c03..c9a8605 100644 --- a/decort/utility_disk.go +++ b/decort/utility_disk.go @@ -16,16 +16,15 @@ limitations under the License. */ /* -This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration Technology platfom. -Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. */ package decort import ( - "encoding/json" "fmt" "net/url" @@ -36,16 +35,15 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) - func utilityDiskCheckPresence(d *schema.ResourceData, m interface{}) (string, error) { - // This function tries to locate Disk by one of the following algorithms depending on + // This function tries to locate Disk by one of the following algorithms depending on // the parameters passed: // - if disk ID is specified -> by disk ID // - if disk name is specifeid -> by disk name and either account ID or account name // // NOTE: disk names are not unique, so the first occurence of this name in the account will // be returned. There is no such ambiguity when locating disk by its ID. - // + // // If succeeded, it returns non empty string that contains JSON formatted facts about the disk // as returned by disks/get API call. // Otherwise it returns empty string and meaningful error. @@ -64,7 +62,7 @@ func utilityDiskCheckPresence(d *schema.ResourceData, m interface{}) (string, er if err != nil || theId <= 0 { diskId, argSet := d.GetOk("disk_id") if argSet { - theId =diskId.(int) + theId = diskId.(int) idSet = true } } else { @@ -92,18 +90,14 @@ func utilityDiskCheckPresence(d *schema.ResourceData, m interface{}) (string, er // Valid account ID is required to locate disks // obtain Account ID by account name - it should not be zero on success - validatedAccountId, err := utilityGetAccountIdBySchema(d, m) - if err != nil { - return "", err - } - urlValues.Add("accountId", fmt.Sprintf("%d", validatedAccountId)) + urlValues.Add("accountId", fmt.Sprintf("%d", d.Get("account_id").(int))) diskFacts, err := controller.decortAPICall("POST", DisksListAPI, urlValues) if err != nil { return "", err } - log.Debugf("utilityDiskCheckPresence: ready to unmarshal string %s", diskFacts) + log.Debugf("utilityDiskCheckPresence: ready to unmarshal string %s", diskFacts) disksList := DisksListResp{} err = json.Unmarshal([]byte(diskFacts), &disksList) @@ -119,25 +113,25 @@ func utilityDiskCheckPresence(d *schema.ResourceData, m interface{}) (string, er log.Debugf("utilityDiskCheckPresence: index %d, matched disk name %q", index, item.Name) // we found the disk we need - not get detailed information via API call to disks/get /* - // TODO: this may not be optimal as it initiates one extra call to the DECORT controller - // in spite of the fact that we already have all required information about the disk in - // item variable - // - get_urlValues := &url.Values{} - get_urlValues.Add("diskId", fmt.Sprintf("%d", item.ID)) - diskFacts, err = controller.decortAPICall("POST", DisksGetAPI, get_urlValues) - if err != nil { - return "", err - } - return diskFacts, nil + // TODO: this may not be optimal as it initiates one extra call to the DECORT controller + // in spite of the fact that we already have all required information about the disk in + // item variable + // + get_urlValues := &url.Values{} + get_urlValues.Add("diskId", fmt.Sprintf("%d", item.ID)) + diskFacts, err = controller.decortAPICall("POST", DisksGetAPI, get_urlValues) + if err != nil { + return "", err + } + return diskFacts, nil */ reencodedItem, err := json.Marshal(item) if err != nil { return "", err } - return string(reencodedItem[:]), nil + return string(reencodedItem[:]), nil } } return "", nil // there should be no error if disk does not exist -} \ No newline at end of file +} diff --git a/decort/utility_disk_list.go b/decort/utility_disk_list.go new file mode 100644 index 0000000..447f92c --- /dev/null +++ b/decort/utility_disk_list.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityDiskListCheckPresence(d *schema.ResourceData, m interface{}) (DisksListResp, error) { + diskList := DisksListResp{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + if diskType, ok := d.GetOk("type"); ok { + urlValues.Add("type", strings.ToUpper(diskType.(string))) + } + if accountId, ok := d.GetOk("accountId"); ok { + urlValues.Add("accountId", strconv.Itoa(accountId.(int))) + } + + log.Debugf("utilityDiskListCheckPresence: load grid list") + diskListRaw, err := controller.decortAPICall("POST", DisksListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(diskListRaw), &diskList) + if err != nil { + return nil, err + } + + return diskList, nil +} diff --git a/decort/utility_extnet.go b/decort/utility_extnet.go new file mode 100644 index 0000000..f7cb0b4 --- /dev/null +++ b/decort/utility_extnet.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityExtnetCheckPresence(d *schema.ResourceData, m interface{}) (*ExtnetDetailed, error) { + extnet := &ExtnetDetailed{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("net_id", strconv.Itoa(d.Get("net_id").(int))) + + log.Debugf("utilityExtnetCheckPresence") + extnetRaw, err := controller.decortAPICall("POST", extnetGetAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(extnetRaw), &extnet) + if err != nil { + return nil, err + } + + return extnet, nil +} diff --git a/decort/utility_extnet_computes_list.go b/decort/utility_extnet_computes_list.go new file mode 100644 index 0000000..2f5c629 --- /dev/null +++ b/decort/utility_extnet_computes_list.go @@ -0,0 +1,56 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityExtnetComputesListCheckPresence(d *schema.ResourceData, m interface{}) (ExtnetComputesList, error) { + extnetComputesList := ExtnetComputesList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + + log.Debugf("utilityExtnetComputesListCheckPresence") + extnetComputesListRaw, err := controller.decortAPICall("POST", extnetListComputesAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(extnetComputesListRaw), &extnetComputesList) + if err != nil { + return nil, err + } + + return extnetComputesList, nil +} diff --git a/decort/utility_extnet_default.go b/decort/utility_extnet_default.go new file mode 100644 index 0000000..a76b93c --- /dev/null +++ b/decort/utility_extnet_default.go @@ -0,0 +1,46 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "net/url" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityExtnetDefaultCheckPresence(_ *schema.ResourceData, m interface{}) (string, error) { + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + log.Debugf("utilityExtnetDefaultCheckPresence") + res, err := controller.decortAPICall("POST", extnetGetDefaultAPI, urlValues) + if err != nil { + return "", err + } + + return res, nil +} diff --git a/decort/utility_extnet_list.go b/decort/utility_extnet_list.go new file mode 100644 index 0000000..a0abe60 --- /dev/null +++ b/decort/utility_extnet_list.go @@ -0,0 +1,64 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityExtnetListCheckPresence(d *schema.ResourceData, m interface{}) (ExtnetList, error) { + extnetList := ExtnetList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if accountId, ok := d.GetOk("account_id"); ok { + urlValues.Add("accountId", strconv.Itoa(accountId.(int))) + } + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityExtnetListCheckPresence") + extnetListRaw, err := controller.decortAPICall("POST", extnetListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(extnetListRaw), &extnetList) + if err != nil { + return nil, err + } + + return extnetList, nil +} diff --git a/decort/utility_general.go b/decort/utility_general.go deleted file mode 100644 index 4934d0c..0000000 --- a/decort/utility_general.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright (c) 2019-2021 Digital Energy Cloud Solutions LLC. All Rights Reserved. -Author: Sergey Shubin, , - -Licensed 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. -*/ - -/* -This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration -Technology platfom. - -Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. -*/ - -package decort - -import ( - - "strings" - -) - -func Jo2JSON(arg_str string) string { - // DECORT API historically returns response in the form of Python dictionary, which generally - // looks like JSON, but does not comply with JSON syntax. - // For Golang JSON Unmarshal to work properly we need to pre-process API response as follows: - ret_string := strings.Replace(string(arg_str), "u'", "\"", -1) - ret_string = strings.Replace(ret_string, "'", "\"", -1) - ret_string = strings.Replace(ret_string, ": False", ": false", -1) - ret_string = strings.Replace(ret_string, ": True", ": true", -1) - ret_string = strings.Replace(ret_string, "null", "\"\"", -1) - ret_string = strings.Replace(ret_string, "None", "\"\"", -1) - - // fix for incorrect handling of usage info - // ret_string = strings.Replace(ret_string, "<", "\"", -1) - // ret_string = strings.Replace(ret_string, ">", "\"", -1) - return ret_string -} diff --git a/decort/utility_grid.go b/decort/utility_grid.go index 2131cde..8500a5f 100644 --- a/decort/utility_grid.go +++ b/decort/utility_grid.go @@ -27,7 +27,6 @@ package decort import ( "encoding/json" "errors" - "fmt" "net/url" "strconv" @@ -44,7 +43,7 @@ func utilityGridCheckPresence(d *schema.ResourceData, m interface{}) (*Grid, err if gridId, ok := d.GetOk("grid_id"); ok { urlValues.Add("gridId", strconv.Itoa(gridId.(int))) } else { - return nil, errors.New(fmt.Sprintf("grid_id is required")) + return nil, errors.New("grid_id is required") } log.Debugf("utilityGridCheckPresence: load grid") diff --git a/decort/utility_pcidevice.go b/decort/utility_pcidevice.go index 2782ac1..5709ea0 100644 --- a/decort/utility_pcidevice.go +++ b/decort/utility_pcidevice.go @@ -43,21 +43,12 @@ func utilityPcideviceCheckPresence(d *schema.ResourceData, m interface{}) (*Pcid id, _ := strconv.Atoi(d.Id()) pcideviceId = id } - pcidevice := &Pcidevice{} - - flag := false for _, pd := range pcideviceList { if pd.ID == pcideviceId { - pcidevice = &pd - flag = true - break + return &pd, nil } } - if !flag { - return nil, nil - } - - return pcidevice, nil + return nil, nil } diff --git a/decort/utility_pcidevice_list.go b/decort/utility_pcidevice_list.go index 6767c7d..e4f7580 100644 --- a/decort/utility_pcidevice_list.go +++ b/decort/utility_pcidevice_list.go @@ -31,7 +31,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) -func utilityPcideviceListCheckPresence(d *schema.ResourceData, m interface{}) (PcideviceList, error) { +func utilityPcideviceListCheckPresence(_ *schema.ResourceData, m interface{}) (PcideviceList, error) { pcideviceList := PcideviceList{} controller := m.(*ControllerCfg) urlValues := &url.Values{} diff --git a/decort/utility_rg.go b/decort/utility_rg.go index 371e678..118c898 100644 --- a/decort/utility_rg.go +++ b/decort/utility_rg.go @@ -36,38 +36,6 @@ import ( // "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) -func (ctrl *ControllerCfg) utilityResgroupConfigGet(rgid int) (*ResgroupGetResp, error) { - urlValues := &url.Values{} - urlValues.Add("rgId", fmt.Sprintf("%d", rgid)) - rgFacts, err := ctrl.decortAPICall("POST", ResgroupGetAPI, urlValues) - if err != nil { - return nil, err - } - - log.Debugf("utilityResgroupConfigGet: ready to unmarshal string %s", rgFacts) - model := &ResgroupGetResp{} - err = json.Unmarshal([]byte(rgFacts), model) - if err != nil { - return nil, err - } - - /* - ret := &ResgroupConfig{} - ret.AccountID = model.AccountID - ret.Location = model.Location - ret.Name = model.Name - ret.ID = rgid - ret.GridID = model.GridID - ret.ExtIP = model.ExtIP // legacy field for VDC - this will eventually become obsoleted by true Resource Groups - // Quota ResgroupQuotaConfig - // Network NetworkConfig - */ - log.Debugf("utilityResgroupConfigGet: account ID %d, GridID %d, Name %s", - model.AccountID, model.GridID, model.Name) - - return model, nil -} - // On success this function returns a string, as returned by API rg/get, which could be unmarshalled // into ResgroupGetResp structure func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string, error) { @@ -104,7 +72,7 @@ func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string } else { idSet = true } - + if idSet { // go straight for the RG by its ID log.Debugf("utilityResgroupCheckPresence: locating RG by its ID %d", theId) @@ -124,10 +92,6 @@ func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string // Valid account ID is required to locate a resource group // obtain Account ID by account name - it should not be zero on success - validatedAccountId, err := utilityGetAccountIdBySchema(d, m) - if err != nil { - return "", err - } urlValues.Add("includedeleted", "false") apiResp, err := controller.decortAPICall("POST", ResgroupListAPI, urlValues) @@ -145,7 +109,7 @@ func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string log.Debugf("utilityResgroupCheckPresence: traversing decoded Json of length %d", len(model)) for index, item := range model { // match by RG name & account ID - if item.Name == rgName.(string) && item.AccountID == validatedAccountId { + if item.Name == rgName.(string) && item.AccountID == d.Get("account_id").(int) { log.Debugf("utilityResgroupCheckPresence: match RG name %s / ID %d, account ID %d at index %d", item.Name, item.ID, item.AccountID, index) @@ -163,13 +127,5 @@ func utilityResgroupCheckPresence(d *schema.ResourceData, m interface{}) (string } } - return "", fmt.Errorf("Cannot find RG name %s owned by account ID %d", rgName, validatedAccountId) + return "", fmt.Errorf("Cannot find RG name %s owned by account ID %d", rgName, d.Get("account_id").(int)) } - -func utilityResgroupGetDefaultGridID() (interface{}, error) { - if DefaultGridID > 0 { - return fmt.Sprintf("%d", DefaultGridID), nil - } - - return "", fmt.Errorf("utilityResgroupGetDefaultGridID: invalid default Grid ID %d", DefaultGridID) - } diff --git a/decort/utility_rg_list.go b/decort/utility_rg_list.go new file mode 100644 index 0000000..78892f3 --- /dev/null +++ b/decort/utility_rg_list.go @@ -0,0 +1,65 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityRgListCheckPresence(d *schema.ResourceData, m interface{}) (ResgroupListResp, error) { + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + rgList := ResgroupListResp{} + + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if includedeleted, ok := d.GetOk("includedeleted"); ok { + urlValues.Add("includedeleted", strconv.FormatBool(includedeleted.(bool))) + } + + log.Debugf("utilityRgListCheckPresence: load rg list") + rgListRaw, err := controller.decortAPICall("POST", ResgroupListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(rgListRaw), &rgList) + if err != nil { + return nil, err + } + + return rgList, nil +} diff --git a/decort/utility_vins.go b/decort/utility_vins.go index f64cc79..03a410c 100644 --- a/decort/utility_vins.go +++ b/decort/utility_vins.go @@ -35,28 +35,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) -func (ctrl *ControllerCfg) utilityVinsConfigGet(vinsid int) (*VinsRecord, error) { - urlValues := &url.Values{} - urlValues.Add("vinsId", fmt.Sprintf("%d", vinsid)) - vinsFacts, err := ctrl.decortAPICall("POST", VinsGetAPI, urlValues) - if err != nil { - return nil, err - } - - log.Debugf("utilityVinsConfigGet: ready to unmarshal string %q", vinsFacts) - model := &VinsRecord{} - err = json.Unmarshal([]byte(vinsFacts), model) - if err != nil { - return nil, err - } - - log.Debugf("utilityVinsConfigGet: Name %d, account name:ID %s:%d, RG Name:ID %s:%d", - model.Name, model.AccountName, model.AccountID, - model.RgName, model.RgID) - - return model, nil -} - // On success this function returns a string, as returned by API vins/get, which could be unmarshalled // into VinsGetResp structure func utilityVinsCheckPresence(d *schema.ResourceData, m interface{}) (string, error) { @@ -129,7 +107,7 @@ func utilityVinsCheckPresence(d *schema.ResourceData, m interface{}) (string, er if err != nil { return "", err } - + // log.Debugf("%s", apiResp) // log.Debugf("utilityResgroupCheckPresence: ready to decode response body from %s", VinsSearchAPI) model := VinsSearchResp{} @@ -141,24 +119,24 @@ func utilityVinsCheckPresence(d *schema.ResourceData, m interface{}) (string, er log.Debugf("utilityVinsCheckPresence: traversing decoded Json of length %d", len(model)) for index, item := range model { if item.Name == vinsName.(string) { - if ( accountSet && item.AccountID != accountId.(int) ) || - ( rgSet && item.RgID != rgId.(int) ) { - // double check that account ID and Rg ID match, if set in the schema - continue + if (accountSet && item.AccountID != accountId.(int)) || + (rgSet && item.RgID != rgId.(int)) { + // double check that account ID and Rg ID match, if set in the schema + continue } log.Debugf("utilityVinsCheckPresence: match ViNS name %s / ID %d, account ID %d, RG ID %d at index %d", - item.Name, item.ID, item.AccountID, item.RgID, index) + item.Name, item.ID, item.AccountID, item.RgID, index) - // element returned by API vins/search does not contain all information we may need to + // element returned by API vins/search does not contain all information we may need to // manage ViNS, so we have to get detailed info by calling API vins/get rqValues := &url.Values{} - rqValues.Add("vinsId", fmt.Sprintf("%d",item.ID)) + rqValues.Add("vinsId", fmt.Sprintf("%d", item.ID)) vinsGetResp, err := controller.decortAPICall("POST", VinsGetAPI, rqValues) if err != nil { return "", err } - return vinsGetResp, nil + return vinsGetResp, nil } } diff --git a/decort/utility_vins_list.go b/decort/utility_vins_list.go new file mode 100644 index 0000000..7bdf083 --- /dev/null +++ b/decort/utility_vins_list.go @@ -0,0 +1,64 @@ +/* +Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. +Author: Stanislav Solovev, , + +Licensed 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. +*/ + +/* +This file is part of Terraform (by Hashicorp) provider for Digital Energy Cloud Orchestration +Technology platfom. + +Visit https://github.com/rudecs/terraform-provider-decort for full source code package and updates. +*/ + +package decort + +import ( + "encoding/json" + "net/url" + "strconv" + + log "github.com/sirupsen/logrus" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func utilityVinsListCheckPresence(d *schema.ResourceData, m interface{}) (VinsList, error) { + vinsList := VinsList{} + controller := m.(*ControllerCfg) + urlValues := &url.Values{} + + if includeDeleted, ok := d.GetOk("include_deleted"); ok { + urlValues.Add("includeDeleted", strconv.FormatBool(includeDeleted.(bool))) + } + if page, ok := d.GetOk("page"); ok { + urlValues.Add("page", strconv.Itoa(page.(int))) + } + if size, ok := d.GetOk("size"); ok { + urlValues.Add("size", strconv.Itoa(size.(int))) + } + + log.Debugf("utilityVinsListCheckPresence") + vinsListRaw, err := controller.decortAPICall("POST", vinsListAPI, urlValues) + if err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(vinsListRaw), &vinsList) + if err != nil { + return nil, err + } + + return vinsList, nil +} diff --git a/docs/data-sources/account.md b/docs/data-sources/account.md index f6b298f..958f041 100644 --- a/docs/data-sources/account.md +++ b/docs/data-sources/account.md @@ -15,16 +15,42 @@ description: |- ## Schema +### Required + +- **account_id** (Number) + ### Optional -- **account_id** (Number) Unique ID of the account. If account ID is specified, then account name is ignored. - **id** (String) The ID of this resource. -- **name** (String) Name of the account. Names are case sensitive and unique. - **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only -- **status** (String) Current status of the account. +- **account_name** (String) +- **acl** (List of Object) (see [below for nested schema](#nestedatt--acl)) +- **ckey** (String) +- **company** (String) +- **companyurl** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **created_by** (String) +- **created_time** (Number) +- **dc_location** (String) +- **deactivation_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **displayname** (String) +- **guid** (Number) +- **machines** (List of Object) (see [below for nested schema](#nestedatt--machines)) +- **meta** (List of String) +- **resource_limits** (List of Object) (see [below for nested schema](#nestedatt--resource_limits)) +- **resources** (List of Object) (see [below for nested schema](#nestedatt--resources)) +- **send_access_emails** (Boolean) +- **service_account** (Boolean) +- **status** (String) +- **updated_time** (Number) +- **version** (Number) +- **vins** (List of Number) +- **vinses** (Number) ### Nested Schema for `timeouts` @@ -35,3 +61,82 @@ Optional: - **read** (String) + +### Nested Schema for `acl` + +Read-Only: + +- **can_be_deleted** (Boolean) +- **explicit** (Boolean) +- **guid** (String) +- **right** (String) +- **status** (String) +- **type** (String) +- **user_group_id** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **started** (Number) +- **stopped** (Number) + + + +### Nested Schema for `machines` + +Read-Only: + +- **halted** (Number) +- **running** (Number) + + + +### Nested Schema for `resource_limits` + +Read-Only: + +- **cu_c** (Number) +- **cu_d** (Number) +- **cu_i** (Number) +- **cu_m** (Number) +- **cu_np** (Number) +- **gpu_units** (Number) + + + +### Nested Schema for `resources` + +Read-Only: + +- **current** (List of Object) (see [below for nested schema](#nestedobjatt--resources--current)) +- **reserved** (List of Object) (see [below for nested schema](#nestedobjatt--resources--reserved)) + + +### Nested Schema for `resources.current` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + + +### Nested Schema for `resources.reserved` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + diff --git a/docs/data-sources/account_audits_list.md b/docs/data-sources/account_audits_list.md new file mode 100644 index 0000000..34353e7 --- /dev/null +++ b/docs/data-sources/account_audits_list.md @@ -0,0 +1,51 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_audits_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_audits_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **call** (String) +- **responsetime** (Number) +- **statuscode** (Number) +- **timestamp** (Number) +- **user** (String) + + diff --git a/docs/data-sources/account_computes_list.md b/docs/data-sources/account_computes_list.md new file mode 100644 index 0000000..963108a --- /dev/null +++ b/docs/data-sources/account_computes_list.md @@ -0,0 +1,66 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_computes_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_computes_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **compute_id** (Number) +- **compute_name** (String) +- **cpus** (Number) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **ram** (Number) +- **registered** (Boolean) +- **rg_id** (Number) +- **rg_name** (String) +- **status** (String) +- **tech_status** (String) +- **total_disks_size** (Number) +- **updated_by** (String) +- **updated_time** (Number) +- **user_managed** (Boolean) +- **vins_connected** (Number) + + diff --git a/docs/data-sources/account_consumed_units.md b/docs/data-sources/account_consumed_units.md new file mode 100644 index 0000000..84b0ac5 --- /dev/null +++ b/docs/data-sources/account_consumed_units.md @@ -0,0 +1,44 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_consumed_units Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_consumed_units (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **cu_c** (Number) +- **cu_d** (Number) +- **cu_i** (Number) +- **cu_m** (Number) +- **cu_np** (Number) +- **gpu_units** (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/account_consumed_units_by_type.md b/docs/data-sources/account_consumed_units_by_type.md new file mode 100644 index 0000000..8ad6632 --- /dev/null +++ b/docs/data-sources/account_consumed_units_by_type.md @@ -0,0 +1,40 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_consumed_units_by_type Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_consumed_units_by_type (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account +- **cu_type** (String) cloud unit resource type + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **cu_result** (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/account_deleted_list.md b/docs/data-sources/account_deleted_list.md new file mode 100644 index 0000000..0a321c1 --- /dev/null +++ b/docs/data-sources/account_deleted_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_deleted_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_deleted_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **acl** (List of Object) (see [below for nested schema](#nestedobjatt--items--acl)) +- **created_time** (Number) +- **deleted_time** (Number) +- **status** (String) +- **updated_time** (Number) + + +### Nested Schema for `items.acl` + +Read-Only: + +- **explicit** (Boolean) +- **guid** (String) +- **right** (String) +- **status** (String) +- **type** (String) +- **user_group_id** (String) + + diff --git a/docs/data-sources/account_disks_list.md b/docs/data-sources/account_disks_list.md new file mode 100644 index 0000000..ac8b5ae --- /dev/null +++ b/docs/data-sources/account_disks_list.md @@ -0,0 +1,52 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_disks_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_disks_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **disk_id** (Number) +- **disk_name** (String) +- **pool** (String) +- **sep_id** (Number) +- **size_max** (Number) +- **type** (String) + + diff --git a/docs/data-sources/account_flipgroups_list.md b/docs/data-sources/account_flipgroups_list.md new file mode 100644 index 0000000..e97a6d6 --- /dev/null +++ b/docs/data-sources/account_flipgroups_list.md @@ -0,0 +1,67 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_flipgroups_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_flipgroups_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **client_type** (String) +- **conn_type** (String) +- **created_by** (String) +- **created_time** (Number) +- **default_gw** (String) +- **deleted_by** (String) +- **deleted_time** (Number) +- **desc** (String) +- **fg_id** (Number) +- **fg_name** (String) +- **gid** (Number) +- **guid** (Number) +- **ip** (String) +- **milestones** (Number) +- **net_id** (Number) +- **net_type** (String) +- **netmask** (Number) +- **status** (String) +- **updated_by** (String) +- **updated_time** (Number) + + diff --git a/docs/data-sources/account_list.md b/docs/data-sources/account_list.md new file mode 100644 index 0000000..de553c0 --- /dev/null +++ b/docs/data-sources/account_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **acl** (List of Object) (see [below for nested schema](#nestedobjatt--items--acl)) +- **created_time** (Number) +- **deleted_time** (Number) +- **status** (String) +- **updated_time** (Number) + + +### Nested Schema for `items.acl` + +Read-Only: + +- **explicit** (Boolean) +- **guid** (String) +- **right** (String) +- **status** (String) +- **type** (String) +- **user_group_id** (String) + + diff --git a/docs/data-sources/account_reserved_units.md b/docs/data-sources/account_reserved_units.md new file mode 100644 index 0000000..26f3627 --- /dev/null +++ b/docs/data-sources/account_reserved_units.md @@ -0,0 +1,44 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_reserved_units Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_reserved_units (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **cu_c** (Number) +- **cu_d** (Number) +- **cu_i** (Number) +- **cu_m** (Number) +- **cu_np** (Number) +- **gpu_units** (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/account_rg_list.md b/docs/data-sources/account_rg_list.md new file mode 100644 index 0000000..7690a9d --- /dev/null +++ b/docs/data-sources/account_rg_list.md @@ -0,0 +1,115 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_rg_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_rg_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **computes** (List of Object) (see [below for nested schema](#nestedobjatt--items--computes)) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **milestones** (Number) +- **resources** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources)) +- **rg_id** (Number) +- **rg_name** (String) +- **status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **vinses** (Number) + + +### Nested Schema for `items.computes` + +Read-Only: + +- **started** (Number) +- **stopped** (Number) + + + +### Nested Schema for `items.resources` + +Read-Only: + +- **consumed** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--consumed)) +- **limits** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--limits)) +- **reserved** (List of Object) (see [below for nested schema](#nestedobjatt--items--resources--reserved)) + + +### Nested Schema for `items.resources.consumed` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + + +### Nested Schema for `items.resources.limits` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + + +### Nested Schema for `items.resources.reserved` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + diff --git a/docs/data-sources/account_templates_list.md b/docs/data-sources/account_templates_list.md new file mode 100644 index 0000000..690a54d --- /dev/null +++ b/docs/data-sources/account_templates_list.md @@ -0,0 +1,56 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_templates_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_templates_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **desc** (String) +- **public** (Boolean) +- **size** (Number) +- **status** (String) +- **template_id** (Number) +- **template_name** (String) +- **type** (String) +- **unc_path** (String) +- **username** (String) + + diff --git a/docs/data-sources/account_vins_list.md b/docs/data-sources/account_vins_list.md new file mode 100644 index 0000000..c574cda --- /dev/null +++ b/docs/data-sources/account_vins_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account_vins_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account_vins_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) ID of the account + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) Search Result (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **computes** (Number) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **external_ip** (String) +- **network** (String) +- **pri_vnf_dev_id** (Number) +- **rg_id** (Number) +- **rg_name** (String) +- **status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **vin_id** (Number) +- **vin_name** (String) + + diff --git a/docs/data-sources/bservice.md b/docs/data-sources/bservice.md new file mode 100644 index 0000000..c581e67 --- /dev/null +++ b/docs/data-sources/bservice.md @@ -0,0 +1,90 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice (Data Source) + + + + + + +## Schema + +### Required + +- **service_id** (Number) + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **account_id** (Number) +- **account_name** (String) +- **base_domain** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **cpu_total** (Number) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **disk_total** (String) +- **gid** (Number) +- **groups** (List of Number) +- **groups_name** (List of String) +- **guid** (Number) +- **milestones** (Number) +- **parent_srv_id** (Number) +- **parent_srv_type** (String) +- **ram_total** (Number) +- **rg_id** (Number) +- **rg_name** (String) +- **service_name** (String) +- **snapshots** (List of Object) (see [below for nested schema](#nestedatt--snapshots)) +- **ssh_key** (String) +- **ssh_user** (String) +- **status** (String) +- **tech_status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **user_managed** (Boolean) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **compgroup_id** (Number) +- **compgroup_name** (String) +- **compgroup_role** (String) +- **id** (Number) +- **name** (String) + + + +### Nested Schema for `snapshots` + +Read-Only: + +- **guid** (String) +- **label** (String) +- **timestamp** (Number) +- **valid** (Boolean) + + diff --git a/docs/data-sources/bservice_deleted_list.md b/docs/data-sources/bservice_deleted_list.md new file mode 100644 index 0000000..53c980e --- /dev/null +++ b/docs/data-sources/bservice_deleted_list.md @@ -0,0 +1,68 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice_deleted_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice_deleted_list (Data Source) + + + + + + +## Schema + +### Optional + +- **account_id** (Number) ID of the account to query for BasicService instances +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **rg_id** (Number) ID of the resource group to query for BasicService instances +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **base_domain** (String) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **gid** (Number) +- **groups** (List of Number) +- **guid** (Number) +- **parent_srv_id** (Number) +- **parent_srv_type** (String) +- **rg_id** (Number) +- **rg_name** (String) +- **service_id** (Number) +- **service_name** (String) +- **ssh_user** (String) +- **status** (String) +- **tech_status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **user_managed** (Boolean) + + diff --git a/docs/data-sources/bservice_group.md b/docs/data-sources/bservice_group.md new file mode 100644 index 0000000..8a90fa6 --- /dev/null +++ b/docs/data-sources/bservice_group.md @@ -0,0 +1,88 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice_group Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice_group (Data Source) + + + + + + +## Schema + +### Required + +- **compgroup_id** (Number) +- **service_id** (Number) + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **account_id** (Number) +- **account_name** (String) +- **compgroup_name** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **consistency** (Boolean) +- **cpu** (Number) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **disk** (Number) +- **driver** (String) +- **extnets** (List of Number) +- **gid** (Number) +- **guid** (Number) +- **image_id** (Number) +- **milestones** (Number) +- **parents** (List of Number) +- **ram** (Number) +- **rg_id** (Number) +- **rg_name** (String) +- **role** (String) +- **sep_id** (Number) +- **seq_no** (Number) +- **status** (String) +- **tech_status** (String) +- **timeout_start** (Number) +- **updated_by** (String) +- **updated_time** (Number) +- **vinses** (List of Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **id** (Number) +- **ip_addresses** (List of String) +- **name** (String) +- **os_users** (List of Object) (see [below for nested schema](#nestedobjatt--computes--os_users)) + + +### Nested Schema for `computes.os_users` + +Read-Only: + +- **login** (String) +- **password** (String) + + diff --git a/docs/data-sources/bservice_list.md b/docs/data-sources/bservice_list.md new file mode 100644 index 0000000..e464d39 --- /dev/null +++ b/docs/data-sources/bservice_list.md @@ -0,0 +1,68 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice_list (Data Source) + + + + + + +## Schema + +### Optional + +- **account_id** (Number) ID of the account to query for BasicService instances +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **rg_id** (Number) ID of the resource group to query for BasicService instances +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **base_domain** (String) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **gid** (Number) +- **groups** (List of Number) +- **guid** (Number) +- **parent_srv_id** (Number) +- **parent_srv_type** (String) +- **rg_id** (Number) +- **rg_name** (String) +- **service_id** (Number) +- **service_name** (String) +- **ssh_user** (String) +- **status** (String) +- **tech_status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **user_managed** (Boolean) + + diff --git a/docs/data-sources/bservice_snapshot_list.md b/docs/data-sources/bservice_snapshot_list.md new file mode 100644 index 0000000..c75cd5f --- /dev/null +++ b/docs/data-sources/bservice_snapshot_list.md @@ -0,0 +1,50 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice_snapshot_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice_snapshot_list (Data Source) + + + + + + +## Schema + +### Required + +- **service_id** (Number) ID of the BasicService instance + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **guid** (String) +- **label** (String) +- **timestamp** (Number) +- **valid** (Boolean) + + diff --git a/docs/data-sources/disk_list.md b/docs/data-sources/disk_list.md new file mode 100644 index 0000000..2095104 --- /dev/null +++ b/docs/data-sources/disk_list.md @@ -0,0 +1,105 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_disk_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_disk_list (Data Source) + + + + + + +## Schema + +### Optional + +- **account_id** (Number) ID of the account the disks belong to +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- **type** (String) type of the disks + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **acl** (String) +- **boot_partition** (Number) +- **compute_id** (Number) +- **compute_name** (String) +- **created_time** (Number) +- **deleted_time** (Number) +- **desc** (String) +- **destruction_time** (Number) +- **devicename** (String) +- **disk_id** (Number) +- **disk_path** (String) +- **gid** (Number) +- **guid** (Number) +- **image_id** (Number) +- **images** (List of String) +- **iotune** (String) +- **iqn** (String) +- **login** (String) +- **machine_id** (Number) +- **machine_name** (String) +- **milestones** (Number) +- **name** (String) +- **order** (Number) +- **params** (String) +- **parent_id** (Number) +- **passwd** (String) +- **pci_slot** (Number) +- **pool** (String) +- **purge_attempts** (Number) +- **purge_time** (Number) +- **reality_device_number** (Number) +- **reference_id** (String) +- **res_id** (String) +- **res_name** (String) +- **role** (String) +- **sep_id** (Number) +- **sep_type** (String) +- **size_max** (Number) +- **size_used** (Number) +- **snapshots** (List of Object) (see [below for nested schema](#nestedobjatt--items--snapshots)) +- **status** (String) +- **tech_status** (String) +- **type** (String) +- **update_by** (Number) +- **vmid** (Number) + + +### Nested Schema for `items.snapshots` + +Read-Only: + +- **guid** (String) +- **label** (String) +- **res_id** (String) +- **snap_set_guid** (String) +- **snap_set_time** (Number) +- **timestamp** (Number) + + diff --git a/docs/data-sources/extnet.md b/docs/data-sources/extnet.md new file mode 100644 index 0000000..dedadab --- /dev/null +++ b/docs/data-sources/extnet.md @@ -0,0 +1,98 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_extnet Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_extnet (Data Source) + + + + + + +## Schema + +### Required + +- **net_id** (Number) + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **check__ips** (List of String) +- **check_ips** (List of String) +- **ckey** (String) +- **default** (Boolean) +- **default_qos** (List of Object) (see [below for nested schema](#nestedatt--default_qos)) +- **desc** (String) +- **dns** (List of String) +- **excluded** (List of String) +- **free_ips** (Number) +- **gateway** (String) +- **gid** (Number) +- **guid** (Number) +- **ipcidr** (String) +- **meta** (List of String) meta +- **milestones** (Number) +- **net_name** (String) +- **network** (String) +- **network_id** (Number) +- **pre_reservations_num** (Number) +- **prefix** (Number) +- **pri_vnf_dev_id** (Number) +- **reservations** (List of Object) (see [below for nested schema](#nestedatt--reservations)) +- **shared_with** (List of Number) +- **status** (String) +- **vlan_id** (Number) +- **vnfs** (List of Object) (see [below for nested schema](#nestedatt--vnfs)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `default_qos` + +Read-Only: + +- **e_rate** (Number) +- **guid** (String) +- **in_burst** (Number) +- **in_rate** (Number) + + + +### Nested Schema for `reservations` + +Read-Only: + +- **client_type** (String) +- **desc** (String) +- **domainname** (String) +- **hostname** (String) +- **ip** (String) +- **mac** (String) +- **type** (String) +- **vm_id** (Number) + + + +### Nested Schema for `vnfs` + +Read-Only: + +- **dhcp** (Number) + + diff --git a/docs/data-sources/extnet_computes_list.md b/docs/data-sources/extnet_computes_list.md new file mode 100644 index 0000000..76d4161 --- /dev/null +++ b/docs/data-sources/extnet_computes_list.md @@ -0,0 +1,63 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_extnet_computes_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_extnet_computes_list (Data Source) + + + + + + +## Schema + +### Required + +- **account_id** (Number) filter by account ID + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **extnets** (List of Object) (see [below for nested schema](#nestedobjatt--items--extnets)) +- **id** (Number) +- **name** (String) +- **rg_id** (Number) +- **rg_name** (String) + + +### Nested Schema for `items.extnets` + +Read-Only: + +- **ipaddr** (String) +- **ipcidr** (String) +- **name** (String) +- **net_id** (Number) + + diff --git a/docs/data-sources/extnet_default.md b/docs/data-sources/extnet_default.md new file mode 100644 index 0000000..ca7ea93 --- /dev/null +++ b/docs/data-sources/extnet_default.md @@ -0,0 +1,35 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_extnet_default Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_extnet_default (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **net_id** (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/extnet_list.md b/docs/data-sources/extnet_list.md new file mode 100644 index 0000000..e0bc2c8 --- /dev/null +++ b/docs/data-sources/extnet_list.md @@ -0,0 +1,48 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_extnet_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_extnet_list (Data Source) + + + + + + +## Schema + +### Optional + +- **account_id** (Number) filter by account ID +- **id** (String) The ID of this resource. +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **ipcidr** (String) +- **name** (String) +- **net_id** (Number) + + diff --git a/docs/data-sources/pcidevice.md b/docs/data-sources/pcidevice.md new file mode 100644 index 0000000..ea44fb4 --- /dev/null +++ b/docs/data-sources/pcidevice.md @@ -0,0 +1,49 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_pcidevice Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_pcidevice (Data Source) + + + + + + +## Schema + +### Required + +- **device_id** (Number) + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **ckey** (String) +- **compute_id** (Number) +- **description** (String) +- **guid** (Number) +- **hw_path** (String) +- **meta** (List of String) +- **name** (String) +- **rg_id** (Number) +- **stack_id** (Number) +- **status** (String) +- **system_name** (String) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/pcidevice_list.md b/docs/data-sources/pcidevice_list.md new file mode 100644 index 0000000..ed65321 --- /dev/null +++ b/docs/data-sources/pcidevice_list.md @@ -0,0 +1,54 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_pcidevice_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_pcidevice_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) pcidevice list (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **ckey** (String) +- **compute_id** (Number) +- **description** (String) +- **device_id** (Number) +- **guid** (Number) +- **hw_path** (String) +- **meta** (List of String) +- **name** (String) +- **rg_id** (Number) +- **stack_id** (Number) +- **status** (String) +- **system_name** (String) + + diff --git a/docs/data-sources/rg_list.md b/docs/data-sources/rg_list.md new file mode 100644 index 0000000..ddaea6d --- /dev/null +++ b/docs/data-sources/rg_list.md @@ -0,0 +1,94 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_rg_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_rg_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **includedeleted** (Boolean) included deleted resource groups +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **acl** (List of Object) (see [below for nested schema](#nestedobjatt--items--acl)) +- **created_by** (String) +- **created_time** (Number) +- **def_net_id** (Number) +- **def_net_type** (String) +- **deleted_by** (String) +- **deleted_time** (Number) +- **desc** (String) +- **gid** (Number) +- **guid** (Number) +- **lock_status** (String) +- **milestones** (Number) +- **name** (String) +- **register_computes** (Boolean) +- **resource_limits** (List of Object) (see [below for nested schema](#nestedobjatt--items--resource_limits)) +- **rg_id** (Number) +- **secret** (String) +- **status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **vins** (List of Number) +- **vms** (List of Number) + + +### Nested Schema for `items.acl` + +Read-Only: + +- **explicit** (Boolean) +- **guid** (String) +- **right** (String) +- **status** (String) +- **type** (String) +- **user_group_id** (String) + + + +### Nested Schema for `items.resource_limits` + +Read-Only: + +- **cu_c** (Number) +- **cu_d** (Number) +- **cu_i** (Number) +- **cu_m** (Number) +- **cu_np** (Number) +- **gpu_units** (Number) + + diff --git a/docs/data-sources/sep.md b/docs/data-sources/sep.md new file mode 100644 index 0000000..85d29a2 --- /dev/null +++ b/docs/data-sources/sep.md @@ -0,0 +1,51 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep (Data Source) + + + + + + +## Schema + +### Required + +- **sep_id** (Number) sep type des id + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **ckey** (String) +- **config** (String) +- **consumed_by** (List of Number) +- **desc** (String) +- **gid** (Number) +- **guid** (Number) +- **meta** (List of String) +- **milestones** (Number) +- **name** (String) +- **obj_status** (String) +- **provided_by** (List of Number) +- **tech_status** (String) +- **type** (String) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/sep_config.md b/docs/data-sources/sep_config.md new file mode 100644 index 0000000..a676bdf --- /dev/null +++ b/docs/data-sources/sep_config.md @@ -0,0 +1,39 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_config Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_config (Data Source) + + + + + + +## Schema + +### Required + +- **sep_id** (Number) storage endpoint provider ID + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **config** (String) sep config json string + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/sep_consumption.md b/docs/data-sources/sep_consumption.md new file mode 100644 index 0000000..6929b1e --- /dev/null +++ b/docs/data-sources/sep_consumption.md @@ -0,0 +1,69 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_consumption Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_consumption (Data Source) + + + + + + +## Schema + +### Required + +- **sep_id** (Number) sep id + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **by_pool** (List of Object) consumption divided by pool (see [below for nested schema](#nestedatt--by_pool)) +- **total** (List of Object) total consumption (see [below for nested schema](#nestedatt--total)) +- **type** (String) sep type + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `by_pool` + +Read-Only: + +- **disk_count** (Number) +- **disk_usage** (Number) +- **name** (String) +- **snapshot_count** (Number) +- **snapshot_usage** (Number) +- **usage** (Number) +- **usage_limit** (Number) + + + +### Nested Schema for `total` + +Read-Only: + +- **capacity_limit** (Number) +- **disk_count** (Number) +- **disk_usage** (Number) +- **snapshot_count** (Number) +- **snapshot_usage** (Number) +- **usage** (Number) +- **usage_limit** (Number) + + diff --git a/docs/data-sources/sep_disk_list.md b/docs/data-sources/sep_disk_list.md new file mode 100644 index 0000000..827a141 --- /dev/null +++ b/docs/data-sources/sep_disk_list.md @@ -0,0 +1,40 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_disk_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_disk_list (Data Source) + + + + + + +## Schema + +### Required + +- **sep_id** (Number) storage endpoint provider ID + +### Optional + +- **id** (String) The ID of this resource. +- **pool_name** (String) pool name +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Number) sep disk list + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/sep_list.md b/docs/data-sources/sep_list.md new file mode 100644 index 0000000..caad0b2 --- /dev/null +++ b/docs/data-sources/sep_list.md @@ -0,0 +1,58 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **page** (Number) page number +- **size** (Number) page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) sep list (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **ckey** (String) +- **config** (String) +- **consumed_by** (List of Number) +- **desc** (String) +- **gid** (Number) +- **guid** (Number) +- **meta** (List of String) +- **milestones** (Number) +- **name** (String) +- **obj_status** (String) +- **provided_by** (List of Number) +- **sep_id** (Number) +- **tech_status** (String) +- **type** (String) + + diff --git a/docs/data-sources/sep_pool.md b/docs/data-sources/sep_pool.md new file mode 100644 index 0000000..a70a366 --- /dev/null +++ b/docs/data-sources/sep_pool.md @@ -0,0 +1,40 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_pool Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_pool (Data Source) + + + + + + +## Schema + +### Required + +- **pool_name** (String) pool name +- **sep_id** (Number) storage endpoint provider ID + +### Optional + +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **pool** (String) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + diff --git a/docs/data-sources/vgpu.md b/docs/data-sources/vgpu.md new file mode 100644 index 0000000..853bc45 --- /dev/null +++ b/docs/data-sources/vgpu.md @@ -0,0 +1,37 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_vgpu Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_vgpu (Data Source) + + + + + + +## Schema + +### Required + +- **vgpu_id** (Number) + +### Optional + +- **id** (String) The ID of this resource. + +### Read-Only + +- **account_id** (Number) +- **mode** (String) +- **pgpu** (Number) +- **profile_id** (Number) +- **ram** (Number) +- **status** (String) +- **type** (String) +- **vm_id** (Number) + + diff --git a/docs/data-sources/vins_list.md b/docs/data-sources/vins_list.md new file mode 100644 index 0000000..4268af8 --- /dev/null +++ b/docs/data-sources/vins_list.md @@ -0,0 +1,61 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_vins_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_vins_list (Data Source) + + + + + + +## Schema + +### Optional + +- **id** (String) The ID of this resource. +- **include_deleted** (Boolean) include deleted computes +- **page** (Number) Page number +- **size** (Number) Page size +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **items** (List of Object) (see [below for nested schema](#nestedatt--items)) + + +### Nested Schema for `timeouts` + +Optional: + +- **default** (String) +- **read** (String) + + + +### Nested Schema for `items` + +Read-Only: + +- **account_id** (Number) +- **account_name** (String) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **external_ip** (String) +- **network** (String) +- **rg_id** (Number) +- **rg_name** (String) +- **status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **vins_id** (Number) +- **vins_name** (String) +- **vxlan_id** (Number) + + diff --git a/docs/resources/account.md b/docs/resources/account.md new file mode 100644 index 0000000..c0d5edd --- /dev/null +++ b/docs/resources/account.md @@ -0,0 +1,164 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_account Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_account (Resource) + + + + + + +## Schema + +### Required + +- **account_name** (String) account name +- **username** (String) username of owner the account + +### Optional + +- **account_id** (Number) +- **emailaddress** (String) email +- **enable** (Boolean) enable/disable account +- **id** (String) The ID of this resource. +- **permanently** (Boolean) whether to completely delete the account +- **resource_limits** (Block List, Max: 1) (see [below for nested schema](#nestedblock--resource_limits)) +- **restore** (Boolean) restore a deleted account +- **send_access_emails** (Boolean) if true send emails when a user is granted access to resources +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- **users** (Block List) (see [below for nested schema](#nestedblock--users)) + +### Read-Only + +- **acl** (List of Object) (see [below for nested schema](#nestedatt--acl)) +- **ckey** (String) +- **company** (String) +- **companyurl** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **created_by** (String) +- **created_time** (Number) +- **dc_location** (String) +- **deactivation_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **displayname** (String) +- **guid** (Number) +- **machines** (List of Object) (see [below for nested schema](#nestedatt--machines)) +- **meta** (List of String) +- **resources** (List of Object) (see [below for nested schema](#nestedatt--resources)) +- **service_account** (Boolean) +- **status** (String) +- **updated_time** (Number) +- **version** (Number) +- **vins** (List of Number) +- **vinses** (Number) + + +### Nested Schema for `resource_limits` + +Optional: + +- **cu_c** (Number) +- **cu_d** (Number) +- **cu_i** (Number) +- **cu_m** (Number) +- **cu_np** (Number) +- **gpu_units** (Number) + + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + + +### Nested Schema for `users` + +Required: + +- **access_type** (String) +- **user_id** (String) + +Optional: + +- **recursive_delete** (Boolean) + + + +### Nested Schema for `acl` + +Read-Only: + +- **can_be_deleted** (Boolean) +- **explicit** (Boolean) +- **guid** (String) +- **right** (String) +- **status** (String) +- **type** (String) +- **user_group_id** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **started** (Number) +- **stopped** (Number) + + + +### Nested Schema for `machines` + +Read-Only: + +- **halted** (Number) +- **running** (Number) + + + +### Nested Schema for `resources` + +Read-Only: + +- **current** (List of Object) (see [below for nested schema](#nestedobjatt--resources--current)) +- **reserved** (List of Object) (see [below for nested schema](#nestedobjatt--resources--reserved)) + + +### Nested Schema for `resources.current` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + + +### Nested Schema for `resources.reserved` + +Read-Only: + +- **cpu** (Number) +- **disksize** (Number) +- **extips** (Number) +- **exttraffic** (Number) +- **gpu** (Number) +- **ram** (Number) + + diff --git a/docs/resources/bservice.md b/docs/resources/bservice.md new file mode 100644 index 0000000..0f52bf8 --- /dev/null +++ b/docs/resources/bservice.md @@ -0,0 +1,101 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice (Resource) + + + + + + +## Schema + +### Required + +- **rg_id** (Number) ID of the Resource Group where this service will be placed +- **service_name** (String) Name of the service + +### Optional + +- **enable** (Boolean) if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately +- **id** (String) The ID of this resource. +- **permanently** (Boolean) if set to False, Basic service will be deleted to recycle bin. Otherwise destroyed immediately +- **restore** (Boolean) Restores BasicService instance +- **service_id** (Number) +- **snapshots** (Block List) (see [below for nested schema](#nestedblock--snapshots)) +- **ssh_key** (String) SSH key to deploy for the specified user. Same key will be deployed to all computes of the service. +- **ssh_user** (String) name of the user to deploy SSH key for. Pass empty string if no SSH key deployment is required +- **start** (Boolean) Start service. Starting a service technically means starting computes from all service groups according to group relations +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **account_id** (Number) +- **account_name** (String) +- **base_domain** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **cpu_total** (Number) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **disk_total** (String) +- **gid** (Number) +- **groups** (List of Number) +- **groups_name** (List of String) +- **guid** (Number) +- **milestones** (Number) +- **parent_srv_id** (Number) +- **parent_srv_type** (String) +- **ram_total** (Number) +- **rg_name** (String) +- **status** (String) +- **tech_status** (String) +- **updated_by** (String) +- **updated_time** (Number) +- **user_managed** (Boolean) + + +### Nested Schema for `snapshots` + +Optional: + +- **label** (String) +- **rollback** (Boolean) + +Read-Only: + +- **guid** (String) +- **timestamp** (Number) +- **valid** (Boolean) + + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **compgroup_id** (Number) +- **compgroup_name** (String) +- **compgroup_role** (String) +- **id** (Number) +- **name** (String) + + diff --git a/docs/resources/bservice_group.md b/docs/resources/bservice_group.md new file mode 100644 index 0000000..5ab6a26 --- /dev/null +++ b/docs/resources/bservice_group.md @@ -0,0 +1,97 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_bservice_group Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_bservice_group (Resource) + + + + + + +## Schema + +### Required + +- **comp_count** (Number) computes number. Defines how many computes must be there in the group +- **compgroup_name** (String) name of the Compute Group to add +- **cpu** (Number) compute CPU number. All computes in the group have the same CPU count +- **disk** (Number) compute boot disk size in GB +- **driver** (String) compute driver like a KVM_X86, KVM_PPC, etc. +- **image_id** (Number) OS image ID to create computes from +- **ram** (Number) compute RAM volume in MB. All computes in the group have the same RAM volume +- **service_id** (Number) ID of the Basic Service to add a group to + +### Optional + +- **compgroup_id** (Number) +- **extnets** (List of Number) list of external networks to connect computes to +- **force_stop** (Boolean) force stop Compute Group +- **force_update** (Boolean) force resize Compute Group +- **id** (String) The ID of this resource. +- **mode** (String) (RELATIVE;ABSOLUTE) either delta or absolute value of computes +- **parents** (List of Number) +- **remove_computes** (List of Number) +- **role** (String) group role tag. Can be empty string, does not have to be unique +- **start** (Boolean) Start the specified Compute Group within BasicService +- **timeout_start** (Number) time of Compute Group readiness +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- **vinses** (List of Number) list of ViNSes to connect computes to + +### Read-Only + +- **account_id** (Number) +- **account_name** (String) +- **computes** (List of Object) (see [below for nested schema](#nestedatt--computes)) +- **consistency** (Boolean) +- **created_by** (String) +- **created_time** (Number) +- **deleted_by** (String) +- **deleted_time** (Number) +- **gid** (Number) +- **guid** (Number) +- **milestones** (Number) +- **rg_id** (Number) +- **rg_name** (String) +- **sep_id** (Number) +- **seq_no** (Number) +- **status** (String) +- **tech_status** (String) +- **updated_by** (String) +- **updated_time** (Number) + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + + +### Nested Schema for `computes` + +Read-Only: + +- **id** (Number) +- **ip_addresses** (List of String) +- **name** (String) +- **os_users** (List of Object) (see [below for nested schema](#nestedobjatt--computes--os_users)) + + +### Nested Schema for `computes.os_users` + +Read-Only: + +- **login** (String) +- **password** (String) + + diff --git a/docs/resources/disk.md b/docs/resources/disk.md index 1d1a5dd..b19e57f 100644 --- a/docs/resources/disk.md +++ b/docs/resources/disk.md @@ -17,17 +17,17 @@ description: |- ### Required -- **pool** (String) Pool where this disk is located. Cannot be changed for existing disk. -- **sep_id** (Number) Storage end-point provider serving this disk. Cannot be changed for existing disk. +- **account_id** (Number) ID of the account this disk belongs to. +- **name** (String) Name of this disk. NOTE: disk names are NOT unique within an account. If disk ID is specified, disk name is ignored. - **size** (Number) Size of the disk in GB. Note, that existing disks can only be grown in size. ### Optional -- **account_id** (Number) ID of the account this disk belongs to. - **description** (String) Optional user-defined text description of this disk. - **disk_id** (Number) ID of the disk to get. If disk ID is specified, then disk name and account ID are ignored. - **id** (String) The ID of this resource. -- **name** (String) Name of this disk. NOTE: disk names are NOT unique within an account. If disk ID is specified, disk name is ignored. +- **pool** (String) Pool where this disk is located. Cannot be changed for existing disk. +- **sep_id** (Number) Storage end-point provider serving this disk. Cannot be changed for existing disk. - **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) ### Read-Only diff --git a/docs/resources/pcidevice.md b/docs/resources/pcidevice.md new file mode 100644 index 0000000..a4e3f86 --- /dev/null +++ b/docs/resources/pcidevice.md @@ -0,0 +1,54 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_pcidevice Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_pcidevice (Resource) + + + + + + +## Schema + +### Required + +- **hw_path** (String) PCI address of the device +- **name** (String) Name of Device +- **rg_id** (Number) Resource GROUP +- **stack_id** (Number) stackId + +### Optional + +- **description** (String) description, just for information +- **device_id** (Number) +- **enable** (Boolean) Enable pci device +- **force** (Boolean) Force delete +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- **ckey** (String) +- **compute_id** (Number) +- **guid** (Number) +- **meta** (List of String) +- **status** (String) +- **system_name** (String) + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + diff --git a/docs/resources/sep.md b/docs/resources/sep.md new file mode 100644 index 0000000..7180b28 --- /dev/null +++ b/docs/resources/sep.md @@ -0,0 +1,69 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep (Resource) + + + + + + +## Schema + +### Required + +- **gid** (Number) grid (platform) ID +- **name** (String) SEP name +- **type** (String) type of storage + +### Optional + +- **clear_physically** (Boolean) clear disks and images physically +- **config** (String) sep config string +- **consumed_by** (List of Number) list of consumer nodes IDs +- **decommission** (Boolean) unlink everything that exists from SEP +- **desc** (String) sep description +- **enable** (Boolean) enable SEP after creation +- **field_edit** (Block List, Max: 1) (see [below for nested schema](#nestedblock--field_edit)) +- **id** (String) The ID of this resource. +- **provided_by** (List of Number) list of provider nodes IDs +- **sep_id** (Number) sep type des id +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) +- **upd_capacity_limit** (Boolean) Update SEP capacity limit + +### Read-Only + +- **ckey** (String) +- **guid** (Number) +- **meta** (List of String) +- **milestones** (Number) +- **obj_status** (String) +- **tech_status** (String) + + +### Nested Schema for `field_edit` + +Required: + +- **field_name** (String) +- **field_type** (String) +- **field_value** (String) + + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + diff --git a/docs/resources/sep_config.md b/docs/resources/sep_config.md new file mode 100644 index 0000000..32ec3ca --- /dev/null +++ b/docs/resources/sep_config.md @@ -0,0 +1,50 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_sep_config Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_sep_config (Resource) + + + + + + +## Schema + +### Required + +- **sep_id** (Number) + +### Optional + +- **config** (String) +- **field_edit** (Block List, Max: 1) (see [below for nested schema](#nestedblock--field_edit)) +- **id** (String) The ID of this resource. +- **timeouts** (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + + +### Nested Schema for `field_edit` + +Required: + +- **field_name** (String) +- **field_type** (String) +- **field_value** (String) + + + +### Nested Schema for `timeouts` + +Optional: + +- **create** (String) +- **default** (String) +- **delete** (String) +- **read** (String) +- **update** (String) + + diff --git a/samples/README.md b/samples/README.md index 3a20964..1797fa0 100644 --- a/samples/README.md +++ b/samples/README.md @@ -18,6 +18,30 @@ - sep_pool - sep_consumption - vgpu + - disk_list + - rg_list + - account_list + - account_computes_list + - account_disks_list + - account_vins_list + - account_audits_list + - account + - account_rg_list + - account_counsumed_units + - account_counsumed_units_by_type + - account_reserved_units + - account_templates_list + - account_deleted_list + - bservice_list + - bservice_snapshot_list + - bservice_deleted_list + - bservice + - bservice_group + - extnet_default + - extnet_list + - extnet + - extnet_computes_list + - vins_list - resources: - image - virtual_image @@ -29,6 +53,9 @@ - pcidevice - sep - sep_config + - account + - bservice + - bservice_group ## Как пользоваться примерами 1. Установить terraform diff --git a/samples/data_account/main.tf b/samples/data_account/main.tf new file mode 100644 index 0000000..af70baa --- /dev/null +++ b/samples/data_account/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение информации об аккаунте + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account" "a" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 + +} + +output "test" { + value = data.decort_account.a +} diff --git a/samples/data_account_audits_list/main.tf b/samples/data_account_audits_list/main.tf new file mode 100644 index 0000000..1cd48f5 --- /dev/null +++ b/samples/data_account_audits_list/main.tf @@ -0,0 +1,40 @@ +/* +Пример использования +Получение информации об использовании аккаунта + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_audits_list" "aal" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 + +} + +output "test" { + value = data.decort_account_audits_list.aal +} diff --git a/samples/data_account_computes_list/main.tf b/samples/data_account_computes_list/main.tf new file mode 100644 index 0000000..26edae2 --- /dev/null +++ b/samples/data_account_computes_list/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение списка computes, используемых аккаунтом + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_computes_list" "acl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 1111 + +} + +output "test" { + value = data.decort_account_computes_list.acl +} diff --git a/samples/data_account_consumed_units/main.tf b/samples/data_account_consumed_units/main.tf new file mode 100644 index 0000000..bfe2c2b --- /dev/null +++ b/samples/data_account_consumed_units/main.tf @@ -0,0 +1,37 @@ +/* +Пример использования +Получение информации о расходуемых ресурсах аккаута +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_consumed_units" "acu" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 22222 +} + +output "test" { + value = data.decort_account_consumed_units.acu +} diff --git a/samples/data_account_consumed_units_by_type/main.tf b/samples/data_account_consumed_units_by_type/main.tf new file mode 100644 index 0000000..35ed80b --- /dev/null +++ b/samples/data_account_consumed_units_by_type/main.tf @@ -0,0 +1,54 @@ +/* +Пример использования +Ресурса cdrom image +Ресурс позволяет: +1. Создавать образ +2. Редактировать образ +3. Удалять образ + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_consumed_units_by_type" "acubt" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 33333 + + #тип вычислительной единицы + #обязательный параметр + #тип - строка + #значения: + #cu_c - кол-во виртуальных cpu ядер + #cu_m - кол-во RAM в МБ + #cu_d - кол-в используемой дисковой памяти, в ГБ + #cu_i - кол-во публичных ip адресов + #cu_np - кол-во полученного/отданного трафика, в ГБ + #gpu_units - кол-во gpu ядер + cu_type = "cu_с" +} + +output "test" { + value = data.decort_account_consumed_units_by_type.acubt +} diff --git a/samples/data_account_deleted_list/main.tf b/samples/data_account_deleted_list/main.tf new file mode 100644 index 0000000..7309fcd --- /dev/null +++ b/samples/data_account_deleted_list/main.tf @@ -0,0 +1,45 @@ +/* +Пример использования +Получение информации об удаленных аккаунтах +Информация предоставляется только по аккаунтам, удаленным без флага permanently +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_deleted_list" "adl" { + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 2 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 3 +} + +output "test" { + value = data.decort_account_deleted_list.adl +} diff --git a/samples/data_account_disks_list/main.tf b/samples/data_account_disks_list/main.tf new file mode 100644 index 0000000..c0ac605 --- /dev/null +++ b/samples/data_account_disks_list/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение информации о дисках, которые использует аккаунт + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_disks_list" "adl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 + +} + +output "test" { + value = data.decort_account_disks_list.adl +} diff --git a/samples/data_account_flipgroups_list/main.tf b/samples/data_account_flipgroups_list/main.tf new file mode 100644 index 0000000..134d621 --- /dev/null +++ b/samples/data_account_flipgroups_list/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение информации о flipgroups, используемых аккаунтом + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_flipgroups_list" "afgl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 1111 +} + +output "test" { + value = data.decort_account_flipgroups_list.afgl +} diff --git a/samples/data_account_list/main.tf b/samples/data_account_list/main.tf new file mode 100644 index 0000000..722077a --- /dev/null +++ b/samples/data_account_list/main.tf @@ -0,0 +1,45 @@ +/* +Пример использования +Получение списка доступных аккаунтов + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_list" "al" { + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 2 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 3 +} + +output "test" { + value = data.decort_account_list.al +} diff --git a/samples/data_account_reserved_units/main.tf b/samples/data_account_reserved_units/main.tf new file mode 100644 index 0000000..5421b3a --- /dev/null +++ b/samples/data_account_reserved_units/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение информии о зарезервированных вычислительных мощностях + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_reserved_units" "aru" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 +} + +output "test" { + value = data.decort_account_reserved_units.aru +} diff --git a/samples/data_account_rg_list/main.tf b/samples/data_account_rg_list/main.tf new file mode 100644 index 0000000..13fbb6d --- /dev/null +++ b/samples/data_account_rg_list/main.tf @@ -0,0 +1,37 @@ +/* +Пример использования +Получение информации о ресурных группах, используемых аккаунтом +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_rg_list" "argl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 66666 +} + +output "test" { + value = data.decort_account_rg_list.argl +} diff --git a/samples/data_account_templates_list/main.tf b/samples/data_account_templates_list/main.tf new file mode 100644 index 0000000..276fe68 --- /dev/null +++ b/samples/data_account_templates_list/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение информации о шаблонах, используемых аккаунтом + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером + +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_templates_list" "atl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 +} + +output "test" { + value = data.decort_account_templates_list.atl +} diff --git a/samples/data_account_vins_list/main.tf b/samples/data_account_vins_list/main.tf new file mode 100644 index 0000000..e0e8eda --- /dev/null +++ b/samples/data_account_vins_list/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение списка vins, используемых аккаунтом + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_account_vins_list" "avl" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 22222 + +} + +output "test" { + value = data.decort_account_vins_list.avl +} diff --git a/samples/data_bservice/main.tf b/samples/data_bservice/main.tf new file mode 100644 index 0000000..1b82faf --- /dev/null +++ b/samples/data_bservice/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение информации о basic service + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_bservice" "b" { + #id сервиса + #обязательный параметр + #тип - число + service_id = 11111 + +} + +output "test" { + value = data.decort_bservice.b +} diff --git a/samples/data_bservice_deleted_list/main.tf b/samples/data_bservice_deleted_list/main.tf new file mode 100644 index 0000000..6a0a7d6 --- /dev/null +++ b/samples/data_bservice_deleted_list/main.tf @@ -0,0 +1,57 @@ +/* +Пример использования +Получение списка удаленных basic service +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_bservice_deleted_list" "bsdl" { + #id аккаунта для фильтрации данных + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #account_id = 11111 + + #id ресурсной группы, используется для фильтрации + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #rg_id = 11111 + + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 2 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 3 + +} + +output "test" { + value = data.decort_bservice_deleted_list.bsdl +} diff --git a/samples/data_bservice_group/main.tf b/samples/data_bservice_group/main.tf new file mode 100644 index 0000000..d859c3e --- /dev/null +++ b/samples/data_bservice_group/main.tf @@ -0,0 +1,44 @@ +/* +Пример использования +Получение информации о вычислительной группе, принадлежащей basic service + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_bservice_group" "bsg" { + #id сервиса + #обязательный параметр + #тип - число + service_id = 11111 + + #id вычислительной группы + #обязательный параметр + #тип - число + compgroup_id = 12121 + +} + +output "test" { + value = data.decort_bservice_group.bsg +} diff --git a/samples/data_bservice_list/main.tf b/samples/data_bservice_list/main.tf new file mode 100644 index 0000000..c87579c --- /dev/null +++ b/samples/data_bservice_list/main.tf @@ -0,0 +1,58 @@ +/* +Пример использования +Получение списка доступных базовых сервисов + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_bservice_list" "bsl" { + #id аккаунта для фильтрации данных + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #account_id = 11111 + + #id ресурсной группы, используется для фильтрации + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #rg_id = 11111 + + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 2 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 3 + +} + +output "test" { + value = data.decort_bservice_list.bsl +} diff --git a/samples/data_bservice_snapshot_list/main.tf b/samples/data_bservice_snapshot_list/main.tf new file mode 100644 index 0000000..a24097c --- /dev/null +++ b/samples/data_bservice_snapshot_list/main.tf @@ -0,0 +1,39 @@ +/* +Пример использования +Получение списка снимков состояний basic service + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_bservice_snapshot_list" "bsl" { + #id basic service + #обязательный параметр + #тип - число + service_id = 11111 +} + +output "test" { + value = data.decort_bservice_snapshot_list.bsl +} diff --git a/samples/data_disk_list/main.tf b/samples/data_disk_list/main.tf new file mode 100644 index 0000000..1074f83 --- /dev/null +++ b/samples/data_disk_list/main.tf @@ -0,0 +1,54 @@ +/* +Пример использования +Получение списка доступных дисков +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_disk_list" "dl" { + #id аккаунта для получения списка дисков + #опциональный параметр + #тип - число + #account_id = 11111 + + #тип диска + #опциональный параметр + #тип - строка + #возможные типы: "b" - boot_disk, "d" - data_disk + #type = "d" + + #кол-во страниц для вывода + #опицональный параметр + #тип - число + #page = 1 + + #размер страницы + #опицональный параметр + #тип - число + #size = 1 +} + +output "test" { + value = data.decort_disk_list.dl +} diff --git a/samples/data_extnet/main.tf b/samples/data_extnet/main.tf new file mode 100644 index 0000000..2694c76 --- /dev/null +++ b/samples/data_extnet/main.tf @@ -0,0 +1,38 @@ +/* +Пример использования +Получение информации о сети +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_extnet" "e" { + #идентификатор сети + #обязательный параметр + #тип - число + net_id = 1111 +} + +output "test" { + value = data.decort_extnet.e +} diff --git a/samples/data_extnet_computes_list/main.tf b/samples/data_extnet_computes_list/main.tf new file mode 100644 index 0000000..1879d37 --- /dev/null +++ b/samples/data_extnet_computes_list/main.tf @@ -0,0 +1,37 @@ +/* +Пример использования +Получение информации о вычислительных ресурсах, использующих сеть аккаунта +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_extnet_computes_list" "ecl" { + #идентификатор аккаунта + #обязательный параметр + #тип - число + account_id = 1111 +} + +output "test" { + value = data.decort_extnet_computes_list.ecl +} diff --git a/samples/data_extnet_default/main.tf b/samples/data_extnet_default/main.tf new file mode 100644 index 0000000..cf91c79 --- /dev/null +++ b/samples/data_extnet_default/main.tf @@ -0,0 +1,36 @@ +/* +Пример использования +Получение информации о сети по-умолчанию + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_extnet_default" "ed" { + +} + +output "test" { + value = data.decort_extnet_default.ed +} diff --git a/samples/data_extnet_list/main.tf b/samples/data_extnet_list/main.tf new file mode 100644 index 0000000..355a699 --- /dev/null +++ b/samples/data_extnet_list/main.tf @@ -0,0 +1,48 @@ +/* +Пример использования +Получение списка сетей + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_extnet_list" "el" { + #id аккаунта для фильтрации результата + #необязательный параметр + #тип - число + #account_id = 1111111 + + #кол-во страниц для вывода + #опицональный параметр + #тип - число + #page = 1 + + #размер страницы + #опицональный параметр + #тип - число + #size = 1 +} + +output "test" { + value = data.decort_extnet_list.el +} diff --git a/samples/data_rg_list/main.tf b/samples/data_rg_list/main.tf new file mode 100644 index 0000000..4b92e76 --- /dev/null +++ b/samples/data_rg_list/main.tf @@ -0,0 +1,49 @@ +/* +Пример использования +Получение списка всех resource groups + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_rg_list" "rl" { + #включение удаленных rg в результат поиска + #опциональный параметр + #тип - булев тип + #по-умолчанию - false + #includedeleted = true + + #номер страницы для отображения + #опциональный параметр, тип - число + #если не задан - выводятся все доступные данные + #page = 2 + + #размер страницы + #опциональный параметр, тип - число + #если не задан - выводятся все доступные данные + #size = 3 + +} + +output "test" { + value = data.decort_rg_list.rl +} diff --git a/samples/data_vins_list/main.tf b/samples/data_vins_list/main.tf new file mode 100644 index 0000000..0f44b92 --- /dev/null +++ b/samples/data_vins_list/main.tf @@ -0,0 +1,51 @@ +/* +Пример использования +Получение списка vins +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +data "decort_vins_list" "vl" { + #включение удаленных vins в результат + #опциональный параметр + #тип - будев тип + #если не задан - выводятся все неудаленные данные + #include_deleted = true + + #номер страницы для отображения + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #page = 1 + + #размер страницы + #опциональный параметр + #тип - число + #если не задан - выводятся все доступные данные + #size = 1 + +} + +output "test" { + value = data.decort_vins_list.vl +} diff --git a/samples/resource_account/main.tf b/samples/resource_account/main.tf new file mode 100644 index 0000000..86bd361 --- /dev/null +++ b/samples/resource_account/main.tf @@ -0,0 +1,157 @@ +/* +Пример использования +Ресурса account +Ресурс позволяет: +1. Создавать аккаунт +2. Редактировать аккаунт +3. Удалять аккаунт + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_account" "a" { + #имя аккаунта + #обязательный параметр + #тип - строка + #используется при создании и редактировании аккаунта + account_name = "new_my_account" + + #имя пользователя - создателя аккаунта + #обязательный параметр + #тип - строка + username = "username@decs3o" + + #доступность аккаунта + #необязательный параметр + #тип - булев тип + #может применяться при редактировании аккаунта + enable = true + + #id аккаунта, позволяет сформировать .tfstate, если аккаунт имеет в платформе + #необязательный параметр + #тип - число + account_id = 11111 + + #электронная почта, на которую будет отправлена информация о доступе + #необязательный параметр + #тип - строка + #применяется при создании аккаунта + emailaddress = "fff@fff.ff" + + #отправлять ли на электронную почту письмо о доступе + #необязательный параметр + #тип - булев тип + #применяется при создании аккаунта и редактировании аккаунта + send_access_emails = true + + #добавление/редактирование/удаление пользователей, к которым привязан аккаунт + #необязательный параметр + #тип - объект, кол-во таких объектов не ограничено + /*users { + #id пользователя + #обязательный параметр + #тип - строка + user_id = "username_2@decs3o" + + #тип доступа пользователя + #обязательный параметр + #тип - строка + #возможные параметры: + #R - чтение + #RCX - запись + #ARCXDU - админ + access_type = "R" + + #рекурсивное удаление пользователя из всех ресурсов аккаунтов + #необязательный параметр + #тип - булев тип + #по-умолчанию - false + #применяется при удалении пользователя из аккаунта + recursive_delete = true + } + users { + user_id = "username_1@decs3o" + access_type = "R" + }*/ + + #ограничение используемых ресурсов + #необязательный параметр + #тип - объект + #используется при создании и редактировании + resource_limits { + #кол-во используемых ядер cpu + #необязательный параметр + #тип - число + #если установлена -1 - кол-во неограиченно + cu_c = 2 + + #кол-во используемой RAM в МБ + #необязательный параметр + #тип - число + #если установлена -1 - кол-во неограиченно + cu_m = 1024 + + #размер дисков, в ГБ + #необязательный параметр + #тип - число + #если установлена -1 - размер неограичен + cu_d = 23 + + #кол-во используемых публичных IP + #необязательный параметр + #тип - число + #если установлена -1 - кол-во неограиченно + cu_i = 2 + + #ограничения на кол-во передачи данных, в ГБ + #необязательный параметр + #тип - число + #если установлена -1 - кол-во неограиченно + cu_np = 2 + + #кол-во графических процессоров + #необязательный параметр + #тип - число + #если установлена -1 - кол-во неограиченно + gpu_units = 2 + } + + #восстановление аккаунта + #необязательный параметр + #тип - булев тип + #применяется к удаленным аккаунтам + #по-умолчанию - false + #restore = false + + #мгновеное удаление аккаунта, если да - то аккаунт невозможно будет восстановить + #необязательный параметр + #тип - булев тип + #используется при удалении аккаунта + #по-умолчанию - false + #permanently = true +} + +output "test" { + value = decort_account.a +} diff --git a/samples/resource_bservice/main.tf b/samples/resource_bservice/main.tf new file mode 100644 index 0000000..b2b592a --- /dev/null +++ b/samples/resource_bservice/main.tf @@ -0,0 +1,110 @@ +/* +Пример использования +Ресурса cdrom image +Ресурс позволяет: +1. Создавать basic service +2. Редактировать basic service +3. Удалять basic service +4. Создавать снимки состояний basic service +5. Совершать восстановление по снимкам состояний +6. Удалять снимки состояний + +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_bservice" "b" { + #имя сервиса + #обязательный параметр + #тип - строка + service_name = "my_test_bservice_sn" + + #id ресурсной группы + #обязательный параметр + #тип - число + rg_id = 11111 + + #доступность сервиса + #необязательный параметр + #тип - булев тип + #используется при редактировании ресурса + #по-умолачанию - false + #enable = true + + #снимок состояния + #необязательный параметр + #тип - объект + #используется при редактировании ресурса + #может быть несколько в ресурсе + /* + snapshots { + #имя снимка состояния + #обязательный параметр + #тип - строка + label = "test_snapshot" + + #восстановление сервиса из снимка состояния + #необязательный параметр + #тип - булев тип + #по-умолчанию - false + #восстановление происходит только при переключении с false на true + rollback = false + } + snapshots { + label = "test_snapshot_1" + } + */ + + #старт сервиса + #необязательный параметр + #тип - булев тип + #используется при редактировании ресурса + #по-умолачанию - false + #start = false + + #восстановление сервиса после удаления + #необязательный параметр + #тип - булев тип + #используется при редактировании ресурса + #по-умолачанию - false + #restore = true + + #мгновенное удаление сервиса без права восстановления + #необязательный параметр + #тип - булев тип + #используется при удалении ресурса + #по-умолачанию - false + #permanently = true + + #id сервиса, позволяет сформировать .tfstate, если сервис есть в платформе + #необязательный параметр + #тип - булев тип + #используется при создании ресурса + #service_id = 11111 + + +} + +output "test" { + value = decort_bservice.b +} diff --git a/samples/resource_bservice_group/main.tf b/samples/resource_bservice_group/main.tf new file mode 100644 index 0000000..4b9b5f1 --- /dev/null +++ b/samples/resource_bservice_group/main.tf @@ -0,0 +1,150 @@ +/* +Пример использования +Работы с ресурсом basic service group +Ресурс позволяет: +1. Создавать группы +2. Редактировать группы +3. Удалять группы +*/ +#Расскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером +/* +terraform { + required_providers { + decort = { + version = "1.1" + source = "digitalenergy.online/decort/decort" + } + } +} +*/ + +provider "decort" { + authenticator = "oauth2" + #controller_url = + controller_url = "https://ds1.digitalenergy.online" + #oauth2_url = + oauth2_url = "https://sso.digitalenergy.online" + allow_unverified_ssl = true +} + +resource "decort_bservice_group" "bsg" { + #id basic service + #обязательный параметр + #тип - число + service_id = 444444 + + #название группы + #обязательный параметр + #тип - строка + compgroup_name = "tf_group_rename" + + #id группы + #необязательный параметр + #тип - число + #применяется при редактировании группы, либо при создании .tfstate - файла, если группа имеется в плафторме + compgroup_id = 33333 + + #кол-во вычислительных ресурсов + #обязательный параметр + #тип - число + #используется так же для редактирования группы + comp_count = 1 + + #кол-во ядер на выч. ресурс + #обязательный параметр + #тип - число + #используется так же для редактирования группы + cpu = 2 + + #кол-во оперативной памяти на выч. ресурс, в МБ + #обязательный параметр + #тип - число + #используется так же для редактирования группы + ram = 256 + + #размер диска для выч. ресурса, в ГБ + #обязательный параметр + #тип - число + #используется так же для редактирования группы + disk = 11 + + #id образа диска + #обязательный параметр + #тип - число + image_id = 2222 + + #драйвер + #обязательный параметр + #тип - число + driver = "kvm_x86" + + #id сетей extnet + #обязательный параметр + #тип - массив чисел + #должен быть использован vins или extnets + extnets = [1111] + + #id сетей vinses + #обязательный параметр + #тип - массив чисел + #должен быть использован vins или extnets + #vinses = [1111, 2222] + + #время таймуата перед стартом + #необязательный параметр + #тип - число + #используется при создании ресурса + #timeout_start = 0 + + #тег группы + #необязательный параметр + #тип - строка + #используется при создании и редактировании ресурса + # role = "tf_test_changed" + + #id групп родителей + #необязательный параметр + #тип - массив чисел + #используется при редактировании ресурса + #parents = [] + + #принудительное обновление параметров выч. мощностей (ram,disk,cpu) и имени группы + #необязательный параметр + #тип - булев тип + #используется при редактировании + #force_update = true + + #старт/стоп вычислительных мощностей + #необязательный параметр + #тип - булев тип + #используется при редактировании + #по-умолчанию - false + #start = false + + #принудительная остановка вычислительных мощностей + #необязательный параметр + #тип - булев тип + #используется при редактировании и остановке группы + #по-умолчанию - false + #force_stop = false + + #удаление вычислительных мощностей + #необязательный параметр + #тип - массив чисел + #используется при редактировании + #remove_computes = [32287] + + #режим увеличения числа выч. мощностей + #необязательный параметр + #тип - строка + #используется в связке с comp_count при редактировании группы + #возможные варианты - RELATIVE и ABSOLUTE + #mode = "RELATIVE" + +} + +output "test" { + value = decort_bservice_group.bsg +}