package org.infinispan.server.test.rollingupgrades; import static junit.framework.TestCase.assertNull; import static org.junit.Assert.assertEquals; import javax.management.ObjectName; import org.infinispan.arquillian.core.InfinispanResource; import org.infinispan.arquillian.core.RemoteInfinispanServers; import org.infinispan.arquillian.utils.MBeanServerConnectionProvider; import org.infinispan.client.hotrod.ProtocolVersion; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.impl.ConfigurationProperties; import org.infinispan.server.infinispan.spi.InfinispanSubsystem; import org.infinispan.server.test.category.RollingUpgradesDist; import org.infinispan.server.test.util.RemoteCacheManagerFactory; import org.infinispan.server.test.util.RemoteInfinispanMBeans; import org.jboss.arquillian.container.test.api.ContainerController; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; /** * Tests for rolling upgrades functionality, distribution mode. * * @author Tomas Sykora (tsykora@redhat.com) */ @RunWith(Arquillian.class) @Category({RollingUpgradesDist.class}) public class HotRodRollingUpgradesDistIT extends AbstractHotRodRollingUpgradesIT { @Test public void testHotRodRollingUpgradesDiffVersionsDist() throws Exception { // Target nodes final int managementPortServer1 = 9990; MBeanServerConnectionProvider provider1; // Target nodes final int managementPortServer2 = 10090; MBeanServerConnectionProvider provider2; // Source node int managementPortServer3 = 10199; MBeanServerConnectionProvider provider3; try { if (!Boolean.parseBoolean(System.getProperty("start.jboss.as.manually"))) { // start it by Arquillian controller.start("hotrod-rolling-upgrade-3-old-dist"); controller.start("hotrod-rolling-upgrade-4-old-dist"); managementPortServer3 = 10190; } // we use PROTOCOL_VERSION_25 here because servers using older version are out of testing scope ConfigurationBuilder builder3 = new ConfigurationBuilder(); builder3.addServer() .host("127.0.0.1") .port(11422) .version(ProtocolVersion.PROTOCOL_VERSION_25); RemoteCacheManager rcm3 = new RemoteCacheManager(builder3.build()); final RemoteCache<String, String> c3 = rcm3.getCache("default"); ConfigurationBuilder builder4 = new ConfigurationBuilder(); builder4.addServer() .host("127.0.0.1") .port(11522) .version(ProtocolVersion.PROTOCOL_VERSION_25); RemoteCacheManager rcm4 = new RemoteCacheManager(builder4.build()); final RemoteCache<String, String> c4 = rcm4.getCache("default"); c3.put("key1", "value1"); assertEquals("value1", c3.get("key1")); c4.put("keyx1", "valuex1"); assertEquals("valuex1", c4.get("keyx1")); for (int i = 0; i < 50; i++) { c3.put("keyLoad" + i, "valueLoad" + i); c4.put("keyLoadx" + i, "valueLoadx" + i); } controller.start("hotrod-rolling-upgrade-1-dist"); controller.start("hotrod-rolling-upgrade-2-dist"); RemoteInfinispanMBeans s1 = createRemotes("hotrod-rolling-upgrade-1-dist", "clustered-new", DEFAULT_CACHE_NAME); // hotrod.protocol.version, if explictily defined, is set in createCache() method final RemoteCache<Object, Object> c1 = createCache(s1); RemoteInfinispanMBeans s2 = createRemotes("hotrod-rolling-upgrade-2-dist", "clustered-new", DEFAULT_CACHE_NAME); final RemoteCache<Object, Object> c2 = createCache(s2); // test cross-fetching of entries from stores assertEquals("Can't access entries stored in source node (target's RemoteCacheStore).", "value1", c1.get("key1")); assertEquals("Can't access entries stored in source node (target's RemoteCacheStore).", "valuex1", c1.get("keyx1")); assertEquals("Can't access entries stored in source node (target's RemoteCacheStore).", "value1", c2.get("key1")); assertEquals("Can't access entries stored in source node (target's RemoteCacheStore).", "valuex1", c2.get("keyx1")); provider1 = new MBeanServerConnectionProvider(s1.server.getHotrodEndpoint().getInetAddress().getHostName(), managementPortServer1); provider2 = new MBeanServerConnectionProvider(s2.server.getHotrodEndpoint().getInetAddress().getHostName(), managementPortServer2); provider3 = new MBeanServerConnectionProvider("127.0.0.1", managementPortServer3); final ObjectName rollMan3 = new ObjectName("jboss." + InfinispanSubsystem.SUBSYSTEM_NAME + ":type=Cache," + "name=\"default(dist_sync)\"," + "manager=\"clustered\"," + "component=RollingUpgradeManager"); invokeOperation(provider3, rollMan3.toString(), "recordKnownGlobalKeyset", new Object[]{}, new String[]{}); final ObjectName rollManTarget = new ObjectName("jboss." + InfinispanSubsystem.SUBSYSTEM_NAME + ":type=Cache," + "name=\"default(dist_sync)\"," + "manager=\"clustered-new\"," + "component=RollingUpgradeManager"); invokeOperation(provider1, rollManTarget.toString(), "synchronizeData", new Object[]{"hotrod"}, new String[]{"java.lang.String"}); invokeOperation(provider1, rollManTarget.toString(), "disconnectSource", new Object[]{"hotrod"}, new String[]{"java.lang.String"}); invokeOperation(provider2, rollManTarget.toString(), "disconnectSource", new Object[]{"hotrod"}, new String[]{"java.lang.String"}); // is source (RemoteCacheStore) really disconnected? c3.put("disconnected", "source"); c4.put("disconnectedx", "sourcex"); assertEquals("Can't obtain value from cache3 (source node).", "source", c3.get("disconnected")); assertEquals("Can't obtain value from cache4 (source node).", "source", c4.get("disconnected")); assertEquals("Can't obtain value from cache3 (source node).", "sourcex", c3.get("disconnectedx")); assertEquals("Can't obtain value from cache4 (source node).", "sourcex", c4.get("disconnectedx")); assertNull("Source node entries should NOT be accessible from target node (after RCS disconnection)", c1.get("disconnected")); assertNull("Source node entries should NOT be accessible from target node (after RCS disconnection)", c2.get("disconnected")); assertNull("Source node entries should NOT be accessible from target node (after RCS disconnection)", c1.get("disconnectedx")); assertNull("Source node entries should NOT be accessible from target node (after RCS disconnection)", c2.get("disconnectedx")); // all entries migrated? assertEquals("Entry was not successfully migrated.", "value1", c1.get("key1")); for (int i = 0; i < 50; i++) { assertEquals("Entry was not successfully migrated.", "valueLoad" + i, c1.get("keyLoad" + i)); // it is clustered, all entries should be migrated and accessible assertEquals("Entry was not successfully migrated.", "valueLoadx" + i, c1.get("keyLoadx" + i)); } } finally { if (controller.isStarted("hotrod-rolling-upgrade-1-dist")) { controller.stop("hotrod-rolling-upgrade-1-dist"); } if (controller.isStarted("hotrod-rolling-upgrade-2-dist")) { controller.stop("hotrod-rolling-upgrade-2-dist"); } if (controller.isStarted("hotrod-rolling-upgrade-3-old-dist")) { controller.stop("hotrod-rolling-upgrade-3-old-dist"); } if (controller.isStarted("hotrod-rolling-upgrade-4-old-dist")) { controller.stop("hotrod-rolling-upgrade-4-old-dist"); } } } }