package org.infinispan.server.test.rollingupgrades;
import javax.management.ObjectName;
import org.apache.http.HttpStatus;
import org.infinispan.arquillian.core.InfinispanResource;
import org.infinispan.arquillian.core.RemoteInfinispanServers;
import org.infinispan.arquillian.utils.MBeanServerConnectionProvider;
import org.infinispan.server.infinispan.spi.InfinispanSubsystem;
import org.infinispan.server.test.category.RollingUpgrades;
import org.infinispan.server.test.client.rest.RESTHelper;
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.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
/**
* Tests for REST rolling upgrades.
*
* @author Tomas Sykora (tsykora@redhat.com)
* @author Martin Gencur (mgencur@redhat.com)
*/
@Ignore("Disabled until ISPN-7617 is fixed")
@RunWith(Arquillian.class)
@Category({RollingUpgrades.class})
public class RestRollingUpgradesIT {
@InfinispanResource
RemoteInfinispanServers serverManager;
static final String DEFAULT_CACHE_NAME = "default";
static final int PORT_OFFSET = 100;
@ArquillianResource
ContainerController controller;
@Test
public void testRestRollingUpgradesDiffVersions() throws Exception {
// target node
final int managementPortServer1 = 9990;
MBeanServerConnectionProvider provider1;
// Source node
int managementPortServer2 = 10099;
MBeanServerConnectionProvider provider2;
RESTHelper rest = new RESTHelper();
try {
if (!Boolean.parseBoolean(System.getProperty("start.jboss.as.manually"))) {
// start it by Arquillian
controller.start("rest-rolling-upgrade-2-old");
managementPortServer2 = 10090;
}
rest.addServer("127.0.0.1", "/rest");
rest.post(rest.fullPathKey(0, DEFAULT_CACHE_NAME, "key1", PORT_OFFSET), "data", "text/html");
rest.get(rest.fullPathKey(0, DEFAULT_CACHE_NAME, "key1", PORT_OFFSET), "data");
for (int i = 0; i < 50; i++) {
rest.post(rest.fullPathKey(0, DEFAULT_CACHE_NAME, "keyLoad" + i, PORT_OFFSET), "valueLoad" + i, "text/html");
}
controller.start("rest-rolling-upgrade-1");
RemoteInfinispanMBeans s1 = createRemotes("rest-rolling-upgrade-1", "local", DEFAULT_CACHE_NAME);
rest.addServer(s1.server.getRESTEndpoint().getInetAddress().getHostName(), s1.server.getRESTEndpoint().getContextPath());
rest.get(rest.fullPathKey(1, DEFAULT_CACHE_NAME, "key1", 0), "data");
provider1 = new MBeanServerConnectionProvider(s1.server.getRESTEndpoint().getInetAddress().getHostName(),
managementPortServer1);
provider2 = new MBeanServerConnectionProvider("127.0.0.1", managementPortServer2);
final ObjectName rollMan = new ObjectName("jboss." + InfinispanSubsystem.SUBSYSTEM_NAME + ":type=Cache," + "name=\"default(local)\","
+ "manager=\"local\"," + "component=RollingUpgradeManager");
invokeOperation(provider2, rollMan.toString(), "recordKnownGlobalKeyset", new Object[]{}, new String[]{});
invokeOperation(provider1, rollMan.toString(), "synchronizeData", new Object[]{"rest"},
new String[]{"java.lang.String"});
invokeOperation(provider1, rollMan.toString(), "disconnectSource", new Object[]{"rest"},
new String[]{"java.lang.String"});
rest.post(rest.fullPathKey(0, DEFAULT_CACHE_NAME, "disconnected", PORT_OFFSET), "source", "application/text");
//Source node entries should NOT be accessible from target node
rest.get(rest.fullPathKey(1, DEFAULT_CACHE_NAME, "disconnected", 0), HttpStatus.SC_NOT_FOUND);
//All remaining entries migrated?
for (int i = 0; i < 50; i++) {
rest.get(rest.fullPathKey(1, DEFAULT_CACHE_NAME, "keyLoad" + i, 0), "valueLoad" + i);
}
} finally {
if (controller.isStarted("rest-rolling-upgrade-1")) {
controller.stop("rest-rolling-upgrade-1");
}
if (controller.isStarted("rest-rolling-upgrade-2-old")) {
controller.stop("rest-rolling-upgrade-2-old");
}
}
}
protected RemoteInfinispanMBeans createRemotes(String serverName, String managerName, String cacheName) {
return RemoteInfinispanMBeans.create(serverManager, serverName, cacheName, managerName);
}
private Object invokeOperation(MBeanServerConnectionProvider provider, String mbean, String operationName, Object[] params,
String[] signature) throws Exception {
return provider.getConnection().invoke(new ObjectName(mbean), operationName, params, signature);
}
}