You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2014/05/20 17:04:12 UTC

svn commit: r1596281 - in /qpid/trunk/qpid/java: bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/ bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/ broker-core/src/main/java/org/apache/qpid/server/model/ ...

Author: kwall
Date: Tue May 20 15:04:11 2014
New Revision: 1596281

URL: http://svn.apache.org/r1596281
Log:
QPID-5715: [Java Broker] Make virtualhosts respect the states ACTIVE and STOPPED

* Changes in virtualhost state are now persisted to store.
* VirtualHostState eliminated.  The PASSIVE state used when a BDB HA Virtualhost is in replica is replaced by UNAVAILABLE.

Work by me and Andrew MacBean <an...@gmail.com>.

Removed:
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostState.java
Modified:
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/State.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
    qpid/trunk/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java
    qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/handler/ConnectionOpenMethodHandler.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
    qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java Tue May 20 15:04:11 2014
@@ -44,6 +44,8 @@ import com.sleepycat.je.rep.util.Replica
 import com.sleepycat.je.rep.utilint.HostPortPair;
 
 import org.apache.log4j.Logger;
+
+import org.apache.qpid.server.exchange.ExchangeImpl;
 import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
@@ -57,6 +59,7 @@ import org.apache.qpid.server.model.Stat
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
+import org.apache.qpid.server.queue.AMQQueue;
 import org.apache.qpid.server.security.SecurityManager;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.VirtualHostStoreUpgraderAndRecoverer;
@@ -66,7 +69,6 @@ import org.apache.qpid.server.store.berk
 import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacadeFactory;
 import org.apache.qpid.server.store.berkeleydb.replication.ReplicationGroupListener;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
-import org.apache.qpid.server.virtualhost.VirtualHostState;
 import org.apache.qpid.server.virtualhostnode.AbstractVirtualHostNode;
 
 @ManagedObject( category = false, type = "BDB_HA" )
@@ -702,12 +704,41 @@ public class BDBHAVirtualHostNodeImpl ex
         ReplicaVirtualHost(Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
         {
             super(attributes, virtualHostNode);
-            setState(VirtualHostState.PASSIVE);
         }
 
         @Override
-        public void onCreate()
+        protected <C extends ConfiguredObject> C addChild(final Class<C> childClass,
+                                                          final Map<String, Object> attributes,
+                                                          final ConfiguredObject... otherParents)
+        {
+            throwUnsupportedForReplica();
+            return null;
+        }
+
+        @Override
+        public ExchangeImpl createExchange(final Map<String, Object> attributes)
+        {
+            throwUnsupportedForReplica();
+            return null;
+        }
+
+        @Override
+        public AMQQueue<?> createQueue(final Map<String, Object> attributes)
+        {
+            throwUnsupportedForReplica();
+            return null;
+        }
+
+        @Override
+        public State getState()
+        {
+            return State.UNAVAILABLE;
+        }
+
+        private void throwUnsupportedForReplica()
         {
+            throw new IllegalStateException("The virtual host state of " + getState()
+                                            + " does not permit this operation.");
         }
 
     }

Modified: qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java (original)
+++ qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java Tue May 20 15:04:11 2014
@@ -38,8 +38,6 @@ import org.apache.qpid.server.virtualhos
 import org.apache.qpid.systest.rest.QpidRestTestCase;
 import org.apache.qpid.test.utils.TestBrokerConfiguration;
 import org.apache.qpid.util.FileUtils;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
 
 public class BDBHAVirtualHostNodeRestTest extends QpidRestTestCase
 {
@@ -97,7 +95,7 @@ public class BDBHAVirtualHostNodeRestTes
         config.removeObjectConfiguration(VirtualHostNode.class, TEST3_VIRTUALHOST);
     }
 
-    public void testCreate3NodesCluster() throws Exception
+    public void testCreate3NodeGroup() throws Exception
     {
         createHANode(NODE1, _node1HaPort, _node1HaPort);
         assertNode(NODE1, _node1HaPort, _node1HaPort, NODE1);
@@ -173,7 +171,7 @@ public class BDBHAVirtualHostNodeRestTes
         assertEquals("Unexpected number of remote nodes on " + NODE2, 1, data.size());
     }
 
