diff --git a/src/main/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImpl.java b/src/main/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImpl.java index b48cf8e..e53ee41 100644 --- a/src/main/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImpl.java +++ b/src/main/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImpl.java @@ -32,10 +32,7 @@ public class SubAlarmDAOImpl implements SubAlarmDAO { private static final String FIND_BY_METRIC_DEF_SQL = "select sa.* from sub_alarm sa, sub_alarm_dimension d " + "join (%s) v on d.dimension_name = v.dimension_name and d.value = v.value " + "where sa.id = d.sub_alarm_id and sa.namespace = :namespace and sa.metric_type = :metricType and sa.metric_subject %s " - + "group by d.sub_alarm_id"; // having count(d.sub_alarm_id) = (select count(*) from - // sub_alarm_dimension where sub_alarm_id = d.sub_alarm_id) // - // Removed temporarily since we don't receive all of the expected - // dimensions for collectd metrics + + "group by d.sub_alarm_id having count(d.sub_alarm_id) = %s"; private static final String FIND_BY_METRIC_DEF_NO_DIMS_SQL = "select * from sub_alarm sa where sa.namespace = :namespace " + "and sa.metric_type = :metricType and sa.metric_subject %s and (select count(*) from sub_alarm_dimension where sub_alarm_id = sa.id) = 0"; @@ -58,7 +55,8 @@ public class SubAlarmDAOImpl implements SubAlarmDAO { else { String unionAllStatement = SqlStatements.unionAllStatementFor(metricDefinition.dimensions, "dimension_name", "value"); - sql = String.format(FIND_BY_METRIC_DEF_SQL, unionAllStatement, subjectSql); + sql = String.format(FIND_BY_METRIC_DEF_SQL, unionAllStatement, subjectSql, + metricDefinition.dimensions.size()); } Query> query = h.createQuery(sql) @@ -77,6 +75,7 @@ public class SubAlarmDAOImpl implements SubAlarmDAO { operator, (Double) row.get("threshold"), (Integer) row.get("period"), (Integer) row.get("periods")); SubAlarm subAlarm = new SubAlarm(subAlarmId, (String) row.get("alarm_id"), subExpression); + subAlarms.add(subAlarm); } diff --git a/src/test/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImplTest.java b/src/test/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImplTest.java index 3c24479..b614a4b 100644 --- a/src/test/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImplTest.java +++ b/src/test/java/com/hpcloud/maas/infrastructure/persistence/SubAlarmDAOImplTest.java @@ -4,9 +4,7 @@ import static org.testng.Assert.assertEquals; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.Handle; @@ -51,46 +49,52 @@ public class SubAlarmDAOImplTest { handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) " + "values ('111', '123', 'AVG', 'hpcs.compute', 'cpu', null, 'GT', 10, 60, 1, NOW(), NOW())"); - handle.execute("insert into sub_alarm_dimension values ('111', 'flavor_id', '777')"); - handle.execute("insert into sub_alarm_dimension values ('111', 'image_id', '888')"); + handle.execute("insert into sub_alarm_dimension values ('111', 'instance_id', '555')"); + handle.execute("insert into sub_alarm_dimension values ('111', 'az', '1')"); + handle.execute("insert into sub_alarm_dimension values ('111', 'instance_uuid', '555')"); handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) " - + "values ('222', '456', 'AVG', 'hpcs.compute', 'cpu', '1', 'GTE', 20, 60, 1, NOW(), NOW())"); - handle.execute("insert into sub_alarm_dimension values ('222', 'flavor_id', '777')"); - handle.execute("insert into sub_alarm_dimension values ('222', 'image_id', '888')"); + + "values ('222', '234', 'AVG', 'hpcs.compute', 'cpu', null, 'GT', 10, 60, 1, NOW(), NOW())"); + handle.execute("insert into sub_alarm_dimension values ('222', 'instance_id', '666')"); + handle.execute("insert into sub_alarm_dimension values ('222', 'az', '1')"); + handle.execute("insert into sub_alarm_dimension values ('222', 'instance_uuid', '666')"); handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) " - + "values ('333', '456', 'AVG', 'hpcs.compute', 'cpu', '1', 'LT', 10, 60, 1, NOW(), NOW())"); - handle.execute("insert into sub_alarm_dimension values ('333', 'flavor_id', '333')"); - handle.execute("insert into sub_alarm_dimension values ('333', 'image_id', '999999')"); + + "values ('333', '345', 'AVG', 'hpcs.compute', 'disk', 'vda', 'GT', 10, 60, 1, NOW(), NOW())"); + handle.execute("insert into sub_alarm_dimension values ('333', 'instance_id', '777')"); + handle.execute("insert into sub_alarm_dimension values ('333', 'az', '1')"); + handle.execute("insert into sub_alarm_dimension values ('333', 'instance_uuid', '777')"); handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) " + "values ('444', '456', 'AVG', 'hpcs.compute', 'cpu', null, 'GT', 10, 60, 1, NOW(), NOW())"); } + public void shouldFind() { + List expected = Arrays.asList(new SubAlarm("111", "123", + AlarmSubExpression.of("avg(hpcs.compute:cpu:{instance_id=555,az=1}) > 10"), + AlarmState.UNDETERMINED)); + List subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition()); + assertEquals(subAlarms, expected); + + expected = Arrays.asList(new SubAlarm("222", "234", + AlarmSubExpression.of("avg(hpcs.compute:cpu:{instance_id=666,az=1}) > 10"), + AlarmState.UNDETERMINED)); + subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition()); + assertEquals(subAlarms, expected); + } + + public void shouldFindWithSubject() { + List expected = Arrays.asList(new SubAlarm("333", "345", + AlarmSubExpression.of("avg(hpcs.compute:disk:vda:{instance_id=777,az=1}) > 10"), + AlarmState.UNDETERMINED)); + List subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition()); + assertEquals(subAlarms, expected); + } + public void shouldFindForNullDimensions() { List expected = Arrays.asList(new SubAlarm("444", "456", AlarmSubExpression.of("avg(hpcs.compute:cpu) > 10"), AlarmState.UNDETERMINED)); List subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", null, null)); assertEquals(subAlarms, expected); } - - public void shouldFind() { - List expected = Arrays.asList(new SubAlarm("111", "123", - AlarmSubExpression.of("avg(hpcs.compute:cpu:{flavor_id=777,image_id=888}) > 10"), - AlarmState.UNDETERMINED)); - Map dimensions = new HashMap(); - dimensions.put("flavor_id", "777"); - dimensions.put("image_id", "888"); - - List subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", null, - dimensions)); - assertEquals(subAlarms, expected); - - expected = Arrays.asList(new SubAlarm("222", "456", - AlarmSubExpression.of("avg(hpcs.compute:cpu:1:{flavor_id=777,image_id=888}) >= 20"), - AlarmState.UNDETERMINED)); - subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", "1", dimensions)); - assertEquals(subAlarms, expected); - } }