/* * Jopr Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.plugins.jbossas5.test.sbm; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import org.rhq.core.clientapi.agent.inventory.CreateResourceRequest; import org.rhq.core.clientapi.agent.inventory.CreateResourceResponse; import org.rhq.core.clientapi.agent.inventory.DeleteResourceRequest; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.resource.CreateResourceStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.pc.PluginContainer; import org.rhq.core.pc.inventory.ResourceFactoryManager; import org.rhq.core.pluginapi.operation.OperationResult; import org.rhq.plugins.jbossas5.test.util.AppServerUtils; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; /** * * @author Lukas Krejci */ @Test(groups = {"as5.plugin", "as5.plugin.sbm"}) public class ServiceBindingSetResourceTest extends AbstractServiceBindingTest { private static final String NEW_BINDING_SET_NAME = "as5.plugin.test-binding-set"; private static final String NEW_BINDING_DEFAULT_HOST_NAME = "localhost"; private static final int NEW_BINDING_SET_PORT_OFFSET = 333; private static final String NEW_BINDING_SET_NEW_OVERRIDE_SERVICE_NAME = "as5.plugin.override-service-name"; private static final String NEW_BINDING_SET_NEW_OVERRIDE_BINDING_NAME = "as5.plugin.override-binding-name"; private static final int NEW_BINDING_SET_NEW_OVERRIDE_PORT = 45673; private static final String NEW_BINDING_SET_NEW_OVERRIDE_HOSTNAME = "somewhere-over-the-rainbow"; private static final String NEW_BINDING_SET_NEW_OVERRIDE_DESCRIPTION = "a testing override"; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_SERVICE_NAME = "jboss:service=HAJNDI"; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_BINDING_NAME = "Port"; private static final int NEW_BINDING_SET_STANDARD_OVERRIDE_PORT = 1200; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_HOSTNAME = null; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_DESCRIPTION = "An overriden standard binding"; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_SERVICE_NAME_FIXED = "FixedServiceTest"; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_BINDING_NAME_FIXED = "Port"; private static final int NEW_BINDING_SET_STANDARD_OVERRIDE_PORT_FIXED = 45879; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_HOSTNAME_FIXED = "localhost"; private static final String NEW_BINDING_SET_STANDARD_OVERRIDE_DESCRIPTION_FIXED = "A fixed standard binding"; @BeforeTest public void setup() throws Exception { saveConfiguration(); //create a fixed-port, fixed-hostname standard binding that we can test overrides with Configuration sbmConfig = loadResourceConfiguration(getSBMResource()); PropertyList bindings = sbmConfig.getList("standardBindings"); PropertyMap newBinding = new PropertyMap("binding"); bindings.add(newBinding); newBinding.put(new PropertySimple("serviceName", NEW_BINDING_SET_STANDARD_OVERRIDE_SERVICE_NAME_FIXED)); newBinding.put(new PropertySimple("bindingName", NEW_BINDING_SET_STANDARD_OVERRIDE_BINDING_NAME_FIXED)); newBinding.put(new PropertySimple("port", NEW_BINDING_SET_STANDARD_OVERRIDE_PORT_FIXED)); newBinding.put(new PropertySimple("hostName", NEW_BINDING_SET_STANDARD_OVERRIDE_HOSTNAME_FIXED)); newBinding.put(new PropertySimple("description", NEW_BINDING_SET_STANDARD_OVERRIDE_DESCRIPTION_FIXED)); newBinding.put(new PropertySimple("fixedPort", true)); newBinding.put(new PropertySimple("fixedHostName", true)); updateResourceConfiguration(getSBMResource(), sbmConfig); } protected String getResourceTypeName() { return SERVICE_BINDING_SET_SERVICE_NAME; } public void testMetrics() throws Exception { super.testMetrics(); } @Test(dependsOnMethods = "testCreateServiceBindingSet") public void testSBMOperations() throws Exception { super.testOperations(); } public void testCreateServiceBindingSet() throws Exception { Configuration bindingSetConfiguration = new Configuration(); bindingSetConfiguration.put(new PropertySimple("name", NEW_BINDING_SET_NAME)); bindingSetConfiguration.put(new PropertySimple("defaultHostName", NEW_BINDING_DEFAULT_HOST_NAME)); bindingSetConfiguration.put(new PropertySimple("portOffset", NEW_BINDING_SET_PORT_OFFSET)); bindingSetConfiguration.put(createOverrideBindings()); Resource sbmResource = getSBMResource(); ResourceFactoryManager resourceFactory = PluginContainer.getInstance().getResourceFactoryManager(); CreateResourceRequest request = new CreateResourceRequest(); request.setPluginName(getPluginName()); request.setParentResourceId(sbmResource.getId()); request.setResourceConfiguration(bindingSetConfiguration); request.setResourceName(NEW_BINDING_SET_NAME); request.setResourceTypeName(getResourceTypeName()); CreateResourceResponse response = resourceFactory.executeCreateResourceImmediately(request); assertEquals(response.getStatus(), CreateResourceStatus.SUCCESS, "Failed to create a new binding set. Error message: " + response.getErrorMessage()); //check that the binding set stays there after the restart AppServerUtils.restartServer(); Resource bindingSetAfterRestart = getBindingSet(NEW_BINDING_SET_NAME); assertNotNull(bindingSetAfterRestart, "The newly created binding wasn't persisted across the server restart."); Configuration configAfterRestart = loadResourceConfiguration(bindingSetAfterRestart); //check that the config was properly persisted assertEquals(configAfterRestart.getSimpleValue("name", null), NEW_BINDING_SET_NAME, "Name not persisted across restart."); assertEquals(configAfterRestart.getSimpleValue("defaultHostName", null), NEW_BINDING_DEFAULT_HOST_NAME, "Default host name not persisted across restart."); assertEquals(configAfterRestart.getSimple("portOffset").getIntegerValue(), Integer.valueOf(NEW_BINDING_SET_PORT_OFFSET), "Port offset not persisted across restart."); assertEquals(configAfterRestart.get("overrideBindings"), getExpectedOverrideBindings(), "Override bindings not persisted across restart."); } @Test(dependsOnMethods = "testPortOffsetChange") //so that we delete the newly created binding set after we reused it public void testDeleteServiceBindingSet() throws Exception { Resource bindingSetToDelete = getBindingSet(NEW_BINDING_SET_NAME); assertNotNull(bindingSetToDelete, "Could not find a binding set to delete"); ResourceFactoryManager resourceFactory = PluginContainer.getInstance().getResourceFactoryManager(); resourceFactory.executeDeleteResourceImmediately(new DeleteResourceRequest(0, bindingSetToDelete.getId())); assertNull(getBindingSet(NEW_BINDING_SET_NAME), "Failed to delete the binding set."); //check that the delete is permanent AppServerUtils.restartServer(); assertNull(getBindingSet(NEW_BINDING_SET_NAME), "Failed to delete the binding set - it reappeared afer restart."); } @Test(dependsOnMethods = "testSBMOperations") //so that we can fiddle with the binding set after the display bindings op has been checked public void testPortOffsetChange() throws Exception { Resource bindingSet = getBindingSet(NEW_BINDING_SET_NAME); assertNotNull(bindingSet, "Could not find a binding set to change the port offset of."); Configuration config = loadResourceConfiguration(bindingSet); int newOffset = config.getSimple("portOffset").getIntegerValue() + 100; config.put(new PropertySimple("portOffset", newOffset)); updateResourceConfiguration(bindingSet, config); Resource updatedBindingSet = getBindingSet(NEW_BINDING_SET_NAME); assertNotNull(updatedBindingSet, "Could not find the binding set after changing port offset."); //Check the change is persisted across the restart AppServerUtils.restartServer(); Resource bindingSetAfterRestart = getBindingSet(NEW_BINDING_SET_NAME); assertNotNull(bindingSetAfterRestart, "The change of the port offset didn't survive the restart."); Configuration configAfterRestart = loadResourceConfiguration(bindingSetAfterRestart); int offsetAfterRestart = configAfterRestart.getSimple("portOffset").getIntegerValue(); assertEquals(offsetAfterRestart, newOffset, "Unexpected port offset after server restart."); } @AfterTest @Override public void restoreConfiguration() { super.restoreConfiguration(); } protected void validateOperationResult(String name, OperationResult result, Resource resource) { if ("displayBindings".equals(name) && NEW_BINDING_SET_NAME.equals(resource.getName())) { try { Configuration bindingConfiguration = loadResourceConfiguration(resource); Configuration results = result.getComplexResults(); Configuration sbmConfiguration = loadResourceConfiguration(getSBMResource()); int portOffset = bindingConfiguration.getSimple("portOffset").getIntegerValue(); String defaultHostName = bindingConfiguration.getSimpleValue("defaultHostName", null); PropertyList resultingBindings = results.getList("resultingBindings"); PropertyList overrideBindings = bindingConfiguration.getList("overrideBindings"); //go through the standard bindings to see if the results conform for(Property p : sbmConfiguration.getList("standardBindings").getList()) { PropertyMap standardBinding = (PropertyMap) p; String standardBindingServiceName = standardBinding.getSimpleValue("serviceName", null); String standardBindingBindingName = standardBinding.getSimpleValue("bindingName", null); PropertyMap resultingBinding = findBinding(resultingBindings, standardBindingServiceName, standardBindingBindingName); PropertyMap overrideBinding = findBinding(overrideBindings, standardBindingServiceName, standardBindingBindingName); //The rules are as follows: //ResPort = fixedPort ? standardPort : (overrideExists ? overridePort : standardPort + portOffset) //ResHostName = fixedHostName ? standardHostname : (overrideExists ? (overrideHostName == null ? defaultHostName : overrideHostName) : defaultHostName) PropertySimple fixedPortProp = standardBinding.getSimple("fixedPort"); PropertySimple fixedHostNameProp = standardBinding.getSimple("fixedHostName"); boolean isFixedPort = fixedPortProp == null ? false : fixedPortProp.getBooleanValue(); boolean isFixedHostName = fixedHostNameProp == null ? false : fixedHostNameProp.getBooleanValue(); int standardBindingPort = standardBinding.getSimple("port").getIntegerValue(); String standardBindingHostName = standardBinding.getSimpleValue("hostName", null); int resultingPort = resultingBinding.getSimple("port").getIntegerValue(); String resultingHostName = resultingBinding.getSimpleValue("hostName", null); String standardFQN = standardBinding.getSimpleValue("fullyQualifiedName", null); String resultingFQN = resultingBinding.getSimpleValue("fullyQualifiedName", null); assertEquals(resultingFQN, standardFQN); if (overrideBinding == null) { int expectedPort = standardBindingPort + (isFixedPort ? 0 : portOffset); String expectedHostName = isFixedHostName ? standardBindingHostName : defaultHostName; assertEquals(resultingPort, expectedPort); assertEquals(resultingHostName, expectedHostName); String standardDescription = standardBinding.getSimpleValue("description", null); String resultingDescription = resultingBinding.getSimpleValue("description", null); assertEquals(resultingDescription, standardDescription); } else { int overridePort = overrideBinding.getSimple("port").getIntegerValue(); String overrideHostName = overrideBinding.getSimpleValue("hostName", null); int expectedPort = isFixedPort ? standardBindingPort : overridePort; String expectedHostName = isFixedHostName ? standardBindingHostName : (overrideHostName == null ? defaultHostName : overrideHostName); assertEquals(resultingPort, expectedPort); assertEquals(resultingHostName, expectedHostName); String overrideDescription = overrideBinding.getSimpleValue("description", null); String resultingDescription = resultingBinding.getSimpleValue("description", null); assertEquals(resultingDescription, overrideDescription); } } } catch (Exception e) { fail("Failed to check operation results.", e); } } else { super.validateOperationResult(name, result, resource); } } private PropertyList createOverrideBindings() { PropertyList bindings = new PropertyList("overrideBindings"); //create the new override PropertyMap newOverride = new PropertyMap("binding"); bindings.add(newOverride); newOverride.put(new PropertySimple("serviceName", NEW_BINDING_SET_NEW_OVERRIDE_SERVICE_NAME)); newOverride.put(new PropertySimple("bindingName", NEW_BINDING_SET_NEW_OVERRIDE_BINDING_NAME)); newOverride.put(new PropertySimple("port", NEW_BINDING_SET_NEW_OVERRIDE_PORT)); newOverride.put(new PropertySimple("hostName", NEW_BINDING_SET_NEW_OVERRIDE_HOSTNAME)); newOverride.put(new PropertySimple("description", NEW_BINDING_SET_NEW_OVERRIDE_DESCRIPTION)); //create the standard override PropertyMap standardOverride = new PropertyMap("binding"); bindings.add(standardOverride); standardOverride.put(new PropertySimple("serviceName", NEW_BINDING_SET_STANDARD_OVERRIDE_SERVICE_NAME)); standardOverride.put(new PropertySimple("bindingName", NEW_BINDING_SET_STANDARD_OVERRIDE_BINDING_NAME)); standardOverride.put(new PropertySimple("port", NEW_BINDING_SET_STANDARD_OVERRIDE_PORT)); standardOverride.put(new PropertySimple("hostName", NEW_BINDING_SET_STANDARD_OVERRIDE_HOSTNAME)); standardOverride.put(new PropertySimple("description", NEW_BINDING_SET_STANDARD_OVERRIDE_DESCRIPTION)); PropertyMap standardOverride2 = new PropertyMap("binding"); bindings.add(standardOverride2); standardOverride2.put(new PropertySimple("serviceName", NEW_BINDING_SET_STANDARD_OVERRIDE_SERVICE_NAME_FIXED)); standardOverride2.put(new PropertySimple("bindingName", NEW_BINDING_SET_STANDARD_OVERRIDE_BINDING_NAME_FIXED)); standardOverride2.put(new PropertySimple("port", NEW_BINDING_SET_STANDARD_OVERRIDE_PORT_FIXED)); standardOverride2.put(new PropertySimple("hostName", NEW_BINDING_SET_STANDARD_OVERRIDE_HOSTNAME_FIXED)); standardOverride2.put(new PropertySimple("description", NEW_BINDING_SET_STANDARD_OVERRIDE_DESCRIPTION_FIXED)); return bindings; } private PropertyList getExpectedOverrideBindings() { PropertyList bindings = createOverrideBindings(); //we must add the "fullyQualifiedName" to the bindings because //that's what the plugin should fill in automatically for(Property p : bindings.getList()) { PropertyMap binding = (PropertyMap) p; String serviceName = binding.getSimpleValue("serviceName", null); String bindingName = binding.getSimpleValue("bindingName", null); String fullyQualifiedName = serviceName; if (bindingName != null) { fullyQualifiedName += ":" + bindingName; } binding.put(new PropertySimple("fullyQualifiedName", fullyQualifiedName)); } return bindings; } private Resource getBindingSet(String name) throws Exception { for(Resource r : getResources()) { Configuration config = loadResourceConfiguration(r); if (name.equals(config.getSimpleValue("name", null))) { return r; } } return null; } }