[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);
         }