/*
* RHQ Management Platform
* Copyright (C) 2005-2011 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.io.File;
import java.util.Set;
import org.jmock.Expectations;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
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;
import org.rhq.core.pc.inventory.ResourceContainer.ResourceComponentState;
import org.rhq.test.pc.PluginContainerSetup;
import org.rhq.test.pc.PluginContainerTest;
/**
*
*
* @author Lukas Krejci
*/
@Test
public class ResourceUpgradeTest extends ResourceUpgradeTestBase {
private static final String INCLUDE_UNCOMMITTED_RESOURCES_TEST = "includeUncommittedResources";
private static final String UPGRADE_DATA_TEST = "upgradeData";
private static final String INVENTORY_REINITIALIZATION_FROM_SERVER_DURING_UPGRADE_TEST = "inventoryReinitializationFromServerDuringUpgrade";
private static final String SKIP_UPGRADE_WHEN_SERVER_UNAVAILABLE_TEST = "skipUpgradeWhenServerUnavailable";
private static final String UPGRADE_WITH_PLATFORM_DELETED_ON_SERVER_TEST = "upgradeWithPlatformDeletedOnServer";
private static final String UPGRADE_FAILURE_HANDLING = "upgradeFailureHandling";
private static final String PLUGIN_V1_FILENAME = "classpath:///resource-upgrade-test-plugin-1.0.0.jar";
private static final String PLUGIN_V2_FILENAME = "classpath:///resource-upgrade-test-plugin-2.0.0.jar";
private static final String FAILING_PLUGIN_FILE_NAME = "classpath:///resource-upgrade-test-plugin-3.0.0.jar";
private static final String SINGLETON_RESOURCE_TYPE_NAME = "Resource";
private static final String SINGLETON_RESOURCE_TYPE_PLUGIN_NAME = "ResourceUpgradeTest";
private static final ResType SINGLETON_TYPE = new ResType(SINGLETON_RESOURCE_TYPE_NAME,
SINGLETON_RESOURCE_TYPE_PLUGIN_NAME);
@AfterSuite
public void cleanAfterPluginContainers() throws Exception {
PluginContainerTest.clearStorage();
}
@Test
@PluginContainerSetup(plugins = { PLUGIN_V1_FILENAME }, sharedGroup = INCLUDE_UNCOMMITTED_RESOURCES_TEST, clearDataDir = true)
public void testIncludeUncommittedResources_V1() throws Exception {
initialSyncAndDiscovery(INCLUDE_UNCOMMITTED_RESOURCES_TEST, InventoryStatus.NEW);
}
@Test(dependsOnMethods = { "testIncludeUncommittedResources_V1" })
@PluginContainerSetup(plugins = { PLUGIN_V2_FILENAME }, sharedGroup = INCLUDE_UNCOMMITTED_RESOURCES_TEST, clearInventoryDat = false)
@SuppressWarnings("unchecked")
public void testIncludeUncommittedResources_V2() throws Exception {
final FakeServerInventory inv = (FakeServerInventory) PluginContainerTest
.getServerSideFake(INCLUDE_UNCOMMITTED_RESOURCES_TEST);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(inv, this);
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.mergeInventoryReport(InventoryStatus.COMMITTED));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(inv.getResourceSyncInfo());
oneOf(ss.getDiscoveryServerService()).upgradeResources(with(any(Set.class)));
will(inv.upgradeResources());
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> resources = getTestingResources(inv, SINGLETON_TYPE);
assertEquals(resources.size(), 1, "Expected single test resource but multiple found.");
Resource discoveredResource = resources.iterator().next();
assertEquals(discoveredResource.getResourceKey(), "resource-key-v2");
assertEquals(discoveredResource.getName(), "resource-name-v2");
assertEquals(discoveredResource.getDescription(), "resource-description-v2");
assertEquals(discoveredResource.getPluginConfiguration().getSimpleValue("test-property"), "test-property-v2");
checkUpgradeInactive();
}
@Test
@PluginContainerSetup(plugins = { PLUGIN_V1_FILENAME }, sharedGroup = UPGRADE_DATA_TEST, clearDataDir = true)
public void testUpgradeData_V1() throws Exception {
initialSyncAndDiscovery(UPGRADE_DATA_TEST, InventoryStatus.COMMITTED);
}
@Test(dependsOnMethods = "testUpgradeData_V1")
@PluginContainerSetup(plugins = { PLUGIN_V2_FILENAME }, sharedGroup = UPGRADE_DATA_TEST, clearInventoryDat = false)
public void testUpgradeData_V2() throws Exception {
upgradeTest(UPGRADE_DATA_TEST);
}
@Test
@PluginContainerSetup(plugins = { PLUGIN_V1_FILENAME }, sharedGroup = INVENTORY_REINITIALIZATION_FROM_SERVER_DURING_UPGRADE_TEST, clearDataDir = true)
public void testInventoryReinitializationFromServerDuringUpgrade_V1() throws Exception {
initialSyncAndDiscovery(INVENTORY_REINITIALIZATION_FROM_SERVER_DURING_UPGRADE_TEST, InventoryStatus.COMMITTED);
}
@Test(dependsOnMethods = "testInventoryReinitializationFromServerDuringUpgrade_V1")
@PluginContainerSetup(plugins = { PLUGIN_V2_FILENAME }, sharedGroup = INVENTORY_REINITIALIZATION_FROM_SERVER_DURING_UPGRADE_TEST, clearInventoryDat = false)
public void testInventoryReinitializationFromServerDuringUpgrade_V2() throws Exception {
upgradeTest(INVENTORY_REINITIALIZATION_FROM_SERVER_DURING_UPGRADE_TEST);
}
@Test
@PluginContainerSetup(plugins = { PLUGIN_V1_FILENAME }, sharedGroup = SKIP_UPGRADE_WHEN_SERVER_UNAVAILABLE_TEST, clearDataDir = true)
public void testSkipUpgradeWhenServerUnavailable_V1() throws Exception {
initialSyncAndDiscovery(SKIP_UPGRADE_WHEN_SERVER_UNAVAILABLE_TEST, InventoryStatus.COMMITTED);
}
@Test(dependsOnMethods = "testSkipUpgradeWhenServerUnavailable_V1")
@PluginContainerSetup(plugins = { PLUGIN_V2_FILENAME }, sharedGroup = SKIP_UPGRADE_WHEN_SERVER_UNAVAILABLE_TEST, clearInventoryDat = false)
@SuppressWarnings("unchecked")
public void testSkipUpgradeWhenServerUnavailable_V2() throws Exception {
final FakeServerInventory inv = (FakeServerInventory) PluginContainerTest
.getServerSideFake(SKIP_UPGRADE_WHEN_SERVER_UNAVAILABLE_TEST);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
inv.setFailing(true);
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(inv, this);
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.mergeInventoryReport(InventoryStatus.COMMITTED));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(inv.getResourceSyncInfo());
never(ss.getDiscoveryServerService()).upgradeResources(with(any(Set.class)));
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> discoveredResources = getTestingResources(inv, SINGLETON_TYPE);
assertEquals(discoveredResources.size(), 1, "Expected single test resource but multiple found.");
Resource discoveredResource = discoveredResources.iterator().next();
assertEquals(discoveredResource.getResourceKey(), "resource-key-v1");
assertEquals(discoveredResource.getName(), "resource-name-v1");
assertEquals(discoveredResource.getDescription(), "resource-description-v1");
assertEquals(discoveredResource.getPluginConfiguration().getSimpleValue("test-property"), "test-property-v1");
checkUpgradeInactive();
}
@Test
@PluginContainerSetup(plugins = { PLUGIN_V1_FILENAME }, sharedGroup = UPGRADE_WITH_PLATFORM_DELETED_ON_SERVER_TEST, clearDataDir = true)
public void testUpgradeWithPlatformDeletedOnServer_V1() throws Exception {
initialSyncAndDiscovery(UPGRADE_WITH_PLATFORM_DELETED_ON_SERVER_TEST, InventoryStatus.COMMITTED);
}
@Test(dependsOnMethods = "testUpgradeWithPlatformDeletedOnServer_V1")
@PluginContainerSetup(plugins = { PLUGIN_V2_FILENAME }, sharedGroup = UPGRADE_WITH_PLATFORM_DELETED_ON_SERVER_TEST, clearInventoryDat = false)
@SuppressWarnings("unchecked")
public void testUpgradeWithPlatformDeletedOnServer_V2() throws Exception {
final FakeServerInventory inv = (FakeServerInventory) PluginContainerTest
.getServerSideFake(UPGRADE_WITH_PLATFORM_DELETED_ON_SERVER_TEST);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(inv, this);
//the first merge will be triggered from within the upgrade process and we are
//going to report null sync.
oneOf(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.clearPlatform());
//the rest of the inventory merges are executed by discoveries, so let's import the
//discovered stuff into the server-side inventory.
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.mergeInventoryReport(InventoryStatus.COMMITTED));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(inv.getResourceSyncInfo());
never(ss.getDiscoveryServerService()).upgradeResources(with(any(Set.class)));
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> discoveredResources = getTestingResources(inv, SINGLETON_TYPE);
assertEquals(discoveredResources.size(), 1, "Expected single test resource but multiple found.");
Resource discoveredResource = discoveredResources.iterator().next();
assertEquals(discoveredResource.getResourceKey(), "resource-key-v2");
assertEquals(discoveredResource.getName(), "resource-name-v2");
assertEquals(discoveredResource.getDescription(), "resource-description-v2");
assertEquals(discoveredResource.getPluginConfiguration().getSimpleValue("test-property"), "test-property-v2");
ResourceContainer container = PluginContainer.getInstance().getInventoryManager()
.getResourceContainer(discoveredResource);
File dataDir = container.getResourceContext().getDataDirectory();
File marker = new File(dataDir, "upgrade-succeeded");
assertFalse(marker.exists(),
"The upgrade seems to have occured even though there shouldn't have been a resource to upgrade.");
checkUpgradeInactive();
}
@Test
@PluginContainerSetup(plugins = PLUGIN_V1_FILENAME, sharedGroup = UPGRADE_FAILURE_HANDLING, clearDataDir = true)
public void testUpgradeFailureHandling_V1() throws Exception {
initialSyncAndDiscovery(UPGRADE_FAILURE_HANDLING, InventoryStatus.COMMITTED);
}
@Test(dependsOnMethods = "testUpgradeFailureHandling_V1")
@PluginContainerSetup(plugins = FAILING_PLUGIN_FILE_NAME, sharedGroup = UPGRADE_FAILURE_HANDLING, clearInventoryDat = false)
@SuppressWarnings("unchecked")
public void testUpgradeFailureHandling_V2() throws Exception {
final FakeServerInventory inv = (FakeServerInventory) PluginContainerTest
.getServerSideFake(UPGRADE_FAILURE_HANDLING);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(inv, this);
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.mergeInventoryReport(InventoryStatus.COMMITTED));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(inv.getResourceSyncInfo());
oneOf(ss.getDiscoveryServerService()).upgradeResources(with(any(Set.class)));
will(inv.upgradeResources());
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> resourceUpgradeTestResources = getTestingResources(inv, SINGLETON_TYPE);
Resource discoveredResource = resourceUpgradeTestResources.iterator().next();
assertTrue(discoveredResource.getResourceErrors().size() > 0,
"There should be upgrade errors persisted on the server side.");
//the discovery of the failed resource mustn't have run
ResourceContainer container = PluginContainer.getInstance().getInventoryManager()
.getResourceContainer(discoveredResource);
File dataDir = container.getResourceContext().getDataDirectory();
File marker = new File(dataDir, "failing-discovery-ran");
assertFalse(marker.exists(),
"The discovery of the resource type with a failed upgraded resource must not be executed but it was.");
checkUpgradeInactive();
}
private FakeServerInventory initialSyncAndDiscovery(String key, final InventoryStatus requiredInventoryStatus)
throws Exception {
final FakeServerInventory inv = new FakeServerInventory();
PluginContainerTest.setServerSideFake(key, inv);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(inv, this);
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(inv.mergeInventoryReport(requiredInventoryStatus));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(inv.getResourceSyncInfo());
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> resources = getTestingResources(inv, SINGLETON_TYPE);
assertEquals(resources.size(), 1, "Expected single test resource but multiple found.");
Resource discoveredResource = resources.iterator().next();
assertEquals(discoveredResource.getName(), "resource-name-v1");
assertEquals(discoveredResource.getDescription(), "resource-description-v1");
InventoryManager im = PluginContainer.getInstance().getInventoryManager();
ResourceContainer container = im.getResourceContainer(discoveredResource.getId());
if (discoveredResource.getInventoryStatus() == InventoryStatus.COMMITTED) {
assert container.getResourceComponentState() == ResourceComponentState.STARTED;
} else {
assert container.getResourceComponentState() == ResourceComponentState.STOPPED;
}
return inv;
}
@SuppressWarnings("unchecked")
private void upgradeTest(String key) throws Exception {
final FakeServerInventory serverInventory = (FakeServerInventory) PluginContainerTest.getServerSideFake(key);
final ServerServices ss = PluginContainerTest.getCurrentPluginContainerConfiguration().getServerServices();
PluginContainerTest.getCurrentMockContext().checking(new Expectations() {
{
defineDefaultExpectations(serverInventory, this);
allowing(ss.getDiscoveryServerService()).mergeInventoryReport(with(any(InventoryReport.class)));
will(serverInventory.mergeInventoryReport(InventoryStatus.COMMITTED));
allowing(ss.getDiscoveryServerService()).getResourceSyncInfo(with(any(Integer.class)));
will(serverInventory.getResourceSyncInfo());
oneOf(ss.getDiscoveryServerService()).upgradeResources(with(any(Set.class)));
will(serverInventory.upgradeResources());
}
});
PluginContainerTest.startConfiguredPluginContainer();
Set<Resource> discoveredResources = getTestingResources(serverInventory, SINGLETON_TYPE);
assertEquals(discoveredResources.size(), 1, "Expected single test resource but multiple found.");
Resource discoveredResource = discoveredResources.iterator().next();
assertEquals(discoveredResource.getResourceKey(), "resource-key-v2");
assertEquals(discoveredResource.getName(), "resource-name-v2");
assertEquals(discoveredResource.getDescription(), "resource-description-v2");
assertEquals(discoveredResource.getPluginConfiguration().getSimpleValue("test-property"), "test-property-v2");
ResourceContainer container = PluginContainer.getInstance().getInventoryManager()
.getResourceContainer(discoveredResource);
File dataDir = container.getResourceContext().getDataDirectory();
File marker = new File(dataDir, "upgrade-succeeded");
assertTrue(marker.exists(),
"The upgrade success marker file wasn't found. This means the upgrade didn't actually run.");
checkUpgradeInactive();
}
private void checkUpgradeInactive() {
InventoryManager im = PluginContainer.getInstance().getInventoryManager();
assertFalse(im.isResourceUpgradeActive(),
"Resource upgrade shouldn't be active once plugin container has initialized");
}
}