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