You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.2 KiB
84 lines
3.2 KiB
7 months ago
|
package kvmvm
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/hashicorp/terraform-plugin-framework/diag"
|
||
|
"github.com/hashicorp/terraform-plugin-framework/types"
|
||
|
"github.com/hashicorp/terraform-plugin-log/tflog"
|
||
|
decort "repository.basistech.ru/BASIS/decort-golang-sdk"
|
||
|
"repository.basistech.ru/BASIS/terraform-provider-dynamix/internal/service/cloudapi/ic"
|
||
|
"repository.basistech.ru/BASIS/terraform-provider-dynamix/internal/service/cloudapi/kvmvm/models"
|
||
|
)
|
||
|
|
||
|
// resourceComputeInputChecks checks if rg_id and image_id are valid.
|
||
|
func resourceComputeInputChecks(ctx context.Context, plan *models.ResourceComputeModel, c *decort.DecortClient) diag.Diagnostics {
|
||
|
diags := diag.Diagnostics{}
|
||
|
|
||
|
rgID := uint64(plan.RGID.ValueInt64())
|
||
|
tflog.Info(ctx, "resourceComputeInputChecks: exist resource rg", map[string]any{"rg_id": rgID})
|
||
|
err := ic.ExistRG(ctx, rgID, c)
|
||
|
if err != nil {
|
||
|
diags.AddError(fmt.Sprintf("Cannot get info about rg with ID %v", rgID), err.Error())
|
||
|
}
|
||
|
|
||
|
var imageID uint64
|
||
|
|
||
|
if plan.WithoutBootDisk.IsNull() || !plan.WithoutBootDisk.ValueBool() {
|
||
|
if plan.ImageID.IsNull() {
|
||
|
diags.AddError(fmt.Sprintf("imageId must be specified if the compute with boot disk is to be created"), "")
|
||
|
} else {
|
||
|
imageID = uint64(plan.ImageID.ValueInt64())
|
||
|
}
|
||
|
tflog.Info(ctx, "resourceComputeInputChecks: exist image", map[string]any{"image_id": imageID})
|
||
|
err = ic.ExistImage(ctx, imageID, c)
|
||
|
if err != nil {
|
||
|
diags.AddError(fmt.Sprintf("Cannot get info about image with ID %v", imageID), err.Error())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if !plan.Network.IsNull() {
|
||
|
networkList := plan.Network.Elements()
|
||
|
for _, elem := range networkList {
|
||
|
objVal := elem.(types.Object)
|
||
|
elemMap := objVal.Attributes()
|
||
|
netType := strings.ToUpper(elemMap["net_type"].(types.String).ValueString())
|
||
|
switch netType {
|
||
|
case "VINS":
|
||
|
vinsId := uint64(elemMap["net_id"].(types.Int64).ValueInt64())
|
||
|
err = ic.ExistVins(ctx, vinsId, c)
|
||
|
if err != nil {
|
||
|
diags.AddError(fmt.Sprintf("Cannot create compute because vins ID %d is not allowed or does not exist", vinsId), err.Error())
|
||
|
}
|
||
|
case "EXTNET":
|
||
|
extNetId := uint64(elemMap["net_id"].(types.Int64).ValueInt64())
|
||
|
err = ic.ExistExtNet(ctx, extNetId, c)
|
||
|
if err != nil {
|
||
|
diags.AddError(fmt.Sprintf("Cannot create compute because extnet ID %d is not allowed or does not exist", extNetId), err.Error())
|
||
|
}
|
||
|
case "VFNIC":
|
||
|
if strings.EqualFold(plan.Driver.ValueString(), "KVM_PPC") {
|
||
|
diags.AddError("can't create compute because 'VFNIC' net_type is not allowed for driver 'KVM_PPC'", "")
|
||
|
}
|
||
|
vfpoolId := uint64(elemMap["net_id"].(types.Int64).ValueInt64())
|
||
|
err = ic.ExistVFPool(ctx, vfpoolId, c)
|
||
|
if err != nil {
|
||
|
diags.AddError(fmt.Sprintf("Cannot create compute because vfpool ID %d is not allowed or does not exist", vfpoolId), err.Error())
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if !plan.Pool.IsUnknown() && plan.SepId.IsUnknown() {
|
||
|
diags.AddError("sep_id required if pool name enable", "")
|
||
|
}
|
||
|
|
||
|
if plan.WithoutBootDisk.ValueBool() && (!plan.BootDiskSize.IsUnknown() || !plan.Pool.IsUnknown() || !plan.SepId.IsUnknown()) {
|
||
|
diags.AddError("pool, boot_disk_size and sep_id should be empty if without_boot_disk is true", "")
|
||
|
}
|
||
|
|
||
|
return diags
|
||
|
}
|