/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2010, all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.rest;
import org.apache.commons.httpclient.HttpStatus;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.zenoss.protobufs.util.Util.TimestampRange;
import org.zenoss.protobufs.zep.Zep.Event;
import org.zenoss.protobufs.zep.Zep.EventFilter;
import org.zenoss.protobufs.zep.Zep.EventNote;
import org.zenoss.protobufs.zep.Zep.EventQuery;
import org.zenoss.protobufs.zep.Zep.EventStatus;
import org.zenoss.protobufs.zep.Zep.EventSummary;
import org.zenoss.protobufs.zep.Zep.EventSummaryUpdate;
import org.zenoss.protobufs.zep.Zep.EventSummaryUpdateRequest;
import org.zenoss.protobufs.zep.Zep.EventSummaryUpdateResponse;
import org.zenoss.zep.ZepException;
import org.zenoss.zep.dao.EventArchiveDao;
import org.zenoss.zep.dao.EventSummaryDao;
import org.zenoss.zep.dao.impl.EventArchiveDaoImplIT;
import org.zenoss.zep.dao.impl.EventSummaryDaoImplIT;
import org.zenoss.zep.impl.EventPreCreateContextImpl;
import org.zenoss.zep.rest.RestClient.RestResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import static org.junit.Assert.*;
@ContextConfiguration({ "classpath:zep-config.xml" })
public class EventsResourceIT extends AbstractJUnit4SpringContextTests {
private static final String EVENTS_URI = "/zeneventserver/api/1.0/events";
@Autowired
public EventSummaryDao summaryDao;
@Autowired
public EventArchiveDao archiveDao;
@Autowired
public DataSource ds;
private RestClient client;
private EventSummary summaryEvent;
private EventSummary archiveEvent;
private EventSummary createSummaryNew(Event event) throws ZepException {
return createSummary(event, EventStatus.STATUS_NEW);
}
private EventSummary createSummary(Event event, EventStatus status)
throws ZepException {
Event statusEvent = Event.newBuilder(event).setStatus(status).build();
String uuid = summaryDao.create(statusEvent, new EventPreCreateContextImpl());
return summaryDao.findByUuid(uuid);
}
private EventSummary createArchive(Event event) throws ZepException {
Event statusEvent = Event.newBuilder(event).setStatus(EventStatus.STATUS_CLOSED).build();
return archiveDao.findByUuid(archiveDao.create(statusEvent, new EventPreCreateContextImpl()));
}
@Before
public void setup() throws ZepException {
this.client = new RestClient(EventSummary.getDefaultInstance(),
EventNote.getDefaultInstance(),
EventSummaryUpdateRequest.getDefaultInstance(),
EventSummaryUpdateResponse.getDefaultInstance());
this.summaryEvent = createSummaryNew(EventSummaryDaoImplIT
.createUniqueEvent());
this.archiveEvent = createArchive(EventArchiveDaoImplIT.createEvent());
}
@After
public void shutdown() throws IOException, ZepException {
SimpleJdbcTemplate template = new SimpleJdbcTemplate(ds);
template.update("DELETE FROM event_summary");
template.update("DELETE FROM event_archive");
client.close();
}
@Test
public void testGetByUuid() throws ZepException, IOException {
assertEquals(summaryEvent,
client.getJson(EVENTS_URI + "/" + summaryEvent.getUuid())
.getMessage());
assertEquals(summaryEvent,
client.getProtobuf(EVENTS_URI + "/" + summaryEvent.getUuid())
.getMessage());
assertEquals(archiveEvent,
client.getJson(EVENTS_URI + "/" + archiveEvent.getUuid())
.getMessage());
assertEquals(archiveEvent,
client.getProtobuf(EVENTS_URI + "/" + archiveEvent.getUuid())
.getMessage());
}
@Test
public void testAddNote() throws IOException {
EventNote note = EventNote.newBuilder().setMessage("My Message")
.setUserName("pkw").setUserUuid(UUID.randomUUID().toString())
.build();
client.postJson(EVENTS_URI + "/" + summaryEvent.getUuid() + "/notes",
note);
note = EventNote.newBuilder().setMessage("My Message 2")
.setUserName("pkw").setUserUuid(UUID.randomUUID().toString())
.build();
client.postProtobuf(EVENTS_URI + "/" + summaryEvent.getUuid()
+ "/notes", note);
EventSummary summary = (EventSummary) client.getJson(
EVENTS_URI + "/" + summaryEvent.getUuid()).getMessage();
assertEquals(2, summary.getNotesCount());
// Notes returned in reverse order to match previous behavior
assertEquals("My Message 2", summary.getNotes(0).getMessage());
assertEquals("My Message", summary.getNotes(1).getMessage());
note = EventNote.newBuilder(note).setMessage("My Message 3").build();
client.postJson(EVENTS_URI + "/" + archiveEvent.getUuid() + "/notes",
note);
note = EventNote.newBuilder(note).setMessage("My Message 4").build();
client.postProtobuf(EVENTS_URI + "/" + archiveEvent.getUuid()
+ "/notes", note);
EventSummary archive = (EventSummary) client.getProtobuf(
EVENTS_URI + "/" + archiveEvent.getUuid()).getMessage();
assertEquals(2, archive.getNotesCount());
// Notes returned in reverse order to match previous behavior
assertEquals("My Message 4", archive.getNotes(0).getMessage());
assertEquals("My Message 3", archive.getNotes(1).getMessage());
}
@Test
public void testUpdateEventSummary() throws ZepException, IOException {
List<String> uuids = new ArrayList<String>(100);
for (int i = 0; i < 100; i++) {
uuids.add(createSummaryNew(EventSummaryDaoImplIT.createUniqueEvent()).getUuid());
}
// Update first 50
EventStatus status = EventStatus.STATUS_ACKNOWLEDGED;
String ackUuid = UUID.randomUUID().toString();
String ackName = "testuser123";
EventQuery.Builder queryBuilder = EventQuery.newBuilder();
queryBuilder.setEventFilter(EventFilter.newBuilder().addAllUuid(uuids).build());
EventQuery query = queryBuilder.build();
RestResponse restResponse = client.postProtobuf(EVENTS_URI + "/search", query);
assertEquals(HttpStatus.SC_CREATED, restResponse.getResponseCode());
String location = restResponse.getHeaders().get("location").get(0);
String query_uuid = location.substring(location.lastIndexOf('/') + 1);
final EventSummaryUpdate updateFields = EventSummaryUpdate.newBuilder()
.setCurrentUserUuid(ackUuid).setCurrentUserName(ackName).setStatus(status).build();
EventSummaryUpdateRequest.Builder reqBuilder = EventSummaryUpdateRequest.newBuilder();
reqBuilder.setLimit(50);
reqBuilder.setUpdateFields(updateFields);
EventSummaryUpdateRequest req = reqBuilder.build();
restResponse.getResponse().getEntity().consumeContent();
restResponse = client.putProtobuf(location, req);
EventSummaryUpdateResponse response = (EventSummaryUpdateResponse) restResponse.getMessage();
assertEquals(EventSummaryUpdateRequest.newBuilder(req).setOffset(50).setEventQueryUuid(query_uuid).build(),
response.getNextRequest());
assertEquals(uuids.size(), response.getTotal());
assertEquals(50, response.getUpdated());
// Repeat request for last 50
restResponse = client.putProtobuf(location, response.getNextRequest());
EventSummaryUpdateResponse newResponse = (EventSummaryUpdateResponse) restResponse.getMessage();
assertFalse(newResponse.hasNextRequest());
assertEquals(50, response.getUpdated());
assertEquals(uuids.size(), response.getTotal());
assertEquals(HttpStatus.SC_NO_CONTENT, client.delete(location).getResponseCode());
assertEquals(HttpStatus.SC_NOT_FOUND, client.getProtobuf(location).getResponseCode());
// Verify updates hit the database
List<EventSummary> summaries = summaryDao.findByUuids(uuids);
assertEquals(uuids.size(), summaries.size());
for (EventSummary summary : summaries) {
assertEquals(status, summary.getStatus());
assertEquals(ackUuid, summary.getCurrentUserUuid());
assertEquals(ackName, summary.getCurrentUserName());
}
}
@Test
public void testUpdateEventSummaryExclusions() throws ZepException, IOException {
long firstSeen = System.currentTimeMillis();
TimestampRange firstSeenRange = TimestampRange.newBuilder().setStartTime(firstSeen).setEndTime(firstSeen).build();
Set<String> uuids = new HashSet<String>();
Map<String,EventSummary> excludedUuids = new HashMap<String,EventSummary>();
for (int i = 0; i < 5; i++) {
Event event = Event.newBuilder(EventSummaryDaoImplIT.createUniqueEvent()).setCreatedTime(firstSeen).build();
EventSummary summary = createSummaryNew(event);
if ((i % 2) == 0) {
uuids.add(summary.getUuid());
}
else {
excludedUuids.put(summary.getUuid(), summary);
}
}
EventQuery.Builder queryBuilder = EventQuery.newBuilder();
queryBuilder.setEventFilter(EventFilter.newBuilder().addFirstSeen(firstSeenRange).build());
queryBuilder.setExclusionFilter(EventFilter.newBuilder().addAllUuid(excludedUuids.keySet()).build());
EventQuery query = queryBuilder.build();
RestResponse restResponse = client.postProtobuf(EVENTS_URI + "/search", query);
assertEquals(HttpStatus.SC_CREATED, restResponse.getResponseCode());
String location = restResponse.getHeaders().get("location").get(0);
restResponse.getResponse().getEntity().consumeContent();
// Update first 10
EventStatus status = EventStatus.STATUS_ACKNOWLEDGED;
String ackUuid = UUID.randomUUID().toString();
String ackName = "testuser123";
final EventSummaryUpdate updateFields = EventSummaryUpdate.newBuilder()
.setCurrentUserUuid(ackUuid).setCurrentUserName(ackName).setStatus(status).build();
EventSummaryUpdateRequest.Builder reqBuilder = EventSummaryUpdateRequest.newBuilder();
reqBuilder.setLimit(10);
reqBuilder.setUpdateFields(updateFields);
EventSummaryUpdateRequest req = reqBuilder.build();
EventSummaryUpdateResponse response = (EventSummaryUpdateResponse) client
.putProtobuf(location, req).getMessage();
assertFalse(response.hasNextRequest());
assertEquals(uuids.size(), response.getUpdated());
assertEquals(uuids.size(), response.getTotal());
assertEquals(HttpStatus.SC_NO_CONTENT, client.delete(location).getResponseCode());
assertEquals(HttpStatus.SC_NOT_FOUND, client.getProtobuf(location).getResponseCode());
// Verify updates hit the database
List<String> allUuids = new ArrayList<String>();
allUuids.addAll(uuids);
allUuids.addAll(excludedUuids.keySet());
List<EventSummary> summaries = summaryDao.findByUuids(allUuids);
assertEquals(allUuids.size(), summaries.size());
for (EventSummary summary : summaries) {
if (uuids.contains(summary.getUuid())) {
assertEquals(status, summary.getStatus());
assertEquals(ackUuid, summary.getCurrentUserUuid());
assertEquals(ackName, summary.getCurrentUserName());
}
else {
// Excluded UUIDs shouldn't have changed
assertEquals(excludedUuids.get(summary.getUuid()), summary);
}
}
}
}