monasca-api/java/src/test/java/monasca/api/integration/AlarmIntegrationTest.java

188 lines
7.6 KiB
Java

/*
* Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package monasca.api.integration;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.fail;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import kafka.javaapi.producer.Producer;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.google.common.io.Resources;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
import monasca.api.ApiConfig;
import monasca.api.MonApiModule;
import monasca.api.app.AlarmDefinitionService;
import monasca.api.app.command.CreateAlarmDefinitionCommand;
import monasca.api.domain.exception.EntityNotFoundException;
import monasca.api.domain.model.alarmdefinition.AlarmDefinition;
import monasca.api.domain.model.alarmdefinition.AlarmDefinitionRepo;
import monasca.api.domain.model.alarmstatehistory.AlarmStateHistoryRepo;
import monasca.api.infrastructure.persistence.mysql.AlarmDefinitionMySqlRepoImpl;
import monasca.api.infrastructure.persistence.mysql.AlarmMySqlRepoImpl;
import monasca.api.infrastructure.persistence.mysql.NotificationMethodMySqlRepoImpl;
import monasca.api.resource.AbstractMonApiResourceTest;
import monasca.api.resource.AlarmDefinitionResource;
import com.sun.jersey.api.client.ClientResponse;
@Test(groups = "integration", enabled = false)
public class AlarmIntegrationTest extends AbstractMonApiResourceTest {
private static final String TENANT_ID = "alarm-test";
private DBI mysqlDb;
private AlarmDefinition alarm;
private AlarmDefinitionService service;
private ApiConfig config;
private Producer<String, String> producer;
private AlarmDefinitionRepo repo;
AlarmStateHistoryRepo stateHistoryRepo;
private Map<String, String> dimensions;
private List<String> alarmActions;
@Override
protected void setupResources() throws Exception {
super.setupResources();
Handle handle = mysqlDb.open();
handle.execute("truncate table alarm");
handle.execute("truncate table notification_method");
handle
.execute("insert into notification_method (id, tenant_id, name, type, address, created_at, updated_at) values ('29387234', 'alarm-test', 'MyEmail', 'EMAIL', 'a@b', NOW(), NOW())");
handle
.execute("insert into notification_method (id, tenant_id, name, type, address, created_at, updated_at) values ('77778687', 'alarm-test', 'MyEmail', 'EMAIL', 'a@b', NOW(), NOW())");
mysqlDb.close(handle);
repo = new AlarmDefinitionMySqlRepoImpl(mysqlDb);
service =
new AlarmDefinitionService(config, producer, repo, new AlarmMySqlRepoImpl(mysqlDb),
new NotificationMethodMySqlRepoImpl(mysqlDb));
addResources(new AlarmDefinitionResource(service, repo));
}
@BeforeTest
protected void beforeTest() throws Exception {
config = getConfiguration("config-test.yml", ApiConfig.class);
Injector injector = Guice.createInjector(new MonApiModule(environment, config));
producer = injector.getInstance(Key.get(new TypeLiteral<Producer<String, String>>() {}));
mysqlDb = injector.getInstance(Key.get(DBI.class, Names.named("mysql")));
Handle handle = mysqlDb.open();
handle.execute(Resources.toString(
NotificationMethodMySqlRepoImpl.class.getResource("alarm.sql"),
Charset.defaultCharset()));
handle.execute(Resources.toString(
NotificationMethodMySqlRepoImpl.class.getResource("notification_method.sql"),
Charset.defaultCharset()));
handle.close();
// Fixtures
dimensions = new HashMap<String, String>();
dimensions.put("instance_id", "937");
alarmActions = new ArrayList<String>();
alarmActions.add("29387234");
alarmActions.add("77778687");
alarm =
new AlarmDefinition("123", "90% CPU", null, null,
"avg(hpcs.compute:cpu:{instance_id=123} > 10", Arrays.asList("instance_id"), true,
alarmActions, null, null);
}
@AfterTest
protected void afterTest() throws Exception {
producer.close();
}
public void shouldCreate() throws Exception {
ClientResponse response =
client()
.resource("/v2.0/alarms")
.header("X-Tenant-Id", TENANT_ID)
.header("Content-Type", MediaType.APPLICATION_JSON)
.post(
ClientResponse.class,
new CreateAlarmDefinitionCommand("90% CPU", null,
"avg(hpcs.compute:cpu:{instance_id=123} > 10", Arrays.asList("instance_id"),
null, alarmActions, null, null));
AlarmDefinition newAlarm = response.getEntity(AlarmDefinition.class);
String location = response.getHeaders().get("Location").get(0);
assertEquals(response.getStatus(), 201);
assertEquals(location, "/v2.0/alarms/" + newAlarm.getId());
assertEquals(alarm.getExpression(), newAlarm.getExpression());
assertEquals(alarm.getAlarmActions(), newAlarm.getAlarmActions());
}
public void shouldCreateCaseInsensitiveAndKeywords() throws Exception {
AlarmDefinition alarm_local;
alarm_local =
new AlarmDefinition("123", "90% CPU", null, null, "AvG(avg:cpu:{instance_id=123} gT 10",
Arrays.asList("instance_id"), true, alarmActions, null, null);
ClientResponse response =
client()
.resource("/v2.0/alarms")
.header("X-Tenant-Id", TENANT_ID)
.header("Content-Type", MediaType.APPLICATION_JSON)
.post(
ClientResponse.class,
new CreateAlarmDefinitionCommand("90% CPU", null,
"AvG(avg:cpu:{instance_id=123} gT 10", Arrays.asList("instance_id"), null,
alarmActions, null, null));
AlarmDefinition newAlarm = response.getEntity(AlarmDefinition.class);
String location = response.getHeaders().get("Location").get(0);
assertEquals(response.getStatus(), 201);
assertEquals(location, "/v2.0/alarms/" + newAlarm.getId());
assertEquals(alarm_local.getExpression(), newAlarm.getExpression());
assertEquals(alarm_local.getAlarmActions(), newAlarm.getAlarmActions());
}
public void shouldDelete() {
AlarmDefinition newAlarm =
repo.create(TENANT_ID, "123", alarm.getName(), alarm.getName(), alarm.getSeverity(),
alarm.getExpression(), null, alarm.getMatchBy(), alarm.getAlarmActions(),
alarm.getOkActions(), alarm.getUndeterminedActions());
assertNotNull(repo.findById(TENANT_ID, newAlarm.getId()));
ClientResponse response =
client().resource("/v2.0/alarms/" + newAlarm.getId()).header("X-Tenant-Id", TENANT_ID)
.delete(ClientResponse.class);
assertEquals(response.getStatus(), 204);
try {
assertNull(repo.findById(TENANT_ID, newAlarm.getId()));
fail();
} catch (EntityNotFoundException expected) {
}
}
}