You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2013/12/23 17:45:49 UTC
svn commit: r1553147 - in /qpid/branches/java-broker-bdb-ha/qpid/java:
bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/
bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/
broker-core/src/main/java/org/ap...
Author: orudyy
Date: Mon Dec 23 16:45:49 2013
New Revision: 1553147
URL: http://svn.apache.org/r1553147
Log:
QPID-5412: Implement REST interface for replication nodes
Added:
qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/VirtualHostRestTest.java
Modified:
qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/LocalReplicationNode.java
qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
qpid/branches/java-broker-bdb-ha/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
Modified: qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/LocalReplicationNode.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/LocalReplicationNode.java?rev=1553147&r1=1553146&r2=1553147&view=diff
==============================================================================
--- qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/LocalReplicationNode.java (original)
+++ qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/LocalReplicationNode.java Mon Dec 23 16:45:49 2013
@@ -29,7 +29,6 @@ import java.util.UUID;
import org.apache.qpid.server.configuration.IllegalConfigurationException;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
-import org.apache.qpid.server.model.ConfigurationChangeListener;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.LifetimePolicy;
import org.apache.qpid.server.model.ReplicationNode;
@@ -37,6 +36,7 @@ import org.apache.qpid.server.model.Stat
import org.apache.qpid.server.model.Statistics;
import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.model.adapter.AbstractAdapter;
+import org.apache.qpid.server.model.adapter.NoStatistics;
import org.apache.qpid.server.util.MapValueConverter;
import org.apache.qpid.server.util.ParameterizedTypeImpl;
@@ -127,25 +127,15 @@ public class LocalReplicationNode extend
@Override
public State getDesiredState()
{
- throw new UnsupportedOperationException();
+ // TODO
+ return getActualState();
}
@Override
public State getActualState()
{
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void addChangeListener(ConfigurationChangeListener listener)
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean removeChangeListener(ConfigurationChangeListener listener)
- {
- throw new UnsupportedOperationException();
+ // TODO
+ return null;
}
@Override
@@ -210,6 +200,14 @@ public class LocalReplicationNode extend
{
return isDurable();
}
+ else if(STATE.equals(attributeName))
+ {
+ return getActualState();
+ }
+ else if(TIME_TO_LIVE.equals(attributeName))
+ {
+ return getLifetimePolicy();
+ }
return super.getAttribute(attributeName);
}
@@ -224,7 +222,7 @@ public class LocalReplicationNode extend
@Override
public Statistics getStatistics()
{
- throw new UnsupportedOperationException();
+ return NoStatistics.getInstance();
}
@Override
Added: qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/VirtualHostRestTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/VirtualHostRestTest.java?rev=1553147&view=auto
==============================================================================
--- qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/VirtualHostRestTest.java (added)
+++ qpid/branches/java-broker-bdb-ha/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/VirtualHostRestTest.java Mon Dec 23 16:45:49 2013
@@ -0,0 +1,110 @@
+/*
+ *
+ * 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.qpid.server.store.berkeleydb;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.server.model.ReplicationNode;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.systest.rest.Asserts;
+import org.apache.qpid.systest.rest.QpidRestTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class VirtualHostRestTest extends QpidRestTestCase
+{
+
+ private static final String VIRTUALHOST_NODES_ATTRIBUTE = "replicationnodes";
+
+ public void testPutCreateHAVirtualHost() throws Exception
+ {
+ Map<String, Object> hostData = new HashMap<String, Object>();
+ String hostName = getTestName();
+ hostData.put(VirtualHost.NAME, hostName);
+ hostData.put(VirtualHost.TYPE, BDBHAVirtualHostFactory.TYPE);
+ hostData.put(VirtualHost.STATE, State.QUIESCED);
+
+ int responseCode = getRestTestHelper().submitRequest("/rest/virtualhost/" + hostName, "PUT", hostData);
+ assertEquals("Unexpected response code for virtual host creation request", 201, responseCode);
+
+ String storeLocation = new File(TMP_FOLDER, "store-" + hostName + "-" + System.currentTimeMillis()).getAbsolutePath();
+ String nodeName = "node1";
+ String groupName = "replication-group";
+ int port = findFreePort();
+ String hostPort = "localhost:" + port;
+
+ Map<String, Object> nodeData = new HashMap<String, Object>();
+ nodeData.put(ReplicationNode.NAME, nodeName);
+ nodeData.put(ReplicationNode.GROUP_NAME, groupName);
+ nodeData.put(ReplicationNode.HOST_PORT, hostPort);
+ nodeData.put(ReplicationNode.HELPER_HOST_PORT, hostPort);
+ nodeData.put(ReplicationNode.STORE_PATH, storeLocation);
+
+ String createNodeUrl = "/rest/replicationnode/" + hostName + "/" + nodeName;
+ responseCode = getRestTestHelper().submitRequest(createNodeUrl, "PUT", nodeData);
+ assertEquals("Unexpected response code for node creation request", 201, responseCode);
+
+ hostData.clear();
+ hostData.put(VirtualHost.STATE, State.ACTIVE);
+ responseCode = getRestTestHelper().submitRequest("/rest/virtualhost/" + hostName, "PUT", hostData);
+ assertEquals("Unexpected response code for virtual host update status", 200, responseCode);
+
+ try
+ {
+ // make sure that the host is saved in the broker store
+ restartBroker();
+
+ Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList("/rest/virtualhost/" + hostName);
+ Asserts.assertVirtualHost(hostName, hostDetails);
+ assertEquals("Unexpected virtual host type", BDBHAVirtualHostFactory.TYPE.toString(), hostDetails.get(VirtualHost.TYPE));
+
+ @SuppressWarnings("unchecked")
+ List<Map<String, Object>> nodes = (List<Map<String, Object>>) hostDetails.get(VIRTUALHOST_NODES_ATTRIBUTE);
+ assertEquals("Unexpected number of nodes", 1, nodes.size());
+ assertLocalNode(nodeData, nodes.get(0));
+
+ // verify that that node rest interface returns the same node attributes
+ Map<String, Object> replicationNodeDetails = getRestTestHelper().getJsonAsSingletonList("/rest/replicationnode/" + hostName + "/" + nodeName);
+ assertLocalNode(nodeData, replicationNodeDetails);
+ }
+ finally
+ {
+ if (storeLocation != null)
+ {
+ FileUtils.delete(new File(storeLocation), true);
+ }
+ }
+ }
+
+ private void assertLocalNode(Map<String, Object> expectedNodeAttributes, Map<String, Object> actualNodesAttributes)
+ {
+ for (Map.Entry<String, Object> entry : actualNodesAttributes.entrySet())
+ {
+ String name = entry.getKey();
+ Object value = entry.getValue();
+ assertEquals("Unexpected node attribute " + name + " value ", value, actualNodesAttributes.get(name));
+ }
+ }
+
+}
Modified: qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1553147&r1=1553146&r2=1553147&view=diff
==============================================================================
--- qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Mon Dec 23 16:45:49 2013
@@ -297,9 +297,10 @@ public class BrokerAdapter extends Abstr
// permission has already been granted to create the virtual host
// disable further access check on other operations, e.g. create exchange
SecurityManager.setAccessChecksDisabled(true);
+ State desiredState = MapValueConverter.getEnumAttribute(State.class, VirtualHost.STATE, attributes, State.ACTIVE);
try
{
- virtualHostAdapter.setDesiredState(State.INITIALISING, State.ACTIVE);
+ virtualHostAdapter.setDesiredState(State.INITIALISING, desiredState);
}
finally
{
Modified: qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java?rev=1553147&r1=1553146&r2=1553147&view=diff
==============================================================================
--- qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java (original)
+++ qpid/branches/java-broker-bdb-ha/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java Mon Dec 23 16:45:49 2013
@@ -63,6 +63,7 @@ import org.apache.qpid.server.model.Virt
import org.apache.qpid.server.model.VirtualHostAlias;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.plugin.ExchangeType;
+import org.apache.qpid.server.plugin.ReplicationNodeFactory;
import org.apache.qpid.server.protocol.AMQConnectionModel;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
@@ -607,6 +608,7 @@ public final class VirtualHostAdapter ex
}
}
+ @SuppressWarnings("unchecked")
@Override
public <C extends ConfiguredObject> C addChild(Class<C> childClass, Map<String, Object> attributes, ConfiguredObject... otherParents)
{
@@ -634,9 +636,11 @@ public final class VirtualHostAdapter ex
{
throw new UnsupportedOperationException();
}
-
- // TODO KW change add child to add the replication node?
-
+ else if(childClass == ReplicationNode.class)
+ {
+ return (C)createReplicationNode(attributes);
+ }
+
throw new IllegalArgumentException("Cannot create a child of class " + childClass.getSimpleName());
}
@@ -1070,7 +1074,7 @@ public final class VirtualHostAdapter ex
}
catch(RuntimeException e)
{
- changeAttribute(STATE, State.INITIALISING, State.ERRORED);
+ changeAttribute(STATE, getActualState(), State.ERRORED);
if (_broker.isManagementMode())
{
LOGGER.warn("Failed to activate virtual host: " + getName(), e);
@@ -1130,6 +1134,11 @@ public final class VirtualHostAdapter ex
setAttribute(VirtualHost.STATE, getActualState(), State.DELETED);
return true;
}
+ else if (desiredState == State.QUIESCED)
+ {
+ setAttribute(VirtualHost.STATE, getActualState(), State.QUIESCED);
+ return true;
+ }
return false;
}
@@ -1254,7 +1263,20 @@ public final class VirtualHostAdapter ex
@Override
protected void changeAttributes(Map<String, Object> attributes)
{
- throw new UnsupportedOperationException("Changing attributes on virtualhosts is not supported.");
+ // TODO: a hack to change a virtual host state only
+ if (attributes.size() == 2 && attributes.containsKey(STATE) && getName().equals(attributes.get(NAME)))
+ {
+ State newState = MapValueConverter.getEnumAttribute(State.class, STATE, attributes);
+ State actualState = getActualState();
+ if (actualState != newState )
+ {
+ super.changeAttributes(attributes);
+ }
+ }
+ else
+ {
+ throw new UnsupportedOperationException("Changing attributes on virtualhosts is not supported.");
+ }
}
@Override
@@ -1299,6 +1321,10 @@ public final class VirtualHostAdapter ex
if (configuredObject instanceof ReplicationNode)
{
ReplicationNode node = (ReplicationNode)configuredObject;
+ if (!_replicationNodes.isEmpty())
+ {
+ throw new IllegalStateException("Replication node cannot be recovered because virtual host already contains replication node");
+ }
onReplicationNodeRecovered(node);
}
else
@@ -1307,4 +1333,33 @@ public final class VirtualHostAdapter ex
}
}
+ private ReplicationNode createReplicationNode(Map<String, Object> attributes)
+ {
+ ReplicationNode node = null;
+
+ String type = getType();
+ ReplicationNodeFactory factory = ReplicationNodeFactory.FACTORIES.get(type);
+ if (factory == null)
+ {
+ throw new IllegalConfigurationException("Cannot find replication node factory for type " + type);
+ }
+
+ String groupName = MapValueConverter.getStringAttribute(ReplicationNode.GROUP_NAME, attributes);
+ String nodeName = MapValueConverter.getStringAttribute(ReplicationNode.NAME, attributes);
+
+ synchronized (_replicationNodes)
+ {
+ if (!_replicationNodes.isEmpty())
+ {
+ throw new IllegalStateException("Replication node cannot be created because virtual host already contains replication node");
+ }
+ node = factory.createInstance(UUIDGenerator.generateReplicationNodeId(groupName, nodeName), attributes, this);
+ node.setDesiredState(State.INITIALISING, State.ACTIVE);
+
+ _replicationNodes.add(node);
+ }
+ //TODO: make VirtualHost a ConfigurationChangeListener and add it to node to listen for delete events
+ return node;
+ }
+
}
Modified: qpid/branches/java-broker-bdb-ha/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-bdb-ha/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1553147&r1=1553146&r2=1553147&view=diff
==============================================================================
--- qpid/branches/java-broker-bdb-ha/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java (original)
+++ qpid/branches/java-broker-bdb-ha/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java Mon Dec 23 16:45:49 2013
@@ -68,6 +68,7 @@ import org.apache.qpid.server.model.Port
import org.apache.qpid.server.model.PreferencesProvider;
import org.apache.qpid.server.model.Protocol;
import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.ReplicationNode;
import org.apache.qpid.server.model.Session;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.Transport;
@@ -298,6 +299,7 @@ public class HttpManagement extends Abst
addRestServlet(root, "truststore", TrustStore.class);
addRestServlet(root, "plugin", Plugin.class);
addRestServlet(root, "preferencesprovider", AuthenticationProvider.class, PreferencesProvider.class);
+ addRestServlet(root, "replicationnode", VirtualHost.class, ReplicationNode.class);
root.addServlet(new ServletHolder(new UserPreferencesServlet()), "/rest/userpreferences/*");
root.addServlet(new ServletHolder(new LoggedOnUserPreferencesServlet()), "/rest/preferences");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org