/*
* RHQ Management Platform
* Copyright (C) 2005-2013 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.enterprise.server.resource.test;
import java.util.HashMap;
import java.util.Random;
import org.testng.annotations.Test;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.resource.ResourceNotFoundException;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.resource.metadata.test.UpdatePluginMetadataTestBase;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* Testing the deletion of agents and uninventoring their resources, if there are any.
* This is testing BZ 849711.
*/
@Test
public class UninventoryAndDeleteAgentTest extends UpdatePluginMetadataTestBase {
private AgentManagerLocal agentManager;
private ResourceGroupManagerLocal groupManager;
private ResourceGroup newGroup;
private ResourceType platformType;
@Override
protected void beforeMethod() throws Exception {
super.beforeMethod();
platformType = createPlatformResourceType();
groupManager = LookupUtil.getResourceGroupManager();
newGroup = createNewGroup();
agentManager = LookupUtil.getAgentManager();
}
@Override
protected void afterMethod() throws Exception {
if (newGroup != null) {
groupManager.deleteResourceGroup(getOverlord(), newGroup.getId());
}
cleanupResourceType(platformType.getName());
super.afterMethod();
}
public void testDeletingAgents() throws Exception {
// create three agents:
// 1) agent is the only thing registered - has no inventory yet
// 2) agent's platform is NEW, not yet committed to inventory yet (it is in the discovery queue)
// 3) agent's platform is COMMITTED in inventory
Agent agentRegistered = createOnlyAgent(1);
HashMap<Agent, Resource> agentPlatNew = createAgentWithResource(2, InventoryStatus.NEW);
HashMap<Agent, Resource> agentPlatCommitted = createAgentWithResource(3, InventoryStatus.COMMITTED);
Agent agentNew = agentPlatNew.keySet().iterator().next();
Agent agentCommitted = agentPlatCommitted.keySet().iterator().next();
// just for some complexity - we'll want to add our committed resource to a group
Resource committedResource = agentPlatCommitted.values().iterator().next();
groupManager.addResourcesToGroup(getOverlord(), newGroup.getId(), new int[] { committedResource.getId() });
// delete our agents
resourceManager.uninventoryAllResourcesByAgent(getOverlord(), agentRegistered);
resourceManager.uninventoryAllResourcesByAgent(getOverlord(), agentNew);
resourceManager.uninventoryAllResourcesByAgent(getOverlord(), agentCommitted);
assert null == agentManager.getAgentByID(agentRegistered.getId());
assert null == agentManager.getAgentByID(agentNew.getId());
assert null == agentManager.getAgentByID(agentCommitted.getId());
try {
Resource doomed = resourceManager.getResourceById(getOverlord(), committedResource.getId());
assert doomed.getAgent() == null : "Resource should not have an agent attached, it should have been uninventoried";
assert doomed.getInventoryStatus() == InventoryStatus.UNINVENTORIED : "Should have been uninventoried";
} catch (ResourceNotFoundException rnfe) {
// this could happen if the quartz job already purged the uninventoried resource; test is success if this happens
}
return;
}
private ResourceType createPlatformResourceType() throws Exception {
ResourceType resourceType;
getTransactionManager().begin();
try {
resourceType = new ResourceType("DeleteAgentTest-PlatType" + System.currentTimeMillis(), PLUGIN_NAME,
ResourceCategory.PLATFORM, null);
em.persist(resourceType);
} catch (Exception e) {
System.out.println("CANNOT PREPARE TEST: " + e);
getTransactionManager().rollback();
throw e;
}
getTransactionManager().commit();
return resourceType;
}
private Agent createOnlyAgent(int index) throws Exception {
Agent agent;
getTransactionManager().begin();
try {
agent = new Agent("DeleteAgentTest-Agent" + index, "testaddr", 16163 + index, "", "testtoken" + index);
em.persist(agent);
em.flush();
} catch (Exception e) {
System.out.println("CANNOT PREPARE TEST: " + e);
getTransactionManager().rollback();
throw e;
}
getTransactionManager().commit();
return agent;
}
private HashMap<Agent, Resource> createAgentWithResource(int index, InventoryStatus invStatus) throws Exception {
HashMap<Agent, Resource> ret = new HashMap<Agent, Resource>(1);
Agent agent = createOnlyAgent(index);
Resource resource;
getTransactionManager().begin();
try {
resource = new Resource("DeleteAgentTest-Res" + index, "DeleteAgentTest-Res" + index, platformType);
resource.setUuid("" + new Random().nextInt());
resource.setAgent(agent);
resource.setInventoryStatus(invStatus);
em.persist(resource);
} catch (Exception e) {
System.out.println("CANNOT PREPARE TEST: " + e);
getTransactionManager().rollback();
throw e;
}
getTransactionManager().commit();
ret.put(agent, resource);
return ret;
}
private ResourceGroup createNewGroup() {
ResourceGroup group = new ResourceGroup("DeleteAgentTest-Group");
groupManager.createResourceGroup(getOverlord(), group);
return group;
}
}