From 41717b09777b9bf7a3ba8ff0410c70bd14d9b942 Mon Sep 17 00:00:00 2001 From: dahn Date: Mon, 19 Dec 2022 02:03:07 -0800 Subject: [PATCH] allow a new upgrade version without DB changes to be inserted (#6858) --- engine/schema/pom.xml | 6 + .../upgrade/DatabaseVersionHierarchy.java | 9 +- .../upgrade/DatabaseUpgradeCheckerTest.java | 40 +++++- .../upgrade/DatabaseVersionHierarchyTest.java | 117 ++++++++++++++++++ pom.xml | 1 + 5 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 engine/schema/src/test/java/com/cloud/upgrade/DatabaseVersionHierarchyTest.java diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml index ca69d4b68a3..2a366d7231f 100644 --- a/engine/schema/pom.xml +++ b/engine/schema/pom.xml @@ -57,6 +57,12 @@ ini4j ${cs.ini.version} + + org.junit.jupiter + junit-jupiter + ${cs.junit.jupiter.version} + test + diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseVersionHierarchy.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseVersionHierarchy.java index 35b2faa8431..4f7141cb609 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseVersionHierarchy.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseVersionHierarchy.java @@ -122,7 +122,7 @@ public final class DatabaseVersionHierarchy { * * @since 4.8.2.0 (refactored in 4.11.1.0) */ - private CloudStackVersion getRecentVersion(final CloudStackVersion fromVersion) { + protected CloudStackVersion getRecentVersion(final CloudStackVersion fromVersion) { if (fromVersion == null) { return null; } @@ -131,7 +131,7 @@ public final class DatabaseVersionHierarchy { return toList() .reverse() .stream() - .filter(version -> fromVersion.compareTo(version) < 0) + .filter(version -> fromVersion.compareTo(version) > 0) .findFirst() .orElse(null); } @@ -158,16 +158,17 @@ public final class DatabaseVersionHierarchy { return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } - private static class VersionNode { + protected static class VersionNode { final CloudStackVersion version; final DbUpgrade upgrader; - private VersionNode(final CloudStackVersion version, final DbUpgrade upgrader) { + protected VersionNode(final CloudStackVersion version, final DbUpgrade upgrader) { this.version = version; this.upgrader = upgrader; } } + public static final class DatabaseVersionHierarchyBuilder { private final List hierarchyBuilder = new LinkedList<>(); diff --git a/engine/schema/src/test/java/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java b/engine/schema/src/test/java/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java index 982a386161b..4f5c62cc888 100644 --- a/engine/schema/src/test/java/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java +++ b/engine/schema/src/test/java/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java @@ -32,6 +32,8 @@ import com.cloud.upgrade.dao.Upgrade41100to41110; import com.cloud.upgrade.dao.Upgrade41110to41120; import com.cloud.upgrade.dao.Upgrade41120to41130; import com.cloud.upgrade.dao.Upgrade41120to41200; +import com.cloud.upgrade.dao.Upgrade41510to41520; +import com.cloud.upgrade.dao.Upgrade41610to41700; import com.cloud.upgrade.dao.Upgrade452to453; import com.cloud.upgrade.dao.Upgrade453to460; import com.cloud.upgrade.dao.Upgrade460to461; @@ -165,9 +167,41 @@ public class DatabaseUpgradeCheckerTest { final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker(); final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion); assertNotNull(upgrades); - assertTrue(upgrades.length == 1); - assertTrue(upgrades[0] instanceof NoopDbUpgrade); + assertEquals("We should have 2 upgrade steps", 2, upgrades.length); + assertTrue(upgrades[1] instanceof NoopDbUpgrade); + } + + @Test + public void testCalculateUpgradePathFromKownDbVersion() { + + final CloudStackVersion dbVersion = CloudStackVersion.parse("4.17.0.0"); + assertNotNull(dbVersion); + + final CloudStackVersion currentVersion = CloudStackVersion.parse("4.99.1.0"); + assertNotNull(currentVersion); + + final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker(); + final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion); + assertNotNull(upgrades); + assertTrue(upgrades.length > 2); + assertTrue(upgrades[upgrades.length - 1] instanceof NoopDbUpgrade); + + } + + @Test + public void testCalculateUpgradePathFromUnregisteredSecVersion() { + final CloudStackVersion dbVersion = CloudStackVersion.parse("4.15.1.3"); + assertNotNull(dbVersion); + + final CloudStackVersion currentVersion = CloudStackVersion.parse("4.17.0.0"); + assertNotNull(currentVersion); + + final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker(); + final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion); + assertNotNull("there should be upgrade paths", upgrades); + assertTrue(upgrades.length > 1); + assertTrue(upgrades[0] instanceof Upgrade41510to41520); + assertTrue(upgrades[upgrades.length - 1] instanceof Upgrade41610to41700); } - } diff --git a/engine/schema/src/test/java/com/cloud/upgrade/DatabaseVersionHierarchyTest.java b/engine/schema/src/test/java/com/cloud/upgrade/DatabaseVersionHierarchyTest.java new file mode 100644 index 00000000000..3fb6bf5d63a --- /dev/null +++ b/engine/schema/src/test/java/com/cloud/upgrade/DatabaseVersionHierarchyTest.java @@ -0,0 +1,117 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.upgrade; + +import com.cloud.upgrade.dao.DbUpgrade; +import com.cloud.upgrade.dao.Upgrade41110to41120; +import com.cloud.upgrade.dao.Upgrade41120to41130; +import com.cloud.upgrade.dao.Upgrade41120to41200; +import com.cloud.upgrade.dao.Upgrade41500to41510; +import com.cloud.upgrade.dao.Upgrade41510to41520; +import com.cloud.upgrade.dao.Upgrade41520to41600; +import com.cloud.upgrade.dao.Upgrade41720to41800; +import com.cloud.upgrade.dao.Upgrade481to490; +import org.apache.cloudstack.utils.CloudStackVersion; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.InputStream; +import java.sql.Connection; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DatabaseVersionHierarchyTest { + + private static DatabaseVersionHierarchy hierarchy; + + static class DummyUpgrade implements DbUpgrade { + @Override + public String[] getUpgradableVersionRange() { + return new String[0]; + } + + @Override + public String getUpgradedVersion() { + return null; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + return new InputStream[0]; + } + + @Override + public void performDataMigration(Connection conn) { + + } + + @Override + public InputStream[] getCleanupScripts() { + return new InputStream[0]; + } + + } + + @BeforeAll + static void init() { + DatabaseVersionHierarchy.DatabaseVersionHierarchyBuilder builder = DatabaseVersionHierarchy.builder() + .next("0.0.5", new DummyUpgrade()) + .next("1.0.0.0", new DummyUpgrade()) + .next("1.0.1" , new DummyUpgrade()) + .next("1.2.0" , new DummyUpgrade()) + .next("2.0.0" , new DummyUpgrade()) + .next("2.3.2" , new DummyUpgrade()) + .next("3.4.5.6" , new DummyUpgrade()) + .next("4.8.2.0" , new Upgrade481to490()) + .next("4.9.10.11" , new DummyUpgrade()) + .next("4.11.1.0", new Upgrade41110to41120()) + .next("4.11.2.0", new Upgrade41120to41130()) + .next("4.11.3.0", new Upgrade41120to41200()) + .next("4.15.0.0", new Upgrade41500to41510()) + .next("4.15.1.0", new Upgrade41510to41520()) + .next("4.15.2.0", new Upgrade41520to41600()) + .next("4.15.4", new DummyUpgrade()) + .next("4.17.2.0", new Upgrade41720to41800()); + hierarchy = builder.build(); + } + + @Test + void getRecentVersionMiddle() { + assertEquals("2.0.0", hierarchy.getRecentVersion(CloudStackVersion.parse("2.2.2")).toString()); + } + @Test + void getRecentVersionEarly() { + assertEquals(null, hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.2"))); + } + @Test + void getRecentVersionStart() { + assertEquals(null, hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.5"))); + } + @Test + void getRecentVersionJust() { + assertEquals("0.0.5", hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.9")).toString()); + } + @Test + void getRecentVersionExact() { + assertEquals("0.0.5", hierarchy.getRecentVersion(CloudStackVersion.parse("1.0.0.0")).toString()); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0efbd984c0c..601e660129a 100644 --- a/pom.xml +++ b/pom.xml @@ -110,6 +110,7 @@ 1.3 4.13.2 1.13.1 + 5.9.1 18.0 3.2.4 2.0.5