Enable filter by severity in ORM

Filtering by severity was not possible
with ORM in Alarm and AlarmDefinition
repositories

Change-Id: I0e1636b8bc63470a559209f063bd8f7ad1a1e552
This commit is contained in:
Tomasz Trębski 2016-06-06 11:44:58 +02:00
parent de084928d6
commit 4df2cca40f
4 changed files with 93 additions and 12 deletions

View File

@ -235,10 +235,6 @@ public class AlarmDefinitionSqlRepoImpl
throw Exceptions.unprocessableEntity(
"Sort_by is not implemented for the hibernate database type");
}
if (severities != null && !severities.isEmpty()) {
throw Exceptions.unprocessableEntity(
"Severity is not implemented for the hibernate database type");
}
Session session = null;
List<AlarmDefinition> resultSet = Lists.newArrayList();
@ -260,6 +256,21 @@ public class AlarmDefinitionSqlRepoImpl
sbWhere.append(" and ad.name = :name");
}
if (CollectionUtils.isNotEmpty(severities)) {
if (severities.size() == 1) {
sbWhere.append(" and ad.severity = :severity");
} else {
sbWhere.append(" and (");
for (int i = 0; i < severities.size(); i++) {
sbWhere.append("ad.severity = :severity_").append(i);
if (i < severities.size() - 1) {
sbWhere.append(" or ");
}
}
sbWhere.append(")");
}
}
if (offset != null && !offset.equals("0")) {
sbWhere.append(" and ad.id > :offset");
}
@ -283,6 +294,16 @@ public class AlarmDefinitionSqlRepoImpl
qAlarmDefinition.setString("name", name);
}
if (CollectionUtils.isNotEmpty(severities)) {
if (severities.size() == 1) {
qAlarmDefinition.setString("severity", severities.get(0).name());
} else {
for (int it = 0; it < severities.size(); it++) {
qAlarmDefinition.setString(String.format("severity_%d", it), severities.get(it).name());
}
}
}
if (offset != null && !offset.equals("0")) {
qAlarmDefinition.setString("offset", offset);
}

View File

@ -31,6 +31,7 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@ -174,10 +175,6 @@ public class AlarmSqlRepoImpl
throw Exceptions.unprocessableEntity(
"Sort_by is not implemented for the hibernate database type");
}
if (severities != null && !severities.isEmpty()) {
throw Exceptions.unprocessableEntity(
"Severity filter is not implemented for the hibernate database type");
}
Preconditions.checkNotNull(tenantId, "TenantId is required");
@ -192,6 +189,7 @@ public class AlarmSqlRepoImpl
metricName,
metricDimensions,
state,
severities,
lifecycleState,
link,
stateUpdatedStart,
@ -223,6 +221,16 @@ public class AlarmSqlRepoImpl
query.setString("state", state.name());
}
if (CollectionUtils.isNotEmpty(severities)) {
if (severities.size() == 1) {
query.setString("severity", severities.get(0).name());
} else {
for (int it = 0; it < severities.size(); it++) {
query.setString(String.format("severity_%d", it), severities.get(it).name());
}
}
}
if (link != null) {
query.setString("link", link);
}
@ -271,6 +279,7 @@ public class AlarmSqlRepoImpl
final String metricName,
final Map<String, String> metricDimensions,
final AlarmState state,
final List<AlarmSeverity> severities,
final String lifecycleState,
final String link,
final DateTime stateUpdatedStart,
@ -320,6 +329,21 @@ public class AlarmSqlRepoImpl
sbWhere.append(" and a.state = :state");
}
if (CollectionUtils.isNotEmpty(severities)) {
if (severities.size() == 1) {
sbWhere.append(" and ad.severity = :severity");
} else {
sbWhere.append(" and (");
for (int i = 0; i < severities.size(); i++) {
sbWhere.append("ad.severity = :severity_").append(i);
if (i < severities.size() - 1) {
sbWhere.append(" or ");
}
}
sbWhere.append(")");
}
}
if (lifecycleState != null) {
sbWhere.append(" and a.lifecycle_state = :lifecycleState");
}

View File