-    private void createHANode(String nodeName, int nodePort, int helperPort) throws IOException, JsonGenerationException, JsonMappingException
+    private void createHANode(String nodeName, int nodePort, int helperPort) throws Exception
     {
         Map<String, Object> nodeData = new HashMap<String, Object>();
         nodeData.put(BDBHAVirtualHostNode.NAME, nodeName);

Modified: qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java (original)
+++ qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java Tue May 20 15:04:11 2014
@@ -191,7 +191,7 @@ public class HAClusterManagementTest ext
         catch  (Exception e)
         {
             String message = e.getMessage();
-            assertEquals("The virtual hosts state of PASSIVE does not permit this operation.", message);
+            assertEquals("The virtual host state of UNAVAILABLE does not permit this operation.", message);
         }
 
         try
@@ -202,7 +202,7 @@ public class HAClusterManagementTest ext
         catch  (Exception e)
         {
             String message = e.getMessage();
-            assertEquals("The virtual hosts state of PASSIVE does not permit this operation.", message);
+            assertEquals("The virtual host state of UNAVAILABLE does not permit this operation.", message);
         }
     }
 
@@ -243,11 +243,11 @@ public class HAClusterManagementTest ext
         catch (Exception e)
         {
             String message = e.getMessage();
-            assertEquals("The virtual hosts state of PASSIVE does not permit this operation.", message);
+            assertEquals("The virtual host state of UNAVAILABLE does not permit this operation.", message);
         }
 
         Map<String, Object> attributes = _clusterCreator.getNodeAttributes(inactiveBrokerPort);
-        assertEquals("Inactive broker has unexpeced role", "REPLICA", attributes.get(BDBHAVirtualHostNode.ROLE));
+        assertEquals("Inactive broker has unexpected role", "REPLICA", attributes.get(BDBHAVirtualHostNode.ROLE));
         _clusterCreator.setNodeAttributes(inactiveBrokerPort, Collections.<String, Object>singletonMap(BDBHAVirtualHostNode.ROLE, "MASTER"));
 
         _clusterCreator.awaitNodeToAttainRole(inactiveBrokerPort, "MASTER");

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/State.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/State.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/State.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/State.java Tue May 20 15:04:11 2014
@@ -27,7 +27,8 @@ public enum State
     STOPPED,
     ACTIVE,
     DELETED,
-    ERRORED(false);
+    ERRORED(false),
+    UNAVAILABLE;
 
     private final boolean _valid;
 

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java Tue May 20 15:04:11 2014
@@ -23,7 +23,6 @@ package org.apache.qpid.server.virtualho
 import java.security.AccessControlException;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -37,6 +36,7 @@ import java.util.concurrent.ScheduledFut
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.security.auth.Subject;
 
@@ -108,7 +108,7 @@ public abstract class AbstractVirtualHos
 
     private final SystemNodeRegistry _systemNodeRegistry = new SystemNodeRegistry();
 
-    private volatile VirtualHostState _state = VirtualHostState.INITIALISING;
+    private final AtomicReference<State> _state = new AtomicReference<>(State.UNINITIALIZED);
 
     private final StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
 
@@ -273,18 +273,15 @@ public abstract class AbstractVirtualHos
                 }
             }
         }
-    }
 
-    private void checkVHostStateIsActive()
-    {
-        checkVHostState(VirtualHostState.ACTIVE);
+        addChangeListener(new StoreUpdatingChangeListener());
     }
 
-    private void checkVHostState(VirtualHostState... states)
+    private void checkVHostStateIsActive()
     {
-        if (!Arrays.asList(states).contains(getVirtualHostState()))
+        if (_state.get() != State.ACTIVE)
         {
-            throw new IllegalStateException("The virtual hosts state of " + getVirtualHostState()
+            throw new IllegalStateException("The virtual host state of " + _state.get()
                                             + " does not permit this operation.");
         }
     }
@@ -392,24 +389,7 @@ public abstract class AbstractVirtualHos
         {
             return State.DELETED;
         }
-        VirtualHostState implementationState = getVirtualHostState();
-        switch(implementationState)
-        {
-            case INITIALISING:
-                return State.UNINITIALIZED;
-            case ACTIVE:
-                return State.ACTIVE;
-            case PASSIVE:
-                // TODO
-                return State.ACTIVE;
-            case STOPPED:
-                return State.STOPPED;
-            case ERRORED:
-                return State.ERRORED;
-            default:
-                throw new IllegalStateException("Unsupported state:" + implementationState);
-        }
-
+        return _state.get();
     }
 
     @Override
