modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java | 1 modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionAvailabilityCategoryComposite.java | 9 +++++- modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java | 14 +++++----- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java | 4 +- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AvailabilityDurationCacheElement.java | 14 ++++++++-- 5 files changed, 31 insertions(+), 11 deletions(-)
New commits: commit 17d9ac9e8b5a926b468da48eb4cde5c8765453c3 Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Dec 19 16:57:06 2012 -0500
[Bug 888927 -Availability duration conditions limited to one alert definition per resource] Add the hooks to further qualify AvailDuration checkCondition quartz job trigger names with the alertDefId. This will allow avail duration conditions on any number of alert defs for the same resource.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java index 386cef9..a43816f 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/AlertCondition.java @@ -150,6 +150,7 @@ import org.rhq.core.domain.operation.OperationRequestStatus; + " SELECT new org.rhq.core.domain.alert.composite.AlertConditionAvailabilityCategoryComposite " // + " ( " // + " ac, " // + + " ad.id, " // needed for avail duration + " res.id, " // + " (" // + " SELECT a.availabilityType " // diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionAvailabilityCategoryComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionAvailabilityCategoryComposite.java index 4798f41..870dbd2 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionAvailabilityCategoryComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/composite/AlertConditionAvailabilityCategoryComposite.java @@ -33,19 +33,26 @@ import org.rhq.core.domain.measurement.AvailabilityType; */ public class AlertConditionAvailabilityCategoryComposite extends AbstractAlertConditionCategoryComposite {
+ private final Integer alertDefinitionId; private final Integer resourceId; private final AvailabilityType availabilityType;
- public AlertConditionAvailabilityCategoryComposite(AlertCondition condition, Integer resourceId, + public AlertConditionAvailabilityCategoryComposite(AlertCondition condition, Integer alertDefinitionId, + Integer resourceId, AvailabilityType availabilityType) {
super(condition);
+ this.alertDefinitionId = alertDefinitionId; this.resourceId = resourceId; // For a resource with no Availability records we initialize to UNKNOWN this.availabilityType = (null != availabilityType) ? availabilityType : AvailabilityType.UNKNOWN; }
+ public Integer getAlertDefinitionId() { + return alertDefinitionId; + } + public Integer getResourceId() { return resourceId; } diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java index a74550d..657ec05 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/alert/test/AlertConditionTest.java @@ -285,12 +285,14 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase { SchedulerLocal scheduler = LookupUtil.getSchedulerBean(); scheduler.scheduleTriggeredJob(AlertAvailabilityDurationJob.class, false, null);
- // create our resource with alert definition + // create our resource with two alert definitions (we use 2 to test BZ888927) @SuppressWarnings("unused") MeasurementDefinition metricDef = createResourceWithMetricSchedule(); // use a 10s duration, this is not allowed in general, the gui forces 1 minute minimum - createAlertDefinitionWithAvailDurationCondition(resource.getId(), AlertConditionOperator.AVAIL_DURATION_DOWN, - 10); + createAlertDefinitionWithAvailDurationCondition(resource.getId(), "testAvailDurationAlertDef_1", + AlertConditionOperator.AVAIL_DURATION_DOWN, 10); + createAlertDefinitionWithAvailDurationCondition(resource.getId(), "testAvailDurationAlertDef_2", + AlertConditionOperator.AVAIL_DURATION_DOWN, 10);
// resource has initial UNKNOWN ResourceAvailability and no Availability records. simulate an avail report // coming from the agent and setting the initial avail to UP. @@ -321,7 +323,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase { Thread.sleep(6000);
alerts = getAlerts(resource.getId()); - assert alerts.size() == 1 : "One alert should have fired on the avail duration: " + alerts; + assert alerts.size() == 2 : "Two alerts should have fired on the avail duration: " + alerts;
// purge the resource fully, which should remove all alert defs and alert conditions and condition logs int resourceId = resource.getId(); @@ -546,7 +548,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase { return alertDefinition; }
- private AlertDefinition createAlertDefinitionWithAvailDurationCondition(int resourceId, + private AlertDefinition createAlertDefinitionWithAvailDurationCondition(int resourceId, String alertDefName, AlertConditionOperator condition, int duration) { HashSet<AlertCondition> conditions = new HashSet<AlertCondition>(1); AlertCondition cond1 = new AlertCondition(); @@ -559,7 +561,7 @@ public class AlertConditionTest extends UpdatePluginMetadataTestBase { conditions.add(cond1);
AlertDefinition alertDefinition = new AlertDefinition(); - alertDefinition.setName("avail duration: " + condition.name()); + alertDefinition.setName(alertDefName); alertDefinition.setEnabled(true); alertDefinition.setPriority(AlertPriority.HIGH); alertDefinition.setAlertDampening(new AlertDampening(Category.NONE)); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java index a787557..e5c6572 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/internal/GlobalConditionCache.java @@ -164,8 +164,8 @@ class GlobalConditionCache extends AbstractConditionCache {
try { AvailabilityDurationCacheElement cacheElement = new AvailabilityDurationCacheElement( - alertConditionOperator, alertCondition.getOption(), availabilityComposite.getAvailabilityType(), - alertConditionId); + availabilityComposite.getAlertDefinitionId(), alertConditionOperator, alertCondition.getOption(), + availabilityComposite.getAvailabilityType(), alertConditionId); addTo("availabilityDurationCache", availabilityDurationCache, availabilityComposite.getResourceId(), cacheElement, alertConditionId, stats); } catch (InvalidCacheElementException icee) { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AvailabilityDurationCacheElement.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AvailabilityDurationCacheElement.java index ea608f5..8b3ff23 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AvailabilityDurationCacheElement.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/engine/model/AvailabilityDurationCacheElement.java @@ -41,16 +41,21 @@ import org.rhq.enterprise.server.util.LookupUtil;
public final class AvailabilityDurationCacheElement extends AbstractEnumCacheElement<AvailabilityType> {
+ private int alertDefinitionId; + /** * @param operator * @param operatorOption the duration, in seconds (as String) * @param value * @param conditionTriggerId this is actually the alertConditionId, renamed here. */ - public AvailabilityDurationCacheElement(AlertConditionOperator operator, String operatorOption, + public AvailabilityDurationCacheElement(int alertDefinitionId, AlertConditionOperator operator, + String operatorOption, AvailabilityType value, int conditionTriggerId) {
super(operator, operatorOption, value, conditionTriggerId); + + this.alertDefinitionId = alertDefinitionId; }
/** @@ -62,6 +67,7 @@ public final class AvailabilityDurationCacheElement extends AbstractEnumCacheEle * @param resource * @param providedValue */ + @SuppressWarnings("incomplete-switch") public static void checkCacheElements(List<AvailabilityDurationCacheElement> cacheElements, Resource resource, AvailabilityType providedValue) { if (null == cacheElements) { @@ -90,6 +96,10 @@ public final class AvailabilityDurationCacheElement extends AbstractEnumCacheEle } }
+ public int getAlertDefinitionId() { + return alertDefinitionId; + } + /** * Each avail duration check is performed by triggering an execution of {@link AlertAvailabilityDurationJob}. * Note that each of the scheduled jobs is relevant to only 1 condition evaluation. @@ -104,7 +114,7 @@ public final class AvailabilityDurationCacheElement extends AbstractEnumCacheEle String jobName = AlertAvailabilityDurationJob.class.getName(); String jobGroupName = AlertAvailabilityDurationJob.class.getName(); String operator = cacheElement.getAlertConditionOperator().name(); - String triggerName = operator + "-" + resource.getId(); + String triggerName = operator + "-" + resource.getId() + cacheElement.getAlertDefinitionId(); String duration = (String) cacheElement.getAlertConditionOperatorOption(); // convert from seconds to milliseconds Date jobTime = new Date(System.currentTimeMillis() + (Long.valueOf(duration).longValue() * 1000));
rhq-commits@lists.fedorahosted.org