From 13d05bc8458758ee39cb829098241e89616717ee Mon Sep 17 00:00:00 2001 From: Ashlee Young Date: Wed, 9 Sep 2015 22:15:21 -0700 Subject: ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60 Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd --- framework/src/onos/providers/pcep/topology/pom.xml | 18 ++ .../pcep/topology/impl/PcepTopologyProvider.java | 321 +++++++++++++++++++++ .../provider/pcep/topology/impl/package-info.java | 19 ++ 3 files changed, 358 insertions(+) create mode 100644 framework/src/onos/providers/pcep/topology/pom.xml create mode 100644 framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java create mode 100644 framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/package-info.java (limited to 'framework/src/onos/providers/pcep/topology') diff --git a/framework/src/onos/providers/pcep/topology/pom.xml b/framework/src/onos/providers/pcep/topology/pom.xml new file mode 100644 index 00000000..cd8589b9 --- /dev/null +++ b/framework/src/onos/providers/pcep/topology/pom.xml @@ -0,0 +1,18 @@ + + 4.0.0 + + org.onosproject + onos-pcep-providers + 1.3.0-SNAPSHOT + ../pom.xml + + onos-pcep-provider-topology + bundle + PCEP topology provider + + + org.onosproject + onos-app-pcep-api + + + \ No newline at end of file diff --git a/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java new file mode 100644 index 00000000..38eaf1fe --- /dev/null +++ b/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java @@ -0,0 +1,321 @@ +/* + * 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.pcep.topology.impl; + +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.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.onlab.packet.ChassisId; +import org.onosproject.cluster.ClusterService; +import org.onosproject.mastership.MastershipAdminService; +import org.onosproject.mastership.MastershipService; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DefaultAnnotations; +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.Link.Type; +import org.onosproject.net.MastershipRole; +import org.onosproject.net.OchPort; +import org.onosproject.net.OduCltPort; +import org.onosproject.net.OmsPort; +import org.onosproject.net.Port; +import org.onosproject.net.device.DefaultDeviceDescription; +import org.onosproject.net.device.DefaultPortDescription; +import org.onosproject.net.device.DeviceDescription; +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.OchPortDescription; +import org.onosproject.net.device.OduCltPortDescription; +import org.onosproject.net.device.OmsPortDescription; +import org.onosproject.net.device.PortDescription; +import org.onosproject.net.link.DefaultLinkDescription; +import org.onosproject.net.link.LinkDescription; +import org.onosproject.net.link.LinkProvider; +import org.onosproject.net.link.LinkProviderRegistry; +import org.onosproject.net.link.LinkProviderService; +import org.onosproject.net.link.LinkService; +import org.onosproject.net.provider.AbstractProvider; +import org.onosproject.net.provider.ProviderId; +import org.onosproject.pcep.api.PcepController; +import org.onosproject.pcep.api.PcepDpid; +import org.onosproject.pcep.api.PcepLink; +import org.onosproject.pcep.api.PcepLink.PortType; +import org.onosproject.pcep.api.PcepLinkListener; +import org.onosproject.pcep.api.PcepOperator.OperationType; +import org.onosproject.pcep.api.PcepSwitch; +import org.onosproject.pcep.api.PcepSwitchListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.onosproject.net.DeviceId.deviceId; +import static org.onosproject.pcep.api.PcepDpid.uri; + +/** + * Provider which uses an PCEP controller to detect network infrastructure + * topology. + */ +@Component(immediate = true) +public class PcepTopologyProvider extends AbstractProvider + implements LinkProvider, DeviceProvider { + + public PcepTopologyProvider() { + super(new ProviderId("pcep", "org.onosproject.provider.pcep")); + } + + private static final Logger log = LoggerFactory + .getLogger(PcepTopologyProvider.class); + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected LinkProviderRegistry linkProviderRegistry; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected DeviceProviderRegistry deviceProviderRegistry; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected PcepController controller; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected DeviceService deviceService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected LinkService linkService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected MastershipAdminService mastershipAdminService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected MastershipService mastershipService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected ClusterService clusterService; + + private DeviceProviderService deviceProviderService; + private LinkProviderService linkProviderService; + + private HashMap> portMap = new HashMap<>(); + private InternalLinkProvider listener = new InternalLinkProvider(); + + @Activate + public void activate() { + linkProviderService = linkProviderRegistry.register(this); + deviceProviderService = deviceProviderRegistry.register(this); + controller.addListener(listener); + controller.addLinkListener(listener); + } + + @Deactivate + public void deactivate() { + linkProviderRegistry.unregister(this); + linkProviderService = null; + controller.removeListener(listener); + controller.removeLinkListener(listener); + } + + private List buildPortDescriptions(PcepDpid dpid, + Port port, + PortType portType) { + + List portList; + + if (portMap.containsKey(dpid.value())) { + portList = portMap.get(dpid.value()); + } else { + portList = new ArrayList<>(); + } + if (port != null && portType != null) { + portList.add(buildPortDescription(port, portType)); + } + + portMap.put(dpid.value(), portList); + return portList; + } + + private PortDescription buildPortDescription(Port port, PortType portType) { + PortDescription portDescription; + + switch (portType) { + case OCH_PORT: + OchPort ochp = (OchPort) port; + portDescription = new OchPortDescription(ochp.number(), ochp.isEnabled(), + ochp.signalType(), ochp.isTunable(), + ochp.lambda()); + break; + case ODU_PORT: + OduCltPort odup = (OduCltPort) port; + portDescription = new OduCltPortDescription(odup.number(), odup.isEnabled(), + odup.signalType()); + break; + case OMS_PORT: + OmsPort op = (OmsPort) port; + portDescription = new OmsPortDescription(op.number(), op.isEnabled(), op.minFrequency(), + op.maxFrequency(), op.grid()); + break; + default: + portDescription = new DefaultPortDescription(port.number(), port.isEnabled()); + break; + } + return portDescription; + } + + /** + * Build a link description from a pcep link. + * + * @param pceLink pcep link + * @return LinkDescription onos link description + */ + private LinkDescription buildLinkDescription(PcepLink pceLink) { + LinkDescription ld; + checkNotNull(pceLink); + DeviceId srcDeviceID = deviceId(uri(pceLink.linkSrcDeviceID())); + DeviceId dstDeviceID = deviceId(uri(pceLink.linkDstDeviceId())); + + deviceProviderService + .updatePorts(srcDeviceID, + buildPortDescriptions(pceLink.linkSrcDeviceID(), + pceLink.linkSrcPort(), pceLink.portType())); + + deviceProviderService + .updatePorts(dstDeviceID, + buildPortDescriptions(pceLink.linkDstDeviceId(), + pceLink.linkDstPort(), pceLink.portType())); + + ConnectPoint src = new ConnectPoint(srcDeviceID, pceLink.linkSrcPort().number()); + + ConnectPoint dst = new ConnectPoint(dstDeviceID, pceLink.linkDstPort().number()); + + DefaultAnnotations extendedAttributes = DefaultAnnotations + .builder() + .set("subType", String.valueOf(pceLink.linkSubType())) + .set("workState", pceLink.linkState()) + .set("distance", String.valueOf(pceLink.linkDistance())) + .set("capType", pceLink.linkCapacityType().toLowerCase()) + .set("avail_" + pceLink.linkCapacityType().toLowerCase(), + String.valueOf(pceLink.linkAvailValue())) + .set("max_" + pceLink.linkCapacityType().toLowerCase(), + String.valueOf(pceLink.linkMaxValue())).build(); + // construct the link + ld = new DefaultLinkDescription(src, dst, Type.OPTICAL, extendedAttributes); + return ld; + } + + private class InternalLinkProvider + implements PcepSwitchListener, PcepLinkListener { + + @Override + public void switchAdded(PcepDpid dpid) { + if (deviceProviderService == null) { + return; + } + DeviceId deviceId = deviceId(uri(dpid)); + PcepSwitch sw = controller.getSwitch(dpid); + checkNotNull(sw, "device should not null."); + // The default device type is switch. + ChassisId cId = new ChassisId(dpid.value()); + Device.Type deviceType; + + switch (sw.getDeviceType()) { + case ROADM: + deviceType = Device.Type.ROADM; + break; + case OTN: + deviceType = Device.Type.SWITCH; + break; + case ROUTER: + deviceType = Device.Type.ROUTER; + break; + default: + deviceType = Device.Type.OTHER; + } + + DeviceDescription description = new DefaultDeviceDescription( + deviceId.uri(), + deviceType, + sw.manufacturerDescription(), + sw.hardwareDescription(), + sw.softwareDescription(), + sw.serialNumber(), + cId); + deviceProviderService.deviceConnected(deviceId, description); + + } + + @Override + public void switchRemoved(PcepDpid dpid) { + if (deviceProviderService == null || linkProviderService == null) { + return; + } + deviceProviderService.deviceDisconnected(deviceId(uri(dpid))); + + linkProviderService.linksVanished(DeviceId.deviceId(uri(dpid))); + } + + @Override + public void switchChanged(PcepDpid dpid) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePCEPlink(PcepLink link) { + + OperationType operType = link.getOperationType(); + LinkDescription ld = buildLinkDescription(link); + if (ld == null) { + log.error("Invalid link info."); + return; + } + switch (operType) { + case ADD: + case UPDATE: + linkProviderService.linkDetected(ld); + break; + + case DELETE: + linkProviderService.linkVanished(ld); + break; + + default: + break; + + } + } + + } + + @Override + public void triggerProbe(DeviceId deviceId) { + // TODO Auto-generated method stub + } + + @Override + public void roleChanged(DeviceId deviceId, MastershipRole newRole) { + } + + @Override + public boolean isReachable(DeviceId deviceId) { + // TODO Auto-generated method stub + return true; + } +} diff --git a/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/package-info.java b/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/package-info.java new file mode 100644 index 00000000..c119266d --- /dev/null +++ b/framework/src/onos/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/package-info.java @@ -0,0 +1,19 @@ +/* + * 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. + */ +/** + *Provider that uses PCEP controller as a means of infrastructure topology discovery. + */ +package org.onosproject.provider.pcep.topology.impl; \ No newline at end of file -- cgit 1.2.3-korg