summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-06-20 12:42:40 +0000
committerKeith Wall <kwall@apache.org>2014-06-20 12:42:40 +0000
commitedb54259c0b24e7060ec6d2d5f62349e6f2fb4f8 (patch)
treec24e6b87af7d48e336515b02bbeb98af83fd06b2 /qpid/java
parent3d39a9cacf00528456a77c64f83f1e1c46ab5f63 (diff)
downloadqpid-python-edb54259c0b24e7060ec6d2d5f62349e6f2fb4f8.tar.gz
QPID-5803: [Java Broker] Add a utilised flag to the VHN context after the blueprint has been used.
This prevents the virtualhost from being automatically recreated by the blueprint, should the user choose to the VH. Strenghthen unit tests. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1604164 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java14
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java179
2 files changed, 160 insertions, 33 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
index 9ce4779a1c..6705185637 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
@@ -45,6 +45,7 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
{
private static final Logger LOGGER = Logger.getLogger(AbstractStandardVirtualHostNode.class);
public static final String VIRTUALHOST_BLUEPRINT_CONTEXT_VAR = "virtualhostBlueprint";
+ public static final String VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR = "virtualhostBlueprintUtilised";
public AbstractStandardVirtualHostNode(Map<String, Object> attributes,
Broker<?> parent)
@@ -97,7 +98,12 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
if (host == null)
{
- if (getContext() != null && getContext().containsKey(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR))
+
+ boolean hasBlueprint = getContext().containsKey(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR);
+ boolean blueprintUtilised = getContext().containsKey(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR)
+ && Boolean.parseBoolean(String.valueOf(getContext().get(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR)));
+
+ if (hasBlueprint && !blueprintUtilised)
{
Map<String, Object> virtualhostBlueprint = getContextValue(Map.class, VIRTUALHOST_BLUEPRINT_CONTEXT_VAR);
@@ -122,6 +128,12 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
{
LOGGER.debug("Created new virtualhost: " + host);
}
+
+ // Update the context with the utilised flag
+ Map<String, String> actualContext = (Map<String, String>) getActualAttributes().get(CONTEXT);
+ Map<String, String> context = new HashMap<>(actualContext);
+ context.put(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR, Boolean.TRUE.toString());
+ setAttribute(CONTEXT, getContext(), context);
}
}
else
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
index 397f83b712..ea66911a89 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
@@ -20,9 +20,11 @@
*/
package org.apache.qpid.server.virtualhostnode;
+import static org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@@ -53,8 +55,6 @@ public class AbstractStandardVirtualHostNodeTest extends QpidTestCase
private UUID _nodeId = UUID.randomUUID();
private Broker<?> _broker;
- private DurableConfigurationStore _configStore;
- private ConfiguredObjectRecord _record;
private TaskExecutor _taskExecutor;
@Override
@@ -83,27 +83,22 @@ public class AbstractStandardVirtualHostNodeTest extends QpidTestCase
super.tearDown();
}
}
- public void testActivationOpensConfigStoreWithExistingVirtualHostRecord() throws Exception
+
+ /**
+ * Tests activating a virtualhostnode with a config store that specifies a
+ * virtualhost. Ensures that the virtualhost created.
+ */
+ public void testActivateVHN_StoreHasVH() throws Exception
{
UUID virtualHostId = UUID.randomUUID();
- _record = createMockVirtualHostCOR(virtualHostId);
-
- _configStore = new NullMessageStore(){
+ ConfiguredObjectRecord vhostRecord = createVirtualHostConfiguredObjectRecord(virtualHostId);
+ DurableConfigurationStore configStore = configStoreThatProduces(vhostRecord);
- @Override
- public void visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws StoreException
- {
- handler.begin();
- handler.handle(_record);
- handler.end();
- }
- };
-
- Map<String, Object> nodeAttributes = new HashMap<String, Object>();
+ Map<String, Object> nodeAttributes = new HashMap<>();
nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
nodeAttributes.put(VirtualHostNode.ID, _nodeId);
- VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, _configStore);
+ VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, configStore);
node.open();
node.start();
@@ -114,24 +109,20 @@ public class AbstractStandardVirtualHostNodeTest extends QpidTestCase
assertEquals("Unexpected virtual host id", virtualHostId, virtualHost.getId());
}
- public void testActivationOpensConfigStoreWithoutVirtualHostRecord() throws Exception
- {
- _configStore = new NullMessageStore() {
- @Override
- public void visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws StoreException
- {
- handler.begin();
- // No records
- handler.end();
- }
- };
+ /**
+ * Tests activating a virtualhostnode with a config store which does not specify
+ * a virtualhost. Checks no virtualhost is created.
+ */
+ public void testActivateVHN_StoreHasNoVH() throws Exception
+ {
+ DurableConfigurationStore configStore = configStoreThatProducesNoRecords();
- Map<String, Object> nodeAttributes = new HashMap<String, Object>();
+ Map<String, Object> nodeAttributes = new HashMap<>();
nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
nodeAttributes.put(VirtualHostNode.ID, _nodeId);
- VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, _configStore);
+ VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, configStore);
node.open();
node.start();
@@ -140,9 +131,111 @@ public class AbstractStandardVirtualHostNodeTest extends QpidTestCase
}
- private ConfiguredObjectRecord createMockVirtualHostCOR(UUID virtualHostId)
+ /**
+ * Tests activating a virtualhostnode with a blueprint context variable. Config store
+ * does not specify a virtualhost. Checks virtualhost is created from the blueprint.
+ */
+ public void testActivateVHNWithVHBlueprint_StoreHasNoVH() throws Exception
{
- Map<String, Object> virtualHostAttributes = new HashMap<String, Object>();
+ DurableConfigurationStore configStore = configStoreThatProducesNoRecords();
+
+ String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : \"%s\"}",
+ TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+ TEST_VIRTUAL_HOST_NAME);
+ Map<String, String> context = Collections.singletonMap(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+
+ Map<String, Object> nodeAttributes = new HashMap<>();
+ nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+ nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+ nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+ VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, configStore);
+ node.open();
+ node.start();
+
+ VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+ assertNotNull("Virtual host should be created by blueprint", virtualHost);
+ assertEquals("Unexpected virtual host name", TEST_VIRTUAL_HOST_NAME, virtualHost.getName());
+ assertEquals("Unexpected virtual host state", State.ACTIVE, virtualHost.getState());
+ assertNotNull("Unexpected virtual host id", virtualHost.getId());
+
+ Map<String, String> updatedContext = node.getContext();
+
+ assertTrue("Context should now have utilised flag", updatedContext.containsKey(
+ VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR));
+ assertEquals("Utilised flag should be true",
+ Boolean.TRUE.toString(),
+ updatedContext.get(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR));
+ }
+
+ /**
+ * Tests activating a virtualhostnode with blueprint context variable and the
+ * marked utilised flag. Config store does not specify a virtualhost.
+ * Checks virtualhost is not recreated from the blueprint.
+ */
+ public void testActivateVHNWithVHBlueprintUsed_StoreHasNoVH() throws Exception
+ {
+ DurableConfigurationStore configStore = configStoreThatProducesNoRecords();
+
+ String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : \"%s\"}",
+ TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+ TEST_VIRTUAL_HOST_NAME);
+ Map<String, String> context = new HashMap<>();
+ context.put(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+ context.put(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR, Boolean.TRUE.toString());
+
+ Map<String, Object> nodeAttributes = new HashMap<>();
+ nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+ nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+ nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+ VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, configStore);
+ node.open();
+ node.start();
+
+ VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+ assertNull("Virtual host should not be created by blueprint", virtualHost);
+ }
+
+ /**
+ * Tests activating a virtualhostnode with a blueprint context variable. Config store
+ * does specify a virtualhost. Checks that virtualhost is recovered from store and
+ * blueprint is ignored..
+ */
+ public void testActivateVHNWithVHBlueprint_StoreHasExistingVH() throws Exception
+ {
+ UUID virtualHostId = UUID.randomUUID();
+ ConfiguredObjectRecord record = createVirtualHostConfiguredObjectRecord(virtualHostId);
+
+ DurableConfigurationStore configStore = configStoreThatProduces(record);
+
+ String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : \"%s\"}",
+ TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+ "vhFromBlueprint");
+ Map<String, String> context = Collections.singletonMap(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+
+ Map<String, Object> nodeAttributes = new HashMap<>();
+ nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+ nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+ nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+ VirtualHostNode<?> node = new TestVirtualHostNode(_broker, nodeAttributes, configStore);
+ node.open();
+ node.start();
+
+ VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+ assertNotNull("Virtual host should be recovered", virtualHost);
+ assertEquals("Unexpected virtual host name", TEST_VIRTUAL_HOST_NAME, virtualHost.getName());
+ assertEquals("Unexpected virtual host state", State.ACTIVE, virtualHost.getState());
+ assertEquals("Unexpected virtual host id", virtualHostId, virtualHost.getId());
+ }
+
+ private ConfiguredObjectRecord createVirtualHostConfiguredObjectRecord(UUID virtualHostId)
+ {
+ Map<String, Object> virtualHostAttributes = new HashMap<>();
virtualHostAttributes.put(VirtualHost.NAME, TEST_VIRTUAL_HOST_NAME);
virtualHostAttributes.put(VirtualHost.TYPE, TestMemoryVirtualHost.VIRTUAL_HOST_TYPE);
virtualHostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
@@ -153,4 +246,26 @@ public class AbstractStandardVirtualHostNodeTest extends QpidTestCase
when(record.getType()).thenReturn(VirtualHost.class.getSimpleName());
return record;
}
+
+ private NullMessageStore configStoreThatProduces(final ConfiguredObjectRecord record)
+ {
+ return new NullMessageStore(){
+
+ @Override
+ public void visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws StoreException
+ {
+ handler.begin();
+ if (record != null)
+ {
+ handler.handle(record);
+ }
+ handler.end();
+ }
+ };
+ }
+ private NullMessageStore configStoreThatProducesNoRecords()
+ {
+ return configStoreThatProduces(null);
+ }
+
}