Skip to content

Commit 41717b0

Browse files
authored
allow a new upgrade version without DB changes to be inserted (#6858)
1 parent 43b4525 commit 41717b0

File tree

5 files changed

+166
-7
lines changed

5 files changed

+166
-7
lines changed

engine/schema/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
<artifactId>ini4j</artifactId>
5858
<version>${cs.ini.version}</version>
5959
</dependency>
60+
<dependency>
61+
<groupId>org.junit.jupiter</groupId>
62+
<artifactId>junit-jupiter</artifactId>
63+
<version>${cs.junit.jupiter.version}</version>
64+
<scope>test</scope>
65+
</dependency>
6066
</dependencies>
6167
<build>
6268
<plugins>

engine/schema/src/main/java/com/cloud/upgrade/DatabaseVersionHierarchy.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public DbUpgrade[] getPath(final CloudStackVersion fromVersion, final CloudStack
122122
*
123123
* @since 4.8.2.0 (refactored in 4.11.1.0)
124124
*/
125-
private CloudStackVersion getRecentVersion(final CloudStackVersion fromVersion) {
125+
protected CloudStackVersion getRecentVersion(final CloudStackVersion fromVersion) {
126126
if (fromVersion == null) {
127127
return null;
128128
}
@@ -131,7 +131,7 @@ private CloudStackVersion getRecentVersion(final CloudStackVersion fromVersion)
131131
return toList()
132132
.reverse()
133133
.stream()
134-
.filter(version -> fromVersion.compareTo(version) < 0)
134+
.filter(version -> fromVersion.compareTo(version) > 0)
135135
.findFirst()
136136
.orElse(null);
137137
}
@@ -158,16 +158,17 @@ private Predicate<VersionNode> distinct(Function<VersionNode, String> keyExtract
158158
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
159159
}
160160

161-
private static class VersionNode {
161+
protected static class VersionNode {
162162
final CloudStackVersion version;
163163
final DbUpgrade upgrader;
164164

165-
private VersionNode(final CloudStackVersion version, final DbUpgrade upgrader) {
165+
protected VersionNode(final CloudStackVersion version, final DbUpgrade upgrader) {
166166
this.version = version;
167167
this.upgrader = upgrader;
168168
}
169169
}
170170

171+
171172
public static final class DatabaseVersionHierarchyBuilder {
172173
private final List<VersionNode> hierarchyBuilder = new LinkedList<>();
173174

engine/schema/src/test/java/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import com.cloud.upgrade.dao.Upgrade41110to41120;
3333
import com.cloud.upgrade.dao.Upgrade41120to41130;
3434
import com.cloud.upgrade.dao.Upgrade41120to41200;
35+
import com.cloud.upgrade.dao.Upgrade41510to41520;
36+
import com.cloud.upgrade.dao.Upgrade41610to41700;
3537
import com.cloud.upgrade.dao.Upgrade452to453;
3638
import com.cloud.upgrade.dao.Upgrade453to460;
3739
import com.cloud.upgrade.dao.Upgrade460to461;
@@ -165,9 +167,41 @@ public void testCalculateUpgradePathUnkownDbVersion() {
165167
final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker();
166168
final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion);
167169
assertNotNull(upgrades);
168-
assertTrue(upgrades.length == 1);
169-
assertTrue(upgrades[0] instanceof NoopDbUpgrade);
170+
assertEquals("We should have 2 upgrade steps", 2, upgrades.length);
171+
assertTrue(upgrades[1] instanceof NoopDbUpgrade);
170172

171-
}
173+
}
174+
175+
@Test
176+
public void testCalculateUpgradePathFromKownDbVersion() {
177+
178+
final CloudStackVersion dbVersion = CloudStackVersion.parse("4.17.0.0");
179+
assertNotNull(dbVersion);
180+
181+
final CloudStackVersion currentVersion = CloudStackVersion.parse("4.99.1.0");
182+
assertNotNull(currentVersion);
172183

184+
final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker();
185+
final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion);
186+
assertNotNull(upgrades);
187+
assertTrue(upgrades.length > 2);
188+
assertTrue(upgrades[upgrades.length - 1] instanceof NoopDbUpgrade);
189+
190+
}
191+
192+
@Test
193+
public void testCalculateUpgradePathFromUnregisteredSecVersion() {
194+
final CloudStackVersion dbVersion = CloudStackVersion.parse("4.15.1.3");
195+
assertNotNull(dbVersion);
196+
197+
final CloudStackVersion currentVersion = CloudStackVersion.parse("4.17.0.0");
198+
assertNotNull(currentVersion);
199+
200+
final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker();
201+
final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion);
202+
assertNotNull("there should be upgrade paths", upgrades);
203+
assertTrue(upgrades.length > 1);
204+
assertTrue(upgrades[0] instanceof Upgrade41510to41520);
205+
assertTrue(upgrades[upgrades.length - 1] instanceof Upgrade41610to41700);
206+
}
173207
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
package com.cloud.upgrade;
18+
19+
import com.cloud.upgrade.dao.DbUpgrade;
20+
import com.cloud.upgrade.dao.Upgrade41110to41120;
21+
import com.cloud.upgrade.dao.Upgrade41120to41130;
22+
import com.cloud.upgrade.dao.Upgrade41120to41200;
23+
import com.cloud.upgrade.dao.Upgrade41500to41510;
24+
import com.cloud.upgrade.dao.Upgrade41510to41520;
25+
import com.cloud.upgrade.dao.Upgrade41520to41600;
26+
import com.cloud.upgrade.dao.Upgrade41720to41800;
27+
import com.cloud.upgrade.dao.Upgrade481to490;
28+
import org.apache.cloudstack.utils.CloudStackVersion;
29+
import org.junit.jupiter.api.BeforeAll;
30+
import org.junit.jupiter.api.Test;
31+
32+
import java.io.InputStream;
33+
import java.sql.Connection;
34+
35+
import static org.junit.jupiter.api.Assertions.assertEquals;
36+
37+
class DatabaseVersionHierarchyTest {
38+
39+
private static DatabaseVersionHierarchy hierarchy;
40+
41+
static class DummyUpgrade implements DbUpgrade {
42+
@Override
43+
public String[] getUpgradableVersionRange() {
44+
return new String[0];
45+
}
46+
47+
@Override
48+
public String getUpgradedVersion() {
49+
return null;
50+
}
51+
52+
@Override
53+
public boolean supportsRollingUpgrade() {
54+
return false;
55+
}
56+
57+
@Override
58+
public InputStream[] getPrepareScripts() {
59+
return new InputStream[0];
60+
}
61+
62+
@Override
63+
public void performDataMigration(Connection conn) {
64+
65+
}
66+
67+
@Override
68+
public InputStream[] getCleanupScripts() {
69+
return new InputStream[0];
70+
}
71+
72+
}
73+
74+
@BeforeAll
75+
static void init() {
76+
DatabaseVersionHierarchy.DatabaseVersionHierarchyBuilder builder = DatabaseVersionHierarchy.builder()
77+
.next("0.0.5", new DummyUpgrade())
78+
.next("1.0.0.0", new DummyUpgrade())
79+
.next("1.0.1" , new DummyUpgrade())
80+
.next("1.2.0" , new DummyUpgrade())
81+
.next("2.0.0" , new DummyUpgrade())
82+
.next("2.3.2" , new DummyUpgrade())
83+
.next("3.4.5.6" , new DummyUpgrade())
84+
.next("4.8.2.0" , new Upgrade481to490())
85+
.next("4.9.10.11" , new DummyUpgrade())
86+
.next("4.11.1.0", new Upgrade41110to41120())
87+
.next("4.11.2.0", new Upgrade41120to41130())
88+
.next("4.11.3.0", new Upgrade41120to41200())
89+
.next("4.15.0.0", new Upgrade41500to41510())
90+
.next("4.15.1.0", new Upgrade41510to41520())
91+
.next("4.15.2.0", new Upgrade41520to41600())
92+
.next("4.15.4", new DummyUpgrade())
93+
.next("4.17.2.0", new Upgrade41720to41800());
94+
hierarchy = builder.build();
95+
}
96+
97+
@Test
98+
void getRecentVersionMiddle() {
99+
assertEquals("2.0.0", hierarchy.getRecentVersion(CloudStackVersion.parse("2.2.2")).toString());
100+
}
101+
@Test
102+
void getRecentVersionEarly() {
103+
assertEquals(null, hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.2")));
104+
}
105+
@Test
106+
void getRecentVersionStart() {
107+
assertEquals(null, hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.5")));
108+
}
109+
@Test
110+
void getRecentVersionJust() {
111+
assertEquals("0.0.5", hierarchy.getRecentVersion(CloudStackVersion.parse("0.0.9")).toString());
112+
}
113+
@Test
114+
void getRecentVersionExact() {
115+
assertEquals("0.0.5", hierarchy.getRecentVersion(CloudStackVersion.parse("1.0.0.0")).toString());
116+
}
117+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
<cs.hamcrest.version>1.3</cs.hamcrest.version>
111111
<cs.junit.version>4.13.2</cs.junit.version>
112112
<cs.junit.dataprovider.version>1.13.1</cs.junit.dataprovider.version>
113+
<cs.junit.jupiter.version>5.9.1</cs.junit.jupiter.version>
113114
<cs.guava-testlib.version>18.0</cs.guava-testlib.version>
114115
<cs.mockito.version>3.2.4</cs.mockito.version>
115116
<cs.powermock.version>2.0.5</cs.powermock.version>

0 commit comments

Comments
 (0)