7171 * a stopped pod/managed server to a live pod/managed server.
7272 * Configuration :
7373 * 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
7575 * All resources are targeted to cluster with enabled JMS service migration
7676 * Two Distributed Queue(s) one with FileStore and the other with JDBC Store
7777 * Separate ORACLE Datasource for cluster leasing
8282 * (d) Make sure all 100 messages got recovered once the
8383 * JMS Service@managed-server2 is migrated to managed-server1
8484 * 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
8587 */
8688
8789@ 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" )
8991@ IntegrationTest
90- class ItMiiJmsRecovery {
92+ class ItMiiServiceMigration {
9193
9294 private static String opNamespace = null ;
9395 private static String domainNamespace = null ;
@@ -175,7 +177,7 @@ public static void initAll(@Namespaces(2) List<String> namespaces) {
175177 createSecretForBaseImages (domainNamespace );
176178
177179 // create PV, PVC for logs/data
178- createPV (pvName , domainUid , ItMiiJmsRecovery .class .getSimpleName ());
180+ createPV (pvName , domainUid , ItMiiServiceMigration .class .getSimpleName ());
179181 createPVC (pvName , pvcName , domainUid , domainNamespace );
180182
181183 // create job to change permissions on PV hostPath
@@ -289,6 +291,52 @@ public void testMiiJmsServiceMigrationWithJdbcStore() {
289291 "JdbcJmsServer@managed-server2@jms.jdbcUniformQueue" );
290292 }
291293
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+
292340 private void restartManagedServer (String serverName ) {
293341
294342 String commonParameters = " -d " + domainUid + " -n " + domainNamespace ;
@@ -317,17 +365,18 @@ private void runJmsClientOnAdminPod(String action, String queue) {
317365 }
318366
319367 /*
320- * Verify the JMS Server Runtime through rest API.
368+ * Verify the JMS Server Runtime through REST API.
321369 * Get the JMSServer Runtime ClusterJmsServer@managed-server2 found on
322370 * 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
325373 **/
326374 private boolean checkJmsServerRuntime (String managedServer ) {
327375 ExecResult result = null ;
328376 int adminServiceNodePort
329377 = 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 + " " );
331380 curlString .append ("http://" + K8S_NODEPORT_HOST + ":" + adminServiceNodePort )
332381 .append ("/management/weblogic/latest/domainRuntime/serverRuntimes/" )
333382 .append (managedServer )
@@ -351,4 +400,41 @@ private boolean checkJmsServerRuntime(String managedServer) {
351400 return true ;
352401 }
353402
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+
354440}
0 commit comments