This commit is contained in:
KasimBaybikov
2023-05-04 10:08:25 +03:00
parent 9bad8a6947
commit 8ca233dd32
288 changed files with 6645 additions and 11464 deletions

View File

@@ -1,57 +0,0 @@
/*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
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.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package rg
const (
ResgroupCreateAPI = "/restmachine/cloudapi/rg/create"
ResgroupUpdateAPI = "/restmachine/cloudapi/rg/update"
ResgroupListAPI = "/restmachine/cloudapi/rg/list"
ResgroupListDeletedAPI = "/restmachine/cloudapi/rg/listDeleted"
ResgroupListPfwAPI = "/restmachine/cloudapi/rg/listPFW"
ResgroupGetAPI = "/restmachine/cloudapi/rg/get"
ResgroupListVinsAPI = "/restmachine/cloudapi/rg/listVins"
ResgroupListLbAPI = "/restmachine/cloudapi/rg/listLb"
ResgroupDeleteAPI = "/restmachine/cloudapi/rg/delete"
RgListComputesAPI = "/restmachine/cloudapi/rg/listComputes"
RgAffinityGroupComputesAPI = "/restmachine/cloudapi/rg/affinityGroupComputes"
RgAffinityGroupsGetAPI = "/restmachine/cloudapi/rg/affinityGroupsGet"
RgAffinityGroupsListAPI = "/restmachine/cloudapi/rg/affinityGroupsList"
RgAuditsAPI = "/restmachine/cloudapi/rg/audits"
RgEnableAPI = "/restmachine/cloudapi/rg/enable"
RgDisableAPI = "/restmachine/cloudapi/rg/disable"
ResgroupUsageAPI = "/restmachine/cloudapi/rg/usage"
RgAccessGrantAPI = "/restmachine/cloudapi/rg/accessGrant"
RgAccessRevokeAPI = "/restmachine/cloudapi/rg/accessRevoke"
RgSetDefNetAPI = "/restmachine/cloudapi/rg/setDefNet"
RgRestoreAPI = "/restmachine/cloudapi/rg/restore"
)

View File

@@ -384,6 +384,14 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"cpu_allocation_parameter": {
Type: schema.TypeString,
Computed: true,
},
"cpu_allocation_ratio": {
Type: schema.TypeFloat,
Computed: true,
},
}
return res
}

View File

@@ -204,6 +204,14 @@ func dataSourceRgListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"cpu_allocation_parameter": {
Type: schema.TypeString,
Computed: true,
},
"cpu_allocation_ratio": {
Type: schema.TypeFloat,
Computed: true,
},
"uniq_pools": {
Type: schema.TypeList,
Computed: true,

View File

@@ -34,10 +34,10 @@ package rg
import (
"encoding/json"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
)
func flattenAccountSeps(seps map[string]map[string]DiskUsage) []map[string]interface{} {
@@ -83,22 +83,10 @@ func flattenRgResources(r Resources) []map[string]interface{} {
return res
}
func flattenResgroup(d *schema.ResourceData, details RecordResourceGroup) error {
// NOTE: this function modifies ResourceData argument - as such it should never be called
// from resourceRsgroupExists(...) method
// log.Debugf("%s", rg_facts)
//log.Debugf("flattenResgroup: ready to decode response body from API")
//details := ResgroupGetResp{}
//err := json.Unmarshal([]byte(rg_facts), &details)
//if err != nil {
//return err
//}
func flattenResgroup(d *schema.ResourceData, details rg.RecordResourceGroup) error {
log.Debugf("flattenResgroup: decoded RG name %q / ID %d, account ID %d",
details.Name, details.ID, details.AccountID)
d.SetId(fmt.Sprintf("%d", details.ID))
d.Set("account_id", details.AccountID)
d.Set("gid", details.GID)
d.Set("def_net_type", details.DefNetType)
@@ -127,11 +115,13 @@ func flattenResgroup(d *schema.ResourceData, details RecordResourceGroup) error
d.Set("updated_time", details.UpdatedTime)
d.Set("uniq_pools", details.UniqPools)
d.Set("vins", details.VINS)
d.Set("cpu_allocation_parameter", details.CPUAllocationParameter)
d.Set("cpu_allocation_ratio", details.CPUAllocationRatio)
return nil
}
func flattenRgSeps(seps map[string]map[string]DiskUsage) []map[string]interface{} {
func flattenRgSeps(seps map[string]map[string]rg.DiskUsage) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for sepKey, sepVal := range seps {
SepMap := map[string]interface{}{}
@@ -148,7 +138,7 @@ func flattenRgSeps(seps map[string]map[string]DiskUsage) []map[string]interface{
return res
}
func flattenResource(resource Resource) []map[string]interface{} {
func flattenResource(resource rg.Resource) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
@@ -167,7 +157,7 @@ func flattenResource(resource Resource) []map[string]interface{} {
return res
}
func flattenRgResource(itemResource Resources) []map[string]interface{} {
func flattenRgResource(itemResource rg.Resources) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
"current": flattenResource(itemResource.Current),
@@ -178,7 +168,7 @@ func flattenRgResource(itemResource Resources) []map[string]interface{} {
return res
}
func flattenRg(d *schema.ResourceData, itemRg RecordResourceGroup) {
func flattenRg(d *schema.ResourceData, itemRg rg.RecordResourceGroup) {
d.Set("resources", flattenRgResource(itemRg.Resources))
d.Set("account_id", itemRg.AccountID)
d.Set("account_name", itemRg.AccountName)
@@ -207,9 +197,11 @@ func flattenRg(d *schema.ResourceData, itemRg RecordResourceGroup) {
d.Set("updated_time", itemRg.UpdatedTime)
d.Set("uniq_pools", itemRg.UniqPools)
d.Set("vins", itemRg.VINS)
d.Set("cpu_allocation_parameter", itemRg.CPUAllocationParameter)
d.Set("cpu_allocation_ratio", itemRg.CPUAllocationRatio)
}
func flattenRgAudits(rgAudits ListAudits) []map[string]interface{} {
func flattenRgAudits(rgAudits rg.ListAudits) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, rgAudit := range rgAudits {
temp := map[string]interface{}{
@@ -226,38 +218,40 @@ func flattenRgAudits(rgAudits ListAudits) []map[string]interface{} {
return res
}
func flattenRgList(rgl ListResourceGroups) []map[string]interface{} {
func flattenRgList(rgl rg.ListResourceGroups) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, rg := range rgl {
temp := map[string]interface{}{
"account_acl": flattenRgAcl(rg.ACL),
"account_id": rg.AccountID,
"account_name": rg.AccountName,
"acl": flattenRgAcl(rg.ACL),
"created_by": rg.CreatedBy,
"created_time": rg.CreatedTime,
"def_net_id": rg.DefNetID,
"def_net_type": rg.DefNetType,
"deleted_by": rg.DeletedBy,
"deleted_time": rg.DeletedTime,
"desc": rg.Description,
"dirty": rg.Dirty,
"gid": rg.GID,
"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,
"resource_types": rg.ResTypes,
"uniq_pools": rg.UniqPools,
"account_acl": flattenRgAcl(rg.ACL),
"account_id": rg.AccountID,
"account_name": rg.AccountName,
"acl": flattenRgAcl(rg.ACL),
"created_by": rg.CreatedBy,
"created_time": rg.CreatedTime,
"def_net_id": rg.DefNetID,
"def_net_type": rg.DefNetType,
"deleted_by": rg.DeletedBy,
"deleted_time": rg.DeletedTime,
"desc": rg.Description,
"dirty": rg.Dirty,
"gid": rg.GID,
"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,
"resource_types": rg.ResTypes,
"uniq_pools": rg.UniqPools,
"cpu_allocation_parameter": rg.CPUAllocationParameter,
"cpu_allocation_ratio": rg.CPUAllocationRatio,
}
res = append(res, temp)
}
@@ -265,7 +259,7 @@ func flattenRgList(rgl ListResourceGroups) []map[string]interface{} {
}
func flattenRgAcl(rgAcls ListACL) []map[string]interface{} {
func flattenRgAcl(rgAcls rg.ListACL) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, rgAcl := range rgAcls {
temp := map[string]interface{}{
@@ -281,7 +275,7 @@ func flattenRgAcl(rgAcls ListACL) []map[string]interface{} {
return res
}
func flattenRgResourceLimits(rl ResourceLimits) []map[string]interface{} {
func flattenRgResourceLimits(rl rg.ResourceLimits) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
"cu_c": rl.CUC,
@@ -289,7 +283,7 @@ func flattenRgResourceLimits(rl ResourceLimits) []map[string]interface{} {
"cu_i": rl.CUI,
"cu_m": rl.CUM,
"cu_np": rl.CUNP,
"gpu_units": rl.GpuUnits,
"gpu_units": rl.GPUUnits,
}
res = append(res, temp)
@@ -297,7 +291,7 @@ func flattenRgResourceLimits(rl ResourceLimits) []map[string]interface{} {
}
func flattenRules(list ListRules) []map[string]interface{} {
func flattenRules(list rg.ListRules) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, rule := range list {
temp := map[string]interface{}{
@@ -315,7 +309,7 @@ func flattenRules(list ListRules) []map[string]interface{} {
return res
}
func flattenRgListComputes(lc ListComputes) []map[string]interface{} {
func flattenRgListComputes(lc rg.ListComputes) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, compute := range lc {
temp := map[string]interface{}{
@@ -350,7 +344,7 @@ func flattenRgListComputes(lc ListComputes) []map[string]interface{} {
return res
}
func flattenServerSettings(settings ServerSettings) []map[string]interface{} {
func flattenServerSettings(settings rg.RecordServerSettings) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
"inter": settings.Inter,
@@ -367,7 +361,7 @@ func flattenServerSettings(settings ServerSettings) []map[string]interface{} {
return res
}
func flattenListServers(list ListServers) []map[string]interface{} {
func flattenListServers(list rg.ListServers) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, serv := range list {
temp := map[string]interface{}{
@@ -384,7 +378,7 @@ func flattenListServers(list ListServers) []map[string]interface{} {
return res
}
func flattenBackends(b ListBackends) []map[string]interface{} {
func flattenBackends(b rg.ListBackends) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, item := range b {
temp := map[string]interface{}{
@@ -399,7 +393,7 @@ func flattenBackends(b ListBackends) []map[string]interface{} {
return res
}
func flattenBindings(list ListBindings) []map[string]interface{} {
func flattenBindings(list rg.ListBindings) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, bind := range list {
temp := map[string]interface{}{
@@ -414,7 +408,7 @@ func flattenBindings(list ListBindings) []map[string]interface{} {
return res
}
func flattenFrontends(list ListFrontends) []map[string]interface{} {
func flattenFrontends(list rg.ListFrontends) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, front := range list {
temp := map[string]interface{}{
@@ -429,7 +423,7 @@ func flattenFrontends(list ListFrontends) []map[string]interface{} {
return res
}
func flattenNode(node RecordNode) []map[string]interface{} {
func flattenNode(node rg.RecordNode) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
temp := map[string]interface{}{
"backend_ip": node.BackendIP,
@@ -443,7 +437,7 @@ func flattenNode(node RecordNode) []map[string]interface{} {
return res
}
func flattenRgListLb(listLb ListLB) []map[string]interface{} {
func flattenRgListLb(listLb rg.ListLB) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, lb := range listLb {
temp := map[string]interface{}{
@@ -478,7 +472,7 @@ func flattenRgListLb(listLb ListLB) []map[string]interface{} {
return res
}
func flattenRgListPfw(listPfw ListPFW) []map[string]interface{} {
func flattenRgListPfw(listPfw rg.ListPortForwards) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, pfw := range listPfw {
temp := map[string]interface{}{
@@ -497,7 +491,7 @@ func flattenRgListPfw(listPfw ListPFW) []map[string]interface{} {
return res
}
func flattenRgListVins(lv ListVINS) []map[string]interface{} {
func flattenRgListVins(lv rg.ListVINS) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, vins := range lv {
temp := map[string]interface{}{
@@ -525,7 +519,7 @@ func flattenRgListVins(lv ListVINS) []map[string]interface{} {
return res
}
func flattenRgAffinityGroupComputes(list ListAffinityGroupCompute) []map[string]interface{} {
func flattenRgAffinityGroupComputes(list rg.ListAffinityGroups) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, item := range list {
@@ -567,12 +561,12 @@ func flattenRgListGroups(list map[string][]uint64) []map[string]interface{} {
return res
}
func flattenRgUsageResource(d *schema.ResourceData, usage Resource) {
func flattenRgUsageResource(d *schema.ResourceData, usage rg.RecordResourceUsage) {
d.Set("cpu", usage.CPU)
d.Set("disk_size", usage.DiskSize)
d.Set("disk_size_max", usage.DiskSizeMax)
d.Set("extips", usage.ExtIPs)
d.Set("exttraffic", usage.ExtTraffic)
d.Set("exttraffic", usage.ExtraTraffic)
d.Set("gpu", usage.GPU)
d.Set("ram", usage.RAM)
d.Set("seps", flattenRgSeps(usage.SEPs))

View File

@@ -42,12 +42,12 @@ type ResourceLimits struct {
}
type QuotaRecord struct { // this is how quota is reported by /api/.../rg/get
Cpu int `json:"CU_C"` // CPU count in pcs
Cpu int `json:"CU_C"` // CPU count in pcs
Ram float64 `json:"CU_M"` // RAM volume in MB, it is STILL reported as FLOAT
Disk int `json:"CU_D"` // Disk capacity in GB
ExtIPs int `json:"CU_I"` // Ext IPs count
ExtTraffic int `json:"CU_NP"` // Ext network traffic
GpuUnits int `json:"gpu_units"` // GPU count
Disk int `json:"CU_D"` // Disk capacity in GB
ExtIPs int `json:"CU_I"` // Ext IPs count
ExtTraffic int `json:"CU_NP"` // Ext network traffic
GpuUnits int `json:"gpu_units"` // GPU count
}
// Main information about audit

View File

@@ -39,7 +39,7 @@ import (
func makeQuotaRecord(arg_list []interface{}) QuotaRecord {
quota := QuotaRecord{
Cpu: -1,
Ram: -1., // this is float64, but may change in the future
Ram: -1,
Disk: -1,
ExtTraffic: -1,
ExtIPs: -1,

View File

@@ -34,111 +34,54 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/account"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/extnet"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/locations"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func existAccountID(ctx context.Context, d *schema.ResourceData, m interface{}) (bool, error) {
c := m.(*controller.ControllerCfg)
accountId := uint64(d.Get("account_id").(int))
urlValues := &url.Values{}
req := account.ListRequest{}
accountList := []struct {
ID int `json:"id"`
}{}
accountListAPI := "/restmachine/cloudapi/account/list"
accountListRaw, err := c.DecortAPICall(ctx, "POST", accountListAPI, urlValues)
accountList, err := c.CloudAPI().Account().List(ctx, req)
if err != nil {
return false, err
}
err = json.Unmarshal([]byte(accountListRaw), &accountList)
if err != nil {
return false, err
}
haveAccount := false
myAccount := d.Get("account_id").(int)
for _, account := range accountList {
if account.ID == myAccount {
haveAccount = true
break
}
}
return haveAccount, nil
return len(accountList.FilterByID(accountId)) != 0, nil
}
func existGID(ctx context.Context, d *schema.ResourceData, m interface{}) (bool, error) {
c := m.(*controller.ControllerCfg)
gid := uint64(d.Get("gid").(int))
urlValues := &url.Values{}
req := locations.ListRequest{}
locationList := []struct {
GID int `json:"gid"`
}{}
locationsListAPI := "/restmachine/cloudapi/locations/list"
locationListRaw, err := c.DecortAPICall(ctx, "POST", locationsListAPI, urlValues)
locationList, err := c.CloudAPI().Locations().List(ctx, req)
if err != nil {
return false, err
}
err = json.Unmarshal([]byte(locationListRaw), &locationList)
if err != nil {
return false, err
}
haveGID := false
myGID := d.Get("gid").(int)
for _, location := range locationList {
if location.GID == myGID {
haveGID = true
break
}
}
return haveGID, nil
return len(locationList.FilterByGID(gid)) != 0, nil
}
func existExtNetID(ctx context.Context, d *schema.ResourceData, m interface{}) (bool, error) {
c := m.(*controller.ControllerCfg)
extNetId := uint64(d.Get("ext_net_id").(int))
urlValues := &url.Values{}
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
req := extnet.ListRequest{
AccountID: uint64(d.Get("account_id").(int)),
}
listExtNet := []struct {
ID int `json:"id"`
}{}
extNetListAPI := "/restmachine/cloudapi/extnet/list"
listExtNetRaw, err := c.DecortAPICall(ctx, "POST", extNetListAPI, urlValues)
listExtNet, err := c.CloudAPI().ExtNet().List(ctx, req)
if err != nil {
return false, err
}
err = json.Unmarshal([]byte(listExtNetRaw), &listExtNet)
if err != nil {
return false, err
}
haveExtNet := false
myExtNetID := d.Get("ext_net_id").(int)
for _, extNet := range listExtNet {
if extNet.ID == myExtNetID {
haveExtNet = true
break
}
}
return haveExtNet, nil
return len(listExtNet.FilterByID(extNetId)) != 0, nil
}

View File

@@ -35,10 +35,10 @@ package rg
import (
"context"
"fmt"
"net/url"
"strconv"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
@@ -57,20 +57,6 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
return diag.FromErr(fmt.Errorf("Cannot create new RG: missing name."))
}
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
/* Current version of provider works with default grid id (same is true for disk resources)
grid_id, arg_set := d.GetOk("grid_id")
if !arg_set {
return fmt.Errorf("Cannot create new RG %q in account ID %d: missing Grid ID.",
rg_name.(string), validated_account_id)
}
if grid_id.(int) < 1 {
grid_id = DefaultGridID
}
*/
log.Debugf("resourceResgroupCreate: called for RG name %s, account ID %d",
rgName.(string), d.Get("account_id").(int))
@@ -99,6 +85,8 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
return diag.Errorf("resourceResgroupCreate: can't create RG because ExtNetID %d is not allowed or does not exist", d.Get("ext_net_id").(int))
}
}
c := m.(*controller.ControllerCfg)
req := rg.CreateRequest{}
setQuota := false
var quotaRecord QuotaRecord
@@ -113,67 +101,65 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
c.GetDecortUsername(),
rgName.(string), d.Get("account_id").(int))
urlValues = &url.Values{}
urlValues.Add("accountId", strconv.Itoa(d.Get("account_id").(int)))
urlValues.Add("name", rgName.(string))
urlValues.Add("gid", strconv.Itoa(location.DefaultGridID))
urlValues.Add("owner", c.GetDecortUsername())
req.AccountID = uint64(d.Get("account_id").(int))
req.Name = rgName.(string)
req.GID = uint64(location.DefaultGridID)
req.Owner = c.GetDecortUsername()
if setQuota {
urlValues.Add("maxCPUCapacity", strconv.Itoa(quotaRecord.Cpu))
urlValues.Add("maxVDiskCapacity", strconv.Itoa(quotaRecord.Disk))
urlValues.Add("maxMemoryCapacity", fmt.Sprintf("%f", quotaRecord.Ram))
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(quotaRecord.ExtTraffic))
urlValues.Add("maxNumPublicIP", strconv.Itoa(quotaRecord.ExtIPs))
req.MaxCPUCapacity = int64(quotaRecord.Cpu)
req.MaxVDiskCapacity = int64(quotaRecord.Disk)
req.MaxMemoryCapacity = int64(quotaRecord.Ram)
req.MaxNetworkPeerTransfer = int64(quotaRecord.ExtTraffic)
req.MaxNumPublicIP = int64(quotaRecord.ExtIPs)
}
defNetType, ok := d.GetOk("def_net_type")
if ok {
urlValues.Add("def_net", defNetType.(string)) // NOTE: in API default network type is set by "def_net" parameter
req.DefNet = defNetType.(string) // NOTE: in API default network type is set by "def_net" parameter
} else {
d.Set("def_net_type", "PRIVATE")
}
ipcidr, ok := d.GetOk("ipcidr")
if ok {
urlValues.Add("ipcidr", ipcidr.(string))
req.IPCIDR = ipcidr.(string)
}
description, ok := d.GetOk("description")
if ok {
urlValues.Add("desc", description.(string))
req.Description = description.(string)
}
reason, ok := d.GetOk("reason")
if ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
extNetId, ok := d.GetOk("ext_net_id")
if ok {
urlValues.Add("extNetId", strconv.Itoa(extNetId.(int)))
req.ExtNetID = uint64(extNetId.(int))
}
extIp, ok := d.GetOk("ext_ip")
if ok {
urlValues.Add("extIp", extIp.(string))
req.ExtIP = extIp.(string)
}
regComputes, ok := d.GetOk("register_computes")
if ok {
urlValues.Add("registerComputes", strconv.FormatBool(regComputes.(bool)))
req.RegisterComputes = regComputes.(bool)
}
apiResp, err := c.DecortAPICall(ctx, "POST", ResgroupCreateAPI, urlValues)
apiResp, err := c.CloudAPI().RG().Create(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId(apiResp)
d.SetId(strconv.FormatUint(apiResp, 10))
w := dc.Warnings{}
if access, ok := d.GetOk("access"); ok {
urlValues = &url.Values{}
var user, right string
if access.(*schema.Set).Len() > 0 {
@@ -183,14 +169,17 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
user = access["user"].(string)
right = access["right"].(string)
urlValues.Add("rgId", d.Id())
urlValues.Add("user", user)
urlValues.Add("right", right)
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req := rg.AccessGrantRequest{
RGID: apiResp,
User: user,
Right: right,
}
_, err := c.DecortAPICall(ctx, "POST", RgAccessGrantAPI, urlValues)
if reason, ok := d.GetOk("reason"); ok {
req.Reason = reason.(string)
}
_, err := c.CloudAPI().RG().AccessGrant(ctx, req)
if err != nil {
w.Add(err)
}
@@ -200,50 +189,62 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
}
if defNet, ok := d.GetOk("def_net"); ok {
urlValues := &url.Values{}
if defNet.(*schema.Set).Len() > 0 {
defNetList := defNet.(*schema.Set).List()
defNetItem := defNetList[0].(map[string]interface{})
netType := defNetItem["net_type"].(string)
urlValues.Add("rgId", d.Id())
urlValues.Add("netType", netType)
req := rg.SetDefNetRequest{
RGID: apiResp,
NetType: netType,
}
if netID, ok := defNetItem["net_id"]; ok {
urlValues.Add("netId", strconv.Itoa(netID.(int)))
req.NetID = uint64(netID.(int))
}
if reason, ok := defNetItem["reason"]; ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
_, err := c.DecortAPICall(ctx, "POST", RgSetDefNetAPI, urlValues)
_, err := c.CloudAPI().RG().SetDefNet(ctx, req)
if err != nil {
w.Add(err)
}
d.Set("def_net_type", netType)
}
}
if enable, ok := d.GetOk("enable"); ok {
urlValues = &url.Values{}
api := RgDisableAPI
enable := enable.(bool)
if enable {
api = RgEnableAPI
}
urlValues.Add("rgId", d.Id())
req := rg.EnableRequest{
RGID: apiResp,
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
}
if reason, ok := d.GetOk("reason"); ok {
req.Reason = reason.(string)
}
_, err := c.DecortAPICall(ctx, "POST", api, urlValues)
if err != nil {
w.Add(err)
_, err := c.CloudAPI().RG().Enable(ctx, req)
if err != nil {
w.Add(err)
}
} else {
req := rg.DisableRequest{
RGID: apiResp,
}
if reason, ok := d.GetOk("reason"); ok {
req.Reason = reason.(string)
}
_, err := c.CloudAPI().RG().Disable(ctx, req)
if err != nil {
w.Add(err)
}
}
}
@@ -257,7 +258,7 @@ func resourceResgroupRead(ctx context.Context, d *schema.ResourceData, m interfa
c := m.(*controller.ControllerCfg)
rg, err := utilityResgroupCheckPresence(ctx, d, m)
rgData, err := utilityResgroupCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
@@ -265,26 +266,26 @@ func resourceResgroupRead(ctx context.Context, d *schema.ResourceData, m interfa
hasChanged := false
switch rg.Status {
switch rgData.Status {
case status.Modeled:
return diag.Errorf("The resource group is in status: %s, please, contact support for more information", rg.Status)
return diag.Errorf("The resource group is in status: %s, please, contact support for more information", rgData.Status)
case status.Created:
case status.Enabled:
case status.Deleted:
urlValues := &url.Values{}
urlValues.Add("rgId", d.Id())
restoreReq := rg.RestoreRequest{RGID: rgData.ID}
enableReq := rg.EnableRequest{RGID: rgData.ID}
_, err := c.DecortAPICall(ctx, "POST", RgRestoreAPI, urlValues)
_, err := c.CloudAPI().RG().Restore(ctx, restoreReq)
if err != nil {
return diag.FromErr(err)
}
_, err = c.DecortAPICall(ctx, "POST", RgEnableAPI, urlValues)
_, err = c.CloudAPI().RG().Enable(ctx, enableReq)
if err != nil {
return diag.FromErr(err)
}
hasChanged = true
case status.Deleting:
case status.Destroyed:
d.SetId("")
@@ -297,13 +298,13 @@ func resourceResgroupRead(ctx context.Context, d *schema.ResourceData, m interfa
}
if hasChanged {
rg, err = utilityResgroupCheckPresence(ctx, d, m)
rgData, err = utilityResgroupCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
}
return diag.FromErr(flattenResgroup(d, *rg))
return diag.FromErr(flattenResgroup(d, *rgData))
}
func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
@@ -311,7 +312,6 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
d.Get("name").(string), d.Get("account_id").(int))
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
haveAccount, err := existAccountID(ctx, d, m)
if err != nil {
@@ -326,7 +326,7 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
return diag.FromErr(err)
}
if !haveGID {
return diag.Errorf("resourceResgroupUpdate: can't create RG bacause GID %d not allowed or does not exist", d.Get("gid").(int))
return diag.Errorf("resourceResgroupUpdate: can't create RG because GID %d not allowed or does not exist", d.Get("gid").(int))
}
if _, ok := d.GetOk("ext_net_id"); ok {
@@ -339,7 +339,7 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
}
}
rgFacts, err := utilityResgroupCheckPresence(ctx, d, m)
rgData, err := utilityResgroupCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
@@ -347,18 +347,20 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
hasChanged := false
switch rgFacts.Status {
switch rgData.Status {
case status.Modeled:
case status.Created:
case status.Enabled:
case status.Deleted:
urlValues := &url.Values{}
urlValues.Add("rgId", d.Id())
_, err := c.DecortAPICall(ctx, "POST", RgRestoreAPI, urlValues)
restoreReq := rg.RestoreRequest{RGID: rgData.ID}
enableReq := rg.EnableRequest{RGID: rgData.ID}
_, err := c.CloudAPI().RG().Restore(ctx, restoreReq)
if err != nil {
return diag.FromErr(err)
}
_, err = c.DecortAPICall(ctx, "POST", RgEnableAPI, urlValues)
_, err = c.CloudAPI().RG().Enable(ctx, enableReq)
if err != nil {
return diag.FromErr(err)
}
@@ -376,7 +378,7 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
}
if hasChanged {
rgFacts, err = utilityDataResgroupCheckPresence(ctx, d, m)
rgData, err = utilityDataResgroupCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
@@ -411,16 +413,18 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
doGeneralUpdate := false
urlValues = &url.Values{}
urlValues.Add("rgId", d.Id())
req := rg.UpdateRequest{
RGID: rgData.ID,
}
nameNew, nameSet := d.GetOk("name")
if nameSet {
log.Debugf("resourceResgroupUpdate: name specified - looking for deltas from the old settings.")
nameOld, _ := d.GetChange("name")
if nameOld.(string) != nameNew.(string) {
req.Name = nameNew.(string)
doGeneralUpdate = true
urlValues.Add("name", nameNew.(string))
}
}
@@ -435,39 +439,39 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
if quotarecordNew.Cpu != quotarecordOld.Cpu {
doGeneralUpdate = true
log.Debugf("resourceResgroupUpdate: Cpu diff %d <- %d", quotarecordNew.Cpu, quotarecordOld.Cpu)
urlValues.Add("maxCPUCapacity", strconv.Itoa(quotarecordNew.Cpu))
req.MaxCPUCapacity = int64(quotarecordNew.Cpu)
}
if quotarecordNew.Disk != quotarecordOld.Disk {
doGeneralUpdate = true
log.Debugf("resourceResgroupUpdate: Disk diff %d <- %d", quotarecordNew.Disk, quotarecordOld.Disk)
urlValues.Add("maxVDiskCapacity", strconv.Itoa(quotarecordNew.Disk))
req.MaxVDiskCapacity = int64(quotarecordNew.Disk)
}
if quotarecordNew.Ram != quotarecordOld.Ram {
doGeneralUpdate = true
log.Debugf("resourceResgroupUpdate: Ram diff %f <- %f", quotarecordNew.Ram, quotarecordOld.Ram)
urlValues.Add("maxMemoryCapacity", fmt.Sprintf("%f", quotarecordNew.Ram))
req.MaxMemoryCapacity = int64(quotarecordNew.Ram)
}
if quotarecordNew.ExtTraffic != quotarecordOld.ExtTraffic {
doGeneralUpdate = true
log.Debugf("resourceResgroupUpdate: ExtTraffic diff %d <- %d", quotarecordNew.ExtTraffic, quotarecordOld.ExtTraffic)
urlValues.Add("maxNetworkPeerTransfer", strconv.Itoa(quotarecordNew.ExtTraffic))
req.MaxNetworkPeerTransfer = int64(quotarecordNew.ExtTraffic)
}
if quotarecordNew.ExtIPs != quotarecordOld.ExtIPs {
doGeneralUpdate = true
log.Debugf("resourceResgroupUpdate: ExtIPs diff %d <- %d", quotarecordNew.ExtIPs, quotarecordOld.ExtIPs)
urlValues.Add("maxNumPublicIP", strconv.Itoa(quotarecordNew.ExtIPs))
req.MaxNumPublicIP = int64(quotarecordNew.ExtIPs)
}
} else {
doGeneralUpdate = true
urlValues.Add("maxCPUCapacity", "-1")
urlValues.Add("maxVDiskCapacity", "-1")
urlValues.Add("maxMemoryCapacity", "-1")
urlValues.Add("maxNetworkPeerTransfer", "-1")
urlValues.Add("maxNumPublicIP", "-1")
req.MaxCPUCapacity = -1
req.MaxVDiskCapacity = -1
req.MaxMemoryCapacity = -1
req.MaxNetworkPeerTransfer = -1
req.MaxNumPublicIP = -1
}
descNew, descSet := d.GetOk("description")
@@ -476,13 +480,13 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
descOld, _ := d.GetChange("description")
if descOld.(string) != descNew.(string) {
doGeneralUpdate = true
urlValues.Add("desc", descNew.(string))
req.Description = descNew.(string)
}
}
if doGeneralUpdate {
log.Debugf("resourceResgroupUpdate: detected delta between new and old RG specs - updating the RG")
_, err := c.DecortAPICall(ctx, "POST", ResgroupUpdateAPI, urlValues)
_, err := c.CloudAPI().RG().Update(ctx, req)
if err != nil {
return diag.FromErr(err)
}
@@ -490,64 +494,63 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
log.Debugf("resourceResgroupUpdate: no difference between old and new state - no update on the RG will be done")
}
urlValues = &url.Values{}
enableOld, enableNew := d.GetChange("enable")
if enableOld.(bool) && !enableNew.(bool) {
urlValues.Add("rgId", d.Id())
_, err := c.DecortAPICall(ctx, "POST", RgDisableAPI, urlValues)
req := rg.DisableRequest{RGID: rgData.ID}
_, err := c.CloudAPI().RG().Disable(ctx, req)
if err != nil {
return diag.FromErr(err)
}
} else if !enableOld.(bool) && enableNew.(bool) {
urlValues.Add("rgId", d.Id())
_, err := c.DecortAPICall(ctx, "POST", RgEnableAPI, urlValues)
req := rg.EnableRequest{RGID: rgData.ID}
_, err := c.CloudAPI().RG().Enable(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
urlValues = &url.Values{}
oldSet, newSet := d.GetChange("access")
deletedAccess := (oldSet.(*schema.Set).Difference(newSet.(*schema.Set))).List()
for _, deletedInterface := range deletedAccess {
deletedItem := deletedInterface.(map[string]interface{})
user := deletedItem["user"].(string)
urlValues.Add("rgId", d.Id())
urlValues.Add("user", user)
req := rg.AccessRevokeRequest{
RGID: rgData.ID,
User: user,
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
_, err := c.DecortAPICall(ctx, "POST", RgAccessRevokeAPI, urlValues)
_, err := c.CloudAPI().RG().AccessRevoke(ctx, req)
if err != nil {
return diag.FromErr(err)
}
urlValues = &url.Values{}
}
addedAccess := (newSet.(*schema.Set).Difference(oldSet.(*schema.Set))).List()
for _, addedInterface := range addedAccess {
addedItem := addedInterface.(map[string]interface{})
user := addedItem["user"].(string)
right := addedItem["right"].(string)
urlValues.Add("rgId", d.Id())
urlValues.Add("user", user)
urlValues.Add("right", right)
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req := rg.AccessGrantRequest{
RGID: rgData.ID,
User: user,
Right: right,
}
_, err := c.DecortAPICall(ctx, "POST", RgAccessGrantAPI, urlValues)
if reason, ok := d.GetOk("reason"); ok {
req.Reason = reason.(string)
}
_, err := c.CloudAPI().RG().AccessGrant(ctx, req)
if err != nil {
return diag.FromErr(err)
}
urlValues = &url.Values{}
}
if ok := d.HasChange("def_net"); ok {
@@ -555,22 +558,22 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
if newDefNet.(*schema.Set).Len() > 0 {
changedDefNet := (newDefNet.(*schema.Set).Difference(oldDefNet.(*schema.Set))).List()
for _, changedDefNetInterface := range changedDefNet {
defNetItem := changedDefNetInterface.(map[string]interface{})
netType := defNetItem["net_type"].(string)
urlValues.Add("rgId", d.Id())
urlValues.Add("netType", netType)
req := rg.SetDefNetRequest{
RGID: rgData.ID,
NetType: netType,
}
if netID, ok := defNetItem["net_id"]; ok {
urlValues.Add("netId", strconv.Itoa(netID.(int)))
req.NetID = uint64(netID.(int))
}
if reason, ok := defNetItem["reason"]; ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
_, err := c.DecortAPICall(ctx, "POST", RgSetDefNetAPI, urlValues)
_, err := c.CloudAPI().RG().SetDefNet(ctx, req)
if err != nil {
return diag.FromErr(err)
}
@@ -582,30 +585,32 @@ func resourceResgroupUpdate(ctx context.Context, d *schema.ResourceData, m inter
}
func resourceResgroupDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
// NOTE: this method forcibly destroys target resource group with flag "permanently", so there is no way to
// restore the destroyed resource group as well all Computes & VINSes that existed in it
log.Debugf("resourceResgroupDelete: called for RG name %s, account ID %d",
d.Get("name").(string), d.Get("account_id").(int))
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
rgId, _ := strconv.ParseUint(d.Id(), 10, 64)
req := rg.DeleteRequest{
RGID: rgId,
}
urlValues.Add("rgId", d.Id())
if force, ok := d.GetOk("force"); ok {
urlValues.Add("force", strconv.FormatBool(force.(bool)))
req.Force = force.(bool)
}
if permanently, ok := d.GetOk("permanently"); ok {
urlValues.Add("permanently", strconv.FormatBool(permanently.(bool)))
req.Permanently = permanently.(bool)
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
_, err := c.DecortAPICall(ctx, "POST", ResgroupDeleteAPI, urlValues)
_, err := c.CloudAPI().RG().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId("")
return nil
}
@@ -806,6 +811,10 @@ func ResourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"rg_id": {
Type: schema.TypeInt,
Computed: true,
},
"lock_status": {
Type: schema.TypeString,
Computed: true,
@@ -863,6 +872,14 @@ func ResourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
"cpu_allocation_parameter": {
Type: schema.TypeString,
Computed: true,
},
"cpu_allocation_ratio": {
Type: schema.TypeFloat,
Computed: true,
},
}
}
@@ -882,7 +899,7 @@ func ResourceResgroup() *schema.Resource {
Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout600s,
Read: &constants.Timeout300s,
Update: &constants.Timeout300s,
Update: &constants.Timeout600s,
Delete: &constants.Timeout300s,
Default: &constants.Timeout300s,
},

View File

@@ -34,79 +34,50 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// On success this function returns a string, as returned by API rg/get, which could be unmarshalled
// into ResgroupGetResp structure
func utilityResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*RecordResourceGroup, error) {
// This function tries to locate resource group by one of the following algorithms depending
// on the parameters passed:
// - if resource group ID is specified -> by RG ID
// - if resource group name is specifeid -> by RG name and either account ID or account name
//
// If succeeded, it returns non empty string that contains JSON formatted facts about the
// resource group as returned by rg/get API call.
// Otherwise it returns empty string and a meaningful error.
//
// NOTE: As our provider always deletes RGs permanently, there is no "restore" method and
// consequently we are not interested in matching RGs in DELETED state. Hence, we call
// .../rg/list API with includedeleted=false
//
// This function does not modify its ResourceData argument, so it is safe to use it as core
// method for the Terraform resource Exists method.
//
func utilityResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*rg.RecordResourceGroup, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
req := rg.GetRequest{}
if d.Id() != "" {
urlValues.Add("rgId", d.Id())
rgId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.RGID = rgId
} else {
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
req.RGID = uint64(d.Get("rg_id").(int))
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
rgData := &RecordResourceGroup{}
rgRaw, err := c.DecortAPICall(ctx, "POST", ResgroupGetAPI, urlValues)
rgData, err := c.CloudAPI().RG().Get(ctx, req)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(rgRaw), rgData)
if err != nil {
return nil, err
}
return rgData, nil
}
func utilityDataResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*RecordResourceGroup, error) {
func utilityDataResgroupCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*rg.RecordResourceGroup, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
rgData := &RecordResourceGroup{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
req := rg.GetRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
rgRaw, err := c.DecortAPICall(ctx, "POST", ResgroupGetAPI, urlValues)
rgData, err := c.CloudAPI().RG().Get(ctx, req)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(rgRaw), rgData)
if err != nil {
return nil, err
}
return rgData, nil
}

View File

@@ -34,28 +34,20 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgAffinityGroupComputesCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListAffinityGroupCompute, error) {
func utilityRgAffinityGroupComputesCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListAffinityGroups, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
listGroupComputes := ListAffinityGroupCompute{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
urlValues.Add("affinityGroup", d.Get("affinity_group").(string))
listGroupComputesRaw, err := c.DecortAPICall(ctx, "POST", RgAffinityGroupComputesAPI, urlValues)
if err != nil {
return nil, err
req := rg.AffinityGroupComputesRequest{
RGID: uint64(d.Get("rg_id").(int)),
AffinityGroup: d.Get("affinity_group").(string),
}
err = json.Unmarshal([]byte(listGroupComputesRaw), &listGroupComputes)
listGroupComputes, err := c.CloudAPI().RG().AffinityGroupComputes(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,29 +34,20 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgAffinityGroupsGetCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) ([]uint64, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
computes := make([]uint64, 0)
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
urlValues.Add("affinityGroup", d.Get("affinity_group").(string))
computesRaw, err := c.DecortAPICall(ctx, "POST", RgAffinityGroupsGetAPI, urlValues)
if err != nil {
return nil, err
req := rg.AffinityGroupsGetRequest{
RGID: uint64(d.Get("rg_id").(int)),
AffinityGroup: d.Get("affinity_group").(string),
}
err = json.Unmarshal([]byte(computesRaw), &computes)
computes, err := c.CloudAPI().RG().AffinityGroupsGet(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,28 +34,19 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgAffinityGroupsListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (map[string][]uint64, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
groups := make(map[string][]uint64, 0)
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
groupsRaw, err := c.DecortAPICall(ctx, "POST", RgAffinityGroupsListAPI, urlValues)
if err != nil {
return nil, err
req := rg.AffinityGroupsListRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
err = json.Unmarshal([]byte(groupsRaw), &groups)
groups, err := c.CloudAPI().RG().AffinityGroupsList(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,26 +34,19 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgAuditsCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListAudits, error) {
func utilityRgAuditsCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListAudits, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
rgAudits := ListAudits{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
rgAuditsRow, err := c.DecortAPICall(ctx, "POST", RgAuditsAPI, urlValues)
if err != nil {
return nil, err
req := rg.AuditsRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
err = json.Unmarshal([]byte(rgAuditsRow), &rgAudits)
rgAudits, err := c.CloudAPI().RG().Audits(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,39 +34,30 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func utilityRgListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListResourceGroups, error) {
func utilityRgListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListResourceGroups, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
rgList := ListResourceGroups{}
req := rg.ListRequest{}
if size, ok := d.GetOk("size"); ok {
urlValues.Add("size", strconv.Itoa(size.(int)))
req.Size = uint64(size.(int))
}
if page, ok := d.GetOk("page"); ok {
urlValues.Add("page", strconv.Itoa(page.(int)))
req.Page = uint64(page.(int))
}
if includedeleted, ok := d.GetOk("includedeleted"); ok {
urlValues.Add("includedeleted", strconv.FormatBool(includedeleted.(bool)))
req.IncludeDeleted = includedeleted.(bool)
}
log.Debugf("utilityRgListCheckPresence: load rg list")
rgListRaw, err := c.DecortAPICall(ctx, "POST", ResgroupListAPI, urlValues)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(rgListRaw), &rgList)
rgList, err := c.CloudAPI().RG().List(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,31 +34,23 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgListComputesCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListComputes, error) {
func utilityRgListComputesCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListComputes, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
req := rg.ListComputesRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
listComputes := ListComputes{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
listComputesRaw, err := c.DecortAPICall(ctx, "POST", RgListComputesAPI, urlValues)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(listComputesRaw), &listComputes)
listComputes, err := c.CloudAPI().RG().ListComputes(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,33 +34,24 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgListDeletedCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListResourceGroups, error) {
func utilityRgListDeletedCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListResourceGroups, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
rgList := ListResourceGroups{}
req := rg.ListDeletedRequest{}
if size, ok := d.GetOk("size"); ok {
urlValues.Add("size", strconv.Itoa(size.(int)))
req.Size = uint64(size.(int))
}
if page, ok := d.GetOk("page"); ok {
urlValues.Add("page", strconv.Itoa(page.(int)))
req.Page = uint64(page.(int))
}
rgListRaw, err := c.DecortAPICall(ctx, "POST", ResgroupListDeletedAPI, urlValues)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(rgListRaw), &rgList)
rgList, err := c.CloudAPI().RG().ListDeleted(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,28 +34,19 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgListLbCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListLB, error) {
func utilityRgListLbCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListLB, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
listLb := ListLB{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
listLbRaw, err := c.DecortAPICall(ctx, "POST", ResgroupListLbAPI, urlValues)
if err != nil {
return nil, err
req := rg.ListLBRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
err = json.Unmarshal([]byte(listLbRaw), &listLb)
listLb, err := c.CloudAPI().RG().ListLB(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,28 +34,19 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgListPfwCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListPFW, error) {
func utilityRgListPfwCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListPortForwards, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
listPfw := ListPFW{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
listPfwRaw, err := c.DecortAPICall(ctx, "POST", ResgroupListPfwAPI, urlValues)
if err != nil {
return nil, err
req := rg.ListPFWRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
err = json.Unmarshal([]byte(listPfwRaw), &listPfw)
listPfw, err := c.CloudAPI().RG().ListPFW(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,32 +34,23 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityRgListVinsCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (ListVINS, error) {
func utilityRgListVinsCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (rg.ListVINS, error) {
c := m.(*controller.ControllerCfg)
urlValues := &url.Values{}
listVins := ListVINS{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
req := rg.ListVINSRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
if val, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", val.(string))
req.Reason = val.(string)
}
listVinsRaw, err := c.DecortAPICall(ctx, "POST", ResgroupListVinsAPI, urlValues)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(listVinsRaw), &listVins)
listVins, err := c.CloudAPI().RG().ListVINS(ctx, req)
if err != nil {
return nil, err
}

View File

@@ -34,34 +34,26 @@ package rg
import (
"context"
"encoding/json"
"net/url"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityDataRgUsageCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*Resource, error) {
func utilityDataRgUsageCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*rg.RecordResourceUsage, error) {
c := m.(*controller.ControllerCfg)
urlValues := url.Values{}
usage := Resource{}
urlValues.Add("rgId", strconv.Itoa(d.Get("rg_id").(int)))
req := rg.UsageRequest{
RGID: uint64(d.Get("rg_id").(int)),
}
if reason, ok := d.GetOk("reason"); ok {
urlValues.Add("reason", reason.(string))
req.Reason = reason.(string)
}
usageRaw, err := c.DecortAPICall(ctx, "POST", ResgroupUsageAPI, &urlValues)
usage, err := c.CloudAPI().RG().Usage(ctx, req)
if err != nil {
return nil, err
}
err = json.Unmarshal([]byte(usageRaw), &usage)
if err != nil {
return nil, err
}
return &usage, nil
return usage, nil
}