/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.inventory;
import java.util.List;
import java.util.Random;
import javax.persistence.Query;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext;
import org.rhq.core.domain.drift.DriftDefinition;
import org.rhq.core.domain.drift.DriftDefinition.BaseDirectory;
import org.rhq.core.domain.drift.DriftDefinitionTemplate;
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.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* Test to see that uninventorying works.
*/
@Test
public class UninventoryTest extends AbstractEJB3Test {
private Resource newResource;
@Override
protected void beforeMethod() throws Exception {
prepareForTestAgents();
}
@Override
protected void afterMethod() throws Exception {
try {
if (newResource != null) {
deleteNewResource(newResource);
newResource = null;
}
} finally {
unprepareForTestAgents();
}
}
public void testDriftDefRemoval() throws Exception {
ResourceTypeCreator rtCreator = new ResourceTypeCreator() {
public void modifyResourceTypeToPersist(ResourceType resourceType) {
DriftDefinitionTemplate template = new DriftDefinitionTemplate();
template.setName("drift1");
template.setDescription("drift def template");
Configuration config = new Configuration();
DriftDefinition driftDef = new DriftDefinition(config);
driftDef.setBasedir(new BaseDirectory(BaseDirValueContext.fileSystem, "/"));
driftDef.setName("drift1");
template.setTemplateDefinition(driftDef);
resourceType.addDriftDefinitionTemplate(template);
}
};
ResourceCreator rCreator = new ResourceCreator() {
public void modifyResourceToPersist(Resource resource) {
Configuration config = new Configuration();
DriftDefinition driftDef = new DriftDefinition(config);
driftDef.setBasedir(new BaseDirectory(BaseDirValueContext.fileSystem, "/boo"));
driftDef.setName("drift-def-name");
resource.addDriftDefinition(driftDef);
}
};
Resource resource = createNewResource(rtCreator, rCreator);
int templateId = resource.getResourceType().getDriftDefinitionTemplates().iterator().next().getId();
int driftDefId = resource.getDriftDefinitions().iterator().next().getId();
// sanity check, make sure things are in the DB now
Query qTemplate;
Query qDef;
String qTemplateString = "select t from DriftDefinitionTemplate t where t.id = :id";
String qDefString = "select dc from DriftDefinition dc where dc.id = :id";
getTransactionManager().begin();
try {
qTemplate = getEntityManager().createQuery(qTemplateString).setParameter("id", templateId);
qDef = getEntityManager().createQuery(qDefString).setParameter("id", driftDefId);
assertEquals("drift template didn't get added", 1, qTemplate.getResultList().size());
assertEquals("drift template def didn't get added", 1, qDef.getResultList().size());
} finally {
getTransactionManager().commit();
}
// uninventory the resource
deleteNewResource(resource);
// make sure things purged
getTransactionManager().begin();
try {
qTemplate = getEntityManager().createQuery(qTemplateString).setParameter("id", templateId);
qDef = getEntityManager().createQuery(qDefString).setParameter("id", driftDefId);
assertEquals("drift template didn't get purged", 0, qTemplate.getResultList().size());
assertEquals("drift template def didn't get purged", 0, qDef.getResultList().size());
} finally {
getTransactionManager().commit();
}
}
private Resource createNewResource(ResourceTypeCreator rtCreator, ResourceCreator rCreator) throws Exception {
getTransactionManager().begin();
Resource resource;
try {
ResourceType resourceType = new ResourceType("plat" + System.currentTimeMillis(), "test",
ResourceCategory.PLATFORM, null);
if (rtCreator != null) {
rtCreator.modifyResourceTypeToPersist(resourceType);
}
em.persist(resourceType);
Agent agent = new Agent("testagent", "testaddress", 1, "", "testtoken");
em.persist(agent);
em.flush();
resource = new Resource("reskey" + System.currentTimeMillis(), "resname", resourceType);
resource.setUuid("" + new Random().nextInt());
resource.setAgent(agent);
resource.setInventoryStatus(InventoryStatus.COMMITTED);
if (rCreator != null) {
rCreator.modifyResourceToPersist(resource);
}
em.persist(resource);
} catch (Exception e) {
System.out.println("CANNOT PREPARE TEST: " + e);
getTransactionManager().rollback();
throw e;
}
em.flush();
getTransactionManager().commit();
newResource = resource;
return resource;
}
private void deleteNewResource(Resource resource) throws Exception {
if (null != resource) {
try {
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
// invoke bulk delete on the resource to remove any dependencies not defined in the hibernate entity model
// perform in-band and out-of-band work in quick succession
Subject overlord = LookupUtil.getSubjectManager().getOverlord();
List<Integer> deletedIds = resourceManager.uninventoryResource(overlord, resource.getId());
for (Integer deletedResourceId : deletedIds) {
resourceManager.uninventoryResourceAsyncWork(overlord, deletedResourceId);
}
// now dispose of other hibernate entities
getTransactionManager().begin();
em = getEntityManager();
ResourceType type = em.find(ResourceType.class, resource.getResourceType().getId());
Agent agent = em.find(Agent.class, resource.getAgent().getId());
if (null != agent) {
em.remove(agent);
}
if (null != type) {
em.remove(type);
}
getTransactionManager().commit();
} catch (Exception e) {
try {
System.out.println("CANNOT CLEAN UP TEST (" + this.getClass().getSimpleName() + ") Cause: " + e);
getTransactionManager().rollback();
} catch (Exception ignore) {
}
}
}
}
private interface ResourceTypeCreator {
void modifyResourceTypeToPersist(ResourceType resourceType);
}
private interface ResourceCreator {
void modifyResourceToPersist(Resource resource);
}
}