[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/providers/snmp/alarm/src/test/java/org/onosproject/provider/snmp/alarm/impl/NetSnmpSnmpAlarmProviderTest.java b/providers/snmp/alarm/src/test/java/org/onosproject/provider/snmp/alarm/impl/NetSnmpSnmpAlarmProviderTest.java
new file mode 100644
index 0000000..1442e8d
--- /dev/null
+++ b/providers/snmp/alarm/src/test/java/org/onosproject/provider/snmp/alarm/impl/NetSnmpSnmpAlarmProviderTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.onosproject.provider.snmp.alarm.impl;
+
+import com.btisystems.mibbler.mibs.netsnmp.interfaces.mib_2.interfaces.iftable.IIfEntry;
+import com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.interfaces.IfTable;
+import com.btisystems.pronx.ems.core.model.NetworkDevice;
+import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collection;
+import org.easymock.Capture;
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.net.DeviceId;
+import org.snmp4j.smi.OID;
+
+
+public class NetSnmpSnmpAlarmProviderTest {
+    private NetSnmpAlarmProvider alarmProvider;
+    private ISnmpSession mockSession;
+    private IfTable interfaceTable;
+
+    public NetSnmpSnmpAlarmProviderTest() {
+    }
+
+    @Before
+    public void setUp() {
+        mockSession = createMock(ISnmpSession.class);
+
+        alarmProvider = new NetSnmpAlarmProvider();
+    }
+
+    @Test
+    public void shouldWalkDevice() throws UnknownHostException, IOException {
+        expect(mockSession.getAddress()).andReturn(InetAddress.getLoopbackAddress());
+        expect(mockSession.walkDevice(isA(NetworkDevice.class),
+                eq(Arrays.asList(new OID[]{
+                    NetSnmpAlarmProvider.CLASS_REGISTRY.getClassToOidMap().get(IfTable.class)}))))
+                .andReturn(null);
+
+        replay(mockSession);
+
+        assertNotNull(alarmProvider.getAlarms(mockSession, DeviceId.deviceId("snmp:1.1.1.1")));
+
+        verify(mockSession);
+    }
+
+    @Test
+    public void shouldFindAlarms() throws UnknownHostException, IOException {
+        interfaceTable = new IfTable();
+        interfaceTable.createEntry("1");
+        IIfEntry entry = interfaceTable.getEntry("1");
+        entry.setIfDescr("eth1");
+        entry.setIfAdminStatus(1);
+        entry.setIfOperStatus(2);
+
+        Capture<NetworkDevice> networkDeviceCapture = new Capture<>();
+
+        expect(mockSession.getAddress()).andReturn(InetAddress.getLoopbackAddress());
+        expect(mockSession.walkDevice(capture(networkDeviceCapture),
+                eq(Arrays.asList(new OID[]{
+                    NetSnmpAlarmProvider.CLASS_REGISTRY.getClassToOidMap().get(IfTable.class)}))))
+                .andAnswer(() -> {
+                    networkDeviceCapture.getValue().getRootObject().setObject(interfaceTable);
+                    return null;
+        });
+
+        replay(mockSession);
+
+        Collection<Alarm> alarms = alarmProvider.getAlarms(mockSession, DeviceId.deviceId("snmp:1.1.1.1"));
+        assertEquals(1, alarms.size());
+        assertEquals("Link Down.", alarms.iterator().next().description());
+        verify(mockSession);
+    }
+
+    @Test
+    public void shouldHandleException() throws UnknownHostException, IOException {
+        expect(mockSession.getAddress()).andReturn(InetAddress.getLoopbackAddress());
+        expect(mockSession.walkDevice(isA(NetworkDevice.class),
+                eq(Arrays.asList(new OID[]{
+                    NetSnmpAlarmProvider.CLASS_REGISTRY.getClassToOidMap().get(IfTable.class)}))))
+                .andThrow(new IOException());
+
+        replay(mockSession);
+
+        assertNotNull(alarmProvider.getAlarms(mockSession, DeviceId.deviceId("snmp:1.1.1.1")));
+
+        verify(mockSession);
+    }
+
+}