modules/core/domain/src/main/java/org/rhq/core/domain/resource/ResourceType.java
| 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
| 90 +++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/CacheConsistencyManagerBean.java
| 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/ServerManagerBean.java
| 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/ResourceMetadataManagerBean.java
| 143 ++++++----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
| 61 ++--
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
| 3
modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
| 3
modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
| 6
9 files changed, 203 insertions(+), 129 deletions(-)
New commits:
commit c04dcee7d0505b241270534d7ca30a634697f858
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Oct 28 12:55:34 2011 -0400
Log failures to reschedule EJB timers. If they don't get rescheduled bad
things can happen, server restart is probably going to be needed.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/CacheConsistencyManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/CacheConsistencyManagerBean.java
index 2de7bad..51ed428 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/CacheConsistencyManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/CacheConsistencyManagerBean.java
@@ -89,7 +89,13 @@ public class CacheConsistencyManagerBean implements
CacheConsistencyManagerLocal
log.error("Failed to reload server cache if needed - will try again
later. Cause: " + t);
} finally {
// reschedule ourself to trigger in another 30 seconds
- timerService.createTimer(30000, TIMER_DATA);
+ try {
+ timerService.createTimer(30000, TIMER_DATA);
+ } catch (Throwable t) {
+ log
+ .error("Failed to reschedule cache reload timer! Cache reload
handling will not work from this point. A server restart may be needed after issue is
resolved:"
+ + t);
+ }
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/ServerManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/ServerManagerBean.java
index be91c65..cc8c435 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/ServerManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/instance/ServerManagerBean.java
@@ -119,10 +119,15 @@ public class ServerManagerBean implements ServerManagerLocal {
} catch (Throwable t) {
log.error("Failed to handle cloud heartbeat timer - will try again
later. Cause: " + t);
} finally {
- // reschedule ourself to trigger in another 30 seconds
- timerService.createTimer(30000, TIMER_DATA);
+ // reschedule ourself to trigger in another 30 seconds
+ try {
+ timerService.createTimer(30000, TIMER_DATA);
+ } catch (Throwable t) {
+ log
+ .error("Failed to reschedule cloud heartbeat timer! Server
status handling will not work from this point. A server restart may be needed after issue
is resolved:"
+ + t);
+ }
}
-
}
public int create(Server server) {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
index 05d4649..44e48b5 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemManagerBean.java
@@ -60,8 +60,8 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.common.ProductInfo;
import org.rhq.core.domain.common.ServerDetails;
-import org.rhq.core.domain.common.ServerDetails.Detail;
import org.rhq.core.domain.common.SystemConfiguration;
+import org.rhq.core.domain.common.ServerDetails.Detail;
import org.rhq.core.domain.common.composite.SystemSetting;
import org.rhq.core.domain.common.composite.SystemSettings;
import org.rhq.core.domain.configuration.definition.PropertySimpleType;
@@ -152,7 +152,13 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
log.error("Failed to reload the system config cache - will try again
later. Cause: " + t);
} finally {
// reschedule ourself to trigger in another 60 seconds
- timerService.createTimer(60000L, TIMER_DATA);
+ try {
+ timerService.createTimer(60000L, TIMER_DATA);
+ } catch (Throwable t) {
+ log
+ .error("Failed to reschedule system config cache reload timer!
System config cache reload handling will not work from this point. A server restart may be
needed after issue is resolved:"
+ + t);
+ }
}
}
@@ -181,16 +187,16 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
@Deprecated
public Properties getSystemConfiguration(Subject subject) {
Properties copy = new Properties();
-
+
SystemSettings settings = getSystemSettings(subject);
- for(Map.Entry<SystemSetting, String> e : settings.entrySet()) {
+ for (Map.Entry<SystemSetting, String> e : settings.entrySet()) {
//transform the value back to the database format, because that's
//what this method always returned
String value = transformSystemConfigurationProperty(e.getKey(), e.getValue(),
false);
-
+
copy.put(e.getKey().getInternalName(), value);
}
-
+
return copy;
}
@@ -245,19 +251,22 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
//them to "false"/"true" and store that value to
database. This is a one way operation
//and therefore we need to compare the database-agnostic (i.e.
"true"/"false") and
//not database specific.
- String existingValue = transformSystemConfigurationProperty(prop,
existingConfig.getPropertyValue(), true);
-
+ String existingValue = transformSystemConfigurationProperty(prop,
existingConfig.getPropertyValue(),
+ true);
+
if ((existingValue == null && value != null) ||
!existingValue.equals(value)) {
//SystemSetting#isReadOnly should be a superset of the
"fReadOnly" field in the database
//but let's just be super paranoid here...
- if (prop.isReadOnly() || (existingConfig.getFreadOnly() != null
&& existingConfig.getFreadOnly().booleanValue())) {
+ if (prop.isReadOnly()
+ || (existingConfig.getFreadOnly() != null &&
existingConfig.getFreadOnly().booleanValue())) {
throw new IllegalArgumentException("The setting [" +
prop.getInternalName()
- + "] is read-only - you cannot change its current value!
Current value is [" + existingConfig.getPropertyValue() + "] while the new value
was [" + value + "].");
+ + "] is read-only - you cannot change its current value!
Current value is ["
+ + existingConfig.getPropertyValue() + "] while the new
value was [" + value + "].");
}
-
+
//transform to the database-specific format
value = transformSystemConfigurationProperty(prop, value, false);
-
+
existingConfig.setPropertyValue(value);
entityManager.merge(existingConfig);
}
@@ -288,9 +297,9 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
String value = transformSystemConfigurationProperty(prop, e.getValue(),
true);
e.setValue(value);
}
- }
+ }
}
-
+
private Map<String, String> getDriftServerPlugins() {
DriftServerPluginManager pluginMgr = getDriftServerPluginManager();
Map<String, String> plugins = new HashMap<String, String>();
@@ -362,9 +371,9 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
@Deprecated
public void setSystemConfiguration(Subject subject, Properties properties, boolean
skipValidation) throws Exception {
Map<String, String> map = toMap(properties);
-
+
transformToSystemSettingsFormat(map);
-
+
SystemSettings settings = SystemSettings.fromMap(map);
setSystemSettings(settings, skipValidation);
@@ -374,9 +383,9 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
public void validateSystemConfiguration(Subject subject, Properties properties)
throws InvalidSystemConfigurationException {
Map<String, String> map = toMap(properties);
-
+
transformToSystemSettingsFormat(map);
-
+
SystemSettings settings = SystemSettings.fromMap(map);
for (Map.Entry<SystemSetting, String> e : settings.entrySet()) {
SystemSetting prop = e.getKey();
@@ -389,7 +398,7 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
/**
* Call this to transform a system setting to a more appropriate value.
*/
- private String transformSystemConfigurationProperty(SystemSetting prop, String value,
boolean fromDb) {
+ private String transformSystemConfigurationProperty(SystemSetting prop, String value,
boolean fromDb) {
if (fromDb) {
// to support Oracle (whose booleans may be 1 or 0) transform the boolean
settings properly
switch (prop) {
@@ -414,13 +423,13 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
return Boolean.TRUE.toString();
}
}
- }
+ }
} else {
//toDB
//the 0,1 -> true false scenario is no problem here, because the values
are stored
//as string anyway (so no conversion is done). I assume the above is a
historical
//code that could be safely eliminated.
- switch(prop) {
+ switch (prop) {
case LDAP_BASED_JAAS_PROVIDER:
if (Boolean.parseBoolean(value)) {
return RHQConstants.LDAPJAASProvider;
@@ -435,7 +444,7 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
}
}
}
-
+
return value;
}
@@ -693,8 +702,7 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
public boolean isDebugModeEnabled() {
try {
Subject su = this.subjectManager.getOverlord();
- String setting = getSystemSettings(su).get(
- SystemSetting.DEBUG_MODE_ENABLED);
+ String setting =
getSystemSettings(su).get(SystemSetting.DEBUG_MODE_ENABLED);
if (setting == null) {
setting = "false";
}
@@ -707,8 +715,7 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
public boolean isExperimentalFeaturesEnabled() {
try {
Subject su = this.subjectManager.getOverlord();
- String setting = getSystemSettings(su).get(
- SystemSetting.EXPERIMENTAL_FEATURES_ENABLED);
+ String setting =
getSystemSettings(su).get(SystemSetting.EXPERIMENTAL_FEATURES_ENABLED);
if (setting == null) {
setting = "false";
}
@@ -733,7 +740,7 @@ public class SystemManagerBean implements SystemManagerLocal,
SystemManagerRemot
&& (((groupFilter != null) && groupFilter.trim().length()
> 0) || ((groupMember != null) && groupMember
.trim().length() > 0));
}
-
+
@RequiredPermission(Permission.MANAGE_SETTINGS)
public ServerDetails getServerDetails(Subject subject) {
CoreServerMBean coreServerMBean = LookupUtil.getCoreServer();
commit 4f0914816e9a39b1ae62f9f59881ae3e6ba22a13
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Nov 1 11:43:10 2011 -0400
Fix issue in handling of non-cached metadata types in type repo. Also,
optimize further by only querying for metadata that is not already cached
for the requested types.
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 3c4b754..b44bee1 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
@@ -401,7 +401,7 @@ public class ResourceType implements Serializable,
Comparable<ResourceType> {
private BundleType bundleType;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy =
"resourceType")
- private Set<DriftDefinitionTemplate> driftDefinitionTemplates = new
HashSet<DriftDefinitionTemplate>();
+ private Set<DriftDefinitionTemplate> driftDefinitionTemplates;
// note that this is mapped to a Configuration entity, which is what it really is.
However, our getter/setter
// only provides access to this via ResourceTypeBundleConfiguration to encapsulate
the innards of this implementation
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
index 2b3dbb1..15d7221 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java
@@ -31,7 +31,6 @@ import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
-import org.rhq.core.domain.drift.DriftDefinitionTemplate;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@ -58,27 +57,31 @@ public class ResourceTypeRepository {
private static ResourceTypeGWTServiceAsync resourceTypeService =
GWTServiceLookup.getResourceTypeGWTService();
/**
- * The following MetadadaTypes are not cached and will always be queried from the
database:<br/>
+ * The following MetadadaTypes are subject to change and are always fetched from the
database:<br/>
* driftDefinitionTemplates
*
* @author Jay Shaughnessy
*/
public enum MetadataType {
children, operations, measurements, content, events,
pluginConfigurationDefinition, resourceConfigurationDefinition, subCategory, parentTypes,
processScans, productVersions, driftDefinitionTemplates(
- false);
+ true);
- private boolean isCachedMetadata;
+ private boolean isFetchAlways;
private MetadataType() {
- this.isCachedMetadata = true;
+ this(false);
}
- private MetadataType(boolean isCachedMetadata) {
- this.isCachedMetadata = isCachedMetadata;
+ /**
+ * @param isFetchAlways if true then the cache for this metadata will be
refreshed each time it is requested.
+ * Meaning, the db will always be called because this metadata is subject to
change.
+ */
+ private MetadataType(boolean isFetchAlways) {
+ this.isFetchAlways = isFetchAlways;
}
- public boolean isCachedMetadata() {
- return isCachedMetadata;
+ public boolean isFetchAlways() {
+ return isFetchAlways;
}
}
@@ -187,22 +190,17 @@ public class ResourceTypeRepository {
});
}
- public void getResourceTypes(Integer[] resourceTypeIds, EnumSet<MetadataType>
metadataTypesNeeded,
+ public void getResourceTypes(Integer[] resourceTypeIds, EnumSet<MetadataType>
metadataTypes,
final TypesLoadedCallback callback) {
- // note, metadataTypesNeeded == null implies EnumSet.noneOf(MetadataType.class)
- final EnumSet<MetadataType> metadataTypes;
- if (metadataTypesNeeded == null) {
- metadataTypes = EnumSet.noneOf(MetadataType.class);
- } else {
- metadataTypes = metadataTypesNeeded;
- }
-
- ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+ // note, metadataTypes == null implies EnumSet.noneOf(MetadataType.class)
+ metadataTypes = (null == metadataTypes) ? EnumSet.noneOf(MetadataType.class) :
metadataTypes;
final Map<Integer, ResourceType> cachedTypes = new HashMap<Integer,
ResourceType>();
-
List<Integer> typesNeeded = new ArrayList<Integer>();
+ EnumSet<MetadataType> metadataTypesNeeded =
EnumSet.noneOf(MetadataType.class);
+ ResourceTypeCriteria criteria = new ResourceTypeCriteria();
+
if (resourceTypeIds == null) {
//preload all
} else {
@@ -215,7 +213,24 @@ public class ResourceTypeRepository {
|| (!metadataTypes.isEmpty() &&
(!typeCacheLevel.containsKey(typeId) // 2.
|| !typeCacheLevel.get(typeId).containsAll(metadataTypes)))) // 3.
{
+ // add this type to the types we need to fetch
typesNeeded.add(typeId);
+
+ // make sure we fetch the metadata needed for this type
+ if (metadataTypesNeeded.size() < metadataTypes.size()) {
+ EnumSet<MetadataType> metadataTypesCached =
typeCacheLevel.get(typeId);
+
+ if (metadataTypesCached == null) {
+ metadataTypesNeeded = metadataTypes;
+
+ } else {
+ for (MetadataType metadataType : metadataTypes) {
+ if (!metadataTypesCached.contains(metadataType)) {
+ metadataTypesNeeded.add(metadataType);
+ }
+ }
+ }
+ }
} else {
cachedTypes.put(typeId, typeCache.get(typeId));
}
@@ -230,7 +245,7 @@ public class ResourceTypeRepository {
criteria.addFilterIds(typesNeeded.toArray(new Integer[typesNeeded.size()]));
}
- for (MetadataType metadataType : metadataTypes) {
+ for (MetadataType metadataType : metadataTypesNeeded) {
switch (metadataType) {
case children:
criteria.fetchChildResourceTypes(true);
@@ -275,16 +290,16 @@ public class ResourceTypeRepository {
criteria.setPageControl(PageControl.getUnlimitedInstance());
- Log.info("Loading [" + typesNeeded.size() + "] types with
facets=[" + metadataTypes + "]...");
+ Log.info("Loading [" + typesNeeded.size() + "] types with
facets=[" + metadataTypesNeeded + "]...");
- if ((topLevelServerAndServiceTypes == null) && (metadataTypes != null)
- && metadataTypes.contains(MetadataType.children)) {
+ if ((topLevelServerAndServiceTypes == null) && (metadataTypesNeeded !=
null)
+ && metadataTypesNeeded.contains(MetadataType.children)) {
// Perform a one-time load of server and service types with no parent types.
These types are implicitly
// children of all platform types, even though they are not included in the
platform types'
// childResourceTypes field.
- loadTopLevelServerAndServiceTypes(callback, metadataTypes, criteria,
cachedTypes);
+ loadTopLevelServerAndServiceTypes(callback, metadataTypesNeeded, criteria,
cachedTypes);
} else {
- loadRequestedTypes(callback, metadataTypes, criteria, cachedTypes);
+ loadRequestedTypes(callback, metadataTypesNeeded, criteria, cachedTypes);
}
}
@@ -370,14 +385,7 @@ public class ResourceTypeRepository {
cachedType.setSubCategory(type.getSubCategory());
break;
case driftDefinitionTemplates:
- if (cachedType.getDriftDefinitionTemplates() != null)
{
- cachedType.getDriftDefinitionTemplates().clear();
// remove any old ones hanging around
- }
- if (type.getDriftDefinitionTemplates() != null) {
- for (DriftDefinitionTemplate template :
type.getDriftDefinitionTemplates()) {
-
cachedType.addDriftDefinitionTemplate(template);
- }
- }
+
cachedType.setDriftDefinitionTemplates(type.getDriftDefinitionTemplates());
break;
default:
Log.error("ERROR: metadataType " +
metadataType.name()
@@ -392,17 +400,17 @@ public class ResourceTypeRepository {
}
if (metadataTypes != null && !metadataTypes.isEmpty()) {
- if (typeCacheLevel.containsKey(type.getId())) {
- typeCacheLevel.get(type.getId()).addAll(metadataTypes);
- } else {
- for (MetadataType metadataType : metadataTypes) {
- if (metadataType.isCachedMetadata) {
- typeCacheLevel.put(type.getId(),
EnumSet.copyOf(metadataTypes));
- }
+ EnumSet<MetadataType> cachedMetadata =
typeCacheLevel.get(type.getId());
+ cachedMetadata = (null == cachedMetadata) ?
EnumSet.noneOf(MetadataType.class) : cachedMetadata;
+ for (MetadataType metadataType : metadataTypes) {
+ if (!metadataType.isFetchAlways()) {
+ cachedMetadata.add(metadataType);
}
}
+ typeCacheLevel.put(type.getId(), cachedMetadata);
}
}
+
if (callback != null) {
callback.onTypesLoaded(cachedTypes);
}
commit 89cb974ef54fd2dcf79a74b6ba466d85c831e657
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Nov 1 12:12:29 2011 -0400
Rework drift metadata update for changes to plugin defined drift templates.
Now supports handling of:
- user and plugin defined templates for the type
- templates with attached definitions
- pinned templates
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 743c094..3c4b754 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
@@ -439,6 +439,7 @@ public class ResourceType implements Serializable,
Comparable<ResourceType> {
this.packageTypes = new HashSet<PackageType>();
this.subCategories = new ArrayList<ResourceSubCategory>();
this.productVersions = new HashSet<ProductVersion>();
+ this.driftDefinitionTemplates = new HashSet<DriftDefinitionTemplate>();
this.name = name;
this.category = category;
@@ -841,6 +842,10 @@ public class ResourceType implements Serializable,
Comparable<ResourceType> {
driftDefinitionTemplates.add(template);
}
+ public void setDriftDefinitionTemplates(Set<DriftDefinitionTemplate>
driftDefinitionTemplates) {
+ this.driftDefinitionTemplates = driftDefinitionTemplates;
+ }
+
@Override
public boolean equals(Object obj) {
if (this == obj)
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 9baf7a4..4346f69 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,10 +44,11 @@ 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.drift.DriftDefinition;
+import org.rhq.core.domain.drift.DriftDefinitionComparator;
import org.rhq.core.domain.drift.DriftDefinitionTemplate;
+import org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode;
import org.rhq.core.domain.resource.ProcessScan;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceSubCategory;
@@ -450,74 +451,114 @@ public class ResourceMetadataManagerBean implements
ResourceMetadataManagerLocal
@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 definitions have changed. If the existing
and new drift definitions
- // are the same, then we can skip the update and do nothing. Only if one or more
drift definitions
- // are different do we have to do anything to the persisted metadata.
+ // Only if one or more drift definitions are different do we have to do anything
to the persisted metadata.
//
Set<DriftDefinitionTemplate> existingDriftTemplates =
existingType.getDriftDefinitionTemplates();
- Set<DriftDefinitionTemplate> newDriftTemplates =
resourceType.getDriftDefinitionTemplates();
- 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 (DriftDefinitionTemplate existingTemplate : existingDriftTemplates) {
- String existingName = existingTemplate.getName();
- Configuration existingConfig = existingTemplate.getConfiguration();
-
- existingNames.add(existingName); // for later
-
- for (DriftDefinitionTemplate newTemplate : newDriftTemplates) {
- String newName = newTemplate.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 = newTemplate.getConfiguration();
- if (!existingConfig.equals(newConfig)) {
- isSame = false;
- }
- break;
+
+ // We are only concerned with the plugin defined templates, user defined
templates are not affected.
+
+ Set<DriftDefinitionTemplate> existingPluginDriftTemplates = new
HashSet<DriftDefinitionTemplate>(
+ existingDriftTemplates.size());
+
+ for (DriftDefinitionTemplate existingTemplate : existingDriftTemplates) {
+ if (!existingTemplate.isUserDefined()) {
+ existingPluginDriftTemplates.add(existingTemplate);
+ }
+ }
+
+ Set<DriftDefinitionTemplate> newPluginDriftTemplates =
resourceType.getDriftDefinitionTemplates();
+ // note: the size of the sets are typically really small (usually between 1 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>(existingPluginDriftTemplates.size());
+ DriftDefinitionComparator dirComp = new
DriftDefinitionComparator(CompareMode.ONLY_DIRECTORY_SPECIFICATIONS);
+
+ for (Iterator<DriftDefinitionTemplate> i =
existingDriftTemplates.iterator(); i.hasNext();) {
+ DriftDefinitionTemplate existingTemplate = i.next();
+
+ String existingName = existingTemplate.getName();
+ DriftDefinition existingDef = existingTemplate.getTemplateDefinition();
+ Set<DriftDefinition> attachedDefs =
existingTemplate.getDriftDefinitions();
+ boolean noAttachedDefs = (null == attachedDefs || attachedDefs.isEmpty());
+ boolean notPinned = !existingTemplate.isPinned();
+ boolean stillDefined = false;
+
+ // for later to determine if any existing templates are no longer defined in
the plugin
+ existingNames.add(existingName);
+
+ for (DriftDefinitionTemplate newTemplate : newPluginDriftTemplates) {
+ String newName = newTemplate.getName();
+
+ // The new template existed previously. See if it has changed and if so,
in what way:
+ //
+ // IF the existingTemplate
+ // has no attached defs AND
+ // is not pinned
+ // THEN we can update it with impunity
+ // ELSE IF the directories have not changed
+ // THEN we can update the base info fields only
+ // Note that in the latter case we update the template but we will not
push the
+ // changes down to attached defs. This is a little odd because the
template and defs can
+ // get out of sync, but we don't want a plugin change to affect
existing defs in case
+ // the user has made manual changes, or wants it the way it is.
+ if (newName.equals(existingName)) {
+ stillDefined = true;
+
+ DriftDefinition newDef = newTemplate.getTemplateDefinition();
+ boolean noDirChanges = (0 == dirComp.compare(existingDef, newDef));
+
+ if ((noAttachedDefs && notPinned) || noDirChanges) {
+ existingTemplate.setTemplateDefinition(newDef);
+
+ } else {
+ // can't update directories for an existing template if
pinned and/or having attached defs
+ log.error("Failed to update drift definition [" +
newName + "] on type ["
+ + resourceType.getName()
+ + "]. It is not allowed to update directories on an
existing template that is pinned "
+ + "or has attached definitions. It would invalidate
pinned snapshots as the fileset "
+ + "would no longer map from template to
definition.");
}
- }
- 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 the template is no longer defined then what we do depends on whether it
has attached
+ // definitions. If not it can be deleted, otherwise we keep it around so the
user doesn't lose
+ // anything, but set it to user-defined, in essence removing it from the
plugin.
+ if (!stillDefined) {
+ if (noAttachedDefs) {
+ entityManager.remove(existingTemplate);
+ i.remove();
+
+ } else {
+ existingTemplate.setUserDefined(true);
+ log.warn("Plugin no longer defines drift template [" +
existingTemplate.getName() + "] on type ["
+ + resourceType.getName()
+ + "]. This template has attached definitions. To preserve
the existing definitions the "
+ + " template will not be removed but is instead being set as
user-defined. The user will "
+ + " be responsible for further maintenance of this
template.");
+ }
}
}
- //
- // If one or more drift definitions are different between new and existing,
- // then we need to remove the old drift definition and persist the new drift
definition.
- //
+ // Now add new templates, not previously defined
+ for (DriftDefinitionTemplate newTemplate : newPluginDriftTemplates) {
+ String newName = newTemplate.getName();
- if (!isSame) {
- for (DriftDefinitionTemplate doomed : existingDriftTemplates) {
- entityManager.remove(doomed);
+ if (existingNames.contains(newName)) {
+ continue;
}
- existingType.getDriftDefinitionTemplates().clear();
- for (DriftDefinitionTemplate toPersist : newDriftTemplates) {
- entityManager.persist(toPersist);
- existingType.addDriftDefinitionTemplate(toPersist);
- }
+ newTemplate.setResourceType(existingType);
+ entityManager.persist(newTemplate);
+ existingDriftTemplates.add(newTemplate);
}
-
- return;
}
private void persistNewType(ResourceType resourceType) {
commit 882cb7bedc8cc221a717e5093991a6f48304eaee
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Nov 1 12:18:12 2011 -0400
Update plugins supporting drift to use better template names
- new conventions: "Template: Some Name"
- add descriptions to all plugin defined templates
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index 1503962..e337217 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -1195,7 +1195,8 @@
</configuration>
</content>
- <drift-definition name="Core Files">
+ <drift-definition name="Template: Base Files"
+ description="A template for monitoring base application
server files for drift. It defines monitoring for some standard sub-directories of the
HOME directory. Note, it is not recommeded to monitor all files for an application
server. There are many files, and many temp files.">
<basedir>
<value-context>pluginConfiguration</value-context>
<value-name>homeDir</value-name>
diff --git a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
index 44a2ea5..d02a8c0 100644
--- a/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as/src/main/resources/META-INF/rhq-plugin.xml
@@ -258,7 +258,8 @@
</configuration>
</content>
- <drift-definition name="Core Files">
+ <drift-definition name="Template: Base Files"
+ description="A template for monitoring base application
server files for drift. It defines monitoring for some standard sub-directories of the
HOME directory. Note, it is not recommeded to monitor all files for an application
server. There are many files, and many temp files.">
<basedir>
<value-context>pluginConfiguration</value-context>
<value-name>jbossHomeDir</value-name>
diff --git a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
index 6339c74..fa07736 100644
--- a/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/platform/src/main/resources/META-INF/rhq-plugin.xml
@@ -40,13 +40,13 @@
</bundle-target>
'>
<!ENTITY driftConfig '
- <drift-definition name="File System"
- description="A general purpose template for file system
drift monitoring. It is expected that the base directory will be changed as the file
system root is not recommended.">
+ <drift-definition name="Template: File System"
+ description="A template for monitoring the file system for
drift. It is expected that definitions will set a more specific base directory as the file
system root is not recommended.">
<basedir>
<value-context>fileSystem</value-context>
<value-name>/</value-name>
</basedir>
- </drift-definition>
+ </drift-definition>
'>
<!ENTITY metrics '
<metric displayName="Hostname"