@@ -709,7 +689,7 @@ public abstract class AbstractVirtualHos
         //Stop Connections
         _connectionRegistry.close();
         _dtxRegistry.close();
-        closeStorage();
+        closeMessageStore();
         shutdownHouseKeeping();
 
         _eventLogger.message(VirtualHostMessages.CLOSED(getName()));
@@ -725,7 +705,7 @@ public abstract class AbstractVirtualHos
         }
     }
 
-    private void closeStorage()
+    private void closeMessageStore()
     {
         if (getMessageStore() != null)
         {
@@ -808,11 +788,6 @@ public abstract class AbstractVirtualHos
         return _dtxRegistry;
     }
 
-    public VirtualHostState getVirtualHostState()
-    {
-        return _state;
-    }
-
     public void block()
     {
         synchronized (_connectionRegistry)
@@ -902,14 +877,9 @@ public abstract class AbstractVirtualHos
         }
     }
 
-    protected void setState(VirtualHostState state)
+    protected void reportIfError(State state)
     {
-        _state = state;
-    }
-
-    protected void reportIfError(VirtualHostState state)
-    {
-        if (state == VirtualHostState.ERRORED)
+        if (state == State.ERRORED)
         {
             _eventLogger.message(VirtualHostMessages.ERRORED(getName()));
         }
@@ -1239,6 +1209,16 @@ public abstract class AbstractVirtualHos
         return _housekeepingThreadCount;
     }
 
+    @StateTransition( currentState = { State.ACTIVE, State.ERRORED, State.UNINITIALIZED }, desiredState = State.STOPPED )
+    protected void doStop()
+    {
+        closeChildren();
+        shutdownHouseKeeping();
+        closeMessageStore();
+        _state.set(State.STOPPED);
+
+    }
+
     @StateTransition( currentState = { State.ACTIVE, State.QUIESCED, State.ERRORED }, desiredState = State.DELETED )
     private void doDelete()
     {
@@ -1250,11 +1230,7 @@ public abstract class AbstractVirtualHos
             {
                 throw new IntegrityViolationException("Cannot delete default virtual host '" + hostName + "'");
             }
-            if (getVirtualHostState() == VirtualHostState.ACTIVE
-                || getVirtualHostState() == VirtualHostState.INITIALISING)
-            {
-                close();
-            }
+            close();
 
             MessageStore ms = getMessageStore();
             if (ms != null)
@@ -1268,8 +1244,6 @@ public abstract class AbstractVirtualHos
                     _logger.warn("Exception occurred on message store deletion", e);
                 }
             }
-            setAttribute(VirtualHost.STATE, getState(), State.DELETED);
-            getDurableConfigurationStore().remove(asObjectRecord());
             deleted();
         }
     }
@@ -1426,8 +1400,8 @@ public abstract class AbstractVirtualHos
         getDurableConfigurationStore().create(new ConfiguredObjectRecordImpl(record.getId(), record.getType(), record.getAttributes()));
     }
 
-    @StateTransition( currentState = {State.UNINITIALIZED, State.ERRORED, State.QUIESCED}, desiredState = State.ACTIVE )
-    protected void activate()
+    @StateTransition( currentState = {State.UNINITIALIZED, State.ERRORED, State.QUIESCED, State.STOPPED}, desiredState = State.ACTIVE )
+    private void onActivate()
     {
         _houseKeepingTasks = new ScheduledThreadPoolExecutor(getHousekeepingThreadCount());
 
@@ -1454,17 +1428,53 @@ public abstract class AbstractVirtualHos
 
         new MessageStoreRecoverer(this, getMessageStoreLogSubject()).recover();
 
-        VirtualHostState finalState = VirtualHostState.ERRORED;
+        State finalState = State.ERRORED;
         try
         {
             initialiseHouseKeeping(getHousekeepingCheckPeriod());
-            finalState = VirtualHostState.ACTIVE;
+            finalState = State.ACTIVE;
         }
         finally
         {
-            _state = finalState;
-            reportIfError(_state);
+            _state.set(finalState);
+            reportIfError(_state.get());
         }
+
     }
 
+    private class StoreUpdatingChangeListener implements ConfigurationChangeListener
+    {
+        @Override
+        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState)
+        {
+            if (newState == State.DELETED)
+            {
+                getDurableConfigurationStore().remove(asObjectRecord());
+                object.removeChangeListener(this);
+            }
+        }
+
+        @Override
+        public void childAdded(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
+        {
+
+        }
+
+        @Override
+        public void childRemoved(final ConfiguredObject<?> object, final ConfiguredObject<?> child)
+        {
+
+        }
+
+        @Override
+        public void attributeSet(final ConfiguredObject<?> object,
+                                 final String attributeName,
+                                 final Object oldAttributeValue,
+                                 final Object newAttributeValue)
+        {
+            getDurableConfigurationStore().update(false, asObjectRecord());
+        }
+    }
+
+
 }

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java Tue May 20 15:04:11 2014
@@ -104,8 +104,6 @@ public interface VirtualHostImpl< X exte
 
     ScheduledFuture<?> scheduleTask(long delay, Runnable timeoutTask);
 
-    VirtualHostState getVirtualHostState();
-
     public void block();
 
     public void unblock();

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java Tue May 20 15:04:11 2014
@@ -122,7 +122,7 @@ public abstract class AbstractStandardVi
         {
             if (LOGGER.isDebugEnabled())
             {
-                LOGGER.debug("Creating new virtualhost with name : " +  getName());
+                LOGGER.debug("Creating new virtualhost with name : " + getName());
             }
             Map<String, Object> hostAttributes = new HashMap<String, Object>();
             hostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
@@ -147,8 +147,6 @@ public abstract class AbstractStandardVi
                 }
             });
         }
-
-        host.start();
     }
 
     @Override

Modified: qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java Tue May 20 15:04:11 2014
@@ -584,11 +584,6 @@ public class MockVirtualHost implements 
 
     }
 
-    public VirtualHostState getVirtualHostState()
-    {
-        return VirtualHostState.ACTIVE;
-    }
-
     public void block()
     {
     }

Modified: qpid/trunk/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnectionDelegate.java Tue May 20 15:04:11 2014
@@ -44,13 +44,13 @@ import org.apache.qpid.common.ServerProp
 import org.apache.qpid.properties.ConnectionStartProperties;
 import org.apache.qpid.server.configuration.BrokerProperties;
 import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.protocol.AMQConnectionModel;
 import org.apache.qpid.server.security.SubjectCreator;
 import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
 import org.apache.qpid.server.security.auth.SubjectAuthenticationResult;
 import org.apache.qpid.server.virtualhost.VirtualHostImpl;
-import org.apache.qpid.server.virtualhost.VirtualHostState;
 import org.apache.qpid.transport.Binary;
 import org.apache.qpid.transport.Connection;
 import org.apache.qpid.transport.ConnectionClose;
@@ -224,7 +224,7 @@ public class ServerConnectionDelegate ex
                 return;
             }
 
-            if (vhost.getVirtualHostState() != VirtualHostState.ACTIVE)
+            if (vhost.getState() != State.ACTIVE)
             {
                 sconn.setState(Connection.State.CLOSING);
                 sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Virtual host '"+vhostName+"' is not active"));

Modified: qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/handler/ConnectionOpenMethodHandler.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/handler/ConnectionOpenMethodHandler.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/handler/ConnectionOpenMethodHandler.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/handler/ConnectionOpenMethodHandler.java Tue May 20 15:04:11 2014
@@ -30,13 +30,13 @@ import org.apache.qpid.framing.AMQShortS
 import org.apache.qpid.framing.ConnectionOpenBody;
 import org.apache.qpid.framing.MethodRegistry;
 import org.apache.qpid.protocol.AMQConstant;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.port.AmqpPort;
 import org.apache.qpid.server.protocol.v0_8.AMQProtocolSession;
 import org.apache.qpid.server.protocol.v0_8.state.AMQState;
 import org.apache.qpid.server.protocol.v0_8.state.AMQStateManager;
 import org.apache.qpid.server.protocol.v0_8.state.StateAwareMethodListener;
 import org.apache.qpid.server.virtualhost.VirtualHostImpl;
-import org.apache.qpid.server.virtualhost.VirtualHostState;
 
 public class ConnectionOpenMethodHandler implements StateAwareMethodListener<ConnectionOpenBody>
 {
@@ -93,7 +93,7 @@ public class ConnectionOpenMethodHandler
                 throw body.getConnectionException(AMQConstant.ACCESS_REFUSED, e.getMessage());
             }
 
-             if (virtualHost.getVirtualHostState() != VirtualHostState.ACTIVE)
+             if (virtualHost.getState() != State.ACTIVE)
             {
                 throw body.getConnectionException(AMQConstant.CONNECTION_FORCED, "Virtual host '" + virtualHost.getName() + "' is not active");
             }

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java Tue May 20 15:04:11 2014
@@ -30,6 +30,8 @@ import java.util.Map;
 
 import javax.jms.JMSException;
 
+import junit.framework.TestCase;
+
 import org.apache.qpid.client.AMQConnection;
 import org.apache.qpid.server.model.Binding;
 import org.apache.qpid.server.model.Broker;
@@ -399,4 +401,15 @@ public class Asserts
         assertBinding(queueName, queueName, exchange, binding);
     }
 
+    public static void assertActualAndDesiredState(final String expectedDesiredState,
+                                             final String expectedActualState,
+                                             final Map<String, Object> data)
+    {
+        String name = (String) data.get(ConfiguredObject.NAME);
+        TestCase.assertEquals("Object with name " + name + " has unexpected desired state",
+                              expectedDesiredState,
+                              data.get(ConfiguredObject.DESIRED_STATE));
+        TestCase.assertEquals("Object with name " + name + " has unexpected actual state",
+                              expectedActualState, data.get(ConfiguredObject.STATE));
+    }
 }

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java Tue May 20 15:04:11 2014
@@ -85,20 +85,20 @@ public class VirtualHostNodeRestTest  ex
         startBroker();
 
         String restUrl = "virtualhostnode/" + TEST3_VIRTUALHOST;
-        assertVirtualHostStates(restUrl, "STOPPED", "STOPPED");
+        assertActualAndDesireStates(restUrl, "STOPPED", "STOPPED");
     }
 
     public void testMutateState() throws Exception
     {
         String restUrl = "virtualhostnode/" + TEST3_VIRTUALHOST;
 
-        assertVirtualHostStates(restUrl, "ACTIVE", "ACTIVE");
+        assertActualAndDesireStates(restUrl, "ACTIVE", "ACTIVE");
 
         mutateVirtualHostDesiredState(restUrl, "STOPPED");
-        assertVirtualHostStates(restUrl, "STOPPED", "STOPPED");
+        assertActualAndDesireStates(restUrl, "STOPPED", "STOPPED");
 
         mutateVirtualHostDesiredState(restUrl, "ACTIVE");
-        assertVirtualHostStates(restUrl, "ACTIVE", "ACTIVE");
+        assertActualAndDesireStates(restUrl, "ACTIVE", "ACTIVE");
     }
 
     public void testMutateAttributes() throws Exception
@@ -137,16 +137,12 @@ public class VirtualHostNodeRestTest  ex
         assertEquals("Host should be deleted", 0, virtualHostNodes.size());
     }
 
