This commit is contained in:
2024-09-25 13:43:26 +03:00
parent 8ad6811e88
commit 6eb6546722
301 changed files with 32134 additions and 73 deletions

View File

@@ -59,7 +59,12 @@ func dataSourceComputeRead(ctx context.Context, d *schema.ResourceData, m interf
}
d.SetId(strconv.Itoa(int(compute.ID)))
flattenDataCompute(d, compute)
pciList, err := utilityComputePCIDevicesList(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
flattenDataCompute(d, compute, pciList)
return nil
}
@@ -664,6 +669,13 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
"pci_devices": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"clones": {
Type: schema.TypeList,
Computed: true,

View File

@@ -310,7 +310,7 @@ func findBootDisk(disks compute.ListComputeDisks) *compute.ItemComputeDisk {
return &compute.ItemComputeDisk{}
}
func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute) error {
func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pciList *compute.ListPCIDevices) error {
// This function expects that compFacts string contains response from API compute/get,
// i.e. detailed information about compute instance.
//
@@ -409,6 +409,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute) er
}
d.Set("network", flattenNetwork(computeRec.Interfaces))
d.Set("pci_devices", flattenPCI(*pciList))
return nil
}
@@ -566,7 +567,7 @@ func flattenOsUsers(osUsers compute.ListOSUser) []map[string]interface{} {
return res
}
func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute) {
func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pciList *compute.ListPCIDevices) {
devices, _ := json.Marshal(computeRec.Devices)
userdata, _ := json.Marshal(computeRec.Userdata)
d.Set("acl", flattenACL(computeRec.ACL))
@@ -637,6 +638,17 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("vgpus", computeRec.VGPUs)
d.Set("virtual_image_id", computeRec.VirtualImageID)
d.Set("virtual_image_name", computeRec.VirtualImageName)
d.Set("pci_devices", flattenPCI(*pciList))
}
func flattenPCI(pciList compute.ListPCIDevices) []uint64 {
res := make([]uint64, 0, len(pciList.Data))
for _, v := range pciList.Data {
res = append(res, v.ID)
}
return res
}
func flattenComputeAudits(computeAudits compute.ListAudits) []map[string]interface{} {

View File

@@ -562,6 +562,25 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
warnings.Add(err)
}
}
if ars, ok := d.GetOk("pci_devices"); ok {
log.Debugf("resourceComputeCreate: add pci devices on ComputeID: %d", computeId)
addedPciDevices := ars.(*schema.Set).List()
if len(addedPciDevices) > 0 {
for _, v := range addedPciDevices {
devicesConv := v.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(devicesConv),
}
_, err := c.CloudAPI().Compute().AttachPCIDevice(ctx, req)
if err != nil {
warnings.Add(err)
}
}
}
}
}
log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string))
@@ -584,6 +603,11 @@ func resourceComputeRead(ctx context.Context, d *schema.ResourceData, m interfac
return diag.FromErr(err)
}
pciList, err := utilityComputePCIDevicesList(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
hasChanged := false
switch computeRec.Status {
@@ -622,9 +646,14 @@ func resourceComputeRead(ctx context.Context, d *schema.ResourceData, m interfac
d.SetId("")
return diag.FromErr(err)
}
pciList, err = utilityComputePCIDevicesList(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
}
if err = flattenCompute(d, computeRec); err != nil {
if err = flattenCompute(d, computeRec, pciList); err != nil {
return diag.FromErr(err)
}
@@ -1605,6 +1634,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if d.HasChange("pci_devices") {
if err := utilityComputeUpdatePciDevices(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
// we may reuse dataSourceComputeRead here as we maintain similarity
// between Compute resource and Compute data source schemas
@@ -1671,6 +1706,23 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
pciList, ok := d.GetOk("pci_devices")
if d.Get("permanently").(bool) && ok {
pciDevices := pciList.(*schema.Set).List()
for _, v := range pciDevices {
pciID := v.(int)
req := compute.DetachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(pciID),
}
_, err := c.CloudAPI().Compute().DetachPCIDevice(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
}
req := compute.DeleteRequest{
ComputeID: computeId,
Permanently: d.Get("permanently").(bool),
@@ -2172,6 +2224,15 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default: false,
Description: "Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node.",
},
"pci_devices": {
Type: schema.TypeSet,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "ID of the connected pci devices",
},
// The rest are Compute properties, which are "computed" once it is created
"account_id": {

View File

@@ -34,11 +34,12 @@ package kvmvm
import (
"context"
log "github.com/sirupsen/logrus"
"regexp"
"strconv"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
@@ -234,7 +235,7 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
}
}
needStart:= false
needStart := false
if d.Get("network").(*schema.Set).Len() == 1 || old_set.(*schema.Set).Len() < 1 {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
@@ -272,7 +273,7 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
if needStart {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if numErr, err := utilityComputeStart(ctx, computeId, m); err != nil {
apiErrCount+= numErr
apiErrCount += numErr
lastSavedError = err
}
}
@@ -327,3 +328,41 @@ func utilityComputeStart(ctx context.Context, computeID uint64, m interface{}) (
}
return 0, nil
}
func utilityComputeUpdatePciDevices(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
oldSet, newSet := d.GetChange("pci_devices")
deletedDevices := (oldSet.(*schema.Set).Difference(newSet.(*schema.Set))).List()
if len(deletedDevices) > 0 {
for _, ar := range deletedDevices {
arConv := ar.(int)
req := compute.DetachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(arConv),
}
_, err := c.CloudAPI().Compute().DetachPCIDevice(ctx, req)
if err != nil {
return err
}
}
}
added := (newSet.(*schema.Set).Difference(oldSet.(*schema.Set))).List()
if len(added) > 0 {
for _, ar := range added {
arConv := ar.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(arConv),
}
_, err := c.CloudAPI().Compute().AttachPCIDevice(ctx, req)
if err != nil {
return err
}
}
}
return nil
}

View File

@@ -34,6 +34,7 @@ package kvmvm
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute"
@@ -42,8 +43,12 @@ import (
func utilityDataComputeCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (compute.RecordCompute, error) {
c := m.(*controller.ControllerCfg)
req := compute.GetRequest{
ComputeID: uint64(d.Get("compute_id").(int)),
req := compute.GetRequest{}
if d.Id() != "" {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.ComputeID = computeId
} else {
req.ComputeID = uint64(d.Get("compute_id").(int))
}
computeRecord, err := c.CloudAPI().Compute().Get(ctx, req)
@@ -53,3 +58,22 @@ func utilityDataComputeCheckPresence(ctx context.Context, d *schema.ResourceData
return *computeRecord, nil
}
func utilityComputePCIDevicesList(ctx context.Context, d *schema.ResourceData, m interface{}) (*compute.ListPCIDevices, error) {
c := m.(*controller.ControllerCfg)
req := compute.ListPCIDeviceRequest{}
if d.Id() != "" {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
req.ComputeID = computeId
} else {
req.ComputeID = uint64(d.Get("compute_id").(int))
}
res, err := c.CloudAPI().Compute().ListPCIDevice(ctx, req)
if err != nil {
return nil, err
}
return res, nil
}