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