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

@@ -49,7 +49,12 @@ func dataSourceComputeRead(ctx context.Context, d *schema.ResourceData, m interf
return diag.FromErr(err)
}
if err = flattenDataCompute(d, compFacts); err != nil {
pciList, err := utilityComputePCIDevicesList(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
if err = flattenDataCompute(d, compFacts, pciList); err != nil {
return diag.FromErr(err)
}

View File

@@ -12,7 +12,7 @@ import (
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/flattens"
)
func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute) error {
func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, pciList *compute.ListPCIDevices) error {
log.Debugf("flattenCompute: ID %d, RG ID %d", computeRec.ID, computeRec.RGID)
customFields, _ := json.Marshal(computeRec.CustomFields)
@@ -94,9 +94,20 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute) e
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))
return nil
}
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 flattenTags(tags map[string]interface{}) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(tags))
@@ -559,7 +570,7 @@ func flattenNodes(m []interface{}) []string {
return output
}
func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute) error {
func flattenDataCompute(d *schema.ResourceData, compFacts *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.
//
@@ -641,6 +652,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("vgpus", compFacts.VGPUs)
d.Set("virtual_image_id", compFacts.VirtualImageID)
d.Set("virtual_image_name", compFacts.VirtualImageName)
d.Set("pci_devices", flattenPCI(*pciList))
//extra fields setting
bootDisk := findBootDisk(compFacts.Disks)
if bootDisk != nil {

View File

@@ -528,6 +528,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.CloudBroker().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))
@@ -552,6 +571,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 {
@@ -590,11 +614,16 @@ 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)
}
}
d.SetId(strconv.FormatUint(computeRec.ID, 10))
if err = flattenCompute(d, computeRec); err != nil {
if err = flattenCompute(d, computeRec, pciList); err != nil {
return diag.FromErr(err)
}
@@ -775,6 +804,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)
}
}
return append(resourceComputeRead(ctx, d, m), warnings.Get()...)
}
@@ -788,6 +823,24 @@ 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.CloudBroker().Compute().DetachPciDevice(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
}
req := compute.DeleteRequest{
ComputeID: computeId,
Permanently: d.Get("permanently").(bool),

View File

@@ -542,6 +542,13 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
"pci_devices": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"interfaces": {
Type: schema.TypeList,
Computed: true,
@@ -3294,6 +3301,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",
},
// Computed properties
"account_id": {
Type: schema.TypeInt,

View File

@@ -544,6 +544,25 @@ func utilityComputeCheckPresence(ctx context.Context, d *schema.ResourceData, m
return res, 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.CloudBroker().Compute().ListPCIDevice(ctx, req)
if err != nil {
return nil, err
}
return res, nil
}
func findBootDisk(disks compute.ListDisks) *compute.ItemDisk {
for _, disk := range disks {
if disk.Type == "B" {
@@ -914,6 +933,44 @@ func utilityComputeUpdateAntiAffinityRules(ctx context.Context, d *schema.Resour
return 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.CloudBroker().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.CloudBroker().Compute().AttachPCIDevice(ctx, req)
if err != nil {
return err
}
}
}
return nil
}
func utilityComputeUpdateTags(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)