diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java index d338975f4e..02f0a4a6f9 100644 --- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java +++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BGPNodeLSNlriVer4.java @@ -104,7 +104,7 @@ public class BGPNodeLSNlriVer4 implements BGPNodeLSNlri { * @param isVpn true if VPN info is present * @param routeDistinguisher unique for each VPN */ - BGPNodeLSNlriVer4(long identifier, byte protocolId, BGPNodeLSIdentifier localNodeDescriptors, boolean isVpn, + public BGPNodeLSNlriVer4(long identifier, byte protocolId, BGPNodeLSIdentifier localNodeDescriptors, boolean isVpn, RouteDistinguisher routeDistinguisher) { this.identifier = identifier; this.protocolId = protocolId; diff --git a/providers/bgp/app/app.xml b/providers/bgp/app/app.xml new file mode 100755 index 0000000000..072003b9af --- /dev/null +++ b/providers/bgp/app/app.xml @@ -0,0 +1,25 @@ + + + + ${project.description} + mvn:${project.groupId}/onos-bgpio/${project.version} + mvn:${project.groupId}/onos-bgp-api/${project.version} + mvn:${project.groupId}/onos-bgp-ctl/${project.version} + mvn:${project.groupId}/onos-bgp-provider-topology/${project.version} + diff --git a/providers/bgp/app/features.xml b/providers/bgp/app/features.xml new file mode 100755 index 0000000000..a6d3ae3a9d --- /dev/null +++ b/providers/bgp/app/features.xml @@ -0,0 +1,27 @@ + + + + mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features + + onos-api + mvn:${project.groupId}/onos-bgpio/${project.version} + mvn:${project.groupId}/onos-bgp-api/${project.version} + mvn:${project.groupId}/onos-bgp-ctl/${project.version} + mvn:${project.groupId}/onos-bgp-provider-topology/${project.version} + + diff --git a/providers/bgp/app/pom.xml b/providers/bgp/app/pom.xml new file mode 100755 index 0000000000..4ac3acdc5f --- /dev/null +++ b/providers/bgp/app/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + org.onosproject + onos-bgp-providers + 1.4.0-SNAPSHOT + ../pom.xml + + + onos-bgp-app + pom + BGP protocol southbound providers + + + + org.onosproject + onos-bgpio + ${project.version} + + + org.onosproject + onos-bgp-api + ${project.version} + + + org.onosproject + onos-bgp-ctl + ${project.version} + + + org.onosproject + onos-bgp-provider-topology + ${project.version} + + + diff --git a/providers/bgp/pom.xml b/providers/bgp/pom.xml new file mode 100755 index 0000000000..b2e3a51d04 --- /dev/null +++ b/providers/bgp/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.onosproject + onos-providers + 1.4.0-SNAPSHOT + ../pom.xml + + onos-bgp-providers + pom + BGP-LS protocol providers root + + topology + app + + + + + org.onosproject + onos-bgp-api + + + org.onosproject + onos-bgpio + + + org.onosproject + onos-api + tests + test + + + + io.netty + netty + + + + org.onosproject + onlab-junit + + + diff --git a/providers/bgp/topology/pom.xml b/providers/bgp/topology/pom.xml new file mode 100755 index 0000000000..b033742dfc --- /dev/null +++ b/providers/bgp/topology/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + org.onosproject + onos-bgp-providers + 1.4.0-SNAPSHOT + ../pom.xml + + onos-bgp-provider-topology + bundle + BGP topology provider + + + org.onosproject + onos-bgp-api + + + diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java new file mode 100755 index 0000000000..57581f69dc --- /dev/null +++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java @@ -0,0 +1,230 @@ +/* + * 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.bgp.topology.impl; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.onosproject.bgp.controller.BgpDpid.uri; +import static org.onosproject.net.DeviceId.deviceId; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.onlab.packet.ChassisId; +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.onosproject.bgp.controller.BGPController; +import org.onosproject.bgp.controller.BgpDpid; +import org.onosproject.bgp.controller.BgpLinkListener; +import org.onosproject.bgp.controller.BgpNodeListener; +import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4; +import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.Link; +import org.onosproject.net.MastershipRole; +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.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.provider.AbstractProvider; +import org.onosproject.net.provider.ProviderId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Provider which uses an BGP controller to detect network infrastructure topology. + */ +@Component(immediate = true) +public class BgpTopologyProvider extends AbstractProvider implements LinkProvider, DeviceProvider { + + public BgpTopologyProvider() { + super(new ProviderId("bgp", "org.onosproject.provider.bgp")); + } + + private static final Logger log = LoggerFactory.getLogger(BgpTopologyProvider.class); + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected LinkProviderRegistry linkProviderRegistry; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected DeviceProviderRegistry deviceProviderRegistry; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected BGPController controller; + + private DeviceProviderService deviceProviderService; + private LinkProviderService linkProviderService; + + private HashMap> portMap = new HashMap<>(); + private InternalBgpProvider listener = new InternalBgpProvider(); + private static final String UNKNOWN = "unknown"; + + @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(String linkUri) { + + List portList; + + if (portMap.containsKey(linkUri)) { + portList = portMap.get(linkUri); + } else { + portList = new ArrayList<>(); + } + + // TODO: port description + portList.add(new DefaultPortDescription(null, true)); + + portMap.put(linkUri, portList); + return portList; + } + + /** + * Build a link description from a bgp link. + * + * @param bgpLink bgp link + * @return linkDescription link description + */ + private LinkDescription buildLinkDescription(BgpLinkLsNlriVer4 bgpLink) { + LinkDescription ld = null; + checkNotNull(bgpLink); + + BgpDpid localNodeUri = new BgpDpid(bgpLink, BgpDpid.NODE_DESCRIPTOR_LOCAL); + DeviceId srcDeviceID = deviceId(uri(localNodeUri.toString())); + + BgpDpid remoteNodeUri = new BgpDpid(bgpLink, BgpDpid.NODE_DESCRIPTOR_REMOTE); + DeviceId dstDeviceID = deviceId(uri(remoteNodeUri.toString())); + + deviceProviderService.updatePorts(srcDeviceID, buildPortDescriptions(localNodeUri.toString())); + + deviceProviderService.updatePorts(dstDeviceID, buildPortDescriptions(remoteNodeUri.toString())); + + ConnectPoint src = new ConnectPoint(srcDeviceID, null); + + ConnectPoint dst = new ConnectPoint(dstDeviceID, null); + + ld = new DefaultLinkDescription(src, dst, Link.Type.INDIRECT); + return ld; + } + + /* + * Implements device and link update. + */ + private class InternalBgpProvider implements BgpNodeListener, BgpLinkListener { + + @Override + public void addNode(BGPNodeLSNlriVer4 nodeNlri) { + log.debug("Add node {}", nodeNlri.toString()); + + if (deviceProviderService == null) { + return; + } + BgpDpid nodeUri = new BgpDpid(nodeNlri); + DeviceId deviceId = deviceId(uri(nodeUri.toString())); + ChassisId cId = new ChassisId(); + + DeviceDescription description = new DefaultDeviceDescription(uri(nodeUri.toString()), Device.Type.ROUTER, + UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cId); + deviceProviderService.deviceConnected(deviceId, description); + + } + + @Override + public void deleteNode(BGPNodeLSNlriVer4 nodeNlri) { + log.debug("Delete node {}", nodeNlri.toString()); + + if (deviceProviderService == null) { + return; + } + + BgpDpid nodeUri = new BgpDpid(nodeNlri); + deviceProviderService.deviceDisconnected(deviceId(uri(nodeUri.toString()))); + } + + @Override + public void addLink(BgpLinkLsNlriVer4 linkNlri) { + log.debug("Add link {}", linkNlri.toString()); + + if (linkProviderService == null) { + return; + } + + LinkDescription ld = buildLinkDescription(linkNlri); + if (ld == null) { + log.error("Invalid link info."); + return; + } + + linkProviderService.linkDetected(ld); + } + + @Override + public void deleteLink(BgpLinkLsNlriVer4 linkNlri) { + log.debug("Delete link {}", linkNlri.toString()); + + if (linkProviderService == null) { + return; + } + + LinkDescription ld = buildLinkDescription(linkNlri); + if (ld == null) { + log.error("Invalid link info."); + return; + } + + linkProviderService.linkVanished(ld); + } + } + + @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/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/package-info.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/package-info.java new file mode 100755 index 0000000000..0287ec7e0a --- /dev/null +++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/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 BGP controller as a means of infrastructure topology discovery. + */ +package org.onosproject.provider.bgp.topology.impl; \ No newline at end of file diff --git a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java new file mode 100755 index 0000000000..9ae7492a73 --- /dev/null +++ b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java @@ -0,0 +1,423 @@ +/* + * Copyright 2014-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.bgp.topology.impl; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onosproject.bgp.controller.BGPCfg; +import org.onosproject.bgp.controller.BGPController; +import org.onosproject.bgp.controller.BGPId; +import org.onosproject.bgp.controller.BGPPeer; +import org.onosproject.bgp.controller.BgpLinkListener; +import org.onosproject.bgp.controller.BgpNodeListener; +import org.onosproject.bgp.controller.BgpPeerManager; +import org.onosproject.bgpio.exceptions.BGPParseException; +import org.onosproject.bgpio.protocol.BGPMessage; +import org.onosproject.bgpio.protocol.linkstate.BGPLinkLSIdentifier; +import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSIdentifier; +import org.onosproject.bgpio.protocol.linkstate.BGPNodeLSNlriVer4; +import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4; +import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors; +import org.onosproject.bgpio.types.AutonomousSystemTlv; +import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv; +import org.onosproject.bgpio.types.BGPValueType; +import org.onosproject.bgpio.types.RouteDistinguisher; +import org.onosproject.bgpio.util.Constants; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DeviceId; +import org.onosproject.net.MastershipRole; +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.PortDescription; +import org.onosproject.net.device.PortStatistics; +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.provider.ProviderId; + +public class BgpTopologyProviderTest { + + private static final DeviceId DID1 = DeviceId + .deviceId("bgp:bgpls://0:direct:0/&=bgpnodelsidentifier%7bnodedescriptors=nodedescriptors%7bdestype=512," + + "%20deslength=4,%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=100%7d]%7d%7d"); + private static final DeviceId DID2 = DeviceId + .deviceId("bgp:bgpls://0:direct:0/&=bgpnodelsidentifier%7bnodedescriptors=nodedescriptors%7bdestype=512," + + "%20deslength=4,%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=10%7d]%7d%7d"); + private static final DeviceId DID3 = DeviceId + .deviceId("bgp:bgpls://direct:0/&=nodedescriptors%7bdestype=512,%20deslength=4," + + "%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=100%7d]%7d"); + private final BgpTopologyProvider provider = new BgpTopologyProvider(); + private final TestDeviceRegistry nodeRegistry = new TestDeviceRegistry(); + private final TestLinkRegistry linkRegistry = new TestLinkRegistry(); + private final TestController controller = new TestController(); + + @Before + public void startUp() { + provider.deviceProviderRegistry = nodeRegistry; + provider.linkProviderRegistry = linkRegistry; + provider.controller = controller; + provider.activate(); + assertNotNull("provider should be registered", nodeRegistry.provider); + assertNotNull("provider should be registered", linkRegistry.provider); + assertNotNull("listener should be registered", controller.nodeListener); + } + + @After + public void tearDown() { + provider.deactivate(); + assertNull("listener should be removed", controller.nodeListener); + provider.controller = null; + provider.deviceProviderRegistry = null; + provider.linkProviderRegistry = null; + } + + /* Class implement device test registry */ + private class TestDeviceRegistry implements DeviceProviderRegistry { + DeviceProvider provider; + + Set connected = new HashSet<>(); + + @Override + public DeviceProviderService register(DeviceProvider provider) { + this.provider = provider; + return new TestProviderService(); + } + + @Override + public void unregister(DeviceProvider provider) { + } + + @Override + public Set getProviders() { + return null; + } + + private class TestProviderService implements DeviceProviderService { + + @Override + public DeviceProvider provider() { + return null; + } + + @Override + public void deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) { + if (deviceId.equals(DID1)) { + connected.add(deviceId); + } + } + + @Override + public void deviceDisconnected(DeviceId deviceId) { + if (deviceId.equals(DID1)) { + connected.remove(deviceId); + } + } + + @Override + public void updatePorts(DeviceId deviceId, List portDescriptions) { + // TODO Auto-generated method stub + + } + + @Override + public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) { + // TODO Auto-generated method stub + + } + + @Override + public void receivedRoleReply(DeviceId deviceId, MastershipRole requested, MastershipRole response) { + // TODO Auto-generated method stub + + } + + @Override + public void updatePortStatistics(DeviceId deviceId, Collection portStatistics) { + // TODO Auto-generated method stub + + } + } + } + + /* class implement link test registery */ + private class TestLinkRegistry implements LinkProviderRegistry { + LinkProvider provider; + + Set connected = new HashSet<>(); + + @Override + public LinkProviderService register(LinkProvider provider) { + this.provider = provider; + return new TestProviderService(); + } + + @Override + public void unregister(LinkProvider provider) { + } + + @Override + public Set getProviders() { + return null; + } + + private class TestProviderService implements LinkProviderService { + + @Override + public LinkProvider provider() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void linkDetected(LinkDescription linkDescription) { + if ((linkDescription.src().deviceId().equals(DID3)) + && (linkDescription.dst().deviceId().equals(DID3))) { + connected.add(linkDescription.src().deviceId()); + } + } + + @Override + public void linkVanished(LinkDescription linkDescription) { + if ((linkDescription.src().deviceId().equals(DID3)) + && (linkDescription.dst().deviceId().equals(DID3))) { + connected.remove(linkDescription.src().deviceId()); + } + } + + @Override + public void linksVanished(ConnectPoint connectPoint) { + // TODO Auto-generated method stub + + } + + @Override + public void linksVanished(DeviceId deviceId) { + connected.remove(deviceId); + } + + } + } + + /* class implement test controller */ + private class TestController implements BGPController { + protected Set nodeListener = new CopyOnWriteArraySet<>(); + protected Set linkListener = new CopyOnWriteArraySet<>(); + + @Override + public void addListener(BgpNodeListener nodeListener) { + this.nodeListener.add(nodeListener); + } + + @Override + public void removeListener(BgpNodeListener nodeListener) { + this.nodeListener = null; + } + + @Override + public void addLinkListener(BgpLinkListener linkListener) { + this.linkListener.add(linkListener); + } + + @Override + public void removeLinkListener(BgpLinkListener linkListener) { + this.linkListener = null; + } + + @Override + public Iterable getPeers() { + // TODO Auto-generated method stub + return null; + } + + @Override + public BGPPeer getPeer(BGPId bgpId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void writeMsg(BGPId bgpId, BGPMessage msg) { + // TODO Auto-generated method stub + + } + + @Override + public void processBGPPacket(BGPId bgpId, BGPMessage msg) throws BGPParseException { + // TODO Auto-generated method stub + + } + + @Override + public void closeConnectedPeers() { + // TODO Auto-generated method stub + + } + + @Override + public BGPCfg getConfig() { + // TODO Auto-generated method stub + return null; + } + + @Override + public int connectedPeerCount() { + // TODO Auto-generated method stub + return 0; + } + + + @Override + public BgpPeerManager peerManager() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map connectedPeers() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set listener() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set linkListener() { + // TODO Auto-generated method stub + return null; + } + } + + /* Validate node is added to the device validating URI, RIB should get updated properly */ + @Test + public void bgpTopologyProviderTestAddDevice1() { + int deviceAddCount = 0; + LinkedList subTlvs; + subTlvs = new LinkedList<>(); + BGPValueType tlv = new AutonomousSystemTlv(100); + short deslength = AutonomousSystemTlv.LENGTH; + short desType = AutonomousSystemTlv.TYPE; + + subTlvs.add(tlv); + BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, + desType)); + BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, + new RouteDistinguisher()); + + nodeNlri.setNodeLSIdentifier(localNodeDescriptors); + for (BgpNodeListener l : controller.nodeListener) { + l.addNode(nodeNlri); + deviceAddCount = nodeRegistry.connected.size(); + assertTrue(deviceAddCount == 1); + l.deleteNode(nodeNlri); + deviceAddCount = nodeRegistry.connected.size(); + assertTrue(deviceAddCount == 0); + } + } + + /* Validate node is not added to the device for invalid URI, RIB count should be zero */ + @Test + public void bgpTopologyProviderTestAddDevice2() { + LinkedList subTlvs; + BGPValueType tlv = new AutonomousSystemTlv(10); + short deslength = AutonomousSystemTlv.LENGTH; + short desType = AutonomousSystemTlv.TYPE; + + subTlvs = new LinkedList<>(); + subTlvs.add(tlv); + BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, + desType)); + BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, + new RouteDistinguisher()); + + nodeNlri.setNodeLSIdentifier(localNodeDescriptors); + for (BgpNodeListener l : controller.nodeListener) { + l.addNode(nodeNlri); + assertTrue("Failed to add device", (nodeRegistry.connected.size() == 0)); + } + } + + /* Delete node when node does not exist, RIB count should be zero */ + @Test + public void bgpTopologyProviderTestAddDevice3() { + LinkedList subTlvs; + BGPValueType tlv = new AutonomousSystemTlv(10); + short deslength = AutonomousSystemTlv.LENGTH; + short desType = AutonomousSystemTlv.TYPE; + + subTlvs = new LinkedList<>(); + subTlvs.add(tlv); + BGPNodeLSIdentifier localNodeDescriptors = new BGPNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, + desType)); + BGPNodeLSNlriVer4 nodeNlri = new BGPNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, + new RouteDistinguisher()); + + nodeNlri.setNodeLSIdentifier(localNodeDescriptors); + for (BgpNodeListener l : controller.nodeListener) { + l.deleteNode(nodeNlri); + assertTrue("Failed to add device", (nodeRegistry.connected.size() == 0)); + } + } + + /* Validate link is added to the device validating URI, RIB should get updated properly */ + @Test + public void bgpTopologyProviderTestAddLink1() { + + NodeDescriptors localNodeDescriptors; + NodeDescriptors remoteNodeDescriptors; + LinkedList subTlvs; + LinkedList linkDescriptor = new LinkedList<>(); + BGPValueType tlvLocalRemoteId; + short deslength = AutonomousSystemTlv.LENGTH; + short desType = AutonomousSystemTlv.TYPE; + + BGPValueType tlv = new AutonomousSystemTlv(100); + subTlvs = new LinkedList<>(); + subTlvs.add(tlv); + + localNodeDescriptors = new NodeDescriptors(subTlvs, deslength, desType); + remoteNodeDescriptors = new NodeDescriptors(subTlvs, deslength, desType); + tlvLocalRemoteId = new LinkLocalRemoteIdentifiersTlv(1, 2); + linkDescriptor.add(tlvLocalRemoteId); + + BGPLinkLSIdentifier linkLSIdentifier = new BGPLinkLSIdentifier(localNodeDescriptors, remoteNodeDescriptors, + linkDescriptor); + BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4((byte) Constants.DIRECT, 0, linkLSIdentifier, null, false); + + for (BgpLinkListener l : controller.linkListener) { + l.addLink(linkNlri); + assertTrue(linkRegistry.connected.size() == 1); + l.deleteLink(linkNlri); + assertTrue(linkRegistry.connected.size() == 0); + } + } +} diff --git a/providers/pom.xml b/providers/pom.xml index a02f8d4fd3..32890b921d 100644 --- a/providers/pom.xml +++ b/providers/pom.xml @@ -39,6 +39,7 @@ null pcep ovsdb + bgp