blob: f0bf1ed8ed0ad8d184a3db4021d4b69bb6675349 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.clustering;
import junit.framework.TestCase;
import org.apache.axiom.util.UIDGenerator;
import org.apache.axis2.AxisFault;
import org.apache.axis2.clustering.management.DefaultNodeManager;
import org.apache.axis2.clustering.management.NodeManager;
import org.apache.axis2.clustering.state.DefaultStateManager;
import org.apache.axis2.clustering.state.StateManager;
import org.apache.axis2.clustering.tribes.TribesClusteringAgent;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.context.ServiceGroupContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.Utils;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.List;
/**
* Tests the replication of properties placed the ConfigurationContext, ServiceGroupContext &
* ServiceContext
*/
public class ContextReplicationTest extends TestCase {
private static final String TEST_SERVICE_NAME = "testService";
private static final Parameter domainParam =
new Parameter(ClusteringConstants.Parameters.DOMAIN,
"axis2.domain." + UIDGenerator.generateUID());
// --------------- Cluster-1 ------------------------------------------------------
private ClusteringAgent clusterManager1;
private StateManager ctxMan1;
private NodeManager configMan1;
private ConfigurationContext configurationContext1;
private AxisServiceGroup serviceGroup1;
private AxisService service1;
//---------------------------------------------------------------------------------
// --------------- Cluster-2 ------------------------------------------------------
private ClusteringAgent clusterManager2;
private StateManager ctxMan2;
private NodeManager configMan2;
private ConfigurationContext configurationContext2;
private AxisServiceGroup serviceGroup2;
private AxisService service2;
//---------------------------------------------------------------------------------
private static boolean canRunTests;
private int getPort(int portStart, int retries) throws IOException {
InetSocketAddress addr = null;
ServerSocket socket = new ServerSocket();
int port = -1;
while (retries > 0) {
try {
addr = new InetSocketAddress(InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),
portStart);
socket.bind(addr);
port = portStart;
System.out.println("Can bind Server Socket to:" + addr);
socket.close();
break;
} catch (IOException x) {
retries--;
if (retries <= 0) {
System.out.println("Unable to bind server socket to:" + addr +
" throwing error.");
throw x;
}
portStart++;
}
}
return port;
}
private void canRunTests() {
if(System.getProperty("run.clustering.tests", "false").equals("false")){
canRunTests = false;
return;
}
// Which port should we listen to
final int port;
try {
port = getPort(4000, 1000);
} catch (IOException e) {
e.printStackTrace();
canRunTests = false;
return;
}
// Which address
final String group = "225.4.5.6";
Thread receiver = new Thread() {
public void run() {
try {
MulticastSocket s = new MulticastSocket(port);
s.joinGroup(InetAddress.getByName(group));
// Create a DatagramPacket and do a receive
byte buf[] = new byte[1024];
DatagramPacket pack = new DatagramPacket(buf, buf.length);
s.receive(pack);
System.out.println("Received data from: " + pack.getAddress().toString() +
":" + pack.getPort() + " with length: " +
pack.getLength());
s.leaveGroup(InetAddress.getByName(group));
s.close();
canRunTests = true;
} catch (Exception e) {
e.printStackTrace();
canRunTests = false;
}
}
};
receiver.start();
Thread sender = new Thread() {
public void run() {
try {
MulticastSocket s = new MulticastSocket();
byte buf[] = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}
DatagramPacket pack = new DatagramPacket(buf, buf.length,
InetAddress.getByName(group), port);
s.setTimeToLive(2);
s.send(pack);
System.out.println("Sent test data");
s.close();
} catch (Exception e) {
e.printStackTrace();
canRunTests = false;
}
}
};
sender.start();
// Join the receiver until we can verify whether multicasting can be done
try {
receiver.join(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ContextReplicationTest().canRunTests();
}
protected void setUp() throws Exception {
canRunTests();
if (!canRunTests) {
System.out.println("[WARNING] Aborting clustering tests");
return;
}
System.setProperty(ClusteringConstants.LOCAL_IP_ADDRESS, Utils.getIpAddress());
// First cluster
configurationContext1 =
ConfigurationContextFactory.createDefaultConfigurationContext();
serviceGroup1 = createAxisServiceGroup(configurationContext1);
service1 = createAxisService(serviceGroup1);
ctxMan1 = getContextManager();
configMan1 = getConfigurationManager();
clusterManager1 = getClusterManager(configurationContext1, ctxMan1, configMan1);
clusterManager1.addParameter(domainParam);
clusterManager1.init();
System.out.println("---------- ClusteringAgent-1 successfully initialized -----------");
// Second cluster
configurationContext2 =
ConfigurationContextFactory.createDefaultConfigurationContext();
serviceGroup2 = createAxisServiceGroup(configurationContext2);
service2 = createAxisService(serviceGroup2);
ctxMan2 = getContextManager();
configMan2 = getConfigurationManager();
clusterManager2 = getClusterManager(configurationContext2, ctxMan2, configMan2);
clusterManager2.addParameter(domainParam);
clusterManager2.init();
System.out.println("---------- ClusteringAgent-2 successfully initialized -----------");
}
protected ClusteringAgent getClusterManager(ConfigurationContext configCtx,
StateManager stateManager,
NodeManager configManager)
throws AxisFault {
ClusteringAgent clusteringAgent = new TribesClusteringAgent();
configCtx.getAxisConfiguration().setClusteringAgent(clusteringAgent);
clusteringAgent.setNodeManager(configManager);
clusteringAgent.setStateManager(stateManager);
clusteringAgent.setConfigurationContext(configCtx);
return clusteringAgent;
}
protected AxisServiceGroup createAxisServiceGroup(ConfigurationContext configCtx)
throws AxisFault {
AxisConfiguration axisConfig = configCtx.getAxisConfiguration();
AxisServiceGroup serviceGroup = new AxisServiceGroup(axisConfig);
axisConfig.addServiceGroup(serviceGroup);
return serviceGroup;
}
protected AxisService createAxisService(AxisServiceGroup serviceGroup) throws AxisFault {
AxisService service = new AxisService(TEST_SERVICE_NAME);
serviceGroup.addService(service);
return service;
}
protected StateManager getContextManager() throws AxisFault {
StateManager stateManager = new DefaultStateManager();
return stateManager;
}
protected NodeManager getConfigurationManager() throws AxisFault {
NodeManager contextManager = new DefaultNodeManager();
return contextManager;
}
public void testSetPropertyInConfigurationContext() throws Exception {
if (!canRunTests) {
return;
}
{
String key1 = "configCtxKey";
String val1 = "configCtxVal1";
configurationContext1.setProperty(key1, val1);
ctxMan1.updateContext(configurationContext1);
String value = (String) configurationContext2.getProperty(key1);
assertEquals(val1, value);
}
{
String key2 = "configCtxKey2";
String val2 = "configCtxVal1";
configurationContext2.setProperty(key2, val2);
ctxMan2.updateContext(configurationContext2);
Thread.sleep(1000);
String value = (String) configurationContext1.getProperty(key2);
assertEquals(val2, value);
}
}
public void testRemovePropertyFromConfigurationContext() throws Exception {
if (!canRunTests) {
return;
}
String key1 = "configCtxKey";
String val1 = "configCtxVal1";
// First set the property on a cluster 1 and replicate it
{
configurationContext1.setProperty(key1, val1);
ctxMan1.updateContext(configurationContext1);
String value = (String) configurationContext2.getProperty(key1);
assertEquals(val1, value);
}
// Next remove this property from cluster 2, replicate it, and check that it is unavailable in cluster 1
configurationContext2.removeProperty(key1);
ctxMan2.updateContext(configurationContext2);
String value = (String) configurationContext1.getProperty(key1);
assertNull(configurationContext2.getProperty(key1));
assertNull(value);
}
public void testSetPropertyInServiceGroupContext() throws Exception {
if (!canRunTests) {
return;
}
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
configurationContext1.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
configurationContext2.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceGroupContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceGroupContext1);
assertEquals(val1, serviceGroupContext2.getProperty(key1));
}
public void testRemovePropertyFromServiceGroupContext() throws Exception {
if (!canRunTests) {
return;
}
// Add the property
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
configurationContext1.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
configurationContext2.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceGroupContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceGroupContext1);
assertEquals(val1, serviceGroupContext2.getProperty(key1));
// Remove the property
serviceGroupContext2.removeProperty(key1);
assertNull(serviceGroupContext2.getProperty(key1));
ctxMan2.updateContext(serviceGroupContext2);
assertNull(serviceGroupContext1.getProperty(key1));
}
public void testSetPropertyInServiceGroupContext2() throws Exception {
if (!canRunTests) {
return;
}
String sgcID = UIDGenerator.generateUID();
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(sgcID);
configurationContext1.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(sgcID);
configurationContext2.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceGroupContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceGroupContext1);
assertEquals(val1, serviceGroupContext2.getProperty(key1));
}
public void testRemovePropertyFromServiceGroupContext2() throws Exception {
if (!canRunTests) {
return;
}
// Add the property
String sgcID = UIDGenerator.generateUID();
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(sgcID);
configurationContext1.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(sgcID);
configurationContext2.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceGroupContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceGroupContext1);
assertEquals(val1, serviceGroupContext2.getProperty(key1));
// Remove the property
serviceGroupContext2.removeProperty(key1);
assertNull(serviceGroupContext2.getProperty(key1));
ctxMan2.updateContext(serviceGroupContext2);
assertNull(serviceGroupContext1.getProperty(key1));
}
public void testSetPropertyInServiceContext() throws Exception {
if (!canRunTests) {
return;
}
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext1 = serviceGroupContext1.getServiceContext(service1);
configurationContext1.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
assertNotNull(serviceContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext2 = serviceGroupContext2.getServiceContext(service2);
configurationContext2.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
assertNotNull(serviceContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceContext1);
assertEquals(val1, serviceContext2.getProperty(key1));
}
public void testSetPropertyInServiceContext2() throws Exception {
if (!canRunTests) {
return;
}
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext1 = serviceGroupContext1.getServiceContext(service1);
configurationContext1.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
assertNotNull(serviceContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext2 = serviceGroupContext2.getServiceContext(service2);
configurationContext2.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
assertNotNull(serviceContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceContext1);
assertEquals(val1, serviceContext2.getProperty(key1));
}
public void testRemovePropertyFromServiceContext() throws Exception {
if (!canRunTests) {
return;
}
// Add the property
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext1 = serviceGroupContext1.getServiceContext(service1);
configurationContext1.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
assertNotNull(serviceContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext2 = serviceGroupContext2.getServiceContext(service2);
configurationContext2.addServiceGroupContextIntoApplicationScopeTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
assertNotNull(serviceContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceContext1);
assertEquals(val1, serviceContext2.getProperty(key1));
// Remove the property
serviceContext2.removeProperty(key1);
assertNull(serviceContext2.getProperty(key1));
ctxMan2.updateContext(serviceContext2);
assertNull(serviceContext1.getProperty(key1));
}
public void testRemovePropertyFromServiceContext2() throws Exception {
if (!canRunTests) {
return;
}
// Add the property
ServiceGroupContext serviceGroupContext1 =
configurationContext1.createServiceGroupContext(serviceGroup1);
serviceGroupContext1.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext1 = serviceGroupContext1.getServiceContext(service1);
configurationContext1.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext1);
assertNotNull(serviceGroupContext1);
assertNotNull(serviceContext1);
ServiceGroupContext serviceGroupContext2 =
configurationContext2.createServiceGroupContext(serviceGroup2);
serviceGroupContext2.setId(TEST_SERVICE_NAME);
ServiceContext serviceContext2 = serviceGroupContext2.getServiceContext(service2);
configurationContext2.addServiceGroupContextIntoSoapSessionTable(serviceGroupContext2);
assertNotNull(serviceGroupContext2);
assertNotNull(serviceContext2);
String key1 = "sgCtxKey";
String val1 = "sgCtxVal1";
serviceContext1.setProperty(key1, val1);
ctxMan1.updateContext(serviceContext1);
assertEquals(val1, serviceContext2.getProperty(key1));
// Remove the property
serviceContext2.removeProperty(key1);
assertNull(serviceContext2.getProperty(key1));
ctxMan2.updateContext(serviceContext2);
assertNull(serviceContext1.getProperty(key1));
}
public void testReplicationExclusion0() throws Exception {
if (!canRunTests) {
return;
}
String key1 = "local_configCtxKey";
String val1 = "configCtxVal1";
configurationContext1.setProperty(key1, val1);
List<String> exclusionPatterns = new ArrayList<String>();
exclusionPatterns.add("*"); // Exclude all properties
ctxMan1.setReplicationExcludePatterns("defaults", exclusionPatterns);
ctxMan1.updateContext(configurationContext1);
String value = (String) configurationContext2.getProperty(key1);
assertNull(value); // The property should not have gotten replicated
}
public void testReplicationExclusion1() throws Exception {
if (!canRunTests) {
return;
}
String key1 = "local_configCtxKey";
String val1 = "configCtxVal1";
configurationContext1.setProperty(key1, val1);
List<String> exclusionPatterns = new ArrayList<String>();
exclusionPatterns.add("local_*");
ctxMan1.setReplicationExcludePatterns("defaults", exclusionPatterns);
ctxMan1.updateContext(configurationContext1);
String value = (String) configurationContext2.getProperty(key1);
assertNull(value); // The property should not have gotten replicated
}
public void testReplicationExclusion2() throws Exception {
if (!canRunTests) {
return;
}
String key1 = "local_configCtxKey";
String val1 = "configCtxVal1";
configurationContext1.setProperty(key1, val1);
List<String> exclusionPatterns = new ArrayList<String>();
exclusionPatterns.add("local_*");
ctxMan1.setReplicationExcludePatterns("org.apache.axis2.context.ConfigurationContext",
exclusionPatterns);
ctxMan1.updateContext(configurationContext1);
String value = (String) configurationContext2.getProperty(key1);
assertNull(value); // The property should not have gotten replicated
}
public void testReplicationExclusion3() throws Exception {
if (!canRunTests) {
return;
}
String key1 = "local1_configCtxKey";
String val1 = "configCtxVal1";
configurationContext1.setProperty(key1, val1);
String key2 = "local2_configCtxKey";
String val2 = "configCtxVal2";
configurationContext1.setProperty(key2, val2);
String key3 = "local3_configCtxKey";
String val3 = "configCtxVal3";
configurationContext1.setProperty(key3, val3);
List<String> exclusionPatterns1 = new ArrayList<String>();
exclusionPatterns1.add("local1_*");
List<String> exclusionPatterns2 = new ArrayList<String>();
exclusionPatterns2.add("local2_*");
ctxMan1.setReplicationExcludePatterns("org.apache.axis2.context.ConfigurationContext",
exclusionPatterns1);
ctxMan1.setReplicationExcludePatterns("defaults",
exclusionPatterns2);
ctxMan1.updateContext(configurationContext1);
String value1 = (String) configurationContext2.getProperty(key1);
assertNull(value1); // The property should not have gotten replicated
String value2 = (String) configurationContext2.getProperty(key2);
assertNull(value2); // The property should not have gotten replicated
String value3 = (String) configurationContext2.getProperty(key3);
assertEquals(val3, value3); // The property should have gotten replicated
}
protected void tearDown() throws Exception {
super.tearDown();
if (clusterManager1 != null) {
clusterManager1.shutdown();
System.out.println("------ CLuster-1 shutdown complete ------");
}
if (clusterManager2 != null) {
clusterManager2.shutdown();
System.out.println("------ CLuster-2 shutdown complete ------");
}
// MembershipManager.removeAllMembers();
Thread.sleep(500);
}
}