/* * 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 producer; private AlarmDefinitionRepo repo; AlarmStateHistoryRepo stateHistoryRepo; private Map dimensions; private List 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>() {})); 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(); dimensions.put("instance_id", "937"); alarmActions = new ArrayList(); 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) { } } }