From 51e08405c300f1d9ceed2821b85da7d0797fdd68 Mon Sep 17 00:00:00 2001 From: Michal Opala Date: Mon, 21 Oct 2024 15:32:24 +0200 Subject: [PATCH] B-552: Fix compatible_system_datastore parsing (#576) --- CHANGELOG.md | 1 + opennebula/resource_opennebula_datastore.go | 41 +++++++++++++++++---- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42797ec15..fbf8d5252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ BUG FIXES: * resources/opennebula_vm_group: fix anti affinity reading (#497) * resources/opennebula_datastore: remove DS_MAD for Ceph SYSTEM datastore (#542) +* resources/opennebula_datastore: fix compatible_system_datastore parsing (#552) # 1.4.1 (Unreleased) diff --git a/opennebula/resource_opennebula_datastore.go b/opennebula/resource_opennebula_datastore.go index a9c059988..dd0a1d7b5 100644 --- a/opennebula/resource_opennebula_datastore.go +++ b/opennebula/resource_opennebula_datastore.go @@ -121,7 +121,7 @@ func resourceOpennebulaDatastore() *schema.Resource { Optional: true, Description: "For Image Datastores only. Set the System Datastores IDs that can be used with an Image Datastore", Elem: &schema.Schema{ - Type: schema.TypeInt, + Type: schema.TypeString, }, }, "ceph": { @@ -282,13 +282,20 @@ func resourceOpennebulaDatastoreCreate(ctx context.Context, d *schema.ResourceDa compatibleSystemDatastores := d.Get("compatible_system_datastore").(*schema.Set).List() if len(compatibleSystemDatastores) > 0 { - // convert to slice of strings then join var compatibleSysDs []string for _, sysDs := range compatibleSystemDatastores { - compatibleSysDs = append(compatibleSysDs, fmt.Sprint(sysDs.(int))) + i, err := ParseIntFromInterface(sysDs) + if err != nil { + diags = append(diags, diag.Diagnostic{ + Severity: diag.Error, + Summary: "Failed to parse datastore ID", + Detail: err.Error(), + }) + return diags + } + compatibleSysDs = append(compatibleSysDs, fmt.Sprint(i)) } - tpl.Add(dsKey.CompatibleSysDs, strings.Join(compatibleSysDs, ",")) } @@ -542,7 +549,7 @@ func resourceOpennebulaDatastoreRead(ctx context.Context, d *schema.ResourceData compatibleSystemDatastore, err := datastoreInfos.Template.Get(dsKey.CompatibleSysDs) if err == nil { - d.Set("compatible_system_datastore", compatibleSystemDatastore) + d.Set("compatible_system_datastore", strings.Split(compatibleSystemDatastore, ",")) } customAttrsList := d.Get("custom").(*schema.Set).List() @@ -788,9 +795,27 @@ func resourceOpennebulaDatastoreUpdate(ctx context.Context, d *schema.ResourceDa update = true } if d.HasChange("compatible_system_datastore") { - compatibleSystemDS := d.Get("compatible_system_datastore") - newTpl.Del(string(dsKey.CompatibleSysDs)) - newTpl.Add(dsKey.CompatibleSysDs, compatibleSystemDS) + compatibleSystemDatastores := d.Get("compatible_system_datastore").(*schema.Set).List() + if len(compatibleSystemDatastores) > 0 { + // convert to slice of strings then join + var compatibleSysDs []string + for _, sysDs := range compatibleSystemDatastores { + i, err := ParseIntFromInterface(sysDs) + if err != nil { + diags = append(diags, diag.Diagnostic{ + Severity: diag.Error, + Summary: "Failed to parse datastore ID", + Detail: err.Error(), + }) + return diags + } + compatibleSysDs = append(compatibleSysDs, fmt.Sprint(i)) + } + newTpl.Del(string(dsKey.CompatibleSysDs)) + newTpl.Add(dsKey.CompatibleSysDs, strings.Join(compatibleSysDs, ",")) + } else { + newTpl.Del(string(dsKey.CompatibleSysDs)) + } update = true }