[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/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/DefaultAlarmTest.java b/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/DefaultAlarmTest.java
index 199ed0d..53390bb 100644
--- a/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/DefaultAlarmTest.java
+++ b/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/DefaultAlarmTest.java
@@ -18,6 +18,7 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.greaterThan;
 import org.junit.Test;
 import static org.junit.Assert.*;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
@@ -35,13 +36,57 @@
      */
     @Test
     public void testConstruction() {
-        final String nameValue = "name3";
-        final DefaultAlarm a = new DefaultAlarm.Builder(AlarmId.valueOf(4),
-                DeviceId.NONE, nameValue, Alarm.SeverityLevel.CLEARED, 3).build();
-
+        final DefaultAlarm a = generate();
         assertThat(a, is(notNullValue()));
         final DefaultAlarm b = new DefaultAlarm.Builder(a).build();
-
         assertEquals(a, b);
     }
+
+    @Test
+    public void testEquals() {
+        final DefaultAlarm a = new DefaultAlarm.Builder(
+                DeviceId.NONE, "desc", Alarm.SeverityLevel.MINOR, 3).build();
+        final DefaultAlarm b = new DefaultAlarm.Builder(
+                DeviceId.NONE, "desc", Alarm.SeverityLevel.MINOR, a.timeRaised() + 1).
+                withId(ALARM_ID).withTimeUpdated(a.timeUpdated() + 1).build();
+        assertEquals("id or timeRaised or timeUpdated may differ", a, b);
+
+        assertNotEquals(a, new DefaultAlarm.Builder(a).withAcknowledged(!a.acknowledged()).build());
+        assertNotEquals(a, new DefaultAlarm.Builder(a).withManuallyClearable(!a.manuallyClearable()).build());
+        assertNotEquals(a, new DefaultAlarm.Builder(a).withServiceAffecting(!a.serviceAffecting()).build());
+        assertNotEquals(a, new DefaultAlarm.Builder(a).withAssignedUser("Changed" + a.assignedUser()).build());
+
+    }
+
+    @Test
+    public void testClear() {
+        final DefaultAlarm active = generate();
+        final DefaultAlarm cleared = new DefaultAlarm.Builder(active).clear().build();
+        assertNotEquals(active, cleared);
+        assertThat(cleared.timeRaised(), is(active.timeRaised()));
+        assertThat(cleared.severity(), is(Alarm.SeverityLevel.CLEARED));
+        assertThat(cleared.timeUpdated(), greaterThan(active.timeUpdated()));
+        assertNotNull(cleared.timeCleared());
+
+    }
+
+    @Test
+    public void testId() {
+        final DefaultAlarm a = generate();
+        assertThat(a.id(), is(AlarmId.NONE));
+        final DefaultAlarm b = new DefaultAlarm.Builder(a).withId(ALARM_ID).build();
+
+        assertEquals("id ignored in equals", a, b);
+        assertNotEquals(ALARM_ID, a.id());
+        assertEquals(ALARM_ID, b.id());
+        assertEquals(ALARM_ENTITY_ID, b.source());
+
+    }
+    private static final AlarmEntityId ALARM_ENTITY_ID = AlarmEntityId.alarmEntityId("port:bar");
+    private static final AlarmId ALARM_ID = AlarmId.alarmId(888L);
+
+    private static DefaultAlarm generate() {
+        return new DefaultAlarm.Builder(
+                DeviceId.NONE, "desc", Alarm.SeverityLevel.MINOR, 3).forSource(ALARM_ENTITY_ID).build();
+    }
 }