From 9a806a8e2c05b64bd932baceb8da0344500f4f72 Mon Sep 17 00:00:00 2001 From: kjubybot Date: Mon, 23 May 2022 12:46:46 +0300 Subject: [PATCH 01/20] made pool and sep_id optional and account_id required --- decort/resource_disk.go | 84 ++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/decort/resource_disk.go b/decort/resource_disk.go index a19bf08..8cba11f 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", @@ -166,8 +172,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 +204,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 +216,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 +262,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 +288,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." - }, */ } From 103038c0a38e92f7b57666d4805e660ce3b8463a Mon Sep 17 00:00:00 2001 From: stSolo Date: Mon, 23 May 2022 14:14:30 +0300 Subject: [PATCH 02/20] Add a data source rg_list --- decort/data_source_rg_list.go | 314 ++++++++++++++++++++++++++++++++++ decort/models_api.go | 51 ++++-- decort/provider.go | 1 + decort/utility_rg_list.go | 65 +++++++ samples/README.md | 1 + samples/data_rg_list/main.tf | 49 ++++++ 6 files changed, 463 insertions(+), 18 deletions(-) create mode 100644 decort/data_source_rg_list.go create mode 100644 decort/utility_rg_list.go create mode 100644 samples/data_rg_list/main.tf diff --git a/decort/data_source_rg_list.go b/decort/data_source_rg_list.go new file mode 100644 index 0000000..9220693 --- /dev/null +++ b/decort/data_source_rg_list.go @@ -0,0 +1,314 @@ +/* +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 ( + "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/models_api.go b/decort/models_api.go index 034cb17..b3e6f86 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -59,25 +59,40 @@ type AccountAclRecord struct { UgroupID string `json:"userGroupId"` } +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" diff --git a/decort/provider.go b/decort/provider.go index 2d9e3a9..00af955 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -138,6 +138,7 @@ func Provider() *schema.Provider { "decort_sep_config": dataSourceSepConfig(), "decort_sep_pool": dataSourceSepPool(), "decort_disk_list": dataSourceDiskList(), + "decort_rg_list": dataSourceRgList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index d2e8e05..6761a86 100644 --- a/samples/README.md +++ b/samples/README.md @@ -19,6 +19,7 @@ - sep_consumption - vgpu - disk_list + - rg_list - resources: - image - virtual_image 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 +} From c5e35b19f9c036db02def99e0f93445bbbb4b533 Mon Sep 17 00:00:00 2001 From: stSolo Date: Mon, 23 May 2022 19:19:48 +0300 Subject: [PATCH 03/20] Add data source function for account list --- decort/data_source_account_list.go | 266 +++++++++++++++++++++++++++++ decort/models_api.go | 83 +++++++++ decort/provider.go | 1 + decort/utility_account_list.go | 61 +++++++ samples/README.md | 1 + samples/data_account_list/main.tf | 45 +++++ 6 files changed, 457 insertions(+) create mode 100644 decort/data_source_account_list.go create mode 100644 decort/utility_account_list.go create mode 100644 samples/data_account_list/main.tf diff --git a/decort/data_source_account_list.go b/decort/data_source_account_list.go new file mode 100644 index 0000000..c6f6919 --- /dev/null +++ b/decort/data_source_account_list.go @@ -0,0 +1,266 @@ +/* +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 ( + "github.com/google/uuid" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +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{ + "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, + }, + }, + }, + }, + "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_id": { + 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, + }, + }, + }, + }, + "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, + }, + }, + }, + }, + }, + } + 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/models_api.go b/decort/models_api.go index b3e6f86..ea9dff4 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -987,3 +987,86 @@ type SepConfig map[string]interface{} type SepList []Sep type SepPool map[string]interface{} + +/////////////////////// +///// ACCOUNTS //// +/////////////////////// + +const accountAddUserAPI = "/cloudapi/account/addUser" +const accountAuditsAPI = "/cloudapi/account/audits" +const accountCreateAPI = "/cloudapi/account/create" +const accountDeleteAPI = "/cloudapi/account/delete" +const accountDeleteAccountsAPI = "/cloudapi/account/deleteAccounts" +const accountDeleteUserAPI = "/cloudapi/account/deleteUser" +const accountDisableAPI = "/cloudapi/account/disable" +const accountEnableAPI = "/cloudapi/account/enable" +const accountGetAPI = "/cloudapi/account/get" +const accountGetConsumedAccountUnitsAPI = "/cloudapi/account/getConsumedAccountUnits" +const accountGetConsumedCloudUnitsByTypeAPI = "/cloudapi/account/getConsumedCloudUnitsByType" +const accountGetConsumptionGetAPI = "/cloudapi/account/getConsumption" +const accountGetConsumptionPostAPI = "/cloudapi/account/getConsumption" +const accountGetReservedAccountUnitsAPI = "/cloudapi/account/getReservedAccountUnits" +const accountGetStatsAPI = "/cloudapi/account/getStats" + +//const accountListAPI = "/cloudapi/account/list" +const accountListAPI = "/restmachine/cloudbroker/account/list" +const accountListComputesAPI = "/cloudapi/account/listComputes" +const accountListCSAPI = "/cloudapi/account/listCS" +const accountListDeletedAPI = "/cloudapi/account/listDeleted" +const accountListDisksAPI = "/cloudapi/account/listDisks" +const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" +const accountListRGAPI = "/cloudapi/account/listRG" +const accountListTemplatesAPI = "/cloudapi/account/listTemplates" +const accountListVinsAPI = "/cloudapi/account/listVins" +const accountListVMsAPI = "/cloudapi/account/listVMs" +const accountRestoreAPI = "/cloudapi/account/restore" +const accountUpdateAPI = "/cloudapi/account/update" +const accountUpdateUserAPI = "/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 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 AccountWithResources struct { + Account + Resources Resources `json:"Resources"` +} diff --git a/decort/provider.go b/decort/provider.go index 00af955..7c7887e 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -139,6 +139,7 @@ func Provider() *schema.Provider { "decort_sep_pool": dataSourceSepPool(), "decort_disk_list": dataSourceDiskList(), "decort_rg_list": dataSourceRgList(), + "decort_account_list": dataSourceAccountList(), // "decort_pfw": dataSourcePfw(), }, diff --git a/decort/utility_account_list.go b/decort/utility_account_list.go new file mode 100644 index 0000000..828ecf9 --- /dev/null +++ b/decort/utility_account_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 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/samples/README.md b/samples/README.md index 6761a86..c4ff93c 100644 --- a/samples/README.md +++ b/samples/README.md @@ -20,6 +20,7 @@ - vgpu - disk_list - rg_list + - account_list - resources: - image - virtual_image 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 +} From fa748f6e5dec7cc1f743d75e0150cfa77f480868 Mon Sep 17 00:00:00 2001 From: stSolo Date: Tue, 24 May 2022 14:02:03 +0300 Subject: [PATCH 04/20] Add account computes list --- decort/data_source_account_computes_list.go | 189 ++++++++++++++++++++ decort/models_api.go | 31 +++- decort/provider.go | 47 ++--- decort/utility_account.go | 4 +- decort/utility_accout_computes_list.go | 56 ++++++ samples/account_computes_list/main.tf | 39 ++++ 6 files changed, 339 insertions(+), 27 deletions(-) create mode 100644 decort/data_source_account_computes_list.go create mode 100644 decort/utility_accout_computes_list.go create mode 100644 samples/account_computes_list/main.tf diff --git a/decort/data_source_account_computes_list.go b/decort/data_source_account_computes_list.go new file mode 100644 index 0000000..b4b99ad --- /dev/null +++ b/decort/data_source_account_computes_list.go @@ -0,0 +1,189 @@ +/* +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 ( + "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/models_api.go b/decort/models_api.go index ea9dff4..e02ed2c 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1008,9 +1008,11 @@ const accountGetConsumptionPostAPI = "/cloudapi/account/getConsumption" const accountGetReservedAccountUnitsAPI = "/cloudapi/account/getReservedAccountUnits" const accountGetStatsAPI = "/cloudapi/account/getStats" -//const accountListAPI = "/cloudapi/account/list" +//const accountListAPI = "/restmachine/cloudapi/account/list" const accountListAPI = "/restmachine/cloudbroker/account/list" -const accountListComputesAPI = "/cloudapi/account/listComputes" + +//const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" +const accountListComputesAPI = "/restmachine/cloudbroker/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" const accountListDeletedAPI = "/cloudapi/account/listDeleted" const accountListDisksAPI = "/cloudapi/account/listDisks" @@ -1070,3 +1072,28 @@ type AccountWithResources struct { Account Resources Resources `json:"Resources"` } + +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 diff --git a/decort/provider.go b/decort/provider.go index 7c7887e..c2a5fa5 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -117,29 +117,30 @@ func Provider() *schema.Provider { }, 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_disk_list": dataSourceDiskList(), - "decort_rg_list": dataSourceRgList(), - "decort_account_list": dataSourceAccountList(), + "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_pfw": dataSourcePfw(), }, diff --git a/decort/utility_account.go b/decort/utility_account.go index f1eaf34..c9a6def 100644 --- a/decort/utility_account.go +++ b/decort/utility_account.go @@ -110,8 +110,8 @@ func utilityGetAccountIdBySchema(d *schema.ResourceData, m interface{}) (int, er 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 + 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" */ diff --git a/decort/utility_accout_computes_list.go b/decort/utility_accout_computes_list.go new file mode 100644 index 0000000..6c92590 --- /dev/null +++ b/decort/utility_accout_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/samples/account_computes_list/main.tf b/samples/account_computes_list/main.tf new file mode 100644 index 0000000..26edae2 --- /dev/null +++ b/samples/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 +} From 5e515daafacd6b932bc39b7b5fab91f122e10068 Mon Sep 17 00:00:00 2001 From: stSolo Date: Tue, 24 May 2022 17:23:29 +0300 Subject: [PATCH 05/20] Add a account disks list --- decort/data_source_account_disks_list.go | 119 ++++++++++++++++++ decort/models_api.go | 15 ++- decort/provider.go | 1 + ...st.go => utility_account_computes_list.go} | 0 decort/utility_account_disks_list.go | 56 +++++++++ samples/account_disks_list/main.tf | 39 ++++++ 6 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 decort/data_source_account_disks_list.go rename decort/{utility_accout_computes_list.go => utility_account_computes_list.go} (100%) create mode 100644 decort/utility_account_disks_list.go create mode 100644 samples/account_disks_list/main.tf diff --git a/decort/data_source_account_disks_list.go b/decort/data_source_account_disks_list.go new file mode 100644 index 0000000..489f8eb --- /dev/null +++ b/decort/data_source_account_disks_list.go @@ -0,0 +1,119 @@ +/* +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 ( + "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 _, acc := range adl { + temp := map[string]interface{}{ + "disk_id": acc.ID, + "disk_name": acc.Name, + "pool": acc.Pool, + "sep_id": acc.SepId, + "size_max": acc.SizeMax, + "type": acc.Type, + } + res = append(res, temp) + } + return res + +} + +func dataSourceAccountDiskssListRead(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: dataSourceAccountDiskssListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &Timeout30s, + Default: &Timeout60s, + }, + + Schema: dataSourceAccountDisksListSchemaMake(), + } +} diff --git a/decort/models_api.go b/decort/models_api.go index e02ed2c..9c9b3a8 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1015,7 +1015,9 @@ const accountListAPI = "/restmachine/cloudbroker/account/list" const accountListComputesAPI = "/restmachine/cloudbroker/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" const accountListDeletedAPI = "/cloudapi/account/listDeleted" -const accountListDisksAPI = "/cloudapi/account/listDisks" + +//const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" +const accountListDisksAPI = "/restmachine/cloudbroker/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" const accountListRGAPI = "/cloudapi/account/listRG" const accountListTemplatesAPI = "/cloudapi/account/listTemplates" @@ -1097,3 +1099,14 @@ type AccountCompute struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index c2a5fa5..98760cf 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -141,6 +141,7 @@ func Provider() *schema.Provider { "decort_rg_list": dataSourceRgList(), "decort_account_list": dataSourceAccountList(), "decort_account_computes_list": dataSourceAccountComputesList(), + "decort_account_disks_list": dataSourceAccountDisksList(), // "decort_pfw": dataSourcePfw(), }, diff --git a/decort/utility_accout_computes_list.go b/decort/utility_account_computes_list.go similarity index 100% rename from decort/utility_accout_computes_list.go rename to decort/utility_account_computes_list.go 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/samples/account_disks_list/main.tf b/samples/account_disks_list/main.tf new file mode 100644 index 0000000..ff6b4fa --- /dev/null +++ b/samples/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 = 28096 + +} + +output "test" { + value = data.decort_account_disks_list.adl +} From d527d9b47483405cd6e5d8454470232327f88907 Mon Sep 17 00:00:00 2001 From: stSolo Date: Tue, 24 May 2022 18:53:02 +0300 Subject: [PATCH 06/20] Add an account vins list --- decort/data_source_account_disks_list.go | 18 +- decort/data_source_account_vins_list.go | 174 ++++++++++++++++++ decort/models_api.go | 26 ++- decort/provider.go | 1 + decort/utility_account_vins_list.go | 56 ++++++ .../main.tf | 0 .../main.tf | 0 samples/data_account_vins_list/main.tf | 39 ++++ 8 files changed, 304 insertions(+), 10 deletions(-) create mode 100644 decort/data_source_account_vins_list.go create mode 100644 decort/utility_account_vins_list.go rename samples/{account_computes_list => data_account_computes_list}/main.tf (100%) rename samples/{account_disks_list => data_account_disks_list}/main.tf (100%) create mode 100644 samples/data_account_vins_list/main.tf diff --git a/decort/data_source_account_disks_list.go b/decort/data_source_account_disks_list.go index 489f8eb..6c33ced 100644 --- a/decort/data_source_account_disks_list.go +++ b/decort/data_source_account_disks_list.go @@ -31,14 +31,14 @@ import ( func flattenAccountDisksList(adl AccountDisksList) []map[string]interface{} { res := make([]map[string]interface{}, 0) - for _, acc := range adl { + for _, ad := range adl { temp := map[string]interface{}{ - "disk_id": acc.ID, - "disk_name": acc.Name, - "pool": acc.Pool, - "sep_id": acc.SepId, - "size_max": acc.SizeMax, - "type": acc.Type, + "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) } @@ -46,7 +46,7 @@ func flattenAccountDisksList(adl AccountDisksList) []map[string]interface{} { } -func dataSourceAccountDiskssListRead(d *schema.ResourceData, m interface{}) error { +func dataSourceAccountDisksListRead(d *schema.ResourceData, m interface{}) error { accountDisksList, err := utilityAccountDisksListCheckPresence(d, m) if err != nil { return err @@ -107,7 +107,7 @@ func dataSourceAccountDisksList() *schema.Resource { return &schema.Resource{ SchemaVersion: 1, - Read: dataSourceAccountDiskssListRead, + Read: dataSourceAccountDisksListRead, Timeouts: &schema.ResourceTimeout{ Read: &Timeout30s, diff --git a/decort/data_source_account_vins_list.go b/decort/data_source_account_vins_list.go new file mode 100644 index 0000000..27307ff --- /dev/null +++ b/decort/data_source_account_vins_list.go @@ -0,0 +1,174 @@ +/* +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 ( + "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/models_api.go b/decort/models_api.go index 9c9b3a8..9b100f6 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1021,7 +1021,9 @@ const accountListDisksAPI = "/restmachine/cloudbroker/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" const accountListRGAPI = "/cloudapi/account/listRG" const accountListTemplatesAPI = "/cloudapi/account/listTemplates" -const accountListVinsAPI = "/cloudapi/account/listVins" + +//const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" +const accountListVinsAPI = "/restmachine/cloudbroker/account/listVins" const accountListVMsAPI = "/cloudapi/account/listVMs" const accountRestoreAPI = "/cloudapi/account/restore" const accountUpdateAPI = "/cloudapi/account/update" @@ -1110,3 +1112,25 @@ type AccountDisk struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index 98760cf..4f2f4ea 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -142,6 +142,7 @@ func Provider() *schema.Provider { "decort_account_list": dataSourceAccountList(), "decort_account_computes_list": dataSourceAccountComputesList(), "decort_account_disks_list": dataSourceAccountDisksList(), + "decort_account_vins_list": dataSourceAccountVinsList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/account_computes_list/main.tf b/samples/data_account_computes_list/main.tf similarity index 100% rename from samples/account_computes_list/main.tf rename to samples/data_account_computes_list/main.tf diff --git a/samples/account_disks_list/main.tf b/samples/data_account_disks_list/main.tf similarity index 100% rename from samples/account_disks_list/main.tf rename to samples/data_account_disks_list/main.tf diff --git a/samples/data_account_vins_list/main.tf b/samples/data_account_vins_list/main.tf new file mode 100644 index 0000000..da28996 --- /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 = 28096 + +} + +output "test" { + value = data.decort_account_vins_list.avl +} From 9912b04c2a8c1fc3ebf457a20eb4509ed831806e Mon Sep 17 00:00:00 2001 From: stSolo Date: Tue, 24 May 2022 19:22:29 +0300 Subject: [PATCH 07/20] Add data function account-audits-list --- decort/data_source_account_audits_list.go | 114 ++++++++++++++++++++++ decort/models_api.go | 14 ++- decort/provider.go | 1 + decort/utility_account_audits_list.go | 56 +++++++++++ samples/README.md | 4 + samples/data_account_audits_list/main.tf | 40 ++++++++ 6 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 decort/data_source_account_audits_list.go create mode 100644 decort/utility_account_audits_list.go create mode 100644 samples/data_account_audits_list/main.tf diff --git a/decort/data_source_account_audits_list.go b/decort/data_source_account_audits_list.go new file mode 100644 index 0000000..3475527 --- /dev/null +++ b/decort/data_source_account_audits_list.go @@ -0,0 +1,114 @@ +/* +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 ( + "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/models_api.go b/decort/models_api.go index 9b100f6..d783626 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -993,7 +993,9 @@ type SepPool map[string]interface{} /////////////////////// const accountAddUserAPI = "/cloudapi/account/addUser" -const accountAuditsAPI = "/cloudapi/account/audits" + +//const accountAuditsAPI = "/restmachine/cloudapi/account/audits" +const accountAuditsAPI = "/restmachine/cloudbroker/account/audits" const accountCreateAPI = "/cloudapi/account/create" const accountDeleteAPI = "/cloudapi/account/delete" const accountDeleteAccountsAPI = "/cloudapi/account/deleteAccounts" @@ -1134,3 +1136,13 @@ type AccountVin struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index 4f2f4ea..b2f9e45 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -143,6 +143,7 @@ func Provider() *schema.Provider { "decort_account_computes_list": dataSourceAccountComputesList(), "decort_account_disks_list": dataSourceAccountDisksList(), "decort_account_vins_list": dataSourceAccountVinsList(), + "decort_account_audits_list": dataSourceAccountAuditsList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index c4ff93c..7a61d08 100644 --- a/samples/README.md +++ b/samples/README.md @@ -21,6 +21,10 @@ - disk_list - rg_list - account_list + - account_computes_list + - account_disks_list + - account_vins_list + - account_audits_list - resources: - image - virtual_image diff --git a/samples/data_account_audits_list/main.tf b/samples/data_account_audits_list/main.tf new file mode 100644 index 0000000..a30b152 --- /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 = 28096 + +} + +output "test" { + value = data.decort_account_audits_list.aal +} From a0fbc8dd4f81027b06b80106ec02796e9b5d0de5 Mon Sep 17 00:00:00 2001 From: stSolo Date: Wed, 25 May 2022 10:58:29 +0300 Subject: [PATCH 08/20] Add data function for an account --- decort/data_source_account.go | 363 +++++++++++++++----- decort/data_source_account_audits_list.go | 4 +- decort/data_source_account_computes_list.go | 4 +- decort/data_source_account_disks_list.go | 4 +- decort/data_source_account_list.go | 4 +- decort/data_source_account_vins_list.go | 4 +- decort/models_api.go | 4 +- decort/resource_rg.go | 10 +- decort/utility_account.go | 124 +------ decort/utility_disk.go | 46 ++- decort/utility_rg.go | 12 +- samples/README.md | 1 + samples/data_account/main.tf | 39 +++ 13 files changed, 375 insertions(+), 244 deletions(-) create mode 100644 samples/data_account/main.tf diff --git a/decort/data_source_account.go b/decort/data_source_account.go index 735384f..2db3008 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,45 +25,298 @@ 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", flattenRgAcl(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) 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 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 +} + +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 +} - return flattenAccount(d, acc_facts) +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, + }, + }, + }, + }, + }, + }, + }, + "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, + }, + }, + }, + }, + "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, + }, + }, + }, + }, + "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, + }, + }, + } + return res } func dataSourceAccount() *schema.Resource { @@ -77,56 +330,6 @@ func dataSourceAccount() *schema.Resource { Default: &Timeout60s, }, - Schema: map[string]*schema.Schema{ - "name": { - Type: schema.TypeString, - Optional: true, - Description: "Name of the account. Names are case sensitive and unique.", - }, - - "account_id": { - Type: schema.TypeInt, - Optional: true, - Description: "Unique ID of the account. If account ID is specified, then account name is ignored.", - }, - - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Current status of the account.", - }, - - /* 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 - }, - 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, - }, - Description: "IDs of resource groups in this account." - }, - - "vins": { - Type: schema.TypeList, - Computed: true, - Elem: &schema.Schema { - Type: schema.TypeInt, - }, - Description: "IDs of VINSes created at the account level." - }, - */ - }, + Schema: dataSourceAccountSchemaMake(), } } diff --git a/decort/data_source_account_audits_list.go b/decort/data_source_account_audits_list.go index 3475527..c31e947 100644 --- a/decort/data_source_account_audits_list.go +++ b/decort/data_source_account_audits_list.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. diff --git a/decort/data_source_account_computes_list.go b/decort/data_source_account_computes_list.go index b4b99ad..8a7ba77 100644 --- a/decort/data_source_account_computes_list.go +++ b/decort/data_source_account_computes_list.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. diff --git a/decort/data_source_account_disks_list.go b/decort/data_source_account_disks_list.go index 6c33ced..def9676 100644 --- a/decort/data_source_account_disks_list.go +++ b/decort/data_source_account_disks_list.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. diff --git a/decort/data_source_account_list.go b/decort/data_source_account_list.go index c6f6919..866f232 100644 --- a/decort/data_source_account_list.go +++ b/decort/data_source_account_list.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. diff --git a/decort/data_source_account_vins_list.go b/decort/data_source_account_vins_list.go index 27307ff..e9d50e7 100644 --- a/decort/data_source_account_vins_list.go +++ b/decort/data_source_account_vins_list.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. diff --git a/decort/models_api.go b/decort/models_api.go index d783626..3c07f8b 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1002,7 +1002,9 @@ const accountDeleteAccountsAPI = "/cloudapi/account/deleteAccounts" const accountDeleteUserAPI = "/cloudapi/account/deleteUser" const accountDisableAPI = "/cloudapi/account/disable" const accountEnableAPI = "/cloudapi/account/enable" -const accountGetAPI = "/cloudapi/account/get" + +//const accountGetAPI = "/restmachine/cloudapi/account/get" +const accountGetAPI = "/restmachine/cloudbroker/account/get" const accountGetConsumedAccountUnitsAPI = "/cloudapi/account/getConsumedAccountUnits" const accountGetConsumedCloudUnitsByTypeAPI = "/cloudapi/account/getConsumedCloudUnitsByType" const accountGetConsumptionGetAPI = "/cloudapi/account/getConsumption" diff --git a/decort/resource_rg.go b/decort/resource_rg.go index 4a07cb6..5528bb4 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 @@ -77,10 +73,10 @@ func resourceResgroupCreate(d *schema.ResourceData, m interface{}) error { 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()) diff --git a/decort/utility_account.go b/decort/utility_account.go index c9a6def..f2b5e2e 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,31 @@ 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 - } - - 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) - 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 "", fmt.Errorf("Cannot find account name %q", accName.(string)) -} + urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) -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) + log.Debugf("utilityAccountCheckPresence: load account") + accountRaw, err := controller.decortAPICall("POST", accountGetAPI, urlValues) if err != nil { - return 0, err + return nil, 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_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_rg.go b/decort/utility_rg.go index 371e678..6a62ebd 100644 --- a/decort/utility_rg.go +++ b/decort/utility_rg.go @@ -104,7 +104,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 +124,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 +141,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,7 +159,7 @@ 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) { @@ -172,4 +168,4 @@ func utilityResgroupGetDefaultGridID() (interface{}, error) { } return "", fmt.Errorf("utilityResgroupGetDefaultGridID: invalid default Grid ID %d", DefaultGridID) - } +} diff --git a/samples/README.md b/samples/README.md index 7a61d08..3b091f7 100644 --- a/samples/README.md +++ b/samples/README.md @@ -25,6 +25,7 @@ - account_disks_list - account_vins_list - account_audits_list + - account - resources: - image - virtual_image diff --git a/samples/data_account/main.tf b/samples/data_account/main.tf new file mode 100644 index 0000000..1cc63dc --- /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 = 28096 + +} + +output "test" { + value = data.decort_account.a +} From 4a326e9ceb45f1fd7dfd9e05ccd13b7981f64c35 Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 12:26:11 +0300 Subject: [PATCH 09/20] Add a resource account --- decort/data_source_account.go | 84 +++- decort/data_source_account_list.go | 58 ++- decort/data_source_rg_list.go | 4 +- decort/models_api.go | 86 ++-- decort/provider.go | 1 + decort/resource_account.go | 729 +++++++++++++++++++++++++++++ decort/utility_account.go | 6 +- decort/utility_account_list.go | 28 ++ samples/resource_account/main.tf | 59 +++ 9 files changed, 1003 insertions(+), 52 deletions(-) create mode 100644 decort/resource_account.go create mode 100644 samples/resource_account/main.tf diff --git a/decort/data_source_account.go b/decort/data_source_account.go index 2db3008..39ef95c 100644 --- a/decort/data_source_account.go +++ b/decort/data_source_account.go @@ -41,7 +41,7 @@ func dataSourceAccountRead(d *schema.ResourceData, m interface{}) error { d.Set("resources", flattenAccResources(acc.Resources)) d.Set("ckey", acc.CKey) d.Set("meta", flattenMeta(acc.Meta)) - d.Set("acl", flattenRgAcl(acc.Acl)) + d.Set("acl", flattenAccAcl(acc.Acl)) d.Set("company", acc.Company) d.Set("companyurl", acc.CompanyUrl) d.Set("created_by", acc.CreatedBy) @@ -60,9 +60,49 @@ func dataSourceAccountRead(d *schema.ResourceData, m interface{}) error { 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 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 +} + +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 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 +} + func flattenAccResources(r Resources) []map[string]interface{} { res := make([]map[string]interface{}, 0) temp := map[string]interface{}{ @@ -188,6 +228,10 @@ func dataSourceAccountSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "can_be_deleted": { + Type: schema.TypeBool, + Computed: true, + }, "explicit": { Type: schema.TypeBool, Computed: true, @@ -315,6 +359,44 @@ func dataSourceAccountSchemaMake() map[string]*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, + }, } return res } diff --git a/decort/data_source_account_list.go b/decort/data_source_account_list.go index 866f232..b587bda 100644 --- a/decort/data_source_account_list.go +++ b/decort/data_source_account_list.go @@ -29,6 +29,24 @@ import ( "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 { @@ -36,31 +54,42 @@ func flattenAccountList(al AccountList) []map[string]interface{} { "dc_location": acc.DCLocation, "ckey": acc.CKey, "meta": flattenMeta(acc.Meta), - "acl": flattenRgAcl(acc.Acl), + + "acl": flattenRgAcl(acc.Acl), + "company": acc.Company, "companyurl": acc.CompanyUrl, "created_by": acc.CreatedBy, - "created_time": acc.CreatedTime, + + "created_time": acc.CreatedTime, + "deactivation_time": acc.DeactiovationTime, "deleted_by": acc.DeletedBy, - "deleted_time": acc.DeletedTime, + + "deleted_time": acc.DeletedTime, + "displayname": acc.DisplayName, "guid": acc.GUID, - "account_id": acc.ID, - "account_name": acc.Name, + + "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, + + "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) @@ -92,6 +121,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + /*uncomment for cloudbroker "dc_location": { Type: schema.TypeString, Computed: true, @@ -106,7 +136,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Elem: &schema.Schema{ Type: schema.TypeString, }, - }, + },*/ "acl": { Type: schema.TypeList, Computed: true, @@ -139,6 +169,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { }, }, }, + /*uncomment for cloudbroker "company": { Type: schema.TypeString, Computed: true, @@ -151,10 +182,12 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + */ "created_time": { Type: schema.TypeInt, Computed: true, }, + /*uncomment for cloudbroker "deactivation_time": { Type: schema.TypeFloat, Computed: true, @@ -163,10 +196,12 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + */ "deleted_time": { Type: schema.TypeInt, Computed: true, }, + /*uncomment for cloudbroker "displayname": { Type: schema.TypeString, Computed: true, @@ -175,6 +210,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + */ "account_id": { Type: schema.TypeInt, Computed: true, @@ -183,6 +219,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + /*uncomment for cloudbroker "resource_limits": { Type: schema.TypeList, Computed: true, @@ -224,6 +261,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeBool, Computed: true, }, + */ "status": { Type: schema.TypeString, Computed: true, @@ -232,6 +270,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + /*uncomment for cloudbroker "version": { Type: schema.TypeInt, Computed: true, @@ -243,6 +282,7 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, }, }, + */ }, }, }, diff --git a/decort/data_source_rg_list.go b/decort/data_source_rg_list.go index 9220693..73afce5 100644 --- a/decort/data_source_rg_list.go +++ b/decort/data_source_rg_list.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. diff --git a/decort/models_api.go b/decort/models_api.go index 3c07f8b..80b5ffd 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -51,12 +51,13 @@ 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 { @@ -992,46 +993,28 @@ type SepPool map[string]interface{} ///// ACCOUNTS //// /////////////////////// -const accountAddUserAPI = "/cloudapi/account/addUser" - -//const accountAuditsAPI = "/restmachine/cloudapi/account/audits" -const accountAuditsAPI = "/restmachine/cloudbroker/account/audits" -const accountCreateAPI = "/cloudapi/account/create" -const accountDeleteAPI = "/cloudapi/account/delete" +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 accountDeleteAccountsAPI = "/cloudapi/account/deleteAccounts" -const accountDeleteUserAPI = "/cloudapi/account/deleteUser" -const accountDisableAPI = "/cloudapi/account/disable" -const accountEnableAPI = "/cloudapi/account/enable" - -//const accountGetAPI = "/restmachine/cloudapi/account/get" -const accountGetAPI = "/restmachine/cloudbroker/account/get" -const accountGetConsumedAccountUnitsAPI = "/cloudapi/account/getConsumedAccountUnits" -const accountGetConsumedCloudUnitsByTypeAPI = "/cloudapi/account/getConsumedCloudUnitsByType" -const accountGetConsumptionGetAPI = "/cloudapi/account/getConsumption" -const accountGetConsumptionPostAPI = "/cloudapi/account/getConsumption" -const accountGetReservedAccountUnitsAPI = "/cloudapi/account/getReservedAccountUnits" -const accountGetStatsAPI = "/cloudapi/account/getStats" - -//const accountListAPI = "/restmachine/cloudapi/account/list" -const accountListAPI = "/restmachine/cloudbroker/account/list" - -//const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" -const accountListComputesAPI = "/restmachine/cloudbroker/account/listComputes" +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 accountListAPI = "/restmachine/cloudapi/account/list" +const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" const accountListDeletedAPI = "/cloudapi/account/listDeleted" - -//const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" -const accountListDisksAPI = "/restmachine/cloudbroker/account/listDisks" +const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" const accountListRGAPI = "/cloudapi/account/listRG" const accountListTemplatesAPI = "/cloudapi/account/listTemplates" - -//const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" -const accountListVinsAPI = "/restmachine/cloudbroker/account/listVins" +const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" const accountListVMsAPI = "/cloudapi/account/listVMs" -const accountRestoreAPI = "/cloudapi/account/restore" -const accountUpdateAPI = "/cloudapi/account/update" -const accountUpdateUserAPI = "/cloudapi/account/updateUser" +const accountRestoreAPI = "/restmachine/cloudapi/account/restore" +const accountUpdateAPI = "/restmachine/cloudapi/account/update" +const accountUpdateUserAPI = "/restmachine/cloudapi/account/updateUser" ////Structs @@ -1062,6 +1045,18 @@ type Account struct { 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"` @@ -1076,9 +1071,22 @@ type Resources struct { 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 { diff --git a/decort/provider.go b/decort/provider.go index b2f9e45..7145229 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -114,6 +114,7 @@ func Provider() *schema.Provider { "decort_pcidevice": resourcePcidevice(), "decort_sep": resourceSep(), "decort_sep_config": resourceSepConfig(), + "decort_account": resourceAccount(), }, DataSourcesMap: map[string]*schema.Resource{ diff --git a/decort/resource_account.go b/decort/resource_account.go new file mode 100644 index 0000000..05cd238 --- /dev/null +++ b/decort/resource_account.go @@ -0,0 +1,729 @@ +/* +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 sep 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 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + } + if resLimitConv["cu_d"] != nil { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + } + if resLimitConv["cu_c"] != nil { + urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + } + if resLimitConv["cu_i"] != nil { + urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + } + if resLimitConv["cu_np"] != nil { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + } + if resLimitConv["gpu_units"] != nil { + urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + } + } + + 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("resourceSepRead") + + 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 { + urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + } + if resLimitConv["cu_d"] != nil { + urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + } + if resLimitConv["cu_c"] != nil { + urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + } + if resLimitConv["cu_i"] != nil { + urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + } + if resLimitConv["cu_np"] != nil { + urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + } + if resLimitConv["gpu_units"] != nil { + urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + } + + 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.ToUpper(elOldConv["access_type"].(string)) != strings.ToUpper(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/utility_account.go b/decort/utility_account.go index f2b5e2e..136a939 100644 --- a/decort/utility_account.go +++ b/decort/utility_account.go @@ -39,7 +39,11 @@ func utilityAccountCheckPresence(d *schema.ResourceData, m interface{}) (*Accoun controller := m.(*ControllerCfg) urlValues := &url.Values{} - urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int))) + 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()) + } log.Debugf("utilityAccountCheckPresence: load account") accountRaw, err := controller.decortAPICall("POST", accountGetAPI, urlValues) diff --git a/decort/utility_account_list.go b/decort/utility_account_list.go index 828ecf9..0dd3514 100644 --- a/decort/utility_account_list.go +++ b/decort/utility_account_list.go @@ -34,6 +34,33 @@ import ( "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) @@ -59,3 +86,4 @@ func utilityAccountListCheckPresence(d *schema.ResourceData, m interface{}) (Acc return accountList, nil } +*/ diff --git a/samples/resource_account/main.tf b/samples/resource_account/main.tf new file mode 100644 index 0000000..1b456be --- /dev/null +++ b/samples/resource_account/main.tf @@ -0,0 +1,59 @@ +/* +Пример использования +Ресурса 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 +} + +resource "decort_account" "a" { + #id аккаунта + #обязательный параметр + #тип - число + account_id = 11111 + account_name = "new_my_account" + username = "isername@decs3o" + enable = true + send_access_emails = true + /*users { + user_id = "username_2@decs3o" + access_type = "R" + } + users { + user_id = "username_1@decs3o" + access_type = "R" + }*/ + resource_limits { + cu_m = 1024 + } + + +} + +output "test" { + value = decort_account.a +} From 9f5b4ab771b7200f29b47f02ace3b16472ef653b Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 13:48:58 +0300 Subject: [PATCH 10/20] Add a data for account rg list --- decort/data_source_account_rg_list.go | 294 ++++++++++++++++++++++++++ decort/models_api.go | 31 ++- decort/provider.go | 1 + decort/utility_account_rg_list.go | 56 +++++ samples/README.md | 2 + samples/data_account_rg_list/main.tf | 37 ++++ 6 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 decort/data_source_account_rg_list.go create mode 100644 decort/utility_account_rg_list.go create mode 100644 samples/data_account_rg_list/main.tf 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/models_api.go b/decort/models_api.go index 80b5ffd..69745b4 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1008,7 +1008,7 @@ const accountListCSAPI = "/cloudapi/account/listCS" const accountListDeletedAPI = "/cloudapi/account/listDeleted" const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" -const accountListRGAPI = "/cloudapi/account/listRG" +const accountListRGAPI = "/restmachine/cloudapi/account/listRG" const accountListTemplatesAPI = "/cloudapi/account/listTemplates" const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" const accountListVMsAPI = "/cloudapi/account/listVMs" @@ -1156,3 +1156,32 @@ type AccountAudit struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index 7145229..aba1acc 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -145,6 +145,7 @@ func Provider() *schema.Provider { "decort_account_disks_list": dataSourceAccountDisksList(), "decort_account_vins_list": dataSourceAccountVinsList(), "decort_account_audits_list": dataSourceAccountAuditsList(), + "decort_account_rg_list": dataSourceAccountRGList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index 3b091f7..20326fc 100644 --- a/samples/README.md +++ b/samples/README.md @@ -26,6 +26,7 @@ - account_vins_list - account_audits_list - account + - account_rg_list - resources: - image - virtual_image @@ -37,6 +38,7 @@ - pcidevice - sep - sep_config + - account ## Как пользоваться примерами 1. Установить terraform diff --git a/samples/data_account_rg_list/main.tf b/samples/data_account_rg_list/main.tf new file mode 100644 index 0000000..48d5418 --- /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 = 88366 +} + +output "test" { + value = data.decort_account_rg_list.argl +} From 839841aee4f41b096ceb0818039e8693ddc5bfac Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 15:11:53 +0300 Subject: [PATCH 11/20] Add data for account consumed units --- decort/data_account_consumed_units.go | 98 +++++++++++++++++++++ decort/models_api.go | 1 + decort/provider.go | 57 ++++++------ decort/utility_account_consumed_units.go | 56 ++++++++++++ samples/README.md | 1 + samples/data_account_consumed_units/main.tf | 37 ++++++++ 6 files changed, 222 insertions(+), 28 deletions(-) create mode 100644 decort/data_account_consumed_units.go create mode 100644 decort/utility_account_consumed_units.go create mode 100644 samples/data_account_consumed_units/main.tf diff --git a/decort/data_account_consumed_units.go b/decort/data_account_consumed_units.go new file mode 100644 index 0000000..6723e17 --- /dev/null +++ b/decort/data_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/models_api.go b/decort/models_api.go index 69745b4..d1a7d9b 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1002,6 +1002,7 @@ 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 accountListAPI = "/restmachine/cloudapi/account/list" const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" diff --git a/decort/provider.go b/decort/provider.go index aba1acc..cd0ff67 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -118,34 +118,35 @@ func Provider() *schema.Provider { }, 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_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": 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_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index 20326fc..ca7b7b6 100644 --- a/samples/README.md +++ b/samples/README.md @@ -27,6 +27,7 @@ - account_audits_list - account - account_rg_list + - account_counsumed_units - resources: - image - virtual_image diff --git a/samples/data_account_consumed_units/main.tf b/samples/data_account_consumed_units/main.tf new file mode 100644 index 0000000..b12b1df --- /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 = 88366 +} + +output "test" { + value = data.decort_account_consumed_units.acu +} From a685a91f868b2fcaa5b070a94630d20a627eea10 Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 16:01:50 +0300 Subject: [PATCH 12/20] Add data for account consumed units by type --- decort/data_account_consumed_units_by_type.go | 78 +++++++++++++++++++ decort/models_api.go | 1 + decort/provider.go | 59 +++++++------- .../utility_account_consumed_units_by_type.go | 55 +++++++++++++ samples/README.md | 1 + .../main.tf | 54 +++++++++++++ 6 files changed, 219 insertions(+), 29 deletions(-) create mode 100644 decort/data_account_consumed_units_by_type.go create mode 100644 decort/utility_account_consumed_units_by_type.go create mode 100644 samples/data_account_consumed_units_by_type/main.tf diff --git a/decort/data_account_consumed_units_by_type.go b/decort/data_account_consumed_units_by_type.go new file mode 100644 index 0000000..4b9ccd6 --- /dev/null +++ b/decort/data_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/models_api.go b/decort/models_api.go index d1a7d9b..b321d0e 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1003,6 +1003,7 @@ 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 accountListAPI = "/restmachine/cloudapi/account/list" const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" diff --git a/decort/provider.go b/decort/provider.go index cd0ff67..a12a61c 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -118,35 +118,36 @@ func Provider() *schema.Provider { }, 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_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": 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_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index ca7b7b6..dbc389e 100644 --- a/samples/README.md +++ b/samples/README.md @@ -28,6 +28,7 @@ - account - account_rg_list - account_counsumed_units + - account_counsumed_units_by_type - resources: - image - virtual_image 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..67d3043 --- /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 = 88366 + + #тип вычислительной еденицы + #обязательный параметр + #тип - строка + #значения: + #cu_c - кол-во виртуальных cpu ядер + #cu_m - кол-во RAM в МБ + #cu_d - кол-в используемой дисковой памяти, в ГБ + #cu_i - кол-во публичных ip адресов + #cu_np - кол-во полученного/отданного трафика, в ГБ + #gpu_units - кол-во gpu ядер + cu_type = "cu_a" +} + +output "test" { + value = data.decort_account_consumed_units_by_type.acubt +} From 96c4175e74ccf68e9518228223ddbeadb51981d7 Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 18:23:38 +0300 Subject: [PATCH 13/20] Add data for account reserved units --- decort/data_account_reserved_units.go | 98 +++++++++++++++++++++ decort/models_api.go | 1 + decort/provider.go | 1 + decort/utility_account_reserved_units.go | 56 ++++++++++++ samples/README.md | 1 + samples/data_account_reserved_units/main.tf | 38 ++++++++ 6 files changed, 195 insertions(+) create mode 100644 decort/data_account_reserved_units.go create mode 100644 decort/utility_account_reserved_units.go create mode 100644 samples/data_account_reserved_units/main.tf diff --git a/decort/data_account_reserved_units.go b/decort/data_account_reserved_units.go new file mode 100644 index 0000000..b4d48c9 --- /dev/null +++ b/decort/data_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/models_api.go b/decort/models_api.go index b321d0e..ce6f97f 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1004,6 +1004,7 @@ 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 accountListCSAPI = "/cloudapi/account/listCS" diff --git a/decort/provider.go b/decort/provider.go index a12a61c..66f2ce6 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -148,6 +148,7 @@ func Provider() *schema.Provider { "decort_account_rg_list": dataSourceAccountRGList(), "decort_account_consumed_units": dataSourceAccountConsumedUnits(), "decort_account_consumed_units_by_type": dataSourceAccountConsumedUnitsByType(), + "decort_account_reserved_units": dataSourceAccountReservedUnits(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index dbc389e..85e8dc0 100644 --- a/samples/README.md +++ b/samples/README.md @@ -29,6 +29,7 @@ - account_rg_list - account_counsumed_units - account_counsumed_units_by_type + - account_reserved_units - resources: - image - virtual_image diff --git a/samples/data_account_reserved_units/main.tf b/samples/data_account_reserved_units/main.tf new file mode 100644 index 0000000..f86a3dc --- /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 = 88366 +} + +output "test" { + value = data.decort_account_reserved_units.aru +} From 61b8765c82af2f4bf4e467539ec6c4ad7a988dfd Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 19:39:49 +0300 Subject: [PATCH 14/20] Add data for account templates lis --- decort/data_account_templates_list.go | 139 ++++++++++++++++++++ decort/models_api.go | 17 ++- decort/provider.go | 1 + decort/utility_account_templates_list.go | 56 ++++++++ samples/README.md | 1 + samples/data_account_templates_list/main.tf | 38 ++++++ 6 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 decort/data_account_templates_list.go create mode 100644 decort/utility_account_templates_list.go create mode 100644 samples/data_account_templates_list/main.tf diff --git a/decort/data_account_templates_list.go b/decort/data_account_templates_list.go new file mode 100644 index 0000000..4071088 --- /dev/null +++ b/decort/data_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/models_api.go b/decort/models_api.go index ce6f97f..cbdf434 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1012,7 +1012,7 @@ const accountListDeletedAPI = "/cloudapi/account/listDeleted" const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" const accountListRGAPI = "/restmachine/cloudapi/account/listRG" -const accountListTemplatesAPI = "/cloudapi/account/listTemplates" +const accountListTemplatesAPI = "/restmachine/cloudapi/account/listTemplates" const accountListVinsAPI = "/restmachine/cloudapi/account/listVins" const accountListVMsAPI = "/cloudapi/account/listVMs" const accountRestoreAPI = "/restmachine/cloudapi/account/restore" @@ -1188,3 +1188,18 @@ type AccountRG struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index 66f2ce6..0e48ce6 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -149,6 +149,7 @@ func Provider() *schema.Provider { "decort_account_consumed_units": dataSourceAccountConsumedUnits(), "decort_account_consumed_units_by_type": dataSourceAccountConsumedUnitsByType(), "decort_account_reserved_units": dataSourceAccountReservedUnits(), + "decort_account_templates_list": dataSourceAccountTemplatessList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index 85e8dc0..291ac14 100644 --- a/samples/README.md +++ b/samples/README.md @@ -30,6 +30,7 @@ - account_counsumed_units - account_counsumed_units_by_type - account_reserved_units + - account_templates_list - resources: - image - virtual_image 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 +} From eb22dee25b2be9670b31bb5218294a5ac6a818b5 Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 27 May 2022 20:17:25 +0300 Subject: [PATCH 15/20] Add data for account deleted list --- decort/data_account_deleted_list.go | 58 +++++++++++++++++++++ decort/models_api.go | 3 +- decort/provider.go | 1 + decort/utility_account_deleted_list.go | 61 +++++++++++++++++++++++ samples/README.md | 1 + samples/data_account_deleted_list/main.tf | 45 +++++++++++++++++ 6 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 decort/data_account_deleted_list.go create mode 100644 decort/utility_account_deleted_list.go create mode 100644 samples/data_account_deleted_list/main.tf diff --git a/decort/data_account_deleted_list.go b/decort/data_account_deleted_list.go new file mode 100644 index 0000000..d2a57c5 --- /dev/null +++ b/decort/data_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/models_api.go b/decort/models_api.go index cbdf434..7e893eb 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -997,7 +997,6 @@ 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 accountDeleteAccountsAPI = "/cloudapi/account/deleteAccounts" const accountDeleteUserAPI = "/restmachine/cloudapi/account/deleteUser" const accountDisableAPI = "/restmachine/cloudapi/account/disable" const accountEnableAPI = "/restmachine/cloudapi/account/enable" @@ -1008,7 +1007,7 @@ const accountGetReservedUnitsAPI = "/restmachine/cloudapi/account/getReservedAcc const accountListAPI = "/restmachine/cloudapi/account/list" const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" const accountListCSAPI = "/cloudapi/account/listCS" -const accountListDeletedAPI = "/cloudapi/account/listDeleted" +const accountListDeletedAPI = "/restmachine/cloudapi/account/listDeleted" const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" const accountListRGAPI = "/restmachine/cloudapi/account/listRG" diff --git a/decort/provider.go b/decort/provider.go index 0e48ce6..22c365e 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -150,6 +150,7 @@ func Provider() *schema.Provider { "decort_account_consumed_units_by_type": dataSourceAccountConsumedUnitsByType(), "decort_account_reserved_units": dataSourceAccountReservedUnits(), "decort_account_templates_list": dataSourceAccountTemplatessList(), + "decort_account_deleted_list": dataSourceAccountDeletedList(), // "decort_pfw": dataSourcePfw(), }, 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/samples/README.md b/samples/README.md index 291ac14..db5b79e 100644 --- a/samples/README.md +++ b/samples/README.md @@ -31,6 +31,7 @@ - account_counsumed_units_by_type - account_reserved_units - account_templates_list + - account_deleted_list - resources: - image - virtual_image 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 +} From b70cdcabf669db273a6f860f100cf749a3d2f7b4 Mon Sep 17 00:00:00 2001 From: stSolo Date: Sat, 28 May 2022 19:23:17 +0300 Subject: [PATCH 16/20] Rename files --- ...nt_consumed_units.go => data_source_account_consumed_units.go} | 0 ...s_by_type.go => data_source_account_consumed_units_by_type.go} | 0 ...ccount_deleted_list.go => data_source_account_deleted_list.go} | 0 ...nt_reserved_units.go => data_source_account_reserved_units.go} | 0 ...nt_templates_list.go => data_source_account_templates_list.go} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename decort/{data_account_consumed_units.go => data_source_account_consumed_units.go} (100%) rename decort/{data_account_consumed_units_by_type.go => data_source_account_consumed_units_by_type.go} (100%) rename decort/{data_account_deleted_list.go => data_source_account_deleted_list.go} (100%) rename decort/{data_account_reserved_units.go => data_source_account_reserved_units.go} (100%) rename decort/{data_account_templates_list.go => data_source_account_templates_list.go} (100%) diff --git a/decort/data_account_consumed_units.go b/decort/data_source_account_consumed_units.go similarity index 100% rename from decort/data_account_consumed_units.go rename to decort/data_source_account_consumed_units.go diff --git a/decort/data_account_consumed_units_by_type.go b/decort/data_source_account_consumed_units_by_type.go similarity index 100% rename from decort/data_account_consumed_units_by_type.go rename to decort/data_source_account_consumed_units_by_type.go diff --git a/decort/data_account_deleted_list.go b/decort/data_source_account_deleted_list.go similarity index 100% rename from decort/data_account_deleted_list.go rename to decort/data_source_account_deleted_list.go diff --git a/decort/data_account_reserved_units.go b/decort/data_source_account_reserved_units.go similarity index 100% rename from decort/data_account_reserved_units.go rename to decort/data_source_account_reserved_units.go diff --git a/decort/data_account_templates_list.go b/decort/data_source_account_templates_list.go similarity index 100% rename from decort/data_account_templates_list.go rename to decort/data_source_account_templates_list.go From 95ab4e37c4927190364676745ff2c4bd95f762cf Mon Sep 17 00:00:00 2001 From: stSolo Date: Sat, 28 May 2022 19:53:41 +0300 Subject: [PATCH 17/20] Add data for flipgroups list --- decort/data_source_account_flipgroups_list.go | 194 ++++++++++++++++++ decort/models_api.go | 30 ++- decort/provider.go | 1 + decort/utility_account_flip_groups.go | 56 +++++ samples/data_account_flipgroups_list/main.tf | 38 ++++ 5 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 decort/data_source_account_flipgroups_list.go create mode 100644 decort/utility_account_flip_groups.go create mode 100644 samples/data_account_flipgroups_list/main.tf 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/models_api.go b/decort/models_api.go index 7e893eb..119f11e 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1006,14 +1006,12 @@ const accountGetConsumedUnitsByTypeAPI = "/restmachine/cloudapi/account/getConsu const accountGetReservedUnitsAPI = "/restmachine/cloudapi/account/getReservedAccountUnits" const accountListAPI = "/restmachine/cloudapi/account/list" const accountListComputesAPI = "/restmachine/cloudapi/account/listComputes" -const accountListCSAPI = "/cloudapi/account/listCS" const accountListDeletedAPI = "/restmachine/cloudapi/account/listDeleted" const accountListDisksAPI = "/restmachine/cloudapi/account/listDisks" -const accountListFlipGroupsAPI = "/cloudapi/account/listFlipGroups" +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 accountListVMsAPI = "/cloudapi/account/listVMs" const accountRestoreAPI = "/restmachine/cloudapi/account/restore" const accountUpdateAPI = "/restmachine/cloudapi/account/update" const accountUpdateUserAPI = "/restmachine/cloudapi/account/updateUser" @@ -1202,3 +1200,29 @@ type AccountTemplate struct { } 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 diff --git a/decort/provider.go b/decort/provider.go index 22c365e..030b263 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -151,6 +151,7 @@ func Provider() *schema.Provider { "decort_account_reserved_units": dataSourceAccountReservedUnits(), "decort_account_templates_list": dataSourceAccountTemplatessList(), "decort_account_deleted_list": dataSourceAccountDeletedList(), + "decort_account_flipgroups_list": dataSourceAccountFlipGroupsList(), // "decort_pfw": dataSourcePfw(), }, 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/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 +} From c73a6e0d71eacae05f7c35d5a6def70d0a9f73dd Mon Sep 17 00:00:00 2001 From: stSolo Date: Mon, 30 May 2022 11:38:26 +0300 Subject: [PATCH 18/20] Fix resource account, add comment for a resource account sample --- decort/resource_account.go | 91 +++++++++++++++++++---- samples/resource_account/main.tf | 122 ++++++++++++++++++++++++++++--- 2 files changed, 189 insertions(+), 24 deletions(-) diff --git a/decort/resource_account.go b/decort/resource_account.go index 05cd238..a113092 100644 --- a/decort/resource_account.go +++ b/decort/resource_account.go @@ -69,24 +69,56 @@ func resourceAccountCreate(d *schema.ResourceData, m interface{}) error { if resLimits, ok := d.GetOk("resource_limits"); ok { resLimit := resLimits.([]interface{})[0] resLimitConv := resLimit.(map[string]interface{}) - if resLimitConv["cu_m"] != nil { - urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + 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 { - urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + 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 { - urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + 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 { - urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + 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 { - urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + 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 { - urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + gpuUnits := int(resLimitConv["gpu_units"].(float64)) + if gpuUnits == 0 { + urlValues.Add("gpu_units", strconv.Itoa(-1)) + } else { + urlValues.Add("gpu_units", strconv.Itoa(gpuUnits)) + } } } @@ -223,22 +255,55 @@ func resourceAccountEdit(d *schema.ResourceData, m interface{}) error { resLimitConv := resLimit.(map[string]interface{}) if resLimitConv["cu_m"] != nil { - urlValues.Add("maxMemoryCapacity", strconv.Itoa(int(resLimitConv["cu_m"].(float64)))) + 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 { - urlValues.Add("maxVDiskCapacity", strconv.Itoa(int(resLimitConv["cu_d"].(float64)))) + 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 { - urlValues.Add("maxCPUCapacity", strconv.Itoa(int(resLimitConv["cu_c"].(float64)))) + 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 { - urlValues.Add("maxNumPublicIP", strconv.Itoa(int(resLimitConv["cu_i"].(float64)))) + 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 { - urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(int(resLimitConv["cu_np"].(float64)))) + 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 { - urlValues.Add("gpu_units", strconv.Itoa(int(resLimitConv["gpu_units"].(float64)))) + 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))) diff --git a/samples/resource_account/main.tf b/samples/resource_account/main.tf index 1b456be..f8bcf72 100644 --- a/samples/resource_account/main.tf +++ b/samples/resource_account/main.tf @@ -1,16 +1,16 @@ /* Пример использования -Ресурса cdrom image +Ресурса account Ресурс позволяет: -1. Создавать образ -2. Редактировать образ -3. Удалять образ +1. Создавать аккаунт +2. Редактировать аккаунт +3. Удалять аккаунт */ #Расскомментируйте этот код, #и внесите необходимые правки в версию и путь, #чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером - +/* terraform { required_providers { decort = { @@ -19,7 +19,7 @@ terraform { } } } - +*/ provider "decort" { authenticator = "oauth2" @@ -31,26 +31,126 @@ provider "decort" { } resource "decort_account" "a" { - #id аккаунта + #имя аккаунта + #обязательный параметр + #тип - строка + #используется при создании и редактировании аккаунта + account_name = "new_my_account" + + #имя пользователя - создателя аккаунта #обязательный параметр + #тип - строка + username = "username@decs3o" + + #доступность аккаунта + #необязательный параметр + #тип - будев тип + #может применяться при редактировании аккаунта + enable = true + + #id аккаунта, позволяет сформировать .tfstate, если аккаунт имеет в платформе + #необязательный параметр #тип - число - account_id = 11111 - account_name = "new_my_account" - username = "isername@decs3o" - enable = true + 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 + #retore = false + + #мгновеное удаление аккаунта, если да - то аккаунт невозможно будет восстановить + #необязательный параметр + #тип - булев тип + #используется при удалении аккаунта + #по-умолчанию - false + #permanently = true + } From 8d1b13f7b798143ef13085b24f80904760dd0f81 Mon Sep 17 00:00:00 2001 From: stSolo Date: Fri, 3 Jun 2022 11:22:42 +0300 Subject: [PATCH 19/20] Add bservice, extnet, vins --- README.md | 3 +- README_EN.md | 3 +- 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_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_vins_list.go | 178 +++++ decort/models_api.go | 258 ++++++++ decort/provider.go | 44 +- decort/resource_account.go | 4 +- decort/resource_bservice.go | 554 ++++++++++++++++ decort/resource_bservice_group.go | 660 +++++++++++++++++++ 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_extnet.go | 56 ++ decort/utility_extnet_computes_list.go | 56 ++ decort/utility_extnet_default.go | 46 ++ decort/utility_extnet_list.go | 64 ++ decort/utility_vins_list.go | 64 ++ samples/README.md | 10 + 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_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_vins_list/main.tf | 51 ++ samples/resource_bservice/main.tf | 110 ++++ samples/resource_bservice_group/main.tf | 150 +++++ 40 files changed, 4613 insertions(+), 20 deletions(-) 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_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_vins_list.go create mode 100644 decort/resource_bservice.go create mode 100644 decort/resource_bservice_group.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_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 create mode 100644 decort/utility_vins_list.go 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_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_vins_list/main.tf create mode 100644 samples/resource_bservice/main.tf create mode 100644 samples/resource_bservice_group/main.tf diff --git a/README.md b/README.md index a53f213..3981b12 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,8 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с snapshots, - Работа с pcidevice, - Работа с sep, -- Работа с vgpu. +- Работа с vgpu, +- Работа с bservice. Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki diff --git a/README_EN.md b/README_EN.md index db2650f..87bcea6 100644 --- a/README_EN.md +++ b/README_EN.md @@ -17,7 +17,8 @@ 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. This provider supports Import operations on pre-existing resources. 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_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_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/models_api.go b/decort/models_api.go index 119f11e..89e8676 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -1226,3 +1226,261 @@ type AccountFlipGroup struct { } 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/provider.go b/decort/provider.go index 030b263..eea3dda 100644 --- a/decort/provider.go +++ b/decort/provider.go @@ -99,22 +99,24 @@ 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_account": resourceAccount(), + "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{ @@ -152,6 +154,16 @@ func Provider() *schema.Provider { "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/resource_account.go b/decort/resource_account.go index a113092..e266560 100644 --- a/decort/resource_account.go +++ b/decort/resource_account.go @@ -51,7 +51,7 @@ func resourceAccountCreate(d *schema.ResourceData, m interface{}) error { return nil } - return errors.New("provided sep id does not exist") + return errors.New("provided account id does not exist") } controller := m.(*ControllerCfg) @@ -142,7 +142,7 @@ func resourceAccountCreate(d *schema.ResourceData, m interface{}) error { } func resourceAccountRead(d *schema.ResourceData, m interface{}) error { - log.Debugf("resourceSepRead") + log.Debugf("resourceAccountRead") acc, err := utilityAccountCheckPresence(d, m) if acc == nil { 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..7d14e16 --- /dev/null +++ b/decort/resource_bservice_group.go @@ -0,0 +1,660 @@ +/* +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, + }, + "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/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_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..d07f306 --- /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(d *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_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/samples/README.md b/samples/README.md index db5b79e..1e8d2a4 100644 --- a/samples/README.md +++ b/samples/README.md @@ -32,6 +32,14 @@ - account_reserved_units - account_templates_list - account_deleted_list + - bservice_list + - bservice + - bservice_group + - extnet_default + - extnet_list + - extnet + - extnet_computes_list + - vins_list - resources: - image - virtual_image @@ -44,6 +52,8 @@ - sep - sep_config - account + - bservice + - bservice_group ## Как пользоваться примерами 1. Установить terraform 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..96cb9c5 --- /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 back service + #обязательный параметр + #тип - число + service_id = 11111 +} + +output "test" { + value = data.decort_bservice_snapshot_list.bsl +} 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_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_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..70cb5ad --- /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 back 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 +} From c7b54717a153dc2ad18c70e0df53b28a2f82a0d8 Mon Sep 17 00:00:00 2001 From: stSolo Date: Tue, 7 Jun 2022 18:59:19 +0300 Subject: [PATCH 20/20] Fix erratas --- README.md | 3 +- README_EN.md | 3 +- decort/resource_bservice_group.go | 1 + samples/data_account/main.tf | 2 +- samples/data_account_audits_list/main.tf | 2 +- samples/data_account_consumed_units/main.tf | 2 +- .../main.tf | 6 ++-- samples/data_account_disks_list/main.tf | 2 +- samples/data_account_reserved_units/main.tf | 2 +- samples/data_account_rg_list/main.tf | 2 +- samples/data_account_vins_list/main.tf | 2 +- samples/data_bservice_snapshot_list/main.tf | 2 +- samples/resource_account/main.tf | 28 +++++++++---------- samples/resource_bservice_group/main.tf | 4 +-- 14 files changed, 31 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 3981b12..36687f1 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с pcidevice, - Работа с sep, - Работа с vgpu, -- Работа с bservice. +- Работа с bservice, +- Работа с extnets. Вики проекта: https://github.com/rudecs/terraform-provider-decort/wiki diff --git a/README_EN.md b/README_EN.md index 87bcea6..396d151 100644 --- a/README_EN.md +++ b/README_EN.md @@ -18,7 +18,8 @@ NOTE: provider rc-1.25 is designed for DECORT API 3.7.x. For older API versions - Work with pcidevice. - Work with sep, - Work with vgpu, -- Work with bservice. +- Work with bservice, +- Work with extnets. This provider supports Import operations on pre-existing resources. diff --git a/decort/resource_bservice_group.go b/decort/resource_bservice_group.go index 7d14e16..6bbff5a 100644 --- a/decort/resource_bservice_group.go +++ b/decort/resource_bservice_group.go @@ -518,6 +518,7 @@ func resourceBasicServiceGroupSchemaMake() map[string]*schema.Schema { "compgroup_id": { Type: schema.TypeInt, Optional: true, + Computed: true, }, "account_id": { Type: schema.TypeInt, diff --git a/samples/data_account/main.tf b/samples/data_account/main.tf index 1cc63dc..af70baa 100644 --- a/samples/data_account/main.tf +++ b/samples/data_account/main.tf @@ -30,7 +30,7 @@ data "decort_account" "a" { #id аккаунта #обязательный параметр #тип - число - account_id = 28096 + account_id = 11111 } diff --git a/samples/data_account_audits_list/main.tf b/samples/data_account_audits_list/main.tf index a30b152..1cd48f5 100644 --- a/samples/data_account_audits_list/main.tf +++ b/samples/data_account_audits_list/main.tf @@ -31,7 +31,7 @@ data "decort_account_audits_list" "aal" { #id аккаунта #обязательный параметр #тип - число - account_id = 28096 + account_id = 11111 } diff --git a/samples/data_account_consumed_units/main.tf b/samples/data_account_consumed_units/main.tf index b12b1df..bfe2c2b 100644 --- a/samples/data_account_consumed_units/main.tf +++ b/samples/data_account_consumed_units/main.tf @@ -29,7 +29,7 @@ data "decort_account_consumed_units" "acu" { #id аккаунта #обязательный параметр #тип - число - account_id = 88366 + account_id = 22222 } output "test" { diff --git a/samples/data_account_consumed_units_by_type/main.tf b/samples/data_account_consumed_units_by_type/main.tf index 67d3043..35ed80b 100644 --- a/samples/data_account_consumed_units_by_type/main.tf +++ b/samples/data_account_consumed_units_by_type/main.tf @@ -34,9 +34,9 @@ data "decort_account_consumed_units_by_type" "acubt" { #id аккаунта #обязательный параметр #тип - число - account_id = 88366 + account_id = 33333 - #тип вычислительной еденицы + #тип вычислительной единицы #обязательный параметр #тип - строка #значения: @@ -46,7 +46,7 @@ data "decort_account_consumed_units_by_type" "acubt" { #cu_i - кол-во публичных ip адресов #cu_np - кол-во полученного/отданного трафика, в ГБ #gpu_units - кол-во gpu ядер - cu_type = "cu_a" + cu_type = "cu_с" } output "test" { diff --git a/samples/data_account_disks_list/main.tf b/samples/data_account_disks_list/main.tf index ff6b4fa..c0ac605 100644 --- a/samples/data_account_disks_list/main.tf +++ b/samples/data_account_disks_list/main.tf @@ -30,7 +30,7 @@ data "decort_account_disks_list" "adl" { #id аккаунта #обязательный параметр #тип - число - account_id = 28096 + account_id = 11111 } diff --git a/samples/data_account_reserved_units/main.tf b/samples/data_account_reserved_units/main.tf index f86a3dc..5421b3a 100644 --- a/samples/data_account_reserved_units/main.tf +++ b/samples/data_account_reserved_units/main.tf @@ -30,7 +30,7 @@ data "decort_account_reserved_units" "aru" { #id аккаунта #обязательный параметр #тип - число - account_id = 88366 + account_id = 11111 } output "test" { diff --git a/samples/data_account_rg_list/main.tf b/samples/data_account_rg_list/main.tf index 48d5418..13fbb6d 100644 --- a/samples/data_account_rg_list/main.tf +++ b/samples/data_account_rg_list/main.tf @@ -29,7 +29,7 @@ data "decort_account_rg_list" "argl" { #id аккаунта #обязательный параметр #тип - число - account_id = 88366 + account_id = 66666 } output "test" { diff --git a/samples/data_account_vins_list/main.tf b/samples/data_account_vins_list/main.tf index da28996..e0e8eda 100644 --- a/samples/data_account_vins_list/main.tf +++ b/samples/data_account_vins_list/main.tf @@ -30,7 +30,7 @@ data "decort_account_vins_list" "avl" { #id аккаунта #обязательный параметр #тип - число - account_id = 28096 + account_id = 22222 } diff --git a/samples/data_bservice_snapshot_list/main.tf b/samples/data_bservice_snapshot_list/main.tf index 96cb9c5..a24097c 100644 --- a/samples/data_bservice_snapshot_list/main.tf +++ b/samples/data_bservice_snapshot_list/main.tf @@ -28,7 +28,7 @@ provider "decort" { } data "decort_bservice_snapshot_list" "bsl" { - #id back service + #id basic service #обязательный параметр #тип - число service_id = 11111 diff --git a/samples/resource_account/main.tf b/samples/resource_account/main.tf index f8bcf72..86bd361 100644 --- a/samples/resource_account/main.tf +++ b/samples/resource_account/main.tf @@ -44,7 +44,7 @@ resource "decort_account" "a" { #доступность аккаунта #необязательный параметр - #тип - будев тип + #тип - булев тип #может применяться при редактировании аккаунта enable = true @@ -102,38 +102,38 @@ resource "decort_account" "a" { resource_limits { #кол-во используемых ядер cpu #необязательный параметр - #тип - ичсло - #если установлена -1 - кол-во неограичено + #тип - число + #если установлена -1 - кол-во неограиченно cu_c = 2 #кол-во используемой RAM в МБ #необязательный параметр - #тип - ичсло - #если установлена -1 - кол-во неограичено + #тип - число + #если установлена -1 - кол-во неограиченно cu_m = 1024 #размер дисков, в ГБ #необязательный параметр - #тип - ичсло + #тип - число #если установлена -1 - размер неограичен cu_d = 23 #кол-во используемых публичных IP #необязательный параметр - #тип - ичсло - #если установлена -1 - кол-во неограичено + #тип - число + #если установлена -1 - кол-во неограиченно cu_i = 2 #ограничения на кол-во передачи данных, в ГБ #необязательный параметр - #тип - ичсло - #если установлена -1 - кол-во неограичено + #тип - число + #если установлена -1 - кол-во неограиченно cu_np = 2 #кол-во графических процессоров #необязательный параметр - #тип - ичсло - #если установлена -1 - кол-во неограичено + #тип - число + #если установлена -1 - кол-во неограиченно gpu_units = 2 } @@ -142,7 +142,7 @@ resource "decort_account" "a" { #тип - булев тип #применяется к удаленным аккаунтам #по-умолчанию - false - #retore = false + #restore = false #мгновеное удаление аккаунта, если да - то аккаунт невозможно будет восстановить #необязательный параметр @@ -150,8 +150,6 @@ resource "decort_account" "a" { #используется при удалении аккаунта #по-умолчанию - false #permanently = true - - } output "test" { diff --git a/samples/resource_bservice_group/main.tf b/samples/resource_bservice_group/main.tf index 70cb5ad..4b9b5f1 100644 --- a/samples/resource_bservice_group/main.tf +++ b/samples/resource_bservice_group/main.tf @@ -30,7 +30,7 @@ provider "decort" { } resource "decort_bservice_group" "bsg" { - #id back service + #id basic service #обязательный параметр #тип - число service_id = 444444 @@ -138,7 +138,7 @@ resource "decort_bservice_group" "bsg" { #режим увеличения числа выч. мощностей #необязательный параметр - #тип - число + #тип - строка #используется в связке с comp_count при редактировании группы #возможные варианты - RELATIVE и ABSOLUTE #mode = "RELATIVE"