Andrea Campanella
Committed by Gerrit Code Review

[ONOS-3943] SNMP protocol and provider refactoring according to ONOS architecture

Change-Id: Ie87ee6c181c9550ffac602397f2ee74a691bbdfa
Showing 33 changed files with 1194 additions and 448 deletions
SRC = 'src/main/java/org/onosproject/**/'
CURRENT_NAME = 'onos-drivers-bti'
CURRENT_TARGET = ':' + CURRENT_NAME
COMPILE_DEPS = [
'//lib:CORE_DEPS',
'//protocols/netconf/api:onos-snmp-api',
'//incubator/api:onos-incubator-api'
]
java_library(
name = CURRENT_NAME,
srcs = glob([SRC + '/*.java']),
deps = COMPILE_DEPS,
visibility = ['PUBLIC'],
resources_root = 'src/main/resources',
resources = glob(['src/main/resources/**']),
)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
~ Copyright 2016 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.
-->
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
<feature name="${project.artifactId}" version="${project.version}"
description="${project.description}">
<feature>onos-api</feature>
<bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-snmp-api/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-incubator-api/${project.version}</bundle>
</feature>
</features>
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>onos-drivers-general</artifactId>
<groupId>org.onosproject</groupId>
<version>1.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>onos-drivers-bti</artifactId>
<packaging>bundle</packaging>
<properties>
<onos.app.name>org.onosproject.drivers.bti</onos.app.name>
<onos.app.origin>ON.Lab</onos.app.origin>
<onos.app.category>Drivers</onos.app.category>
<onos.app.title>Bti Device Drivers</onos.app.title>
<onos.app.url>http://onosproject.org</onos.app.url>
<onos.app.requires>
org.onosproject.snmp
</onos.app.requires>
</properties>
<dependencies>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-snmp-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-incubator-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
* Copyright 2016 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
* 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,
......@@ -11,58 +13,102 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
package org.onosproject.drivers.bti;
import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.I_Device;
import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0._OidRegistry;
import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System;
import com.btisystems.pronx.ems.core.model.ClassRegistry;
import com.btisystems.pronx.ems.core.model.IClassRegistry;
import com.btisystems.pronx.ems.core.model.NetworkDevice;
import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
import com.google.common.collect.ImmutableList;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.SparseAnnotations;
import org.onosproject.net.device.DefaultDeviceDescription;
import org.onosproject.net.device.DeviceDescription;
import org.onosproject.net.device.DeviceDescriptionDiscovery;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.device.PortDescription;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.snmp.SnmpController;
import org.onosproject.snmp.SnmpDevice;
import org.slf4j.Logger;
import org.snmp4j.smi.OID;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
* A vendor-specific implementation supporting BTI Systems BTI-7000 equipment.
* @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
* Bti 7000 SNMP device description behaviour. Provides device description and port information.
*/
@Deprecated
public class Bti7000DeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
public class Bti7000DeviceDescriptor extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
private final Logger log = getLogger(getClass());
protected static final IClassRegistry CLASS_REGISTRY =
new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
private static final String UNKNOWN = "unknown";
@Override
public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
public DeviceDescription discoverDeviceDetails() {
SnmpController controller = checkNotNull(handler().get(SnmpController.class));
DeviceId deviceId = handler().data().deviceId();
SnmpDevice snmpDevice = controller.getDevice(deviceId);
DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
Device device = deviceService.getDevice(deviceId);
DeviceDescription desc = null;
String ipAddress = snmpDevice.getSnmpHost();
int port = snmpDevice.getSnmpPort();
ISnmpConfiguration config = new V2cSnmpConfiguration();
config.setPort(port);
try (ISnmpSession session = controller.getSession(deviceId)) {
// Each session will be auto-closed.
String deviceOid = session.identifyDevice();
desc = populateDescription(session, device);
} catch (IOException | RuntimeException ex) {
log.error("Failed to walk device.", ex.getMessage());
log.debug("Detailed problem was ", ex);
}
return desc;
}
@Override
public List<PortDescription> discoverPortDetails() {
//TODO implement
return ImmutableList.of();
}
private DeviceDescription populateDescription(ISnmpSession session, Device device) {
NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
session.getAddress().getHostAddress());
session.getAddress().getHostAddress());
try {
session.walkDevice(networkDevice, Arrays.asList(new OID[]{
CLASS_REGISTRY.getClassToOidMap().get(
com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System.class)}));
session.walkDevice(networkDevice, Collections.singletonList(CLASS_REGISTRY.getClassToOidMap().get(
System.class)));
com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System systemTree =
(com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System)
networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System.class));
if (systemTree != null) {
String[] systemComponents = systemTree.getSysDescr().split(";");
return new DefaultDeviceDescription(description.deviceUri(), description.type(),
systemComponents[0], systemComponents[2], systemComponents[3],
UNKNOWN, description.chassisId(), description.annotations());
return new DefaultDeviceDescription(device.id().uri(), device.type(),
systemComponents[0], systemComponents[2],
systemComponents[3], UNKNOWN, device.chassisId(),
(SparseAnnotations) device.annotations());
}
} catch (IOException ex) {
log.error("Error reading details for device {}.", session.getAddress(), ex);
throw new IllegalArgumentException("Error reading details for device." + session.getAddress(), ex);
}
return description;
return null;
}
}
......
/*
* Copyright 2016 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.drivers.bti;
import org.apache.felix.scr.annotations.Component;
import org.onosproject.net.driver.AbstractDriverLoader;
/**
* Loader for BTI device drivers.
*/
@Component(immediate = true)
public class BtiDriversLoader extends AbstractDriverLoader {
public BtiDriversLoader() {
super("/bti-drivers.xml");
}
}
/*
* Copyright 2016 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
* 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,
......@@ -11,60 +13,107 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
package org.onosproject.drivers.bti;
import com.btisystems.mibbler.mibs.netsnmp.netsnmp.I_Device;
import com.btisystems.mibbler.mibs.netsnmp.netsnmp._OidRegistry;
import com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System;
import com.btisystems.pronx.ems.core.model.ClassRegistry;
import com.btisystems.pronx.ems.core.model.IClassRegistry;
import com.btisystems.pronx.ems.core.model.NetworkDevice;
import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
import com.google.common.collect.ImmutableList;
import org.apache.commons.lang.StringUtils;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.SparseAnnotations;
import org.onosproject.net.device.DefaultDeviceDescription;
import org.onosproject.net.device.DeviceDescription;
import org.onosproject.net.device.DeviceDescriptionDiscovery;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.device.PortDescription;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.snmp.SnmpController;
import org.onosproject.snmp.SnmpDevice;
import org.slf4j.Logger;
import org.snmp4j.smi.OID;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
* A agent-specific implementation supporting NET-SNMP agents.
* @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
* Net SNMP device description behaviour. Provides device description and port information.
*/
@Deprecated
public class NetSnmpDeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
public class NetSnmpDeviceDescriptor extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
private final Logger log = getLogger(getClass());
protected static final IClassRegistry CLASS_REGISTRY =
new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
private static final String UNKNOWN = "unknown";
//TODO evaluate a common abstract class for all Snmp description discovery
@Override
public DeviceDescription discoverDeviceDetails() {
SnmpController controller = checkNotNull(handler().get(SnmpController.class));
DeviceId deviceId = handler().data().deviceId();
SnmpDevice snmpDevice = controller.getDevice(deviceId);
DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
Device device = deviceService.getDevice(deviceId);
DeviceDescription desc = null;
String ipAddress = snmpDevice.getSnmpHost();
int port = snmpDevice.getSnmpPort();
ISnmpConfiguration config = new V2cSnmpConfiguration();
config.setPort(port);
try (ISnmpSession session = controller.getSession(deviceId)) {
// Each session will be auto-closed.
String deviceOid = session.identifyDevice();
//TODO obtain desctiption
desc = populateDescription(session, device);
} catch (IOException | RuntimeException ex) {
log.error("Failed to walk device.", ex.getMessage());
log.debug("Detailed problem was ", ex);
}
return desc;
}
@Override
public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
public List<PortDescription> discoverPortDetails() {
//TODO implement
return ImmutableList.of();
}
private DeviceDescription populateDescription(ISnmpSession session, Device device) {
NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
session.getAddress().getHostAddress());
session.getAddress().getHostAddress());
try {
session.walkDevice(networkDevice, Arrays.asList(new OID[]{
CLASS_REGISTRY.getClassToOidMap().get(
com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System.class)}));
session.walkDevice(networkDevice, Collections.singletonList(CLASS_REGISTRY.getClassToOidMap().get(
System.class)));
com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System systemTree =
(com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System)
networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System.class));
if (systemTree != null) {
// TODO SNMP sys-contacts may be verbose; ONOS-GUI doesn't abbreviate fields neatly;
// so cut it here until supported in prop displayer
String manufacturer = StringUtils.abbreviate(systemTree.getSysContact(), 20);
return new DefaultDeviceDescription(description.deviceUri(), description.type(), manufacturer,
UNKNOWN, UNKNOWN, UNKNOWN, description.chassisId(), description.annotations());
return new DefaultDeviceDescription(device.id().uri(), device.type(),
manufacturer, UNKNOWN, UNKNOWN, UNKNOWN,
device.chassisId(), (SparseAnnotations) device.annotations());
}
} catch (IOException ex) {
log.error("Error reading details for device {}.", session.getAddress(), ex);
throw new IllegalArgumentException("Error reading details for device." + session.getAddress(), ex);
}
return description;
return null;
}
}
......
/*
* Copyright 2015 Open Networking Laboratory
* Copyright 2016 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
* 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,
......@@ -14,17 +14,7 @@
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
/**
* The Device State is used to determine whether the device is active or inactive. This state information will help
* Device Creator to add or delete the device from the core.
*/
public enum DeviceState {
/* Used to specify Active state of the device */
ACTIVE,
/* Used to specify inactive state of the device */
INACTIVE,
/* Used to specify invalid state of the device */
INVALID
}
/**
* Package for BTI device drivers.
*/
package org.onosproject.drivers.bti;
\ No newline at end of file
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 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.
-->
<drivers>
<driver name="bti7000" manufacturer="bti" hwVersion="1.0.0" swVersion="1.0.0">
<behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
impl="org.onosproject.drivers.bti.Bti7000DeviceDescriptor"/>
</driver>
<driver name="NetSnmp" manufacturer="bti" hwVersion="1.0.0" swVersion="1.0.0">
<behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
impl="org.onosproject.drivers.bti.NetSnmpDeviceDescriptor"/>
</driver>
</drivers>
......@@ -20,8 +20,6 @@
<feature>onos-api</feature>
<bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
</feature>
......
......@@ -35,6 +35,9 @@
<onos.app.category>Drivers</onos.app.category>
<onos.app.title>Lumentum Device Drivers</onos.app.title>
<onos.app.url>http://onosproject.org</onos.app.url>
<onos.app.requires>
org.onosproject.snmp
</onos.app.requires>
</properties>
<dependencies>
......
......@@ -19,9 +19,14 @@ package org.onosproject.drivers.lumentum;
import com.google.common.collect.Lists;
import org.onosproject.net.AnnotationKeys;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
import org.onosproject.net.SparseAnnotations;
import org.onosproject.net.behaviour.PortDiscovery;
import org.onosproject.net.device.DefaultDeviceDescription;
import org.onosproject.net.device.DeviceDescription;
import org.onosproject.net.device.DeviceDescriptionDiscovery;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.device.OmsPortDescription;
import org.onosproject.net.device.PortDescription;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
......@@ -34,22 +39,37 @@ import java.io.IOException;
import java.util.Collections;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Discovers the ports of a Lumentum SDN ROADM device using SNMP.
* Device description behaviour for Lumentum Snmp devices.
*/
public class PortDiscoveryLumentumRoadm extends AbstractHandlerBehaviour
implements PortDiscovery {
public class LumentumRoadmDeviceDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
private final Logger log = getLogger(PortDiscoveryLumentumRoadm.class);
private final Logger log = getLogger(getClass());
private static final String CTRL_PORT_STATE = ".1.3.6.1.4.1.46184.1.4.1.1.3.";
private LumentumSnmpDevice snmp;
@Override
public List<PortDescription> getPorts() {
public DeviceDescription discoverDeviceDetails() {
//TODO get device description
DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
DeviceId deviceId = handler().data().deviceId();
Device device = deviceService.getDevice(deviceId);
return new DefaultDeviceDescription(device.id().uri(), Device.Type.ROADM,
"Lumentum", "SDN ROADM", "1.0", "v1",
device.chassisId(), (SparseAnnotations) device.annotations());
}
@Override
public List<PortDescription> discoverPortDetails() {
return this.getPorts();
}
private List<PortDescription> getPorts() {
try {
snmp = new LumentumSnmpDevice(handler().data().deviceId());
} catch (IOException e) {
......@@ -119,5 +139,3 @@ public class PortDiscoveryLumentumRoadm extends AbstractHandlerBehaviour
return ports;
}
}
......
......@@ -16,8 +16,8 @@
-->
<drivers>
<driver name="lumentum" manufacturer="Lumentum" hwVersion="SDN ROADM" swVersion="1.0">
<behaviour api="org.onosproject.net.behaviour.PortDiscovery"
impl="org.onosproject.drivers.lumentum.PortDiscoveryLumentumRoadm"/>
<behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
impl="org.onosproject.drivers.lumentum.LumentumRoadmDeviceDescription"/>
<behaviour api="org.onosproject.net.behaviour.LambdaQuery"
impl="org.onosproject.drivers.lumentum.LambdaQueryLumentumRoadm"/>
<behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
......
......@@ -40,6 +40,7 @@
<module>ovsdb</module>
<module>utilities</module>
<module>lumentum</module>
<module>bti</module>
</modules>
<!--<properties>
......
......@@ -40,6 +40,7 @@
<module>rest</module>
<module>ospf</module>
<module>isis</module>
<module>snmp</module>
</modules>
<dependencies>
......
SRC = 'src/main/java/org/onosproject/**/'
CURRENT_NAME = 'onos-snmp-api'
CURRENT_TARGET = ':' + CURRENT_NAME
COMPILE_DEPS = [
'//lib:CORE_DEPS',
'//incubator/api:onos-incubator-api',
'//lib:org.apache.servicemix.bundles.snmp4j',
'//lib:snmp-core',
'//lib:bti7000',
'//lib:mibs-net-snmp',
'//lib:mibs-rfc',
]
java_library(
name = CURRENT_NAME,
srcs = glob([SRC + '/*.java']),
deps = COMPILE_DEPS,
visibility = ['PUBLIC'],
)
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>onos-snmp-protocol</artifactId>
<groupId>org.onosproject</groupId>
<version>1.6.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>onos-snmp-api</artifactId>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-incubator-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
* Copyright 2016 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.snmp;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
import org.onosproject.net.DeviceId;
import java.io.IOException;
import java.util.Collection;
/**
* Snmp Controller.
*/
public interface SnmpController {
/**
* Return all the devices that this controller has notion of.
* @return Set of all Snmp devices
*/
Collection<SnmpDevice> getDevices();
/**
* Gets a device for a specific deviceId.
* @param deviceId device id of the device
* @return SnmpDevice for given deviceId
*/
SnmpDevice getDevice(DeviceId deviceId);
/**
* Removes a specific device.
* @param deviceId device id of the device to be removed
*/
void removeDevice(DeviceId deviceId);
/**
* Add a device with a specific DeviceId.
* @param deviceId deviceId of the device
* @param device device to add to this controller
*/
void addDevice(DeviceId deviceId, SnmpDevice device);
/**
* Gets an Instance of ISnmpSession for a specific device.
*
* @param deviceId device to retrieve the session for.
* @return ISnmp session.
* @throws IOException if the session can't be established.
*/
ISnmpSession getSession(DeviceId deviceId) throws IOException;
/**
* Creates an error alarm if the interaction with the device failed.
*
* @param deviceId the device with a failed interaction
* @return default alarm error
*/
DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId);
}
/*
* Copyright 2016 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.snmp;
import org.onosproject.net.DeviceId;
/**
* Abstraction a default Snmp Device.
*/
public interface SnmpDevice {
/**
* Returns host IP and host Port, used by this particular SNMP Device.
*
* @return Device Information.
*/
String deviceInfo();
/**
* Terminates the device connection.
*/
void disconnect();
/**
* Retrieves the device state.
*
* @return true if connected
*/
boolean isReachable();
/**
* Returns the IP used connect ssh on the device.
*
* @return SNMP Device IP
*/
String getSnmpHost();
/**
* Returns the SSH Port used connect the device.
*
* @return SSH Port number
*/
int getSnmpPort();
/**
* Retrieves the username of the device.
*
* @return username
*/
String getUsername();
/**
* Retrieves the community (password) of the device.
*
* @return password
*/
String getCommunity();
/**
* Return the SNMP device deviceID.
*
* @return DeviceId
*/
DeviceId deviceId();
}
......@@ -13,27 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import org.onosproject.net.Device;
import org.onosproject.net.device.DefaultDeviceDescription;
import org.onosproject.net.device.DeviceDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Device description provider for Lumentum SDN ROADMs.
* @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
* Package for SNMP apis interfaces.
*/
@Deprecated
public class LumentumDeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
private static final Logger log = LoggerFactory.getLogger(LumentumDeviceDescriptionProvider.class);
@Override
public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
return new DefaultDeviceDescription(description.deviceUri(), Device.Type.ROADM,
"Lumentum", "SDN ROADM", "1.0", "v1", description.chassisId(), description.annotations());
}
}
package org.onosproject.snmp;
......
SRC = 'src/main/java/org/onosproject/**/'
TEST = 'src/test/java/org/onosproject/**/'
CURRENT_NAME = 'onos-snmp-ctl'
CURRENT_TARGET = ':' + CURRENT_NAME
COMPILE_DEPS = [
'//lib:CORE_DEPS',
'//incubator/api:onos-incubator-api',
'//protocols/snmp/api:onos-snmp-api',
'//lib:org.apache.servicemix.bundles.snmp4j',
'//lib:snmp-core',
'//lib:bti7000',
'//lib:mibs-net-snmp',
'//lib:mibs-rfc',
]
TEST_DEPS = [
'//lib:TEST',
]
java_library(
name = CURRENT_NAME,
srcs = glob([SRC + '/*.java']),
deps = COMPILE_DEPS,
visibility = ['PUBLIC'],
)
java_test(
name = 'tests',
srcs = glob([TEST + '/*.java']),
deps = COMPILE_DEPS +
TEST_DEPS +
[CURRENT_TARGET],
source_under_test = [CURRENT_TARGET],
)
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>onos-snmp-protocol</artifactId>
<groupId>org.onosproject</groupId>
<version>1.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>onos-snmp-ctl</artifactId>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-snmp-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-incubator-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
* Copyright 2016 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.snmp.ctl;
import com.btisystems.pronx.ems.core.snmp.DefaultSnmpConfigurationFactory;
import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import com.btisystems.pronx.ems.core.snmp.ISnmpSessionFactory;
import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
import com.google.common.base.Preconditions;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
import org.onosproject.net.DeviceId;
import org.onosproject.snmp.SnmpController;
import org.onosproject.snmp.SnmpDevice;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Default implementation of the SNMP sub-controller.
*/
@Component(immediate = true)
@Service
public class DefaultSnmpController implements SnmpController {
private final Logger log = LoggerFactory
.getLogger(getClass());
private ISnmpSessionFactory sessionFactory;
private final Map<DeviceId, ISnmpSession> sessionMap = new HashMap<>();
protected Map<DeviceId, SnmpDevice> snmpDeviceMap = new ConcurrentHashMap<>();
@Activate
public void activate(ComponentContext context) {
sessionFactory = new SnmpSessionFactory(
new DefaultSnmpConfigurationFactory(new V2cSnmpConfiguration()));
log.info("Started");
}
@Deactivate
public void deactivate() {
snmpDeviceMap.clear();
log.info("Stopped");
}
@Override
public ISnmpSession getSession(DeviceId deviceId) throws IOException {
if (!sessionMap.containsKey(deviceId)) {
SnmpDevice device = snmpDeviceMap.get(deviceId);
String ipAddress = null;
int port = -1;
if (device != null) {
ipAddress = device.getSnmpHost();
port = device.getSnmpPort();
} else {
String[] deviceComponents = deviceId.toString().split(":");
if (deviceComponents.length > 1) {
ipAddress = deviceComponents[1];
port = Integer.parseInt(deviceComponents[2]);
} else {
log.error("Cannot obtain correct information from device id", deviceId);
}
}
Preconditions.checkNotNull(ipAddress, "ip address is empty, cannot start session");
Preconditions.checkArgument(port != -1, "port is incorrect, cannot start session");
ISnmpConfiguration config = new V2cSnmpConfiguration();
config.setPort(port);
sessionMap.put(deviceId, sessionFactory.createSession(config, ipAddress));
}
return sessionMap.get(deviceId);
}
@Override
public Collection<SnmpDevice> getDevices() {
return snmpDeviceMap.values();
}
@Override
public SnmpDevice getDevice(DeviceId did) {
return snmpDeviceMap.get(did);
}
@Override
public void removeDevice(DeviceId did) {
snmpDeviceMap.remove(did);
}
@Override
public void addDevice(DeviceId did, SnmpDevice device) {
snmpDeviceMap.put(did, device);
}
@Override
public DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId) {
return new DefaultAlarm.Builder(
deviceId, "SNMP alarm retrieval failed",
Alarm.SeverityLevel.CRITICAL,
System.currentTimeMillis()).build();
}
}
/*
* Copyright 2015 Open Networking Laboratory
* Copyright 2016 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.
......@@ -13,122 +13,105 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
package org.onosproject.snmp.ctl;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import org.onosproject.net.DeviceId;
import org.onosproject.snmp.SnmpDevice;
import org.slf4j.Logger;
import java.net.URI;
import java.net.URISyntaxException;
import org.slf4j.Logger;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
* This is a logical representation of actual SNMP device, carrying all the necessary information to connect and execute
* SNMP operations.
*/
public class SnmpDevice {
public class DefaultSnmpDevice implements SnmpDevice {
private final Logger log = getLogger(SnmpDevice.class);
private final Logger log = getLogger(DefaultSnmpDevice.class);
private static final int DEFAULT_SNMP_PORT = 161;
private static final String SCHEME = "snmp";
private final String snmpHost;
private final DeviceId deviceId;
private int snmpPort = DEFAULT_SNMP_PORT;
private final String username;
//Community is a conventional name for password in SNMP.
private final String community;
private boolean reachable = false;
private DeviceState deviceState = DeviceState.INVALID;
protected SnmpDevice(String snmpHost, int snmpPort, String community) {
public DefaultSnmpDevice(String snmpHost, int snmpPort, String username, String community) {
this.snmpHost = checkNotNull(snmpHost, "SNMP Device IP cannot be null");
this.snmpPort = checkNotNull(snmpPort, "SNMP Device snmp port cannot be null");
this.snmpPort = checkNotNull(snmpPort, "SNMP Device port cannot be null");
this.username = username;
this.community = community;
}
/**
* This will try to connect to SNMP device.
*
*/
public void init() {
this.deviceId = createDeviceId();
reachable = true;
}
/**
* This would return host IP and host Port, used by this particular SNMP Device.
*
* @return Device Information.
*/
@Override
public String deviceInfo() {
return new StringBuilder("host: ").append(snmpHost).append(". port: ")
.append(snmpPort).toString();
}
/**
* This will terminate the device connection.
*/
@Override
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
*/
@Override
public boolean isReachable() {
return reachable;
}
/**
* This will return the IP used connect ssh on the device.
*
* @return SNMP Device IP
*/
@Override
public String getSnmpHost() {
return snmpHost;
}
/**
* This will return the SSH Port used connect the device.
*
* @return SSH Port number
*/
@Override
public int getSnmpPort() {
return snmpPort;
}
public String getCommunity() {
return community;
@Override
public String getUsername() {
return username;
}
/**
* Retrieve current state of the device.
*
* @return Current Device State
*/
public DeviceState getDeviceState() {
return deviceState;
@Override
public String getCommunity() {
return community;
}
/**
* This is set the state information for the device.
*
* @param deviceState Next Device State
*/
public void setDeviceState(DeviceState deviceState) {
this.deviceState = deviceState;
@Override
public DeviceId deviceId() {
return deviceId;
}
/**
* Check whether the device is in Active state.
*
* @return true if the device is Active
*/
public boolean isActive() {
return deviceState == DeviceState.ACTIVE;
private DeviceId createDeviceId() {
String additionalSsp = new StringBuilder(
snmpHost).append(":")
.append(snmpPort).toString();
try {
return DeviceId.deviceId(new URI(SCHEME, additionalSsp,
null));
} catch (URISyntaxException e) {
log.error("Syntax Error while creating URI for the device: "
+ additionalSsp
+ " couldn't persist the device onto the store", e);
throw new IllegalArgumentException("Can't create device ID from " + additionalSsp, e);
}
}
}
......
/*
* Copyright 2016 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
* 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,
......@@ -11,25 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.provider.snmp.device.impl;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import org.onosproject.net.device.DeviceDescription;
/**
* Abstraction of an entity which updates a device description with information retrieved via SNMP.
* @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
* Package for implementation fo SNMP elements.
*/
@Deprecated
public interface SnmpDeviceDescriptionProvider {
/**
* Generated an updated device description.
* @deprecated 1.5.0 Falcon
* @param session SNMP session
* @param description old device description
* @return new updated description
*/
@Deprecated
DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description);
}
package org.onosproject.snmp.ctl;
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>onos-protocols</artifactId>
<groupId>org.onosproject</groupId>
<version>1.6.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>onos-snmp-protocol</artifactId>
<packaging>pom</packaging>
<modules>
<module>api</module>
<module>ctl</module>
</modules>
<dependencies>
<dependency>
<groupId>com.btisystems</groupId>
<artifactId>snmp-core</artifactId>
<version>1.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>bti7000</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>net-snmp</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -11,9 +11,8 @@ COMPILE_DEPS = [
'//lib:bti7000',
'//lib:mibs-net-snmp',
'//lib:mibs-rfc',
'//protocols/ovsdb/api:onos-ovsdb-api',
'//protocols/ovsdb/rfc:onos-ovsdb-rfc',
'//incubator/api:onos-incubator-api',
'//protocols/snmp/api:onos-snmp-api',
]
TEST_DEPS = [
......
......@@ -21,4 +21,12 @@
<description>${project.description}</description>
<artifact>mvn:${project.groupId}/onos-snmp-provider-device/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-snmp-provider-alarm/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-snmp-api/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-snmp-ctl/${project.version}</artifact>
<artifact>mvn:com.btisystems/snmp-core/1.3-SNAPSHOT</artifact>
<artifact>mvn:com.btisystems.mibbler.mibs/bti7000/1.0-SNAPSHOT</artifact>
<artifact>mvn:com.btisystems.mibbler.mibs/net-snmp/1.0-SNAPSHOT</artifact>
</app>
......
......@@ -19,9 +19,12 @@
description="${project.description}">
<feature>onos-api</feature>
<bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
<bundle>mvn:${project.groupId}/onos-snmp-api/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-snmp-ctl/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-snmp-provider-device/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-snmp-provider-alarm/${project.version}</bundle>
<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
<bundle>mvn:com.btisystems/snmp-core/1.3-SNAPSHOT</bundle>
<bundle>mvn:com.btisystems.mibbler.mibs/bti7000/1.0-SNAPSHOT</bundle>
<bundle>mvn:com.btisystems.mibbler.mibs/net-snmp/1.0-SNAPSHOT</bundle>
......
......@@ -11,9 +11,9 @@ COMPILE_DEPS = [
'//lib:bti7000',
'//lib:mibs-net-snmp',
'//lib:mibs-rfc',
'//protocols/ovsdb/api:onos-ovsdb-api',
'//protocols/ovsdb/rfc:onos-ovsdb-rfc',
'//incubator/api:onos-incubator-api',
'//protocols/snmp/api:onos-snmp-api',
'//protocols/snmp/ctl:onos-snmp-ctl',
]
TEST_DEPS = [
......
......@@ -36,20 +36,50 @@
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<!-- <dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-snmp-api</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-incubator-api</artifactId>
<artifactId>onos-snmp-ctl</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.snmp4j</artifactId>
<version>2.3.4_1</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.btisystems</groupId>
<artifactId>snmp-core</artifactId>
<version>1.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>bti7000</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>net-snmp</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-core-serializers</artifactId>
<version>${project.version}</version>
</dependency>-->
<artifactId>onos-core-net</artifactId>
<version>1.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
......
......@@ -15,23 +15,16 @@
*/
package org.onosproject.provider.snmp.device.impl;
import com.btisystems.pronx.ems.core.snmp.DefaultSnmpConfigurationFactory;
import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
import com.btisystems.pronx.ems.core.snmp.ISnmpConfigurationFactory;
import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
import com.btisystems.pronx.ems.core.snmp.ISnmpSessionFactory;
import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Modified;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.ChassisId;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.cluster.ClusterService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.incubator.net.config.basics.ConfigException;
import org.onosproject.net.AnnotationKeys;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.Device;
......@@ -39,33 +32,32 @@ import org.onosproject.net.DeviceId;
import org.onosproject.net.MastershipRole;
import org.onosproject.net.PortNumber;
import org.onosproject.net.SparseAnnotations;
import org.onosproject.net.behaviour.PortDiscovery;
import org.onosproject.net.config.ConfigFactory;
import org.onosproject.net.config.NetworkConfigEvent;
import org.onosproject.net.config.NetworkConfigListener;
import org.onosproject.net.config.NetworkConfigRegistry;
import org.onosproject.net.device.DefaultDeviceDescription;
import org.onosproject.net.device.DeviceDescription;
import org.onosproject.net.device.DeviceDescriptionDiscovery;
import org.onosproject.net.device.DeviceProvider;
import org.onosproject.net.device.DeviceProviderRegistry;
import org.onosproject.net.device.DeviceProviderService;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.device.DeviceStore;
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.snmp.SnmpController;
import org.onosproject.snmp.SnmpDevice;
import org.onosproject.snmp.ctl.DefaultSnmpDevice;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import static com.google.common.base.Strings.isNullOrEmpty;
import static org.onlab.util.Tools.delay;
import static org.onlab.util.Tools.get;
import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
import static org.slf4j.LoggerFactory.getLogger;
/**
......@@ -79,81 +71,81 @@ public class SnmpDeviceProvider extends AbstractProvider
private final Logger log = getLogger(SnmpDeviceProvider.class);
private static final String UNKNOWN = "unknown";
protected Map<DeviceId, SnmpDevice> snmpDeviceMap = new ConcurrentHashMap<>();
private static final String APP_NAME = "org.onosproject.snmp";
private static final String SCHEME = "snmp";
private DeviceProviderService providerService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected SnmpController controller;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DeviceProviderRegistry providerRegistry;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DeviceService deviceService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ClusterService clusterService;
protected DeviceStore deviceStore;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ComponentConfigService cfgService;
private final ExecutorService deviceBuilder = Executors
.newFixedThreadPool(1, groupedThreads("onos/snmp", "device-creator", log));
protected CoreService coreService;
// Delay between events in ms.
private static final int EVENTINTERVAL = 5;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected NetworkConfigRegistry netCfgService;
private static final String SCHEME = "snmp";
private final ExecutorService deviceBuilderExecutor = Executors
.newFixedThreadPool(5, groupedThreads("onos/snmp", "device-creator", log));
@Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
private String devConfigs = null;
private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
@Property(name = "devPasswords", value = "", label = "Instance-specific password")
private String devPasswords = null;
private ApplicationId appId;
//TODO Could be replaced with a service lookup, and bundles per device variant.
Map<String, SnmpDeviceDescriptionProvider> providers = new HashMap<>();
private final ConfigFactory factory =
new ConfigFactory<ApplicationId, SnmpProviderConfig>(APP_SUBJECT_FACTORY,
SnmpProviderConfig.class,
"devices",
true) {
@Override
public SnmpProviderConfig createConfig() {
return new SnmpProviderConfig();
}
};
private final ISnmpSessionFactory sessionFactory;
/**
* Creates a provider with the supplier identifier.
*/
public SnmpDeviceProvider() {
super(new ProviderId("snmp", "org.onosproject.provider.device"));
sessionFactory = new SnmpSessionFactory(
new DefaultSnmpConfigurationFactory(new V2cSnmpConfiguration()));
//TODO refactor, no hardcoding in provider, device information should be in drivers
providers.put("1.3.6.1.4.1.18070.2.2", new Bti7000DeviceDescriptionProvider());
providers.put("1.3.6.1.4.1.20408", new NetSnmpDeviceDescriptionProvider());
providers.put("1.3.6.1.4.562.73.6", new LumentumDeviceDescriptionProvider());
//FIXME multiple type of SNMP sessions
}
@Activate
public void activate(ComponentContext context) {
log.info("activating for snmp devices ...");
cfgService.registerProperties(getClass());
providerService = providerRegistry.register(this);
appId = coreService.registerApplication(APP_NAME);
netCfgService.registerConfigFactory(factory);
netCfgService.addListener(cfgLister);
modified(context);
log.info("activated ok");
log.info("Started");
}
@Deactivate
public void deactivate(ComponentContext context) {
log.info("deactivating for snmp devices ...");
cfgService.unregisterProperties(getClass(), false);
try {
snmpDeviceMap
.entrySet().stream().forEach((deviceEntry) -> {
deviceBuilder.execute(new DeviceCreator(deviceEntry.getValue(), false));
});
deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS);
controller.getDevices().stream().forEach(device -> {
deviceBuilderExecutor.execute(new DeviceFactory(device, false));
});
deviceBuilderExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
log.error("Device builder did not terminate");
}
deviceBuilder.shutdownNow();
snmpDeviceMap.clear();
deviceBuilderExecutor.shutdownNow();
netCfgService.unregisterConfigFactory(factory);
netCfgService.removeListener(cfgLister);
providerRegistry.unregister(this);
providerService = null;
log.info("Stopped");
......@@ -161,100 +153,36 @@ public class SnmpDeviceProvider extends AbstractProvider
@Modified
public void modified(ComponentContext context) {
log.info("modified ...");
if (context == null) {
log.info("No configuration file");
return;
}
Dictionary<?, ?> properties = context.getProperties();
log.info("properties={}", context.getProperties());
String deviceCfgValue = get(properties, "devConfigs");
log.info("Settings: devConfigs={}", deviceCfgValue);
if (!isNullOrEmpty(deviceCfgValue)) {
addOrRemoveDevicesConfig(deviceCfgValue);
}
log.info("... modified");
log.info("Modified");
}
private void addOrRemoveDevicesConfig(String deviceConfig) {
for (String deviceEntry : deviceConfig.split(",")) {
SnmpDevice device = processDeviceEntry(deviceEntry);
if (device != null) {
log.info("Device Detail:host={}, port={}, state={}",
new Object[]{device.getSnmpHost(),
device.getSnmpPort(),
device.getDeviceState().name()}
);
if (device.isActive()) {
deviceBuilder.execute(new DeviceCreator(device, true));
} else {
deviceBuilder.execute(new DeviceCreator(device, false));
}
private void addOrRemoveDevicesConfig() {
SnmpProviderConfig cfg = netCfgService.getConfig(appId, SnmpProviderConfig.class);
if (cfg != null) {
try {
cfg.getDevicesInfo().stream().forEach(info -> {
SnmpDevice device = new DefaultSnmpDevice(info.ip().toString(),
info.port(), info.username(), info.password());
buildDevice(device);
});
} catch (ConfigException e) {
log.error("Cannot read config error " + e);
}
}
}
private SnmpDevice processDeviceEntry(String deviceEntry) {
if (deviceEntry == null) {
log.info("No content for Device Entry, so cannot proceed further.");
return null;
}
log.info("Trying to convert {} to a SNMP Device Object", deviceEntry);
SnmpDevice device = null;
try {
String userInfo = deviceEntry.substring(0, deviceEntry
.lastIndexOf('@'));
String hostInfo = deviceEntry.substring(deviceEntry
.lastIndexOf('@') + 1);
String[] infoSplit = userInfo.split(":");
String username = infoSplit[0];
String password = infoSplit[1];
infoSplit = hostInfo.split(":");
String hostIp = infoSplit[0];
Integer hostPort;
try {
hostPort = Integer.parseInt(infoSplit[1]);
} catch (NumberFormatException nfe) {
log.error("Bad Configuration Data: Failed to parse host port number string: "
+ infoSplit[1]);
throw nfe;
}
String deviceState = infoSplit[2];
if (isNullOrEmpty(username) || isNullOrEmpty(password)
|| isNullOrEmpty(hostIp) || hostPort == 0) {
log.warn("Bad Configuration Data: both user and device information parts of Configuration "
+ deviceEntry + " should be non-nullable");
private void buildDevice(SnmpDevice device) {
if (device != null) {
log.debug("Device Detail:host={}, port={}, state={}",
device.getSnmpHost(),
device.getSnmpPort(),
device.isReachable());
if (device.isReachable()) {
deviceBuilderExecutor.execute(new DeviceFactory(device, true));
} else {
device = new SnmpDevice(hostIp, hostPort, password);
if (!isNullOrEmpty(deviceState)) {
if (deviceState.toUpperCase().equals(DeviceState.ACTIVE.name())) {
device.setDeviceState(DeviceState.ACTIVE);
} else if (deviceState.toUpperCase()
.equals(DeviceState.INACTIVE.name())) {
device.setDeviceState(DeviceState.INACTIVE);
} else {
log.warn("Device State Information can not be empty, so marking the state as INVALID");
device.setDeviceState(DeviceState.INVALID);
}
} else {
log.warn("The device entry do not specify state information, so marking the state as INVALID");
device.setDeviceState(DeviceState.INVALID);
}
deviceBuilderExecutor.execute(new DeviceFactory(device, false));
}
} catch (ArrayIndexOutOfBoundsException aie) {
log.error("Error while reading config infromation from the config file: "
+ "The user, host and device state infomation should be "
+ "in the order 'userInfo@hostInfo:deviceState'"
+ deviceEntry, aie);
} catch (Exception e) {
log.error("Error while parsing config information for the device entry: "
+ deviceEntry, e);
}
return device;
}
@Override
......@@ -265,16 +193,16 @@ public class SnmpDeviceProvider extends AbstractProvider
@Override
public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
// TODO Implement Masterhsip Service
}
@Override
public boolean isReachable(DeviceId deviceId) {
SnmpDevice snmpDevice = snmpDeviceMap.get(deviceId);
SnmpDevice snmpDevice = controller.getDevice(deviceId);
if (snmpDevice == null) {
log.warn("BAD REQUEST: the requested device id: "
+ deviceId.toString()
+ " is not associated to any SNMP Device");
+ deviceId.toString()
+ " is not associated to any SNMP Device");
return false;
}
return snmpDevice.isReachable();
......@@ -285,12 +213,13 @@ public class SnmpDeviceProvider extends AbstractProvider
* 'SnmpDevice' content. The functionality runs as a thread and depending on the 'createFlag' value it will create
* or remove Device entry from the core.
*/
private class DeviceCreator implements Runnable {
//FIXME consider rework.
private class DeviceFactory implements Runnable {
private SnmpDevice device;
private boolean createFlag;
public DeviceCreator(SnmpDevice device, boolean createFlag) {
public DeviceFactory(SnmpDevice device, boolean createFlag) {
this.device = device;
this.createFlag = createFlag;
}
......@@ -298,10 +227,10 @@ public class SnmpDeviceProvider extends AbstractProvider
@Override
public void run() {
if (createFlag) {
log.info("Trying to create Device Info on ONOS core");
log.debug("Trying to create Device Info on ONOS core");
advertiseDevices();
} else {
log.info("Trying to remove Device Info on ONOS core");
log.debug("Trying to remove Device Info on ONOS core");
removeDevices();
}
}
......@@ -314,24 +243,16 @@ public class SnmpDeviceProvider extends AbstractProvider
log.warn("The Request SNMP Device is null, cannot proceed further");
return;
}
try {
DeviceId did = getDeviceId();
if (!snmpDeviceMap.containsKey(did)) {
log.error("BAD Request: 'Currently device is not discovered, "
+ "so cannot remove/disconnect the device: "
+ device.deviceInfo() + "'");
return;
}
providerService.deviceDisconnected(did);
device.disconnect();
snmpDeviceMap.remove(did);
delay(EVENTINTERVAL);
} catch (URISyntaxException uriSyntaxExcpetion) {
log.error("Syntax Error while creating URI for the device: "
+ device.deviceInfo()
+ " couldn't remove the device from the store",
uriSyntaxExcpetion);
DeviceId did = device.deviceId();
if (controller.getDevice(did) == null) {
log.error("BAD Request: 'Currently device is not discovered, "
+ "so cannot remove/disconnect the device: "
+ device.deviceInfo() + "'");
return;
}
providerService.deviceDisconnected(did);
device.disconnect();
controller.removeDevice(did);
}
/**
......@@ -343,8 +264,7 @@ public class SnmpDeviceProvider extends AbstractProvider
log.warn("The Request SNMP Device is null, cannot proceed further");
return;
}
device.init();
DeviceId did = getDeviceId();
DeviceId did = device.deviceId();
ChassisId cid = new ChassisId();
SparseAnnotations annotations = DefaultAnnotations.builder()
......@@ -354,79 +274,46 @@ public class SnmpDeviceProvider extends AbstractProvider
DeviceDescription desc = new DefaultDeviceDescription(
did.uri(), Device.Type.OTHER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cid, annotations);
desc = populateDescriptionFromDevice(did, desc);
log.debug("Persisting Device " + did.uri().toString());
log.info("Persisting Device " + did.uri().toString());
snmpDeviceMap.put(did, device);
controller.addDevice(did, device);
providerService.deviceConnected(did, desc);
log.info("Done with Device Info Creation on ONOS core. Device Info: "
+ device.deviceInfo() + " " + did.uri().toString());
// Do port discovery if driver supports it
log.info("Added device to ONOS core. Device Info: "
+ device.deviceInfo() + " " + did.uri().toString());
//FIXME this description will be populated only if driver is pushed from outside
// becuase otherwise default driver is used
Device d = deviceService.getDevice(did);
if (d.is(PortDiscovery.class)) {
PortDiscovery portConfig = d.as(PortDiscovery.class);
if (portConfig != null) {
providerService.updatePorts(did, portConfig.getPorts());
}
if (d.is(DeviceDescriptionDiscovery.class)) {
DeviceDescriptionDiscovery descriptionDiscovery = d.as(DeviceDescriptionDiscovery.class);
DeviceDescription description = descriptionDiscovery.discoverDeviceDetails();
deviceStore.createOrUpdateDevice(
new ProviderId("snmp", "org.onosproject.provider.device"),
did, description);
providerService.updatePorts(did, descriptionDiscovery.discoverPortDetails());
} else {
log.warn("No port discovery behaviour for device {}", did);
log.warn("No populate description and ports behaviour for device {}", did);
}
delay(EVENTINTERVAL);
} catch (URISyntaxException e) {
log.error("Syntax Error while creating URI for the device: "
+ device.deviceInfo()
+ " couldn't persist the device onto the store", e);
} catch (Exception e) {
log.error("Error while initializing session for the device: "
+ (device != null ? device.deviceInfo() : null), e);
+ (device != null ? device.deviceInfo() : null), e);
}
}
/**
* @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
*/
@Deprecated
private DeviceDescription populateDescriptionFromDevice(DeviceId did, DeviceDescription desc) {
String[] deviceComponents = did.toString().split(":");
if (deviceComponents.length > 1) {
String ipAddress = deviceComponents[1];
String port = deviceComponents[2];
ISnmpConfiguration config = new V2cSnmpConfiguration();
config.setPort(Integer.parseInt(port));
try (ISnmpSession session = sessionFactory.createSession(config, ipAddress)) {
// Each session will be auto-closed.
String deviceOid = session.identifyDevice();
if (providers.containsKey(deviceOid)) {
desc = providers.get(deviceOid).populateDescription(session, desc);
}
} catch (IOException | RuntimeException ex) {
log.error("Failed to walk device.", ex.getMessage());
log.debug("Detailed problem was ", ex);
}
}
return desc;
}
}
/**
* This will build a device id for the device.
*/
private DeviceId getDeviceId() throws URISyntaxException {
String additionalSsp = new StringBuilder(
device.getSnmpHost()).append(":")
.append(device.getSnmpPort()).toString();
return DeviceId.deviceId(new URI(SCHEME, additionalSsp,
null));
private class InternalNetworkConfigListener implements NetworkConfigListener {
@Override
public void event(NetworkConfigEvent event) {
addOrRemoveDevicesConfig();
}
}
protected ISnmpSessionFactory getSessionFactory(ISnmpConfigurationFactory configurationFactory) {
return new SnmpSessionFactory(configurationFactory);
@Override
public boolean isRelevant(NetworkConfigEvent event) {
return event.configClass().equals(SnmpProviderConfig.class) &&
(event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED);
}
}
@Override
......
/*
* Copyright 2016 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;
/*
* 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.
*/
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.annotations.Beta;
import com.google.common.collect.Sets;
import org.onlab.packet.IpAddress;
import org.onosproject.core.ApplicationId;
import org.onosproject.incubator.net.config.basics.ConfigException;
import org.onosproject.net.config.Config;
import java.util.Set;
/**
* Configuration decoder for SNMP provider.
*/
@Beta
public class SnmpProviderConfig extends Config<ApplicationId> {
public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
private static final String IP = "ip";
private static final int DEFAULT_TCP_PORT = 830;
private static final String PORT = "port";
private static final String NAME = "username";
private static final String PASSWORD = "password";
/**
* Retrieves a set of SnmpDeviceInfo containing all the device
* configuration pertaining to the SNMP device provider.
* @return set of device configurations.
*
* @throws ConfigException if configuration can't be read
*/
public Set<SnmpDeviceInfo> getDevicesInfo() throws ConfigException {
Set<SnmpDeviceInfo> deviceInfos = Sets.newHashSet();
try {
for (JsonNode node : array) {
String ip = node.path(IP).asText();
IpAddress ipAddr = ip.isEmpty() ? null : IpAddress.valueOf(ip);
int port = node.path(PORT).asInt(DEFAULT_TCP_PORT);
String name = node.path(NAME).asText();
String password = node.path(PASSWORD).asText();
deviceInfos.add(new SnmpDeviceInfo(ipAddr, port, name, password));
}
} catch (IllegalArgumentException e) {
throw new ConfigException(CONFIG_VALUE_ERROR, e);
}
return deviceInfos;
}
/**
* Contains information about a SNMP device retrieved form the net-cfg subsystem.
*/
public class SnmpDeviceInfo {
private final IpAddress ip;
private final int port;
private final String username;
private final String password;
/**
* Build an information object containing the given device specifics.
* @param ip ip
* @param port port
* @param username username
* @param password password (a.k.a community in SNMP)
*/
public SnmpDeviceInfo(IpAddress ip, int port, String username, String password) {
this.ip = ip;
this.port = port;
this.username = username;
this.password = password;
}
/**
* Returns IpAddress of the device.
* @return ip
*/
public IpAddress ip() {
return ip;
}
/**
* Returns port of the device.
* @return port
*/
public int port() {
return port;
}
/**
* Returns username of the device.
* @return username
*/
public String username() {
return username;
}
/**
* Returns password of the device.
* @return password
*/
public String password() {
return password;
}
}
}
......@@ -36,38 +36,7 @@
<module>app</module>
<module>alarm</module>
</modules>
<dependencies>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.snmp4j</artifactId>
<version>2.3.4_1</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.btisystems</groupId>
<artifactId>snmp-core</artifactId>
<version>1.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>bti7000</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.btisystems.mibbler.mibs</groupId>
<artifactId>net-snmp</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<repository>
<!-- TODO move over to release snmp-core when it becomes available. ONOS-3646 -->
......