-    private void assertVirtualHostStates(final String restUrl,
-                                         final String expectedDesiredState,
-                                         final String expectedActualState) throws IOException
+    private void assertActualAndDesireStates(final String restUrl,
+                                             final String expectedDesiredState,
+                                             final String expectedActualState) throws IOException
     {
         Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(restUrl);
-        assertEquals("Virtualhostnode has unexpected desired state",
-                     expectedDesiredState,
-                     virtualhostNode.get(VirtualHostNode.DESIRED_STATE));
-        assertEquals("Virtualhostnode has unexpected actual state",
-                     expectedActualState, virtualhostNode.get(VirtualHostNode.STATE));
+        Asserts.assertActualAndDesiredState(expectedDesiredState, expectedActualState, virtualhostNode);
     }
 
     private void mutateVirtualHostDesiredState(final String restUrl, final String newState) throws IOException

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java Tue May 20 15:04:11 2014
@@ -22,6 +22,7 @@ package org.apache.qpid.systest.rest;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -129,8 +130,9 @@ public class VirtualHostRestTest extends
 
     public void testDeleteHost() throws Exception
     {
-        int responseCode = getRestTestHelper().submitRequest("virtualhost/" + TEST3_VIRTUALHOST + "/" + TEST3_VIRTUALHOST, "DELETE");
-        assertEquals("Unexpected response code", 200, responseCode);
+        getRestTestHelper().submitRequest("virtualhost/" + TEST3_VIRTUALHOST + "/" + TEST3_VIRTUALHOST,
+                                          "DELETE",
+                                          HttpServletResponse.SC_OK);
 
         List<Map<String, Object>> hosts = getRestTestHelper().getJsonAsList("virtualhost/" + TEST3_VIRTUALHOST);
         assertEquals("Host should be deleted", 0, hosts.size());
@@ -138,36 +140,66 @@ public class VirtualHostRestTest extends
 
     public void testDeleteDefaultHostFails() throws Exception
     {
-        int responseCode = getRestTestHelper().submitRequest("virtualhost/" + TEST1_VIRTUALHOST, "DELETE");
-        assertEquals("Unexpected response code", 409, responseCode);
-
-        restartBroker();
-
-        List<Map<String, Object>> hosts = getRestTestHelper().getJsonAsList("virtualhost/" + TEST1_VIRTUALHOST);
-        assertEquals("Host should be deleted", 1, hosts.size());
+        getRestTestHelper().submitRequest("virtualhost/" + TEST1_VIRTUALHOST, "DELETE", HttpServletResponse.SC_CONFLICT);
     }
 
-    public void testUpdateActiveHost() throws Exception
+    public void testMutateAttributes() throws Exception
     {
         String hostToUpdate = TEST3_VIRTUALHOST;
         String restHostUrl = "virtualhost/" + hostToUpdate + "/" + hostToUpdate;
+
         Map<String, Object> hostDetails = getRestTestHelper().getJsonAsSingletonList(restHostUrl);
         Asserts.assertVirtualHost(hostToUpdate, hostDetails);
 
-        Map<String, Object> newAttributes = new HashMap<String, Object>();
-        newAttributes.put(VirtualHost.NAME, hostToUpdate);
-        newAttributes.put(VirtualHost.DESCRIPTION, "This is a virtual host");
-
-        int response = getRestTestHelper().submitRequest(restHostUrl, "PUT", newAttributes);
-        assertEquals("Unexpected response code", 200, response);
-
-        restartBroker();
+        Map<String, Object> newAttributes = Collections.<String, Object>singletonMap(VirtualHost.DESCRIPTION, "This is a virtual host");
+        getRestTestHelper().submitRequest(restHostUrl, "PUT", newAttributes, HttpServletResponse.SC_OK);
 
         Map<String, Object> rereadHostDetails = getRestTestHelper().getJsonAsSingletonList(restHostUrl);
         Asserts.assertVirtualHost(hostToUpdate, rereadHostDetails);
         assertEquals("This is a virtual host", rereadHostDetails.get(VirtualHost.DESCRIPTION));
     }
 
+    public void testMutateState() throws Exception
+    {
+        String hostToUpdate = TEST3_VIRTUALHOST;
+        String restHostUrl = "virtualhost/" + hostToUpdate + "/" + hostToUpdate;
+
+        assertActualAndDesireStates(restHostUrl, "ACTIVE", "ACTIVE");
+
+        Map<String, Object> newAttributes = Collections.<String, Object>singletonMap(VirtualHost.DESIRED_STATE, "STOPPED");
+        getRestTestHelper().submitRequest(restHostUrl, "PUT", newAttributes, HttpServletResponse.SC_OK);
+
+        assertActualAndDesireStates(restHostUrl, "STOPPED", "STOPPED");
+
+        newAttributes = Collections.<String, Object>singletonMap(VirtualHost.DESIRED_STATE, "ACTIVE");
+        getRestTestHelper().submitRequest(restHostUrl, "PUT", newAttributes, HttpServletResponse.SC_OK);
+
+        assertActualAndDesireStates(restHostUrl, "ACTIVE", "ACTIVE");
+    }
+
+    public void testRecoverVirtualHostInDesiredStateStoppedWithDescription() throws Exception
+    {
+        String hostToUpdate = TEST3_VIRTUALHOST;
+        String restUrl = "virtualhost/" + hostToUpdate + "/" + hostToUpdate;
+
+        assertActualAndDesireStates(restUrl, "ACTIVE", "ACTIVE");
+
+        Map<String, Object> newAttributes = new HashMap<>();
+        newAttributes.put(VirtualHost.DESIRED_STATE, "STOPPED");
+        newAttributes.put(VirtualHost.DESCRIPTION, "My description");
+
+        getRestTestHelper().submitRequest(restUrl, "PUT", newAttributes, HttpServletResponse.SC_OK);
+
+        assertActualAndDesireStates(restUrl, "STOPPED", "STOPPED");
+
+        restartBroker();
+
+        Map<String, Object> rereadVirtualhost = getRestTestHelper().getJsonAsSingletonList(restUrl);
+        Asserts.assertActualAndDesiredState("STOPPED", "STOPPED", rereadVirtualhost);
+
+        assertEquals("Unexpected description after restart", "My description", rereadVirtualhost.get(VirtualHost.DESCRIPTION));
+    }
+
     public void testPutCreateQueue() throws Exception
     {
         String queueName = getTestQueueName();
@@ -497,7 +529,7 @@ public class VirtualHostRestTest extends
             JsonMappingException
     {
         String storePath = getStoreLocation(hostName);
-        int responseCode = tryCreateVirtualHost(hostName, storeType, storePath, configPath);
+        int responseCode = tryCreateVirtualHostNode(hostName, storeType, storePath, configPath);
         assertEquals("Unexpected response code", 201, responseCode);
         return storePath;
     }
@@ -507,7 +539,10 @@ public class VirtualHostRestTest extends
         return new File(TMP_FOLDER, "store-" + hostName + "-" + System.currentTimeMillis()).getAbsolutePath();
     }
 
-    private int tryCreateVirtualHost(String hostName, String virtualHostNodeType, String storePath, String configPath) throws IOException,
+    private int tryCreateVirtualHostNode(String hostName,
+                                         String virtualHostNodeType,
+                                         String storePath,
+                                         String configPath) throws IOException,
             JsonGenerationException, JsonMappingException
     {
 
@@ -542,4 +577,12 @@ public class VirtualHostRestTest extends
         assertNull("Unexpected connections", hostDetails.get(VIRTUALHOST_CONNECTIONS_ATTRIBUTE));
     }
 
+    private void assertActualAndDesireStates(final String restUrl,
+                                                            final String expectedDesiredState,
+                                                            final String expectedActualState) throws IOException
+    {
+        Map<String, Object> virtualhost = getRestTestHelper().getJsonAsSingletonList(restUrl);
+        Asserts.assertActualAndDesiredState(expectedDesiredState, expectedActualState, virtualhost);
+    }
+
 }

Modified: qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes?rev=1596281&r1=1596280&r2=1596281&view=diff
==============================================================================
--- qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes (original)
+++ qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes Tue May 20 15:04:11 2014
@@ -53,7 +53,8 @@ org.apache.qpid.systest.management.jmx.Q
 
 org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testWhenBrokerIsRestartedAfterEnqeuingMessages
 
-org.apache.qpid.systest.rest.VirtualHostRestTest#testUpdateActiveHost
+org.apache.qpid.systest.rest.VirtualHostRestTest#testRecoverVirtualHostInDesiredStateStoppedWithDescription
+
 org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithTestProfileStore
 org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithJsonStore
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org