[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/AlarmIdTest.java b/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmIdTest.java
index 74453a4..615ccf8 100644
--- a/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmIdTest.java
+++ b/incubator/api/src/test/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmIdTest.java
@@ -16,19 +16,21 @@
 package org.onosproject.incubator.net.faultmanagement.alarm;
 
 import com.google.common.testing.EqualsTester;
+import static org.hamcrest.Matchers.containsString;
 import org.junit.Test;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
- * This class tests the immutability, equality, and non-equality of
- * {@link AlarmId}.
+ * This class tests the immutability, equality, and non-equality of {@link AlarmId}.
  */
 public class AlarmIdTest {
+
     private static final long ID_A = 1L;
     private static final long ID_B = 2L;
     private static final long ID_Z = 987654321L;
@@ -46,28 +48,27 @@
      */
     @Test
     public void testEquality() {
-        final AlarmId id1 = new AlarmId(ID_A);
-        final AlarmId id2 = new AlarmId(ID_A);
+        final AlarmId id1 = AlarmId.alarmId(ID_A);
+        final AlarmId id2 = AlarmId.alarmId(ID_A);
 
         assertThat(id1, is(id2));
     }
 
-
     /**
      * Tests non-equality of {@link AlarmId}.
      */
     @Test
     public void testNonEquality() {
-        final AlarmId id1 = new AlarmId(ID_A);
-        final AlarmId id2 = new AlarmId(ID_B);
+        final AlarmId id1 = AlarmId.alarmId(ID_A);
+        final AlarmId id2 = AlarmId.alarmId(ID_B);
 
         assertThat(id1, is(not(id2)));
     }
 
     @Test
     public void valueOf() {
-        final AlarmId id = new AlarmId(0xdeadbeefL);
-        assertEquals("incorrect valueOf", id, AlarmId.valueOf(0xdeadbeefL));
+        final AlarmId id = AlarmId.alarmId(0xdeadbeefL);
+        assertEquals("incorrect valueOf", id, AlarmId.alarmId(0xdeadbeefL));
     }
 
     /**
@@ -75,9 +76,9 @@
      */
     @Test
     public void testEquals() {
-        final AlarmId id1 = new AlarmId(11111L);
-        final AlarmId sameAsId1 = new AlarmId(11111L);
-        final AlarmId id2 = new AlarmId(22222L);
+        final AlarmId id1 = AlarmId.alarmId(11111L);
+        final AlarmId sameAsId1 = AlarmId.alarmId(11111L);
+        final AlarmId id2 = AlarmId.alarmId(22222L);
 
         new EqualsTester()
                 .addEqualityGroup(id1, sameAsId1)
@@ -90,9 +91,18 @@
      */
     @Test
     public void testConstruction() {
-        final AlarmId id1 = new AlarmId(ID_Z);
+        final AlarmId id1 = AlarmId.alarmId(ID_Z);
         assertEquals(id1.fingerprint(), ID_Z);
 
         // No default constructor so no need to test it !
+        assertEquals(0L, AlarmId.NONE.fingerprint());
+        try {
+            final AlarmId bad = AlarmId.alarmId(0L);
+            fail("0 is a Reserved value but we created " + bad);
+        } catch (IllegalArgumentException ex) {
+            assertThat(ex.getMessage(),
+                    containsString("id must be non-zero"));
+        }
+
     }
 }
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();
+    }
 }