modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
| 85 +++++++++-
1 file changed, 77 insertions(+), 8 deletions(-)
New commits:
commit c815a908dfd4c982c0f63d9a05d9244c7dea6dba
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Oct 28 15:07:18 2010 -0400
Test that resources of removed types get deleted
diff --git
a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
index 3500b87..584683c 100644
---
a/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
+++
b/modules/enterprise/server/jar/src/test/groovy/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.groovy
@@ -16,6 +16,9 @@ import org.rhq.core.domain.criteria.ResourceTypeCriteria
import org.rhq.core.domain.criteria.OperationDefinitionCriteria
import org.testng.annotations.AfterClass
import org.hibernate.Session
+import org.rhq.core.domain.shared.ResourceBuilder
+import org.rhq.core.domain.criteria.ResourceCriteria
+import org.rhq.core.domain.resource.InventoryStatus
class ResourceMetadataManagerBeanTest extends AbstractEJB3Test {
@@ -23,14 +26,14 @@ class ResourceMetadataManagerBeanTest extends AbstractEJB3Test {
@AfterClass
void removePluginsFromDB() {
- transactionManager.begin()
- // using direct hibernate query here because JPA 1.0 lacks support for the IN clause
- // where you can directly specify a collection for the parameter value used in an IN
- // clause
- Session session = entityManager.getDelegate()
- session.createQuery("delete from Plugin p where p.name in
(:plugins)").setParameterList("plugins", plugins)
- .executeUpdate()
- transactionManager.commit()
+ transaction {
+ // using direct hibernate query here because JPA 1.0 lacks support for the IN
clause
+ // where you can directly specify a collection for the parameter value used in an
IN
+ // clause
+ Session session = entityManager.getDelegate()
+ session.createQuery("delete from Plugin p where p.name in
(:plugins)").setParameterList("plugins", plugins)
+ .executeUpdate()
+ }
}
@Test(groups = ['NewPlugin'])
@@ -308,6 +311,8 @@ class ResourceMetadataManagerBeanTest extends AbstractEJB3Test {
createPlugin 'remove-types-plugin', '1.0', originalDescriptor
+ createResources(3, 'RemoveTypesPlugin', 'ServerC')
+
def updatedDescriptor = """
<plugin name="RemoveTypesPlugin" displayName="Remove Types
Plugin" package="org.rhq.plugins.test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -322,6 +327,31 @@ class ResourceMetadataManagerBeanTest extends AbstractEJB3Test {
createPlugin 'remove-types-plugin', '2.0', updatedDescriptor
}
+ def createResources(Integer count, String pluginName, String resourceTypeName) {
+ def resourceTypeMgr = LookupUtil.resourceTypeManager
+ def resourceType = resourceTypeMgr.getResourceTypeByNameAndPlugin(resourceTypeName,
pluginName)
+
+ assertNotNull(
+ "Cannot create resources. Unable to find resource type for [name:
$resourceTypeName, plugin: $pluginName]",
+ resourceType
+ )
+
+ def resources = []
+ count.times {
+ resources << new ResourceBuilder()
+ .createServer()
+ .withResourceType(resourceType)
+ .withName("${resourceType.name}-$it")
+ .withUuid("$resourceType.name:")
+ .withRandomResourceKey("${resourceType.name}-$it")
+ .build()
+ }
+
+ transaction {
+ resources.each { resource -> entityManager.persist(resource) }
+ }
+ }
+
@Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups =
['RemoveTypes'])
void deleteOperationDefsForRemovedType() {
def operationMgr = LookupUtil.operationManager
@@ -393,6 +423,45 @@ class ResourceMetadataManagerBeanTest extends AbstractEJB3Test {
assertEquals "The subcategories should have been deleted", 0,
subcategories.size()
}
+ @Test(dependsOnMethods = ['upgradePluginWithTypesRemoved'], groups =
['RemoveTypes'])
+ void deleteResources() {
+ def resourceMgr = LookupUtil.resourceManager
+ def subjectMgr = LookupUtil.subjectManager
+
+ def criteria = new ResourceCriteria()
+ criteria.addFilterResourceTypeName 'ServerC'
+ criteria.addFilterPluginName 'RemoveTypesPlugin'
+
+ def resources = resourceMgr.findResourcesByCriteria(subjectMgr.overlord, criteria)
+
+ assertTrue(
+ "Did not expect to find any more that three resources. Database might need
to be reset",
+ resources.size() < 4
+ )
+
+ // We won't do anything more rigorous that making sure the resources were marked
uninventoried.
+ // Resource deletion is an expensive, time-consuming process; consequently, it is
carried out
+ // asynchronously in a scheduled job. The call to initiate the resource deletion
returns very
+ // quickly as it is basically just updates the the inventory status to UNINVENTORIED
for the
+ // resources to be deleted.
+ resources.each {
+ assertEquals(
+ "The resource should have been marked for deletion",
+ InventoryStatus.UNINVENTORIED == it.inventoryStatus
+ )
+ }
+ }
+
+ def transaction(work) {
+ try {
+ transactionManager.begin()
+ work()
+ transactionManager.commit()
+ } catch (Throwable t) {
+ transactionManager.rollback()
+ }
+ }
+
/**
* This method creates the plugin-related artifacts that are need to call
* ResourceMetadataManager.registerPlugin. It creates the PluginDescriptor object, and