modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java | 8 + modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java | 1 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java | 77 ++++++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerLocal.java | 3 modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java | 2 5 files changed, 90 insertions(+), 1 deletion(-)
New commits: commit a35e6479cdd1c4b6df3f5f59ced3114cdceecbc0 Author: John Mazzitelli mazz@redhat.com Date: Tue Jul 5 17:04:31 2011 -0400
fix the test that was broken. we now support drift configuration metadata updates. test passes. we also abort plugin update for a plugin that defines multiple drift configs but whose drift config names have duplicates (since all drift config names must be unique)
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java index f3aa13e..e856e2b 100644 --- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java +++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/metadata/PluginMetadataParser.java @@ -25,6 +25,7 @@ package org.rhq.core.clientapi.agent.metadata; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -490,10 +491,17 @@ public class PluginMetadataParser { .getName(), resourceDescriptor.getResourceConfiguration())); }
+ Set<String> driftConfigNames = new HashSet<String>(); DriftMetadataParser driftMetadataParser = new DriftMetadataParser(); for (DriftDescriptor descriptor : resourceDescriptor.getDriftConfiguration()) { + if (driftConfigNames.contains(descriptor.getName())) { + throw new InvalidPluginDescriptorException("Duplicate drift configuration name detected [" + + descriptor.getName() + "]"); + } + driftConfigNames.add(descriptor.getName()); resourceType.addDriftConfigurationTemplate(driftMetadataParser.parseDriftMetadata(descriptor)); } + driftConfigNames = null; // don't need this anymore
int displayPosition = 1; for (MetricDescriptor metricDescriptor : resourceDescriptor.getMetric()) { diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java index ff4904d..36ee734 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java @@ -827,6 +827,7 @@ public class ResourceType implements Serializable, Comparable<ResourceType> { this.bundleType = bundleType; }
+ // this must return the actual set, not a copy - see the metadata manager SLSB for when we update plugin metadata public Set<ConfigurationTemplate> getDriftConfigurationTemplates() { return driftConfigurationTemplates; } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java index 14a5343..7e9bc1a 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java @@ -44,6 +44,8 @@ import org.rhq.core.clientapi.agent.metadata.PluginMetadataManager; import org.rhq.core.clientapi.agent.metadata.SubCategoriesMetadataParser; 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.configuration.definition.ConfigurationTemplate; import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.ProcessScan; import org.rhq.core.domain.resource.Resource; @@ -400,6 +402,8 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal contentMetadataMgr.updateMetadata(existingType, resourceType); operationMetadataMgr.updateMetadata(existingType, resourceType);
+ resourceMetadataManager.updateDriftMetadata(existingType, resourceType); + updateProcessScans(resourceType, existingType);
eventMetadataMgr.updateMetadata(existingType, resourceType); @@ -442,6 +446,79 @@ public class ResourceMetadataManagerBean implements ResourceMetadataManagerLocal entityManager.flush(); }
+ @Override + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public void updateDriftMetadata(ResourceType existingType, ResourceType resourceType) { + boolean isSame = true; + + existingType = entityManager.find(ResourceType.class, existingType.getId()); + + // + // First, we need to see if the drift configs have changed. If the existing and new drift configs + // are the same, then we can skip the update and do nothing. Only if one or more drift configs + // are different do we have to do anything to the persisted metadata. + // + + Set<ConfigurationTemplate> existingDriftTemplates = existingType.getDriftConfigurationTemplates(); + Set<ConfigurationTemplate> newDriftTemplates = resourceType.getDriftConfigurationTemplates(); + if (existingDriftTemplates.size() != newDriftTemplates.size()) { + isSame = false; + } else { + // note: the size of the sets are typically really small (usually between 0 and 3), + // so iterating through them is fast. + + // look at all the configs to ensure we detect any changes to individual settings on the templates + Set<String> existingNames = new HashSet<String>(existingDriftTemplates.size()); + Set<String> newNames = new HashSet<String>(newDriftTemplates.size()); + for (ConfigurationTemplate existingCT : existingDriftTemplates) { + String existingName = existingCT.getName(); + Configuration existingConfig = existingCT.getConfiguration(); + + existingNames.add(existingName); // for later + + for (ConfigurationTemplate newCT : newDriftTemplates) { + String newName = newCT.getName(); + newNames.add(newName); // for later, do this here, not in the if-stmt below, so we can catch if new has names not in existing + if (newName.equals(existingName)) { + Configuration newConfig = newCT.getConfiguration(); + if (!existingConfig.equals(newConfig)) { + isSame = false; + } + break; + } + } + + if (!isSame) { + break; + } + } + + if (isSame) { + // make sure they all have the same names and no duplicate names existed + isSame = existingNames.equals(newNames) && existingNames.size() == existingDriftTemplates.size(); + } + } + + // + // If one or more drift configs are different between new and existing, + // then we need to remove the old drift config and persist the new drift config. + // + + if (!isSame) { + for (ConfigurationTemplate doomed : existingDriftTemplates) { + entityManager.remove(doomed); + } + existingType.getDriftConfigurationTemplates().clear(); + + for (ConfigurationTemplate toPersist : newDriftTemplates) { + entityManager.persist(toPersist); + existingType.addDriftConfigurationTemplate(toPersist); + } + } + + return; + } + private void persistNewType(ResourceType resourceType) { log.info("Persisting new ResourceType [" + toConciseString(resourceType) + "]..."); // If the type didn't exist then we'll persist here which will cascade through diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerLocal.java index 4592bc7..ae96d22 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerLocal.java @@ -45,4 +45,7 @@ public interface ResourceMetadataManagerLocal { void completeRemoveResourceType(Subject subject, ResourceType existingType);
void updateTypes(Set<ResourceType> resourceTypes) throws Exception; + + /** TODO: do we want to create a driftMetadataManager SLSB and put this in there */ + void updateDriftMetadata(ResourceType existingType, ResourceType resourceType); } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java index 0481d9d..27bcdc7 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBeanTest.java @@ -269,7 +269,7 @@ public class ResourceMetadataManagerBeanTest extends MetadataBeanTest { ); }
- @Test(enabled = false, dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"}) + @Test(dependsOnMethods = {"upgradePlugin"}, groups = {"plugin.metadata", "UpgradePlugin"}) public void upgradeDriftConfigurationTemplates() throws Exception { ResourceType type = assertResourceTypeAssociationEquals( "ServerA",
rhq-commits@lists.fedorahosted.org