[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/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java
new file mode 100644
index 0000000..8b385dc
--- /dev/null
+++ b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ * 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.device.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+
+import org.slf4j.Logger;
+
+/**
+ * This is a logical representation of actual SNMP device, carrying all the necessary information to connect and execute
+ * SNMP operations.
+ */
+public class SnmpDevice {
+
+    private final Logger log = getLogger(SnmpDevice.class);
+
+
+    private static final int DEFAULT_SNMP_PORT = 161;
+
+    private final String snmpHost;
+    private int snmpPort = DEFAULT_SNMP_PORT;
+    private final String community;
+    private boolean reachable = false;
+
+    private DeviceState deviceState = DeviceState.INVALID;
+
+    protected SnmpDevice(String snmpHost, int snmpPort, String community) {
+
+        this.snmpHost = checkNotNull(snmpHost, "SNMP Device IP cannot be null");
+        this.snmpPort = checkNotNull(snmpPort, "SNMP Device snmp port cannot be null");
+        this.community = community;
+    }
+
+    /**
+     * This will try to connect to SNMP device.
+     *
+     */
+    public void init() {
+
+        reachable = true;
+    }
+
+    /**
+     * This would return host IP and host Port, used by this particular SNMP Device.
+     *
+     * @return Device Information.
+     */
+    public String deviceInfo() {
+        return new StringBuilder("host: ").append(snmpHost).append(". port: ")
+                .append(snmpPort).toString();
+    }
+
+    /**
+     * This will terminate the device connection.
+     */
+    public void disconnect() {
+        log.info("disconnect");
+        reachable = false;
+    }
+
+    /**
+     * This api is intended to know whether the device is connected or not.
+     *
+     * @return true if connected
+     */
+    public boolean isReachable() {
+        return reachable;
+    }
+
+    /**
+     * This will return the IP used connect ssh on the device.
+     *
+     * @return SNMP Device IP
+     */
+    public String getSnmpHost() {
+        return snmpHost;
+    }
+
+    /**
+     * This will return the SSH Port used connect the device.
+     *
+     * @return SSH Port number
+     */
+    public int getSnmpPort() {
+        return snmpPort;
+    }
+
+    public String getCommunity() {
+        return community;
+    }
+
+    /**
+     * Retrieve current state of the device.
+     *
+     * @return Current Device State
+     */
+    public DeviceState getDeviceState() {
+        return deviceState;
+    }
+
+    /**
+     * This is set the state information for the device.
+     *
+     * @param deviceState Next Device State
+     */
+    public void setDeviceState(DeviceState deviceState) {
+        this.deviceState = deviceState;
+    }
+
+    /**
+     * Check whether the device is in Active state.
+     *
+     * @return true if the device is Active
+     */
+    public boolean isActive() {
+        return deviceState == DeviceState.ACTIVE;
+    }
+
+}