From 27d0b2eef38c2f14dd190f8be266e798b4b95b82 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Wed, 27 Aug 2014 12:55:50 +0000 Subject: QPID-6048: Move permitted nodes attribute into BDB HA VH in order to be able to identify the intruder node on node start-up git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1620882 13f79535-47bb-0310-9956-ffa450edef68 --- .../replication/ReplicatedEnvironmentFacade.java | 60 +++++------ .../replication/ReplicationGroupListener.java | 2 +- .../virtualhost/berkeleydb/BDBHAVirtualHost.java | 4 - .../berkeleydb/BDBHAVirtualHostImpl.java | 47 --------- .../berkeleydb/BDBHAVirtualHostNode.java | 7 ++ .../berkeleydb/BDBHAVirtualHostNodeImpl.java | 106 +++++++++++++++++-- .../js/qpid/management/virtualhost/bdb_ha/edit.js | 116 +------------------- .../js/qpid/management/virtualhost/bdb_ha/show.js | 12 +-- .../virtualhostnode/bdb_ha/add/newgroup/add.js | 4 +- .../qpid/management/virtualhostnode/bdb_ha/edit.js | 117 ++++++++++++++++++++- .../qpid/management/virtualhostnode/bdb_ha/show.js | 14 ++- .../java/resources/virtualhost/bdb_ha/edit.html | 39 ------- .../java/resources/virtualhost/bdb_ha/show.html | 4 - .../virtualhostnode/bdb_ha/add/newgroup/add.html | 6 +- .../resources/virtualhostnode/bdb_ha/edit.html | 41 ++++++++ .../resources/virtualhostnode/bdb_ha/show.html | 5 + .../store/berkeleydb/BDBHAVirtualHostNodeTest.java | 4 +- .../ReplicatedEnvironmentFacadeTest.java | 43 +------- ...BDBHAVirtualHostNodeOperationalLoggingTest.java | 1 + .../berkeleydb/BDBHAVirtualHostNodeTestHelper.java | 28 +++-- 20 files changed, 337 insertions(+), 323 deletions(-) (limited to 'qpid/java/bdbstore/src') diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java index 4f47e0fa53..fa916a1316 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java @@ -1220,7 +1220,7 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan } } - public static void connectToHelperNodeAndCheckPermittedHosts(String nodeName, String hostPort, String groupName, String helperNodeName, String helperHostPort) + public static Collection connectToHelperNodeAndCheckPermittedHosts(String nodeName, String hostPort, String groupName, String helperNodeName, String helperHostPort) { if (LOGGER.isDebugEnabled()) { @@ -1264,26 +1264,8 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan { throw new IllegalConfigurationException(String.format("Node from '%s' is not permitted!", hostPort)); } - } - private void findMasterNodeStateAndApplyPermittedNodes(Collection nodeStates) - { - if (ReplicatedEnvironment.State.MASTER != _environment.getState()) - { - for (NodeState nodeState : nodeStates) - { - if (nodeState.getNodeState() == ReplicatedEnvironment.State.MASTER) - { - byte[] applicationState = nodeState.getAppState(); - Set permittedNodes = convertApplicationStateBytesToPermittedNodeList(applicationState); - if (!_permittedNodes.equals(permittedNodes)) - { - setPermittedNodes(permittedNodes); - } - break; - } - } - } + return permittedNodes; } private void registerAppStateMonitorIfPermittedNodesSpecified() @@ -1312,16 +1294,17 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan } - private void onIntruder(ReplicationGroupListener replicationGroupListener, ReplicationNode replicationNode) + private boolean onIntruder(ReplicationGroupListener replicationGroupListener, ReplicationNode replicationNode) { if (replicationGroupListener != null) { - replicationGroupListener.onIntruderNode(replicationNode); + return replicationGroupListener.onIntruderNode(replicationNode); } else { LOGGER.warn(String.format("Found an intruder node '%s' from ''%s' . The node is not listed in permitted list: %s", replicationNode.getName(), getHostPort(replicationNode), String.valueOf(_permittedNodes))); + return true; } } @@ -1373,46 +1356,55 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan @Override public Void call() { + boolean continueMonitoring = true; try { if (_state.get() == State.OPEN) { try { - detectGroupChangesAndNotify(); + continueMonitoring = detectGroupChangesAndNotify(); } catch(DatabaseException e) { handleDatabaseException("Exception on replication group check", e); } - Map nodeStates = discoverNodeStates(_remoteReplicationNodes.values()); - - executeDatabasePingerOnNodeChangesIfMaster(nodeStates); + if (continueMonitoring) + { + Map nodeStates = discoverNodeStates(_remoteReplicationNodes.values()); - notifyGroupListenerAboutNodeStates(nodeStates); + executeDatabasePingerOnNodeChangesIfMaster(nodeStates); - findMasterNodeStateAndApplyPermittedNodes(nodeStates.values()); + notifyGroupListenerAboutNodeStates(nodeStates); + } } } finally { State state = _state.get(); - if (state != State.CLOSED && state != State.CLOSING) + if (state != State.CLOSED && state != State.CLOSING && continueMonitoring) { _groupChangeExecutor.schedule(this, REMOTE_NODE_MONITOR_INTERVAL, TimeUnit.MILLISECONDS); } + else + { + if (LOGGER.isDebugEnabled()) + { + LOGGER.debug("Monitoring task is not scheduled: state " + state + ", continue monitoring flag " + continueMonitoring); + } + } } return null; } - private void detectGroupChangesAndNotify() + private boolean detectGroupChangesAndNotify() { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Checking for changes in the group " + _configuration.getGroupName() + " on node " + _configuration.getName()); } - + boolean shouldContinue = true; String groupName = _configuration.getGroupName(); ReplicatedEnvironment env = _environment; ReplicationGroupListener replicationGroupListener = _replicationGroupListener.get(); @@ -1446,7 +1438,10 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan } else { - onIntruder(replicationGroupListener, replicationNode); + if (!onIntruder(replicationGroupListener, replicationNode)) + { + shouldContinue = false; + } } } else @@ -1473,6 +1468,7 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan } } } + return shouldContinue; } private Map discoverNodeStates(Collection electableNodes) diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicationGroupListener.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicationGroupListener.java index 7367f5cda7..cf6050c3cd 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicationGroupListener.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicationGroupListener.java @@ -51,7 +51,7 @@ public interface ReplicationGroupListener /** * Invoked on intruder node detected */ - void onIntruderNode(ReplicationNode node); + boolean onIntruderNode(ReplicationNode node); void onNoMajority(); diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHost.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHost.java index e2503a8b51..04ac1cf49d 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHost.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHost.java @@ -36,7 +36,6 @@ public interface BDBHAVirtualHost> extends Virtual String COALESCING_SYNC = "coalescingSync"; String DURABILITY = "durability"; String STORE_PATH = "storePath"; - String PERMITTED_NODES = "permittedNodes"; @ManagedAttribute( defaultValue = "SYNC") String getLocalTransactionSynchronizationPolicy(); @@ -55,7 +54,4 @@ public interface BDBHAVirtualHost> extends Virtual @ManagedAttribute(mandatory = true, defaultValue = "0") Long getStoreOverfullSize(); - - @ManagedAttribute(mandatory = true) - List getPermittedNodes(); } diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHostImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHostImpl.java index a005bca194..21cee14fa7 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHostImpl.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAVirtualHostImpl.java @@ -20,7 +20,6 @@ */ package org.apache.qpid.server.virtualhost.berkeleydb; -import java.util.List; import java.util.Map; import java.util.Set; @@ -55,9 +54,6 @@ public class BDBHAVirtualHostImpl extends AbstractVirtualHost _permittedNodes; - @ManagedObjectFactoryConstructor public BDBHAVirtualHostImpl(final Map attributes, VirtualHostNode virtualHostNode) { @@ -132,34 +128,6 @@ public class BDBHAVirtualHostImpl extends AbstractVirtualHost)proxyForValidation).getPermittedNodes()); - } - } - - private void validatePermittedNodes(List permittedNodes) - { - if (permittedNodes == null || permittedNodes.isEmpty()) - { - throw new IllegalArgumentException(String.format("Attribute '%s' is mandatory and must be set", PERMITTED_NODES)); - } - for (String permittedNode: permittedNodes) - { - String[] tokens = permittedNode.split(":"); - if (tokens.length != 2) - { - throw new IllegalArgumentException(String.format("Invalid permitted node specified '%s'. ", permittedNode)); - } - try - { - Integer.parseInt(tokens[1]); - } - catch(Exception e) - { - throw new IllegalArgumentException(String.format("Invalid port is specified in permitted node '%s'. ", permittedNode)); - } - } } private void validateTransactionSynchronizationPolicy(String policy) @@ -191,28 +159,13 @@ public class BDBHAVirtualHostImpl extends AbstractVirtualHost getPermittedNodes() - { - return _permittedNodes; - } - @Override public void onValidate() { super.onValidate(); - validatePermittedNodes(this.getPermittedNodes()); validateTransactionSynchronizationPolicy(this.getLocalTransactionSynchronizationPolicy()); validateTransactionSynchronizationPolicy(this.getRemoteTransactionSynchronizationPolicy()); } - protected void applyPermittedNodes() - { - ReplicatedEnvironmentFacade facade = getReplicatedEnvironmentFacade(); - if (facade != null) - { - facade.setPermittedNodes(getPermittedNodes()); - } - } } diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java index b76e4d8d5c..252b00d44f 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java @@ -20,10 +20,13 @@ */ package org.apache.qpid.server.virtualhostnode.berkeleydb; +import java.util.List; + import org.apache.qpid.server.model.DerivedAttribute; import org.apache.qpid.server.model.ManagedAttribute; import org.apache.qpid.server.store.berkeleydb.HASettings; + public interface BDBHAVirtualHostNode> extends BDBVirtualHostNode, HASettings { public static final String GROUP_NAME = "groupName"; @@ -37,6 +40,7 @@ public interface BDBHAVirtualHostNode> extends public static final String LAST_KNOWN_REPLICATION_TRANSACTION_ID = "lastKnownReplicationTransactionId"; public static final String JOIN_TIME = "joinTime"; public static final String HELPER_NODE_NAME = "helperNodeName"; + public static final String PERMITTED_NODES = "permittedNodes"; @ManagedAttribute(mandatory=true) String getGroupName(); @@ -67,4 +71,7 @@ public interface BDBHAVirtualHostNode> extends @ManagedAttribute(persist = false) String getHelperNodeName(); + + @ManagedAttribute(persist = true) + List getPermittedNodes(); } diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java index 06e97afd98..45b865a7a5 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java @@ -23,10 +23,12 @@ package org.apache.qpid.server.virtualhostnode.berkeleydb; import java.net.InetSocketAddress; import java.security.PrivilegedAction; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -126,6 +128,9 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode _permittedNodes; + @ManagedObjectFactoryConstructor public BDBHAVirtualHostNodeImpl(Map attributes, Broker broker) { @@ -136,6 +141,8 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode proxyForValidation, final Set changedAttributes) { super.validateChange(proxyForValidation, changedAttributes); + BDBHAVirtualHostNode proposed = (BDBHAVirtualHostNode)proxyForValidation; + if (changedAttributes.contains(ROLE)) { String currentRole = getRole(); @@ -143,12 +150,17 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode proposed = (BDBHAVirtualHostNode)proxyForValidation; + if (!ReplicatedEnvironment.State.MASTER.name().equals(proposed.getRole())) { throw new IllegalArgumentException("Changing role to other value then " + ReplicatedEnvironment.State.MASTER.name() + " is unsupported"); } } + + if (changedAttributes.contains(PERMITTED_NODES)) + { + validatePermittedNodes(proposed.getPermittedNodes()); + } } @Override @@ -227,6 +239,12 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode getPermittedNodes() + { + return _permittedNodes; + } + @SuppressWarnings("rawtypes") @Override public Collection getRemoteReplicationNodes() @@ -268,7 +286,8 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode permittedNodes = ReplicatedEnvironmentFacade.connectToHelperNodeAndCheckPermittedHosts(getName(), getAddress(), getGroupName(), getHelperNodeName(), getHelperAddress()); + setAttribute(PERMITTED_NODES, null, new ArrayList(permittedNodes)); } catch(IllegalConfigurationException e) { @@ -314,6 +333,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode permittedNodes) + { + if (permittedNodes == null || permittedNodes.isEmpty()) + { + throw new IllegalArgumentException(String.format("Attribute '%s' is mandatory and must be set", PERMITTED_NODES)); + } + for (String permittedNode: permittedNodes) + { + String[] tokens = permittedNode.split(":"); + if (tokens.length != 2) + { + throw new IllegalArgumentException(String.format("Invalid permitted node specified '%s'. ", permittedNode)); + } + try + { + Integer.parseInt(tokens[1]); + } + catch(Exception e) + { + throw new IllegalArgumentException(String.format("Invalid port is specified in permitted node '%s'. ", permittedNode)); + } + } + + } + private class RemoteNodesDiscoverer implements ReplicationGroupListener { @Override @@ -827,6 +889,23 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode permittedNodes = ReplicatedEnvironmentFacade.convertApplicationStateBytesToPermittedNodeList(applicationState); + if (!_permittedNodes.equals(permittedNodes)) + { + if (_permittedNodes.contains(remoteNode.getAddress())) + { + setAttribute(PERMITTED_NODES, _permittedNodes, new ArrayList(permittedNodes)); + } + else + { + LOGGER.warn("Cannot change permitted nodes from Master as existing master node '" + remoteNode.getName() + + "' (" + remoteNode.getAddress() + ") is not in list of trusted nodes " + _permittedNodes); + } + } + } } String newRole = remoteNode.getRole(); @@ -838,20 +917,20 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode() + return Subject.doAs(SecurityManager.getSystemTaskSubject(_virtualHostNodePrincipalName), new PrivilegedAction() { @Override - public Void run() + public Boolean run() { - processIntruderNode(node); - return null; + return processIntruderNode(node); + } }); } - private void processIntruderNode(ReplicationNode node) + private boolean processIntruderNode(ReplicationNode node) { String hostAndPort = node.getHostName() + ":" + node.getPort(); getEventLogger().message(getGroupLogSubject(), HighAvailabilityMessages.INTRUDER_DETECTED(node.getName(), hostAndPort)); @@ -864,11 +943,12 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode() { @@ -876,13 +956,16 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode 0; - this.permittedNodeRemoveButton.set("disabled", !hasSelection); - }, - _changePermittedNode: function(value) - { - var fieldIsEmpty = (this.permittedNode.get("value") == ""); - this.permittedNodeAddButton.set("disabled", fieldIsEmpty); - return true; - }, - _updatePermittedNodes: function() - { - var values = []; - var children = this.permittedNodesList.containerNode.children; - for (var i = 0; i < children.length; i++) - { - var child = children.item(i); - values.push(children.item(i).value); - } - this.permittedNodes.set("value", values); } }; } diff --git a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/show.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/show.js index f211d19d16..3bc3305e1f 100644 --- a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/show.js +++ b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/show.js @@ -28,7 +28,7 @@ define(["qpid/common/util", "dojo/query", "dojo/domReady!"], function BDB(data) { util.buildUI(data.containerNode, data.parent, "virtualhost/bdb_ha/show.html", fields, this); - this["permittedNodes"]= query(".permittedNodes", data.containerNode)[0]; + this[localTransactionSynchronizationPolicy]= query("." + localTransactionSynchronizationPolicy, data.containerNode)[0]; this[remoteTransactionSynchronizationPolicy]= query("."+ remoteTransactionSynchronizationPolicy, data.containerNode)[0]; } @@ -37,16 +37,6 @@ define(["qpid/common/util", "dojo/query", "dojo/domReady!"], { util.updateUI(data, fields, this); - var permittedNodesMarkup = ""; - if (data.permittedNodes) - { - for(var i=0;i"; - } - } - this["permittedNodes"].innerHTML = permittedNodesMarkup ; - var localSyncPolicy = data[localTransactionSynchronizationPolicy] ? data[localTransactionSynchronizationPolicy].toLowerCase() : ""; var remoteSyncPolicy = data[remoteTransactionSynchronizationPolicy] ? data[remoteTransactionSynchronizationPolicy].toLowerCase() : ""; diff --git a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/add/newgroup/add.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/add/newgroup/add.js index 30f47417aa..18853e63a7 100644 --- a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/add/newgroup/add.js +++ b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/add/newgroup/add.js @@ -67,7 +67,7 @@ define(["dojo/_base/xhr", this.addVirtualHostNodePermittedNodeRemoveButton.on("click", function(e){that._clickRemovePermittedNodeButton(e);}); // This will contain the serialised form that will go to the server - this.addVirtualHostNodeVirtualhostBlueprint = registry.byId("addVirtualHostNode.virtualhostBlueprint"); + this.addVirtualHostNodePermittedNodes = registry.byId("addVirtualHostNode.permittedNodes"); registry.byId("addVirtualHostNode.groupName").set("regExpGen", util.nameOrContextVarRegexp); }, @@ -90,7 +90,7 @@ define(["dojo/_base/xhr", } } - this.addVirtualHostNodeVirtualhostBlueprint.set("value",json.stringify({"permittedNodes" : permittedNodes})); + this.addVirtualHostNodePermittedNodes.set("value", permittedNodes); }, _changePermittedNodeList: function(value) { diff --git a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/edit.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/edit.js index f2f256cd89..99b9209d8a 100644 --- a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/edit.js +++ b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/edit.js @@ -22,8 +22,9 @@ define(["qpid/common/util", "dijit/registry", "dojo/store/Memory", "dojo/data/ObjectStore", + "dojo/_base/window", "dojo/domReady!"], - function (util, registry, Memory, ObjectStore) + function (util, registry, Memory, ObjectStore, win) { var fields = [ "storePath", "name", "groupName", "address", "designatedPrimary", "priority", "quorumOverride"]; @@ -58,6 +59,120 @@ define(["qpid/common/util", } var store = new Memory({data :overrideData, idProperty: "id" }); registry.byId("editVirtualHostNode.quorumOverride").set("store", new ObjectStore({objectStore: store})); + + var that = this; + this.permittedNodes = registry.byId("editVirtualHostNode.permittedNodes"); + this.permittedNodesList = registry.byId("editVirtualHostNode.permittedNodesList"); + this.permittedNodesList.on("change", function(value){that._changePermittedNodeList(value);}); + + // permitted node text field + this.permittedNode = registry.byId("editVirtualHostNode.permittedNode"); + this.permittedNode.on("change", function(value){that._changePermittedNode(value);}); + + // add and remove buttons & click handlers + this.permittedNodeAddButton = registry.byId("editVirtualHostNode.permittedNodeAdd"); + this.permittedNodeAddButton.set("disabled", true); + this.permittedNodeRemoveButton = registry.byId("editVirtualHostNode.permittedNodeRemove"); + this.permittedNodeRemoveButton.set("disabled", true); + this.permittedNodeAddButton.on("click", function(e){that._clickAddPermittedNodeButton(e);}); + this.permittedNodeRemoveButton.on("click", function(e){that._clickRemovePermittedNodeButton(e);}); + + var permittedNodes = data.data.permittedNodes; + for(var i=0; i 0; + this.permittedNodeRemoveButton.set("disabled", !hasSelection); + }, + _changePermittedNode: function(value) + { + var fieldIsEmpty = (this.permittedNode.get("value") == ""); + this.permittedNodeAddButton.set("disabled", fieldIsEmpty); + return true; + }, + _updatePermittedNodes: function() + { + var values = []; + var children = this.permittedNodesList.containerNode.children; + for (var i = 0; i < children.length; i++) + { + var child = children.item(i); + values.push(children.item(i).value); + } + this.permittedNodes.set("value", values); } }; } diff --git a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js index d914e16dc9..4997b16bc6 100644 --- a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js +++ b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js @@ -90,7 +90,7 @@ define(["dojo/_base/xhr", this.designatedPrimaryContainer = findNode("designatedPrimaryContainer", containerNode); this.priorityContainer = findNode("priorityContainer", containerNode); this.quorumOverrideContainer = findNode("quorumOverrideContainer", containerNode); - + this.permittedNodes = query(".permittedNodes", containerNode)[0]; this.membersGridPanel = registry.byNode(query(".membersGridPanel", containerNode)[0]); this.membersGrid = new UpdatableStore([], findNode("groupMembers", containerNode), @@ -158,6 +158,18 @@ define(["dojo/_base/xhr", BDBHA.prototype.update=function(data) { this.parent.editNodeButton.set("disabled", false); + + + var permittedNodesMarkup = ""; + if (data.permittedNodes) + { + for(var i=0;i"; + } + } + this.permittedNodes.innerHTML = permittedNodesMarkup ; + this.data = data; for(var i = 0; i < nodeFields.length; i++) { diff --git a/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/edit.html b/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/edit.html index 9d0b0ab860..f4bf0c3c03 100644 --- a/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/edit.html +++ b/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/edit.html @@ -45,45 +45,6 @@ -
-
- Permitted group nodes -
-
Permitted addresses*:
-
- - -
- -
- -
-
-
Address:
-
- -
- -
-
-
diff --git a/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/show.html b/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/show.html index 0c419aabae..d96942cd2d 100644 --- a/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/show.html +++ b/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/show.html @@ -26,10 +26,6 @@
Store underfull size:
bytes
-
-
Permitted nodes:
-
-

diff --git a/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/add/newgroup/add.html b/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/add/newgroup/add.html index c25bae3419..7f7fb53ed8 100644 --- a/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/add/newgroup/add.html +++ b/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/add/newgroup/add.html @@ -91,10 +91,10 @@ - + data-dojo-props="name: 'permittedNodes'" + /> + +
+
+ Permitted group nodes +
+
Permitted addresses*:
+
+ + +
+ +
+ +
+
+
Address:
+
+ +
+ +
+
+
+
Allow this node to operate solo:
diff --git a/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/show.html b/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/show.html index 5a60b75c5c..690440cf7b 100644 --- a/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/show.html +++ b/qpid/java/bdbstore/src/main/java/resources/virtualhostnode/bdb_ha/show.html @@ -35,6 +35,10 @@
Address:
N/A
+
+
Permitted nodes:
+
+
Allow this node to operate solo:
N/A
@@ -49,6 +53,7 @@ N/A
+
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java index e69000ecd1..7b03539625 100644 --- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java +++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java @@ -401,11 +401,9 @@ public class BDBHAVirtualHostNodeTest extends QpidTestCase }; node1.addChangeListener(listener); - BDBHAVirtualHost host = (BDBHAVirtualHost)node1.getVirtualHost(); - List permittedNodes = new ArrayList(); permittedNodes.add(helperAddress); - host.setAttributes(Collections.singletonMap(BDBHAVirtualHost.PERMITTED_NODES, permittedNodes)); + node1.setAttributes(Collections.singletonMap(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes)); assertTrue("Intruder protection was not triggered during expected timeout", stopLatch.await(10, TimeUnit.SECONDS)); diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java index 5ed533f1e5..fcc8842619 100644 --- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java +++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java @@ -32,7 +32,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import org.apache.log4j.Logger; -import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade; import org.apache.qpid.test.utils.QpidTestCase; import org.apache.qpid.test.utils.TestFileUtils; @@ -694,9 +693,10 @@ public class ReplicatedEnvironmentFacadeTest extends QpidTestCase ReplicationGroupListener listener = new NoopReplicationGroupListener() { @Override - public void onIntruderNode(ReplicationNode node) + public boolean onIntruderNode(ReplicationNode node) { intruderLatch.countDown(); + return true; } }; ReplicatedEnvironmentFacade firstNode = createMaster(listener); @@ -713,42 +713,6 @@ public class ReplicatedEnvironmentFacadeTest extends QpidTestCase assertTrue("Intruder node was not detected", intruderLatch.await(10, TimeUnit.SECONDS)); } - public void testIntruderNodeDetectionOnMasterAndReplicaNodes() throws Exception - { - final CountDownLatch intruderLatch = new CountDownLatch(2); - ReplicationGroupListener listener = new NoopReplicationGroupListener() - { - @Override - public void onIntruderNode(ReplicationNode node) - { - intruderLatch.countDown(); - } - }; - - ReplicatedEnvironmentFacade firstNode = createMaster(listener); - int replica1Port = getNextAvailable(TEST_NODE_PORT + 1); - String node2NodeHostPort = "localhost:" + replica1Port; - String nodeName2 = TEST_NODE_NAME + "_1"; - ReplicatedEnvironmentFacade secondNode = createReplica(nodeName2, node2NodeHostPort, listener); - - Set permittedNodes = new HashSet(); - permittedNodes.add("localhost:" + TEST_NODE_PORT); - permittedNodes.add(nodeName2); - firstNode.setPermittedNodes(permittedNodes); - - int counter = 0; - while(secondNode.getPermittedNodes().isEmpty() && counter < 100) - { - counter++; - Thread.sleep(50); - } - assertEquals("Permitted nodes are not set on a replica", permittedNodes, secondNode.getPermittedNodes()); - - int intruderPort = getNextAvailable(replica1Port+ 1); - createIntruder("intruder", "localhost:" + intruderPort); - assertTrue("Intruder node was not detected", intruderLatch.await(10, TimeUnit.SECONDS)); - } - private void createIntruder(String nodeName, String node1NodeHostPort) { File environmentPathFile = new File(_storePath, nodeName); @@ -872,9 +836,10 @@ public class ReplicatedEnvironmentFacadeTest extends QpidTestCase } @Override - public void onIntruderNode(ReplicationNode node) + public boolean onIntruderNode(ReplicationNode node) { LOGGER.warn("Intruder node " + node); + return true; } @Override diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java index ea7d74090d..1937eefc0b 100644 --- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java +++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeOperationalLoggingTest.java @@ -300,6 +300,7 @@ public class BDBHAVirtualHostNodeOperationalLoggingTest extends QpidTestCase reset(_eventLogger); + node2Attributes.put(BDBHAVirtualHostNode.PERMITTED_NODES, node1Attributes.get(BDBHAVirtualHostNode.PERMITTED_NODES)); node2 = (BDBHAVirtualHostNodeImpl)_helper.recoverHaVHN(node2.getId(), node2Attributes); _helper.assertNodeRole(node2, "REPLICA", "MASTER"); waitForNodeDetachedField(remoteNode, false); diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeTestHelper.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeTestHelper.java index 41c6c9a71c..6f18878a1d 100644 --- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeTestHelper.java +++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeTestHelper.java @@ -54,7 +54,6 @@ import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.store.ConfiguredObjectRecordImpl; import org.apache.qpid.server.store.UnresolvedConfiguredObject; import org.apache.qpid.server.util.BrokerTestHelper; -import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHost; import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHostImpl; import org.apache.qpid.server.virtualhostnode.AbstractVirtualHostNode; import org.apache.qpid.test.utils.QpidTestCase; @@ -240,7 +239,8 @@ public class BDBHAVirtualHostNodeTestHelper iterationCounter++; } while(!inRole && iterationCounter<100); - assertTrue("Node " + node.getName() + " did not transit into role " + Arrays.toString(roleName), inRole); + assertTrue("Node " + node.getName() + " did not transit into role " + Arrays.toString(roleName) + + " Node role is " + node.getRole(), inRole); } public BDBHAVirtualHostNode createAndStartHaVHN(Map attributes) throws InterruptedException @@ -280,6 +280,10 @@ public class BDBHAVirtualHostNodeTestHelper node1Attributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, helperAddress); node1Attributes.put(BDBHAVirtualHostNode.STORE_PATH, getMessageStorePath() + File.separator + nodeName); node1Attributes.put(BDBHAVirtualHostNode.HELPER_NODE_NAME, helperNodeNode); + if (address.equals(helperAddress)) + { + node1Attributes.put(BDBHAVirtualHostNode.PERMITTED_NODES, getPermittedNodes(ports)); + } Map context = new HashMap(); context.put(ReplicationConfig.REPLICA_ACK_TIMEOUT, "2 s"); @@ -287,7 +291,7 @@ public class BDBHAVirtualHostNodeTestHelper if (ports != null) { - String bluePrint = getBlueprint(ports); + String bluePrint = getBlueprint(); node1Attributes.put(AbstractVirtualHostNode.VIRTUALHOST_INITIAL_CONFIGURATION, bluePrint); } @@ -296,16 +300,10 @@ public class BDBHAVirtualHostNodeTestHelper return node1Attributes; } - public static String getBlueprint(int... ports) throws Exception + public static String getBlueprint() throws Exception { - List permittedNodes = new ArrayList(); - for (int port:ports) - { - permittedNodes.add("localhost:" + port); - } Map bluePrint = new HashMap<>(); bluePrint.put(VirtualHost.TYPE, BDBHAVirtualHostImpl.VIRTUAL_HOST_TYPE); - bluePrint.put(BDBHAVirtualHost.PERMITTED_NODES, permittedNodes); StringWriter writer = new StringWriter(); ObjectMapper mapper = new ObjectMapper(); @@ -314,6 +312,16 @@ public class BDBHAVirtualHostNodeTestHelper return writer.toString(); } + public static List getPermittedNodes(int[] ports) + { + List permittedNodes = new ArrayList(); + for (int port:ports) + { + permittedNodes.add("localhost:" + port); + } + return permittedNodes; + } + public void awaitForVirtualhost(final VirtualHostNode node, final int wait) { long endTime = System.currentTimeMillis() + wait; -- cgit v1.2.1