@ -28,6 +28,7 @@ import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import monasca.api.domain.exception.EntityNotFoundException;
import monasca.api.domain.model.alarmdefinition.AlarmDefinition;
import monasca.api.domain.model.alarmdefinition.AlarmDefinitionRepo;
@ -92,7 +93,7 @@ public class AlarmDefinitionSqlRepositoryImplTest {
final AlarmDefinitionDb alarmDefinition123 = new AlarmDefinitionDb()
.setTenantId("bob")
.setName("90% CPU")
.setSeverity(AlarmSeverity.LOW)
.setSeverity(AlarmSeverity.HIGH)
.setExpression("avg(hpcs.compute{flavor_id=777, image_id=888, metric_name=cpu, device=1}) > 10")
.setMatchBy("flavor_id,image_id")
.setActionsEnabled(true);
@ -188,7 +189,7 @@ public class AlarmDefinitionSqlRepositoryImplTest {
session.close();
alarmDef_123 =
new AlarmDefinition("123", "90% CPU", null, "LOW", "avg(hpcs.compute{flavor_id=777, image_id=888, metric_name=cpu, device=1}) > 10",
new AlarmDefinition("123", "90% CPU", null, "HIGH", "avg(hpcs.compute{flavor_id=777, image_id=888, metric_name=cpu, device=1}) > 10",
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
Collections.<String>emptyList());
alarmDef_234 =
@ -377,4 +378,22 @@ public class AlarmDefinitionSqlRepositoryImplTest {
public void shouldFindThrowException() {
repo.find("bob", null, null, null, Arrays.asList("severity", "state"), null, 1);
}
public void shouldFilterBySeverity() {
List<AlarmDefinition> alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, 1);
AlarmDefinition alarmDefinition;
assertEquals(1, alarmDefinitions.size());
alarmDefinition = alarmDefinitions.get(0);
assertEquals(this.alarmDef_123, alarmDefinition);
alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, 1);
assertEquals(1, alarmDefinitions.size());
alarmDefinition = alarmDefinitions.get(0);
assertEquals(this.alarmDef_234, alarmDefinition);
}
}

View File

@ -120,7 +120,7 @@ public class AlarmSqlRepositoryImplTest {
TENANT_ID,
"50% CPU",
"avg(cpu.sys_mem{service=monitoring}) > 20 and avg(cpu.idle_perc{service=monitoring}) < 10",
AlarmSeverity.LOW,
AlarmSeverity.HIGH,
"hostname,region",
true
);
@ -236,7 +236,7 @@ public class AlarmSqlRepositoryImplTest {
session.getTransaction().commit();
compoundAlarm =
new Alarm("234111", "234", "50% CPU", "LOW", buildAlarmMetrics(
new Alarm("234111", "234", "50% CPU", "HIGH", buildAlarmMetrics(
buildMetricDefinition("cpu.sys_mem", "hostname", "roland", "region", "colorado", "service", "monitoring"),
buildMetricDefinition("cpu.idle_perc", "extra", "vivi", "hostname", "roland", "region", "colorado", "service", "monitoring")),
AlarmState.UNDETERMINED, null, null, timestamp4, timestamp4, timestamp4);
@ -465,6 +465,23 @@ public class AlarmSqlRepositoryImplTest {
repo.update(TENANT_ID, "Not a valid alarm id", AlarmState.UNDETERMINED, null, null);
}
public void shouldFilterBySeverity() {
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, null, null, null, 1, false),
alarm1, alarm2, alarm3);
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, null, null, null, 1, false),
compoundAlarm);
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.LOW, AlarmSeverity.HIGH), null, null, null, null, null, 1, false),
alarm1, alarm2, compoundAlarm, alarm3);
// no alarms for those severities
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.CRITICAL), null, null, null, null, null, 1, false));
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.MEDIUM), null, null, null, null, null, 1, false));
checkList(repo.find(TENANT_ID, null, null, null, null, Lists.newArrayList(AlarmSeverity.CRITICAL, AlarmSeverity.MEDIUM), null, null, null, null, null, 1, false));
}
private void checkList(List<Alarm> found, Alarm... expected) {
assertEquals(found.size(), expected.length);
Alarm actual;