Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added alerts api support #26

Merged
merged 12 commits into from
Oct 8, 2015
13 changes: 13 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@
<hawkular.metrics.version>0.5.0.Final</hawkular.metrics.version>
<hawkular.inventory.version>0.3.2.Final</hawkular.inventory.version>
<hawkular.inventory.json.helper.version>0.3.2.Final</hawkular.inventory.json.helper.version>
<hawkular.alerts.version>0.5.0-SNAPSHOT</hawkular.alerts.version>
<resteasy.version>3.0.8.Final</resteasy.version>
<org.jboss.logging.version>3.3.0.Final</org.jboss.logging.version>
<excluded.tests>nothing-to-exclude</excluded.tests>
<excluded.groups>none</excluded.groups>
</properties>
Expand All @@ -73,6 +75,11 @@
<version>${hawkular.inventory.json.helper.version}</version>
</dependency>

<dependency>
<groupId>org.hawkular.alerts</groupId>
<artifactId>hawkular-alerts-api</artifactId>
<version>${hawkular.alerts.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
Expand Down Expand Up @@ -156,6 +163,12 @@
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>${org.jboss.logging.version}</version>
</dependency>

</dependencies>

<profiles>
Expand Down
62 changes: 56 additions & 6 deletions src/main/java/org/hawkular/client/ClientResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@
package org.hawkular.client;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.ws.rs.core.Response;

import org.hawkular.alerts.api.json.JacksonDeserializer;
import org.hawkular.alerts.api.model.condition.Condition;
import org.hawkular.inventory.api.model.CanonicalPath;
import org.hawkular.inventory.api.model.Tenant;
import org.hawkular.inventory.json.InventoryJacksonConfig;
Expand All @@ -31,6 +36,7 @@

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ClientResponse<T> {
Expand All @@ -41,21 +47,52 @@ public class ClientResponse<T> {
private boolean success = false;

public ClientResponse(Class<?> clazz, Response response, int statusCode) {
this(clazz, response, statusCode, null, false);
this(clazz, response, statusCode, null, null);
}

public ClientResponse(Class<?> clazz, Response response, int statusCode, String tenantId) {
this(clazz, response, statusCode, tenantId, false);
this(clazz, response, statusCode, tenantId, null);
}

public ClientResponse(Class<?> clazz, Response response, int statusCode, boolean isEntityList) {
this(clazz, response, statusCode, null, isEntityList == true ? List.class : null);
}

@SuppressWarnings("unchecked")
public ClientResponse(Class<?> clazz, Response response, int statusCode, String tenantId, boolean isEntityList) {
this(clazz, response, statusCode, tenantId, isEntityList == true ? List.class : null);
}

public ClientResponse(Class<?> clazz, Response response, int statusCode,
@SuppressWarnings("rawtypes") Class<? extends Collection> collectionType) {
this(clazz, response, statusCode, null, collectionType);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public ClientResponse(Class<?> clazz, Response response, int statusCode, String tenantId,
Class<? extends Collection> collectionType) {
try {
this.setStatusCode(response.getStatus());
if (response.getStatus() == statusCode) {
this.setSuccess(true);
if (clazz.getName().equalsIgnoreCase(String.class.getName())) {
this.setEntity((T) response.readEntity(clazz));
} else if (clazz.getName().equalsIgnoreCase(Condition.class.getName())) {
ObjectMapper objectMapper = new ObjectMapper();
String jsonConditions = response.readEntity(String.class);
JsonNode rootNode = objectMapper.readTree(jsonConditions);
List<Condition> conditions = new ArrayList<>();
if (!(null == jsonConditions || jsonConditions.trim().isEmpty())) {
for (JsonNode conditionNode : rootNode) {
Condition condition = JacksonDeserializer.deserializeCondition(conditionNode);
if (condition == null) {
this.setSuccess(false);
this.setErrorMsg("Bad json conditions: " + jsonConditions);
return;
}
conditions.add(condition);
}
}
this.setEntity((T) conditions);
} else {
ObjectMapper objectMapper = new ObjectMapper();
InventoryJacksonConfig.configure(objectMapper);
Expand All @@ -65,10 +102,9 @@ public ClientResponse(Class<?> clazz, Response response, int statusCode, String
PathDeserializer.setCurrentCanonicalOrigin(CanonicalPath.of()
.tenant(tenantId).get());
}
if (isEntityList) {
if (collectionType != null) {
this.setEntity(objectMapper.readValue(response.readEntity(String.class),
objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)));

objectMapper.getTypeFactory().constructCollectionType(collectionType, clazz)));
} else {
this.setEntity((T) objectMapper.readValue(response.readEntity(String.class), clazz));
}
Expand Down Expand Up @@ -118,4 +154,18 @@ public String getErrorMsg() {
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}

@SuppressWarnings("unchecked")
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Status Code:").append(this.statusCode);
builder.append(", Is Success:").append(this.success);
builder.append(", Error Message:").append(this.errorMsg == null ? "-" : this.errorMsg);
if (this.entity instanceof Object[]) {
builder.append(", Entity:").append(Arrays.toString((T[]) this.entity));
} else {
builder.append(", Entity:[").append(this.entity).append("]");
}
return builder.toString();
}
}
9 changes: 9 additions & 0 deletions src/main/java/org/hawkular/client/HawkularClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import java.net.URI;
import java.util.Objects;

import org.hawkular.client.alert.AlertsClient;
import org.hawkular.client.alert.AlertsClientImpl;
import org.hawkular.client.inventory.InventoryClient;
import org.hawkular.client.inventory.InventoryClientImpl;
import org.hawkular.client.metrics.MetricsClient;
Expand All @@ -29,12 +31,14 @@
public class HawkularClient {
private MetricsClient metricsClient;
private InventoryClient inventoryClient;
private AlertsClient alertsClient;
private URI endpointUri;

public HawkularClient(URI endpointUri, String username, String password) throws Exception {
this.endpointUri = endpointUri;
metricsClient = new MetricsClientImpl(endpointUri, username, password);
inventoryClient = new InventoryClientImpl(endpointUri, username, password);
alertsClient = new AlertsClientImpl(endpointUri, username, password);
}

public MetricsClient metrics() {
Expand All @@ -45,6 +49,10 @@ public InventoryClient inventory() {
return inventoryClient;
}

public AlertsClient alerts() {
return alertsClient;
}

public int hashcode() {
return Objects.hash(endpointUri.hashCode());
}
Expand All @@ -54,4 +62,5 @@ public String toString() {
add("endpoint", endpointUri)
.toString();
}

}
170 changes: 170 additions & 0 deletions src/main/java/org/hawkular/client/alert/AlertsClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
/*
* Copyright 2015 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");
* 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 org.hawkular.client.alert;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hawkular.alerts.api.json.GroupMemberInfo;
import org.hawkular.alerts.api.json.UnorphanMemberInfo;
import org.hawkular.alerts.api.model.condition.Alert;
import org.hawkular.alerts.api.model.condition.Condition;
import org.hawkular.alerts.api.model.dampening.Dampening;
import org.hawkular.alerts.api.model.data.MixedData;
import org.hawkular.alerts.api.model.trigger.Mode;
import org.hawkular.alerts.api.model.trigger.Trigger;
import org.hawkular.client.ClientResponse;

/**
* @author [email protected] (Jeeva Kandasamy)
*/
public interface AlertsClient {
public enum RESPONSE_CODE {
GET_SUCCESS(200),
CREATE_SUCCESS(200),
ADD_SUCCESS(201),
REGISTER_SUCCESS(201),
UPDATE_SUCCESS(200),
DELETE_SUCCESS(200),
REMOVE_SUCCESS(204);

private int code;

private RESPONSE_CODE(int code) {
this.code = code;
}

int value() {
return this.code;
}
}

public enum TRIGGER_CONDITION_TYPE {
AVAILABILITY_CONDITION,
COMPARE_CONDITION,
EXTERNAL_CONDITION,
STRING_CONDITION,
THRESHOLD_CONDITION,
THRESHOLD_RANGE_CONDITION
}

//Triggers

ClientResponse<List<Trigger>> findTriggers();

ClientResponse<List<Trigger>> findTriggersByTag(String category, String name);

ClientResponse<List<Trigger>> findGroupMembers(String groupId, boolean includeOrphans);

ClientResponse<Trigger> createTrigger(Trigger trigger);

ClientResponse<String> createGroupTrigger(Trigger groupTrigger);

ClientResponse<String> createGroupMember(GroupMemberInfo groupMember);

ClientResponse<Trigger> getTrigger(String triggerId);

ClientResponse<String> updateTrigger(String triggerId, Trigger trigger);

ClientResponse<String> updateGroupTrigger(String groupId, Trigger groupTrigger);

ClientResponse<String> orphanMemberTrigger(String memberId);

ClientResponse<String> unorphanMemberTrigger(String memberId, UnorphanMemberInfo unorphanMemberInfo);

ClientResponse<String> deleteTrigger(String triggerId);

ClientResponse<String> deleteGroupTrigger(String groupId, boolean keepNonOrphans, boolean keepOrphans);

ClientResponse<List<Dampening>> getTriggerDampenings(String triggerId);

ClientResponse<List<Dampening>> getTriggerModeDampenings(String triggerId, Mode triggerMode);

ClientResponse<Dampening> getDampening(String triggerId, String dampeningId);

ClientResponse<Dampening> createDampening(String triggerId, Dampening dampening);

ClientResponse<Dampening> createGroupDampening(String groupId, Dampening dampening);

ClientResponse<Dampening> updateDampening(String triggerId, String dampeningId, Dampening dampening);

ClientResponse<Dampening> updateGroupDampening(String groupId, String dampeningId, Dampening dampening);

ClientResponse<String> deleteDampening(String triggerId, String dampeningId);

ClientResponse<String> deleteGroupDampening(String groupId, String dampeningId);

ClientResponse<List<Condition>> getTriggerConditions(Trigger trigger);

ClientResponse<List<Condition>> getTriggerConditions(String triggerId);

ClientResponse<List<Condition>> setConditions(String triggerId, String triggerMode,
List<Condition> conditions);

ClientResponse<List<Condition>> setGroupConditions(String groupId, String triggerMode,
String jsonGroupConditionsInfo);

//Alerts

ClientResponse<List<Alert>> findAlerts(
Long startTime, Long endTime, String alertIds, String triggerIds,
String statuses, String severities, String tags, Boolean thin);

ClientResponse<String> findAlerts();

ClientResponse<String> ackAlert(String alertId, String ackBy, String ackNotes);

ClientResponse<String> ackAlerts(String alertIds, String ackBy, String ackNotes);

ClientResponse<String> deleteAlert(String alertId);

ClientResponse<Integer> deleteAlerts(
Long startTime, Long endTime, String alertIds, String triggerIds,
String statuses, String severities, String tags);

ClientResponse<Alert> getAlert(String alertId, Boolean thin);

ClientResponse<String> resolveAlert(String alertId, String resolvedBy, String resolvedNotes);

ClientResponse<String> resolveAlerts(String alertIds, String resolvedBy, String resolvedNotes);

ClientResponse<String> sendData(MixedData mixedData);

ClientResponse<String> reloadAlerts();

ClientResponse<String> reloadTrigger(String triggerId);

//Actions

ClientResponse<Map<String, Set<String>>> findActions();

ClientResponse<List<String>> findActionsByPlugin(String actionPlugin);

ClientResponse<Map<String, String>> createAction(Map<String, String> actionProperties);

ClientResponse<Map<String, String>> updateAction(String actionPlugin, String actionId,
Map<String, String> actionProperties);

ClientResponse<String> deleteAction(String actionPlugin, String actionId);

//Plugins

ClientResponse<String[]> findActionPlugins();

ClientResponse<String[]> getActionPlugin(String actionPlugin);
}
Loading