diff options
Diffstat (limited to 'qpid/java')
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); + } + } |
