This commit is contained in:
2026-06-15 13:37:04 +03:00
parent af79f6ab3e
commit db8d13d403
40 changed files with 1892 additions and 1711 deletions

View File

@@ -1,8 +1,38 @@
## Version 4.11.2 ## Version 4.11.3
### Добавлено ### Добавлено
#### kvmvm #### kvmvm
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1270 | Опциональное поле `iotune` в блоке `disks` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | | BATF-1276 | Добавлено опциональное поле `create_blank` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1276 | Опциональное поле `alt_boot_id` в resource `decort_kvmvm` в cloudapi/kvmvm |
### Изменено
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1276 | Тип поля `disk_type` с опционального на вычисляемый в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
### Исправлено
#### flipgroup
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1283 | Установка поля `desc` с платформы в ресурсе `decort_cb_flipgroup` в cloudbroker/flipgroup |
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1276 | Ошибка при старте ВМ с указанием поля `alt_boot_id` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
#### trunk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1285 | Установка полей `account_ids`, `ovs_bridge`, `native_vlan_id`, `trunk_tags` с платформы в ресурсе `decort_cb_trunk ` в cloudbroker/trunk |
#### vfpool
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1289 | Разрешено создавать пул виртуальных функций с блоком `config` при значении поля `enable` равным `false` в resource `decort_cb_vfpool` в cloudbroker/vfpool |
| BATF-1289 | Разрешено обновлять поля `name`, `description`, `account_access` и `rg_access` без блока `config` в resource `decort_cb_vfpool` в cloudbroker/vfpool |

View File

@@ -7,7 +7,7 @@ ZIPDIR = ./zip
BINARY=${NAME} BINARY=${NAME}
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH} WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
MAINPATH = ./cmd/decort/ MAINPATH = ./cmd/decort/
VERSION=4.11.2 VERSION=4.11.3
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH) OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
FILES = ${BINARY}_${VERSION}_darwin_amd64\ FILES = ${BINARY}_${VERSION}_darwin_amd64\

View File

@@ -38,6 +38,7 @@ description: |-
- `chipset` (String) Type of the emulated system. - `chipset` (String) Type of the emulated system.
- `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases.
- `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node.
- `create_blank` (Boolean) If True, the compute is created via kvmx86/createBlank endpoint (without OS image). The image_id field is not required in this case.
- `custom_fields` (String) - `custom_fields` (String)
- `description` (String) Optional text description of this compute instance. - `description` (String) Optional text description of this compute instance.
- `detach_disks` (Boolean) - `detach_disks` (Boolean)
@@ -186,7 +187,6 @@ Optional:
- `blk_discard` (Boolean) - `blk_discard` (Boolean)
- `cache` (String) Setting the disk caching mode - `cache` (String) Setting the disk caching mode
- `desc` (String) Optional description - `desc` (String) Optional description
- `disk_type` (String) The type of disk in terms of its role in compute: 'B=Boot, D=Data'
- `image_id` (Number) Specify image id for create disk from template - `image_id` (Number) Specify image id for create disk from template
- `iotune` (Block List, Max: 1) (see [below for nested schema](#nestedblock--disks--iotune)) - `iotune` (Block List, Max: 1) (see [below for nested schema](#nestedblock--disks--iotune))
- `node_ids` (Set of Number) - `node_ids` (Set of Number)
@@ -202,6 +202,7 @@ Read-Only:
- `delete_time` (Number) - `delete_time` (Number)
- `devicename` (String) - `devicename` (String)
- `disk_id` (Number) Disk ID - `disk_id` (Number) Disk ID
- `disk_type` (String) The type of disk in terms of its role in compute: 'B=Boot, D=Data'
- `present_to` (Map of Number) - `present_to` (Map of Number)
- `shareable` (Boolean) - `shareable` (Boolean)
- `size_max` (Number) - `size_max` (Number)

View File

@@ -27,6 +27,7 @@ description: |-
- `affinity_label` (String) Set affinity label for compute - `affinity_label` (String) Set affinity label for compute
- `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules)) - `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules))
- `alt_boot_id` (Number) ID of CD-ROM live image to boot
- `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules)) - `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules))
- `auto_start_w_node` (Boolean) Flag for start compute after node exits from MAINTENANCE state - `auto_start_w_node` (Boolean) Flag for start compute after node exits from MAINTENANCE state
- `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image. - `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image.
@@ -35,6 +36,7 @@ description: |-
- `chipset` (String) Type of the emulated system. - `chipset` (String) Type of the emulated system.
- `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases.
- `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node.
- `create_blank` (Boolean) If True, the compute is created via kvmx86/createBlank endpoint (without OS image). The image_id field is not required in this case.
- `custom_fields` (String) - `custom_fields` (String)
- `description` (String) Optional text description of this compute instance. - `description` (String) Optional text description of this compute instance.
- `detach_disks` (Boolean) - `detach_disks` (Boolean)
@@ -177,7 +179,6 @@ Required:
Optional: Optional:
- `desc` (String) Optional description - `desc` (String) Optional description
- `disk_type` (String) The type of disk in terms of its role in compute: 'B=Boot, D=Data'
- `image_id` (Number) Specify image id for create disk from template - `image_id` (Number) Specify image id for create disk from template
- `iotune` (Block List, Max: 1) (see [below for nested schema](#nestedblock--disks--iotune)) - `iotune` (Block List, Max: 1) (see [below for nested schema](#nestedblock--disks--iotune))
- `permanently` (Boolean) Disk deletion status - `permanently` (Boolean) Disk deletion status
@@ -194,6 +195,7 @@ Read-Only:
- `deleted_time` (Number) - `deleted_time` (Number)
- `devicename` (String) - `devicename` (String)
- `disk_id` (Number) Disk ID - `disk_id` (Number) Disk ID
- `disk_type` (String) The type of disk in terms of its role in compute: 'B=Boot, D=Data'
- `present_to` (Map of Number) - `present_to` (Map of Number)
- `shareable` (Boolean) - `shareable` (Boolean)
- `size_max` (Number) - `size_max` (Number)

2
go.mod
View File

@@ -9,7 +9,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
github.com/sirupsen/logrus v1.9.0 github.com/sirupsen/logrus v1.9.0
golang.org/x/net v0.44.0 golang.org/x/net v0.44.0
repository.basistech.ru/BASIS/decort-golang-sdk v1.13.9 repository.basistech.ru/BASIS/decort-golang-sdk v1.13.10
) )
require ( require (

4
go.sum
View File

@@ -318,5 +318,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
repository.basistech.ru/BASIS/decort-golang-sdk v1.13.9 h1:jrfwiJBuHbt3JlVwD6DWF3E/H9pyDOJOvb8F5sQ/mhM= repository.basistech.ru/BASIS/decort-golang-sdk v1.13.10 h1:aRKyTH3/NSrpCLyLuTwCMtzOBoQ+hQ5EC4emQSnya5k=
repository.basistech.ru/BASIS/decort-golang-sdk v1.13.9/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM= repository.basistech.ru/BASIS/decort-golang-sdk v1.13.10/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM=

View File

@@ -1,139 +1,139 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package image package image
import ( import (
"context" "context"
"strconv" "strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/image" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/image"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "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/controller"
) )
func resourceImageVirtualCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceImageVirtualCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceImageVirtualCreate: called for image %s", d.Get("name").(string)) log.Debugf("resourceImageVirtualCreate: called for image %s", d.Get("name").(string))
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := image.CreateVirtualRequest{ req := image.CreateVirtualRequest{
Name: d.Get("name").(string), Name: d.Get("name").(string),
TargetID: uint64(d.Get("link_to").(int)), TargetID: uint64(d.Get("link_to").(int)),
AccountID: uint64(d.Get("account_id").(int)), AccountID: uint64(d.Get("account_id").(int)),
} }
imageId, err := c.CloudAPI().Image().CreateVirtual(ctx, req) imageId, err := c.CloudAPI().Image().CreateVirtual(ctx, req)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
d.SetId(strconv.FormatUint(imageId, 10)) d.SetId(strconv.FormatUint(imageId, 10))
d.Set("image_id", imageId) d.Set("image_id", imageId)
_, err = utilityImageCheckPresence(ctx, d, m) _, err = utilityImageCheckPresence(ctx, d, m)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
return resourceImageRead(ctx, d, m) return resourceImageRead(ctx, d, m)
} }
func resourceImageVirtualUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceImageVirtualUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
log.Debugf("resourceImageUpdate: called for %s, id: %s", d.Get("name").(string), d.Id()) log.Debugf("resourceImageUpdate: called for %s, id: %s", d.Get("name").(string), d.Id())
if d.HasChange("name") { if d.HasChange("name") {
err := resourceImageRename(ctx, d, m) err := resourceImageRename(ctx, d, m)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
if d.HasChange("link_to") { if d.HasChange("link_to") {
err := resourceImageVirtualLink(ctx, d, m) err := resourceImageVirtualLink(ctx, d, m)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
return resourceImageRead(ctx, d, m) return resourceImageRead(ctx, d, m)
} }
func resourceImageVirtualLink(ctx context.Context, d *schema.ResourceData, m interface{}) error { func resourceImageVirtualLink(ctx context.Context, d *schema.ResourceData, m interface{}) error {
log.Debugf("resourceVirtualImageLink: called for %s, id: %s", d.Get("name").(string), d.Id()) log.Debugf("resourceVirtualImageLink: called for %s, id: %s", d.Get("name").(string), d.Id())
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := image.LinkRequest{ req := image.LinkRequest{
ImageID: uint64(d.Get("image_id").(int)), ImageID: uint64(d.Get("image_id").(int)),
TargetID: uint64(d.Get("link_to").(int)), TargetID: uint64(d.Get("link_to").(int)),
} }
_, err := c.CloudAPI().Image().Link(ctx, req) _, err := c.CloudAPI().Image().Link(ctx, req)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func ResourceImageVirtual() *schema.Resource { func ResourceImageVirtual() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
SchemaVersion: 2, SchemaVersion: 2,
CreateContext: resourceImageVirtualCreate, CreateContext: resourceImageVirtualCreate,
ReadContext: resourceImageRead, ReadContext: resourceImageRead,
UpdateContext: resourceImageVirtualUpdate, UpdateContext: resourceImageVirtualUpdate,
DeleteContext: resourceImageDelete, DeleteContext: resourceImageDelete,
Importer: &schema.ResourceImporter{ Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext, StateContext: schema.ImportStatePassthroughContext,
}, },
Timeouts: &schema.ResourceTimeout{ Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout600s, Create: &constants.Timeout600s,
Read: &constants.Timeout300s, Read: &constants.Timeout300s,
Update: &constants.Timeout300s, Update: &constants.Timeout300s,
Delete: &constants.Timeout300s, Delete: &constants.Timeout300s,
Default: &constants.Timeout300s, Default: &constants.Timeout300s,
}, },
Schema: resourceImageVirtualSchemaMake(dataSourceImageExtendSchemaMake()), Schema: resourceImageVirtualSchemaMake(dataSourceImageExtendSchemaMake()),
StateUpgraders: []schema.StateUpgrader{ StateUpgraders: []schema.StateUpgrader{
{ {
Type: resourceImageVirtualSchemaV1().CoreConfigSchema().ImpliedType(), Type: resourceImageVirtualSchemaV1().CoreConfigSchema().ImpliedType(),
Upgrade: resourcePresentToUpgradeV1, Upgrade: resourcePresentToUpgradeV1,
Version: 1, Version: 1,
}, },
}, },
} }
} }

