Skip to content

Commit

Permalink
HWKALERTS-124 Add full trigger rests endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasponce committed Jan 16, 2016
1 parent b698413 commit 4bbae97
Show file tree
Hide file tree
Showing 3 changed files with 214 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,20 @@ public class JsonImport {
* @return a FullTrigger object with the parsed json
* @throws Exception on any issue
*/
public static FullTrigger readFullTrigger(String strFullTrigger) throws Exception {
public static FullTrigger readFullTrigger(String tenantId, String strFullTrigger) throws Exception {
if (tenantId == null || tenantId.isEmpty()) {
throw new IllegalArgumentException("tenantId must be not null");
}
if (strFullTrigger == null || strFullTrigger.isEmpty()) {
throw new IllegalArgumentException("strFullTrigger must be not null");
}
Map<String, Object> rawTrigger = om.readValue(strFullTrigger, Map.class);
if (rawTrigger.get("trigger") == null) {
throw new IllegalArgumentException("strFullTrigger must contain a trigger");
} else {
Map<String, Object> trigger = (Map<String, Object>) rawTrigger.get("trigger");
trigger.put("tenantId", tenantId);
}
return readFullTrigger(rawTrigger);
}

Expand All @@ -75,6 +84,12 @@ public static FullTrigger readFullTrigger(Map<String, Object> mapFullTrigger) th
String strTrigger = om.writeValueAsString(mapFullTrigger.get("trigger"));

Trigger trigger = om.readValue(strTrigger, Trigger.class);
if (trigger.getTenantId() == null || trigger.getTenantId().isEmpty()) {
throw new IllegalArgumentException("tenantId must be nont null");
}
if (trigger.getId() == null || trigger.getId().isEmpty()) {
throw new IllegalArgumentException("trigger id must be nont null");
}
List<Dampening> dampenings = new ArrayList<>();
List<Map<String, Object>> rawDampenings = (List<Map<String, Object>>) mapFullTrigger.get("dampenings");
for (Map<String, Object> rawDampening : rawDampenings) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates
* Copyright 2015-2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -422,4 +422,66 @@ class TriggersITest extends AbstractITestBase {
assertEquals(200, resp.status)
}

@Test
void createFullTrigger() {
String jsonTrigger = "{\n" +
" \"trigger\":{\n" +
" \"id\": \"full-test-trigger-1\",\n" +
" \"enabled\": true,\n" +
" \"name\": \"NumericData-01-low\",\n" +
" \"description\": \"description 1\",\n" +
" \"severity\": \"HIGH\",\n" +
" \"actions\": {\n" +
" \"snmp\": [\"SNMP-Trap-1\", \"SNMP-Trap-2\"],\n" +
" \"sms\": [\"sms-to-cio\"],\n" +
" \"email\": [\"email-to-admin\"],\n" +
" \"aerogear\": [\"agpush-to-admin\"]\n" +
" },\n" +
" \"context\": {\n" +
" \"name1\":\"value1\"\n" +
" },\n" +
" \"tags\": {\n" +
" \"tname1\":\"tvalue1\",\n" +
" \"tname2\":\"tvalue2\"\n" +
" }\n" +
" },\n" +
" \"dampenings\":[\n" +
" {\n" +
" \"triggerMode\": \"FIRING\",\n" +
" \"type\": \"STRICT\",\n" +
" \"evalTrueSetting\": 2,\n" +
" \"evalTotalSetting\": 2\n" +
" }\n" +
" ],\n" +
" \"conditions\":[\n" +
" {\n" +
" \"triggerMode\": \"FIRING\",\n" +
" \"type\": \"threshold\",\n" +
" \"dataId\": \"NumericData-01\",\n" +
" \"operator\": \"LT\",\n" +
" \"threshold\": 10.0,\n" +
" \"context\": {\n" +
" \"description\": \"Response Time\",\n" +
" \"unit\": \"ms\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }";

// remove if it exists
def resp = client.delete(path: "triggers/full-test-trigger-1")
assert(200 == resp.status || 404 == resp.status)

// create the test trigger
resp = client.post(path: "triggers/trigger", body: jsonTrigger)
assertEquals(200, resp.status)

resp = client.get(path: "triggers/trigger/full-test-trigger-1");
assertEquals(200, resp.status)
assertEquals("NumericData-01-low", resp.data.trigger.name)
assertEquals(testTenant, resp.data.trigger.tenantId)
assertEquals(1, resp.data.dampenings.size())
assertEquals(1, resp.data.conditions.size())
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates
* Copyright 2015-2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
Expand All @@ -24,7 +24,9 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.ejb.EJB;
import javax.ws.rs.Consumes;
Expand All @@ -44,6 +46,8 @@
import org.hawkular.alerts.api.exception.NotFoundException;
import org.hawkular.alerts.api.json.GroupMemberInfo;
import org.hawkular.alerts.api.json.JacksonDeserializer;
import org.hawkular.alerts.api.json.JsonImport;
import org.hawkular.alerts.api.json.JsonImport.FullTrigger;
import org.hawkular.alerts.api.json.UnorphanMemberInfo;
import org.hawkular.alerts.api.model.condition.Condition;
import org.hawkular.alerts.api.model.dampening.Dampening;
Expand Down Expand Up @@ -164,11 +168,11 @@ private TriggersCriteria buildCriteria(String triggerIds, String tags, Boolean t
@ApiResponse(code = 200, message = "Success"),
@ApiResponse(code = 500, message = "Internal server error") })
public Response findGroupMembers(
@ApiParam(value = "Group TriggerId", required = true)//
@PathParam("groupId")//
@ApiParam(value = "Group TriggerId", required = true)
@PathParam("groupId")
final String groupId,
@ApiParam(value = "include Orphan members? No if omitted.", required = false)//
@QueryParam("includeOrphans")//
@ApiParam(value = "include Orphan members? No if omitted.", required = false)
@QueryParam("includeOrphans")
final boolean includeOrphans) {
try {
Collection<Trigger> members = definitions.getMemberTriggers(tenantId, groupId, includeOrphans);
Expand Down Expand Up @@ -216,6 +220,76 @@ public Response createTrigger(
}
}

@POST
@Path("/trigger")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
@ApiOperation(
value = "Create a new full trigger (trigger, dampenings and conditions)",
response = FullTrigger.class,
notes = "Returns created full Trigger")
public Response createFullTrigger(
@ApiParam(value = "Full Trigger definition (trigger, dampenings, conditions) to be created",
name = "jsonFullTrigger", required = true)
final String jsonFullTrigger) {
if (isEmpty(jsonFullTrigger)) {
return ResponseUtil.badRequest("Trigger is null");
}
FullTrigger fullTrigger;
try {
fullTrigger = JsonImport.readFullTrigger(tenantId, jsonFullTrigger);
} catch (Exception e) {
log.debug(e.getMessage(), e);
return ResponseUtil.badRequest("Malformed trigger: " + e.getMessage());
}
if (fullTrigger == null || fullTrigger.getTrigger() == null) {
return ResponseUtil.badRequest("Trigger is empty ");
}
try {
Trigger trigger = fullTrigger.getTrigger();
trigger.setTenantId(tenantId);
if (isEmpty(trigger.getId())) {
trigger.setId(Trigger.generateId());
} else if (definitions.getTrigger(tenantId, trigger.getId()) != null) {
return ResponseUtil.badRequest("Trigger with ID [" + trigger.getId() + "] exists.");
}
definitions.addTrigger(tenantId, trigger);
log.debug("Trigger: " + trigger.toString());
for (Dampening dampening : fullTrigger.getDampenings()) {
dampening.setTenantId(tenantId);
dampening.setTriggerId(trigger.getId());
boolean exist = (definitions.getDampening(tenantId, dampening.getDampeningId()) != null);
if (exist) {
definitions.removeDampening(tenantId, dampening.getDampeningId());
}
definitions.addDampening(tenantId, dampening);
log.debug("Dampening: " + dampening.toString());
}
fullTrigger.getConditions().stream().forEach(c -> {
c.setTenantId(tenantId);
c.setTriggerId(trigger.getId());
});
List<Condition> firingConditions = fullTrigger.getConditions().stream()
.filter(c -> c.getTriggerMode() == Mode.FIRING)
.collect(Collectors.toList());
if (firingConditions != null && !firingConditions.isEmpty()) {
definitions.setConditions(tenantId, trigger.getId(), Mode.FIRING, firingConditions);
log.debug("Conditions: " + firingConditions);
}
List<Condition> autoResolveConditions = fullTrigger.getConditions().stream()
.filter(c -> c.getTriggerMode() == Mode.AUTORESOLVE)
.collect(Collectors.toList());
if (autoResolveConditions != null && !autoResolveConditions.isEmpty()) {
definitions.setConditions(tenantId, trigger.getId(), Mode.AUTORESOLVE, autoResolveConditions);
log.debug("Conditions:" + autoResolveConditions);
}
return ResponseUtil.ok(fullTrigger);
} catch (Exception e) {
log.debug(e.getMessage(), e);
return ResponseUtil.internalError(e.getMessage());
}
}

@POST
@Path("/groups")
@Consumes(APPLICATION_JSON)
Expand Down Expand Up @@ -264,7 +338,7 @@ public Response createGroupTrigger(
@ApiResponse(code = 404, message = "Group trigger not found."),
@ApiResponse(code = 400, message = "Bad Request/Invalid Parameters") })
public Response createGroupMember(
@ApiParam(value = "Group member trigger to be created", name = "groupMember", required = true)//
@ApiParam(value = "Group member trigger to be created", name = "groupMember", required = true)
final GroupMemberInfo groupMember) {
try {
if (null == groupMember) {
Expand Down Expand Up @@ -322,6 +396,39 @@ public Response getTrigger(
}
}

@GET
@Path("/trigger/{triggerId}")
@Produces(APPLICATION_JSON)
@ApiOperation(value = "Get an existing trigger definition",
response = Trigger.class)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success, Trigger found"),
@ApiResponse(code = 404, message = "Trigger not found"),
@ApiResponse(code = 500, message = "Internal server error") })
public Response getFullTrigger(
@ApiParam(value = "Full Trigger definition id to be retrieved", required = true)
@PathParam("triggerId")
final String triggerId) {
try {
Trigger found = definitions.getTrigger(tenantId, triggerId);
if (found != null) {
log.debug("Trigger: " + found);
List<Dampening> dampenings = new ArrayList<>(definitions.getTriggerDampenings(tenantId, found.getId(),
null));
List<Condition> conditions = new ArrayList<>(definitions.getTriggerConditions(tenantId, found.getId(),
null));
FullTrigger fullTrigger = new FullTrigger(found, dampenings, conditions);
return ResponseUtil.ok(fullTrigger);
} else {
return ResponseUtil.notFound("triggerId: " + triggerId + " not found");
}

} catch (Exception e) {
log.debug(e.getMessage(), e);
return ResponseUtil.internalError(e.getMessage());
}
}

@PUT
@Path("/{triggerId}")
@Consumes(APPLICATION_JSON)
Expand Down Expand Up @@ -398,8 +505,8 @@ public Response updateGroupTrigger(
@ApiResponse(code = 500, message = "Internal server error"),
@ApiResponse(code = 404, message = "Trigger doesn't exist/Invalid Parameters") })
public Response orphanMemberTrigger(
@ApiParam(value = "Member Trigger id to be made an orphan.", required = true)//
@PathParam("memberId")//
@ApiParam(value = "Member Trigger id to be made an orphan.", required = true)
@PathParam("memberId")
final String memberId) {
try {
Trigger child = definitions.orphanMemberTrigger(tenantId, memberId);
Expand All @@ -426,11 +533,11 @@ public Response orphanMemberTrigger(
@ApiResponse(code = 500, message = "Internal server error"),
@ApiResponse(code = 404, message = "Trigger doesn't exist/Invalid Parameters") })
public Response unorphanMemberTrigger(
@ApiParam(value = "Member Trigger id to be made an orphan.", required = true)//
@PathParam("memberId")//
@ApiParam(value = "Member Trigger id to be made an orphan.", required = true)
@PathParam("memberId")
final String memberId,
@ApiParam(required = true, name = "memberTrigger",
value = "Only context and dataIdMap are used when changing back to a non-orphan.")//
value = "Only context and dataIdMap are used when changing back to a non-orphan.")
final UnorphanMemberInfo unorphanMemberInfo) {
try {
if (null == unorphanMemberInfo) {
Expand Down Expand Up @@ -460,7 +567,7 @@ public Response unorphanMemberTrigger(
@ApiResponse(code = 500, message = "Internal server error"),
@ApiResponse(code = 404, message = "Trigger not found") })
public Response deleteTrigger(
@ApiParam(value = "Trigger definition id to be deleted", required = true) @PathParam("triggerId")//
@ApiParam(value = "Trigger definition id to be deleted", required = true) @PathParam("triggerId")
final String triggerId) {
try {
definitions.removeTrigger(tenantId, triggerId);
Expand Down Expand Up @@ -490,14 +597,14 @@ public Response deleteTrigger(
@ApiResponse(code = 404, message = "Group Trigger not found"),
@ApiResponse(code = 400, message = "Bad Request/Invalid Parameters") })
public Response deleteGroupTrigger(
@ApiParam(required = true, value = "Group Trigger id")//
@PathParam("groupId")//
@ApiParam(required = true, value = "Group Trigger id")
@PathParam("groupId")
final String groupId,
@ApiParam(required = true, value = "Convert the non-orphan member triggers to standard triggers.")//
@QueryParam("keepNonOrphans")//
@ApiParam(required = true, value = "Convert the non-orphan member triggers to standard triggers.")
@QueryParam("keepNonOrphans")
final boolean keepNonOrphans,
@ApiParam(required = true, value = "Convert the orphan member triggers to standard triggers.")//
@QueryParam("keepOrphans")//
@ApiParam(required = true, value = "Convert the orphan member triggers to standard triggers.")
@QueryParam("keepOrphans")
final boolean keepOrphans) {
try {
definitions.removeGroupTrigger(tenantId, groupId, keepNonOrphans, keepOrphans);
Expand Down Expand Up @@ -545,11 +652,11 @@ public Response getTriggerDampenings(
@ApiResponse(code = 200, message = "Success"),
@ApiResponse(code = 500, message = "Internal server error") })
public Response getTriggerModeDampenings(
@ApiParam(value = "Trigger definition id to be retrieved", required = true)//
@PathParam("triggerId")//
@ApiParam(value = "Trigger definition id to be retrieved", required = true)
@PathParam("triggerId")
final String triggerId,//
@ApiParam(value = "Trigger mode", required = true)//
@PathParam("triggerMode")//
@ApiParam(value = "Trigger mode", required = true)
@PathParam("triggerMode")
final Mode triggerMode) {
try {
Collection<Dampening> dampenings = definitions.getTriggerDampenings(tenantId, triggerId,
Expand Down Expand Up @@ -640,10 +747,10 @@ public Response createDampening(
@ApiResponse(code = 500, message = "Internal server error"),
@ApiResponse(code = 400, message = "Bad Request/Invalid Parameters") })
public Response createGroupDampening(
@ApiParam(value = "Group Trigger definition id attached to dampening", required = true)//
@PathParam("groupId")//
@ApiParam(value = "Group Trigger definition id attached to dampening", required = true)
@PathParam("groupId")
final String groupId,
@ApiParam(value = "Dampening definition to be created", required = true)//
@ApiParam(value = "Dampening definition to be created", required = true)
final Dampening dampening) {
try {
dampening.setTriggerId(groupId);
Expand Down Expand Up @@ -904,7 +1011,7 @@ public Response setConditions(
final String triggerMode,
@ApiParam(value = "Json representation of a condition list. For examples of Condition types, See "
+ "https://github.com/hawkular/hawkular-alerts/blob/master/hawkular-alerts-rest-tests/"
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")//
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")
String jsonConditions) {
try {
Mode mode = Mode.valueOf(triggerMode.toUpperCase());
Expand Down Expand Up @@ -960,7 +1067,7 @@ public Response setGroupConditions(
final String triggerMode,
@ApiParam(value = "Json representation of GroupConditionsInfo. For examples of Condition types, See "
+ "https://github.com/hawkular/hawkular-alerts/blob/master/hawkular-alerts-rest-tests/"
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")//
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")
String jsonGroupConditionsInfo) {
try {
if (isEmpty(jsonGroupConditionsInfo)) {
Expand Down Expand Up @@ -1024,7 +1131,7 @@ public Response createCondition(
final String triggerId,
@ApiParam(value = "Json representation of a condition. For examples of Condition types, See "
+ "https://github.com/hawkular/hawkular-alerts/blob/master/hawkular-alerts-rest-tests/"
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")//
+ "src/test/groovy/org/hawkular/alerts/rest/ConditionsITest.groovy")
String jsonCondition) {
try {
if (isEmpty(jsonCondition) || !jsonCondition.contains("type")) {
Expand Down

0 comments on commit 4bbae97

Please sign in to comment.