Skip to content

Commit

Permalink
EVEREST-1841 unlock major version upgrades for MongoDB
Browse files Browse the repository at this point in the history
  • Loading branch information
recharte committed Feb 4, 2025
1 parent c59a4f7 commit 7655fe2
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 17 deletions.
15 changes: 6 additions & 9 deletions internal/server/handlers/validation/database_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand All @@ -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
Expand All @@ -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
Expand Down
18 changes: 16 additions & 2 deletions internal/server/handlers/validation/database_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 7655fe2

Please sign in to comment.