diff --git a/internal/services/rdb/helpers.go b/internal/services/rdb/helpers.go index a34ff05ce3..7be71e3194 100644 --- a/internal/services/rdb/helpers.go +++ b/internal/services/rdb/helpers.go @@ -3,6 +3,9 @@ package rdb import ( "context" "errors" + "fmt" + "regexp" + "strconv" "strings" "time" @@ -106,3 +109,19 @@ func getIPConfigUpdate(d *schema.ResourceData, ipFieldName string) (ipamConfig * return ipamConfig, staticConfig } + +func ExtractEngineVersion(engine string) (int, error) { + re := regexp.MustCompile(`[-](\d+)`) + matches := re.FindStringSubmatch(engine) + + if len(matches) < 2 { + return 0, fmt.Errorf("no version found in: %s", engine) + } + + version, err := strconv.Atoi(matches[1]) + if err != nil { + return 0, fmt.Errorf("failed to convert version to integer: %w", err) + } + + return version, nil +} diff --git a/internal/services/rdb/helpers_test.go b/internal/services/rdb/helpers_test.go index c0fc040a3e..84d6feda59 100644 --- a/internal/services/rdb/helpers_test.go +++ b/internal/services/rdb/helpers_test.go @@ -31,3 +31,39 @@ func TestPrivilegeV1SchemaUpgradeFunc(t *testing.T) { t.Fatalf("\n\nexpected:\n\n%#v\n\ngot:\n\n%#v\n\n", v1Schema, actual) } } + +func TestExtractEngineVersion(t *testing.T) { + tests := []struct { + engine string + expected int + expectingError bool + }{ + {"postgresql-15", 15, false}, + {"mysql-8.0", 8, false}, + {"redis-6", 6, false}, + {"mariadb-10.5", 10, false}, // Only extracts the major version + {"invalid-engine", 0, true}, // No version to extract + {"", 0, true}, // Empty string case + {"mongodb-3.6", 3, false}, // Extracts only the major version + } + + for _, tt := range tests { + t.Run(tt.engine, func(t *testing.T) { + result, err := rdb.ExtractEngineVersion(tt.engine) + + if tt.expectingError { + if err == nil { + t.Errorf("expected an error for engine %q, but got none", tt.engine) + } + } else { + if err != nil { + t.Errorf("did not expect an error for engine %q, but got: %s", tt.engine, err) + } + + if result != tt.expected { + t.Errorf("expected version %d for engine %q, but got %d", tt.expected, tt.engine, result) + } + } + }) + } +} diff --git a/internal/services/rdb/instance.go b/internal/services/rdb/instance.go index 961a051a57..2a36f41422 100644 --- a/internal/services/rdb/instance.go +++ b/internal/services/rdb/instance.go @@ -18,6 +18,7 @@ import ( "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal" "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account" + rdbtestfuncs "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/rdb/testfuncs" "github.com/scaleway/terraform-provider-scaleway/v2/internal/types" "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify" ) @@ -577,8 +578,13 @@ func ResourceRdbInstanceUpdate(ctx context.Context, d *schema.ResourceData, m in } //////////////////// - // Upgrade instance + // migrate instance //////////////////// + + //if d.HasChange("engine") { + // + //} + upgradeInstanceRequests := []rdb.UpgradeInstanceRequest(nil) rdbInstance, err := rdbAPI.GetInstance(&rdb.GetInstanceRequest{ @@ -592,6 +598,22 @@ func ResourceRdbInstanceUpdate(ctx context.Context, d *schema.ResourceData, m in diskIsFull := rdbInstance.Status == rdb.InstanceStatusDiskFull volType := rdb.VolumeType(d.Get("volume_type").(string)) + if d.HasChange("engine") { + + lastEngine, err := ExtractEngineVersion(rdbInstance.Engine) + if err != nil { + return diag.FromErr(err) + } + newEngine, err := ExtractEngineVersion(d.Get("engine").(string)) + if newEngine <= lastEngine { + return diag.FromErr(errors.New("volume_size_in_gb must be a multiple of 5")) + } + engine := rdbAPI.FetchLatestEngineVersion() + + } + //////////////////// + // Upgrade instance + //////////////////// // Volume type and size if d.HasChanges("volume_type", "volume_size_in_gb") { switch volType {