[ONOS-3203] End-to-end demo of Fault Management via SNMP.
This adds SNMP device-discovery, and a Fault Management app which makes alarms available to users via REST/GUI/CLI interfaces.
There is still code cleanup that could be done, but aim of this commit is an end-to-end proof of concept.
To demonstrate :
1) /opt/onos/bin/onos-service
onos> app activate org.onosproject.snmp
onos> app activate org.onosproject.faultmanagement
2) SNMP devices are seeded via config file. The default seed file contains connection details for devices (SNMP agents) available via internet e.g. demo.snmplabs.com
cp /opt/onos/apache-karaf-3.0.3/etc/samples/org.onosproject.provider.snmp.device.impl.SnmpDeviceProvider.cfg /opt/onos/apache-karaf-3.0.3/etc/
3) ONOS will poll these SNMP devices and store their alarms.
4) You can now manipulate the alarms via REST e.g. http://<onos>:8181/onos/v1/fm/alarms , via CLI via various "alarm-*” commands or in UI with an Alarms Overlay.
More info at https://wiki.onosproject.org/display/ONOS/Fault+Management
15/Dec/15: Updated regarding review comments from Thomas Vachuska.
17/Dec/15: Updated coreService.registerApplication(name) as per https://gerrit.onosproject.org/#/c/6878/
Change-Id: I886f8511f178dc4600ab96e5ff10cc90329cabec
diff --git a/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmsWebResource.java b/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmsWebResource.java
index d62fa76..118cd18 100644
--- a/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmsWebResource.java
+++ b/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmsWebResource.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2014-2015 Open Networking Laboratory
+ * Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,9 @@
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
+import org.apache.commons.lang.StringUtils;
import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
+import org.onosproject.net.DeviceId;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;
@@ -48,31 +50,32 @@
private final Logger log = getLogger(getClass());
- public AlarmsWebResource() {
- }
-
/**
- * Get all alarms. Returns a list of all alarms across all devices.
+ * Get alarms. Returns a list of alarms
*
- * @param includeCleared include recently cleared alarms in response
+ * @param includeCleared (optional) include recently cleared alarms in response
+ * @param devId (optional) include only for specified device
* @return JSON encoded set of alarms
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
- public Response getAlarms(@DefaultValue("false") @QueryParam("includeCleared") boolean includeCleared
+ public Response getAlarms(@DefaultValue("false") @QueryParam("includeCleared") boolean includeCleared,
+ @DefaultValue("") @QueryParam("devId") String devId
) {
log.info("Requesting all alarms, includeCleared={}", includeCleared);
- final AlarmService service = get(AlarmService.class);
+ AlarmService service = get(AlarmService.class);
- final Iterable<Alarm> alarms = includeCleared
- ? service.getAlarms()
- : service.getActiveAlarms();
-
- final ObjectNode result = new ObjectMapper().createObjectNode();
- result.set("alarms",
- codec(Alarm.class).
- encode(alarms, this));
+ Iterable<Alarm> alarms;
+ if (StringUtils.isBlank(devId)) {
+ alarms = includeCleared
+ ? service.getAlarms()
+ : service.getActiveAlarms();
+ } else {
+ alarms = service.getAlarms(DeviceId.deviceId(devId));
+ }
+ ObjectNode result = new ObjectMapper().createObjectNode();
+ result.set("alarms", new AlarmCodec().encode(alarms, this));
return ok(result.toString()).build();
}
@@ -89,11 +92,11 @@
public Response getAlarm(@PathParam("id") String id) {
log.info("HTTP GET alarm for id={}", id);
- final AlarmId alarmId = toAlarmId(id);
- final Alarm alarm = get(AlarmService.class).getAlarm(alarmId);
+ AlarmId alarmId = toAlarmId(id);
+ Alarm alarm = get(AlarmService.class).getAlarm(alarmId);
- final ObjectNode result = mapper().createObjectNode();
- result.set("alarm", codec(Alarm.class).encode(alarm, this));
+ ObjectNode result = new ObjectMapper().createObjectNode();
+ result.set("alarm", new AlarmCodec().encode(alarm, this));
return ok(result.toString()).build();
}
@@ -113,20 +116,22 @@
log.info("PUT NEW ALARM at /{}", alarmIdPath);
try {
- final ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
+ ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
log.info("jsonTree={}", jsonTree);
- final Alarm alarm = codec(Alarm.class).decode(jsonTree, this);
+ Alarm alarm = new AlarmCodec().decode(jsonTree, this);
- final AlarmService service = get(AlarmService.class);
+ AlarmService service = get(AlarmService.class);
if (Long.parseLong(alarmIdPath) != alarm.id().fingerprint()) {
throw new IllegalArgumentException("id in path is " + Long.parseLong(alarmIdPath)
+ " but payload uses id=" + alarm.id().fingerprint());
}
- final Alarm updated = service.update(alarm);
- final ObjectNode encoded = new AlarmCodec().encode(updated, this);
+ Alarm updated = service.updateBookkeepingFields(
+ alarm.id(), alarm.acknowledged(), alarm.assignedUser()
+ );
+ ObjectNode encoded = new AlarmCodec().encode(updated, this);
return ok(encoded.toString()).build();
} catch (IOException ioe) {
@@ -136,7 +141,7 @@
private static AlarmId toAlarmId(String id) {
try {
- return AlarmId.valueOf(Long.parseLong(id));
+ return AlarmId.alarmId(Long.parseLong(id));
} catch (NumberFormatException ex) {
throw new IllegalArgumentException("Alarm id should be numeric", ex);
}