/* * Copyright 2016-present 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.lumentum; import com.google.common.base.Preconditions; import org.onlab.util.Frequency; import org.onosproject.net.ChannelSpacing; import org.onosproject.net.DeviceId; import org.onosproject.net.GridType; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.event.ResponseEvent; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.transport.DefaultUdpTransportMapping; import org.snmp4j.util.DefaultPDUFactory; import org.snmp4j.util.TreeEvent; import org.snmp4j.util.TreeUtils; import java.io.IOException; import java.util.List; /** * Quick and dirty device abstraction for SNMP-based Lumentum devices. * <p> * TODO: Refactor once SnmpDevice is finished */ public class LumentumSnmpDevice { private static final int MAX_SIZE_RESPONSE_PDU = 65535; private static final int MAX_REPETITIONS = 50; // Only 42 directed ports on our devices public static final GridType GRID_TYPE = GridType.DWDM; public static final ChannelSpacing CHANNEL_SPACING = ChannelSpacing.CHL_50GHZ; public static final Frequency START_CENTER_FREQ = Frequency.ofGHz(191_350); public static final Frequency END_CENTER_FREQ = Frequency.ofGHz(196_100); // Lumentum SDN ROADM has shifted channel plan. // Channel 36 corresponds to ITU-T center frequency, which has spacing multiplier 0. public static final int MULTIPLIER_SHIFT = 36; private Snmp snmp; private CommunityTarget target; public LumentumSnmpDevice(DeviceId did) throws IOException { String[] deviceComponents = did.toString().split(":"); Preconditions.checkArgument(deviceComponents.length > 1); String ipAddress = deviceComponents[1]; String port = deviceComponents[2]; createDevice(ipAddress, Integer.parseInt(port)); } public LumentumSnmpDevice(String ipAddress, int port) throws IOException { createDevice(ipAddress, port); } private void createDevice(String ipAddress, int port) throws IOException { Address targetAddress = GenericAddress.parse("udp:" + ipAddress + "/" + port); TransportMapping transport = new DefaultUdpTransportMapping(); transport.listen(); snmp = new Snmp(transport); // setting up target target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setAddress(targetAddress); target.setRetries(3); target.setTimeout(1000 * 3); target.setVersion(SnmpConstants.version2c); target.setMaxSizeRequestPDU(MAX_SIZE_RESPONSE_PDU); } public ResponseEvent set(PDU pdu) throws IOException { return snmp.set(pdu, target); } public List<TreeEvent> get(OID oid) { TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory()); treeUtils.setMaxRepetitions(MAX_REPETITIONS); return treeUtils.getSubtree(target, oid); } }