/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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 as published by
* the Free Software Foundation version 2 of the License.
*
* 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.pc.upgrade;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.Set;
import org.jmock.Expectations;
import org.rhq.core.clientapi.server.discovery.InvalidInventoryReportException;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceErrorType;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.ServerServices;
import org.rhq.core.pc.inventory.InventoryManager;
import org.rhq.core.pc.inventory.ResourceContainer;
/**
* An abstract base class for Resource upgrade handling tests.
*
* @author Lukas Krejci
*/
public abstract class AbstractResourceUpgradeHandlingTest extends ResourceUpgradeTestBase {
private static final String UPGRADED_RESOURCE_KEY_PREFIX = "UPGRADED";
@SuppressWarnings("unchecked")
protected void defineDefaultExpectations(FakeServerInventory inventory, Expectations expectations) {
super.defineDefaultExpectations(inventory, expectations);
try {
ServerServices ss = pluginContainerConfiguration.getServerServices();
expectations.allowing(ss.getDiscoveryServerService()).mergeInventoryReport(
expectations.with(Expectations.any(InventoryReport.class)));
expectations.will(inventory.mergeInventoryReport(InventoryStatus.COMMITTED));
expectations.allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(
expectations.with(Expectations.any(Integer.class)));
expectations.will(inventory.getResourceSyncInfo());
expectations.allowing(ss.getDiscoveryServerService()).upgradeResources(
expectations.with(Expectations.any(Set.class)));
expectations.will(inventory.upgradeResources());
} catch (InvalidInventoryReportException e) {
//this is not going to happen because we're mocking the invocation
}
}
protected Resource findResourceWithOrdinal(ResType resType, int ordinal) {
ResourceType resourceType = PluginContainer.getInstance().getPluginManager().getMetadataManager()
.getType(resType.getResourceTypeName(), resType.getResourceTypePluginName());
InventoryManager inventoryManager = PluginContainer.getInstance().getInventoryManager();
Set<Resource> resources = inventoryManager.getResourcesWithType(resourceType);
return findResourceWithOrdinal(resources, ordinal);
}
protected Resource findResourceWithOrdinal(Set<Resource> resources, int ordinal) {
for (Resource r : resources) {
Configuration pluginConfig = r.getPluginConfiguration();
String ordinalString = pluginConfig.getSimpleValue("ordinal", null);
if (ordinalString != null && Integer.parseInt(ordinalString) == ordinal) {
return r;
}
}
return null;
}
protected static void checkResourcesUpgraded(Set<Resource> resources, int expectedSize) {
assertEquals(resources.size(), expectedSize, "The set of resources has unexpected size.");
for (Resource res : resources) {
assertTrue(res.getResourceKey().startsWith(UPGRADED_RESOURCE_KEY_PREFIX), "Resource " + res
+ " doesn't seem to be upgraded even though it should.");
ResourceContainer rc = PluginContainer.getInstance().getInventoryManager().getResourceContainer(res);
assertEquals(rc.getResourceComponentState(), ResourceContainer.ResourceComponentState.STARTED,
"A resource that successfully upgraded should be started.");
}
}
protected static void checkResourcesNotUpgraded(Set<Resource> resources, int expectedSize) {
assertEquals(resources.size(), expectedSize, "The set of resources has unexpected size.");
for(Resource res : resources) {
assertFalse(res.getResourceKey().startsWith(UPGRADED_RESOURCE_KEY_PREFIX), "Resource " + res
+ " seems to be upgraded even though it shouldn't.");
InventoryManager im = PluginContainer.getInstance().getInventoryManager();
ResourceContainer rc = im.getResourceContainer(res);
assertEquals(rc.getResourceComponentState(), ResourceContainer.ResourceComponentState.STOPPED,
"A resource that has not been upgraded due to upgrade error in parent should be stopped.");
//recurse, since the whole subtree under the failed resource should be not upgraded and stopped.
Set<Resource> children = im.getContainerChildren(res, rc);
checkResourcesNotUpgraded(children, children.size());
}
}
protected static void checkResourceFailedUpgrade(Resource resource) {
assertFalse(resource.getResourceKey().startsWith(UPGRADED_RESOURCE_KEY_PREFIX), "Resource " + resource
+ " seems to be upgraded even though it shouldn't.");
assertTrue(resource.getResourceErrors(ResourceErrorType.UPGRADE).size() == 1,
"The failed resource should have an error associated with it.");
ResourceContainer rc = PluginContainer.getInstance().getInventoryManager().getResourceContainer(resource);
assertEquals(rc.getResourceComponentState(), ResourceContainer.ResourceComponentState.STOPPED,
"A resource that failed to upgrade should be stopped.");
}
}