1616// under the License.
1717package com .cloud .upgrade ;
1818
19- import java .sql .SQLException ;
19+ import static org .junit .Assert .assertArrayEquals ;
20+ import static org .junit .Assert .assertEquals ;
21+ import static org .junit .Assert .assertFalse ;
22+ import static org .junit .Assert .assertNotNull ;
23+ import static org .junit .Assert .assertTrue ;
24+
2025import java .lang .reflect .Field ;
2126import java .sql .Connection ;
2227import java .sql .PreparedStatement ;
2328import java .sql .ResultSet ;
29+ import java .sql .SQLException ;
2430
2531import javax .sql .DataSource ;
2632
2733import org .apache .cloudstack .utils .CloudStackVersion ;
28- import org .junit .Test ;
29- import org .junit .Before ;
3034import org .junit .After ;
35+ import org .junit .Before ;
36+ import org .junit .Test ;
3137import org .junit .runner .RunWith ;
32-
3338import org .mockito .ArgumentMatchers ;
3439import org .mockito .Mock ;
3540import org .mockito .Mockito ;
4752import com .cloud .upgrade .dao .Upgrade42020to42030 ;
4853import com .cloud .upgrade .dao .Upgrade42030to42040 ;
4954import com .cloud .upgrade .dao .Upgrade42040to42100 ;
55+ import com .cloud .upgrade .dao .Upgrade42300to2400 ;
5056import com .cloud .upgrade .dao .Upgrade452to453 ;
5157import com .cloud .upgrade .dao .Upgrade453to460 ;
5258import com .cloud .upgrade .dao .Upgrade460to461 ;
5561import com .cloud .upgrade .dao .Upgrade471to480 ;
5662import com .cloud .upgrade .dao .Upgrade480to481 ;
5763import com .cloud .upgrade .dao .Upgrade490to4910 ;
58-
5964import com .cloud .utils .db .TransactionLegacy ;
6065
61- import static org .junit .Assert .assertTrue ;
62- import static org .junit .Assert .assertFalse ;
63- import static org .junit .Assert .assertNotNull ;
64- import static org .junit .Assert .assertEquals ;
65- import static org .junit .Assert .assertArrayEquals ;
66-
6766
6867@ RunWith (MockitoJUnitRunner .class )
6968public class DatabaseUpgradeCheckerTest {
@@ -81,6 +80,8 @@ public class DatabaseUpgradeCheckerTest {
8180 ResultSet resultSet ;
8281
8382 private DataSource backupDataSource ;
83+ private String previousCsMajorVersion ;
84+ private String previousCsTinyVersion ;
8485
8586 @ Before
8687 public void setup () throws Exception {
@@ -92,13 +93,19 @@ public void setup() throws Exception {
9293 Mockito .when (dataSource .getConnection ()).thenReturn (connection );
9394 Mockito .when (connection .prepareStatement (ArgumentMatchers .anyString ())).thenReturn (preparedStatement );
9495 Mockito .when (preparedStatement .executeQuery ()).thenReturn (resultSet );
96+
97+ previousCsMajorVersion = SystemVmTemplateRegistration .CS_MAJOR_VERSION ;
98+ previousCsTinyVersion = SystemVmTemplateRegistration .CS_TINY_VERSION ;
9599 }
96100
97101 @ After
98102 public void cleanup () throws Exception {
99103 Field dsField = TransactionLegacy .class .getDeclaredField ("s_ds" );
100104 dsField .setAccessible (true );
101105 dsField .set (null , backupDataSource );
106+
107+ SystemVmTemplateRegistration .CS_MAJOR_VERSION = previousCsMajorVersion ;
108+ SystemVmTemplateRegistration .CS_TINY_VERSION = previousCsTinyVersion ;
102109 }
103110
104111 @ Test
@@ -214,10 +221,10 @@ public void testFindUpgradePath452to490() {
214221 @ Test
215222 public void testCalculateUpgradePathUnknownDbVersion () {
216223
217- final CloudStackVersion dbVersion = CloudStackVersion .parse ("4. 99.0.0" );
224+ final CloudStackVersion dbVersion = CloudStackVersion .parse ("99.0.0" );
218225 assertNotNull (dbVersion );
219226
220- final CloudStackVersion currentVersion = CloudStackVersion .parse ("4. 99.1.0" );
227+ final CloudStackVersion currentVersion = CloudStackVersion .parse ("99.1.0" );
221228 assertNotNull (currentVersion );
222229
223230 final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker ();
@@ -234,7 +241,7 @@ public void testCalculateUpgradePathFromKnownDbVersion() {
234241 final CloudStackVersion dbVersion = CloudStackVersion .parse ("4.17.0.0" );
235242 assertNotNull (dbVersion );
236243
237- final CloudStackVersion currentVersion = CloudStackVersion .parse ("4. 99.1.0" );
244+ final CloudStackVersion currentVersion = CloudStackVersion .parse ("99.1.0" );
238245 assertNotNull (currentVersion );
239246
240247 final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker ();
@@ -268,10 +275,7 @@ public void testCalculateUpgradePathFromLatestDbVersion() {
268275 final CloudStackVersion dbVersion = checker .getLatestVersion ();
269276 assertNotNull (dbVersion );
270277
271- final CloudStackVersion currentVersion = CloudStackVersion .parse (dbVersion .getMajorRelease () + "."
272- + dbVersion .getMinorRelease () + "."
273- + dbVersion .getPatchRelease () + "."
274- + (dbVersion .getSecurityRelease () + 1 ));
278+ final CloudStackVersion currentVersion = getNextSecurityRelease (dbVersion );
275279 assertNotNull (currentVersion );
276280
277281 final DbUpgrade [] upgrades = checker .calculateUpgradePath (dbVersion , currentVersion );
@@ -293,10 +297,7 @@ public void testCalculateUpgradePathFrom41800toNextSecurityRelease() {
293297 final DbUpgrade [] upgrades = checker .calculateUpgradePath (dbVersion , currentVersion );
294298 assertNotNull (upgrades );
295299
296- final CloudStackVersion nextSecurityRelease = CloudStackVersion .parse (currentVersion .getMajorRelease () + "."
297- + currentVersion .getMinorRelease () + "."
298- + currentVersion .getPatchRelease () + "."
299- + (currentVersion .getSecurityRelease () + 1 ));
300+ final CloudStackVersion nextSecurityRelease = getNextSecurityRelease (currentVersion );
300301 assertNotNull (nextSecurityRelease );
301302
302303 final DbUpgrade [] upgradesToNext = checker .calculateUpgradePath (dbVersion , nextSecurityRelease );
@@ -306,16 +307,26 @@ public void testCalculateUpgradePathFrom41800toNextSecurityRelease() {
306307 assertTrue (upgradesToNext [upgradesToNext .length - 1 ] instanceof NoopDbUpgrade );
307308 }
308309
310+ private static CloudStackVersion getNextSecurityRelease (CloudStackVersion version , int increment ) {
311+ String nextSecurityReleaseVersionStr = version .getMajorRelease () + "."
312+ + version .getMinorRelease () + "."
313+ + (version .usesNewVersioning () ? "" : version .getPatchRelease () + "." )
314+ + (version .getSecurityRelease () + increment );
315+
316+ return CloudStackVersion .parse (nextSecurityReleaseVersionStr );
317+ }
318+
319+ private static CloudStackVersion getNextSecurityRelease (CloudStackVersion version ) {
320+ return getNextSecurityRelease (version , 1 );
321+ }
322+
309323 @ Test
310324 public void testCalculateUpgradePathFromSecurityReleaseToLatest () {
311325
312326 final CloudStackVersion dbVersion = CloudStackVersion .parse ("4.17.2.0" ); // a EOL version
313327 assertNotNull (dbVersion );
314328
315- final CloudStackVersion oldSecurityRelease = CloudStackVersion .parse (dbVersion .getMajorRelease () + "."
316- + dbVersion .getMinorRelease () + "."
317- + dbVersion .getPatchRelease () + "."
318- + (dbVersion .getSecurityRelease () + 100 ));
329+ final CloudStackVersion oldSecurityRelease = getNextSecurityRelease (dbVersion , 100 );
319330 assertNotNull (oldSecurityRelease ); // fake security release 4.17.2.100
320331
321332 final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker ();
@@ -347,10 +358,7 @@ public void testCalculateUpgradePathFromSecurityReleaseToNextSecurityRelease() {
347358 final CloudStackVersion currentVersion = checker .getLatestVersion ();
348359 assertNotNull (currentVersion );
349360
350- final CloudStackVersion nextSecurityRelease = CloudStackVersion .parse (currentVersion .getMajorRelease () + "."
351- + currentVersion .getMinorRelease () + "."
352- + currentVersion .getPatchRelease () + "."
353- + (currentVersion .getSecurityRelease () + 1 ));
361+ final CloudStackVersion nextSecurityRelease = getNextSecurityRelease (currentVersion );
354362 assertNotNull (nextSecurityRelease ); // fake security release
355363
356364 final DbUpgrade [] upgrades = checker .calculateUpgradePath (dbVersion , currentVersion );
@@ -422,4 +430,48 @@ public void testCalculateUpgradePath42010to42100() {
422430 assertTrue (upgrades [2 ] instanceof Upgrade42040to42100 );
423431 assertEquals (currentVersion .toString (), upgrades [2 ].getUpgradedVersion ());
424432 }
433+
434+ @ Test
435+ public void testCalculateUpgradePath42300to2400 () {
436+
437+ final CloudStackVersion dbVersion = CloudStackVersion .parse ("4.23.0.0" );
438+ assertNotNull (dbVersion );
439+
440+ final CloudStackVersion currentVersion = CloudStackVersion .parse ("24.0.0" );
441+ assertNotNull (currentVersion );
442+
443+ final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker ();
444+ final DbUpgrade [] upgrades = checker .calculateUpgradePath (dbVersion , currentVersion );
445+
446+ assertNotNull (upgrades );
447+ assertEquals (1 , upgrades .length );
448+ assertTrue (upgrades [0 ] instanceof Upgrade42300to2400 );
449+
450+ assertArrayEquals (new String []{"4.23.0.0" , "24.0.0" }, upgrades [0 ].getUpgradableVersionRange ());
451+ assertEquals (currentVersion .toString (), upgrades [0 ].getUpgradedVersion ());
452+ }
453+
454+ @ Test
455+ public void testUpdateSystemVmTemplateVersionBelowCutover () {
456+ DatabaseUpgradeChecker .updateSystemVmTemplateVersion (CloudStackVersion .parse ("4.22.1.0" ));
457+
458+ assertEquals ("4.22" , SystemVmTemplateRegistration .CS_MAJOR_VERSION );
459+ assertEquals ("1" , SystemVmTemplateRegistration .CS_TINY_VERSION );
460+ }
461+
462+ @ Test
463+ public void testUpdateSystemVmTemplateVersionAtCutover () {
464+ DatabaseUpgradeChecker .updateSystemVmTemplateVersion (CloudStackVersion .parse ("24.0.1" ));
465+
466+ assertEquals ("24.0" , SystemVmTemplateRegistration .CS_MAJOR_VERSION );
467+ assertEquals ("1" , SystemVmTemplateRegistration .CS_TINY_VERSION );
468+ }
469+
470+ @ Test
471+ public void testUpdateSystemVmTemplateVersionAfterCutover () {
472+ DatabaseUpgradeChecker .updateSystemVmTemplateVersion (CloudStackVersion .parse ("25.3.2" ));
473+
474+ assertEquals ("25.3" , SystemVmTemplateRegistration .CS_MAJOR_VERSION );
475+ assertEquals ("2" , SystemVmTemplateRegistration .CS_TINY_VERSION );
476+ }
425477}
0 commit comments