modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java | 40 +++++++++- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java | 25 +++--- 2 files changed, 49 insertions(+), 16 deletions(-)
New commits: commit 2b5f6f69c6a31e157fb7a76e7f0168a5ad974150 Author: John Mazzitelli mazz@redhat.com Date: Thu Mar 21 15:53:45 2013 -0400
BZ 535289 - the server will now return all ignored types in the result object from mergeinventoryreport. this way, the agent will know about all ignored types, not just the types of resources that were in the report
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java index 66d6d82..137e76f 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.java @@ -28,6 +28,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.sql.Connection; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Random; @@ -57,6 +58,7 @@ import org.rhq.core.clientapi.agent.discovery.DiscoveryAgentService; import org.rhq.core.clientapi.server.discovery.InventoryReport; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.discovery.MergeInventoryReportResults; +import org.rhq.core.domain.discovery.MergeInventoryReportResults.ResourceTypeFlyweight; import org.rhq.core.domain.discovery.MergeResourceResponse; import org.rhq.core.domain.discovery.ResourceSyncInfo; import org.rhq.core.domain.resource.Agent; @@ -332,8 +334,7 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { assert platformSyncInfo != null; assertNotNull(mergeResults.getIgnoredResourceTypes()); assertEquals(mergeResults.getIgnoredResourceTypes().size(), 1); - assertEquals(mergeResults.getIgnoredResourceTypes().iterator().next().getName(), serverType.getName()); - assertEquals(mergeResults.getIgnoredResourceTypes().iterator().next().getPlugin(), serverType.getPlugin()); + assert mergeResults.getIgnoredResourceTypes().contains(new ResourceTypeFlyweight(serverType));
// Check merge result - make sure we should not see any children under the platform (it should have been ignored) assertEquals(InventoryStatus.NEW, platformSyncInfo.getInventoryStatus()); @@ -341,6 +342,38 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { }
@Test(groups = "integration.ejb3") + public void testReturnAllIgnoredResourceTypes() throws Exception { + + // ignore the service types immediately + resourceTypeManager.setResourceTypeIgnoreFlagAndUninventoryResources(subjectManager.getOverlord(), + serviceType1.getId(), true); + resourceTypeManager.setResourceTypeIgnoreFlagAndUninventoryResources(subjectManager.getOverlord(), + serviceType2.getId(), true); + + // create an inventory report with just a platform and a server + InventoryReport inventoryReport = new InventoryReport(agent); + Resource platform = new Resource("platform", "platform", platformType); + platform.setUuid(String.valueOf(new Random().nextInt())); + Resource server = new Resource("server0", "server0", serverType); + server.setUuid(String.valueOf(new Random().nextInt())); + platform.addChildResource(server); + inventoryReport.addAddedRoot(platform); + + // Merge this inventory report + MergeInventoryReportResults mergeResults = discoveryBoss.mergeInventoryReport(serialize(inventoryReport)); + assert mergeResults != null; + ResourceSyncInfo platformSyncInfo = mergeResults.getResourceSyncInfo(); + assert platformSyncInfo != null; + + // now see that we were told about the service types being ignored (even though we had no resources of that type in the report) + Collection<ResourceTypeFlyweight> ignoredResourceTypes = mergeResults.getIgnoredResourceTypes(); + assertNotNull(ignoredResourceTypes); + assertEquals(ignoredResourceTypes.size(), 2); + assert ignoredResourceTypes.contains(new ResourceTypeFlyweight(serviceType1)); + assert ignoredResourceTypes.contains(new ResourceTypeFlyweight(serviceType2)); + } + + @Test(groups = "integration.ejb3") public void testIgnoreResourceTypeAndUninventoryResources() throws Exception {
// First create an inventory report for a new platform with servers - nothing is ignored yet @@ -402,8 +435,7 @@ public class DiscoveryBossBeanTest extends AbstractEJB3Test { assert platformSyncInfo != null; assertNotNull(mergeResults.getIgnoredResourceTypes()); assertEquals(mergeResults.getIgnoredResourceTypes().size(), 1); - assertEquals(mergeResults.getIgnoredResourceTypes().iterator().next().getName(), serverType.getName()); - assertEquals(mergeResults.getIgnoredResourceTypes().iterator().next().getPlugin(), serverType.getPlugin()); + assert mergeResults.getIgnoredResourceTypes().contains(new ResourceTypeFlyweight(serverType));
assertEquals(InventoryStatus.COMMITTED, platformSyncInfo.getInventoryStatus()); // notice platform is committed now assertEquals(platformSyncInfo.getChildSyncInfos().size(), 0); // notice there are no server children now diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java index 5d99d68..e14baf0 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java @@ -64,6 +64,7 @@ import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.criteria.ResourceCriteria; +import org.rhq.core.domain.criteria.ResourceTypeCriteria; import org.rhq.core.domain.discovery.MergeInventoryReportResults; import org.rhq.core.domain.discovery.MergeResourceResponse; import org.rhq.core.domain.discovery.ResourceSyncInfo; @@ -192,13 +193,12 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot log.debug(report);
final Map<String, ResourceType> allTypes = new HashMap<String, ResourceType>(); - final Set<ResourceType> ignoredTypes = new HashSet<ResourceType>();
for (Resource root : roots) { // Make sure all platform, server, and service types are valid. Also, make sure they're fetched - otherwise // we'll get persistence exceptions when we try to merge OR persist the platform. long rootStart = System.currentTimeMillis(); - if (!initResourceTypes(root, allTypes, ignoredTypes)) { + if (!initResourceTypes(root, allTypes)) { continue; }
@@ -225,6 +225,14 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot // a chance yet to send us its full inventory report. ResourceSyncInfo syncInfo = discoveryBoss.getResourceSyncInfo(knownAgent);
+ // we need to also tell the agent if there were any ignored types - we must provide the agent with + // ALL types that are ignored, not just for those resources that were in the report + ResourceTypeCriteria ignoredTypesCriteria = new ResourceTypeCriteria(); + ignoredTypesCriteria.addFilterIgnored(true); + ignoredTypesCriteria.setPageControl(PageControl.getUnlimitedInstance()); + PageList<ResourceType> ignoredTypes = resourceTypeManager.findResourceTypesByCriteria( + subjectManager.getOverlord(), ignoredTypesCriteria); + MergeInventoryReportResults results; if (syncInfo != null) { results = new MergeInventoryReportResults(syncInfo, ignoredTypes); @@ -1086,7 +1094,7 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot private boolean initResourceTypes(Resource resource) { final HashMap<String, ResourceType> types = new HashMap<String, ResourceType>(); try { - return initResourceTypes(resource, types, null); + return initResourceTypes(resource, types); } finally { types.clear(); // help GC } @@ -1096,13 +1104,9 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot * recursively assign (detached) ResourceType entities to the resource tree * @param resource * @param loadedTypeMap Empty map to start, filled as we go to minimize DB fetches - * @param ignoredTypes If the caller wants to be told about resource types that are to be ignored, - * pass in a set to be filled in. This is optional - if the caller passes in null, - * the ignored types are not captured for the caller. * @return false if a resource's type is unknown; true if all types were successfully loaded */ - private boolean initResourceTypes(Resource resource, Map<String, ResourceType> loadedTypeMap, - Set<ResourceType> ignoredTypes) { + private boolean initResourceTypes(Resource resource, Map<String, ResourceType> loadedTypeMap) {
String plugin = resource.getResourceType().getPlugin(); String name = resource.getResourceType().getName(); @@ -1132,15 +1136,12 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot
// don't bother looking at the children if we are just going to ignore this resource if (resourceType.isIgnored()) { - if (ignoredTypes != null) { - ignoredTypes.add(resourceType); - } return true; }
for (Iterator<Resource> childIterator = resource.getChildResources().iterator(); childIterator.hasNext();) { Resource child = childIterator.next(); - if (!initResourceTypes(child, loadedTypeMap, ignoredTypes)) { + if (!initResourceTypes(child, loadedTypeMap)) { childIterator.remove(); } }