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 }