71
71
* a stopped pod/managed server to a live pod/managed server.
72
72
* Configuration :
73
73
* MII cluster domain with 2 managed servers
74
- * Two set of JMS Resources with FileStore and JDBC Store
74
+ * Two sets of JMS Resources with FileStore and JDBC Store
75
75
* All resources are targeted to cluster with enabled JMS service migration
76
76
* Two Distributed Queue(s) one with FileStore and the other with JDBC Store
77
77
* Separate ORACLE Datasource for cluster leasing
82
82
* (d) Make sure all 100 messages got recovered once the
83
83
* JMS Service@managed-server2 is migrated to managed-server1
84
84
* Above steps are repeated for both FileStore and JDBCStore based Distributed Queue.
85
+ * This test class verifies the JTA Service Migration with shutdown-recovery
86
+ * migration policy by verifying the JTA Recovery Service runtime MBean
85
87
*/
86
88
87
89
@ TestMethodOrder (MethodOrderer .OrderAnnotation .class )
88
- @ DisplayName ("Test JMS service migration on cluster scale down" )
90
+ @ DisplayName ("Test JMS/JTA service migration on cluster scale down" )
89
91
@ IntegrationTest
90
- class ItMiiJmsRecovery {
92
+ class ItMiiServiceMigration {
91
93
92
94
private static String opNamespace = null ;
93
95
private static String domainNamespace = null ;
@@ -175,7 +177,7 @@ public static void initAll(@Namespaces(2) List<String> namespaces) {
175
177
createSecretForBaseImages (domainNamespace );
176
178
177
179
// create PV, PVC for logs/data
178
- createPV (pvName , domainUid , ItMiiJmsRecovery .class .getSimpleName ());
180
+ createPV (pvName , domainUid , ItMiiServiceMigration .class .getSimpleName ());
179
181
createPVC (pvName , pvcName , domainUid , domainNamespace );
180
182
181
183
// create job to change permissions on PV hostPath
@@ -289,6 +291,52 @@ public void testMiiJmsServiceMigrationWithJdbcStore() {
289
291
"JdbcJmsServer@[email protected] " );
290
292
}
291
293
294
+ /**
295
+ * Verify JTA Recovery Service is migrated to an available active server.
296
+ * when a server is shutdown ( cluster is scaled down )
297
+ * The MigrationPolicy on the ServerTemplate is set to 'shutdown-recovery'
298
+ * so that the JTA recovery service is migrated to an active server in the
299
+ * cluster when a server is shutdown. This can be checked by verifying the
300
+ * JTARecoveryService runtime MBean for the stopped server in an active
301
+ * server. For example say managed server ms2 is down, make sure that the JTA
302
+ * recovery service for ms2 is active on the running managed server ms1
303
+ * Also make sure that the JTA Recovery service (ms2) is migrated back to
304
+ * server ms2 when the server ms2 is re-started.
305
+ */
306
+ @ Test
307
+ @ Order (3 )
308
+ @ DisplayName ("Verify JTA Recovery Service migration to an active server" )
309
+ public void testMiiJtaServiceMigration () {
310
+
311
+ // Restart the managed server(2) if shutdown by previous test method
312
+ // Make sure that JTA Recovery service is active on managed-server2
313
+ restartManagedServer ("managed-server2" );
314
+ assertTrue (checkJtaRecoveryServiceRuntime ("managed-server2" , "managed-server2" , "true" ),
315
+ "JTARecoveryService@managed-server2 is not on managed-server2 before migration" );
316
+
317
+ // Stop the server managed-server2 by patching the cluster
318
+ boolean psuccess = assertDoesNotThrow (() ->
319
+ scaleCluster (domainUid , domainNamespace , "cluster-1" , 1 ),
320
+ String .format ("replica patching to 1 failed for domain %s in namespace %s" , domainUid , domainNamespace ));
321
+ assertTrue (psuccess ,
322
+ String .format ("Cluster replica patching failed for domain %s in namespace %s" , domainUid , domainNamespace ));
323
+ checkPodDoesNotExist (managedServerPrefix + "2" , domainUid , domainNamespace );
324
+
325
+ assertTrue (checkJtaRecoveryServiceRuntime ("managed-server1" , "managed-server2" , "true" ),
326
+ "JTA RecoveryService@managed-server2 is not migrated to managed-server1" );
327
+ logger .info ("JTA RecoveryService@managed-server2 is migrated to managed-server1" );
328
+
329
+ // Restart the managed server(2) to make sure the JTA Recovery Service is
330
+ // migrated back to original hosting server
331
+ restartManagedServer ("managed-server2" );
332
+ assertTrue (checkJtaRecoveryServiceRuntime ("managed-server2" , "managed-server2" , "true" ),
333
+ "JTARecoveryService@managed-server2 is not on managed-server2 after restart" );
334
+ logger .info ("JTA RecoveryService@managed-server2 is migrated back to managed-server1" );
335
+ assertTrue (checkJtaRecoveryServiceRuntime ("managed-server1" , "managed-server2" , "false" ),
336
+ "JTARecoveryService@managed-server2 is not deactivated on managed-server1 after restart" );
337
+ logger .info ("JTA RecoveryService@managed-server2 is deactivated on managed-server1 after restart" );
338
+ }
339
+
292
340
private void restartManagedServer (String serverName ) {
293
341
294
342
String commonParameters = " -d " + domainUid + " -n " + domainNamespace ;
@@ -317,17 +365,18 @@ private void runJmsClientOnAdminPod(String action, String queue) {
317
365
}
318
366
319
367
/*
320
- * Verify the JMS Server Runtime through rest API.
368
+ * Verify the JMS Server Runtime through REST API.
321
369
* Get the JMSServer Runtime ClusterJmsServer@managed-server2 found on
322
370
* specified managed server.
323
- * @param managedServer name of managed server to look for JMSServerRuntime
324
- * @returns true if MBEAN is found otherwise false
371
+ * @param managedServer name of the managed server to look for JMSServerRuntime
372
+ * @returns true if MBean is found otherwise false
325
373
**/
326
374
private boolean checkJmsServerRuntime (String managedServer ) {
327
375
ExecResult result = null ;
328
376
int adminServiceNodePort
329
377
= getServiceNodePort (domainNamespace , getExternalServicePodName (adminServerPodName ), "default" );
330
- StringBuffer curlString = new StringBuffer ("status=$(curl --user weblogic:welcome1 " );
378
+ StringBuffer curlString = new StringBuffer ("status=$(curl --user "
379
+ + ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT + " " );
331
380
curlString .append ("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort )
332
381
.append ("/management/weblogic/latest/domainRuntime/serverRuntimes/" )
333
382
.append (managedServer )
@@ -351,4 +400,41 @@ private boolean checkJmsServerRuntime(String managedServer) {
351
400
return true ;
352
401
}
353
402
403
+ /*
404
+ * Verify the JTA Recovery Service Runtime through REST API.
405
+ * Get the JTA Recovery Service Runtime for a server on a
406
+ * specified managed server.
407
+ * @param managedServer name of the server to look for RecoveyServerRuntime
408
+ * @param recoveryService name of RecoveyServerRuntime (managed server)
409
+ * @param active is the recovery active (true or false )
410
+ * @returns true if MBean is found otherwise false
411
+ **/
412
+ private boolean checkJtaRecoveryServiceRuntime (String managedServer , String recoveryService , String active ) {
413
+ ExecResult result = null ;
414
+ int adminServiceNodePort
415
+ = getServiceNodePort (domainNamespace , getExternalServicePodName (adminServerPodName ), "default" );
416
+ StringBuffer curlString = new StringBuffer ("curl --user "
417
+ + ADMIN_USERNAME_DEFAULT + ":" + ADMIN_PASSWORD_DEFAULT + " " );
418
+ curlString .append ("\" http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort )
419
+ .append ("/management/weblogic/latest/domainRuntime/serverRuntimes/" )
420
+ .append (managedServer )
421
+ .append ("/JTARuntime/recoveryRuntimeMBeans/" )
422
+ .append (recoveryService )
423
+ .append ("?fields=active&links=none\" " )
424
+ .append (" --show-error " );
425
+ logger .info ("checkJtaRecoveryServiceRuntime: curl command {0}" , new String (curlString ));
426
+ withStandardRetryPolicy
427
+ .conditionEvaluationListener (
428
+ condition -> logger .info ("Waiting for JTA Recovery Service to migrate "
429
+ + "(elapsed time {0} ms, remaining time {1} ms)" ,
430
+ condition .getElapsedTimeInMS (),
431
+ condition .getRemainingTimeInMS ()))
432
+ .until (assertDoesNotThrow (() -> {
433
+ return () -> {
434
+ return exec (new String (curlString ), true ).stdout ().contains ("{\" active\" : " + active + "}" );
435
+ };
436
+ }));
437
+ return true ;
438
+ }
439
+
354
440
}
0 commit comments