/* * Copyright 2017-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.driver.optical.config; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.onlab.packet.ChassisId; import org.onosproject.net.ConnectPoint; import org.onosproject.net.Device; import org.onosproject.net.DeviceId; import org.onosproject.net.Port; import org.onosproject.net.PortNumber; import org.onosproject.net.config.NetworkConfigService; import org.onosproject.net.config.basics.BasicDeviceConfig; import org.onosproject.net.config.inject.DeviceInjectionConfig; import org.onosproject.net.device.DefaultDeviceDescription; import org.onosproject.net.device.DefaultPortDescription; import org.onosproject.net.device.DeviceDescription; import org.onosproject.net.device.DeviceDescriptionDiscovery; import org.onosproject.net.device.PortDescription; import org.onosproject.net.driver.AbstractHandlerBehaviour; import org.onosproject.net.optical.config.OpticalPortConfig; import com.google.common.annotations.Beta; import com.google.common.collect.ImmutableList; /* * Example: * CHECKSTYLE:OFF { "ports" : { "inject:10.49.54.31/1" : { # see OpticalPortConfig "optical" : { "type" : "OCH" }, # Annotations required by projection mechanism. see OchPortHelper, etc. "annotations" : { "entries" : { "comment" : "following is required annotations for OCH port", "tunable" : "true", "lambda" : "{ \"gridType\": \"FLEX\", \"channelSpacing\": \"CHL_6P25GHZ\", \"spacingMultiplier\": 42, \"slotGranularity\": 1 }", "signalType" : "ODUC4" } }, # see ConfigLambdaQuery "lambdas" : { "gridType" : "DWDM", "dwdmSpacing" : "CHL_50GHZ", "slotStart" : 1, "slotSttep" : 1, "slotEnd" : 5 } }, "inject:10.49.54.31/2" : { "optical" : { "type" : "OMS" }, "annotations" : { "entries" : { "comment" : "following is required annotations for OMS port", "minFrequency" : "178981000000000", "maxFrequency" : "237931000000000", "grid" : "100000000000" } }, "lambdas" : { "gridType" : "FLEX", "slotStart" : 1, "slotStep" : 2, "slotEnd" : 3585 } }, "inject:10.49.54.31/3" : { "optical" : { "type" : "ODUCLT", "speed" : 100000 }, "annotations" : { "entries" : { "comment" : "following is required annotations for ODUCLT port", "signalType" : "CLT_100GBE" } } }, "inject:10.49.54.31/4" : { "optical" : { "speed" : 100000 } } }, # # Note: "ports" must be defined before "devices" when submitting in single tx. # "devices" : { "inject:10.49.54.31" : { "basic" : { # specify driver to use ConfigOpticalDeviceDiscovery, etc. "driver" : "optical-config", "type" : "ROADM_OTN", "hwVersion" : "1.0", "swVersion" : "2.0", "serial" : "R-3000" }, "inject" : { # This device has 5 ports [1-5] # details defined in /ports tree above. "ports" : "5" } } } } * CHECKSTYLE:ON */ /** * DeviceDescriptionDiscovery implementation, which * utilizes {@link DeviceInjectionConfig}, {@link BasicDeviceConfig}, * {@link OpticalPortConfig} to populate Device and Ports based on configuration. */ @Beta public class ConfigOpticalDeviceDiscovery extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery { @Override public DeviceDescription discoverDeviceDetails() { NetworkConfigService netcfg = handler().get(NetworkConfigService.class); DeviceId did = data().deviceId(); String unk = "UNKNOWN"; Optional<DeviceInjectionConfig> inject = Optional.ofNullable(netcfg.getConfig(did, DeviceInjectionConfig.class)); Optional<BasicDeviceConfig> basic = Optional.ofNullable(netcfg.getConfig(did, BasicDeviceConfig.class)); Device.Type type = basic.map(BasicDeviceConfig::type).orElse(Device.Type.SWITCH); String manufacturer = basic.map(BasicDeviceConfig::manufacturer).orElse(unk); String hwVersion = basic.map(BasicDeviceConfig::hwVersion).orElse(unk); String swVersion = basic.map(BasicDeviceConfig::swVersion).orElse(unk); String serialNumber = basic.map(BasicDeviceConfig::serial).orElse(unk); ChassisId chassis = new ChassisId(); // if inject is not specified, return default unavailable device boolean defaultAvailable = inject.isPresent(); return new DefaultDeviceDescription(did.uri(), type, manufacturer, hwVersion, swVersion, serialNumber, chassis, defaultAvailable); } @Override public List<PortDescription> discoverPortDetails() { NetworkConfigService netcfg = handler().get(NetworkConfigService.class); DeviceId did = data().deviceId(); DeviceInjectionConfig cfg = netcfg.getConfig(did, DeviceInjectionConfig.class); if (cfg == null) { return ImmutableList.of(); } String ports = cfg.ports(); // TODO: parse port format like [1-3,6] in the future int numPorts = Integer.parseInt(ports); List<PortDescription> portDescs = new ArrayList<>(numPorts); for (int i = 1; i <= numPorts; ++i) { PortNumber number = PortNumber.portNumber(i); ConnectPoint cp = new ConnectPoint(did, number); Optional<OpticalPortConfig> port = Optional.ofNullable(netcfg.getConfig(cp, OpticalPortConfig.class)); boolean isEnabled = true; // default packet port speed on configured-optical device (in Mbps) int speedFallback = 10_000; long portSpeed = port.flatMap(OpticalPortConfig::speed).orElse(speedFallback); Port.Type type = port.map(OpticalPortConfig::type).orElse(Port.Type.COPPER); portDescs.add(new DefaultPortDescription(number, isEnabled, type, portSpeed)); } return portDescs; } }