Merge "Pagination fix for ORM"
This commit is contained in:
commit
ef8a2c1ca4
|
@ -251,6 +251,7 @@ public class AlarmDefinitionSqlRepoImpl
|
|||
+ "LEFT OUTER JOIN alarm_action AS aa ON t.id = aa.alarm_definition_id ORDER BY t.id, t.created_at";
|
||||
|
||||
StringBuilder sbWhere = new StringBuilder();
|
||||
StringBuilder limitOffset = new StringBuilder();
|
||||
|
||||
if (name != null) {
|
||||
sbWhere.append(" and ad.name = :name");
|
||||
|
@ -271,16 +272,15 @@ public class AlarmDefinitionSqlRepoImpl
|
|||
}
|
||||
}
|
||||
|
||||
if (offset != null && !offset.equals("0")) {
|
||||
sbWhere.append(" and ad.id > :offset");
|
||||
}
|
||||
|
||||
String limitPart = "";
|
||||
if (limit > 0) {
|
||||
limitPart = " limit :limit";
|
||||
limitOffset.append(" limit :limit");
|
||||
}
|
||||
|
||||
String sql = String.format(query, SubAlarmDefinitionQueries.buildJoinClauseFor(dimensions), sbWhere, limitPart);
|
||||
if (offset != null) {
|
||||
limitOffset.append(" offset :offset ");
|
||||
}
|
||||
|
||||
String sql = String.format(query, SubAlarmDefinitionQueries.buildJoinClauseFor(dimensions), sbWhere, limitOffset);
|
||||
|
||||
try {
|
||||
session = sessionFactory.openSession();
|
||||
|
@ -288,6 +288,7 @@ public class AlarmDefinitionSqlRepoImpl
|
|||
final Query qAlarmDefinition = session
|
||||
.createSQLQuery(sql)
|
||||
.setString("tenantId", tenantId)
|
||||
.setReadOnly(true)
|
||||
.setResultTransformer(ALARM_DEF_RESULT_TRANSFORMER);
|
||||
|
||||
if (name != null) {
|
||||
|
@ -304,14 +305,14 @@ public class AlarmDefinitionSqlRepoImpl
|
|||
}
|
||||
}
|
||||
|
||||
if (offset != null && !offset.equals("0")) {
|
||||
qAlarmDefinition.setString("offset", offset);
|
||||
}
|
||||
|
||||
if (limit > 0) {
|
||||
qAlarmDefinition.setInteger("limit", limit + 1);
|
||||
}
|
||||
|
||||
if (offset != null) {
|
||||
qAlarmDefinition.setInteger("offset", Integer.parseInt(offset));
|
||||
}
|
||||
|
||||
this.bindDimensionsToQuery(qAlarmDefinition, dimensions);
|
||||
|
||||
final List<Map<?,?>> alarmDefinitionDbList = qAlarmDefinition.list();
|
||||
|
|
|
@ -27,6 +27,10 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Lists;
|
||||
import monasca.api.domain.exception.EntityNotFoundException;
|
||||
|
@ -34,9 +38,11 @@ import monasca.api.domain.model.alarmdefinition.AlarmDefinition;
|
|||
import monasca.api.domain.model.alarmdefinition.AlarmDefinitionRepo;
|
||||
import monasca.common.hibernate.db.AlarmActionDb;
|
||||
import monasca.common.hibernate.db.AlarmDefinitionDb;
|
||||
import monasca.common.hibernate.db.NotificationMethodDb;
|
||||
import monasca.common.hibernate.db.SubAlarmDefinitionDb;
|
||||
import monasca.common.hibernate.db.SubAlarmDefinitionDimensionDb;
|
||||
import monasca.common.model.alarm.AggregateFunction;
|
||||
import monasca.common.model.alarm.AlarmNotificationMethodType;
|
||||
import monasca.common.model.alarm.AlarmOperator;
|
||||
import monasca.common.model.alarm.AlarmSeverity;
|
||||
import monasca.common.model.alarm.AlarmState;
|
||||
|
@ -51,6 +57,7 @@ import org.testng.annotations.AfterMethod;
|
|||
import org.testng.annotations.BeforeMethod;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
|
||||
@Test(groups = "orm")
|
||||
|
@ -127,6 +134,22 @@ public class AlarmDefinitionSqlRepositoryImplTest {
|
|||
session.save(subAlarmDefinitionDimensionFlavorMetricNameCpu.setSubExpression(subAlarmDefinition111));
|
||||
session.save(subAlarmDefinitionDimensionDevice1.setSubExpression(subAlarmDefinition111));
|
||||
|
||||
final NotificationMethodDb notificationMethodDb29387234 = new NotificationMethodDb()
|
||||
.setAddress("root@localhost")
|
||||
.setName("root2938723")
|
||||
.setTenantId("bob")
|
||||
.setType(AlarmNotificationMethodType.EMAIL)
|
||||
.setPeriod(60);
|
||||
final NotificationMethodDb notificationMethodDb77778687 = new NotificationMethodDb()
|
||||
.setAddress("root@localhost")
|
||||
.setName("root77778687")
|
||||
.setTenantId("bob")
|
||||
.setType(AlarmNotificationMethodType.EMAIL)
|
||||
.setPeriod(60);
|
||||
|
||||
session.save(notificationMethodDb29387234.setId("29387234"));
|
||||
session.save(notificationMethodDb77778687.setId("77778687"));
|
||||
|
||||
final AlarmActionDb alarmAction29387234 = new AlarmActionDb()
|
||||
.setActionId("29387234")
|
||||
.setAlarmDefinition(alarmDefinition123)
|
||||
|
@ -380,20 +403,90 @@ public class AlarmDefinitionSqlRepositoryImplTest {
|
|||
}
|
||||
|
||||
public void shouldFilterBySeverity() {
|
||||
List<AlarmDefinition> alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, 1);
|
||||
AlarmDefinition alarmDefinition;
|
||||
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, 1),
|
||||
this.alarmDef_123);
|
||||
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, 1),
|
||||
this.alarmDef_234);
|
||||
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH, AlarmSeverity.LOW), null, null, 1),
|
||||
this.alarmDef_123, this.alarmDef_234);
|
||||
}
|
||||
|
||||
assertEquals(1, alarmDefinitions.size());
|
||||
alarmDefinition = alarmDefinitions.get(0);
|
||||
public void shouldFindWithOffset() {
|
||||
// create more alarm definition for this test
|
||||
final AlarmDefinition localAd1 = new AlarmDefinition("999", "60% CPU", null, "LOW",
|
||||
"avg(hpcs.compute{flavor_id=888, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 100",
|
||||
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
|
||||
Collections.<String>emptyList());
|
||||
final AlarmDefinition localAd2 = new AlarmDefinition("9999", "70% CPU", null, "LOW",
|
||||
"avg(hpcs.compute{flavor_id=999, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 99",
|
||||
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
|
||||
Collections.<String>emptyList());
|
||||
final AlarmDefinition localAd3 = new AlarmDefinition("99999", "80% CPU", null, "LOW",
|
||||
"avg(hpcs.compute{flavor_id=1111, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 88",
|
||||
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
|
||||
Collections.<String>emptyList());
|
||||
|
||||
assertEquals(this.alarmDef_123, alarmDefinition);
|
||||
final Session session = sessionFactory.openSession();
|
||||
session.beginTransaction();
|
||||
|
||||
alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, 1);
|
||||
for (final AlarmDefinition ad : Lists.newArrayList(localAd1, localAd2, localAd3)) {
|
||||
final AlarmDefinitionDb adDb = new AlarmDefinitionDb()
|
||||
.setTenantId("bob")
|
||||
.setName(ad.getName())
|
||||
.setSeverity(AlarmSeverity.valueOf(ad.getSeverity()))
|
||||
.setExpression(ad.getExpression())
|
||||
.setMatchBy(Joiner.on(",").join(ad.getMatchBy()))
|
||||
.setActionsEnabled(ad.isActionsEnabled());
|
||||
|
||||
assertEquals(1, alarmDefinitions.size());
|
||||
alarmDefinition = alarmDefinitions.get(0);
|
||||
session.save(adDb.setId(ad.getId()));
|
||||
|
||||
for (final String alarmActionId : ad.getAlarmActions()) {
|
||||
session.save(new AlarmActionDb()
|
||||
.setActionId(alarmActionId)
|
||||
.setAlarmDefinition(adDb)
|
||||
.setAlarmState(AlarmState.ALARM)
|
||||
);
|
||||
}
|
||||
}
|
||||
session.getTransaction().commit();
|
||||
session.close();
|
||||
|
||||
// run tests
|
||||
checkList(repo.find("bob", null, null, null, null, null, 1), this.alarmDef_123, this.alarmDef_234);
|
||||
checkList(repo.find("bob", null, null, null, null, "1", 1), this.alarmDef_234, localAd1);
|
||||
checkList(repo.find("bob", null, null, null, null, "2", 1), localAd1, localAd2);
|
||||
checkList(repo.find("bob", null, null, null, null, "3", 1), localAd2, localAd3);
|
||||
checkList(repo.find("bob", null, null, null, null, "4", 1), localAd3);
|
||||
checkList(repo.find("bob", null, null, null, null, "5", 1));
|
||||
|
||||
checkList(repo.find("bob", null, null, null, null, null, 0),
|
||||
this.alarmDef_123, this.alarmDef_234, localAd1, localAd2, localAd3);
|
||||
checkList(repo.find("bob", null, null, null, null, null, 6),
|
||||
this.alarmDef_123, this.alarmDef_234, localAd1, localAd2, localAd3);
|
||||
checkList(repo.find("bob", null, null, null, null, "2", 3),
|
||||
localAd1, localAd2, localAd3);
|
||||
}
|
||||
|
||||
private void checkList(List<AlarmDefinition> found, AlarmDefinition... expected) {
|
||||
assertEquals(found.size(), expected.length);
|
||||
AlarmDefinition actual;
|
||||
|
||||
for (final AlarmDefinition alarmDefinition : expected) {
|
||||
final Optional<AlarmDefinition> alarmOptional = FluentIterable
|
||||
.from(found)
|
||||
.firstMatch(new Predicate<AlarmDefinition>() {
|
||||
@Override
|
||||
public boolean apply(@Nullable final AlarmDefinition input) {
|
||||
assert input != null;
|
||||
return input.getId().equals(alarmDefinition.getId());
|
||||
}
|
||||
});
|
||||
assertTrue(alarmOptional.isPresent());
|
||||
|
||||
actual = alarmOptional.get();
|
||||
assertEquals(actual, alarmDefinition, String.format("%s not equal to %s", actual, alarmDefinition));
|
||||
}
|
||||
|
||||
assertEquals(this.alarmDef_234, alarmDefinition);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -83,13 +83,13 @@ class HibernateUtil {
|
|||
private static Properties getHikariMySqlProperties() {
|
||||
Properties properties = new Properties();
|
||||
properties.put("hibernate.connection.provider_class", "com.zaxxer.hikari.hibernate.HikariConnectionProvider");
|
||||
properties.put("hibernate.hbm2ddl.auto", "create-drop");
|
||||
properties.put("hibernate.hbm2ddl.auto", "validate");
|
||||
properties.put("show_sql", true);
|
||||
properties.put("hibernate.hikari.dataSourceClassName", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
|
||||
properties.put("hibernate.hikari.dataSource.url",
|
||||
"jdbc:mysql://localhost:3306/mon?useLegacyDatetimeCode=false&serverTimezone=UTC");
|
||||
properties.put("hibernate.hikari.dataSource.user", "root");
|
||||
properties.put("hibernate.hikari.dataSource.password", "");
|
||||
"jdbc:mysql://192.168.10.4:3306/mon?useLegacyDatetimeCode=false&serverTimezone=UTC");
|
||||
properties.put("hibernate.hikari.dataSource.user", "monapi");
|
||||
properties.put("hibernate.hikari.dataSource.password", "password");
|
||||
return properties;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue