Author: kwall Date: Thu May 15 12:57:46 2014 New Revision: 1594903 URL: http://svn.apache.org/r1594903 Log: QPID-5715: [Java Broker] Make virtualhostnode respect states ACTIVE and STOPPED
* Added test to ensure that the VHN can transit between ACTIVE <=> STOPPED * Fixed defect whereby the VHN could not be recovered in the STOPPED state. Added test case. * Fixed defct whereby on stopping a VHN, the DurableConfigurationStore would be left open. Work by me and Andrew MacBean <[email protected]>. Added: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.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/RestTestHelper.java qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java?rev=1594903&r1=1594902&r2=1594903&view=diff ============================================================================== --- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java (original) +++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java Thu May 15 12:57:46 2014 @@ -211,9 +211,10 @@ public abstract class AbstractVirtualHos } } - @StateTransition( currentState = { State.ACTIVE, State.ERRORED }, desiredState = State.STOPPED ) + @StateTransition( currentState = { State.ACTIVE, State.ERRORED, State.UNINITIALIZED }, desiredState = State.STOPPED ) protected void doStop() { + closeConfigurationStore(); closeChildren(); _state.set(State.STOPPED); } @@ -221,12 +222,7 @@ public abstract class AbstractVirtualHos @Override protected void onClose() { - DurableConfigurationStore configurationStore = getConfigurationStore(); - if (configurationStore != null) - { - configurationStore.closeConfigurationStore(); - getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.CLOSE()); - } + closeConfigurationStore(); } @Override @@ -250,6 +246,16 @@ public abstract class AbstractVirtualHos } } + private void closeConfigurationStore() + { + DurableConfigurationStore configurationStore = getConfigurationStore(); + if (configurationStore != null) + { + configurationStore.closeConfigurationStore(); + getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.CLOSE()); + } + } + protected abstract DurableConfigurationStore createConfigurationStore(); protected abstract void activate(); 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=1594903&r1=1594902&r2=1594903&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 Thu May 15 12:57:46 2014 @@ -43,6 +43,7 @@ import org.apache.qpid.server.model.Port import org.apache.qpid.server.model.Queue; import org.apache.qpid.server.model.State; import org.apache.qpid.server.model.VirtualHost; +import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.model.port.AmqpPort; import org.apache.qpid.server.queue.LastValueQueue; import org.apache.qpid.server.queue.PriorityQueue; @@ -53,6 +54,14 @@ public class Asserts { public static final String STATISTICS_ATTRIBUTE = "statistics"; + public static void assertVirtualHostNode(final String nodeName, final Map<String, Object> node) + { + assertNotNull("Virtualhostnode " + nodeName + " data is not found", node); + assertEquals("Unexpected value of attribute " + VirtualHostNode.NAME, + nodeName, + node.get(VirtualHostNode.NAME)); + } + public static void assertVirtualHost(String virtualHostName, Map<String, Object> virtualHost) { assertNotNull("Virtualhost " + virtualHostName + " data are not found", virtualHost); Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java?rev=1594903&r1=1594902&r2=1594903&view=diff ============================================================================== --- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java (original) +++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java Thu May 15 12:57:46 2014 @@ -515,6 +515,17 @@ public class RestTestHelper return submitRequest(url, method, (byte[])null); } + public void submitRequest(String url, String method, Map<String, Object> attributes, int expectedResponseCode) throws IOException + { + int responseCode = submitRequest(url, method, attributes); + Assert.assertEquals("Unexpected response code from " + method + " " + url , expectedResponseCode, responseCode); + } + + public void submitRequest(String url, String method, int expectedResponseCode) throws IOException + { + submitRequest(url, method, null, expectedResponseCode); + } + public int submitRequest(String url, String method, byte[] parameters) throws IOException { HttpURLConnection connection = openManagementConnection(url, method); Added: 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=1594903&view=auto ============================================================================== --- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java (added) +++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java Thu May 15 12:57:46 2014 @@ -0,0 +1,177 @@ +/* + * + * 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.systest.rest; + + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.qpid.server.model.ConfiguredObject; +import org.apache.qpid.server.model.VirtualHostNode; +import org.apache.qpid.server.store.DurableConfigurationStore; +import org.apache.qpid.test.utils.TestBrokerConfiguration; + +/** + * + * TODO: Add test to test the mutation of the storePath. If the store path is mutated + * whilst active then the store should be deleted next time we stop or close. + */ +public class VirtualHostNodeRestTest extends QpidRestTestCase +{ + public void testGet() throws Exception + { + List<Map<String, Object>> virtualhostNodes = getRestTestHelper().getJsonAsList("virtualhostnode"); + assertNotNull("Virtualhostnodes data cannot be null", virtualhostNodes); + assertEquals("Unexpected number of hosts", EXPECTED_VIRTUALHOSTS.length, virtualhostNodes.size()); + for (String nodeName : EXPECTED_VIRTUALHOSTS) + { + Map<String, Object> node = getRestTestHelper().find("name", nodeName, virtualhostNodes); + Asserts.assertVirtualHostNode(nodeName, node); + } + } + + public void testCreateAndDeleteNodeWithTestProfileStore() throws Exception + { + String storeType = getTestProfileVirtualHostNodeType(); + String nodeName = "virtualhostnode-" + getTestName(); + File storePathAsFile = new File(getStoreLocation(nodeName)); + + createAndDeleteVirtualHostNode(storeType, nodeName, storePathAsFile); + assertFalse("Store should not exist after deletion", storePathAsFile.exists()); + } + + public void testCreateAndDeleteNodeWithJsonStore() throws Exception + { + String storeType = "JSON"; + String nodeName = "virtualhostnode-" + getTestName(); + File storePathAsFile = new File(getStoreLocation(nodeName)); + + createAndDeleteVirtualHostNode(storeType, nodeName, storePathAsFile); + // TODO Defect: JSON store currently can't delete itself, uncomment once this is resolved + //assertFalse("Store should not exist after deletion", storePathAsFile.exists()); + } + + public void testRecoverVirtualHostNodeWithDesiredStateStopped() throws Exception + { + stopBroker(); + + TestBrokerConfiguration config = getBrokerConfiguration(); + config.setObjectAttribute(VirtualHostNode.class, TEST3_VIRTUALHOST, ConfiguredObject.DESIRED_STATE, "STOPPED"); + config.setSaved(false); + + startBroker(); + + String restUrl = "virtualhostnode/" + TEST3_VIRTUALHOST; + assertVirtualHostStates(restUrl, "STOPPED", "STOPPED"); + } + + public void testMutateState() throws Exception + { + String restUrl = "virtualhostnode/" + TEST3_VIRTUALHOST; + + assertVirtualHostStates(restUrl, "ACTIVE", "ACTIVE"); + + mutateVirtualHostDesiredState(restUrl, "STOPPED"); + assertVirtualHostStates(restUrl, "STOPPED", "STOPPED"); + + mutateVirtualHostDesiredState(restUrl, "ACTIVE"); + assertVirtualHostStates(restUrl, "ACTIVE", "ACTIVE"); + } + + public void testMutateAttributes() throws Exception + { + String restUrl = "virtualhostnode/" + TEST3_VIRTUALHOST; + + Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(restUrl); + assertNull(virtualhostNode.get(VirtualHostNode.DESCRIPTION)); + + String newDescription = "My virtualhost node"; + Map<String, Object> newAttributes = new HashMap<String, Object>(); + newAttributes.put(VirtualHostNode.DESCRIPTION, newDescription); + + getRestTestHelper().submitRequest(restUrl, "PUT", newAttributes, HttpServletResponse.SC_OK); + + virtualhostNode = getRestTestHelper().getJsonAsSingletonList(restUrl); + assertEquals(newDescription, virtualhostNode.get(VirtualHostNode.DESCRIPTION)); + } + + private void createAndDeleteVirtualHostNode(final String storeType, + final String nodeName, + final File storePathAsFile) throws Exception + { + assertFalse("Store should not exist", storePathAsFile.exists()); + + createVirtualHostNode(nodeName, storePathAsFile.getAbsolutePath(), storeType); + assertTrue("Store should exist after creation of node", storePathAsFile.exists()); + + String restUrl = "virtualhostnode/" + nodeName; + Map<String, Object> virtualhostNode = getRestTestHelper().getJsonAsSingletonList(restUrl); + Asserts.assertVirtualHostNode(nodeName, virtualhostNode); + + getRestTestHelper().submitRequest(restUrl, "DELETE", HttpServletResponse.SC_OK); + + List<Map<String, Object>> virtualHostNodes = getRestTestHelper().getJsonAsList(restUrl); + assertEquals("Host should be deleted", 0, virtualHostNodes.size()); + } + + private void assertVirtualHostStates(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)); + } + + private void mutateVirtualHostDesiredState(final String restUrl, final String newState) throws IOException + { + Map<String, Object> newAttributes = new HashMap<String, Object>(); + newAttributes.put(VirtualHostNode.DESIRED_STATE, newState); + + getRestTestHelper().submitRequest(restUrl, "PUT", newAttributes, HttpServletResponse.SC_OK); + } + + private void createVirtualHostNode(String nodeName, String configStorePath, final String storeType) throws Exception + { + Map<String, Object> nodeData = new HashMap<String, Object>(); + nodeData.put(VirtualHostNode.NAME, nodeName); + nodeData.put(VirtualHostNode.TYPE, storeType); + nodeData.put(DurableConfigurationStore.STORE_PATH, configStorePath); + + getRestTestHelper().submitRequest("virtualhostnode/" + nodeName, + "PUT", + nodeData, + HttpServletResponse.SC_CREATED); + } + + private String getStoreLocation(String hostName) + { + return new File(TMP_FOLDER, "store-" + hostName + "-" + System.currentTimeMillis()).getAbsolutePath(); + } +} Modified: qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes?rev=1594903&r1=1594902&r2=1594903&view=diff ============================================================================== --- qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes (original) +++ qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes Thu May 15 12:57:46 2014 @@ -52,3 +52,6 @@ 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.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithTestProfileStore +org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithJsonStore + --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
