From 7655fe2283fd7db59b3bd5cf38fda7c7d45f4fbb Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Tue, 4 Feb 2025 21:43:22 +0000 Subject: [PATCH] EVEREST-1841 unlock major version upgrades for MongoDB --- .../handlers/validation/database_cluster.go | 15 ++++++--------- .../validation/database_engine_test.go | 18 ++++++++++++++++-- .../cluster-form/db-version/utils.test.ts | 8 ++++---- .../cluster-form/db-version/utils.ts | 4 ++-- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/internal/server/handlers/validation/database_cluster.go b/internal/server/handlers/validation/database_cluster.go index 08f017d8e..3fc489e05 100644 --- a/internal/server/handlers/validation/database_cluster.go +++ b/internal/server/handlers/validation/database_cluster.go @@ -536,7 +536,7 @@ func (h *validateHandler) validateDatabaseClusterOnUpdate( newVersion := dbc.Spec.Engine.Version oldVersion := oldDB.Spec.Engine.Version if newVersion != "" && newVersion != oldVersion { - if err := validateDBEngineVersionUpgrade(newVersion, oldVersion); err != nil { + if err := validateDBEngineVersionUpgrade(oldDB.Spec.Engine.Type, newVersion, oldVersion); err != nil { return err } } @@ -557,7 +557,7 @@ func (h *validateHandler) validateDatabaseClusterOnUpdate( } // validateDBEngineVersionUpgrade validates if upgrade of DBEngine from `oldVersion` to `newVersion` is allowed. -func validateDBEngineVersionUpgrade(newVersion, oldVersion string) error { +func validateDBEngineVersionUpgrade(engineType everestv1alpha1.EngineType, newVersion, oldVersion string) error { // Ensure a "v" prefix so that it is a valid semver. if !strings.HasPrefix(newVersion, "v") { newVersion = "v" + newVersion @@ -575,13 +575,10 @@ func validateDBEngineVersionUpgrade(newVersion, oldVersion string) error { if semver.Compare(newVersion, oldVersion) < 0 { return errDBEngineDowngrade } - // We will not allow major upgrades. - // Major upgrades are handled differently for different operators, so for now we simply won't allow it. - // For example: - // - PXC operator allows major upgrades. - // - PSMDB operator allows major upgrades, but we need to handle FCV. - // - PG operator does not allow major upgrades. - if semver.Major(oldVersion) != semver.Major(newVersion) { + // We will not allow major upgrades for PXC and PG. + // - PXC: Major upgrades are not supported. + // - PG: Major upgrades are in technical preview. https://docs.percona.com/percona-operator-for-postgresql/2.0/update.html#major-version-upgrade + if engineType != everestv1alpha1.DatabaseEnginePSMDB && semver.Major(oldVersion) != semver.Major(newVersion) { return errDBEngineMajorVersionUpgrade } return nil diff --git a/internal/server/handlers/validation/database_engine_test.go b/internal/server/handlers/validation/database_engine_test.go index 6c5f30728..08f2aca4e 100644 --- a/internal/server/handlers/validation/database_engine_test.go +++ b/internal/server/handlers/validation/database_engine_test.go @@ -92,42 +92,56 @@ func TestValidateDBEngineUpgrade(t *testing.T) { t.Parallel() testCases := []struct { name string + engineType everestv1alpha1.EngineType oldVersion string newVersion string err error }{ { name: "invalid version", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "1.0.0", newVersion: "1!00;", err: errInvalidVersion, }, { - name: "major upgrade", + name: "major upgrade PXC", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "8.0.22", newVersion: "9.0.0", err: errDBEngineMajorVersionUpgrade, }, + { + name: "major upgrade PSMDB", + engineType: everestv1alpha1.DatabaseEnginePSMDB, + oldVersion: "8.0.22", + newVersion: "9.0.0", + err: nil, + }, { name: "downgrade", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "8.0.22", newVersion: "8.0.21", err: errDBEngineDowngrade, }, { name: "valid upgrade", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "8.0.22", newVersion: "8.0.23", err: nil, }, { name: "valid upgrade (with 'v' prefix)", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "v8.0.22", newVersion: "v8.0.23", err: nil, }, { name: "major version downgrade", + engineType: everestv1alpha1.DatabaseEnginePXC, oldVersion: "16.1", newVersion: "15.5", err: errDBEngineDowngrade, @@ -136,7 +150,7 @@ func TestValidateDBEngineUpgrade(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Parallel() - err := validateDBEngineVersionUpgrade(tc.newVersion, tc.oldVersion) + err := validateDBEngineVersionUpgrade(tc.engineType, tc.newVersion, tc.oldVersion) assert.ErrorIs(t, err, tc.err) }) } diff --git a/ui/apps/everest/src/components/cluster-form/db-version/utils.test.ts b/ui/apps/everest/src/components/cluster-form/db-version/utils.test.ts index 68584883b..970ef7ddd 100644 --- a/ui/apps/everest/src/components/cluster-form/db-version/utils.test.ts +++ b/ui/apps/everest/src/components/cluster-form/db-version/utils.test.ts @@ -53,19 +53,19 @@ describe('DBVersion Available filter test', () => { ).toEqual(['14.1']); }); - it('should allow major upgrades for PXC', () => { + it('should allow major upgrades for PSMDB', () => { expect( filterAvailableDbVersionsForDbEngineEdition( generateDbEngineWithVersions( ['5.0.0', '4.0.0', '4.3.9', '4.4.1'], - DbEngineType.PXC + DbEngineType.PSMDB ), '4.4.0' ).map(({ version }) => version) ).toEqual(['5.0.0', '4.4.1']); }); - it('should rule out major upgrades/downgrades for PSMDB/PG', () => { + it('should rule out major upgrades/downgrades for PXC/PG', () => { expect( filterAvailableDbVersionsForDbEngineEdition( generateDbEngineWithVersions( @@ -79,7 +79,7 @@ describe('DBVersion Available filter test', () => { '4.3.0', '5.4.1', ], - DbEngineType.PSMDB + DbEngineType.POSTGRESQL ), '2.3.0' ).map(({ version }) => version) diff --git a/ui/apps/everest/src/components/cluster-form/db-version/utils.ts b/ui/apps/everest/src/components/cluster-form/db-version/utils.ts index 624c17b73..967be0b5d 100644 --- a/ui/apps/everest/src/components/cluster-form/db-version/utils.ts +++ b/ui/apps/everest/src/components/cluster-form/db-version/utils.ts @@ -35,8 +35,8 @@ export const filterAvailableDbVersionsForDbEngineEdition = ( return semverVersion ? gte(semverVersion, currentSemverVersion) : true; }); - // If the engine is PSMDB or PG, major version upgrades are also ruled out - if ([DbEngineType.PSMDB, DbEngineType.POSTGRESQL].includes(dbType)) { + // If the engine is PG, major version upgrades are also ruled out + if ([DbEngineType.POSTGRESQL].includes(dbType)) { versions = versions.filter(({ version }) => { const semverVersion = coerce(version); return semverVersion ? semverVersion.major === currentMajor : true;