use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.
the class BDBHAVirtualHostNodeTest method testNodeCannotStartWithIntruder.
public void testNodeCannotStartWithIntruder() throws Exception {
int nodePortNumber = _portHelper.getNextAvailable();
int intruderPortNumber = _portHelper.getNextAvailable();
String helperAddress = "localhost:" + nodePortNumber;
String groupName = "group";
String nodeName = "node";
Map<String, Object> node1Attributes = _helper.createNodeAttributes(nodeName, groupName, helperAddress, helperAddress, nodeName, nodePortNumber);
BDBHAVirtualHostNode<?> node = _helper.createAndStartHaVHN(node1Attributes);
final CountDownLatch stopLatch = new CountDownLatch(1);
ConfigurationChangeListener listener = new AbstractConfigurationChangeListener() {
@Override
public void stateChanged(ConfiguredObject<?> object, State oldState, State newState) {
if (newState == State.ERRORED) {
stopLatch.countDown();
}
}
};
node.addChangeListener(listener);
File environmentPathFile = new File(_helper.getMessageStorePath() + File.separator + "intruder");
Durability durability = Durability.parse((String) node1Attributes.get(BDBHAVirtualHostNode.DURABILITY));
joinIntruder(intruderPortNumber, "intruder", groupName, helperAddress, durability, environmentPathFile);
assertTrue("Intruder protection was not triggered during expected timeout", stopLatch.await(10, TimeUnit.SECONDS));
final CountDownLatch stateChangeLatch = new CountDownLatch(1);
final CountDownLatch roleChangeLatch = new CountDownLatch(1);
node.addChangeListener(new AbstractConfigurationChangeListener() {
@Override
public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState) {
if (newState == State.ERRORED) {
stateChangeLatch.countDown();
}
}
@Override
public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
if (BDBHAVirtualHostNode.ROLE.equals(attributeName) && NodeRole.DETACHED.equals(NodeRole.DETACHED)) {
roleChangeLatch.countDown();
}
}
});
// Try top re start the ERRORED node and ensure exception is thrown
try {
node.start();
fail("Restart of node should have thrown exception");
} catch (IllegalStateException ise) {
assertEquals("Unexpected exception when restarting node post intruder detection", "Intruder node detected: " + "localhost:" + intruderPortNumber, ise.getMessage());
}
// verify that intruder detection is triggered after restart and environment is closed
assertTrue("Node state was not set to ERRORED", stateChangeLatch.await(10, TimeUnit.SECONDS));
assertTrue("Node role was not set to DETACHED", roleChangeLatch.await(10, TimeUnit.SECONDS));
}
use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.
the class BDBHAVirtualHostNodeTest method testPermittedNodesChangedOnReplicaNodeOnlyOnceAfterBeingChangedOnMaster.
public void testPermittedNodesChangedOnReplicaNodeOnlyOnceAfterBeingChangedOnMaster() throws Exception {
int node1PortNumber = _portHelper.getNextAvailable();
int node2PortNumber = _portHelper.getNextAvailable();
String helperAddress = "localhost:" + node1PortNumber;
String groupName = "group";
String nodeName = "node1";
Map<String, Object> node1Attributes = _helper.createNodeAttributes(nodeName, groupName, helperAddress, helperAddress, nodeName, node1PortNumber, node2PortNumber);
BDBHAVirtualHostNode<?> node1 = _helper.createAndStartHaVHN(node1Attributes);
Map<String, Object> node2Attributes = _helper.createNodeAttributes("node2", groupName, "localhost:" + node2PortNumber, helperAddress, nodeName);
node2Attributes.put(BDBHAVirtualHostNode.PRIORITY, 0);
BDBHAVirtualHostNode<?> node2 = _helper.createAndStartHaVHN(node2Attributes);
assertEquals("Unexpected role", NodeRole.REPLICA, node2.getRole());
_helper.awaitRemoteNodes(node2, 1);
BDBHARemoteReplicationNode<?> remote = _helper.findRemoteNode(node2, node1.getName());
final AtomicInteger permittedNodesChangeCounter = new AtomicInteger();
final CountDownLatch _permittedNodesLatch = new CountDownLatch(1);
node2.addChangeListener(new AbstractConfigurationChangeListener() {
@Override
public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue) {
if (attributeName.equals(BDBHAVirtualHostNode.PERMITTED_NODES)) {
permittedNodesChangeCounter.incrementAndGet();
_permittedNodesLatch.countDown();
}
}
});
List<String> permittedNodes = new ArrayList<>(node1.getPermittedNodes());
permittedNodes.add("localhost:5000");
node1.setAttributes(Collections.<String, Object>singletonMap(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes));
assertTrue("Permitted nodes were not changed on Replica", _permittedNodesLatch.await(10, TimeUnit.SECONDS));
assertEquals("Not the same permitted nodes", new HashSet<>(node1.getPermittedNodes()), new HashSet<>(node2.getPermittedNodes()));
assertEquals("Unexpected counter of changes permitted nodes", 1, permittedNodesChangeCounter.get());
// change the order of permitted nodes
Collections.swap(permittedNodes, 0, 2);
node1.setAttributes(Collections.<String, Object>singletonMap(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes));
// make sure that node2 onNodeState was invoked by performing transaction on master and making sure that it was replicated
performTransactionAndAwaitForRemoteNodeToGetAware(node1, remote);
// perform transaction second time because permitted nodes are changed after last transaction id
performTransactionAndAwaitForRemoteNodeToGetAware(node1, remote);
assertEquals("Unexpected counter of changes permitted nodes", 1, permittedNodesChangeCounter.get());
}
use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.
the class AbstractConfiguredObjectTest method testSuccessfulDeletion.
public void testSuccessfulDeletion() throws Exception {
TestConfiguredObject configuredObject = new TestConfiguredObject("configuredObject");
configuredObject.create();
final List<ChangeEvent> events = new ArrayList<>();
configuredObject.addChangeListener(new AbstractConfigurationChangeListener() {
@Override
public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue) {
events.add(new ChangeEvent(EventType.ATTRIBUTE_SET, object, attributeName, oldAttributeValue, newAttributeValue));
}
@Override
public void stateChanged(ConfiguredObject<?> object, State oldState, State newState) {
events.add(new ChangeEvent(EventType.STATE_CHANGED, object, ConfiguredObject.DESIRED_STATE, oldState, newState));
}
});
configuredObject.delete();
assertEquals(2, events.size());
assertEquals(State.DELETED, configuredObject.getDesiredState());
assertEquals(State.DELETED, configuredObject.getState());
assertEquals("Unexpected events number", 2, events.size());
ChangeEvent event0 = events.get(0);
ChangeEvent event1 = events.get(1);
assertEquals("Unexpected first event: " + event0, new ChangeEvent(EventType.STATE_CHANGED, configuredObject, Exchange.DESIRED_STATE, State.ACTIVE, State.DELETED), event0);
assertEquals("Unexpected second event: " + event1, new ChangeEvent(EventType.ATTRIBUTE_SET, configuredObject, Exchange.DESIRED_STATE, State.ACTIVE, State.DELETED), event1);
}
use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.
the class AbstractConfiguredObjectTest method testSetAttributesFiresListener.
public void testSetAttributesFiresListener() {
final String objectName = "listenerFiring";
Map<String, Object> attributes = new HashMap<>();
attributes.put(ConfiguredObject.NAME, objectName);
attributes.put(TestSingleton.STRING_VALUE, "first");
final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes, null);
final AtomicInteger listenerCount = new AtomicInteger();
final LinkedHashMap<String, String> updates = new LinkedHashMap<>();
object.addChangeListener(new AbstractConfigurationChangeListener() {
@Override
public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
listenerCount.incrementAndGet();
String delta = String.valueOf(oldAttributeValue) + "=>" + String.valueOf(newAttributeValue);
updates.put(attributeName, delta);
}
});
// Set updated value (should cause listener to fire)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "second"));
assertEquals(1, listenerCount.get());
String delta = updates.remove(TestSingleton.STRING_VALUE);
assertEquals("first=>second", delta);
// Set unchanged value (should not cause listener to fire)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "second"));
assertEquals(1, listenerCount.get());
// Set value to null (should cause listener to fire)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, null));
assertEquals(2, listenerCount.get());
delta = updates.remove(TestSingleton.STRING_VALUE);
assertEquals("second=>null", delta);
// Set to null again (should not cause listener to fire)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, null));
assertEquals(2, listenerCount.get());
// Set updated value (should cause listener to fire)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "third"));
assertEquals(3, listenerCount.get());
delta = updates.remove(TestSingleton.STRING_VALUE);
assertEquals("null=>third", delta);
}
use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.
the class AbstractConfiguredObjectTest method testSetAttributesInterpolateValues.
public void testSetAttributesInterpolateValues() {
setTestSystemProperty("foo1", "myValue1");
setTestSystemProperty("foo2", "myValue2");
setTestSystemProperty("foo3", null);
Map<String, Object> attributes = new HashMap<>();
attributes.put(ConfiguredObject.NAME, getTestName());
attributes.put(TestSingleton.STRING_VALUE, "${foo1}");
final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes, null);
final AtomicInteger listenerCount = new AtomicInteger();
object.addChangeListener(new AbstractConfigurationChangeListener() {
@Override
public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
listenerCount.incrementAndGet();
}
});
assertEquals("myValue1", object.getStringValue());
assertEquals("${foo1}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
// Update the actual value ${foo1} => ${foo2}
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
assertEquals(1, listenerCount.get());
assertEquals("myValue2", object.getStringValue());
assertEquals("${foo2}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
// No change
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
assertEquals(1, listenerCount.get());
// Update the actual value ${foo2} => ${foo3} (which doesn't have a value)
object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo3}"));
assertEquals(2, listenerCount.get());
assertEquals("${foo3}", object.getStringValue());
assertEquals("${foo3}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
}
Aggregations