View File

@@ -805,13 +805,13 @@ func resourceK8sSchemaMake() map[string]*schema.Schema {
Description: "insert ssl certificate in x509 pem format", Description: "insert ssl certificate in x509 pem format",
}, },
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false),
Default: "Q35", Default: "Q35",
Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35", Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35",
}, },
"desc": { "desc": {
Type: schema.TypeString, Type: schema.TypeString,

View File

@@ -715,13 +715,13 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema {
), ),
Description: "Node RAM in MB.", Description: "Node RAM in MB.",
}, },
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false),
Default: "Q35", Default: "Q35",
Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35", Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35",
}, },
"disk": { "disk": {
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,

View File

@@ -290,13 +290,13 @@ func resourceK8sWgSchemaMake() map[string]*schema.Schema {
Description: "Number of worker nodes to create.", Description: "Number of worker nodes to create.",
}, },
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false),
Default: "Q35", Default: "Q35",
Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35", Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35",
}, },
"cpu": { "cpu": {
Type: schema.TypeInt, Type: schema.TypeInt,

View File

@@ -71,13 +71,15 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("resourceComputeCreate: can't create Compute because rgID %d is not allowed or does not exist", d.Get("rg_id").(int)) return diag.Errorf("resourceComputeCreate: can't create Compute because rgID %d is not allowed or does not exist", d.Get("rg_id").(int))
} }
hasImage, err := existImageId(ctx, d, m) if !d.Get("create_blank").(bool) {
if err != nil { hasImage, err := existImageId(ctx, d, m)
return diag.FromErr(err) if err != nil {
} return diag.FromErr(err)
}
if !hasImage { if !hasImage {
return diag.Errorf("resourceComputeCreate: can't create Compute because imageID %d is not allowed or does not exist", d.Get("image_id").(int)) return diag.Errorf("resourceComputeCreate: can't create Compute because imageID %d is not allowed or does not exist", d.Get("image_id").(int))
}
} }
if zoneID, ok := d.GetOk("zone_id"); ok { if zoneID, ok := d.GetOk("zone_id"); ok {
@@ -294,7 +296,32 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86")
apiResp, err := c.CloudAPI().KVMX86().Create(ctx, createReqX86) var apiResp uint64
if d.Get("create_blank").(bool) {
log.Debugf("resourceComputeCreate: using createBlank endpoint")
createBlankReq := kvmx86.CreateBlankRequest{
RGID: createReqX86.RGID,
Name: createReqX86.Name,
CPU: createReqX86.CPU,
RAM: createReqX86.RAM,
StoragePolicyID: createReqX86.StoragePolicyID,
WithoutBootDisk: createReqX86.WithoutBootDisk,
BootDisk: createReqX86.BootDisk,
SEPID: createReqX86.SepID,
Pool: createReqX86.Pool,
DataDisks: createReqX86.DataDisks,
Interfaces: createReqX86.Interfaces,
Description: createReqX86.Description,
Chipset: createReqX86.Chipset,
PreferredCPU: createReqX86.PreferredCPU,
ZoneID: createReqX86.ZoneID,
OSVersion: createReqX86.OSVersion,
}
apiResp, err = c.CloudAPI().KVMX86().CreateBlank(ctx, createBlankReq)
} else {
apiResp, err = c.CloudAPI().KVMX86().Create(ctx, createReqX86)
}
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
@@ -458,6 +485,9 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
if start, ok := d.GetOk("started"); ok { if start, ok := d.GetOk("started"); ok {
if start.(bool) { if start.(bool) {
req := compute.StartRequest{ComputeID: computeId} req := compute.StartRequest{ComputeID: computeId}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", computeId) log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", computeId)
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil { if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
warnings.Add(err) warnings.Add(err)
@@ -769,13 +799,19 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("resourceComputeUpdate: can't update Compute because rgID %d not allowed or does not exist", d.Get("rg_id").(int)) return diag.Errorf("resourceComputeUpdate: can't update Compute because rgID %d not allowed or does not exist", d.Get("rg_id").(int))
} }
hasImage, err := existImageId(ctx, d, m) if !d.Get("create_blank").(bool) {
if err != nil { hasImage, err := existImageId(ctx, d, m)
return diag.FromErr(err) if err != nil {
return diag.FromErr(err)
}
if !hasImage {
return diag.Errorf("resourceComputeUpdate: can't update Compute because imageID %d not allowed or does not exist", d.Get("image_id").(int))
}
} }
if !hasImage { if err != nil {
return diag.Errorf("resourceComputeUpdate: can't update Compute because imageID %d not allowed or does not exist", d.Get("image_id").(int)) return diag.FromErr(err)
} }
if d.HasChange("zone_id") { if d.HasChange("zone_id") {
@@ -863,6 +899,9 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if start, ok := d.GetOk("started"); ok { if start, ok := d.GetOk("started"); ok {
if start.(bool) { if start.(bool) {
req := compute.StartRequest{ComputeID: computeRec.ID} req := compute.StartRequest{ComputeID: computeRec.ID}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil { if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -1105,7 +1144,11 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
// If used to be STARTED, we need to start it after update // If used to be STARTED, we need to start it after update
if isStopRequired { if isStopRequired {
if _, err := c.CloudAPI().Compute().Start(ctx, compute.StartRequest{ComputeID: computeRec.ID}); err != nil { req := compute.StartRequest{ComputeID: computeRec.ID}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
@@ -1214,9 +1257,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if diskConv["sep_id"].(int) != 0 { if diskConv["sep_id"].(int) != 0 {
req.SepID = uint64(diskConv["sep_id"].(int)) req.SepID = uint64(diskConv["sep_id"].(int))
} }
if diskConv["disk_type"].(string) != "" {
req.DiskType = diskConv["disk_type"].(string)
}
if diskConv["pool"].(string) != "" { if diskConv["pool"].(string) != "" {
req.Pool = diskConv["pool"].(string) req.Pool = diskConv["pool"].(string)
} }
@@ -1847,6 +1887,9 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
req := compute.StartRequest{ req := compute.StartRequest{
ComputeID: computeRec.ID, ComputeID: computeRec.ID,
} }
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
if !isStopRequired { if !isStopRequired {
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil { if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -2043,11 +2086,9 @@ func disksSubresourceSchemaMake() map[string]*schema.Schema {
Description: "Storage endpoint provider ID; by default the same with boot disk", Description: "Storage endpoint provider ID; by default the same with boot disk",
}, },
"disk_type": { "disk_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
Optional: true, Description: "The type of disk in terms of its role in compute: 'B=Boot, D=Data'",
ValidateFunc: validation.StringInSlice([]string{"B", "D"}, false),
Description: "The type of disk in terms of its role in compute: 'B=Boot, D=Data'",
}, },
"pool": { "pool": {
Type: schema.TypeString, Type: schema.TypeString,
@@ -2353,6 +2394,12 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.", Description: "If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.",
}, },
"create_blank": {
Type: schema.TypeBool,
Optional: true,
Default: false,
Description: "If True, the compute is created via kvmx86/createBlank endpoint (without OS image). The image_id field is not required in this case.",
},
"boot_disk_size": { "boot_disk_size": {
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
@@ -2607,6 +2654,11 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "Flag for resize compute", Description: "Flag for resize compute",
}, },
"alt_boot_id": {
Type: schema.TypeInt,
Optional: true,
Description: "ID of CD-ROM live image to boot",
},
"started": { "started": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,

View File

@@ -299,7 +299,13 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
if needStart { if needStart {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if numErr, err := utilityComputeStart(ctx, computeId, m); err != nil { var altBootID uint64
if altBootIDRaw, ok := d.Get("alt_boot_id").(int); ok {
altBootID = uint64(altBootIDRaw)
} else {
altBootID = 0
}
if numErr, err := utilityComputeStart(ctx, computeId, altBootID, m); err != nil {
apiErrCount += numErr apiErrCount += numErr
lastSavedError = err lastSavedError = err
} }
@@ -462,9 +468,12 @@ func utilityComputeStop(ctx context.Context, computeID uint64, m interface{}) er
return nil return nil
} }
func utilityComputeStart(ctx context.Context, computeID uint64, m interface{}) (int, error) { func utilityComputeStart(ctx context.Context, computeID uint64, altBootID uint64, m interface{}) (int, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
startReq := compute.StartRequest{ComputeID: computeID} startReq := compute.StartRequest{ComputeID: computeID}
if altBootID > 0 {
startReq.AltBootID = altBootID
}
log.Debugf("utilityComputeNetworksConfigure: starting compute %d", computeID) log.Debugf("utilityComputeNetworksConfigure: starting compute %d", computeID)
_, err := c.CloudAPI().Compute().Start(ctx, startReq) _, err := c.CloudAPI().Compute().Start(ctx, startReq)

View File

@@ -1,300 +1,300 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package lb package lb
import ( import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/lb" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/lb"
) )
func flattenLBFrontendBind(d *schema.ResourceData, b *lb.ItemBinding, lbId int64, frontendName string) { func flattenLBFrontendBind(d *schema.ResourceData, b *lb.ItemBinding, lbId int64, frontendName string) {
d.Set("lb_id", lbId) d.Set("lb_id", lbId)
d.Set("frontend_name", frontendName) d.Set("frontend_name", frontendName)
d.Set("name", b.Name) d.Set("name", b.Name)
d.Set("address", b.Address) d.Set("address", b.Address)
d.Set("guid", b.GUID) d.Set("guid", b.GUID)
d.Set("port", b.Port) d.Set("port", b.Port)
} }
func flattenLBFrontend(d *schema.ResourceData, f *lb.ItemFrontend, lbId int64) { func flattenLBFrontend(d *schema.ResourceData, f *lb.ItemFrontend, lbId int64) {
d.Set("lb_id", lbId) d.Set("lb_id", lbId)
d.Set("backend_name", f.Backend) d.Set("backend_name", f.Backend)
d.Set("name", f.Name) d.Set("name", f.Name)
d.Set("guid", f.GUID) d.Set("guid", f.GUID)
d.Set("bindings", flattendBindings(f.Bindings)) d.Set("bindings", flattendBindings(f.Bindings))
} }
func flattenResourceLBBackendServer(d *schema.ResourceData, s *lb.ItemServer, lbId int64, backendName string) { func flattenResourceLBBackendServer(d *schema.ResourceData, s *lb.ItemServer, lbId int64, backendName string) {
d.Set("lb_id", lbId) d.Set("lb_id", lbId)
d.Set("backend_name", backendName) d.Set("backend_name", backendName)
d.Set("name", s.Name) d.Set("name", s.Name)
d.Set("port", s.Port) d.Set("port", s.Port)
d.Set("address", s.Address) d.Set("address", s.Address)
d.Set("check", s.Check) d.Set("check", s.Check)
d.Set("guid", s.GUID) d.Set("guid", s.GUID)
d.Set("downinter", s.ServerSettings.DownInter) d.Set("downinter", s.ServerSettings.DownInter)
d.Set("fall", s.ServerSettings.Fall) d.Set("fall", s.ServerSettings.Fall)
d.Set("inter", s.ServerSettings.Inter) d.Set("inter", s.ServerSettings.Inter)
d.Set("maxconn", s.ServerSettings.MaxConn) d.Set("maxconn", s.ServerSettings.MaxConn)
d.Set("maxqueue", s.ServerSettings.MaxQueue) d.Set("maxqueue", s.ServerSettings.MaxQueue)
d.Set("rise", s.ServerSettings.Rise) d.Set("rise", s.ServerSettings.Rise)
d.Set("slowstart", s.ServerSettings.SlowStart) d.Set("slowstart", s.ServerSettings.SlowStart)
d.Set("weight", s.ServerSettings.Weight) d.Set("weight", s.ServerSettings.Weight)
} }
func flattenResourceLBBackend(d *schema.ResourceData, b *lb.ItemBackend, lbId int64) { func flattenResourceLBBackend(d *schema.ResourceData, b *lb.ItemBackend, lbId int64) {
d.Set("lb_id", lbId) d.Set("lb_id", lbId)
d.Set("name", b.Name) d.Set("name", b.Name)
d.Set("algorithm", b.Algorithm) d.Set("algorithm", b.Algorithm)
d.Set("guid", b.GUID) d.Set("guid", b.GUID)
d.Set("downinter", b.ServerDefaultSettings.DownInter) d.Set("downinter", b.ServerDefaultSettings.DownInter)
d.Set("fall", b.ServerDefaultSettings.Fall) d.Set("fall", b.ServerDefaultSettings.Fall)
d.Set("inter", b.ServerDefaultSettings.Inter) d.Set("inter", b.ServerDefaultSettings.Inter)
d.Set("maxconn", b.ServerDefaultSettings.MaxConn) d.Set("maxconn", b.ServerDefaultSettings.MaxConn)
d.Set("maxqueue", b.ServerDefaultSettings.MaxQueue) d.Set("maxqueue", b.ServerDefaultSettings.MaxQueue)
d.Set("rise", b.ServerDefaultSettings.Rise) d.Set("rise", b.ServerDefaultSettings.Rise)
d.Set("slowstart", b.ServerDefaultSettings.SlowStart) d.Set("slowstart", b.ServerDefaultSettings.SlowStart)
d.Set("weight", b.ServerDefaultSettings.Weight) d.Set("weight", b.ServerDefaultSettings.Weight)
d.Set("servers", flattenServers(b.Servers)) d.Set("servers", flattenServers(b.Servers))
} }
func flattenResourceLB(d *schema.ResourceData, lb *lb.RecordLB) { func flattenResourceLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("ha_mode", lb.HAMode) d.Set("ha_mode", lb.HAMode)
d.Set("backend_haip", lb.BackendHAIP) d.Set("backend_haip", lb.BackendHAIP)
d.Set("backends", flattenLBBackends(lb.Backends)) d.Set("backends", flattenLBBackends(lb.Backends))
d.Set("created_by", lb.CreatedBy) d.Set("created_by", lb.CreatedBy)
d.Set("created_time", lb.CreatedTime) d.Set("created_time", lb.CreatedTime)
d.Set("deleted_by", lb.DeletedBy) d.Set("deleted_by", lb.DeletedBy)
d.Set("deleted_time", lb.DeletedTime) d.Set("deleted_time", lb.DeletedTime)
d.Set("desc", lb.Description) d.Set("desc", lb.Description)
d.Set("dp_api_user", lb.DPAPIUser) d.Set("dp_api_user", lb.DPAPIUser)
d.Set("extnet_id", lb.ExtNetID) d.Set("extnet_id", lb.ExtNetID)
d.Set("frontend_haip", lb.FrontendHAIP) d.Set("frontend_haip", lb.FrontendHAIP)
d.Set("frontends", flattenFrontends(lb.Frontends)) d.Set("frontends", flattenFrontends(lb.Frontends))
d.Set("gid", lb.GID) d.Set("gid", lb.GID)
d.Set("guid", lb.GUID) d.Set("guid", lb.GUID)
d.Set("manager_id", lb.ManagerId) d.Set("manager_id", lb.ManagerId)
d.Set("manager_type", lb.ManagerType) d.Set("manager_type", lb.ManagerType)
d.Set("lb_id", lb.ID) d.Set("lb_id", lb.ID)
d.Set("image_id", lb.ImageID) d.Set("image_id", lb.ImageID)
d.Set("milestones", lb.Milestones) d.Set("milestones", lb.Milestones)
d.Set("name", lb.Name) d.Set("name", lb.Name)
d.Set("part_k8s", lb.PartK8s) d.Set("part_k8s", lb.PartK8s)
d.Set("primary_node", flattenNode(lb.PrimaryNode)) d.Set("primary_node", flattenNode(lb.PrimaryNode))
d.Set("rg_id", lb.RGID) d.Set("rg_id", lb.RGID)
d.Set("rg_name", lb.RGName) d.Set("rg_name", lb.RGName)
d.Set("secondary_node", flattenNode(lb.SecondaryNode)) d.Set("secondary_node", flattenNode(lb.SecondaryNode))
d.Set("status", lb.Status) d.Set("status", lb.Status)
d.Set("tech_status", lb.TechStatus) d.Set("tech_status", lb.TechStatus)
d.Set("updated_by", lb.UpdatedBy) d.Set("updated_by", lb.UpdatedBy)
d.Set("updated_time", lb.UpdatedTime) d.Set("updated_time", lb.UpdatedTime)
d.Set("user_managed", lb.UserManaged) d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID) d.Set("vins_id", lb.VINSID)
d.Set("zone_id", lb.ZoneID) d.Set("zone_id", lb.ZoneID)
} }
func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) { func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("account_id", lb.AccountID) d.Set("account_id", lb.AccountID)
d.Set("ha_mode", lb.HAMode) d.Set("ha_mode", lb.HAMode)
d.Set("backend_haip", lb.BackendHAIP) d.Set("backend_haip", lb.BackendHAIP)
d.Set("backends", flattenLBBackends(lb.Backends)) d.Set("backends", flattenLBBackends(lb.Backends))
d.Set("created_by", lb.CreatedBy) d.Set("created_by", lb.CreatedBy)
d.Set("created_time", lb.CreatedTime) d.Set("created_time", lb.CreatedTime)
d.Set("deleted_by", lb.DeletedBy) d.Set("deleted_by", lb.DeletedBy)
d.Set("deleted_time", lb.DeletedTime) d.Set("deleted_time", lb.DeletedTime)
d.Set("desc", lb.Description) d.Set("desc", lb.Description)
d.Set("dp_api_user", lb.DPAPIUser) d.Set("dp_api_user", lb.DPAPIUser)
d.Set("extnet_id", lb.ExtNetID) d.Set("extnet_id", lb.ExtNetID)
d.Set("frontend_haip", lb.FrontendHAIP) d.Set("frontend_haip", lb.FrontendHAIP)
d.Set("frontends", flattenFrontends(lb.Frontends)) d.Set("frontends", flattenFrontends(lb.Frontends))
d.Set("gid", lb.GID) d.Set("gid", lb.GID)
d.Set("guid", lb.GUID) d.Set("guid", lb.GUID)
d.Set("manager_id", lb.ManagerId) d.Set("manager_id", lb.ManagerId)
d.Set("manager_type", lb.ManagerType) d.Set("manager_type", lb.ManagerType)
d.Set("image_id", lb.ImageID) d.Set("image_id", lb.ImageID)
d.Set("milestones", lb.Milestones) d.Set("milestones", lb.Milestones)
d.Set("name", lb.Name) d.Set("name", lb.Name)
d.Set("part_k8s", lb.PartK8s) d.Set("part_k8s", lb.PartK8s)
d.Set("primary_node", flattenNode(lb.PrimaryNode)) d.Set("primary_node", flattenNode(lb.PrimaryNode))
d.Set("rg_id", lb.RGID) d.Set("rg_id", lb.RGID)
d.Set("rg_name", lb.RGName) d.Set("rg_name", lb.RGName)
d.Set("secondary_node", flattenNode(lb.SecondaryNode)) d.Set("secondary_node", flattenNode(lb.SecondaryNode))
d.Set("status", lb.Status) d.Set("status", lb.Status)
d.Set("tech_status", lb.TechStatus) d.Set("tech_status", lb.TechStatus)
d.Set("updated_by", lb.UpdatedBy) d.Set("updated_by", lb.UpdatedBy)
d.Set("updated_time", lb.UpdatedTime) d.Set("updated_time", lb.UpdatedTime)
d.Set("user_managed", lb.UserManaged) d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID) d.Set("vins_id", lb.VINSID)
d.Set("zone_id", lb.ZoneID) d.Set("zone_id", lb.ZoneID)
} }
func flattenNode(node lb.RecordNode) []map[string]interface{} { func flattenNode(node lb.RecordNode) []map[string]interface{} {
temp := make([]map[string]interface{}, 0) temp := make([]map[string]interface{}, 0)
n := map[string]interface{}{ n := map[string]interface{}{
"backend_ip": node.BackendIP, "backend_ip": node.BackendIP,
"compute_id": node.ComputeID, "compute_id": node.ComputeID,
"frontend_ip": node.FrontendIP, "frontend_ip": node.FrontendIP,
"guid": node.GUID, "guid": node.GUID,
"mgmt_ip": node.MGMTIP, "mgmt_ip": node.MGMTIP,
"network_id": node.NetworkID, "network_id": node.NetworkID,
} }
temp = append(temp, n) temp = append(temp, n)
return temp return temp
} }
func flattendBindings(bs []lb.ItemBinding) []map[string]interface{} { func flattendBindings(bs []lb.ItemBinding) []map[string]interface{} {
temp := make([]map[string]interface{}, 0, len(bs)) temp := make([]map[string]interface{}, 0, len(bs))
for _, b := range bs { for _, b := range bs {
t := map[string]interface{}{ t := map[string]interface{}{
"address": b.Address, "address": b.Address,
"guid": b.GUID, "guid": b.GUID,
"name": b.Name, "name": b.Name,
"port": b.Port, "port": b.Port,
} }
temp = append(temp, t) temp = append(temp, t)
} }
return temp return temp
} }
func flattenFrontends(fs []lb.ItemFrontend) []map[string]interface{} { func flattenFrontends(fs []lb.ItemFrontend) []map[string]interface{} {
temp := make([]map[string]interface{}, 0, len(fs)) temp := make([]map[string]interface{}, 0, len(fs))
for _, f := range fs { for _, f := range fs {
t := map[string]interface{}{ t := map[string]interface{}{
"backend": f.Backend, "backend": f.Backend,
"bindings": flattendBindings(f.Bindings), "bindings": flattendBindings(f.Bindings),
"guid": f.GUID, "guid": f.GUID,
"name": f.Name, "name": f.Name,
} }
temp = append(temp, t) temp = append(temp, t)
} }
return temp return temp
} }
func flattenServers(servers []lb.ItemServer) []map[string]interface{} { func flattenServers(servers []lb.ItemServer) []map[string]interface{} {
temp := make([]map[string]interface{}, 0, len(servers)) temp := make([]map[string]interface{}, 0, len(servers))
for _, server := range servers { for _, server := range servers {
t := map[string]interface{}{ t := map[string]interface{}{
"address": server.Address, "address": server.Address,
"check": server.Check, "check": server.Check,
"guid": server.GUID, "guid": server.GUID,
"name": server.Name, "name": server.Name,
"port": server.Port, "port": server.Port,
"server_settings": flattenServerSettings(server.ServerSettings), "server_settings": flattenServerSettings(server.ServerSettings),
} }
temp = append(temp, t) temp = append(temp, t)
} }
return temp return temp
} }
func flattenServerSettings(defSet lb.RecordServerSettings) []map[string]interface{} { func flattenServerSettings(defSet lb.RecordServerSettings) []map[string]interface{} {
temp := map[string]interface{}{ temp := map[string]interface{}{
"downinter": defSet.DownInter, "downinter": defSet.DownInter,
"fall": defSet.Fall, "fall": defSet.Fall,
"guid": defSet.GUID, "guid": defSet.GUID,
"inter": defSet.Inter, "inter": defSet.Inter,
"maxconn": defSet.MaxConn, "maxconn": defSet.MaxConn,
"maxqueue": defSet.MaxQueue, "maxqueue": defSet.MaxQueue,
"rise": defSet.Rise, "rise": defSet.Rise,
"slowstart": defSet.SlowStart, "slowstart": defSet.SlowStart,
"weight": defSet.Weight, "weight": defSet.Weight,
} }
res := make([]map[string]interface{}, 0) res := make([]map[string]interface{}, 0)
res = append(res, temp) res = append(res, temp)
return res return res
} }
func flattenLBBackends(backends []lb.ItemBackend) []map[string]interface{} { func flattenLBBackends(backends []lb.ItemBackend) []map[string]interface{} {
temp := make([]map[string]interface{}, 0, len(backends)) temp := make([]map[string]interface{}, 0, len(backends))
for _, item := range backends { for _, item := range backends {
t := map[string]interface{}{ t := map[string]interface{}{
"algorithm": item.Algorithm, "algorithm": item.Algorithm,
"guid": item.GUID, "guid": item.GUID,
"name": item.Name, "name": item.Name,
"server_default_settings": flattenServerSettings(item.ServerDefaultSettings), "server_default_settings": flattenServerSettings(item.ServerDefaultSettings),
"servers": flattenServers(item.Servers), "servers": flattenServers(item.Servers),
} }
temp = append(temp, t) temp = append(temp, t)
} }
return temp return temp
} }
func flattenLBList(lbl *lb.ListLB) []map[string]interface{} { func flattenLBList(lbl *lb.ListLB) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(lbl.Data)) res := make([]map[string]interface{}, 0, len(lbl.Data))
for _, lb := range lbl.Data { for _, lb := range lbl.Data {
temp := map[string]interface{}{ temp := map[string]interface{}{
"ha_mode": lb.HAMode, "ha_mode": lb.HAMode,
"backend_haip": lb.BackendHAIP, "backend_haip": lb.BackendHAIP,
"backends": flattenLBBackends(lb.Backends), "backends": flattenLBBackends(lb.Backends),
"created_by": lb.CreatedBy, "created_by": lb.CreatedBy,
"created_time": lb.CreatedTime, "created_time": lb.CreatedTime,
"deleted_by": lb.DeletedBy, "deleted_by": lb.DeletedBy,
"deleted_time": lb.DeletedTime, "deleted_time": lb.DeletedTime,
"desc": lb.Description, "desc": lb.Description,
"dp_api_user": lb.DPAPIUser, "dp_api_user": lb.DPAPIUser,
"dp_api_password": lb.DPAPIPassword, "dp_api_password": lb.DPAPIPassword,
"extnet_id": lb.ExtNetID, "extnet_id": lb.ExtNetID,
"frontend_haip": lb.FrontendHAIP, "frontend_haip": lb.FrontendHAIP,
"frontends": flattenFrontends(lb.Frontends), "frontends": flattenFrontends(lb.Frontends),
"gid": lb.GID, "gid": lb.GID,
"guid": lb.GUID, "guid": lb.GUID,
"manager_id": lb.ManagerId, "manager_id": lb.ManagerId,
"manager_type": lb.ManagerType, "manager_type": lb.ManagerType,
"image_id": lb.ImageID, "image_id": lb.ImageID,
"milestones": lb.Milestones, "milestones": lb.Milestones,
"name": lb.Name, "name": lb.Name,
"part_k8s": lb.PartK8s, "part_k8s": lb.PartK8s,
"primary_node": flattenNode(lb.PrimaryNode), "primary_node": flattenNode(lb.PrimaryNode),
"rg_id": lb.RGID, "rg_id": lb.RGID,
"rg_name": lb.RGName, "rg_name": lb.RGName,
"secondary_node": flattenNode(lb.SecondaryNode), "secondary_node": flattenNode(lb.SecondaryNode),
"status": lb.Status, "status": lb.Status,
"tech_status": lb.TechStatus, "tech_status": lb.TechStatus,
"updated_by": lb.UpdatedBy, "updated_by": lb.UpdatedBy,
"updated_time": lb.UpdatedTime, "updated_time": lb.UpdatedTime,
"user_managed": lb.UserManaged, "user_managed": lb.UserManaged,
"vins_id": lb.VINSID, "vins_id": lb.VINSID,
"lb_id": lb.ID, "lb_id": lb.ID,
"zone_id": lb.ZoneID, "zone_id": lb.ZoneID,
} }
res = append(res, temp) res = append(res, temp)
} }
return res return res
} }

View File

@@ -1,119 +1,119 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package lb package lb
import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
func lbResourceSchemaMake() map[string]*schema.Schema { func lbResourceSchemaMake() map[string]*schema.Schema {
sch := createLBSchema() sch := createLBSchema()
sch["rg_id"] = &schema.Schema{ sch["rg_id"] = &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
Required: true, Required: true,
} }
sch["name"] = &schema.Schema{ sch["name"] = &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
} }
sch["zone_id"] = &schema.Schema{ sch["zone_id"] = &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
Computed: true, Computed: true,
} }
sch["extnet_id"] = &schema.Schema{ sch["extnet_id"] = &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
} }
sch["vins_id"] = &schema.Schema{ sch["vins_id"] = &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
} }
sch["start"] = &schema.Schema{ sch["start"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
Default: true, Default: true,
} }
sch["desc"] = &schema.Schema{ sch["desc"] = &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
Computed: true, Computed: true,
} }
sch["enable"] = &schema.Schema{ sch["enable"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
sch["restart"] = &schema.Schema{ sch["restart"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
sch["restore"] = &schema.Schema{ sch["restore"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
sch["safe"] = &schema.Schema{ sch["safe"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Default: true, Default: true,
Optional: true, Optional: true,
} }
sch["config_reset"] = &schema.Schema{ sch["config_reset"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
///4.4.0 ///4.4.0
sch["ha_mode"] = &schema.Schema{ sch["ha_mode"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
sch["sysctl_params"] = &schema.Schema{ sch["sysctl_params"] = &schema.Schema{
Type: schema.TypeList, Type: schema.TypeList,
Optional: true, Optional: true,
Elem: &schema.Schema{ Elem: &schema.Schema{
Type: schema.TypeMap, Type: schema.TypeMap,
Elem: &schema.Schema{ Elem: &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
}, },
}, },
} }
/// ///
sch["permanently"] = &schema.Schema{ sch["permanently"] = &schema.Schema{
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
} }
return sch return sch
} }

View File

@@ -1,396 +1,396 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package lb package lb
import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
func createLBSchema() map[string]*schema.Schema { func createLBSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{ return map[string]*schema.Schema{
"account_id": { "account_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"ha_mode": { "ha_mode": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"backend_haip": { "backend_haip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"backends": { "backends": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"algorithm": { "algorithm": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"server_default_settings": { "server_default_settings": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"downinter": { "downinter": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"fall": { "fall": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"inter": { "inter": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"maxconn": { "maxconn": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"maxqueue": { "maxqueue": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"rise": { "rise": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"slowstart": { "slowstart": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"weight": { "weight": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
"servers": { "servers": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"address": { "address": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"check": { "check": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"port": { "port": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"server_settings": { "server_settings": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"downinter": { "downinter": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"fall": { "fall": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"inter": { "inter": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"maxconn": { "maxconn": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"maxqueue": { "maxqueue": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"rise": { "rise": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"slowstart": { "slowstart": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"weight": { "weight": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
}, },
}, },
}, },
}, },
}, },
}, },
"created_by": { "created_by": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"created_time": { "created_time": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"deleted_by": { "deleted_by": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"deleted_time": { "deleted_time": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"desc": { "desc": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"dp_api_user": { "dp_api_user": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"extnet_id": { "extnet_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"frontend_haip": { "frontend_haip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"frontends": { "frontends": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"backend": { "backend": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"bindings": { "bindings": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"address": { "address": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"port": { "port": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
"gid": { "gid": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"lb_id": { "lb_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"manager_id": { "manager_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"manager_type": { "manager_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"image_id": { "image_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"milestones": { "milestones": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"part_k8s": { "part_k8s": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"primary_node": { "primary_node": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"backend_ip": { "backend_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"compute_id": { "compute_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"frontend_ip": { "frontend_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"mgmt_ip": { "mgmt_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"network_id": { "network_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
"rg_id": { "rg_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"rg_name": { "rg_name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"secondary_node": { "secondary_node": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"backend_ip": { "backend_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"compute_id": { "compute_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"frontend_ip": { "frontend_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"guid": { "guid": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"mgmt_ip": { "mgmt_ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"network_id": { "network_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
}, },
}, },
}, },
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"tech_status": { "tech_status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"updated_by": { "updated_by": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"updated_time": { "updated_time": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"user_managed": { "user_managed": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"vins_id": { "vins_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
} }
} }

View File

@@ -1,36 +1,36 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package locations package locations
type Location struct { type Location struct {
GridID int `json:"gid"` GridID int `json:"gid"`
Id int `json:"id"` Id int `json:"id"`
Guid int `json:"guid"` Guid int `json:"guid"`
LocationCode string `json:"locationCode"` LocationCode string `json:"locationCode"`
Name string `json:"name"` Name string `json:"name"`
NetworkModes []string `json:"network_modes"` NetworkModes []string `json:"network_modes"`
SDNSupport bool `json:"sdn_support"` SDNSupport bool `json:"sdn_support"`
Flag string `json:"flag"` Flag string `json:"flag"`
Meta []interface{} `json:"_meta"` Meta []interface{} `json:"_meta"`
CKey string `json:"_ckey"` CKey string `json:"_ckey"`
} }
type LocationsList []Location type LocationsList []Location

View File

@@ -1,91 +1,91 @@
/* /*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
) )
func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error { func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d", log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d",
item.Name, item.ID) item.Name, item.ID)
d.Set("zone_id", int(item.ID)) d.Set("zone_id", int(item.ID))
d.Set("guid", int(item.GUID)) d.Set("guid", int(item.GUID))
d.Set("gid", int(item.GID)) d.Set("gid", int(item.GID))
d.Set("name", item.Name) d.Set("name", item.Name)
d.Set("description", item.Description) d.Set("description", item.Description)
d.Set("deletable", item.Deletable) d.Set("deletable", item.Deletable)
d.Set("status", item.Status) d.Set("status", item.Status)
d.Set("created_time", item.CreatedTime) d.Set("created_time", item.CreatedTime)
d.Set("updated_time", item.UpdatedTime) d.Set("updated_time", item.UpdatedTime)
d.Set("node_ids", item.NodeIDs) d.Set("node_ids", item.NodeIDs)
d.Set("account_ids", item.AccountIDs) d.Set("account_ids", item.AccountIDs)
d.Set("compute_ids", item.ComputeIDs) d.Set("compute_ids", item.ComputeIDs)
d.Set("extnet_ids", item.ExtnetIDs) d.Set("extnet_ids", item.ExtnetIDs)
d.Set("vins_ids", item.VinsIDs) d.Set("vins_ids", item.VinsIDs)
d.Set("lb_ids", item.LBIDs) d.Set("lb_ids", item.LBIDs)
d.Set("bservice_ids", item.BserviceIDs) d.Set("bservice_ids", item.BserviceIDs)
d.Set("k8s_ids", item.K8SIDs) d.Set("k8s_ids", item.K8SIDs)
d.Set("auto_start", item.AutoStart) d.Set("auto_start", item.AutoStart)
log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete", log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
item.Name, item.ID) item.Name, item.ID)
return nil return nil
} }
func flattenZoneList(zone *zone.ListZones) []map[string]interface{} { func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
log.Debugf("flattenZoneList start") log.Debugf("flattenZoneList start")
res := make([]map[string]interface{}, 0, len(zone.Data)) res := make([]map[string]interface{}, 0, len(zone.Data))
for _, zone := range zone.Data { for _, zone := range zone.Data {
temp := map[string]interface{}{ temp := map[string]interface{}{
"zone_id": int(zone.ID), "zone_id": int(zone.ID),
"guid": int(zone.GUID), "guid": int(zone.GUID),
"gid": int(zone.GID), "gid": int(zone.GID),
"name": zone.Name, "name": zone.Name,
"description": zone.Description, "description": zone.Description,
"deletable": zone.Deletable, "deletable": zone.Deletable,
"status": zone.Status, "status": zone.Status,
"created_time": zone.CreatedTime, "created_time": zone.CreatedTime,
"updated_time": zone.UpdatedTime, "updated_time": zone.UpdatedTime,
"node_ids": zone.NodeIDs, "node_ids": zone.NodeIDs,
"auto_start": zone.AutoStart, "auto_start": zone.AutoStart,
} }
res = append(res, temp) res = append(res, temp)
} }
log.Debugf("flattenZoneList end") log.Debugf("flattenZoneList end")
return res return res
} }

View File

@@ -1,62 +1,62 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"context" "context"
"strconv" "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
) )
func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) { func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := zone.GetRequest{} req := zone.GetRequest{}
if d.Id() != "" { if d.Id() != "" {
zoneId, _ := strconv.ParseUint(d.Id(), 10, 64) zoneId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.ID = zoneId req.ID = zoneId
} else { } else {
req.ID = uint64(d.Get("zone_id").(int)) req.ID = uint64(d.Get("zone_id").(int))
} }
zoneData, err := c.CloudAPI().Zone().Get(ctx, req) zoneData, err := c.CloudAPI().Zone().Get(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return zoneData, nil return zoneData, nil
} }

View File

@@ -1,85 +1,85 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"context" "context"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
) )
func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) { func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := zone.ListRequest{} req := zone.ListRequest{}
if byId, ok := d.GetOk("by_id"); ok { if byId, ok := d.GetOk("by_id"); ok {
req.ByID = uint64(byId.(int)) req.ByID = uint64(byId.(int))
} }
if gid, ok := d.GetOk("gid"); ok { if gid, ok := d.GetOk("gid"); ok {
req.GID = uint64(gid.(int)) req.GID = uint64(gid.(int))
} }
if name, ok := d.GetOk("name"); ok { if name, ok := d.GetOk("name"); ok {
req.Name = name.(string) req.Name = name.(string)
} }
if description, ok := d.GetOk("description"); ok { if description, ok := d.GetOk("description"); ok {
req.Description = description.(string) req.Description = description.(string)
} }
if status, ok := d.GetOk("status"); ok { if status, ok := d.GetOk("status"); ok {
req.Status = status.(string) req.Status = status.(string)
} }
if deletable, ok := d.GetOk("deletable"); ok { if deletable, ok := d.GetOk("deletable"); ok {
req.Deletable = deletable.(bool) req.Deletable = deletable.(bool)
} }
if nodeID, ok := d.GetOk("nodeId"); ok { if nodeID, ok := d.GetOk("nodeId"); ok {
req.NodeID = uint64(nodeID.(int)) req.NodeID = uint64(nodeID.(int))
} }
if sortBy, ok := d.GetOk("sort_by"); ok { if sortBy, ok := d.GetOk("sort_by"); ok {
req.SortBy = sortBy.(string) req.SortBy = sortBy.(string)
} }
if size, ok := d.GetOk("size"); ok { if size, ok := d.GetOk("size"); ok {
req.Size = uint64(size.(int)) req.Size = uint64(size.(int))
} }
if page, ok := d.GetOk("page"); ok { if page, ok := d.GetOk("page"); ok {
req.Page = uint64(page.(int)) req.Page = uint64(page.(int))
} }
zoneList, err := c.CloudAPI().Zone().List(ctx, req) zoneList, err := c.CloudAPI().Zone().List(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return zoneList, nil return zoneList, nil
} }

View File

@@ -68,6 +68,34 @@ func flattenFlipgroup(d *schema.ResourceData, flip *flipgroup.RecordFLIPGroup) {
d.Set("updated_time", flip.UpdatedTime) d.Set("updated_time", flip.UpdatedTime)
} }
func flattenFlipgroupResource(d *schema.ResourceData, flip *flipgroup.RecordFLIPGroup) {
d.Set("flipgroup_id", flip.ID)
d.Set("account_id", flip.AccountID)
d.Set("account_name", flip.AccountName)
d.Set("client_ids", flip.ClientIDs)
d.Set("client_names", flip.ClientNames)
d.Set("client_type", flip.ClientType)
d.Set("conn_id", flip.ConnID)
d.Set("conn_type", flip.ConnType)
d.Set("created_by", flip.CreatedBy)
d.Set("created_time", flip.CreatedTime)
d.Set("default_gw", flip.DefaultGW)
d.Set("deleted_by", flip.DeletedBy)
d.Set("deleted_time", flip.DeletedTime)
d.Set("desc", flip.Description)
d.Set("gid", flip.GID)
d.Set("guid", flip.GUID)
d.Set("ip", flip.IP)
d.Set("milestones", flip.Milestones)
d.Set("name", flip.Name)
d.Set("net_id", flip.NetID)
d.Set("net_type", flip.NetType)
d.Set("network", flip.Network)
d.Set("status", flip.Status)
d.Set("updated_by", flip.UpdatedBy)
d.Set("updated_time", flip.UpdatedTime)
}
func flattenFlipgroupsList(fg *flipgroup.ListFLIPGroups) []map[string]interface{} { func flattenFlipgroupsList(fg *flipgroup.ListFLIPGroups) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(fg.Data)) res := make([]map[string]interface{}, 0, len(fg.Data))
for _, flip := range fg.Data { for _, flip := range fg.Data {

View File

@@ -110,7 +110,7 @@ func resourceFlipgroupRead(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("The flipgroup status is destroyed and cannot be read.") return diag.Errorf("The flipgroup status is destroyed and cannot be read.")
} }
flattenFlipgroup(d, fg) flattenFlipgroupResource(d, fg)
log.Debugf("resourceFlipgroupRead: after flattenFlipgroup: flipgroup_id %s, name %s", log.Debugf("resourceFlipgroupRead: after flattenFlipgroup: flipgroup_id %s, name %s",
d.Id(), d.Get("name").(string)) d.Id(), d.Get("name").(string))

View File

@@ -1466,14 +1466,14 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Description: "insert ssl certificate in x509 pem format", Description: "insert ssl certificate in x509 pem format",
}, },
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false),
Default: "Q35", Default: "Q35",
Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35", Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35",
}, },
"lb_sysctl_params": { "lb_sysctl_params": {
Type: schema.TypeList, Type: schema.TypeList,
Optional: true, Optional: true,
Description: "Custom sysctl values for Load Balancer instance. Applied on boot.", Description: "Custom sysctl values for Load Balancer instance. Applied on boot.",
@@ -1810,19 +1810,19 @@ func resourceK8sWgSchemaMake() map[string]*schema.Schema {
), ),
Description: "Node RAM in MB.", Description: "Node RAM in MB.",
}, },
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false),
Default: "Q35", Default: "Q35",
Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35", Description: "Type of the emulated system. Possible values: i440fx, Q35. Default: Q35",
}, },
"disk": { "disk": {
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
Computed: true, Computed: true,
Description: "Worker node boot disk size. If unspecified or 0, size is defined by OS image size.", Description: "Worker node boot disk size. If unspecified or 0, size is defined by OS image size.",
}, },
"labels": { "labels": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,

View File

@@ -17,8 +17,10 @@ func checkParamsExistence(ctx context.Context, d *schema.ResourceData, c *contro
errs = append(errs, err) errs = append(errs, err)
} }
if err := ic.ExistImage(ctx, uint64(d.Get("image_id").(int)), c); err != nil { if !d.Get("create_blank").(bool) {
errs = append(errs, err) if err := ic.ExistImage(ctx, uint64(d.Get("image_id").(int)), c); err != nil {
errs = append(errs, err)
}
} }
if netErrs := existNetworks(ctx, d, c); errs != nil { if netErrs := existNetworks(ctx, d, c); errs != nil {

View File

@@ -251,7 +251,32 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86")
apiResp, err := c.CloudBroker().KVMX86().Create(ctx, createReqX86) var apiResp uint64
var err error
if d.Get("create_blank").(bool) {
log.Debugf("resourceComputeCreate: using createBlank endpoint")
createBlankReq := kvmx86.CreateBlankRequest{
RGID: createReqX86.RGID,
Name: createReqX86.Name,
CPU: createReqX86.CPU,
RAM: createReqX86.RAM,
StoragePolicyID: createReqX86.StoragePolicyID,
WithoutBootDisk: createReqX86.WithoutBootDisk,
BootDisk: createReqX86.BootDisk,
SEPID: createReqX86.SEPID,
Pool: createReqX86.Pool,
DataDisks: createReqX86.DataDisks,
Interfaces: createReqX86.Interfaces,
Description: createReqX86.Description,
Chipset: createReqX86.Chipset,
PreferredCPU: createReqX86.PreferredCPU,
ZoneID: createReqX86.ZoneID,
OSVersion: createReqX86.OSVersion,
}
apiResp, err = c.CloudBroker().KVMX86().CreateBlank(ctx, createBlankReq)
} else {
apiResp, err = c.CloudBroker().KVMX86().Create(ctx, createReqX86)
}
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
@@ -448,6 +473,9 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
if nodeID, ok := d.GetOk("node_id"); ok { if nodeID, ok := d.GetOk("node_id"); ok {
req.NodeID = uint64(nodeID.(int)) req.NodeID = uint64(nodeID.(int))
} }
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", computeId) log.Debugf("resourceComputeCreate: starting Compute ID %d after completing its resource configuration", computeId)
if _, err := c.CloudBroker().Compute().Start(ctx, req); err != nil { if _, err := c.CloudBroker().Compute().Start(ctx, req); err != nil {
warnings.Add(err) warnings.Add(err)

View File

@@ -3409,6 +3409,12 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Default: false, Default: false,
}, },
"create_blank": {
Type: schema.TypeBool,
Optional: true,
Default: false,
Description: "If True, the compute is created via kvmx86/createBlank endpoint (without OS image). The image_id field is not required in this case.",
},
"boot_disk_size": { "boot_disk_size": {
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
@@ -3531,22 +3537,22 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
DiffSuppressFunc: networkSubresIPAddreDiffSupperss, DiffSuppressFunc: networkSubresIPAddreDiffSupperss,
Description: "unique_identifier of LogicalPort on SDN side", Description: "unique_identifier of LogicalPort on SDN side",
}, },
"enabled": { "enabled": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
Computed: true, Computed: true,
Description: "network enable flag", Description: "network enable flag",
}, },
"net_mask": { "net_mask": {
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Optional: true,
Computed: true, Computed: true,
Description: "Subnet mask, used only for DPDK and VFNIC network types", Description: "Subnet mask, used only for DPDK and VFNIC network types",
},
}, },
}, },
Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.",
}, },
Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.",
},
"libvirt_settings": { "libvirt_settings": {
Type: schema.TypeSet, Type: schema.TypeSet,
@@ -3757,11 +3763,9 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Description: "Storage endpoint provider ID; by default the same with boot disk", Description: "Storage endpoint provider ID; by default the same with boot disk",
}, },
"disk_type": { "disk_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
Optional: true, Description: "The type of disk in terms of its role in compute: 'B=Boot, D=Data'",
ValidateFunc: validation.StringInSlice([]string{"B", "D"}, false),
Description: "The type of disk in terms of its role in compute: 'B=Boot, D=Data'",
}, },
"pool": { "pool": {
Type: schema.TypeString, Type: schema.TypeString,

View File

@@ -209,7 +209,11 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
} }
if isStopRequired { if isStopRequired {
if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil { req := compute.StartRequest{ComputeID: computeId}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
if _, err := c.CloudBroker().Compute().Start(ctx, req); err != nil {
return err return err
} }
} }
@@ -362,9 +366,6 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
if diskConv["sep_id"].(int) != 0 { if diskConv["sep_id"].(int) != 0 {
req.SepID = uint64(diskConv["sep_id"].(int)) req.SepID = uint64(diskConv["sep_id"].(int))
} }
if diskConv["disk_type"].(string) != "" {
req.DiskType = diskConv["disk_type"].(string)
}
if diskConv["pool"].(string) != "" { if diskConv["pool"].(string) != "" {
req.Pool = diskConv["pool"].(string) req.Pool = diskConv["pool"].(string)
} }
@@ -981,7 +982,13 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
if needStart { if needStart {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if numErr, err := utilityComputeStart(ctx, computeId, m); err != nil { var altBootID uint64
if altBootIDRaw, ok := d.Get("alt_boot_id").(int); ok {
altBootID = uint64(altBootIDRaw)
} else {
altBootID = 0
}
if numErr, err := utilityComputeStart(ctx, altBootID, computeId, m); err != nil {
apiErrCount += numErr apiErrCount += numErr
lastSavedError = err lastSavedError = err
} }
@@ -1308,7 +1315,11 @@ func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interfa
// If used to be STARTED, we need to start it after update // If used to be STARTED, we need to start it after update
if isStopRequired { if isStopRequired {
if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil { req := compute.StartRequest{ComputeID: computeId}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
req.AltBootID = uint64(altBootID)
}
if _, err := c.CloudBroker().Compute().Start(ctx, req); err != nil {
return err return err
} }
} }
@@ -1779,6 +1790,9 @@ func utilityComputeRollback(ctx context.Context, d *schema.ResourceData, m inter
} }
startReq := compute.StartRequest{ComputeID: computeId} startReq := compute.StartRequest{ComputeID: computeId}
if altBootID, ok := d.Get("alt_boot_id").(int); ok {
startReq.AltBootID = uint64(altBootID)
}
log.Debugf("utilityComputeRollback: starting compute %d", computeId) log.Debugf("utilityComputeRollback: starting compute %d", computeId)
@@ -2036,10 +2050,14 @@ func utilityComputeStop(ctx context.Context, d *schema.ResourceData, m interface
return nil return nil
} }
func utilityComputeStart(ctx context.Context, computeID uint64, m interface{}) (int, error) { func utilityComputeStart(ctx context.Context, computeID uint64, altBootID uint64, m interface{}) (int, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
startReq := compute.StartRequest{ComputeID: computeID} startReq := compute.StartRequest{ComputeID: computeID}
if altBootID > 0 {
startReq.AltBootID = altBootID
}
log.Debugf("utilityComputeStart: starting compute %d", computeID) log.Debugf("utilityComputeStart: starting compute %d", computeID)
_, err := c.CloudBroker().Compute().Start(ctx, startReq) _, err := c.CloudBroker().Compute().Start(ctx, startReq)
if err != nil { if err != nil {

View File

@@ -15,11 +15,11 @@ func flattenTrunkResource(d *schema.ResourceData, details *trunk.ItemTrunk) {
d.Set("name", details.Name) d.Set("name", details.Name)
d.Set("mac", details.MAC) d.Set("mac", details.MAC)
d.Set("description", details.Description) d.Set("description", details.Description)
d.Set("accountIds", details.AccountIDs) d.Set("account_ids", details.AccountIDs)
d.Set("ovsBridge", details.OVSBridge) d.Set("ovs_bridge", details.OVSBridge)
d.Set("nativeVlanId", details.NativeVLANID) d.Set("native_vlan_id", details.NativeVLANID)
d.Set("status", details.Status) d.Set("status", details.Status)
d.Set("trunkTags", details.TrunkTags) d.Set("trunk_tags", details.TrunkTags)
d.Set("created_at", details.CreatedAt) d.Set("created_at", details.CreatedAt)
d.Set("created_by", details.CreatedBy) d.Set("created_by", details.CreatedBy)
d.Set("updated_at", details.UpdatedAt) d.Set("updated_at", details.UpdatedAt)

View File

@@ -33,6 +33,7 @@ package vfpool
import ( import (
"context" "context"
"fmt"
"strconv" "strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -85,6 +86,12 @@ func resourceVFPoolCreate(ctx context.Context, d *schema.ResourceData, m interfa
} }
config, configOk := d.GetOk("config") config, configOk := d.GetOk("config")
enableVal := d.Get("enable").(bool)
if enableVal && !configOk {
return diag.FromErr(fmt.Errorf("enable requires config to be set"))
}
if configOk { if configOk {
configArray := config.(*schema.Set).List() configArray := config.(*schema.Set).List()
req.Config = make([]vfpool.Config, 0, len(configArray)) req.Config = make([]vfpool.Config, 0, len(configArray))
@@ -117,10 +124,8 @@ func resourceVFPoolCreate(ctx context.Context, d *schema.ResourceData, m interfa
warnings := dc.Warnings{} warnings := dc.Warnings{}
if enable, ok := d.GetOk("enable"); ok { if err := utilityVFPoolEnabled(ctx, m, enableVal, vfPoolID); err != nil {
if err := utilityVFPoolEnabled(ctx, m, enable.(bool), vfPoolID, configOk); err != nil { warnings.Add(err)
warnings.Add(err)
}
} }
log.Debugf("resourceVFPoolCreate: create VFPool with ID: %d, complete", vfPoolID) log.Debugf("resourceVFPoolCreate: create VFPool with ID: %d, complete", vfPoolID)
@@ -147,20 +152,12 @@ func resourceVFPoolUpdate(ctx context.Context, d *schema.ResourceData, m interfa
log.Debugf("resourceVFPoolUpdate: called VFPool with id %d", vfPoolID) log.Debugf("resourceVFPoolUpdate: called VFPool with id %d", vfPoolID)
_, ok := d.GetOk("config") if d.HasChanges("name", "description", "account_access", "rg_access", "config", "enable") {
if d.HasChanges("name,", "description", "account_access", "rg_access,", "config") {
if err := utilityVFPoolUpdate(ctx, d, m, vfPoolID); err != nil { if err := utilityVFPoolUpdate(ctx, d, m, vfPoolID); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
if d.HasChange("enable") {
if err := utilityVFPoolEnabled(ctx, m, d.Get("enable").(bool), vfPoolID, ok); err != nil {
return diag.FromErr(err)
}
}
log.Debugf("resourceVFPoolUpdate: update VFPool with id %d, complete", vfPoolID) log.Debugf("resourceVFPoolUpdate: update VFPool with id %d, complete", vfPoolID)
return resourceVFPoolRead(ctx, d, m) return resourceVFPoolRead(ctx, d, m)

View File

@@ -64,37 +64,26 @@ func utilityVFpoolCheckPresence(ctx context.Context, d *schema.ResourceData, m i
return vfpoolData, nil return vfpoolData, nil
} }
func utilityVFPoolEnabled(ctx context.Context, m interface{}, enable bool, vfPoolID uint64, configOk bool) error { func utilityVFPoolEnabled(ctx context.Context, m interface{}, enable bool, vfPoolID uint64) error {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
if enable && configOk { var err error
req := vfpool.EnableRequest{
VFPoolID: vfPoolID, if enable {
} _, err = c.CloudBroker().VFPool().Enable(ctx, vfpool.EnableRequest{VFPoolID: vfPoolID})
_, err := c.CloudBroker().VFPool().Enable(ctx, req) } else {
if err != nil { _, err = c.CloudBroker().VFPool().Disable(ctx, vfpool.DisableRequest{VFPoolID: vfPoolID})
return err
}
}
if enable && !configOk {
return fmt.Errorf("you must provide configuration for this resource, after enabling it")
}
if !enable {
req := vfpool.DisableRequest{
VFPoolID: vfPoolID,
}
_, err := c.CloudBroker().VFPool().Disable(ctx, req)
if err != nil {
return err
}
} }
log.Debugf("utilityVFPoolEnabled: enable=%v vfPool ID %d after completing its resource configuration", enable, vfPoolID) return err
return nil
} }
func utilityVFPoolUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, vfPoolID uint64) error { func utilityVFPoolUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, vfPoolID uint64) error {
hasConfig := len(d.Get("config").(*schema.Set).List()) > 0
if d.Get("enable").(bool) && !hasConfig {
return fmt.Errorf("enable requires config to be set")
}
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
vfPool, err := utilityVFpoolCheckPresence(ctx, d, m) vfPool, err := utilityVFpoolCheckPresence(ctx, d, m)
@@ -190,7 +179,7 @@ func utilityVFPoolUpdate(ctx context.Context, d *schema.ResourceData, m interfac
} }
log.Debugf("utilityVFPoolUpdate: update vfPool with ID: %d, complete with params=%v", vfPoolID, req) log.Debugf("utilityVFPoolUpdate: update vfPool with ID: %d, complete with params=%v", vfPoolID, req)
if len(d.Get("config").(*schema.Set).List()) > 0 && d.Get("enable").(bool) { if hasConfig && d.Get("enable").(bool) {
reqEnable := vfpool.EnableRequest{ reqEnable := vfpool.EnableRequest{
VFPoolID: vfPoolID, VFPoolID: vfPoolID,
} }
@@ -201,8 +190,6 @@ func utilityVFPoolUpdate(ctx context.Context, d *schema.ResourceData, m interfac
return err return err
} }
log.Debugf("utilityVFPoolUpdate: enable vfPool with ID: %d, complete", vfPoolID) log.Debugf("utilityVFPoolUpdate: enable vfPool with ID: %d, complete", vfPoolID)
} else {
return (fmt.Errorf("the vfPool is not enabled after update, you must provide configuration for this resource, after enabling it"))
} }
return nil return nil

View File

@@ -1,91 +1,91 @@
/* /*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
) )
func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error { func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d", log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d",
item.Name, item.ID) item.Name, item.ID)
d.Set("zone_id", int(item.ID)) d.Set("zone_id", int(item.ID))
d.Set("guid", int(item.GUID)) d.Set("guid", int(item.GUID))
d.Set("gid", int(item.GID)) d.Set("gid", int(item.GID))
d.Set("name", item.Name) d.Set("name", item.Name)
d.Set("description", item.Description) d.Set("description", item.Description)
d.Set("deletable", item.Deletable) d.Set("deletable", item.Deletable)
d.Set("status", item.Status) d.Set("status", item.Status)
d.Set("created_time", item.CreatedTime) d.Set("created_time", item.CreatedTime)
d.Set("updated_time", item.UpdatedTime) d.Set("updated_time", item.UpdatedTime)
d.Set("node_ids", item.NodeIDs) d.Set("node_ids", item.NodeIDs)
d.Set("account_ids", item.AccountIDs) d.Set("account_ids", item.AccountIDs)
d.Set("compute_ids", item.ComputeIDs) d.Set("compute_ids", item.ComputeIDs)
d.Set("extnet_ids", item.ExtnetIDs) d.Set("extnet_ids", item.ExtnetIDs)
d.Set("vins_ids", item.VinsIDs) d.Set("vins_ids", item.VinsIDs)
d.Set("lb_ids", item.LBIDs) d.Set("lb_ids", item.LBIDs)
d.Set("bservice_ids", item.BserviceIDs) d.Set("bservice_ids", item.BserviceIDs)
d.Set("k8s_ids", item.K8SIDs) d.Set("k8s_ids", item.K8SIDs)
d.Set("auto_start", item.AutoStart) d.Set("auto_start", item.AutoStart)
log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete", log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
item.Name, item.ID) item.Name, item.ID)
return nil return nil
} }
func flattenZoneList(zone *zone.ListZones) []map[string]interface{} { func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
log.Debugf("flattenZoneList start") log.Debugf("flattenZoneList start")
res := make([]map[string]interface{}, 0, len(zone.Data)) res := make([]map[string]interface{}, 0, len(zone.Data))
for _, zone := range zone.Data { for _, zone := range zone.Data {
temp := map[string]interface{}{ temp := map[string]interface{}{
"zone_id": int(zone.ID), "zone_id": int(zone.ID),
"guid": int(zone.GUID), "guid": int(zone.GUID),
"gid": int(zone.GID), "gid": int(zone.GID),
"name": zone.Name, "name": zone.Name,
"description": zone.Description, "description": zone.Description,
"deletable": zone.Deletable, "deletable": zone.Deletable,
"status": zone.Status, "status": zone.Status,
"created_time": zone.CreatedTime, "created_time": zone.CreatedTime,
"updated_time": zone.UpdatedTime, "updated_time": zone.UpdatedTime,
"node_ids": zone.NodeIDs, "node_ids": zone.NodeIDs,
"auto_start": zone.AutoStart, "auto_start": zone.AutoStart,
} }
res = append(res, temp) res = append(res, temp)
} }
log.Debugf("flattenZoneList end") log.Debugf("flattenZoneList end")
return res return res
} }

View File

@@ -1,159 +1,159 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"context" "context"
"strconv" "strconv"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) { func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := zone.GetRequest{} req := zone.GetRequest{}
if d.Id() != "" { if d.Id() != "" {
zoneId, _ := strconv.ParseUint(d.Id(), 10, 64) zoneId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.ID = zoneId req.ID = zoneId
} else { } else {
req.ID = uint64(d.Get("zone_id").(int)) req.ID = uint64(d.Get("zone_id").(int))
} }
zoneData, err := c.CloudBroker().Zone().Get(ctx, req) zoneData, err := c.CloudBroker().Zone().Get(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return zoneData, nil return zoneData, nil
} }
func utilityZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, zoneID uint64) error { func utilityZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, zoneID uint64) error {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
if d.HasChanges("name", "description", "auto_start") { if d.HasChanges("name", "description", "auto_start") {
req := zone.UpdateRequest{ req := zone.UpdateRequest{
ID: zoneID, ID: zoneID,
} }
if d.HasChange("name") { if d.HasChange("name") {
req.Name = d.Get("name").(string) req.Name = d.Get("name").(string)
} }
if d.HasChange("description") { if d.HasChange("description") {
req.Description = d.Get("description").(string) req.Description = d.Get("description").(string)
} }
if d.HasChange("auto_start") { if d.HasChange("auto_start") {
req.AutoStart = d.Get("auto_start").(bool) req.AutoStart = d.Get("auto_start").(bool)
} }
_, err := c.CloudBroker().Zone().Update(ctx, req) _, err := c.CloudBroker().Zone().Update(ctx, req)
if err != nil { if err != nil {
return err return err
} }
log.Debugf("utilityZoneUpdate: update zone with ID: %d, complete with params=%v", zoneID, req) log.Debugf("utilityZoneUpdate: update zone with ID: %d, complete with params=%v", zoneID, req)
} }
addedNodes := make([]interface{}, 0) addedNodes := make([]interface{}, 0)
removedNodes := make([]interface{}, 0) removedNodes := make([]interface{}, 0)
old_set, new_set := d.GetChange("node_ids") old_set, new_set := d.GetChange("node_ids")
oldSlice := old_set.([]interface{}) oldSlice := old_set.([]interface{})
newSlice := new_set.([]interface{}) newSlice := new_set.([]interface{})
for _, oldElem := range oldSlice { for _, oldElem := range oldSlice {
if !containsNodes(newSlice, oldElem) { if !containsNodes(newSlice, oldElem) {
removedNodes = append(removedNodes, oldElem) removedNodes = append(removedNodes, oldElem)
} }
} }
for _, newElem := range newSlice { for _, newElem := range newSlice {
if !containsNodes(oldSlice, newElem) { if !containsNodes(oldSlice, newElem) {
addedNodes = append(addedNodes, newElem) addedNodes = append(addedNodes, newElem)
} }
} }
log.Debugf("Found node_ids change with %v deletion(s) and %v addition(s) [zoneID=%v]", len(removedNodes), len(addedNodes), zoneID) log.Debugf("Found node_ids change with %v deletion(s) and %v addition(s) [zoneID=%v]", len(removedNodes), len(addedNodes), zoneID)
if len(addedNodes) > 0 { if len(addedNodes) > 0 {
addedUint := make([]uint64, len(addedNodes)) addedUint := make([]uint64, len(addedNodes))
for i, v := range addedNodes { for i, v := range addedNodes {
addedUint[i] = uint64(v.(int)) addedUint[i] = uint64(v.(int))
} }
req := zone.AddNodeRequest{ req := zone.AddNodeRequest{
ID: zoneID, ID: zoneID,
NodeIDs: addedUint, NodeIDs: addedUint,
} }
if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil { if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil {
return err return err
} }
} }
if len(removedNodes) > 0 { if len(removedNodes) > 0 {
removedUint := make([]uint64, len(removedNodes)) removedUint := make([]uint64, len(removedNodes))
for i, v := range removedNodes { for i, v := range removedNodes {
removedUint[i] = uint64(v.(int)) removedUint[i] = uint64(v.(int))
} }
req := zone.DelNodeRequest{ req := zone.DelNodeRequest{
ID: zoneID, ID: zoneID,
NodeIDs: removedUint, NodeIDs: removedUint,
} }
log.Debug("del") log.Debug("del")
log.Debug(req.NodeIDs) log.Debug(req.NodeIDs)
if _, err := c.CloudBroker().Zone().DelNode(ctx, req); err != nil { if _, err := c.CloudBroker().Zone().DelNode(ctx, req); err != nil {
return err return err
} }
} }
return nil return nil
} }
func containsNodes(set []interface{}, check interface{}) bool { func containsNodes(set []interface{}, check interface{}) bool {
for _, elem := range set { for _, elem := range set {
elemConv := elem.(int) elemConv := elem.(int)
checkConv := check.(int) checkConv := check.(int)
if elemConv == checkConv { if elemConv == checkConv {
return true return true
} }
} }
return false return false
} }

View File

@@ -1,85 +1,85 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package zone package zone
import ( import (
"context" "context"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
) )
func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) { func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := zone.ListRequest{} req := zone.ListRequest{}
if byId, ok := d.GetOk("by_id"); ok { if byId, ok := d.GetOk("by_id"); ok {
req.ByID = uint64(byId.(int)) req.ByID = uint64(byId.(int))
} }
if gid, ok := d.GetOk("gid"); ok { if gid, ok := d.GetOk("gid"); ok {
req.GID = uint64(gid.(int)) req.GID = uint64(gid.(int))
} }
if name, ok := d.GetOk("name"); ok { if name, ok := d.GetOk("name"); ok {
req.Name = name.(string) req.Name = name.(string)
} }
if description, ok := d.GetOk("description"); ok { if description, ok := d.GetOk("description"); ok {
req.Description = description.(string) req.Description = description.(string)
} }
if status, ok := d.GetOk("status"); ok { if status, ok := d.GetOk("status"); ok {
req.Status = status.(string) req.Status = status.(string)
} }
if deletable, ok := d.GetOk("deletable"); ok { if deletable, ok := d.GetOk("deletable"); ok {
req.Deletable = deletable.(bool) req.Deletable = deletable.(bool)
} }
if nodeID, ok := d.GetOk("nodeId"); ok { if nodeID, ok := d.GetOk("nodeId"); ok {
req.NodeID = uint64(nodeID.(int)) req.NodeID = uint64(nodeID.(int))
} }
if sortBy, ok := d.GetOk("sort_by"); ok { if sortBy, ok := d.GetOk("sort_by"); ok {
req.SortBy = sortBy.(string) req.SortBy = sortBy.(string)
} }
if size, ok := d.GetOk("size"); ok { if size, ok := d.GetOk("size"); ok {
req.Size = uint64(size.(int)) req.Size = uint64(size.(int))
} }
if page, ok := d.GetOk("page"); ok { if page, ok := d.GetOk("page"); ok {
req.Page = uint64(page.(int)) req.Page = uint64(page.(int))
} }
zoneList, err := c.CloudBroker().Zone().List(ctx, req) zoneList, err := c.CloudBroker().Zone().List(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return zoneList, nil return zoneList, nil
} }

View File

@@ -37,3 +37,4 @@ func DataSourceAccessGroupList() *schema.Resource {
Schema: dataSourceAccessGroupListSchemaMake(), Schema: dataSourceAccessGroupListSchemaMake(),
} }
} }

View File

@@ -49,3 +49,4 @@ func utilityAccessGroupListCheckPresence(ctx context.Context, d *schema.Resource
return accessGroupList, nil return accessGroupList, nil
} }

View File

@@ -37,3 +37,4 @@ func DataSourceDefaultSecurityPolicyList() *schema.Resource {
Schema: dataSourceDefaultSecurityPolicyListSchemaMake(), Schema: dataSourceDefaultSecurityPolicyListSchemaMake(),
} }
} }

View File

@@ -366,3 +366,4 @@ func dataSourceDefaultSecurityPolicyListSchemaMake() map[string]*schema.Schema {
return res return res
} }

View File

@@ -37,3 +37,4 @@ func utilityDefaultSecurityPolicyListCheckPresence(ctx context.Context, d *schem
return defaultSecurityPolicyList, nil return defaultSecurityPolicyList, nil
} }

View File

@@ -52,7 +52,7 @@ func utilitySegmentListCheckPresence(ctx context.Context, d *schema.ResourceData
if updatedTo, ok := d.GetOk("updated_to"); ok { if updatedTo, ok := d.GetOk("updated_to"); ok {
req.UpdatedTo = updatedTo.(string) req.UpdatedTo = updatedTo.(string)
} }
log.Debugf("utilitySegmentListCheckPresence") log.Debugf("utilitySegmentListCheckPresence")
segmentList, err := c.SDN().Segments().List(ctx, req) segmentList, err := c.SDN().Segments().List(ctx, req)
if err != nil { if err != nil {

View File

@@ -105,6 +105,12 @@ resource "decort_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#image_id = 111 #image_id = 111
#создание без образа ОС
#опциональный параметр
#тип - булев
#используется при создании
#create_blank = false
#создание без загрузочного диска в остановленном состоянии #создание без загрузочного диска в остановленном состоянии
#опциональный параметр #опциональный параметр
#если значение равно True, параметры image_id, boot_disk_size, sep_id, pool игнорируются #если значение равно True, параметры image_id, boot_disk_size, sep_id, pool игнорируются
@@ -120,6 +126,12 @@ resource "decort_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#numa_affinity = "loose" #numa_affinity = "loose"
#id образа CD-ROM для загрузки
#опциональный параметр
#тип - целое число
#используется при создании и обновлении
#alt_boot_id = 1
#необходимость запускать ВМ на выделенных CPU ядрах #необходимость запускать ВМ на выделенных CPU ядрах
#опциональный параметр #опциональный параметр
#по умолчанию - false #по умолчанию - false

View File

@@ -83,6 +83,12 @@ resource "decort_cb_kvmvm" "comp" {
#используется при создании #используется при создании
#without_boot_disk = true #without_boot_disk = true
#создание без образа ОС
#опциональный параметр
#тип - булев
#используется при создании
#create_blank = false
#размер загрузочного диска #размер загрузочного диска
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число
@@ -130,7 +136,7 @@ resource "decort_cb_kvmvm" "comp" {
#id образа CD-ROM для загрузки #id образа CD-ROM для загрузки
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число
#используется при обновлении, при повторном старте вм #используется при создании и обновлении
#alt_boot_id = 1 #alt_boot_id = 1
#необходимость выравнивать ВМ по NUMA #необходимость выравнивать ВМ по NUMA