Committed by
Priyankab-Huawei
[ONOS] Cherry picked from master 1.7
Change-Id: I74a0c1634f9c425af2bcb646edc3d9170b3c087c
Showing
73 changed files
with
5086 additions
and
757 deletions
| ... | @@ -22,6 +22,7 @@ | ... | @@ -22,6 +22,7 @@ |
| 22 | <groupId>org.onosproject</groupId> | 22 | <groupId>org.onosproject</groupId> |
| 23 | <artifactId>onos-pce</artifactId> | 23 | <artifactId>onos-pce</artifactId> |
| 24 | <version>1.6.0-SNAPSHOT</version> | 24 | <version>1.6.0-SNAPSHOT</version> |
| 25 | + <relativePath>../pom.xml</relativePath> | ||
| 25 | </parent> | 26 | </parent> |
| 26 | <artifactId>onos-app-pce</artifactId> | 27 | <artifactId>onos-app-pce</artifactId> |
| 27 | <packaging>bundle</packaging> | 28 | <packaging>bundle</packaging> | ... | ... |
| ... | @@ -26,6 +26,12 @@ import java.util.Map; | ... | @@ -26,6 +26,12 @@ import java.util.Map; |
| 26 | import java.util.Optional; | 26 | import java.util.Optional; |
| 27 | import java.util.Map.Entry; | 27 | import java.util.Map.Entry; |
| 28 | import java.util.Set; | 28 | import java.util.Set; |
| 29 | +import java.util.concurrent.Executors; | ||
| 30 | +import java.util.concurrent.ScheduledExecutorService; | ||
| 31 | +import java.util.concurrent.TimeUnit; | ||
| 32 | + | ||
| 33 | +import org.onlab.packet.Ethernet; | ||
| 34 | +import org.onlab.packet.IPv4; | ||
| 29 | 35 | ||
| 30 | import org.apache.felix.scr.annotations.Activate; | 36 | import org.apache.felix.scr.annotations.Activate; |
| 31 | import org.apache.felix.scr.annotations.Component; | 37 | import org.apache.felix.scr.annotations.Component; |
| ... | @@ -35,6 +41,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -35,6 +41,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 35 | import org.apache.felix.scr.annotations.Service; | 41 | import org.apache.felix.scr.annotations.Service; |
| 36 | import org.onlab.packet.IpAddress; | 42 | import org.onlab.packet.IpAddress; |
| 37 | import org.onlab.packet.IpPrefix; | 43 | import org.onlab.packet.IpPrefix; |
| 44 | +import org.onlab.packet.TCP; | ||
| 38 | import org.onlab.util.Bandwidth; | 45 | import org.onlab.util.Bandwidth; |
| 39 | import org.onosproject.core.ApplicationId; | 46 | import org.onosproject.core.ApplicationId; |
| 40 | import org.onosproject.core.CoreService; | 47 | import org.onosproject.core.CoreService; |
| ... | @@ -52,6 +59,7 @@ import org.onosproject.incubator.net.tunnel.TunnelId; | ... | @@ -52,6 +59,7 @@ import org.onosproject.incubator.net.tunnel.TunnelId; |
| 52 | import org.onosproject.incubator.net.tunnel.TunnelListener; | 59 | import org.onosproject.incubator.net.tunnel.TunnelListener; |
| 53 | import org.onosproject.incubator.net.tunnel.TunnelName; | 60 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 54 | import org.onosproject.incubator.net.tunnel.TunnelService; | 61 | import org.onosproject.incubator.net.tunnel.TunnelService; |
| 62 | +import org.onosproject.mastership.MastershipService; | ||
| 55 | import org.onosproject.net.DefaultAnnotations; | 63 | import org.onosproject.net.DefaultAnnotations; |
| 56 | import org.onosproject.net.DefaultAnnotations.Builder; | 64 | import org.onosproject.net.DefaultAnnotations.Builder; |
| 57 | import org.onosproject.net.Device; | 65 | import org.onosproject.net.Device; |
| ... | @@ -63,6 +71,7 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; | ... | @@ -63,6 +71,7 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; |
| 63 | import org.onosproject.net.flowobjective.Objective; | 71 | import org.onosproject.net.flowobjective.Objective; |
| 64 | import org.onosproject.net.intent.Constraint; | 72 | import org.onosproject.net.intent.Constraint; |
| 65 | import org.onosproject.net.intent.constraint.BandwidthConstraint; | 73 | import org.onosproject.net.intent.constraint.BandwidthConstraint; |
| 74 | +import org.onosproject.net.link.LinkEvent; | ||
| 66 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint; | 75 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint; |
| 67 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType; | 76 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType; |
| 68 | import org.onosproject.pce.pceservice.constraint.CostConstraint; | 77 | import org.onosproject.pce.pceservice.constraint.CostConstraint; |
| ... | @@ -76,6 +85,9 @@ import org.onosproject.net.resource.Resources; | ... | @@ -76,6 +85,9 @@ import org.onosproject.net.resource.Resources; |
| 76 | import org.onosproject.net.topology.LinkWeight; | 85 | import org.onosproject.net.topology.LinkWeight; |
| 77 | import org.onosproject.net.topology.PathService; | 86 | import org.onosproject.net.topology.PathService; |
| 78 | import org.onosproject.net.topology.TopologyEdge; | 87 | import org.onosproject.net.topology.TopologyEdge; |
| 88 | +import org.onosproject.net.topology.TopologyEvent; | ||
| 89 | +import org.onosproject.net.topology.TopologyListener; | ||
| 90 | +import org.onosproject.net.topology.TopologyService; | ||
| 79 | import org.onosproject.pce.pceservice.api.PceService; | 91 | import org.onosproject.pce.pceservice.api.PceService; |
| 80 | import org.onosproject.pce.pcestore.PcePathInfo; | 92 | import org.onosproject.pce.pcestore.PcePathInfo; |
| 81 | import org.onosproject.pce.pcestore.PceccTunnelInfo; | 93 | import org.onosproject.pce.pcestore.PceccTunnelInfo; |
| ... | @@ -131,6 +143,7 @@ public class PceManager implements PceService { | ... | @@ -131,6 +143,7 @@ public class PceManager implements PceService { |
| 131 | private static final String TRUE = "true"; | 143 | private static final String TRUE = "true"; |
| 132 | private static final String FALSE = "false"; | 144 | private static final String FALSE = "false"; |
| 133 | private static final String END_OF_SYNC_IP_PREFIX = "0.0.0.0/32"; | 145 | private static final String END_OF_SYNC_IP_PREFIX = "0.0.0.0/32"; |
| 146 | + public static final int PCEP_PORT = 4189; | ||
| 134 | 147 | ||
| 135 | private IdGenerator localLspIdIdGen; | 148 | private IdGenerator localLspIdIdGen; |
| 136 | protected DistributedSet<Short> localLspIdFreeList; | 149 | protected DistributedSet<Short> localLspIdFreeList; |
| ... | @@ -171,12 +184,23 @@ public class PceManager implements PceService { | ... | @@ -171,12 +184,23 @@ public class PceManager implements PceService { |
| 171 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 184 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 172 | protected FlowObjectiveService flowObjectiveService; | 185 | protected FlowObjectiveService flowObjectiveService; |
| 173 | 186 | ||
| 187 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 188 | + protected MastershipService mastershipService; | ||
| 189 | + | ||
| 190 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 191 | + protected TopologyService topologyService; | ||
| 192 | + | ||
| 174 | private TunnelListener listener = new InnerTunnelListener(); | 193 | private TunnelListener listener = new InnerTunnelListener(); |
| 175 | private BasicPceccHandler crHandler; | 194 | private BasicPceccHandler crHandler; |
| 176 | private PceccSrTeBeHandler srTeHandler; | 195 | private PceccSrTeBeHandler srTeHandler; |
| 177 | private ApplicationId appId; | 196 | private ApplicationId appId; |
| 178 | 197 | ||
| 179 | private final PcepPacketProcessor processor = new PcepPacketProcessor(); | 198 | private final PcepPacketProcessor processor = new PcepPacketProcessor(); |
| 199 | + private final TopologyListener topologyListener = new InternalTopologyListener(); | ||
| 200 | + private ScheduledExecutorService executor; | ||
| 201 | + | ||
| 202 | + public static final int INITIAL_DELAY = 30; | ||
| 203 | + public static final int PERIODIC_DELAY = 30; | ||
| 180 | 204 | ||
| 181 | /** | 205 | /** |
| 182 | * Creates new instance of PceManager. | 206 | * Creates new instance of PceManager. |
| ... | @@ -204,6 +228,10 @@ public class PceManager implements PceService { | ... | @@ -204,6 +228,10 @@ public class PceManager implements PceService { |
| 204 | .asDistributedSet(); | 228 | .asDistributedSet(); |
| 205 | 229 | ||
| 206 | packetService.addProcessor(processor, PacketProcessor.director(4)); | 230 | packetService.addProcessor(processor, PacketProcessor.director(4)); |
| 231 | + topologyService.addListener(topologyListener); | ||
| 232 | + executor = Executors.newSingleThreadScheduledExecutor(); | ||
| 233 | + //Start a timer when the component is up, with initial delay of 30min and periodic delays at 30min | ||
| 234 | + executor.scheduleAtFixedRate(new GlobalOptimizationTimer(), INITIAL_DELAY, PERIODIC_DELAY, TimeUnit.MINUTES); | ||
| 207 | log.info("Started"); | 235 | log.info("Started"); |
| 208 | } | 236 | } |
| 209 | 237 | ||
| ... | @@ -211,6 +239,9 @@ public class PceManager implements PceService { | ... | @@ -211,6 +239,9 @@ public class PceManager implements PceService { |
| 211 | protected void deactivate() { | 239 | protected void deactivate() { |
| 212 | tunnelService.removeListener(listener); | 240 | tunnelService.removeListener(listener); |
| 213 | packetService.removeProcessor(processor); | 241 | packetService.removeProcessor(processor); |
| 242 | + topologyService.removeListener(topologyListener); | ||
| 243 | + //Shutdown the thread when component is deactivated | ||
| 244 | + executor.shutdown(); | ||
| 214 | log.info("Stopped"); | 245 | log.info("Stopped"); |
| 215 | } | 246 | } |
| 216 | 247 | ||
| ... | @@ -395,6 +426,7 @@ public class PceManager implements PceService { | ... | @@ -395,6 +426,7 @@ public class PceManager implements PceService { |
| 395 | List<Link> links = tunnel.path().links(); | 426 | List<Link> links = tunnel.path().links(); |
| 396 | String lspSigType = tunnel.annotations().value(LSP_SIG_TYPE); | 427 | String lspSigType = tunnel.annotations().value(LSP_SIG_TYPE); |
| 397 | double bwConstraintValue = 0; | 428 | double bwConstraintValue = 0; |
| 429 | + String costType = null; | ||
| 398 | SharedBandwidthConstraint shBwConstraint = null; | 430 | SharedBandwidthConstraint shBwConstraint = null; |
| 399 | BandwidthConstraint bwConstraint = null; | 431 | BandwidthConstraint bwConstraint = null; |
| 400 | CostConstraint costConstraint = null; | 432 | CostConstraint costConstraint = null; |
| ... | @@ -409,6 +441,7 @@ public class PceManager implements PceService { | ... | @@ -409,6 +441,7 @@ public class PceManager implements PceService { |
| 409 | bwConstraintValue = bwConstraint.bandwidth().bps(); | 441 | bwConstraintValue = bwConstraint.bandwidth().bps(); |
| 410 | } else if (constraint instanceof CostConstraint) { | 442 | } else if (constraint instanceof CostConstraint) { |
| 411 | costConstraint = (CostConstraint) constraint; | 443 | costConstraint = (CostConstraint) constraint; |
| 444 | + costType = costConstraint.type().name(); | ||
| 412 | } | 445 | } |
| 413 | } | 446 | } |
| 414 | 447 | ||
| ... | @@ -454,6 +487,9 @@ public class PceManager implements PceService { | ... | @@ -454,6 +487,9 @@ public class PceManager implements PceService { |
| 454 | 487 | ||
| 455 | Builder annotationBuilder = DefaultAnnotations.builder(); | 488 | Builder annotationBuilder = DefaultAnnotations.builder(); |
| 456 | annotationBuilder.set(BANDWIDTH, String.valueOf(bwConstraintValue)); | 489 | annotationBuilder.set(BANDWIDTH, String.valueOf(bwConstraintValue)); |
| 490 | + if (costType != null) { | ||
| 491 | + annotationBuilder.set(COST_TYPE, costType); | ||
| 492 | + } | ||
| 457 | annotationBuilder.set(LSP_SIG_TYPE, lspSigType); | 493 | annotationBuilder.set(LSP_SIG_TYPE, lspSigType); |
| 458 | annotationBuilder.set(PCE_INIT, TRUE); | 494 | annotationBuilder.set(PCE_INIT, TRUE); |
| 459 | annotationBuilder.set(DELEGATE, TRUE); | 495 | annotationBuilder.set(DELEGATE, TRUE); |
| ... | @@ -594,8 +630,66 @@ public class PceManager implements PceService { | ... | @@ -594,8 +630,66 @@ public class PceManager implements PceService { |
| 594 | } | 630 | } |
| 595 | } | 631 | } |
| 596 | 632 | ||
| 633 | + //TODO: annotations used for temporarily later projection/network config will be used | ||
| 634 | + private class InternalTopologyListener implements TopologyListener { | ||
| 635 | + @Override | ||
| 636 | + public void event(TopologyEvent event) { | ||
| 637 | + event.reasons().forEach(e -> { | ||
| 638 | + //If event type is link removed, get the impacted tunnel | ||
| 639 | + if (e instanceof LinkEvent) { | ||
| 640 | + LinkEvent linkEvent = (LinkEvent) e; | ||
| 641 | + if (linkEvent.type() == LinkEvent.Type.LINK_REMOVED) { | ||
| 642 | + tunnelService.queryTunnel(MPLS).forEach(t -> { | ||
| 643 | + if (t.path().links().contains((e.subject()))) { | ||
| 644 | + // Check whether this ONOS instance is master for ingress device if yes, | ||
| 645 | + // recompute and send update | ||
| 646 | + checkForMasterAndUpdateTunnel(t.path().src().deviceId(), t); | ||
| 647 | + } | ||
| 648 | + }); | ||
| 649 | + } | ||
| 650 | + } | ||
| 651 | + }); | ||
| 652 | + } | ||
| 653 | + } | ||
| 597 | 654 | ||
| 598 | - // Allocates the bandwidth locally for PCECC tunnels. | 655 | + private boolean checkForMasterAndUpdateTunnel(DeviceId src, Tunnel tunnel) { |
| 656 | + /** | ||
| 657 | + * Master of ingress node will recompute and also delegation flag must be set. | ||
| 658 | + */ | ||
| 659 | + if (mastershipService.isLocalMaster(src) | ||
| 660 | + && Boolean.valueOf(tunnel.annotations().value(DELEGATE)) != null) { | ||
| 661 | + LinkedList<Constraint> constraintList = new LinkedList<>(); | ||
| 662 | + | ||
| 663 | + if (tunnel.annotations().value(BANDWIDTH) != null) { | ||
| 664 | + //Requested bandwidth will be same as previous allocated bandwidth for the tunnel | ||
| 665 | + BandwidthConstraint localConst = new BandwidthConstraint(Bandwidth.bps(Double.parseDouble(tunnel | ||
| 666 | + .annotations().value(BANDWIDTH)))); | ||
| 667 | + constraintList.add(localConst); | ||
| 668 | + } | ||
| 669 | + if (tunnel.annotations().value(COST_TYPE) != null) { | ||
| 670 | + constraintList.add(CostConstraint.of(CostConstraint.Type.valueOf(tunnel.annotations().value( | ||
| 671 | + COST_TYPE)))); | ||
| 672 | + } | ||
| 673 | + | ||
| 674 | + /* | ||
| 675 | + * If tunnel was UP after recomputation failed then store failed path in PCE store send PCIntiate(remove) | ||
| 676 | + * and If tunnel is failed and computation fails nothing to do because tunnel status will be same[Failed] | ||
| 677 | + */ | ||
| 678 | + if (!updatePath(tunnel.tunnelId(), constraintList) && !tunnel.state().equals(Tunnel.State.FAILED)) { | ||
| 679 | + // If updation fails store in PCE store as failed path | ||
| 680 | + // then PCInitiate (Remove) | ||
| 681 | + pceStore.addFailedPathInfo(new PcePathInfo(tunnel.path().src().deviceId(), tunnel | ||
| 682 | + .path().dst().deviceId(), tunnel.tunnelName().value(), constraintList, | ||
| 683 | + LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)))); | ||
| 684 | + //Release that tunnel calling PCInitiate | ||
| 685 | + releasePath(tunnel.tunnelId()); | ||
| 686 | + } | ||
| 687 | + } | ||
| 688 | + | ||
| 689 | + return false; | ||
| 690 | + } | ||
| 691 | + | ||
| 692 | + // Allocates the bandwidth locally for PCECC tunnels. | ||
| 599 | private TunnelConsumerId reserveBandwidth(Path computedPath, double bandwidthConstraint, | 693 | private TunnelConsumerId reserveBandwidth(Path computedPath, double bandwidthConstraint, |
| 600 | SharedBandwidthConstraint shBwConstraint) { | 694 | SharedBandwidthConstraint shBwConstraint) { |
| 601 | checkNotNull(computedPath); | 695 | checkNotNull(computedPath); |
| ... | @@ -860,14 +954,72 @@ public class PceManager implements PceService { | ... | @@ -860,14 +954,72 @@ public class PceManager implements PceService { |
| 860 | public void process(PacketContext context) { | 954 | public void process(PacketContext context) { |
| 861 | // Stop processing if the packet has been handled, since we | 955 | // Stop processing if the packet has been handled, since we |
| 862 | // can't do any more to it. | 956 | // can't do any more to it. |
| 863 | - | ||
| 864 | if (context.isHandled()) { | 957 | if (context.isHandled()) { |
| 865 | return; | 958 | return; |
| 866 | } | 959 | } |
| 867 | 960 | ||
| 868 | InboundPacket pkt = context.inPacket(); | 961 | InboundPacket pkt = context.inPacket(); |
| 962 | + if (pkt == null) { | ||
| 963 | + return; | ||
| 964 | + } | ||
| 965 | + | ||
| 966 | + Ethernet ethernet = pkt.parsed(); | ||
| 967 | + if (ethernet == null || ethernet.getEtherType() != Ethernet.TYPE_IPV4) { | ||
| 968 | + return; | ||
| 969 | + } | ||
| 970 | + | ||
| 971 | + IPv4 ipPacket = (IPv4) ethernet.getPayload(); | ||
| 972 | + if (ipPacket == null || ipPacket.getProtocol() != IPv4.PROTOCOL_TCP) { | ||
| 973 | + return; | ||
| 974 | + } | ||
| 975 | + | ||
| 976 | + TCP tcp = (TCP) ipPacket.getPayload(); | ||
| 977 | + if (tcp == null || tcp.getDestinationPort() != PCEP_PORT) { | ||
| 978 | + return; | ||
| 979 | + } | ||
| 980 | + | ||
| 869 | syncLabelDb(pkt.receivedFrom().deviceId()); | 981 | syncLabelDb(pkt.receivedFrom().deviceId()); |
| 870 | } | 982 | } |
| 871 | } | 983 | } |
| 872 | 984 | ||
| 985 | + //Computes path from tunnel store and also path failed to setup. | ||
| 986 | + private void callForOptimization() { | ||
| 987 | + //Recompute the LSPs which it was delegated [LSPs stored in PCE store (failed paths)] | ||
| 988 | + for (PcePathInfo failedPathInfo : pceStore.getFailedPathInfos()) { | ||
| 989 | + checkForMasterAndSetupPath(failedPathInfo); | ||
| 990 | + } | ||
| 991 | + | ||
| 992 | + //Recompute the LSPs for which it was delegated [LSPs stored in tunnel store] | ||
| 993 | + tunnelService.queryTunnel(MPLS).forEach(t -> { | ||
| 994 | + checkForMasterAndUpdateTunnel(t.path().src().deviceId(), t); | ||
| 995 | + }); | ||
| 996 | + } | ||
| 997 | + | ||
| 998 | + private boolean checkForMasterAndSetupPath(PcePathInfo failedPathInfo) { | ||
| 999 | + /** | ||
| 1000 | + * Master of ingress node will setup the path failed stored in PCE store. | ||
| 1001 | + */ | ||
| 1002 | + if (mastershipService.isLocalMaster(failedPathInfo.src())) { | ||
| 1003 | + if (setupPath(failedPathInfo.src(), failedPathInfo.dst(), failedPathInfo.name(), | ||
| 1004 | + failedPathInfo.constraints(), failedPathInfo.lspType())) { | ||
| 1005 | + // If computation is success remove that path | ||
| 1006 | + pceStore.removeFailedPathInfo(failedPathInfo); | ||
| 1007 | + return true; | ||
| 1008 | + } | ||
| 1009 | + } | ||
| 1010 | + | ||
| 1011 | + return false; | ||
| 1012 | + } | ||
| 1013 | + | ||
| 1014 | + //Timer to call global optimization | ||
| 1015 | + private class GlobalOptimizationTimer implements Runnable { | ||
| 1016 | + | ||
| 1017 | + public GlobalOptimizationTimer() { | ||
| 1018 | + } | ||
| 1019 | + | ||
| 1020 | + @Override | ||
| 1021 | + public void run() { | ||
| 1022 | + callForOptimization(); | ||
| 1023 | + } | ||
| 1024 | + } | ||
| 873 | } | 1025 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -19,7 +19,6 @@ import static org.hamcrest.MatcherAssert.assertThat; | ... | @@ -19,7 +19,6 @@ import static org.hamcrest.MatcherAssert.assertThat; |
| 19 | import static org.hamcrest.Matchers.is; | 19 | import static org.hamcrest.Matchers.is; |
| 20 | import static org.hamcrest.Matchers.notNullValue; | 20 | import static org.hamcrest.Matchers.notNullValue; |
| 21 | import static org.hamcrest.Matchers.nullValue; | 21 | import static org.hamcrest.Matchers.nullValue; |
| 22 | - | ||
| 23 | import static org.onosproject.net.Link.Type.DIRECT; | 22 | import static org.onosproject.net.Link.Type.DIRECT; |
| 24 | 23 | ||
| 25 | import java.util.Iterator; | 24 | import java.util.Iterator; |
| ... | @@ -29,7 +28,6 @@ import java.util.LinkedList; | ... | @@ -29,7 +28,6 @@ import java.util.LinkedList; |
| 29 | import org.junit.After; | 28 | import org.junit.After; |
| 30 | import org.junit.Before; | 29 | import org.junit.Before; |
| 31 | import org.junit.Test; | 30 | import org.junit.Test; |
| 32 | - | ||
| 33 | import org.onlab.packet.IpAddress; | 31 | import org.onlab.packet.IpAddress; |
| 34 | import org.onosproject.core.ApplicationId; | 32 | import org.onosproject.core.ApplicationId; |
| 35 | import org.onosproject.core.CoreService; | 33 | import org.onosproject.core.CoreService; |
| ... | @@ -165,6 +163,7 @@ public class BasicPceccHandlerTest { | ... | @@ -165,6 +163,7 @@ public class BasicPceccHandlerTest { |
| 165 | 163 | ||
| 166 | @After | 164 | @After |
| 167 | public void tearDown() throws Exception { | 165 | public void tearDown() throws Exception { |
| 166 | + PceManagerTest.flowsDownloaded = 0; | ||
| 168 | } | 167 | } |
| 169 | 168 | ||
| 170 | /** | 169 | /** | ... | ... |
| ... | @@ -15,13 +15,17 @@ import static org.onosproject.pce.pceservice.PathComputationTest.D1; | ... | @@ -15,13 +15,17 @@ import static org.onosproject.pce.pceservice.PathComputationTest.D1; |
| 15 | import static org.onosproject.pce.pceservice.PathComputationTest.D2; | 15 | import static org.onosproject.pce.pceservice.PathComputationTest.D2; |
| 16 | import static org.onosproject.pce.pceservice.PathComputationTest.D3; | 16 | import static org.onosproject.pce.pceservice.PathComputationTest.D3; |
| 17 | import static org.onosproject.pce.pceservice.PathComputationTest.D4; | 17 | import static org.onosproject.pce.pceservice.PathComputationTest.D4; |
| 18 | +import static org.onosproject.pce.pceservice.PathComputationTest.DEVICE1; | ||
| 19 | +import static org.onosproject.pce.pceservice.PathComputationTest.DEVICE2; | ||
| 20 | +import static org.onosproject.pce.pceservice.PathComputationTest.DEVICE3; | ||
| 21 | +import static org.onosproject.pce.pceservice.PathComputationTest.DEVICE4; | ||
| 18 | import static org.onosproject.pce.pceservice.PcepAnnotationKeys.LOCAL_LSP_ID; | 22 | import static org.onosproject.pce.pceservice.PcepAnnotationKeys.LOCAL_LSP_ID; |
| 19 | import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PLSP_ID; | 23 | import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PLSP_ID; |
| 20 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE; | 24 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE; |
| 21 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.ESTABLISHED; | 25 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.ESTABLISHED; |
| 26 | +import static org.onosproject.net.MastershipRole.MASTER; | ||
| 22 | 27 | ||
| 23 | import java.net.URISyntaxException; | 28 | import java.net.URISyntaxException; |
| 24 | -import java.nio.ByteBuffer; | ||
| 25 | import java.util.Collection; | 29 | import java.util.Collection; |
| 26 | import java.util.Collections; | 30 | import java.util.Collections; |
| 27 | import java.util.HashMap; | 31 | import java.util.HashMap; |
| ... | @@ -35,14 +39,18 @@ import org.junit.After; | ... | @@ -35,14 +39,18 @@ import org.junit.After; |
| 35 | import org.junit.Before; | 39 | import org.junit.Before; |
| 36 | import org.junit.Test; | 40 | import org.junit.Test; |
| 37 | import org.onlab.graph.GraphPathSearch; | 41 | import org.onlab.graph.GraphPathSearch; |
| 42 | +import org.onlab.junit.TestUtils; | ||
| 43 | +import org.onlab.junit.TestUtils.TestUtilsException; | ||
| 38 | import org.onlab.packet.Ethernet; | 44 | import org.onlab.packet.Ethernet; |
| 39 | import org.onlab.packet.IPv4; | 45 | import org.onlab.packet.IPv4; |
| 46 | +import org.onlab.packet.TCP; | ||
| 40 | import org.onlab.util.Bandwidth; | 47 | import org.onlab.util.Bandwidth; |
| 41 | import org.onosproject.common.DefaultTopologyGraph; | 48 | import org.onosproject.common.DefaultTopologyGraph; |
| 42 | import org.onosproject.core.ApplicationId; | 49 | import org.onosproject.core.ApplicationId; |
| 43 | import org.onosproject.core.CoreServiceAdapter; | 50 | import org.onosproject.core.CoreServiceAdapter; |
| 44 | import org.onosproject.core.DefaultApplicationId; | 51 | import org.onosproject.core.DefaultApplicationId; |
| 45 | import org.onosproject.core.IdGenerator; | 52 | import org.onosproject.core.IdGenerator; |
| 53 | +import org.onosproject.event.Event; | ||
| 46 | import org.onosproject.incubator.net.resource.label.LabelResourceId; | 54 | import org.onosproject.incubator.net.resource.label.LabelResourceId; |
| 47 | import org.onosproject.incubator.net.resource.label.LabelResourceService; | 55 | import org.onosproject.incubator.net.resource.label.LabelResourceService; |
| 48 | import org.onosproject.incubator.net.tunnel.DefaultTunnel; | 56 | import org.onosproject.incubator.net.tunnel.DefaultTunnel; |
| ... | @@ -52,6 +60,7 @@ import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | ... | @@ -52,6 +60,7 @@ import org.onosproject.incubator.net.tunnel.TunnelEndPoint; |
| 52 | import org.onosproject.incubator.net.tunnel.TunnelEvent; | 60 | import org.onosproject.incubator.net.tunnel.TunnelEvent; |
| 53 | import org.onosproject.incubator.net.tunnel.TunnelId; | 61 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 54 | import org.onosproject.incubator.net.tunnel.TunnelListener; | 62 | import org.onosproject.incubator.net.tunnel.TunnelListener; |
| 63 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 55 | import org.onosproject.net.AnnotationKeys; | 64 | import org.onosproject.net.AnnotationKeys; |
| 56 | import org.onosproject.net.Annotations; | 65 | import org.onosproject.net.Annotations; |
| 57 | import org.onosproject.net.ConnectPoint; | 66 | import org.onosproject.net.ConnectPoint; |
| ... | @@ -60,6 +69,7 @@ import org.onosproject.net.DefaultDevice; | ... | @@ -60,6 +69,7 @@ import org.onosproject.net.DefaultDevice; |
| 60 | import org.onosproject.net.DefaultLink; | 69 | import org.onosproject.net.DefaultLink; |
| 61 | import org.onosproject.net.Device; | 70 | import org.onosproject.net.Device; |
| 62 | import org.onosproject.net.DefaultAnnotations.Builder; | 71 | import org.onosproject.net.DefaultAnnotations.Builder; |
| 72 | +import org.onosproject.net.MastershipRole; | ||
| 63 | import org.onosproject.net.device.DeviceServiceAdapter; | 73 | import org.onosproject.net.device.DeviceServiceAdapter; |
| 64 | import org.onosproject.net.flowobjective.ForwardingObjective; | 74 | import org.onosproject.net.flowobjective.ForwardingObjective; |
| 65 | import org.onosproject.net.DeviceId; | 75 | import org.onosproject.net.DeviceId; |
| ... | @@ -71,6 +81,7 @@ import org.onosproject.net.SparseAnnotations; | ... | @@ -71,6 +81,7 @@ import org.onosproject.net.SparseAnnotations; |
| 71 | import org.onosproject.net.intent.Constraint; | 81 | import org.onosproject.net.intent.Constraint; |
| 72 | import org.onosproject.net.intent.IntentId; | 82 | import org.onosproject.net.intent.IntentId; |
| 73 | import org.onosproject.net.intent.constraint.BandwidthConstraint; | 83 | import org.onosproject.net.intent.constraint.BandwidthConstraint; |
| 84 | +import org.onosproject.net.link.LinkEvent; | ||
| 74 | import org.onosproject.net.packet.DefaultInboundPacket; | 85 | import org.onosproject.net.packet.DefaultInboundPacket; |
| 75 | import org.onosproject.net.packet.DefaultPacketContext; | 86 | import org.onosproject.net.packet.DefaultPacketContext; |
| 76 | import org.onosproject.net.packet.InboundPacket; | 87 | import org.onosproject.net.packet.InboundPacket; |
| ... | @@ -86,7 +97,9 @@ import org.onosproject.net.topology.LinkWeight; | ... | @@ -86,7 +97,9 @@ import org.onosproject.net.topology.LinkWeight; |
| 86 | import org.onosproject.net.topology.PathServiceAdapter; | 97 | import org.onosproject.net.topology.PathServiceAdapter; |
| 87 | import org.onosproject.net.topology.Topology; | 98 | import org.onosproject.net.topology.Topology; |
| 88 | import org.onosproject.net.topology.TopologyEdge; | 99 | import org.onosproject.net.topology.TopologyEdge; |
| 100 | +import org.onosproject.net.topology.TopologyEvent; | ||
| 89 | import org.onosproject.net.topology.TopologyGraph; | 101 | import org.onosproject.net.topology.TopologyGraph; |
| 102 | +import org.onosproject.net.topology.TopologyListener; | ||
| 90 | import org.onosproject.net.topology.TopologyServiceAdapter; | 103 | import org.onosproject.net.topology.TopologyServiceAdapter; |
| 91 | import org.onosproject.net.topology.TopologyVertex; | 104 | import org.onosproject.net.topology.TopologyVertex; |
| 92 | import org.onosproject.pce.pceservice.PathComputationTest.MockPathResourceService; | 105 | import org.onosproject.pce.pceservice.PathComputationTest.MockPathResourceService; |
| ... | @@ -97,7 +110,9 @@ import org.onosproject.pce.util.PceStoreAdapter; | ... | @@ -97,7 +110,9 @@ import org.onosproject.pce.util.PceStoreAdapter; |
| 97 | import org.onosproject.pce.util.TunnelServiceAdapter; | 110 | import org.onosproject.pce.util.TunnelServiceAdapter; |
| 98 | import org.onosproject.pce.util.FlowObjServiceAdapter; | 111 | import org.onosproject.pce.util.FlowObjServiceAdapter; |
| 99 | import org.onosproject.store.service.TestStorageService; | 112 | import org.onosproject.store.service.TestStorageService; |
| 113 | + | ||
| 100 | import com.google.common.collect.ImmutableSet; | 114 | import com.google.common.collect.ImmutableSet; |
| 115 | +import static org.onosproject.pce.pceservice.PceManager.PCEP_PORT; | ||
| 101 | 116 | ||
| 102 | /** | 117 | /** |
| 103 | * Tests the functions of PceManager. | 118 | * Tests the functions of PceManager. |
| ... | @@ -107,6 +122,7 @@ public class PceManagerTest { | ... | @@ -107,6 +122,7 @@ public class PceManagerTest { |
| 107 | private PathComputationTest pathCompTest = new PathComputationTest(); | 122 | private PathComputationTest pathCompTest = new PathComputationTest(); |
| 108 | private MockPathResourceService resourceService = pathCompTest.new MockPathResourceService(); | 123 | private MockPathResourceService resourceService = pathCompTest.new MockPathResourceService(); |
| 109 | private MockTopologyService topologyService = new MockTopologyService(); | 124 | private MockTopologyService topologyService = new MockTopologyService(); |
| 125 | + private MockMastershipService mastershipService = new MockMastershipService(); | ||
| 110 | private MockPathService pathService = new MockPathService(); | 126 | private MockPathService pathService = new MockPathService(); |
| 111 | private PceManager pceManager = new PceManager(); | 127 | private PceManager pceManager = new PceManager(); |
| 112 | private MockCoreService coreService = new MockCoreService(); | 128 | private MockCoreService coreService = new MockCoreService(); |
| ... | @@ -129,13 +145,19 @@ public class PceManagerTest { | ... | @@ -129,13 +145,19 @@ public class PceManagerTest { |
| 129 | private Device deviceD1, deviceD2, deviceD3, deviceD4; | 145 | private Device deviceD1, deviceD2, deviceD3, deviceD4; |
| 130 | private Device pcepDeviceD1, pcepDeviceD2, pcepDeviceD3, pcepDeviceD4; | 146 | private Device pcepDeviceD1, pcepDeviceD2, pcepDeviceD3, pcepDeviceD4; |
| 131 | private Link link1, link2, link3, link4; | 147 | private Link link1, link2, link3, link4; |
| 132 | - private static int flowsDownloaded; | 148 | + protected static int flowsDownloaded; |
| 133 | private TunnelListener tunnelListener; | 149 | private TunnelListener tunnelListener; |
| 150 | + private TopologyListener listener; | ||
| 151 | + private Topology topology; | ||
| 152 | + private Set<TopologyEdge> edges; | ||
| 153 | + private Set<TopologyVertex> vertexes; | ||
| 134 | 154 | ||
| 135 | @Before | 155 | @Before |
| 136 | - public void startUp() { | 156 | + public void startUp() throws TestUtilsException { |
| 157 | + listener = TestUtils.getField(pceManager, "topologyListener"); | ||
| 137 | pceManager.pathService = pathService; | 158 | pceManager.pathService = pathService; |
| 138 | pceManager.resourceService = resourceService; | 159 | pceManager.resourceService = resourceService; |
| 160 | + pceManager.topologyService = topologyService; | ||
| 139 | pceManager.tunnelService = tunnelService; | 161 | pceManager.tunnelService = tunnelService; |
| 140 | pceManager.coreService = coreService; | 162 | pceManager.coreService = coreService; |
| 141 | pceManager.storageService = storageService; | 163 | pceManager.storageService = storageService; |
| ... | @@ -144,34 +166,52 @@ public class PceManagerTest { | ... | @@ -144,34 +166,52 @@ public class PceManagerTest { |
| 144 | pceManager.labelRsrcService = labelResourceService; | 166 | pceManager.labelRsrcService = labelResourceService; |
| 145 | pceManager.flowObjectiveService = flowObjectiveService; | 167 | pceManager.flowObjectiveService = flowObjectiveService; |
| 146 | pceManager.pceStore = pceStore; | 168 | pceManager.pceStore = pceStore; |
| 169 | + pceManager.mastershipService = mastershipService; | ||
| 147 | pceManager.activate(); | 170 | pceManager.activate(); |
| 148 | } | 171 | } |
| 149 | 172 | ||
| 173 | + private class MockMastershipService extends MastershipServiceAdapter { | ||
| 174 | + @Override | ||
| 175 | + public MastershipRole getLocalRole(DeviceId deviceId) { | ||
| 176 | + return MASTER; | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + @Override | ||
| 180 | + public boolean isLocalMaster(DeviceId deviceId) { | ||
| 181 | + return getLocalRole(deviceId) == MASTER; | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + | ||
| 150 | private void build4RouterTopo(boolean setCost, boolean setPceccCap, boolean setSrCap, | 185 | private void build4RouterTopo(boolean setCost, boolean setPceccCap, boolean setSrCap, |
| 151 | boolean setLabelStackCap, int bandwidth) { | 186 | boolean setLabelStackCap, int bandwidth) { |
| 187 | + link1 = PathComputationTest.addLink(DEVICE1, 10, DEVICE2, 20, setCost, 50); | ||
| 188 | + link2 = PathComputationTest.addLink(DEVICE2, 30, DEVICE4, 40, setCost, 20); | ||
| 189 | + link3 = PathComputationTest.addLink(DEVICE1, 80, DEVICE3, 70, setCost, 100); | ||
| 190 | + link4 = PathComputationTest.addLink(DEVICE3, 60, DEVICE4, 50, setCost, 80); | ||
| 191 | + | ||
| 152 | Set<TopologyVertex> vertexes = new HashSet<TopologyVertex>(); | 192 | Set<TopologyVertex> vertexes = new HashSet<TopologyVertex>(); |
| 153 | vertexes.add(D1); | 193 | vertexes.add(D1); |
| 154 | vertexes.add(D2); | 194 | vertexes.add(D2); |
| 155 | vertexes.add(D3); | 195 | vertexes.add(D3); |
| 156 | vertexes.add(D4); | 196 | vertexes.add(D4); |
| 157 | 197 | ||
| 198 | + this.vertexes = vertexes; | ||
| 199 | + | ||
| 158 | Set<TopologyEdge> edges = new HashSet<TopologyEdge>(); | 200 | Set<TopologyEdge> edges = new HashSet<TopologyEdge>(); |
| 159 | - link1 = PathComputationTest.addLink(D1.deviceId().toString(), 10, D2.deviceId().toString(), 20, setCost, 50); | ||
| 160 | TopologyEdge edge1 = new DefaultTopologyEdge(D1, D2, link1); | 201 | TopologyEdge edge1 = new DefaultTopologyEdge(D1, D2, link1); |
| 161 | edges.add(edge1); | 202 | edges.add(edge1); |
| 162 | 203 | ||
| 163 | - link2 = PathComputationTest.addLink(D2.deviceId().toString(), 30, D4.deviceId().toString(), 40, setCost, 20); | ||
| 164 | TopologyEdge edge2 = new DefaultTopologyEdge(D2, D4, link2); | 204 | TopologyEdge edge2 = new DefaultTopologyEdge(D2, D4, link2); |
| 165 | edges.add(edge2); | 205 | edges.add(edge2); |
| 166 | 206 | ||
| 167 | - link3 = PathComputationTest.addLink(D1.deviceId().toString(), 80, D3.deviceId().toString(), 70, setCost, 100); | ||
| 168 | TopologyEdge edge3 = new DefaultTopologyEdge(D1, D3, link3); | 207 | TopologyEdge edge3 = new DefaultTopologyEdge(D1, D3, link3); |
| 169 | edges.add(edge3); | 208 | edges.add(edge3); |
| 170 | 209 | ||
| 171 | - link4 = PathComputationTest.addLink(D3.deviceId().toString(), 60, D4.deviceId().toString(), 50, setCost, 80); | ||
| 172 | TopologyEdge edge4 = new DefaultTopologyEdge(D3, D4, link4); | 210 | TopologyEdge edge4 = new DefaultTopologyEdge(D3, D4, link4); |
| 173 | edges.add(edge4); | 211 | edges.add(edge4); |
| 174 | 212 | ||
| 213 | + this.edges = edges; | ||
| 214 | + | ||
| 175 | graph = new DefaultTopologyGraph(vertexes, edges); | 215 | graph = new DefaultTopologyGraph(vertexes, edges); |
| 176 | 216 | ||
| 177 | DefaultAnnotations.Builder builderDev1 = DefaultAnnotations.builder(); | 217 | DefaultAnnotations.Builder builderDev1 = DefaultAnnotations.builder(); |
| ... | @@ -636,21 +676,18 @@ public class PceManagerTest { | ... | @@ -636,21 +676,18 @@ public class PceManagerTest { |
| 636 | * Tests packet in to trigger label DB sync. | 676 | * Tests packet in to trigger label DB sync. |
| 637 | */ | 677 | */ |
| 638 | @Test | 678 | @Test |
| 639 | - public void packetProcessingTest() throws URISyntaxException { | 679 | + public void packetProcessingTest1() throws URISyntaxException { |
| 640 | 680 | ||
| 641 | build4RouterTopo(false, true, true, true, 0); // This also initializes devices etc. | 681 | build4RouterTopo(false, true, true, true, 0); // This also initializes devices etc. |
| 642 | 682 | ||
| 643 | - final int srcHost = 2; | ||
| 644 | - final int dstHost = 5; | ||
| 645 | - | ||
| 646 | LabelResourceId node1Label = LabelResourceId.labelResourceId(5200); | 683 | LabelResourceId node1Label = LabelResourceId.labelResourceId(5200); |
| 647 | LabelResourceId node2Label = LabelResourceId.labelResourceId(5201); | 684 | LabelResourceId node2Label = LabelResourceId.labelResourceId(5201); |
| 648 | 685 | ||
| 649 | pceManager.pceStore.addGlobalNodeLabel(D1.deviceId(), node1Label); | 686 | pceManager.pceStore.addGlobalNodeLabel(D1.deviceId(), node1Label); |
| 650 | pceManager.pceStore.addGlobalNodeLabel(D2.deviceId(), node2Label); | 687 | pceManager.pceStore.addGlobalNodeLabel(D2.deviceId(), node2Label); |
| 651 | 688 | ||
| 652 | - ConnectPoint src = new ConnectPoint(D1.deviceId(), PortNumber.portNumber(srcHost)); | 689 | + ConnectPoint src = new ConnectPoint(D1.deviceId(), PortNumber.portNumber(1)); |
| 653 | - ConnectPoint dst = new ConnectPoint(D2.deviceId(), PortNumber.portNumber(dstHost)); | 690 | + ConnectPoint dst = new ConnectPoint(D2.deviceId(), PortNumber.portNumber(2)); |
| 654 | 691 | ||
| 655 | Link link1 = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).type(DIRECT) | 692 | Link link1 = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).type(DIRECT) |
| 656 | .providerId(new ProviderId("eth", "1")).build(); | 693 | .providerId(new ProviderId("eth", "1")).build(); |
| ... | @@ -658,24 +695,66 @@ public class PceManagerTest { | ... | @@ -658,24 +695,66 @@ public class PceManagerTest { |
| 658 | LabelResourceId link1Label = LabelResourceId.labelResourceId(5204); | 695 | LabelResourceId link1Label = LabelResourceId.labelResourceId(5204); |
| 659 | pceManager.pceStore.addAdjLabel(link1, link1Label); | 696 | pceManager.pceStore.addAdjLabel(link1, link1Label); |
| 660 | 697 | ||
| 661 | - Ethernet eth; | 698 | + TCP tcp = new TCP(); |
| 662 | - IPv4 ipv4; | 699 | + tcp.setDestinationPort(PCEP_PORT); |
| 663 | 700 | ||
| 664 | - ipv4 = new IPv4(); | 701 | + IPv4 ipv4 = new IPv4(); |
| 665 | - eth = new Ethernet(); | 702 | + ipv4.setProtocol(IPv4.PROTOCOL_TCP); |
| 703 | + ipv4.setPayload(tcp); | ||
| 704 | + | ||
| 705 | + Ethernet eth = new Ethernet(); | ||
| 666 | eth.setEtherType(Ethernet.TYPE_IPV4); | 706 | eth.setEtherType(Ethernet.TYPE_IPV4); |
| 667 | eth.setPayload(ipv4); | 707 | eth.setPayload(ipv4); |
| 668 | 708 | ||
| 669 | - eth.setSourceMACAddress("00:00:00:10:00:0" + srcHost).setDestinationMACAddress("00:00:00:10:00:0" + dstHost); | 709 | + InboundPacket inPkt = new DefaultInboundPacket(new ConnectPoint(D1.deviceId(), |
| 670 | - | 710 | + PortNumber.portNumber(PCEP_PORT)), |
| 671 | - InboundPacket inPkt = new DefaultInboundPacket(new ConnectPoint(D1.deviceId(), PortNumber.portNumber(srcHost)), | 711 | + eth, null); |
| 672 | - eth, ByteBuffer.wrap(eth.serialize())); | ||
| 673 | 712 | ||
| 674 | pktProcessor.process(new MockPcepPacketContext(inPkt, null)); | 713 | pktProcessor.process(new MockPcepPacketContext(inPkt, null)); |
| 675 | assertThat(flowsDownloaded, is(4)); | 714 | assertThat(flowsDownloaded, is(4)); |
| 676 | } | 715 | } |
| 677 | 716 | ||
| 678 | /** | 717 | /** |
| 718 | + * Tests faulty packet in to trigger label DB sync. | ||
| 719 | + */ | ||
| 720 | + @Test | ||
| 721 | + public void packetProcessingTest2() throws URISyntaxException { | ||
| 722 | + | ||
| 723 | + build4RouterTopo(false, true, true, true, 0); // This also initializes devices etc. | ||
| 724 | + | ||
| 725 | + LabelResourceId node1Label = LabelResourceId.labelResourceId(5200); | ||
| 726 | + LabelResourceId node2Label = LabelResourceId.labelResourceId(5201); | ||
| 727 | + | ||
| 728 | + pceManager.pceStore.addGlobalNodeLabel(D1.deviceId(), node1Label); | ||
| 729 | + pceManager.pceStore.addGlobalNodeLabel(D2.deviceId(), node2Label); | ||
| 730 | + | ||
| 731 | + ConnectPoint src = new ConnectPoint(D1.deviceId(), PortNumber.portNumber(1)); | ||
| 732 | + ConnectPoint dst = new ConnectPoint(D2.deviceId(), PortNumber.portNumber(2)); | ||
| 733 | + | ||
| 734 | + Link link1 = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).type(DIRECT) | ||
| 735 | + .providerId(new ProviderId("eth", "1")).build(); | ||
| 736 | + | ||
| 737 | + LabelResourceId link1Label = LabelResourceId.labelResourceId(5204); | ||
| 738 | + pceManager.pceStore.addAdjLabel(link1, link1Label); | ||
| 739 | + | ||
| 740 | + TCP tcp = new TCP(); // Not set the pcep port. | ||
| 741 | + IPv4 ipv4 = new IPv4(); | ||
| 742 | + ipv4.setProtocol(IPv4.PROTOCOL_TCP); | ||
| 743 | + ipv4.setPayload(tcp); | ||
| 744 | + | ||
| 745 | + Ethernet eth = new Ethernet(); | ||
| 746 | + eth.setEtherType(Ethernet.TYPE_IPV4); | ||
| 747 | + eth.setPayload(ipv4); | ||
| 748 | + | ||
| 749 | + InboundPacket inPkt = new DefaultInboundPacket(new ConnectPoint(D1.deviceId(), | ||
| 750 | + PortNumber.portNumber(PCEP_PORT)), | ||
| 751 | + eth, null); | ||
| 752 | + | ||
| 753 | + pktProcessor.process(new MockPcepPacketContext(inPkt, null)); | ||
| 754 | + assertThat(flowsDownloaded, is(0)); | ||
| 755 | + } | ||
| 756 | + | ||
| 757 | + /** | ||
| 679 | * Tests tunnel events added and removed. | 758 | * Tests tunnel events added and removed. |
| 680 | */ | 759 | */ |
| 681 | @Test | 760 | @Test |
| ... | @@ -800,6 +879,390 @@ public class PceManagerTest { | ... | @@ -800,6 +879,390 @@ public class PceManagerTest { |
| 800 | assertThat(pceStore.getFailedPathInfoCount(), is(1)); | 879 | assertThat(pceStore.getFailedPathInfoCount(), is(1)); |
| 801 | } | 880 | } |
| 802 | 881 | ||
| 882 | + /** | ||
| 883 | + * Tests resilency when L2 link is down. | ||
| 884 | + */ | ||
| 885 | + @Test | ||
| 886 | + public void resilencyTest1() { | ||
| 887 | + build4RouterTopo(true, false, false, false, 10); | ||
| 888 | + | ||
| 889 | + | ||
| 890 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 891 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 892 | + constraints.add(costConstraint); | ||
| 893 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 894 | + constraints.add(localBwConst); | ||
| 895 | + | ||
| 896 | + //Setup the path , tunnel created | ||
| 897 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 898 | + assertThat(result, is(true)); | ||
| 899 | + assertThat(pceStore.getTunnelInfoCount(), is(1)); | ||
| 900 | + assertThat(pceStore.getFailedPathInfoCount(), is(0)); | ||
| 901 | + | ||
| 902 | + List<Event> reasons = new LinkedList<>(); | ||
| 903 | + final LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 904 | + reasons.add(linkEvent); | ||
| 905 | + final TopologyEvent event = new TopologyEvent( | ||
| 906 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 907 | + topology, | ||
| 908 | + reasons); | ||
| 909 | + | ||
| 910 | + //Change Topology : remove link2 | ||
| 911 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 912 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 913 | + topologyService.changeInTopology(getGraph(null, tempEdges)); | ||
| 914 | + listener.event(event); | ||
| 915 | + | ||
| 916 | + List<Link> links = new LinkedList<>(); | ||
| 917 | + links.add(link3); | ||
| 918 | + links.add(link4); | ||
| 919 | + | ||
| 920 | + //Path is D1-D3-D4 | ||
| 921 | + assertThat(pathService.paths().iterator().next().links(), is(links)); | ||
| 922 | + assertThat(pathService.paths().iterator().next().cost(), is((double) 180)); | ||
| 923 | + } | ||
| 924 | + | ||
| 925 | + /** | ||
| 926 | + * Tests resilency when L2 and L4 link is down. | ||
| 927 | + */ | ||
| 928 | + @Test | ||
| 929 | + public void resilencyTest2() { | ||
| 930 | + build4RouterTopo(true, false, false, false, 10); | ||
| 931 | + | ||
| 932 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 933 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 934 | + constraints.add(costConstraint); | ||
| 935 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 936 | + constraints.add(localBwConst); | ||
| 937 | + | ||
| 938 | + //Setup the path , tunnel created | ||
| 939 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 940 | + assertThat(result, is(true)); | ||
| 941 | + | ||
| 942 | + List<Event> reasons = new LinkedList<>(); | ||
| 943 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 944 | + reasons.add(linkEvent); | ||
| 945 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link4); | ||
| 946 | + reasons.add(linkEvent); | ||
| 947 | + final TopologyEvent event = new TopologyEvent( | ||
| 948 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 949 | + topology, | ||
| 950 | + reasons); | ||
| 951 | + | ||
| 952 | + //Change Topology : remove link2 and link4 | ||
| 953 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 954 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 955 | + tempEdges.add(new DefaultTopologyEdge(D3, D4, link4)); | ||
| 956 | + topologyService.changeInTopology(getGraph(null, tempEdges)); | ||
| 957 | + listener.event(event); | ||
| 958 | + | ||
| 959 | + //No Path | ||
| 960 | + assertThat(pathService.paths().size(), is(0)); | ||
| 961 | + } | ||
| 962 | + | ||
| 963 | + /** | ||
| 964 | + * Tests resilency when D2 device is down. | ||
| 965 | + */ | ||
| 966 | + @Test | ||
| 967 | + public void resilencyTest3() { | ||
| 968 | + build4RouterTopo(true, false, false, false, 10); | ||
| 969 | + | ||
| 970 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 971 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 972 | + constraints.add(costConstraint); | ||
| 973 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 974 | + constraints.add(localBwConst); | ||
| 975 | + | ||
| 976 | + //Setup the path , tunnel created | ||
| 977 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 978 | + assertThat(result, is(true)); | ||
| 979 | + | ||
| 980 | + List<Event> reasons = new LinkedList<>(); | ||
| 981 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 982 | + reasons.add(linkEvent); | ||
| 983 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link1); | ||
| 984 | + reasons.add(linkEvent); | ||
| 985 | + final TopologyEvent event = new TopologyEvent( | ||
| 986 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 987 | + topology, | ||
| 988 | + reasons); | ||
| 989 | + | ||
| 990 | + //Change Topology : remove link2 and link1 | ||
| 991 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 992 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 993 | + tempEdges.add(new DefaultTopologyEdge(D1, D2, link1)); | ||
| 994 | + topologyService.changeInTopology(getGraph(null, tempEdges)); | ||
| 995 | + listener.event(event); | ||
| 996 | + | ||
| 997 | + List<Link> links = new LinkedList<>(); | ||
| 998 | + links.add(link3); | ||
| 999 | + links.add(link4); | ||
| 1000 | + | ||
| 1001 | + //Path is D1-D3-D4 | ||
| 1002 | + assertThat(pathService.paths().iterator().next().links(), is(links)); | ||
| 1003 | + assertThat(pathService.paths().iterator().next().cost(), is((double) 180)); | ||
| 1004 | + } | ||
| 1005 | + | ||
| 1006 | + /** | ||
| 1007 | + * Tests resilency when ingress device is down. | ||
| 1008 | + */ | ||
| 1009 | + @Test | ||
| 1010 | + public void resilencyTest4() { | ||
| 1011 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1012 | + | ||
| 1013 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1014 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1015 | + constraints.add(costConstraint); | ||
| 1016 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1017 | + constraints.add(localBwConst); | ||
| 1018 | + | ||
| 1019 | + //Setup the path , tunnel created | ||
| 1020 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1021 | + assertThat(result, is(true)); | ||
| 1022 | + | ||
| 1023 | + List<Event> reasons = new LinkedList<>(); | ||
| 1024 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link3); | ||
| 1025 | + reasons.add(linkEvent); | ||
| 1026 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link1); | ||
| 1027 | + reasons.add(linkEvent); | ||
| 1028 | + final TopologyEvent event = new TopologyEvent( | ||
| 1029 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1030 | + topology, | ||
| 1031 | + reasons); | ||
| 1032 | + | ||
| 1033 | + //Change Topology : remove link2 and link1 | ||
| 1034 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1035 | + tempEdges.add(new DefaultTopologyEdge(D1, D3, link3)); | ||
| 1036 | + tempEdges.add(new DefaultTopologyEdge(D1, D2, link1)); | ||
| 1037 | + topologyService.changeInTopology(getGraph(null, tempEdges)); | ||
| 1038 | + listener.event(event); | ||
| 1039 | + | ||
| 1040 | + //No path | ||
| 1041 | + assertThat(pathService.paths().size(), is(0)); | ||
| 1042 | + } | ||
| 1043 | + | ||
| 1044 | + /** | ||
| 1045 | + * Tests resilency when D2 and D3 devices are down. | ||
| 1046 | + */ | ||
| 1047 | + @Test | ||
| 1048 | + public void resilencyTest5() { | ||
| 1049 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1050 | + | ||
| 1051 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1052 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1053 | + constraints.add(costConstraint); | ||
| 1054 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1055 | + constraints.add(localBwConst); | ||
| 1056 | + | ||
| 1057 | + //Setup the path , tunnel created | ||
| 1058 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1059 | + assertThat(result, is(true)); | ||
| 1060 | + | ||
| 1061 | + List<Event> reasons = new LinkedList<>(); | ||
| 1062 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 1063 | + reasons.add(linkEvent); | ||
| 1064 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link1); | ||
| 1065 | + reasons.add(linkEvent); | ||
| 1066 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link3); | ||
| 1067 | + reasons.add(linkEvent); | ||
| 1068 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link4); | ||
| 1069 | + reasons.add(linkEvent); | ||
| 1070 | + | ||
| 1071 | + final TopologyEvent event = new TopologyEvent( | ||
| 1072 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1073 | + topology, | ||
| 1074 | + reasons); | ||
| 1075 | + | ||
| 1076 | + //Change Topology : remove device2, device3 and all links | ||
| 1077 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1078 | + tempEdges.add(new DefaultTopologyEdge(D1, D2, link1)); | ||
| 1079 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 1080 | + tempEdges.add(new DefaultTopologyEdge(D1, D3, link3)); | ||
| 1081 | + tempEdges.add(new DefaultTopologyEdge(D3, D4, link4)); | ||
| 1082 | + Set<TopologyVertex> tempVertexes = new HashSet<>(); | ||
| 1083 | + tempVertexes.add(D2); | ||
| 1084 | + tempVertexes.add(D3); | ||
| 1085 | + topologyService.changeInTopology(getGraph(tempVertexes, tempEdges)); | ||
| 1086 | + listener.event(event); | ||
| 1087 | + | ||
| 1088 | + //No path | ||
| 1089 | + assertThat(pathService.paths().size(), is(0)); | ||
| 1090 | + } | ||
| 1091 | + | ||
| 1092 | + /** | ||
| 1093 | + * Tests resilency when egress device is down. | ||
| 1094 | + */ | ||
| 1095 | + @Test | ||
| 1096 | + public void resilencyTest6() { | ||
| 1097 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1098 | + | ||
| 1099 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1100 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1101 | + constraints.add(costConstraint); | ||
| 1102 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1103 | + constraints.add(localBwConst); | ||
| 1104 | + | ||
| 1105 | + //Setup the path , tunnel created | ||
| 1106 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1107 | + assertThat(result, is(true)); | ||
| 1108 | + | ||
| 1109 | + List<Event> reasons = new LinkedList<>(); | ||
| 1110 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 1111 | + reasons.add(linkEvent); | ||
| 1112 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link4); | ||
| 1113 | + reasons.add(linkEvent); | ||
| 1114 | + | ||
| 1115 | + final TopologyEvent event = new TopologyEvent( | ||
| 1116 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1117 | + topology, | ||
| 1118 | + reasons); | ||
| 1119 | + | ||
| 1120 | + //Change Topology : remove device4 , link2 and link4 | ||
| 1121 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1122 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 1123 | + tempEdges.add(new DefaultTopologyEdge(D3, D4, link4)); | ||
| 1124 | + Set<TopologyVertex> tempVertexes = new HashSet<>(); | ||
| 1125 | + tempVertexes.add(D4); | ||
| 1126 | + topologyService.changeInTopology(getGraph(tempVertexes, tempEdges)); | ||
| 1127 | + listener.event(event); | ||
| 1128 | + | ||
| 1129 | + //No path | ||
| 1130 | + assertThat(pathService.paths().size(), is(0)); | ||
| 1131 | + } | ||
| 1132 | + | ||
| 1133 | + /** | ||
| 1134 | + * Tests resilency when egress device is down. | ||
| 1135 | + */ | ||
| 1136 | + @Test | ||
| 1137 | + public void resilencyTest7() { | ||
| 1138 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1139 | + | ||
| 1140 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1141 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1142 | + constraints.add(costConstraint); | ||
| 1143 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1144 | + constraints.add(localBwConst); | ||
| 1145 | + | ||
| 1146 | + //Setup the path , tunnel created | ||
| 1147 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1148 | + assertThat(result, is(true)); | ||
| 1149 | + | ||
| 1150 | + List<Event> reasons = new LinkedList<>(); | ||
| 1151 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 1152 | + reasons.add(linkEvent); | ||
| 1153 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link4); | ||
| 1154 | + reasons.add(linkEvent); | ||
| 1155 | + | ||
| 1156 | + final TopologyEvent event = new TopologyEvent( | ||
| 1157 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1158 | + topology, | ||
| 1159 | + reasons); | ||
| 1160 | + | ||
| 1161 | + //Change Topology : remove device4 , link2 and link4 | ||
| 1162 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1163 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 1164 | + tempEdges.add(new DefaultTopologyEdge(D3, D4, link4)); | ||
| 1165 | + Set<TopologyVertex> tempVertexes = new HashSet<>(); | ||
| 1166 | + tempVertexes.add(D4); | ||
| 1167 | + topologyService.changeInTopology(getGraph(tempVertexes, tempEdges)); | ||
| 1168 | + listener.event(event); | ||
| 1169 | + | ||
| 1170 | + //No path | ||
| 1171 | + assertThat(pathService.paths().size(), is(0)); | ||
| 1172 | + } | ||
| 1173 | + | ||
| 1174 | + /** | ||
| 1175 | + * Tests resilency when D2 device is suspended. | ||
| 1176 | + */ | ||
| 1177 | + @Test | ||
| 1178 | + public void resilencyTest8() { | ||
| 1179 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1180 | + | ||
| 1181 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1182 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1183 | + constraints.add(costConstraint); | ||
| 1184 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1185 | + constraints.add(localBwConst); | ||
| 1186 | + | ||
| 1187 | + //Setup the path , tunnel created | ||
| 1188 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1189 | + assertThat(result, is(true)); | ||
| 1190 | + | ||
| 1191 | + List<Event> reasons = new LinkedList<>(); | ||
| 1192 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link1); | ||
| 1193 | + reasons.add(linkEvent); | ||
| 1194 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 1195 | + reasons.add(linkEvent); | ||
| 1196 | + | ||
| 1197 | + final TopologyEvent event = new TopologyEvent( | ||
| 1198 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1199 | + topology, | ||
| 1200 | + reasons); | ||
| 1201 | + | ||
| 1202 | + //Change Topology : remove device2 , link1 and link2 | ||
| 1203 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1204 | + tempEdges.add(new DefaultTopologyEdge(D1, D2, link1)); | ||
| 1205 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 1206 | + Set<TopologyVertex> tempVertexes = new HashSet<>(); | ||
| 1207 | + tempVertexes.add(D2); | ||
| 1208 | + topologyService.changeInTopology(getGraph(tempVertexes, tempEdges)); | ||
| 1209 | + listener.event(event); | ||
| 1210 | + | ||
| 1211 | + List<Link> links = new LinkedList<>(); | ||
| 1212 | + links.add(link3); | ||
| 1213 | + links.add(link4); | ||
| 1214 | + | ||
| 1215 | + //Path is D1-D3-D4 | ||
| 1216 | + assertThat(pathService.paths().iterator().next().links(), is(links)); | ||
| 1217 | + assertThat(pathService.paths().iterator().next().cost(), is((double) 180)); | ||
| 1218 | + } | ||
| 1219 | + | ||
| 1220 | + /** | ||
| 1221 | + * Tests resilency when D2 device availability is changed. | ||
| 1222 | + */ | ||
| 1223 | + @Test | ||
| 1224 | + public void resilencyTest11() { | ||
| 1225 | + build4RouterTopo(true, false, false, false, 10); | ||
| 1226 | + | ||
| 1227 | + List<Constraint> constraints = new LinkedList<Constraint>(); | ||
| 1228 | + CostConstraint costConstraint = new CostConstraint(COST); | ||
| 1229 | + constraints.add(costConstraint); | ||
| 1230 | + BandwidthConstraint localBwConst = new BandwidthConstraint(Bandwidth.bps(10)); | ||
| 1231 | + constraints.add(localBwConst); | ||
| 1232 | + | ||
| 1233 | + //Setup the path , tunnel created | ||
| 1234 | + boolean result = pceManager.setupPath(D1.deviceId(), D4.deviceId(), "T123", constraints, WITH_SIGNALLING); | ||
| 1235 | + assertThat(result, is(true)); | ||
| 1236 | + | ||
| 1237 | + List<Event> reasons = new LinkedList<>(); | ||
| 1238 | + LinkEvent linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link1); | ||
| 1239 | + reasons.add(linkEvent); | ||
| 1240 | + linkEvent = new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2); | ||
| 1241 | + reasons.add(linkEvent); | ||
| 1242 | + | ||
| 1243 | + final TopologyEvent event = new TopologyEvent( | ||
| 1244 | + TopologyEvent.Type.TOPOLOGY_CHANGED, | ||
| 1245 | + topology, | ||
| 1246 | + reasons); | ||
| 1247 | + | ||
| 1248 | + //Change Topology : remove device2 , link1 and link2 | ||
| 1249 | + Set<TopologyEdge> tempEdges = new HashSet<>(); | ||
| 1250 | + tempEdges.add(new DefaultTopologyEdge(D1, D2, link1)); | ||
| 1251 | + tempEdges.add(new DefaultTopologyEdge(D2, D4, link2)); | ||
| 1252 | + Set<TopologyVertex> tempVertexes = new HashSet<>(); | ||
| 1253 | + tempVertexes.add(D2); | ||
| 1254 | + topologyService.changeInTopology(getGraph(tempVertexes, tempEdges)); | ||
| 1255 | + listener.event(event); | ||
| 1256 | + | ||
| 1257 | + List<Link> links = new LinkedList<>(); | ||
| 1258 | + links.add(link3); | ||
| 1259 | + links.add(link4); | ||
| 1260 | + | ||
| 1261 | + //Path is D1-D3-D4 | ||
| 1262 | + assertThat(pathService.paths().iterator().next().links(), is(links)); | ||
| 1263 | + assertThat(pathService.paths().iterator().next().cost(), is((double) 180)); | ||
| 1264 | + } | ||
| 1265 | + | ||
| 803 | @After | 1266 | @After |
| 804 | public void tearDown() { | 1267 | public void tearDown() { |
| 805 | pceManager.deactivate(); | 1268 | pceManager.deactivate(); |
| ... | @@ -813,10 +1276,16 @@ public class PceManagerTest { | ... | @@ -813,10 +1276,16 @@ public class PceManagerTest { |
| 813 | pceManager.labelRsrcService = null; | 1276 | pceManager.labelRsrcService = null; |
| 814 | pceManager.flowObjectiveService = null; | 1277 | pceManager.flowObjectiveService = null; |
| 815 | pceManager.pceStore = null; | 1278 | pceManager.pceStore = null; |
| 1279 | + pceManager.topologyService = null; | ||
| 1280 | + pceManager.mastershipService = null; | ||
| 816 | flowsDownloaded = 0; | 1281 | flowsDownloaded = 0; |
| 817 | } | 1282 | } |
| 818 | 1283 | ||
| 819 | private class MockTopologyService extends TopologyServiceAdapter { | 1284 | private class MockTopologyService extends TopologyServiceAdapter { |
| 1285 | + private void changeInTopology(TopologyGraph graphModified) { | ||
| 1286 | + graph = graphModified; | ||
| 1287 | + } | ||
| 1288 | + | ||
| 820 | @Override | 1289 | @Override |
| 821 | public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { | 1290 | public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { |
| 822 | DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); | 1291 | DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); |
| ... | @@ -837,8 +1306,27 @@ public class PceManagerTest { | ... | @@ -837,8 +1306,27 @@ public class PceManagerTest { |
| 837 | } | 1306 | } |
| 838 | } | 1307 | } |
| 839 | 1308 | ||
| 840 | - private class MockPathService extends PathServiceAdapter { | 1309 | + private TopologyGraph getGraph(Set<TopologyVertex> removedVertex, Set<TopologyEdge> removedEdges) { |
| 1310 | + if (removedVertex != null) { | ||
| 1311 | + vertexes.remove(removedVertex); | ||
| 1312 | + removedVertex.forEach(v -> | ||
| 1313 | + { | ||
| 1314 | + vertexes.remove(v); | ||
| 1315 | + }); | ||
| 1316 | + } | ||
| 1317 | + | ||
| 1318 | + if (removedEdges != null) { | ||
| 1319 | + removedEdges.forEach(e -> | ||
| 1320 | + { | ||
| 1321 | + edges.remove(e); | ||
| 1322 | + }); | ||
| 1323 | + } | ||
| 1324 | + | ||
| 1325 | + return new DefaultTopologyGraph(vertexes, edges); | ||
| 1326 | + } | ||
| 841 | 1327 | ||
| 1328 | + private class MockPathService extends PathServiceAdapter { | ||
| 1329 | + Set<Path> computedPaths; | ||
| 842 | @Override | 1330 | @Override |
| 843 | public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { | 1331 | public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { |
| 844 | // If either edge is null, bail with no paths. | 1332 | // If either edge is null, bail with no paths. |
| ... | @@ -848,7 +1336,12 @@ public class PceManagerTest { | ... | @@ -848,7 +1336,12 @@ public class PceManagerTest { |
| 848 | 1336 | ||
| 849 | // Otherwise get all paths between the source and destination edge | 1337 | // Otherwise get all paths between the source and destination edge |
| 850 | // devices. | 1338 | // devices. |
| 851 | - return topologyService.getPaths(null, (DeviceId) src, (DeviceId) dst, weight); | 1339 | + computedPaths = topologyService.getPaths(null, (DeviceId) src, (DeviceId) dst, weight); |
| 1340 | + return computedPaths; | ||
| 1341 | + } | ||
| 1342 | + | ||
| 1343 | + private Set<Path> paths() { | ||
| 1344 | + return computedPaths; | ||
| 852 | } | 1345 | } |
| 853 | } | 1346 | } |
| 854 | 1347 | ||
| ... | @@ -946,6 +1439,31 @@ public class PceManagerTest { | ... | @@ -946,6 +1439,31 @@ public class PceManagerTest { |
| 946 | 1439 | ||
| 947 | return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result); | 1440 | return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result); |
| 948 | } | 1441 | } |
| 1442 | + | ||
| 1443 | + @Override | ||
| 1444 | + public Collection<Tunnel> queryAllTunnels() { | ||
| 1445 | + Collection<Tunnel> result = new HashSet<Tunnel>(); | ||
| 1446 | + | ||
| 1447 | + for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) { | ||
| 1448 | + result.add(tunnelIdAsKeyStore.get(tunnelId)); | ||
| 1449 | + } | ||
| 1450 | + | ||
| 1451 | + return result.size() == 0 ? Collections.emptySet() : ImmutableSet.copyOf(result); | ||
| 1452 | + } | ||
| 1453 | + @Override | ||
| 1454 | + public Iterable<Tunnel> getTunnels(DeviceId deviceId) { | ||
| 1455 | + List<Tunnel> tunnelList = new LinkedList<>(); | ||
| 1456 | + | ||
| 1457 | + for (Tunnel t : tunnelIdAsKeyStore.values()) { | ||
| 1458 | + for (Link l : t.path().links()) { | ||
| 1459 | + if (l.src().deviceId().equals(deviceId) || l.dst().deviceId().equals(deviceId)) { | ||
| 1460 | + tunnelList.add(t); | ||
| 1461 | + break; | ||
| 1462 | + } | ||
| 1463 | + } | ||
| 1464 | + } | ||
| 1465 | + return tunnelList; | ||
| 1466 | + } | ||
| 949 | } | 1467 | } |
| 950 | 1468 | ||
| 951 | public static class MockCoreService extends CoreServiceAdapter { | 1469 | public static class MockCoreService extends CoreServiceAdapter { | ... | ... |
| ... | @@ -158,6 +158,7 @@ public class PceccSrTeBeHandlerTest { | ... | @@ -158,6 +158,7 @@ public class PceccSrTeBeHandlerTest { |
| 158 | 158 | ||
| 159 | @After | 159 | @After |
| 160 | public void tearDown() throws Exception { | 160 | public void tearDown() throws Exception { |
| 161 | + PceManagerTest.flowsDownloaded = 0; | ||
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | /** | 164 | /** | ... | ... |
| ... | @@ -23,6 +23,7 @@ | ... | @@ -23,6 +23,7 @@ |
| 23 | <groupId>org.onosproject</groupId> | 23 | <groupId>org.onosproject</groupId> |
| 24 | <artifactId>onos-pce</artifactId> | 24 | <artifactId>onos-pce</artifactId> |
| 25 | <version>1.6.0-SNAPSHOT</version> | 25 | <version>1.6.0-SNAPSHOT</version> |
| 26 | + <relativePath>../pom.xml</relativePath> | ||
| 26 | </parent> | 27 | </parent> |
| 27 | 28 | ||
| 28 | <artifactId>onos-app-pceweb</artifactId> | 29 | <artifactId>onos-app-pceweb</artifactId> |
| ... | @@ -42,6 +43,11 @@ | ... | @@ -42,6 +43,11 @@ |
| 42 | <artifactId>onos-cli</artifactId> | 43 | <artifactId>onos-cli</artifactId> |
| 43 | <version>${project.version}</version> | 44 | <version>${project.version}</version> |
| 44 | </dependency> | 45 | </dependency> |
| 46 | + <dependency> | ||
| 47 | + <groupId>org.onosproject</groupId> | ||
| 48 | + <artifactId>onos-app-pce</artifactId> | ||
| 49 | + <version>${project.version}</version> | ||
| 50 | + </dependency> | ||
| 45 | </dependencies> | 51 | </dependencies> |
| 46 | 52 | ||
| 47 | <properties> | 53 | <properties> | ... | ... |
| ... | @@ -17,33 +17,48 @@ | ... | @@ -17,33 +17,48 @@ |
| 17 | package org.onosproject.pceweb; | 17 | package org.onosproject.pceweb; |
| 18 | 18 | ||
| 19 | import com.fasterxml.jackson.databind.node.ObjectNode; | 19 | import com.fasterxml.jackson.databind.node.ObjectNode; |
| 20 | - | ||
| 21 | - | ||
| 22 | import com.google.common.collect.ImmutableSet; | 20 | import com.google.common.collect.ImmutableSet; |
| 21 | + | ||
| 23 | import org.onlab.osgi.ServiceDirectory; | 22 | import org.onlab.osgi.ServiceDirectory; |
| 23 | +import org.onlab.packet.IpAddress; | ||
| 24 | +import org.onlab.util.DataRateUnit; | ||
| 25 | +import org.onosproject.net.Device; | ||
| 24 | import org.onosproject.net.DeviceId; | 26 | import org.onosproject.net.DeviceId; |
| 25 | -import org.onosproject.net.DisjointPath; | ||
| 26 | import org.onosproject.net.ElementId; | 27 | import org.onosproject.net.ElementId; |
| 27 | import org.onosproject.net.HostId; | 28 | import org.onosproject.net.HostId; |
| 28 | import org.onosproject.net.Link; | 29 | import org.onosproject.net.Link; |
| 29 | import org.onosproject.net.Path; | 30 | import org.onosproject.net.Path; |
| 30 | -import org.onosproject.net.device.DeviceService; | 31 | +import org.onosproject.net.topology.TopologyEvent; |
| 31 | -import org.onosproject.net.topology.LinkWeight; | 32 | +import org.onosproject.net.topology.TopologyListener; |
| 32 | -import org.onosproject.net.topology.PathService; | ||
| 33 | import org.onosproject.net.topology.TopologyService; | 33 | import org.onosproject.net.topology.TopologyService; |
| 34 | import org.onosproject.ui.RequestHandler; | 34 | import org.onosproject.ui.RequestHandler; |
| 35 | import org.onosproject.ui.UiConnection; | 35 | import org.onosproject.ui.UiConnection; |
| 36 | import org.onosproject.ui.UiMessageHandler; | 36 | import org.onosproject.ui.UiMessageHandler; |
| 37 | import org.onosproject.ui.topo.DeviceHighlight; | 37 | import org.onosproject.ui.topo.DeviceHighlight; |
| 38 | import org.onosproject.ui.topo.Highlights; | 38 | import org.onosproject.ui.topo.Highlights; |
| 39 | -import org.onosproject.ui.topo.HostHighlight; | ||
| 40 | import org.onosproject.ui.topo.NodeBadge; | 39 | import org.onosproject.ui.topo.NodeBadge; |
| 41 | import org.onosproject.ui.topo.TopoJson; | 40 | import org.onosproject.ui.topo.TopoJson; |
| 42 | - | 41 | +import org.onosproject.net.device.DeviceService; |
| 42 | +import org.onosproject.net.intent.Constraint; | ||
| 43 | +import org.onosproject.pce.pceservice.LspType; | ||
| 44 | +import org.onosproject.pce.pceservice.api.PceService; | ||
| 45 | +import org.onosproject.pce.pceservice.constraint.CostConstraint; | ||
| 46 | +import org.onosproject.net.intent.constraint.BandwidthConstraint; | ||
| 43 | import org.slf4j.Logger; | 47 | import org.slf4j.Logger; |
| 44 | import org.slf4j.LoggerFactory; | 48 | import org.slf4j.LoggerFactory; |
| 49 | +import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ||
| 50 | +import org.onosproject.incubator.net.tunnel.Tunnel; | ||
| 51 | +import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | ||
| 52 | +import org.onosproject.incubator.net.tunnel.TunnelEvent; | ||
| 53 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
| 54 | +import org.onosproject.incubator.net.tunnel.TunnelListener; | ||
| 55 | +import org.onosproject.incubator.net.tunnel.TunnelService; | ||
| 56 | +import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS; | ||
| 57 | + | ||
| 58 | +import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 45 | 59 | ||
| 46 | import java.util.Collection; | 60 | import java.util.Collection; |
| 61 | +import java.util.LinkedList; | ||
| 47 | import java.util.List; | 62 | import java.util.List; |
| 48 | import java.util.Set; | 63 | import java.util.Set; |
| 49 | 64 | ||
| ... | @@ -56,47 +71,66 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -56,47 +71,66 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 56 | private static final String PCEWEB_SET_SRC = "pceTopovSetSrc"; | 71 | private static final String PCEWEB_SET_SRC = "pceTopovSetSrc"; |
| 57 | private static final String PCEWEB_SET_DST = "pceTopovSetDst"; | 72 | private static final String PCEWEB_SET_DST = "pceTopovSetDst"; |
| 58 | private static final String PCEWEB_SET_PATH = "pceTopovSetMode"; | 73 | private static final String PCEWEB_SET_PATH = "pceTopovSetMode"; |
| 59 | - | 74 | + private static final String PCEWEB_UPDATE_PATH_QUERY = "pceTopovUpdateQuery"; |
| 75 | + private static final String PCEWEB_UPDATE_PATH = "pceTopovUpdate"; | ||
| 76 | + private static final String PCEWEB_REMOVE_PATH_QUERY = "pceTopovRemQuery"; | ||
| 77 | + private static final String PCEWEB_REMOVE_PATH = "pceTopovRem"; | ||
| 78 | + private static final String PCEWEB_QUERY_TUNNELS = "pceTopovTunnelDisplay"; | ||
| 79 | + private static final String PCEWEB_SHOW_TUNNEL = "pceTopovShowTunnels"; | ||
| 80 | + private static final String PCEWEB_SHOW_TUNNEL_REMOVE = "pceTopovShowTunnelsRem"; | ||
| 60 | private static final String ID = "id"; | 81 | private static final String ID = "id"; |
| 61 | - private static final String MODE = "mode"; | ||
| 62 | private static final String TYPE = "type"; | 82 | private static final String TYPE = "type"; |
| 63 | - private static final String SWITCH = "switch"; | 83 | + private static final String ROUTER = "router"; |
| 64 | - private static final String ENDSTATION = "endstation"; | 84 | + private static final String DST = "Egress"; |
| 65 | - public static final String DST = "Dst"; | 85 | + private static final String SRC = "Ingress"; |
| 66 | - public static final String SRC = "Src"; | 86 | + private static final String BANDWIDTH = "bw"; |
| 87 | + private static final String BANDWIDTHTYPE = "bwtype"; | ||
| 88 | + private static final String COSTTYPE = "ctype"; | ||
| 89 | + private static final String LSPTYPE = "lsptype"; | ||
| 90 | + private static final String SRCID = "srid"; | ||
| 91 | + private static final String DSTID = "dsid"; | ||
| 92 | + private static final String TUNNEL_ID = "tunnelid"; | ||
| 93 | + private static final String TUNNEL_NAME = "tunnelname"; | ||
| 94 | + private static final String COST_TYPE_IGP = "igp"; | ||
| 95 | + private static final String COST_TYPE_TE = "te"; | ||
| 96 | + private static final String BANDWIDTH_TYPE_KBPS = "kbps"; | ||
| 97 | + private static final String BUFFER_ARRAY = "a"; | ||
| 98 | + private static final String BANDWIDTH_BPS = "BPS"; | ||
| 99 | + private static final String LSP_TYPE_CR = "cr"; | ||
| 100 | + private static final String LSP_TYPE_SRBE = "srbe"; | ||
| 101 | + private static final String LSP_TYPE_SRTE = "srte"; | ||
| 102 | + private static final String STRING_NULL = "null"; | ||
| 67 | // Delay for showHighlights event processing on GUI client side to | 103 | // Delay for showHighlights event processing on GUI client side to |
| 68 | // account for addLink animation. | 104 | // account for addLink animation. |
| 69 | - public static final int DELAY_MS = 1100; | 105 | + private static final int DELAY_MS = 1100; |
| 70 | - | 106 | + private static final double BANDWIDTH_KBPS = 1_000; |
| 71 | - private static final String CLASS = "class"; | 107 | + private static final double BANDWIDTH_MBPS = 1_000_000; |
| 72 | - private static final String UNKNOWN = "unknown"; | ||
| 73 | - private static final String DEVICE = "device"; | ||
| 74 | 108 | ||
| 75 | private Set<Link> allPathLinks; | 109 | private Set<Link> allPathLinks; |
| 76 | - private boolean listenersRemoved; | ||
| 77 | - private LinkWeight linkData; | ||
| 78 | private int highlightDelay; | 110 | private int highlightDelay; |
| 79 | - | ||
| 80 | - private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 81 | - | ||
| 82 | - private PathService pathService; | ||
| 83 | - | ||
| 84 | private ElementId src, dst; | 111 | private ElementId src, dst; |
| 85 | private String srcType, dstType; | 112 | private String srcType, dstType; |
| 86 | private List<Path> paths; | 113 | private List<Path> paths; |
| 87 | private int pathIndex; | 114 | private int pathIndex; |
| 88 | 115 | ||
| 116 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 117 | + private final TopologyListener topologyListener = new InternalTopologyListener(); | ||
| 118 | + private final TunnelListener tunnelListener = new InnerPceWebTunnelListener(); | ||
| 119 | + | ||
| 89 | protected TopologyService topologyService; | 120 | protected TopologyService topologyService; |
| 121 | + protected TunnelService tunnelService; | ||
| 122 | + protected PceService pceService; | ||
| 90 | protected DeviceService deviceService; | 123 | protected DeviceService deviceService; |
| 91 | - | ||
| 92 | - | ||
| 93 | @Override | 124 | @Override |
| 94 | public void init(UiConnection connection, ServiceDirectory directory) { | 125 | public void init(UiConnection connection, ServiceDirectory directory) { |
| 95 | 126 | ||
| 96 | super.init(connection, directory); | 127 | super.init(connection, directory); |
| 97 | - //TODO: Need add listeners. | 128 | + topologyService = directory.get(TopologyService.class); |
| 98 | - //topologyService = directory.get(TopologyService.class); | 129 | + tunnelService = directory.get(TunnelService.class); |
| 99 | - //addListeners(); | 130 | + pceService = directory.get(PceService.class); |
| 131 | + deviceService = directory.get(DeviceService.class); | ||
| 132 | + topologyService.addListener(topologyListener); | ||
| 133 | + tunnelService.addListener(tunnelListener); | ||
| 100 | } | 134 | } |
| 101 | 135 | ||
| 102 | @Override | 136 | @Override |
| ... | @@ -105,7 +139,19 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -105,7 +139,19 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 105 | new ClearHandler(), | 139 | new ClearHandler(), |
| 106 | new SetSrcHandler(), | 140 | new SetSrcHandler(), |
| 107 | new SetDstHandler(), | 141 | new SetDstHandler(), |
| 108 | - new SetPathHandler()); | 142 | + new SetPathHandler(), |
| 143 | + new UpdatePathQueryHandler(), | ||
| 144 | + new UpdatePathHandler(), | ||
| 145 | + new RemovePathQueryHandler(), | ||
| 146 | + new RemovePathHandler(), | ||
| 147 | + new ShowTunnelHandler()); | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + @Override | ||
| 151 | + public void destroy() { | ||
| 152 | + topologyService.removeListener(topologyListener); | ||
| 153 | + tunnelService.removeListener(tunnelListener); | ||
| 154 | + super.destroy(); | ||
| 109 | } | 155 | } |
| 110 | 156 | ||
| 111 | // Handler classes | 157 | // Handler classes |
| ... | @@ -137,7 +183,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -137,7 +183,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 137 | 183 | ||
| 138 | @Override | 184 | @Override |
| 139 | public void process(long sid, ObjectNode payload) { | 185 | public void process(long sid, ObjectNode payload) { |
| 140 | - log.info("PCE WEB Set source process method invoked"); | ||
| 141 | String id = string(payload, ID); | 186 | String id = string(payload, ID); |
| 142 | src = elementId(id); | 187 | src = elementId(id); |
| 143 | srcType = string(payload, TYPE); | 188 | srcType = string(payload, TYPE); |
| ... | @@ -146,7 +191,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -146,7 +191,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 146 | } | 191 | } |
| 147 | sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(), | 192 | sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(), |
| 148 | srcType, src.toString(), SRC))); | 193 | srcType, src.toString(), SRC))); |
| 149 | - | ||
| 150 | } | 194 | } |
| 151 | } | 195 | } |
| 152 | 196 | ||
| ... | @@ -167,7 +211,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -167,7 +211,6 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 167 | if (src.equals(dst)) { | 211 | if (src.equals(dst)) { |
| 168 | src = null; | 212 | src = null; |
| 169 | } | 213 | } |
| 170 | - | ||
| 171 | sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(), | 214 | sendMessage(TopoJson.highlightsMessage(addBadge(new Highlights(), |
| 172 | dstType, dst.toString(), DST))); | 215 | dstType, dst.toString(), DST))); |
| 173 | 216 | ||
| ... | @@ -175,7 +218,7 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -175,7 +218,7 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 175 | } | 218 | } |
| 176 | 219 | ||
| 177 | /** | 220 | /** |
| 178 | - * Handles the 'patchcalculation' event received from the client. | 221 | + * Handles the 'path calculation' event received from the client. |
| 179 | */ | 222 | */ |
| 180 | private final class SetPathHandler extends RequestHandler { | 223 | private final class SetPathHandler extends RequestHandler { |
| 181 | 224 | ||
| ... | @@ -185,15 +228,168 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -185,15 +228,168 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 185 | 228 | ||
| 186 | @Override | 229 | @Override |
| 187 | public void process(long sid, ObjectNode payload) { | 230 | public void process(long sid, ObjectNode payload) { |
| 188 | - String mode = string(payload, MODE); | 231 | + String bandWidth = string(payload, BANDWIDTH); |
| 232 | + String bandWidthType = string(payload, BANDWIDTHTYPE); | ||
| 233 | + String costType = string(payload, COSTTYPE); | ||
| 234 | + String lspType = string(payload, LSPTYPE); | ||
| 235 | + String tunnelName = string(payload, TUNNEL_NAME); | ||
| 236 | + | ||
| 237 | + if (tunnelName.equals(STRING_NULL)) { | ||
| 238 | + log.error("tunnel name should not be empty"); | ||
| 239 | + return; | ||
| 240 | + } | ||
| 241 | + | ||
| 242 | + if (pceService == null) { | ||
| 243 | + log.error("PCE service is not active"); | ||
| 244 | + return; | ||
| 245 | + } | ||
| 189 | 246 | ||
| 190 | - // TODO: Read user input[constraints] and call the path calculation based on | 247 | + if (lspType == null) { |
| 191 | - //given constrainsts. | 248 | + log.error("PCE setup path is failed."); |
| 192 | - findAndSendPaths(); | 249 | + } |
| 250 | + | ||
| 251 | + if ((src != null) && (dst != null)) { | ||
| 252 | + findAndSendPaths(src, dst, bandWidth, bandWidthType, costType, lspType, tunnelName); | ||
| 253 | + } | ||
| 254 | + } | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + /** | ||
| 258 | + * Handles the 'update path query' event received from the client. | ||
| 259 | + */ | ||
| 260 | + private final class UpdatePathQueryHandler extends RequestHandler { | ||
| 261 | + | ||
| 262 | + public UpdatePathQueryHandler() { | ||
| 263 | + super(PCEWEB_UPDATE_PATH_QUERY); | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + @Override | ||
| 267 | + public void process(long sid, ObjectNode payload) { | ||
| 268 | + String srcId = string(payload, SRCID); | ||
| 269 | + ElementId src = elementId(srcId); | ||
| 270 | + String dstId = string(payload, DSTID); | ||
| 271 | + ElementId dst = elementId(dstId); | ||
| 272 | + Device srcDevice = deviceService.getDevice((DeviceId) src); | ||
| 273 | + Device dstDevice = deviceService.getDevice((DeviceId) dst); | ||
| 274 | + | ||
| 275 | + TunnelEndPoint tunSrc = IpTunnelEndPoint.ipTunnelPoint(IpAddress | ||
| 276 | + .valueOf(srcDevice.annotations().value("lsrId"))); | ||
| 277 | + TunnelEndPoint tunDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress | ||
| 278 | + .valueOf(dstDevice.annotations().value("lsrId"))); | ||
| 279 | + | ||
| 280 | + Collection<Tunnel> tunnelSet = tunnelService.queryTunnel(tunSrc, tunDst); | ||
| 281 | + ObjectNode result = objectNode(); | ||
| 282 | + ArrayNode arrayNode = arrayNode(); | ||
| 283 | + for (Tunnel tunnel : tunnelSet) { | ||
| 284 | + if (tunnel.type() == MPLS) { | ||
| 285 | + arrayNode.add(tunnel.tunnelId().toString()); | ||
| 286 | + } | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + result.putArray(BUFFER_ARRAY).addAll(arrayNode); | ||
| 290 | + sendMessage(PCEWEB_SHOW_TUNNEL, sid, result); | ||
| 291 | + } | ||
| 292 | + } | ||
| 293 | + | ||
| 294 | + /** | ||
| 295 | + * Handles the 'update path' event received from the client. | ||
| 296 | + */ | ||
| 297 | + private final class UpdatePathHandler extends RequestHandler { | ||
| 298 | + | ||
| 299 | + public UpdatePathHandler() { | ||
| 300 | + super(PCEWEB_UPDATE_PATH); | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + @Override | ||
| 304 | + public void process(long sid, ObjectNode payload) { | ||
| 305 | + String bandWidth = string(payload, BANDWIDTH); | ||
| 306 | + String bandWidthType = string(payload, BANDWIDTHTYPE); | ||
| 307 | + String costType = string(payload, COSTTYPE); | ||
| 308 | + String tunnelId = string(payload, TUNNEL_ID); | ||
| 309 | + | ||
| 310 | + if (tunnelId == null) { | ||
| 311 | + log.error("PCE update path is failed."); | ||
| 312 | + } | ||
| 313 | + | ||
| 314 | + findAndSendPathsUpdate(bandWidth, bandWidthType, costType, tunnelId); | ||
| 315 | + } | ||
| 316 | + } | ||
| 317 | + | ||
| 318 | + /** | ||
| 319 | + * Handles the 'remove path query' event received from the client. | ||
| 320 | + */ | ||
| 321 | + private final class RemovePathQueryHandler extends RequestHandler { | ||
| 322 | + | ||
| 323 | + public RemovePathQueryHandler() { | ||
| 324 | + super(PCEWEB_REMOVE_PATH_QUERY); | ||
| 325 | + } | ||
| 326 | + | ||
| 327 | + @Override | ||
| 328 | + public void process(long sid, ObjectNode payload) { | ||
| 329 | + String srcId = string(payload, SRCID); | ||
| 330 | + ElementId src = elementId(srcId); | ||
| 331 | + String dstId = string(payload, DSTID); | ||
| 332 | + ElementId dst = elementId(dstId); | ||
| 333 | + | ||
| 334 | + Device srcDevice = deviceService.getDevice((DeviceId) src); | ||
| 335 | + Device dstDevice = deviceService.getDevice((DeviceId) dst); | ||
| 336 | + | ||
| 337 | + TunnelEndPoint tunSrc = IpTunnelEndPoint.ipTunnelPoint(IpAddress | ||
| 338 | + .valueOf(srcDevice.annotations().value("lsrId"))); | ||
| 339 | + TunnelEndPoint tunDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress | ||
| 340 | + .valueOf(dstDevice.annotations().value("lsrId"))); | ||
| 341 | + | ||
| 342 | + Collection<Tunnel> tunnelSet = tunnelService.queryTunnel(tunSrc, tunDst); | ||
| 343 | + ObjectNode result = objectNode(); | ||
| 344 | + ArrayNode arrayNode = arrayNode(); | ||
| 345 | + | ||
| 346 | + for (Tunnel tunnel : tunnelSet) { | ||
| 347 | + if (tunnel.type() == MPLS) { | ||
| 348 | + arrayNode.add(tunnel.tunnelId().toString()); | ||
| 349 | + } | ||
| 350 | + } | ||
| 351 | + | ||
| 352 | + result.putArray(BUFFER_ARRAY).addAll(arrayNode); | ||
| 353 | + sendMessage(PCEWEB_SHOW_TUNNEL_REMOVE, sid, result); | ||
| 354 | + } | ||
| 355 | + } | ||
| 356 | + | ||
| 357 | + /** | ||
| 358 | + * Handles the 'remove path' event received from the client. | ||
| 359 | + */ | ||
| 360 | + private final class RemovePathHandler extends RequestHandler { | ||
| 361 | + | ||
| 362 | + public RemovePathHandler() { | ||
| 363 | + super(PCEWEB_REMOVE_PATH); | ||
| 364 | + } | ||
| 365 | + | ||
| 366 | + @Override | ||
| 367 | + public void process(long sid, ObjectNode payload) { | ||
| 368 | + String tunnelId = string(payload, TUNNEL_ID); | ||
| 369 | + | ||
| 370 | + if (tunnelId == null) { | ||
| 371 | + log.error("PCE update path is failed."); | ||
| 372 | + } | ||
| 373 | + | ||
| 374 | + findAndSendPathsRemove(tunnelId); | ||
| 375 | + } | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + /** | ||
| 379 | + * Handles the 'show the existed tunnels' event received from the client. | ||
| 380 | + */ | ||
| 381 | + private final class ShowTunnelHandler extends RequestHandler { | ||
| 382 | + | ||
| 383 | + public ShowTunnelHandler() { | ||
| 384 | + super(PCEWEB_QUERY_TUNNELS); | ||
| 385 | + } | ||
| 386 | + | ||
| 387 | + @Override | ||
| 388 | + public void process(long sid, ObjectNode payload) { | ||
| 389 | + findTunnelAndHighlights(); | ||
| 193 | } | 390 | } |
| 194 | } | 391 | } |
| 195 | 392 | ||
| 196 | - // === ------------ | ||
| 197 | /** | 393 | /** |
| 198 | * provides the element id. | 394 | * provides the element id. |
| 199 | */ | 395 | */ |
| ... | @@ -204,45 +400,170 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -204,45 +400,170 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 204 | return HostId.hostId(id); | 400 | return HostId.hostId(id); |
| 205 | } | 401 | } |
| 206 | } | 402 | } |
| 207 | - //TODO: Need to pass constraints to this method | ||
| 208 | - private void findAndSendPaths() { | ||
| 209 | - log.info("src={}; dst={};", src, dst); | ||
| 210 | - if (src != null && dst != null) { | ||
| 211 | - //TBD: Need to call pathcalulation API here | ||
| 212 | - hilightAndSendPaths(); | ||
| 213 | 403 | ||
| 404 | + /** | ||
| 405 | + * Handles the setup path and highlights the path. | ||
| 406 | + * | ||
| 407 | + * @param bandWidth | ||
| 408 | + * @param bandWidthType is the kbps or mbps | ||
| 409 | + * @param costType is igp or te | ||
| 410 | + * @param lspType is WITH_SIGNALLING,WITHOUT_SIGNALLING_AND_WITHOUT_SR or SR_WITHOUT_SIGNALLING | ||
| 411 | + * @param tunnelName tunnel id | ||
| 412 | + */ | ||
| 413 | + private void findAndSendPaths(ElementId src, ElementId dst, String bandWidth, String bandWidthType, | ||
| 414 | + String costType, String lspType, String tunnelName) { | ||
| 415 | + log.debug("src={}; dst={};", src, dst); | ||
| 416 | + boolean path; | ||
| 417 | + List<Constraint> listConstrnt; | ||
| 418 | + | ||
| 419 | + listConstrnt = addBandwidthCostTypeConstraints(bandWidth, bandWidthType, costType); | ||
| 420 | + | ||
| 421 | + //LSP type | ||
| 422 | + LspType lspTypeVal = null; | ||
| 423 | + switch (lspType) { | ||
| 424 | + case LSP_TYPE_CR: | ||
| 425 | + lspTypeVal = LspType.WITH_SIGNALLING; | ||
| 426 | + break; | ||
| 427 | + case LSP_TYPE_SRBE: | ||
| 428 | + lspTypeVal = LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | ||
| 429 | + break; | ||
| 430 | + case LSP_TYPE_SRTE: | ||
| 431 | + lspTypeVal = LspType.SR_WITHOUT_SIGNALLING; | ||
| 432 | + break; | ||
| 433 | + default: | ||
| 434 | + log.error("Invalid LSP type"); | ||
| 435 | + break; | ||
| 436 | + } | ||
| 437 | + | ||
| 438 | + path = pceService.setupPath((DeviceId) src, (DeviceId) dst, tunnelName, listConstrnt, lspTypeVal); | ||
| 439 | + if (!path) { | ||
| 440 | + log.error("setup path is failed"); | ||
| 441 | + return; | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | + return; | ||
| 445 | + } | ||
| 446 | + | ||
| 447 | + /** | ||
| 448 | + * Handles the update path and highlights the path. | ||
| 449 | + * | ||
| 450 | + * @param bandWidth bandWidth | ||
| 451 | + * @param bandWidthType is the kbps or mbps | ||
| 452 | + * @param costType is igp or te | ||
| 453 | + * @param tunnelName tunnel id | ||
| 454 | + */ | ||
| 455 | + private void findAndSendPathsUpdate(String bandWidth, String bandWidthType, String costType, String tunnelIdStr) { | ||
| 456 | + if (tunnelIdStr != null) { | ||
| 457 | + List<Constraint> listConstrnt; | ||
| 458 | + | ||
| 459 | + if (tunnelIdStr.equals(STRING_NULL)) { | ||
| 460 | + log.error("update path is failed"); | ||
| 461 | + return; | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + if (pceService == null) { | ||
| 465 | + log.error("PCE service is not active"); | ||
| 466 | + return; | ||
| 467 | + } | ||
| 468 | + | ||
| 469 | + listConstrnt = addBandwidthCostTypeConstraints(bandWidth, bandWidthType, costType); | ||
| 470 | + TunnelId tunnelId = TunnelId.valueOf(tunnelIdStr); | ||
| 471 | + boolean path = pceService.updatePath(tunnelId, listConstrnt); | ||
| 472 | + | ||
| 473 | + if (!path) { | ||
| 474 | + log.error("update path is failed"); | ||
| 475 | + return; | ||
| 476 | + } | ||
| 214 | } | 477 | } |
| 478 | + return; | ||
| 479 | + } | ||
| 215 | 480 | ||
| 481 | + /** | ||
| 482 | + * Handles the remove path and highlights the paths if existed. | ||
| 483 | + * | ||
| 484 | + * @param tunnelIdName tunnelId | ||
| 485 | + */ | ||
| 486 | + private void findAndSendPathsRemove(String tunnelIdStr) { | ||
| 487 | + if (tunnelIdStr != null) { | ||
| 488 | + if (pceService == null) { | ||
| 489 | + log.error("PCE service is not active"); | ||
| 490 | + return; | ||
| 491 | + } | ||
| 492 | + | ||
| 493 | + TunnelId tunnelId = TunnelId.valueOf(tunnelIdStr); | ||
| 494 | + boolean path = pceService.releasePath(tunnelId); | ||
| 495 | + if (!path) { | ||
| 496 | + log.error("remove path is failed"); | ||
| 497 | + return; | ||
| 498 | + } | ||
| 499 | + } | ||
| 500 | + return; | ||
| 216 | } | 501 | } |
| 217 | 502 | ||
| 218 | - //TODO: The below code is not used. Once get path from PCE app then below code will be use. | 503 | + private ImmutableSet.Builder<Link> buildPaths(ImmutableSet.Builder<Link> pathBuilder) { |
| 219 | - // the below code will get path and it will highlight the selected path. | ||
| 220 | - //Currently primary path in use, there is no use of secondary path. | ||
| 221 | - //secondary path need to remove based on path received by PCE app. | ||
| 222 | - private ImmutableSet.Builder<Link> buildPaths( | ||
| 223 | - ImmutableSet.Builder<Link> pathBuilder) { | ||
| 224 | paths.forEach(path -> path.links().forEach(pathBuilder::add)); | 504 | paths.forEach(path -> path.links().forEach(pathBuilder::add)); |
| 225 | return pathBuilder; | 505 | return pathBuilder; |
| 226 | } | 506 | } |
| 227 | 507 | ||
| 228 | - private ImmutableSet.Builder<Link> buildDisjointPaths( | 508 | + /** |
| 229 | - ImmutableSet.Builder<Link> pathBuilder) { | 509 | + * Handles the preparation of constraints list with given bandwidth and cost-type. |
| 230 | - paths.forEach(path -> { | 510 | + * |
| 231 | - DisjointPath dp = (DisjointPath) path; | 511 | + * @param bandWidth bandWidth |
| 232 | - pathBuilder.addAll(dp.primary().links()); | 512 | + * @param bandWidthType is the kbps or mbps |
| 233 | - pathBuilder.addAll(dp.backup().links()); | 513 | + * @param costType is igp or te |
| 234 | - }); | 514 | + * @param listConstrnt list of constraints |
| 235 | - return pathBuilder; | 515 | + * @return |
| 516 | + */ | ||
| 517 | + private List<Constraint> addBandwidthCostTypeConstraints(String bandWidth, | ||
| 518 | + String bandWidthType, | ||
| 519 | + String costType) { | ||
| 520 | + List<Constraint> listConstrnt = new LinkedList<>(); | ||
| 521 | + //bandwidth | ||
| 522 | + double bwValue = 0.0; | ||
| 523 | + if (!bandWidth.equals(STRING_NULL)) { | ||
| 524 | + bwValue = Double.parseDouble(bandWidth); | ||
| 525 | + } | ||
| 526 | + if (bandWidthType.equals(BANDWIDTH_TYPE_KBPS)) { | ||
| 527 | + bwValue = bwValue * BANDWIDTH_KBPS; | ||
| 528 | + } else { | ||
| 529 | + bwValue = bwValue * BANDWIDTH_MBPS; | ||
| 530 | + } | ||
| 531 | + | ||
| 532 | + //Cost type | ||
| 533 | + CostConstraint.Type costTypeVal = null; | ||
| 534 | + switch (costType) { | ||
| 535 | + case COST_TYPE_IGP: | ||
| 536 | + costTypeVal = CostConstraint.Type.COST; | ||
| 537 | + break; | ||
| 538 | + case COST_TYPE_TE: | ||
| 539 | + costTypeVal = CostConstraint.Type.TE_COST; | ||
| 540 | + break; | ||
| 541 | + default: | ||
| 542 | + log.error("Invalid cost type"); | ||
| 543 | + break; | ||
| 544 | + } | ||
| 545 | + | ||
| 546 | + if (bwValue != 0.0) { | ||
| 547 | + listConstrnt.add(BandwidthConstraint.of(bwValue, DataRateUnit.valueOf(BANDWIDTH_BPS))); | ||
| 548 | + } | ||
| 549 | + | ||
| 550 | + if (costTypeVal != null) { | ||
| 551 | + listConstrnt.add(CostConstraint.of(costTypeVal)); | ||
| 552 | + } | ||
| 553 | + | ||
| 554 | + return listConstrnt; | ||
| 236 | } | 555 | } |
| 237 | 556 | ||
| 557 | + /** | ||
| 558 | + * Handles the highlights of selected path. | ||
| 559 | + */ | ||
| 238 | private void hilightAndSendPaths() { | 560 | private void hilightAndSendPaths() { |
| 239 | PceWebLinkMap linkMap = new PceWebLinkMap(); | 561 | PceWebLinkMap linkMap = new PceWebLinkMap(); |
| 240 | allPathLinks.forEach(linkMap::add); | 562 | allPathLinks.forEach(linkMap::add); |
| 241 | - | ||
| 242 | Set<Link> selectedPathLinks; | 563 | Set<Link> selectedPathLinks; |
| 243 | 564 | ||
| 244 | - selectedPathLinks = paths.isEmpty() ? ImmutableSet.of() | 565 | + selectedPathLinks = paths.isEmpty() ? |
| 245 | - : ImmutableSet.copyOf(paths.get(pathIndex).links()); | 566 | + ImmutableSet.of() : ImmutableSet.copyOf(paths.get(pathIndex).links()); |
| 246 | 567 | ||
| 247 | Highlights highlights = new Highlights(); | 568 | Highlights highlights = new Highlights(); |
| 248 | if (highlightDelay > 0) { | 569 | if (highlightDelay > 0) { |
| ... | @@ -261,16 +582,32 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -261,16 +582,32 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 261 | sendMessage(TopoJson.highlightsMessage(highlights)); | 582 | sendMessage(TopoJson.highlightsMessage(highlights)); |
| 262 | } | 583 | } |
| 263 | 584 | ||
| 585 | + /** | ||
| 586 | + * Handles the addition of badge and highlights. | ||
| 587 | + * | ||
| 588 | + * @param highlights highlights | ||
| 589 | + * @param type device type | ||
| 590 | + * @param elemId device to be add badge | ||
| 591 | + * @param src device to be add badge | ||
| 592 | + * @return | ||
| 593 | + */ | ||
| 264 | private Highlights addBadge(Highlights highlights, String type, | 594 | private Highlights addBadge(Highlights highlights, String type, |
| 265 | String elemId, String src) { | 595 | String elemId, String src) { |
| 266 | - if (SWITCH.equals(type)) { | 596 | + if (ROUTER.equals(type)) { |
| 267 | highlights = addDeviceBadge(highlights, elemId, src); | 597 | highlights = addDeviceBadge(highlights, elemId, src); |
| 268 | - } else if (ENDSTATION.equals(type)) { | ||
| 269 | - highlights = addHostBadge(highlights, elemId, src); | ||
| 270 | } | 598 | } |
| 599 | + | ||
| 271 | return highlights; | 600 | return highlights; |
| 272 | } | 601 | } |
| 273 | 602 | ||
| 603 | + /** | ||
| 604 | + * Handles the badge add and highlights. | ||
| 605 | + * | ||
| 606 | + * @param h highlights | ||
| 607 | + * @param elemId device to be add badge | ||
| 608 | + * @param type device type | ||
| 609 | + * @return highlights | ||
| 610 | + */ | ||
| 274 | private Highlights addDeviceBadge(Highlights h, String elemId, String type) { | 611 | private Highlights addDeviceBadge(Highlights h, String elemId, String type) { |
| 275 | DeviceHighlight dh = new DeviceHighlight(elemId); | 612 | DeviceHighlight dh = new DeviceHighlight(elemId); |
| 276 | dh.setBadge(createBadge(type)); | 613 | dh.setBadge(createBadge(type)); |
| ... | @@ -278,18 +615,59 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { | ... | @@ -278,18 +615,59 @@ public class PceWebTopovMessageHandler extends UiMessageHandler { |
| 278 | return h; | 615 | return h; |
| 279 | } | 616 | } |
| 280 | 617 | ||
| 281 | - private Highlights addHostBadge(Highlights h, String elemId, String type) { | 618 | + /** |
| 282 | - HostHighlight hh = new HostHighlight(elemId); | 619 | + * Handles the node badge add and highlights. |
| 283 | - hh.setBadge(createBadge(type)); | 620 | + * |
| 284 | - h.add(hh); | 621 | + * @param type device type |
| 285 | - return h; | 622 | + * @return badge of given node |
| 286 | - } | 623 | + */ |
| 287 | - | ||
| 288 | private NodeBadge createBadge(String type) { | 624 | private NodeBadge createBadge(String type) { |
| 289 | return NodeBadge.text(type); | 625 | return NodeBadge.text(type); |
| 290 | } | 626 | } |
| 291 | 627 | ||
| 292 | - //TODO: Listeners need to add. | 628 | + /** |
| 293 | - //If topology changes then path need to be re calculate. | 629 | + * Handles the event of topology listeners. |
| 630 | + */ | ||
| 631 | + private class InternalTopologyListener implements TopologyListener { | ||
| 632 | + @Override | ||
| 633 | + public void event(TopologyEvent event) { | ||
| 634 | + highlightDelay = DELAY_MS; | ||
| 635 | + findTunnelAndHighlights(); | ||
| 636 | + highlightDelay = 0; | ||
| 637 | + } | ||
| 638 | + } | ||
| 294 | 639 | ||
| 640 | + /** | ||
| 641 | + * Handles the event of tunnel listeners. | ||
| 642 | + */ | ||
| 643 | + private class InnerPceWebTunnelListener implements TunnelListener { | ||
| 644 | + @Override | ||
| 645 | + public void event(TunnelEvent event) { | ||
| 646 | + Tunnel tunnel = event.subject(); | ||
| 647 | + if (tunnel.type() == MPLS) { | ||
| 648 | + highlightDelay = DELAY_MS; | ||
| 649 | + findTunnelAndHighlights(); | ||
| 650 | + highlightDelay = 0; | ||
| 651 | + } | ||
| 652 | + } | ||
| 653 | + } | ||
| 654 | + | ||
| 655 | + /** | ||
| 656 | + * Handles the event of topology listeners. | ||
| 657 | + */ | ||
| 658 | + private void findTunnelAndHighlights() { | ||
| 659 | + Collection<Tunnel> tunnelSet = null; | ||
| 660 | + tunnelSet = tunnelService.queryTunnel(MPLS); | ||
| 661 | + for (Tunnel tunnel : tunnelSet) { | ||
| 662 | + if (tunnel.path() == null) { | ||
| 663 | + log.info("path does not exist"); | ||
| 664 | + return; | ||
| 665 | + } | ||
| 666 | + paths.add(tunnel.path()); | ||
| 667 | + } | ||
| 668 | + | ||
| 669 | + ImmutableSet.Builder<Link> builder = ImmutableSet.builder(); | ||
| 670 | + allPathLinks = buildPaths(builder).build(); | ||
| 671 | + hilightAndSendPaths(); | ||
| 672 | + } | ||
| 295 | } | 673 | } | ... | ... |
| ... | @@ -63,7 +63,6 @@ public class PceWebTopovOverlay extends UiTopoOverlay { | ... | @@ -63,7 +63,6 @@ public class PceWebTopovOverlay extends UiTopoOverlay { |
| 63 | public void modifyDeviceDetails(PropertyPanel pp, DeviceId deviceId) { | 63 | public void modifyDeviceDetails(PropertyPanel pp, DeviceId deviceId) { |
| 64 | 64 | ||
| 65 | pp.title(MY_TITLE); | 65 | pp.title(MY_TITLE); |
| 66 | - log.info("Modify device details called."); | ||
| 67 | 66 | ||
| 68 | DeviceService deviceService = AbstractShellCommand.get(DeviceService.class); | 67 | DeviceService deviceService = AbstractShellCommand.get(DeviceService.class); |
| 69 | 68 | ... | ... |
| ... | @@ -21,16 +21,23 @@ | ... | @@ -21,16 +21,23 @@ |
| 21 | 21 | ||
| 22 | // injected refs | 22 | // injected refs |
| 23 | var $log, fs, flash, wss, tps, ns, tds, ds; | 23 | var $log, fs, flash, wss, tps, ns, tds, ds; |
| 24 | - | 24 | + var tunnelNameData, tunnelNameDataRemove; |
| 25 | // constants | 25 | // constants |
| 26 | var srcMessage = 'pceTopovSetSrc', | 26 | var srcMessage = 'pceTopovSetSrc', |
| 27 | dstMessage = 'pceTopovSetDst', | 27 | dstMessage = 'pceTopovSetDst', |
| 28 | clearMessage = 'pceTopovClear', | 28 | clearMessage = 'pceTopovClear', |
| 29 | - setModemsg = 'pceTopovSetMode', | 29 | + setPathmsg = 'pceTopovSetMode', |
| 30 | - L3dev = 'requestIpDevDetails'; | 30 | + updatePathmsgQuery = 'pceTopovUpdateQuery', |
| 31 | + remPathmsgQuery = 'pceTopovRemQuery', | ||
| 32 | + updatePathmsg = 'pceTopovUpdate', | ||
| 33 | + remPathmsg = 'pceTopovRem', | ||
| 34 | + showTunnelInfoMsg = 'pceTopovShowTunnels', | ||
| 35 | + queryDisplayTunnelMsg = 'pceTopovTunnelDisplay', | ||
| 36 | + showTunnelInfoRemoveMsg = 'pceTopovShowTunnelsRem'; | ||
| 31 | // internal state | 37 | // internal state |
| 32 | var currentMode = null; | 38 | var currentMode = null; |
| 33 | - | 39 | + var handlerMap = {}, |
| 40 | + handlerMapRem = {}; | ||
| 34 | // === --------------------------- | 41 | // === --------------------------- |
| 35 | // === Helper functions | 42 | // === Helper functions |
| 36 | 43 | ||
| ... | @@ -58,153 +65,326 @@ | ... | @@ -58,153 +65,326 @@ |
| 58 | flash.flash('Cleared source and destination'); | 65 | flash.flash('Cleared source and destination'); |
| 59 | } | 66 | } |
| 60 | 67 | ||
| 61 | - function dOk() { | 68 | + function dClose() { |
| 62 | - var bandWidth = d3.select('#band-width-box').property("checked"); | 69 | + $log.debug('Dialog Close button clicked (or Esc pressed)'); |
| 63 | - var bandValue = null; | 70 | + } |
| 64 | - var bandType = null; | ||
| 65 | - | ||
| 66 | - if (bandWidth) { | ||
| 67 | - | ||
| 68 | - bandValue = d3.select('#band-width-value').property("value"); | ||
| 69 | 71 | ||
| 70 | - if (d3.select("#band-kpbs-val").property("checked")) { | 72 | + function createUserText() { |
| 71 | - bandType = 'kbps'; | 73 | + var content = ds.createDiv('constraints-input'), |
| 72 | - } else if (d3.select('#band-mpbs-val').property("checked")) { | 74 | + form = content.append('form'), |
| 73 | - bandType = 'mbps'; | 75 | + p = form.append('p'); |
| 74 | - } | 76 | + |
| 77 | + function addAttribute(name, id, nameField, type) { | ||
| 78 | + p.append('input').attr({ | ||
| 79 | + type: type, | ||
| 80 | + name: name, | ||
| 81 | + id: id | ||
| 82 | + }); | ||
| 83 | + | ||
| 84 | + p.append('span').text(nameField); | ||
| 85 | + p.append('br'); | ||
| 75 | } | 86 | } |
| 76 | 87 | ||
| 77 | - var costType = d3.select('#pce-cost-type').property("checked"); | 88 | + //Add the bandwidth related inputs. |
| 78 | - var costTypeVal = null; | 89 | + addAttribute('band-width-name', 'band-width-box', 'Band Width', 'checkbox'); |
| 90 | + addAttribute('band-width-value-name', 'band-width-value', null, 'number'); | ||
| 91 | + addAttribute('pce-band-type', 'band-kpbs-val', 'kbps', 'radio'); | ||
| 92 | + addAttribute('pce-band-type', 'band-mpbs-val', 'mbps', 'radio'); | ||
| 93 | + //Add the cost type related inputs. | ||
| 94 | + addAttribute('pce-cost-type-name', 'pce-cost-type', 'Cost Type', 'checkbox'); | ||
| 95 | + addAttribute('pce-cost-type-valname', 'pce-cost-type-igp', 'IGP', 'radio'); | ||
| 96 | + addAttribute('pce-cost-type-valname', 'pce-cost-type-te', 'TE', 'radio'); | ||
| 97 | + //Add the LSP type related inputs. | ||
| 98 | + addAttribute('pce-lsp-type-name', 'pce-lsp-type', 'Lsp Type', 'checkbox'); | ||
| 99 | + addAttribute('pce-lsp-type-valname', 'pce-lsp-type-cr', 'WITH SIGNALLING', 'radio'); | ||
| 100 | + addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srbe', 'WITHOUT SR WITHOUT SIGNALLING', 'radio'); | ||
| 101 | + addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srte', 'WITH SR WITHOUT SIGNALLING', 'radio'); | ||
| 102 | + //Add the tunnel name | ||
| 103 | + addAttribute('pce-tunnel-name', 'pce-tunnel-name-id', 'Tunnel Name', 'text'); | ||
| 79 | 104 | ||
| 80 | - if (costType) { | 105 | + return content; |
| 106 | + } | ||
| 81 | 107 | ||
| 82 | - if (d3.select("#pce-cost-type-igp").property("checked")) { | 108 | + function createUserTextUpdate(data) { |
| 83 | - costTypeVal = 'igp'; | 109 | + var content = ds.createDiv(), |
| 84 | - } else if (d3.select('#pce-cost-type-te').property("checked")) { | 110 | + form = content.append('form'), |
| 85 | - costTypeVal = 'te'; | 111 | + p = form.append('p'); |
| 86 | - } | ||
| 87 | - } | ||
| 88 | 112 | ||
| 89 | - var lspType = d3.select('#pce-lsp-type').property("checked"); | 113 | + p.append('span').text('Tunnel IDs'); |
| 90 | - var lspTypeVal = null; | 114 | + p.append('br'); |
| 91 | 115 | ||
| 92 | - if (lspType) { | 116 | + data.a.forEach( function (val, idx) { |
| 117 | + p.append('input').attr({ | ||
| 118 | + id: 'tunnel-id-'+idx, | ||
| 119 | + type: 'radio', | ||
| 120 | + name: 'tunnel-id-name', | ||
| 121 | + value: val | ||
| 122 | + }); | ||
| 93 | 123 | ||
| 94 | - if (d3.select("#pce-lsp-type-cr").property("checked")) { | 124 | + p.append('span').text(val); |
| 95 | - lspTypeVal = 'cr'; | 125 | + p.append('br'); |
| 96 | - } else if (d3.select('#pce-lsp-type-srbe').property("checked")) { | ||
| 97 | - lspTypeVal = 'srbe'; | ||
| 98 | - } else if (d3.select('#pce-lsp-type-srte').property("checked")) { | ||
| 99 | - lspTypeVal = 'srte'; | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | 126 | ||
| 103 | - //TBD: Read the user inputs and need to send the event for calculating the path based on constrainsts. | 127 | + } ); |
| 104 | - // TBD: Need to read IGP cost type and LSP type. | ||
| 105 | - //wss.sendEvent(setModemsg); | ||
| 106 | - //flash.flash('creat path message'); | ||
| 107 | 128 | ||
| 108 | - $log.debug('Dialog OK button clicked'); | 129 | + return content; |
| 109 | } | 130 | } |
| 110 | 131 | ||
| 111 | - function dClose() { | 132 | + function createUserTextUpdatePathEvent() { |
| 112 | - $log.debug('Dialog Close button clicked (or Esc pressed)'); | 133 | + var content = ds.createDiv(), |
| 113 | - } | 134 | + form = content.append('form'), |
| 135 | + p = form.append('p'); | ||
| 114 | 136 | ||
| 115 | - function createUserText() { | 137 | + function addAttribute(name, id, nameField, type) { |
| 116 | - var content = ds.createDiv(); | 138 | + p.append('input').attr({ |
| 117 | - var form = content.append('form'); | 139 | + type: type, |
| 118 | - var p = form.append('p'); | 140 | + name: name, |
| 141 | + id: id | ||
| 142 | + }); | ||
| 119 | 143 | ||
| 120 | - //Add the bandwidth related inputs. | 144 | + p.append('span').text(nameField); |
| 121 | - p.append('input').attr({ | 145 | + p.append('br'); |
| 122 | - id: 'band-width-box', | 146 | + } |
| 123 | - type: 'checkbox', | ||
| 124 | - name: 'band-width-name' | ||
| 125 | - }); | ||
| 126 | - p.append('span').text('Band Width'); | ||
| 127 | - p.append('br'); | ||
| 128 | - p.append('input').attr({ | ||
| 129 | - id: 'band-width-value', | ||
| 130 | - type: 'number', | ||
| 131 | - name: 'band-width-value-name' | ||
| 132 | - }); | ||
| 133 | - p.append('input').attr({ | ||
| 134 | - id: 'band-kpbs-val', | ||
| 135 | - type: 'radio', | ||
| 136 | - name: 'pce-band-type' | ||
| 137 | - }); | ||
| 138 | - p.append('span').text('kpbs'); | ||
| 139 | - p.append('input').attr({ | ||
| 140 | - id: 'band-mpbs-val', | ||
| 141 | - type: 'radio', | ||
| 142 | - name: 'pce-band-type' | ||
| 143 | - }); | ||
| 144 | - p.append('span').text('mpbs'); | ||
| 145 | - p.append('br'); | ||
| 146 | 147 | ||
| 148 | + //Add the bandwidth related inputs. | ||
| 149 | + addAttribute('band-width-name', 'update-band-width-box', 'Band Width', 'checkbox'); | ||
| 150 | + addAttribute('band-width-value-name', 'update-band-width-value', null, 'number'); | ||
| 151 | + addAttribute('pce-band-type', 'update-band-kpbs-val', 'kbps', 'radio'); | ||
| 152 | + addAttribute('pce-band-type', 'update-band-mpbs-val', 'mbps', 'radio'); | ||
| 147 | //Add the cost type related inputs. | 153 | //Add the cost type related inputs. |
| 148 | - p.append('input').attr({ | 154 | + addAttribute('pce-cost-type', 'update-pce-cost-type', 'Cost Type', 'checkbox'); |
| 149 | - id: 'pce-cost-type', | 155 | + addAttribute('pce-cost-type-value', 'update-pce-cost-type-igp', 'IGP', 'radio'); |
| 150 | - type: 'checkbox', | 156 | + addAttribute('pce-cost-type-value', 'update-pce-cost-type-te', 'TE', 'radio'); |
| 151 | - name: 'pce-cost-type-name' | ||
| 152 | - }); | ||
| 153 | - p.append('span').text('Cost Type'); | ||
| 154 | - p.append('br'); | ||
| 155 | - p.append('input').attr({ | ||
| 156 | - id: 'pce-cost-type-igp', | ||
| 157 | - type: 'radio', | ||
| 158 | - name: 'pce-cost-type-valname' | ||
| 159 | - }); | ||
| 160 | - p.append('span').text('IGP'); | ||
| 161 | - p.append('input').attr({ | ||
| 162 | - id: 'pce-cost-type-te', | ||
| 163 | - type: 'radio', | ||
| 164 | - name: 'pce-cost-type-valname' | ||
| 165 | - }); | ||
| 166 | - p.append('span').text('TE'); | ||
| 167 | - p.append('br'); | ||
| 168 | 157 | ||
| 169 | - //Add the LSP type related inputs. | 158 | + return content; |
| 170 | - p.append('input').attr({ | 159 | + } |
| 171 | - id: 'pce-lsp-type', | 160 | + |
| 172 | - type: 'checkbox', | 161 | + function createUserTextRemove(data) { |
| 173 | - name: 'pce-lsp-type-name' | 162 | + |
| 174 | - }); | 163 | + var content = ds.createDiv(), |
| 175 | - p.append('span').text('Lsp Type'); | 164 | + form = content.append('form'), |
| 165 | + p = form.append('p'); | ||
| 166 | + | ||
| 167 | + p.append('span').text('Tunnel IDs'); | ||
| 176 | p.append('br'); | 168 | p.append('br'); |
| 177 | - p.append('input').attr({ | 169 | + |
| 178 | - id: 'pce-lsp-type-cr', | 170 | + data.a.forEach( function (val, idx) { |
| 179 | - type: 'radio', | 171 | + p.append('input').attr({ |
| 180 | - name: 'pce-lsp-type-valname' | 172 | + id: 'tunnel-id-remove-'+idx, |
| 181 | - }); | 173 | + type: 'checkbox', |
| 182 | - p.append('span').text('CR'); | 174 | + name: 'tunnel-id-name-remove', |
| 183 | - p.append('input').attr({ | 175 | + value: val |
| 184 | - id: 'pce-lsp-type-srbe', | 176 | + }); |
| 185 | - type: 'radio', | 177 | + |
| 186 | - name: 'pce-lsp-type-valname' | 178 | + p.append('span').text(val); |
| 187 | - }); | 179 | + p.append('br'); |
| 188 | - p.append('span').text('SR BE'); | 180 | + } ); |
| 189 | - p.append('input').attr({ | ||
| 190 | - id: 'pce-lsp-type-srte', | ||
| 191 | - type: 'radio', | ||
| 192 | - name: 'pce-lsp-type-valname' | ||
| 193 | - }); | ||
| 194 | - p.append('span').text('SR TE'); | ||
| 195 | 181 | ||
| 196 | return content; | 182 | return content; |
| 197 | } | 183 | } |
| 198 | 184 | ||
| 185 | + function isChecked(viewId) { | ||
| 186 | + return d3.select('#' + viewId).property('checked'); | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + function getCheckedValue(viewId) { | ||
| 190 | + return d3.select('#' + viewId).property('value'); | ||
| 191 | + } | ||
| 192 | + | ||
| 193 | + function showTunnelInformation(data) { | ||
| 194 | + wss.unbindHandlers(handlerMap); | ||
| 195 | + tunnelNameData = data; | ||
| 196 | + | ||
| 197 | + function dOkUpdate() { | ||
| 198 | + var tdString = '' ; | ||
| 199 | + tunnelNameData.a.forEach( function (val, idx) { | ||
| 200 | + var tunnelName = isChecked('tunnel-id-'+idx); | ||
| 201 | + if (tunnelName) | ||
| 202 | + { | ||
| 203 | + tdString = val; | ||
| 204 | + } | ||
| 205 | + } ); | ||
| 206 | + | ||
| 207 | + if (tdString) { | ||
| 208 | + constraintsUpdateDialog(tdString); | ||
| 209 | + } else { | ||
| 210 | + $log.debug("No tunnel id is selected."); | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + $log.debug('Dialog OK button clicked'); | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + tds.openDialog() | ||
| 217 | + .setTitle('Available LSPs with selected device') | ||
| 218 | + .addContent(createUserTextUpdate(data)) | ||
| 219 | + .addOkChained(dOkUpdate, 'GOTO Selection of constraints') | ||
| 220 | + .addCancel(dClose, 'Close') | ||
| 221 | + .bindKeys(); | ||
| 222 | + } | ||
| 223 | + | ||
| 224 | + function constraintsUpdateDialog(tunnelId) { | ||
| 225 | + | ||
| 226 | + // invoked when the OK button is pressed on this dialog | ||
| 227 | + function dOkUpdateEvent() { | ||
| 228 | + $log.debug('Select constraints for update path Dialog OK button pressed'); | ||
| 229 | + | ||
| 230 | + var bandWidth = isChecked('update-band-width-box'), | ||
| 231 | + bandValue = null, | ||
| 232 | + bandType = null; | ||
| 233 | + | ||
| 234 | + if (bandWidth) { | ||
| 235 | + bandValue = d3.select('#update-band-width-value'); | ||
| 236 | + | ||
| 237 | + if (isChecked('update-band-kpbs-val')) { | ||
| 238 | + bandType = 'kbps'; | ||
| 239 | + } else if (isChecked('update-band-mpbs-val')) { | ||
| 240 | + bandType = 'mbps'; | ||
| 241 | + } | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + var costType = isChecked('update-pce-cost-type'), | ||
| 245 | + costTypeVal = null; | ||
| 246 | + | ||
| 247 | + if (costType) { | ||
| 248 | + if (isChecked('update-pce-cost-type-igp')) { | ||
| 249 | + costTypeVal = 'igp'; | ||
| 250 | + } else if (isChecked('update-pce-cost-type-te')) { | ||
| 251 | + costTypeVal = 'te'; | ||
| 252 | + } | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + wss.sendEvent(updatePathmsg, { | ||
| 256 | + bw: bandValue, | ||
| 257 | + ctype: costTypeVal, | ||
| 258 | + tunnelname: tunnelId | ||
| 259 | + }); | ||
| 260 | + | ||
| 261 | + flash.flash('update path message'); | ||
| 262 | + | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + tds.openDialog() | ||
| 266 | + .setTitle('Select constraints for update path') | ||
| 267 | + .addContent(createUserTextUpdatePathEvent()) | ||
| 268 | + .addCancel() | ||
| 269 | + .addOk(dOkUpdateEvent, 'Update Path') // NOTE: NOT the "chained" version! | ||
| 270 | + .bindKeys(); | ||
| 271 | + | ||
| 272 | + } | ||
| 273 | + | ||
| 274 | + function showTunnelInformationRemove(data) { | ||
| 275 | + | ||
| 276 | + wss.unbindHandlers(handlerMapRem); | ||
| 277 | + tunnelNameDataRemove = data; | ||
| 278 | + tds.openDialog() | ||
| 279 | + .setTitle('Available Tunnels for remove') | ||
| 280 | + .addContent(createUserTextRemove(data)) | ||
| 281 | + .addOk(dOkRemove, 'Remove') | ||
| 282 | + .addCancel(dClose, 'Close') | ||
| 283 | + .bindKeys(); | ||
| 284 | + } | ||
| 285 | + | ||
| 286 | + //setup path | ||
| 199 | function setMode() { | 287 | function setMode() { |
| 288 | + | ||
| 289 | + function dOk() { | ||
| 290 | + var bandWidth = isChecked('band-width-box'), | ||
| 291 | + bandValue = null, | ||
| 292 | + bandType = null; | ||
| 293 | + | ||
| 294 | + if (bandWidth) { | ||
| 295 | + bandValue = getCheckedValue('band-width-value'); | ||
| 296 | + | ||
| 297 | + if (isChecked('band-kpbs-val')) { | ||
| 298 | + bandType = 'kbps'; | ||
| 299 | + } else if (isChecked('band-mpbs-val')) { | ||
| 300 | + bandType = 'mbps'; | ||
| 301 | + } | ||
| 302 | + } | ||
| 303 | + | ||
| 304 | + var costType = isChecked('pce-cost-type'), | ||
| 305 | + costTypeVal = null; | ||
| 306 | + | ||
| 307 | + if (costType) { | ||
| 308 | + if (isChecked('pce-cost-type-igp')) { | ||
| 309 | + costTypeVal = 'igp'; | ||
| 310 | + } else if (isChecked('pce-cost-type-te')) { | ||
| 311 | + costTypeVal = 'te'; | ||
| 312 | + } | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + var lspType = isChecked('pce-lsp-type'), | ||
| 316 | + lspTypeVal = null; | ||
| 317 | + | ||
| 318 | + if (lspType) { | ||
| 319 | + if (isChecked('pce-lsp-type-cr')) { | ||
| 320 | + lspTypeVal = 'cr'; | ||
| 321 | + } else if (isChecked('pce-lsp-type-srbe')) { | ||
| 322 | + lspTypeVal = 'srbe'; | ||
| 323 | + } else if (isChecked('pce-lsp-type-srte')) { | ||
| 324 | + lspTypeVal = 'srte'; | ||
| 325 | + } | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | + wss.sendEvent(setPathmsg, { | ||
| 329 | + bw: bandValue, | ||
| 330 | + bwtype: bandType, | ||
| 331 | + ctype: costTypeVal, | ||
| 332 | + lsptype: lspTypeVal, | ||
| 333 | + tunnelname: getCheckedValue('pce-tunnel-name-id') | ||
| 334 | + }); | ||
| 335 | + | ||
| 336 | + flash.flash('create path message'); | ||
| 337 | + $log.debug('Dialog OK button clicked'); | ||
| 338 | + } | ||
| 339 | + | ||
| 200 | tds.openDialog() | 340 | tds.openDialog() |
| 201 | - .setTitle('constraints user') | 341 | + .setTitle('constraints selection') |
| 202 | .addContent(createUserText()) | 342 | .addContent(createUserText()) |
| 203 | .addOk(dOk, 'OK') | 343 | .addOk(dOk, 'OK') |
| 204 | .addCancel(dClose, 'Close') | 344 | .addCancel(dClose, 'Close') |
| 205 | .bindKeys(); | 345 | .bindKeys(); |
| 206 | } | 346 | } |
| 207 | 347 | ||
| 348 | + function updatePath(node) { | ||
| 349 | + | ||
| 350 | + wss.sendEvent(updatePathmsgQuery, { | ||
| 351 | + srid: node[0], | ||
| 352 | + dsid: node[1] | ||
| 353 | + }); | ||
| 354 | + | ||
| 355 | + handlerMap[showTunnelInfoMsg] = showTunnelInformation; | ||
| 356 | + wss.bindHandlers(handlerMap); | ||
| 357 | + | ||
| 358 | + flash.flash('update path message'); | ||
| 359 | + } | ||
| 360 | + | ||
| 361 | + function dOkRemove() { | ||
| 362 | + | ||
| 363 | + tunnelNameDataRemove.a.forEach( function (val, idx) { | ||
| 364 | + var tunnelNameVal = isChecked('tunnel-id-remove-'+idx); | ||
| 365 | + if (tunnelNameVal) { | ||
| 366 | + wss.sendEvent(remPathmsg, { | ||
| 367 | + tunnelid: val | ||
| 368 | + }); | ||
| 369 | + } | ||
| 370 | + } ); | ||
| 371 | + | ||
| 372 | + flash.flash('remove path message'); | ||
| 373 | + } | ||
| 374 | + | ||
| 375 | + function remPath(node) { | ||
| 376 | + wss.sendEvent(remPathmsgQuery, { | ||
| 377 | + srid: node[0], | ||
| 378 | + dsid: node[1] | ||
| 379 | + }); | ||
| 380 | + | ||
| 381 | + handlerMapRem[showTunnelInfoRemoveMsg] = showTunnelInformationRemove; | ||
| 382 | + wss.bindHandlers(handlerMapRem); | ||
| 383 | + } | ||
| 384 | + | ||
| 385 | + function queryTunnelDisplay() { | ||
| 386 | + wss.sendEvent(queryDisplayTunnelMsg); | ||
| 387 | + } | ||
| 208 | // === --------------------------- | 388 | // === --------------------------- |
| 209 | // === Module Factory Definition | 389 | // === Module Factory Definition |
| 210 | 390 | ||
| ... | @@ -227,8 +407,10 @@ | ... | @@ -227,8 +407,10 @@ |
| 227 | setSrc: setSrc, | 407 | setSrc: setSrc, |
| 228 | setDst: setDst, | 408 | setDst: setDst, |
| 229 | clear: clear, | 409 | clear: clear, |
| 230 | - setMode: setMode | 410 | + setMode: setMode, |
| 231 | - | 411 | + updatePath: updatePath, |
| 412 | + remPath: remPath, | ||
| 413 | + queryTunnelDisplay: queryTunnelDisplay | ||
| 232 | }; | 414 | }; |
| 233 | }]); | 415 | }]); |
| 234 | }()); | 416 | }()); | ... | ... |
| ... | @@ -34,7 +34,6 @@ | ... | @@ -34,7 +34,6 @@ |
| 34 | glyphId: 'topo', | 34 | glyphId: 'topo', |
| 35 | tooltip: 'PCE web Topo Overlay', | 35 | tooltip: 'PCE web Topo Overlay', |
| 36 | 36 | ||
| 37 | - | ||
| 38 | activate: function () { | 37 | activate: function () { |
| 39 | $log.debug("PCE web topology overlay ACTIVATED"); | 38 | $log.debug("PCE web topology overlay ACTIVATED"); |
| 40 | }, | 39 | }, |
| ... | @@ -112,11 +111,32 @@ | ... | @@ -112,11 +111,32 @@ |
| 112 | }, | 111 | }, |
| 113 | 1: { | 112 | 1: { |
| 114 | cb: function () { | 113 | cb: function () { |
| 115 | - pps.setMode("shortest"); | 114 | + pps.setMode(); |
| 115 | + }, | ||
| 116 | + tt: 'Setup path', | ||
| 117 | + gid: 'plus' | ||
| 118 | + }, | ||
| 119 | + 2: { | ||
| 120 | + cb: function () { | ||
| 121 | + pps.updatePath(selection); | ||
| 116 | }, | 122 | }, |
| 117 | - tt: 'Select constraints for LSP', | 123 | + tt: 'Update path', |
| 118 | gid: '*jp' | 124 | gid: '*jp' |
| 119 | }, | 125 | }, |
| 126 | + 3: { | ||
| 127 | + cb: function () { | ||
| 128 | + pps.remPath(selection); | ||
| 129 | + }, | ||
| 130 | + tt: 'Remove path', | ||
| 131 | + gid: 'minus' | ||
| 132 | + }, | ||
| 133 | + 4: { | ||
| 134 | + cb: function () { | ||
| 135 | + pps.queryTunnelDisplay(); | ||
| 136 | + }, | ||
| 137 | + tt: 'Show Tunnels', | ||
| 138 | + gid: 'checkMark' | ||
| 139 | + }, | ||
| 120 | 0: { | 140 | 0: { |
| 121 | cb: function () { | 141 | cb: function () { |
| 122 | pps.clear(); | 142 | pps.clear(); |
| ... | @@ -126,7 +146,7 @@ | ... | @@ -126,7 +146,7 @@ |
| 126 | }, | 146 | }, |
| 127 | 147 | ||
| 128 | _keyOrder: [ | 148 | _keyOrder: [ |
| 129 | - 'openBracket', 'closeBracket', '1', '0' | 149 | + 'openBracket', 'closeBracket', '1', '2', '3', '4', '0' |
| 130 | ] | 150 | ] |
| 131 | }, | 151 | }, |
| 132 | hooks: { | 152 | hooks: { |
| ... | @@ -145,6 +165,9 @@ | ... | @@ -145,6 +165,9 @@ |
| 145 | }, | 165 | }, |
| 146 | single: function (data) { | 166 | single: function (data) { |
| 147 | selectionCallback(data); | 167 | selectionCallback(data); |
| 168 | + }, | ||
| 169 | + multi: function (selectOrder) { | ||
| 170 | + selectionCallback(selectOrder); | ||
| 148 | } | 171 | } |
| 149 | } | 172 | } |
| 150 | }; | 173 | }; | ... | ... |
| ... | @@ -21,6 +21,7 @@ | ... | @@ -21,6 +21,7 @@ |
| 21 | <groupId>org.onosproject</groupId> | 21 | <groupId>org.onosproject</groupId> |
| 22 | <artifactId>onos-apps</artifactId> | 22 | <artifactId>onos-apps</artifactId> |
| 23 | <version>1.6.0-SNAPSHOT</version> | 23 | <version>1.6.0-SNAPSHOT</version> |
| 24 | + <relativePath>../pom.xml</relativePath> | ||
| 24 | </parent> | 25 | </parent> |
| 25 | <modelVersion>4.0.0</modelVersion> | 26 | <modelVersion>4.0.0</modelVersion> |
| 26 | 27 | ... | ... |
protocols/bgp/api/pom.xml
100755 → 100644
| ... | @@ -23,6 +23,7 @@ | ... | @@ -23,6 +23,7 @@ |
| 23 | <groupId>org.onosproject</groupId> | 23 | <groupId>org.onosproject</groupId> |
| 24 | <artifactId>onos-bgp</artifactId> | 24 | <artifactId>onos-bgp</artifactId> |
| 25 | <version>1.6.0-SNAPSHOT</version> | 25 | <version>1.6.0-SNAPSHOT</version> |
| 26 | + <relativePath>../pom.xml</relativePath> | ||
| 26 | </parent> | 27 | </parent> |
| 27 | 28 | ||
| 28 | <artifactId>onos-bgp-api</artifactId> | 29 | <artifactId>onos-bgp-api</artifactId> | ... | ... |
protocols/bgp/bgpio/pom.xml
100755 → 100644
| ... | @@ -23,6 +23,7 @@ | ... | @@ -23,6 +23,7 @@ |
| 23 | <groupId>org.onosproject</groupId> | 23 | <groupId>org.onosproject</groupId> |
| 24 | <artifactId>onos-bgp</artifactId> | 24 | <artifactId>onos-bgp</artifactId> |
| 25 | <version>1.6.0-SNAPSHOT</version> | 25 | <version>1.6.0-SNAPSHOT</version> |
| 26 | + <relativePath>../pom.xml</relativePath> | ||
| 26 | </parent> | 27 | </parent> |
| 27 | 28 | ||
| 28 | <artifactId>onos-bgpio</artifactId> | 29 | <artifactId>onos-bgpio</artifactId> | ... | ... |
| ... | @@ -241,12 +241,11 @@ public class BgpUpdateMsgVer4 implements BgpUpdateMsg { | ... | @@ -241,12 +241,11 @@ public class BgpUpdateMsgVer4 implements BgpUpdateMsg { |
| 241 | afi = mpUnReach.afi(); | 241 | afi = mpUnReach.afi(); |
| 242 | safi = mpUnReach.safi(); | 242 | safi = mpUnReach.safi(); |
| 243 | } | 243 | } |
| 244 | + } | ||
| 244 | 245 | ||
| 245 | - if ((afi == Constants.AFI_FLOWSPEC_VALUE) && ((safi == Constants.SAFI_FLOWSPEC_VALUE) | 246 | + if ((afi == Constants.AFI_FLOWSPEC_VALUE) || (afi == Constants.AFI_VALUE)) { |
| 246 | - || (safi == Constants.VPN_SAFI_FLOWSPEC_VALUE))) { | 247 | + //unfeasible route length |
| 247 | - //unfeasible route length | 248 | + cb.writeShort(0); |
| 248 | - cb.writeShort(0); | ||
| 249 | - } | ||
| 250 | } | 249 | } |
| 251 | 250 | ||
| 252 | } | 251 | } | ... | ... |
| ... | @@ -171,15 +171,17 @@ public class As4Path implements BgpValueType { | ... | @@ -171,15 +171,17 @@ public class As4Path implements BgpValueType { |
| 171 | if ((as4pathSet != null) && (as4pathSeq != null)) { | 171 | if ((as4pathSet != null) && (as4pathSeq != null)) { |
| 172 | int iAsLenIndex = cb.writerIndex(); | 172 | int iAsLenIndex = cb.writerIndex(); |
| 173 | cb.writeByte(0); | 173 | cb.writeByte(0); |
| 174 | - cb.writeByte(AsPath.ASPATH_SEQ_TYPE); | 174 | + if (as4pathSeq.size() != 0) { |
| 175 | - cb.writeByte(as4pathSeq.size()); | 175 | + cb.writeByte(AsPath.ASPATH_SEQ_TYPE); |
| 176 | + cb.writeByte(as4pathSeq.size()); | ||
| 176 | 177 | ||
| 177 | - for (int j = 0; j < as4pathSeq.size(); j++) { | 178 | + for (int j = 0; j < as4pathSeq.size(); j++) { |
| 178 | - cb.writeInt(as4pathSeq.get(j)); | 179 | + cb.writeInt(as4pathSeq.get(j)); |
| 179 | - } | 180 | + } |
| 180 | 181 | ||
| 181 | - int asLen = cb.writerIndex() - iAsLenIndex; | 182 | + int asLen = cb.writerIndex() - iAsLenIndex; |
| 182 | - cb.setByte(iAsLenIndex, (byte) (asLen - 1)); | 183 | + cb.setByte(iAsLenIndex, (byte) (asLen - 1)); |
| 184 | + } | ||
| 183 | } else { | 185 | } else { |
| 184 | cb.writeByte(0); | 186 | cb.writeByte(0); |
| 185 | } | 187 | } | ... | ... |
| ... | @@ -208,15 +208,16 @@ public class AsPath implements BgpValueType { | ... | @@ -208,15 +208,16 @@ public class AsPath implements BgpValueType { |
| 208 | if (isaspathSet()) { | 208 | if (isaspathSet()) { |
| 209 | int iAsLenIndex = cb.writerIndex(); | 209 | int iAsLenIndex = cb.writerIndex(); |
| 210 | cb.writeByte(0); | 210 | cb.writeByte(0); |
| 211 | - cb.writeByte(ASPATH_SEQ_TYPE); | 211 | + if (aspathSeq.size() != 0) { |
| 212 | - cb.writeByte(aspathSeq.size()); | 212 | + cb.writeByte(ASPATH_SEQ_TYPE); |
| 213 | + cb.writeByte(aspathSeq.size()); | ||
| 213 | 214 | ||
| 214 | - for (int j = 0; j < aspathSeq.size(); j++) { | 215 | + for (int j = 0; j < aspathSeq.size(); j++) { |
| 215 | - cb.writeShort(aspathSeq.get(j)); | 216 | + cb.writeShort(aspathSeq.get(j)); |
| 217 | + } | ||
| 218 | + int asLen = cb.writerIndex() - iAsLenIndex; | ||
| 219 | + cb.setByte(iAsLenIndex, (byte) (asLen - 1)); | ||
| 216 | } | 220 | } |
| 217 | - | ||
| 218 | - int asLen = cb.writerIndex() - iAsLenIndex; | ||
| 219 | - cb.setByte(iAsLenIndex, (byte) (asLen - 1)); | ||
| 220 | } else { | 221 | } else { |
| 221 | cb.writeByte(0); | 222 | cb.writeByte(0); |
| 222 | } | 223 | } | ... | ... |
| ... | @@ -106,7 +106,7 @@ public class LinkStateAttributes implements BgpValueType { | ... | @@ -106,7 +106,7 @@ public class LinkStateAttributes implements BgpValueType { |
| 106 | * | 106 | * |
| 107 | * @param linkStateAttribList Linked list of Link, Node and Prefix TLVs | 107 | * @param linkStateAttribList Linked list of Link, Node and Prefix TLVs |
| 108 | */ | 108 | */ |
| 109 | - LinkStateAttributes(List<BgpValueType> linkStateAttribList) { | 109 | + public LinkStateAttributes(List<BgpValueType> linkStateAttribList) { |
| 110 | this.linkStateAttribList = linkStateAttribList; | 110 | this.linkStateAttribList = linkStateAttribList; |
| 111 | this.isLinkStateAttribute = true; | 111 | this.isLinkStateAttribute = true; |
| 112 | } | 112 | } | ... | ... |
| ... | @@ -163,7 +163,6 @@ public class WideCommunityAttrHeader implements BgpValueType { | ... | @@ -163,7 +163,6 @@ public class WideCommunityAttrHeader implements BgpValueType { |
| 163 | c.writeShort(TYPE); | 163 | c.writeShort(TYPE); |
| 164 | c.writeByte(flag); | 164 | c.writeByte(flag); |
| 165 | c.writeByte(hopCount); | 165 | c.writeByte(hopCount); |
| 166 | - c.writeShort(length); | ||
| 167 | return c.writerIndex() - iLenStartIndex; | 166 | return c.writerIndex() - iLenStartIndex; |
| 168 | } | 167 | } |
| 169 | 168 | ... | ... |
| ... | @@ -97,8 +97,8 @@ public class WideCommunityIpV4Neighbour implements BgpValueType { | ... | @@ -97,8 +97,8 @@ public class WideCommunityIpV4Neighbour implements BgpValueType { |
| 97 | while (listIterator.hasNext()) { | 97 | while (listIterator.hasNext()) { |
| 98 | IpV4Neighbour speaker = listIterator.next(); | 98 | IpV4Neighbour speaker = listIterator.next(); |
| 99 | if (speaker instanceof IpV4Neighbour) { | 99 | if (speaker instanceof IpV4Neighbour) { |
| 100 | - c.writeInt(Integer.valueOf(speaker.localSpeaker.toString())); | 100 | + c.writeBytes(speaker.localSpeaker().toOctets()); |
| 101 | - c.writeInt(Integer.valueOf(speaker.remoteSpeaker.toString())); | 101 | + c.writeBytes(speaker.remoteSpeaker().toOctets()); |
| 102 | } | 102 | } |
| 103 | } | 103 | } |
| 104 | 104 | ... | ... |
| ... | @@ -96,7 +96,7 @@ public final class BgpLinkAttrMaxLinkBandwidth implements BgpValueType { | ... | @@ -96,7 +96,7 @@ public final class BgpLinkAttrMaxLinkBandwidth implements BgpValueType { |
| 96 | * | 96 | * |
| 97 | * @return Maximum link bandwidth | 97 | * @return Maximum link bandwidth |
| 98 | */ | 98 | */ |
| 99 | - float linkAttrMaxLinkBandwidth() { | 99 | + public float linkAttrMaxLinkBandwidth() { |
| 100 | return maxBandwidth; | 100 | return maxBandwidth; |
| 101 | } | 101 | } |
| 102 | 102 | ... | ... |
| ... | @@ -43,10 +43,10 @@ import java.util.Objects; | ... | @@ -43,10 +43,10 @@ import java.util.Objects; |
| 43 | public class WideCommunity implements BgpValueType { | 43 | public class WideCommunity implements BgpValueType { |
| 44 | 44 | ||
| 45 | private static final Logger log = LoggerFactory.getLogger(WideCommunity.class); | 45 | private static final Logger log = LoggerFactory.getLogger(WideCommunity.class); |
| 46 | - public static final byte TYPE = (byte) 254; /* TODO: IANA Assigned */ | 46 | + public static final byte TYPE = (byte) 129; |
| 47 | public static final short LENGTH = 4; | 47 | public static final short LENGTH = 4; |
| 48 | public static final byte TYPE_LENGTH_SIZE = 3; | 48 | public static final byte TYPE_LENGTH_SIZE = 3; |
| 49 | - public static final byte FLAGS = (byte) 0x40; | 49 | + public static final byte FLAGS = (byte) 0x90; |
| 50 | private WideCommunityAttrHeader wideCommunityHeader; | 50 | private WideCommunityAttrHeader wideCommunityHeader; |
| 51 | private int community; | 51 | private int community; |
| 52 | private int localAsn; | 52 | private int localAsn; |
| ... | @@ -238,6 +238,9 @@ public class WideCommunity implements BgpValueType { | ... | @@ -238,6 +238,9 @@ public class WideCommunity implements BgpValueType { |
| 238 | 238 | ||
| 239 | wideCommunityHeader.write(c); | 239 | wideCommunityHeader.write(c); |
| 240 | 240 | ||
| 241 | + int iComLengthIndex = c.writerIndex(); | ||
| 242 | + c.writeShort(0); | ||
| 243 | + | ||
| 241 | c.writeInt(community); | 244 | c.writeInt(community); |
| 242 | c.writeInt(localAsn); | 245 | c.writeInt(localAsn); |
| 243 | c.writeInt(contextAsn); | 246 | c.writeInt(contextAsn); |
| ... | @@ -275,6 +278,9 @@ public class WideCommunity implements BgpValueType { | ... | @@ -275,6 +278,9 @@ public class WideCommunity implements BgpValueType { |
| 275 | c.setShort(iTargetLenIndex, (short) (length - 2)); | 278 | c.setShort(iTargetLenIndex, (short) (length - 2)); |
| 276 | } | 279 | } |
| 277 | 280 | ||
| 281 | + length = c.writerIndex() - iComLengthIndex; | ||
| 282 | + c.setShort(iComLengthIndex, (short) (length - 2)); | ||
| 283 | + | ||
| 278 | length = c.writerIndex() - iLengthIndex; | 284 | length = c.writerIndex() - iLengthIndex; |
| 279 | c.setShort(iLengthIndex, (short) (length - 2)); | 285 | c.setShort(iLengthIndex, (short) (length - 2)); |
| 280 | 286 | ... | ... |
protocols/bgp/ctl/pom.xml
100755 → 100644
| ... | @@ -46,6 +46,11 @@ | ... | @@ -46,6 +46,11 @@ |
| 46 | <groupId>org.osgi</groupId> | 46 | <groupId>org.osgi</groupId> |
| 47 | <artifactId>org.osgi.compendium</artifactId> | 47 | <artifactId>org.osgi.compendium</artifactId> |
| 48 | </dependency> | 48 | </dependency> |
| 49 | + <dependency> | ||
| 50 | + <groupId>io.netty</groupId> | ||
| 51 | + <artifactId>netty-common</artifactId> | ||
| 52 | + <version>4.0.36.Final</version> | ||
| 53 | + </dependency> | ||
| 49 | </dependencies> | 54 | </dependencies> |
| 50 | 55 | ||
| 51 | <build> | 56 | <build> | ... | ... |
| ... | @@ -205,7 +205,7 @@ public class BgpConfig implements BgpCfg { | ... | @@ -205,7 +205,7 @@ public class BgpConfig implements BgpCfg { |
| 205 | lspeer.setSelfInnitConnection(true); | 205 | lspeer.setSelfInnitConnection(true); |
| 206 | 206 | ||
| 207 | if (lspeer.connectPeer() == null) { | 207 | if (lspeer.connectPeer() == null) { |
| 208 | - connectPeer = new BgpConnectPeerImpl(bgpController, routerid, Controller.getBgpPortNum()); | 208 | + connectPeer = new BgpConnectPeerImpl(bgpController, routerid, Controller.BGP_PORT_NUM); |
| 209 | lspeer.setConnectPeer(connectPeer); | 209 | lspeer.setConnectPeer(connectPeer); |
| 210 | connectPeer.connectPeer(); | 210 | connectPeer.connectPeer(); |
| 211 | } | 211 | } | ... | ... |
protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpLocalRibImpl.java
100755 → 100644
| ... | @@ -135,7 +135,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { | ... | @@ -135,7 +135,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { |
| 135 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); | 135 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); |
| 136 | // Compare local RIB entry with the current attribute | 136 | // Compare local RIB entry with the current attribute |
| 137 | decisionResult = selectionAlgo.compare(nodeTree.get(nodeLsIdentifier), detailsLocRib); | 137 | decisionResult = selectionAlgo.compare(nodeTree.get(nodeLsIdentifier), detailsLocRib); |
| 138 | - if (decisionResult < 0) { | 138 | + if (decisionResult <= 0) { |
| 139 | for (BgpNodeListener l : bgpController.listener()) { | 139 | for (BgpNodeListener l : bgpController.listener()) { |
| 140 | l.addNode((BgpNodeLSNlriVer4) nlri, details); | 140 | l.addNode((BgpNodeLSNlriVer4) nlri, details); |
| 141 | } | 141 | } |
| ... | @@ -155,7 +155,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { | ... | @@ -155,7 +155,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { |
| 155 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); | 155 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); |
| 156 | // Compare local RIB entry with the current attribute | 156 | // Compare local RIB entry with the current attribute |
| 157 | decisionResult = selectionAlgo.compare(linkTree.get(linkLsIdentifier), detailsLocRib); | 157 | decisionResult = selectionAlgo.compare(linkTree.get(linkLsIdentifier), detailsLocRib); |
| 158 | - if (decisionResult < 0) { | 158 | + if (decisionResult <= 0) { |
| 159 | linkTree.replace(linkLsIdentifier, detailsLocRib); | 159 | linkTree.replace(linkLsIdentifier, detailsLocRib); |
| 160 | for (BgpLinkListener l : bgpController.linkListener()) { | 160 | for (BgpLinkListener l : bgpController.linkListener()) { |
| 161 | l.addLink((BgpLinkLsNlriVer4) nlri, details); | 161 | l.addLink((BgpLinkLsNlriVer4) nlri, details); |
| ... | @@ -175,7 +175,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { | ... | @@ -175,7 +175,7 @@ public class BgpLocalRibImpl implements BgpLocalRib { |
| 175 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); | 175 | BgpSelectionAlgo selectionAlgo = new BgpSelectionAlgo(); |
| 176 | // Compare local RIB entry with the current attribute | 176 | // Compare local RIB entry with the current attribute |
| 177 | decisionResult = selectionAlgo.compare(prefixTree.get(prefixIdentifier), detailsLocRib); | 177 | decisionResult = selectionAlgo.compare(prefixTree.get(prefixIdentifier), detailsLocRib); |
| 178 | - if (decisionResult < 0) { | 178 | + if (decisionResult <= 0) { |
| 179 | prefixTree.replace(prefixIdentifier, detailsLocRib); | 179 | prefixTree.replace(prefixIdentifier, detailsLocRib); |
| 180 | log.debug("Local RIB update prefix: {}", detailsLocRib.toString()); | 180 | log.debug("Local RIB update prefix: {}", detailsLocRib.toString()); |
| 181 | } | 181 | } | ... | ... |
| ... | @@ -159,15 +159,16 @@ public class BgpPeerImpl implements BgpPeer { | ... | @@ -159,15 +159,16 @@ public class BgpPeerImpl implements BgpPeer { |
| 159 | * Send flow specification update message to peer. | 159 | * Send flow specification update message to peer. |
| 160 | * | 160 | * |
| 161 | * @param operType operation type | 161 | * @param operType operation type |
| 162 | + * @param routeKey flow rule key | ||
| 162 | * @param flowSpec flow specification details | 163 | * @param flowSpec flow specification details |
| 163 | - * @param wideCommunity for route policy | 164 | + * @param wideCommunity for route policy |
| 164 | */ | 165 | */ |
| 165 | public final void sendFlowSpecUpdateMessageToPeer(FlowSpecOperation operType, BgpFlowSpecRouteKey routeKey, | 166 | public final void sendFlowSpecUpdateMessageToPeer(FlowSpecOperation operType, BgpFlowSpecRouteKey routeKey, |
| 166 | BgpFlowSpecNlri flowSpec, WideCommunity wideCommunity) { | 167 | BgpFlowSpecNlri flowSpec, WideCommunity wideCommunity) { |
| 167 | 168 | ||
| 168 | List<BgpValueType> attributesList = new LinkedList<>(); | 169 | List<BgpValueType> attributesList = new LinkedList<>(); |
| 169 | byte sessionType = sessionInfo.isIbgpSession() ? (byte) 0 : (byte) 1; | 170 | byte sessionType = sessionInfo.isIbgpSession() ? (byte) 0 : (byte) 1; |
| 170 | - byte sAfi = Constants.VPN_SAFI_FLOWSPEC_VALUE; | 171 | + byte sAfi = Constants.SAFI_FLOWSPEC_VALUE; |
| 171 | 172 | ||
| 172 | boolean isFsCapabilitySet = isCapabilitySupported(MultiProtocolExtnCapabilityTlv.TYPE, | 173 | boolean isFsCapabilitySet = isCapabilitySupported(MultiProtocolExtnCapabilityTlv.TYPE, |
| 173 | Constants.AFI_FLOWSPEC_VALUE, | 174 | Constants.AFI_FLOWSPEC_VALUE, |
| ... | @@ -190,10 +191,10 @@ public class BgpPeerImpl implements BgpPeer { | ... | @@ -190,10 +191,10 @@ public class BgpPeerImpl implements BgpPeer { |
| 190 | return; | 191 | return; |
| 191 | } | 192 | } |
| 192 | 193 | ||
| 193 | - if ((wideCommunity != null) && (isVpnRpdCapabilitySet)) { | 194 | + if (isVpnFsCapabilitySet) { |
| 194 | - sAfi = Constants.VPN_SAFI_FLOWSPEC_RDP_VALUE; | ||
| 195 | - } else if (isVpnFsCapabilitySet) { | ||
| 196 | sAfi = Constants.VPN_SAFI_FLOWSPEC_VALUE; | 195 | sAfi = Constants.VPN_SAFI_FLOWSPEC_VALUE; |
| 196 | + } else if (isVpnRpdCapabilitySet) { | ||
| 197 | + sAfi = Constants.VPN_SAFI_FLOWSPEC_RDP_VALUE; | ||
| 197 | } | 198 | } |
| 198 | attributesList.add(new Origin((byte) 0)); | 199 | attributesList.add(new Origin((byte) 0)); |
| 199 | 200 | ||
| ... | @@ -222,7 +223,9 @@ public class BgpPeerImpl implements BgpPeer { | ... | @@ -222,7 +223,9 @@ public class BgpPeerImpl implements BgpPeer { |
| 222 | } | 223 | } |
| 223 | 224 | ||
| 224 | attributesList.add(new BgpExtendedCommunity(flowSpec.fsActionTlv())); | 225 | attributesList.add(new BgpExtendedCommunity(flowSpec.fsActionTlv())); |
| 225 | - attributesList.add(wideCommunity); | 226 | + if (wideCommunity != null) { |
| 227 | + attributesList.add(wideCommunity); | ||
| 228 | + } | ||
| 226 | 229 | ||
| 227 | if (operType == FlowSpecOperation.ADD) { | 230 | if (operType == FlowSpecOperation.ADD) { |
| 228 | attributesList.add(new MpReachNlri(flowSpec, Constants.AFI_FLOWSPEC_VALUE, sAfi)); | 231 | attributesList.add(new MpReachNlri(flowSpec, Constants.AFI_FLOWSPEC_VALUE, sAfi)); | ... | ... |
| ... | @@ -16,7 +16,7 @@ | ... | @@ -16,7 +16,7 @@ |
| 16 | package org.onosproject.bgp.controller.impl; | 16 | package org.onosproject.bgp.controller.impl; |
| 17 | 17 | ||
| 18 | import static org.onlab.util.Tools.groupedThreads; | 18 | import static org.onlab.util.Tools.groupedThreads; |
| 19 | - | 19 | +import io.netty.util.internal.PlatformDependent; |
| 20 | import java.lang.management.ManagementFactory; | 20 | import java.lang.management.ManagementFactory; |
| 21 | import java.lang.management.RuntimeMXBean; | 21 | import java.lang.management.RuntimeMXBean; |
| 22 | import java.net.InetSocketAddress; | 22 | import java.net.InetSocketAddress; |
| ... | @@ -53,9 +53,11 @@ public class Controller { | ... | @@ -53,9 +53,11 @@ public class Controller { |
| 53 | public Channel serverChannel; | 53 | public Channel serverChannel; |
| 54 | 54 | ||
| 55 | // Configuration options | 55 | // Configuration options |
| 56 | - private static final short BGP_PORT_NUM = 179; | 56 | + protected static final short BGP_PORT_NUM = 179; |
| 57 | + private static final short BGP_PRIVILEGED_PORT = 1790; // server port used for non root users in linux | ||
| 57 | private static final short PORT_NUM_ZERO = 0; | 58 | private static final short PORT_NUM_ZERO = 0; |
| 58 | private static boolean isPortNumSet = false; | 59 | private static boolean isPortNumSet = false; |
| 60 | + private static short portNumber = BGP_PORT_NUM; | ||
| 59 | private final int workerThreads = 16; | 61 | private final int workerThreads = 16; |
| 60 | private final int peerWorkerThreads = 16; | 62 | private final int peerWorkerThreads = 16; |
| 61 | 63 | ||
| ... | @@ -219,6 +221,11 @@ public class Controller { | ... | @@ -219,6 +221,11 @@ public class Controller { |
| 219 | */ | 221 | */ |
| 220 | public void start() { | 222 | public void start() { |
| 221 | log.info("Started"); | 223 | log.info("Started"); |
| 224 | + if (!PlatformDependent.isWindows() && !PlatformDependent.isRoot()) { | ||
| 225 | + portNumber = BGP_PRIVILEGED_PORT; | ||
| 226 | + } else { | ||
| 227 | + portNumber = BGP_PORT_NUM; | ||
| 228 | + } | ||
| 222 | this.init(); | 229 | this.init(); |
| 223 | this.run(); | 230 | this.run(); |
| 224 | } | 231 | } |
| ... | @@ -242,7 +249,8 @@ public class Controller { | ... | @@ -242,7 +249,8 @@ public class Controller { |
| 242 | if (isPortNumSet) { | 249 | if (isPortNumSet) { |
| 243 | return PORT_NUM_ZERO; | 250 | return PORT_NUM_ZERO; |
| 244 | } | 251 | } |
| 245 | - return BGP_PORT_NUM; | 252 | + |
| 253 | + return portNumber; | ||
| 246 | } | 254 | } |
| 247 | 255 | ||
| 248 | /** | 256 | /** | ... | ... |
| 1 | COMPILE_DEPS = [ | 1 | COMPILE_DEPS = [ |
| 2 | '//lib:CORE_DEPS', | 2 | '//lib:CORE_DEPS', |
| 3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | 3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', |
| 4 | + '//apps/pcep-api:onos-apps-pcep-api', | ||
| 5 | + '//incubator/api:onos-incubator-api', | ||
| 4 | ] | 6 | ] |
| 5 | 7 | ||
| 6 | osgi_jar_with_tests ( | 8 | osgi_jar_with_tests ( | ... | ... |
| ... | @@ -23,6 +23,7 @@ | ... | @@ -23,6 +23,7 @@ |
| 23 | <groupId>org.onosproject</groupId> | 23 | <groupId>org.onosproject</groupId> |
| 24 | <artifactId>onos-pcep-controller</artifactId> | 24 | <artifactId>onos-pcep-controller</artifactId> |
| 25 | <version>1.6.0-SNAPSHOT</version> | 25 | <version>1.6.0-SNAPSHOT</version> |
| 26 | + <relativePath>../pom.xml</relativePath> | ||
| 26 | </parent> | 27 | </parent> |
| 27 | 28 | ||
| 28 | <artifactId>onos-pcep-controller-api</artifactId> | 29 | <artifactId>onos-pcep-controller-api</artifactId> |
| ... | @@ -51,5 +52,9 @@ | ... | @@ -51,5 +52,9 @@ |
| 51 | <groupId>org.onosproject</groupId> | 52 | <groupId>org.onosproject</groupId> |
| 52 | <artifactId>onlab-misc</artifactId> | 53 | <artifactId>onlab-misc</artifactId> |
| 53 | </dependency> | 54 | </dependency> |
| 55 | + <dependency> | ||
| 56 | + <groupId>org.onosproject</groupId> | ||
| 57 | + <artifactId>onos-incubator-api</artifactId> | ||
| 58 | + </dependency> | ||
| 54 | </dependencies> | 59 | </dependencies> |
| 55 | </project> | 60 | </project> | ... | ... |
| ... | @@ -26,6 +26,8 @@ public class ClientCapability { | ... | @@ -26,6 +26,8 @@ public class ClientCapability { |
| 26 | private boolean pceccCapability; | 26 | private boolean pceccCapability; |
| 27 | private boolean statefulPceCapability; | 27 | private boolean statefulPceCapability; |
| 28 | private boolean pcInstantiationCapability; | 28 | private boolean pcInstantiationCapability; |
| 29 | + private boolean labelStackCapability; | ||
| 30 | + private boolean srCapability; | ||
| 29 | 31 | ||
| 30 | /** | 32 | /** |
| 31 | * Creates new instance of client capability. | 33 | * Creates new instance of client capability. |
| ... | @@ -33,11 +35,34 @@ public class ClientCapability { | ... | @@ -33,11 +35,34 @@ public class ClientCapability { |
| 33 | * @param pceccCapability represents PCECC capability | 35 | * @param pceccCapability represents PCECC capability |
| 34 | * @param statefulPceCapability represents stateful PCE capability | 36 | * @param statefulPceCapability represents stateful PCE capability |
| 35 | * @param pcInstantiationCapability represents PC initiation capability | 37 | * @param pcInstantiationCapability represents PC initiation capability |
| 38 | + * @param labelStackCapability represents S bit is set in PCECC capability | ||
| 39 | + * @param srCapability represents SR capability | ||
| 36 | */ | 40 | */ |
| 37 | - public ClientCapability(boolean pceccCapability, boolean statefulPceCapability, boolean pcInstantiationCapability) { | 41 | + public ClientCapability(boolean pceccCapability, boolean statefulPceCapability, boolean pcInstantiationCapability, |
| 42 | + boolean labelStackCapability, boolean srCapability) { | ||
| 38 | this.pceccCapability = pceccCapability; | 43 | this.pceccCapability = pceccCapability; |
| 39 | this.statefulPceCapability = statefulPceCapability; | 44 | this.statefulPceCapability = statefulPceCapability; |
| 40 | this.pcInstantiationCapability = pcInstantiationCapability; | 45 | this.pcInstantiationCapability = pcInstantiationCapability; |
| 46 | + this.labelStackCapability = labelStackCapability; | ||
| 47 | + this.srCapability = srCapability; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Obtains label stack capability. | ||
| 52 | + * | ||
| 53 | + * @return true if client supports PCECC capability with S bit set otherwise false | ||
| 54 | + */ | ||
| 55 | + public boolean labelStackCapability() { | ||
| 56 | + return labelStackCapability; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + /** | ||
| 60 | + * Obtains segment routing capability. | ||
| 61 | + * | ||
| 62 | + * @return true if client supports SR capability otherwise false | ||
| 63 | + */ | ||
| 64 | + public boolean srCapability() { | ||
| 65 | + return srCapability; | ||
| 41 | } | 66 | } |
| 42 | 67 | ||
| 43 | /** | 68 | /** |
| ... | @@ -69,7 +94,8 @@ public class ClientCapability { | ... | @@ -69,7 +94,8 @@ public class ClientCapability { |
| 69 | 94 | ||
| 70 | @Override | 95 | @Override |
| 71 | public int hashCode() { | 96 | public int hashCode() { |
| 72 | - return Objects.hash(pceccCapability, statefulPceCapability, pcInstantiationCapability); | 97 | + return Objects.hash(pceccCapability, statefulPceCapability, pcInstantiationCapability, labelStackCapability, |
| 98 | + srCapability); | ||
| 73 | } | 99 | } |
| 74 | 100 | ||
| 75 | @Override | 101 | @Override |
| ... | @@ -81,7 +107,9 @@ public class ClientCapability { | ... | @@ -81,7 +107,9 @@ public class ClientCapability { |
| 81 | ClientCapability other = (ClientCapability) obj; | 107 | ClientCapability other = (ClientCapability) obj; |
| 82 | return Objects.equals(pceccCapability, other.pceccCapability) | 108 | return Objects.equals(pceccCapability, other.pceccCapability) |
| 83 | && Objects.equals(statefulPceCapability, other.statefulPceCapability) | 109 | && Objects.equals(statefulPceCapability, other.statefulPceCapability) |
| 84 | - && Objects.equals(pcInstantiationCapability, other.pcInstantiationCapability); | 110 | + && Objects.equals(pcInstantiationCapability, other.pcInstantiationCapability) |
| 111 | + && Objects.equals(labelStackCapability, other.labelStackCapability) | ||
| 112 | + && Objects.equals(srCapability, other.srCapability); | ||
| 85 | } | 113 | } |
| 86 | return false; | 114 | return false; |
| 87 | } | 115 | } |
| ... | @@ -92,6 +120,8 @@ public class ClientCapability { | ... | @@ -92,6 +120,8 @@ public class ClientCapability { |
| 92 | .add("pceccCapability", pceccCapability) | 120 | .add("pceccCapability", pceccCapability) |
| 93 | .add("statefulPceCapability", statefulPceCapability) | 121 | .add("statefulPceCapability", statefulPceCapability) |
| 94 | .add("pcInstantiationCapability", pcInstantiationCapability) | 122 | .add("pcInstantiationCapability", pcInstantiationCapability) |
| 123 | + .add("labelStackCapability", labelStackCapability) | ||
| 124 | + .add("srCapability", srCapability) | ||
| 95 | .toString(); | 125 | .toString(); |
| 96 | } | 126 | } |
| 97 | } | 127 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.pcep.controller; | ||
| 17 | + | ||
| 18 | +import java.util.Objects; | ||
| 19 | + | ||
| 20 | +import com.google.common.base.MoreObjects; | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | + * Representation of LSP info, it will be unique for each LSP. | ||
| 24 | + */ | ||
| 25 | +public class LspKey { | ||
| 26 | + private int plspId; | ||
| 27 | + private short localLspId; | ||
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * Creates new instance of LspInfo. | ||
| 31 | + * | ||
| 32 | + * @param plspId LSP id assigned per tunnel per session | ||
| 33 | + * @param localLspId LSP id assigned per tunnel | ||
| 34 | + */ | ||
| 35 | + public LspKey(int plspId, short localLspId) { | ||
| 36 | + this.plspId = plspId; | ||
| 37 | + this.localLspId = localLspId; | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Obtains PLSP id. | ||
| 42 | + * | ||
| 43 | + * @return LSP id assigned per tunnel per session | ||
| 44 | + */ | ||
| 45 | + public int plspId() { | ||
| 46 | + return plspId; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Obtains local LSP id. | ||
| 51 | + * | ||
| 52 | + * @return LSP id assigned per tunnel | ||
| 53 | + */ | ||
| 54 | + public short localLspId() { | ||
| 55 | + return localLspId; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + @Override | ||
| 59 | + public int hashCode() { | ||
| 60 | + return Objects.hash(plspId, localLspId); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + @Override | ||
| 64 | + public boolean equals(Object obj) { | ||
| 65 | + if (this == obj) { | ||
| 66 | + return true; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + if (obj instanceof LspKey) { | ||
| 70 | + LspKey other = (LspKey) obj; | ||
| 71 | + return Objects.equals(plspId, other.plspId) | ||
| 72 | + && Objects.equals(localLspId, other.localLspId); | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + return false; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + @Override | ||
| 79 | + public String toString() { | ||
| 80 | + return MoreObjects.toStringHelper(getClass()) | ||
| 81 | + .add("plspId", plspId) | ||
| 82 | + .add("localLspId", localLspId) | ||
| 83 | + .toString(); | ||
| 84 | + } | ||
| 85 | +} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -19,6 +19,7 @@ import java.util.List; | ... | @@ -19,6 +19,7 @@ import java.util.List; |
| 19 | 19 | ||
| 20 | import org.onosproject.pcepio.protocol.PcepFactory; | 20 | import org.onosproject.pcepio.protocol.PcepFactory; |
| 21 | import org.onosproject.pcepio.protocol.PcepMessage; | 21 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 22 | +import org.onosproject.pcepio.protocol.PcepStateReport; | ||
| 22 | 23 | ||
| 23 | /** | 24 | /** |
| 24 | * Represents to provider facing side of a path computation client(pcc). | 25 | * Represents to provider facing side of a path computation client(pcc). |
| ... | @@ -135,4 +136,64 @@ public interface PcepClient { | ... | @@ -135,4 +136,64 @@ public interface PcepClient { |
| 135 | * @return capability supported by client | 136 | * @return capability supported by client |
| 136 | */ | 137 | */ |
| 137 | ClientCapability capability(); | 138 | ClientCapability capability(); |
| 139 | + | ||
| 140 | + /** | ||
| 141 | + * Adds PCEP device when session is successfully established. | ||
| 142 | + * | ||
| 143 | + * @param pc PCEP client details | ||
| 144 | + */ | ||
| 145 | + void addNode(PcepClient pc); | ||
| 146 | + | ||
| 147 | + /** | ||
| 148 | + * Removes PCEP device when session is disconnected. | ||
| 149 | + * | ||
| 150 | + * @param pccId PCEP client ID | ||
| 151 | + */ | ||
| 152 | + void deleteNode(PccId pccId); | ||
| 153 | + | ||
| 154 | + /** | ||
| 155 | + * Sets D flag for the given LSP and its LSP info. | ||
| 156 | + * | ||
| 157 | + * @param lspKey contains LSP info | ||
| 158 | + * @param dFlag delegation flag in LSP object | ||
| 159 | + */ | ||
| 160 | + void setLspAndDelegationInfo(LspKey lspKey, boolean dFlag); | ||
| 161 | + | ||
| 162 | + /** | ||
| 163 | + * Returns delegation flag for the given LSP info. | ||
| 164 | + * | ||
| 165 | + * @param lspKey contains LSP info | ||
| 166 | + * @return delegation flag | ||
| 167 | + */ | ||
| 168 | + Boolean delegationInfo(LspKey lspKey); | ||
| 169 | + | ||
| 170 | + /** | ||
| 171 | + * Creates a temporary cache to hold report messages received during LSPDB sync. | ||
| 172 | + * | ||
| 173 | + * @param pccId PCC id which is the key to store report messages | ||
| 174 | + */ | ||
| 175 | + void initializeSyncMsgList(PccId pccId); | ||
| 176 | + | ||
| 177 | + /** | ||
| 178 | + * Returns the list of report messages received during LSPDB sync. | ||
| 179 | + * | ||
| 180 | + * @param pccId PCC id which is the key for all the report messages | ||
| 181 | + * @return list of report messages received during LSPDB sync | ||
| 182 | + */ | ||
| 183 | + List<PcepStateReport> getSyncMsgList(PccId pccId); | ||
| 184 | + | ||
| 185 | + /** | ||
| 186 | + * Removes the list of report messages received during LSPDB sync. | ||
| 187 | + * | ||
| 188 | + * @param pccId PCC id which is the key for all the report messages | ||
| 189 | + */ | ||
| 190 | + void removeSyncMsgList(PccId pccId); | ||
| 191 | + | ||
| 192 | + /** | ||
| 193 | + * Adds report message received during LSPDB sync into temporary cache. | ||
| 194 | + * | ||
| 195 | + * @param pccId PCC id which is the key to store report messages | ||
| 196 | + * @param rptMsg the report message to be stored | ||
| 197 | + */ | ||
| 198 | + void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg); | ||
| 138 | } | 199 | } | ... | ... |
| ... | @@ -57,7 +57,7 @@ public interface PcepClientController { | ... | @@ -57,7 +57,7 @@ public interface PcepClientController { |
| 57 | void removeListener(PcepClientListener listener); | 57 | void removeListener(PcepClientListener listener); |
| 58 | 58 | ||
| 59 | /** | 59 | /** |
| 60 | - * Register a listener for OF msg events. | 60 | + * Register a listener for PCEP msg events. |
| 61 | * | 61 | * |
| 62 | * @param listener the listener to notify | 62 | * @param listener the listener to notify |
| 63 | */ | 63 | */ |
| ... | @@ -71,6 +71,34 @@ public interface PcepClientController { | ... | @@ -71,6 +71,34 @@ public interface PcepClientController { |
| 71 | void removeEventListener(PcepEventListener listener); | 71 | void removeEventListener(PcepEventListener listener); |
| 72 | 72 | ||
| 73 | /** | 73 | /** |
| 74 | + * Register a listener for PCEP msg events[carrying node descriptor details]. | ||
| 75 | + * | ||
| 76 | + * @param listener the listener to notify | ||
| 77 | + */ | ||
| 78 | + void addNodeListener(PcepNodeListener listener); | ||
| 79 | + | ||
| 80 | + /** | ||
| 81 | + * Unregister a listener. | ||
| 82 | + * | ||
| 83 | + * @param listener the listener to be unregistered | ||
| 84 | + */ | ||
| 85 | + void removeNodeListener(PcepNodeListener listener); | ||
| 86 | + | ||
| 87 | + /** | ||
| 88 | + * Register a listener for packet events. | ||
| 89 | + * | ||
| 90 | + * @param listener the listener to notify | ||
| 91 | + */ | ||
| 92 | + void addPacketListener(PcepPacketListener listener); | ||
| 93 | + | ||
| 94 | + /** | ||
| 95 | + * Unregister a packet listener. | ||
| 96 | + * | ||
| 97 | + * @param listener the listener to unregister | ||
| 98 | + */ | ||
| 99 | + void removePacketListener(PcepPacketListener listener); | ||
| 100 | + | ||
| 101 | + /** | ||
| 74 | * Send a message to a particular pcc client. | 102 | * Send a message to a particular pcc client. |
| 75 | * | 103 | * |
| 76 | * @param pccId the id of the client to send message. | 104 | * @param pccId the id of the client to send message. | ... | ... |
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.pcep.controller; | 16 | package org.onosproject.pcep.controller; |
| 17 | 17 | ||
| 18 | +import org.onosproject.incubator.net.tunnel.Tunnel; | ||
| 18 | import org.onosproject.pcepio.protocol.PcepMessage; | 19 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 19 | /** | 20 | /** |
| 20 | * Notifies providers about PCEP message events. | 21 | * Notifies providers about PCEP message events. |
| ... | @@ -28,4 +29,21 @@ public interface PcepEventListener { | ... | @@ -28,4 +29,21 @@ public interface PcepEventListener { |
| 28 | * @param msg the message | 29 | * @param msg the message |
| 29 | */ | 30 | */ |
| 30 | void handleMessage(PccId pccId, PcepMessage msg); | 31 | void handleMessage(PccId pccId, PcepMessage msg); |
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * Handles end of LSPDB sync actions. | ||
| 35 | + * | ||
| 36 | + * @param tunnel the tunnel on which action needs to be taken | ||
| 37 | + * @param endOfSyncAction the action that needs to be taken for the tunnel | ||
| 38 | + */ | ||
| 39 | + void handleEndOfSyncAction(Tunnel tunnel, PcepLspSyncAction endOfSyncAction); | ||
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * Handles sending PCEP message to client on end of LSPDB sync. | ||
| 43 | + * | ||
| 44 | + * @param pccId id of the pcc | ||
| 45 | + * @param msg the message to be sent | ||
| 46 | + * @param endOfSyncAction the action that needs to be taken in the message | ||
| 47 | + */ | ||
| 48 | + void handleEndOfSyncAction(PccId pccId, PcepMessage msg, PcepLspSyncAction endOfSyncAction); | ||
| 31 | } | 49 | } | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.pcep.controller; | ||
| 17 | + | ||
| 18 | +/** | ||
| 19 | + * Representation of actions to be taken for LSPs on end of LSP-DB sync. | ||
| 20 | + */ | ||
| 21 | +public enum PcepLspSyncAction { | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * Specifies that delete message for PCE intiiated tunnel should be sent. | ||
| 25 | + */ | ||
| 26 | + SEND_DELETE(0), | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * Specifies that update message should be sent. | ||
| 30 | + */ | ||
| 31 | + SEND_UPDATE(1), | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * Specifies that the tunnel should be removed from PCE. | ||
| 35 | + */ | ||
| 36 | + REMOVE(2), | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * Specifies that the status of the tunnel should be set as unstable. | ||
| 40 | + */ | ||
| 41 | + UNSTABLE(3); | ||
| 42 | + | ||
| 43 | + int value; | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * Assigns val with the value for actions to be taken for LSPs on end of LSP-DB sync. | ||
| 47 | + * | ||
| 48 | + * @param val sync status | ||
| 49 | + */ | ||
| 50 | + PcepLspSyncAction(int val) { | ||
| 51 | + value = val; | ||
| 52 | + } | ||
| 53 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.pcep.controller; | ||
| 17 | + | ||
| 18 | +/** | ||
| 19 | + * Notifies providers about PCEP node events. | ||
| 20 | + */ | ||
| 21 | +public interface PcepNodeListener { | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * Notifies that the node was added. | ||
| 25 | + * | ||
| 26 | + * @param pc PCEP client details | ||
| 27 | + */ | ||
| 28 | + void addNode(PcepClient pc); | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * Notifies that the node was removed. | ||
| 32 | + * | ||
| 33 | + * @param pccId PCEP client ID | ||
| 34 | + */ | ||
| 35 | + void deleteNode(PccId pccId); | ||
| 36 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.pcep.controller; | ||
| 17 | + | ||
| 18 | +public interface PcepPacketListener { | ||
| 19 | + | ||
| 20 | + void sendPacketIn(PccId pccId); | ||
| 21 | + | ||
| 22 | +} |
protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepAgent.java
100755 → 100644
| ... | @@ -60,4 +60,25 @@ public interface PcepAgent { | ... | @@ -60,4 +60,25 @@ public interface PcepAgent { |
| 60 | */ | 60 | */ |
| 61 | void processPcepMessage(PccId pccId, PcepMessage m); | 61 | void processPcepMessage(PccId pccId, PcepMessage m); |
| 62 | 62 | ||
| 63 | + /** | ||
| 64 | + * Adds PCEP device when session is successfully established. | ||
| 65 | + * | ||
| 66 | + * @param pc PCEP client details | ||
| 67 | + */ | ||
| 68 | + void addNode(PcepClient pc); | ||
| 69 | + | ||
| 70 | + /** | ||
| 71 | + * Removes PCEP device when session is disconnected. | ||
| 72 | + * | ||
| 73 | + * @param pccId PCEP client ID | ||
| 74 | + */ | ||
| 75 | + void deleteNode(PccId pccId); | ||
| 76 | + | ||
| 77 | + /** | ||
| 78 | + * Analyzes report messages received during LSP DB sync again tunnel store and takes necessary actions. | ||
| 79 | + * | ||
| 80 | + * @param pccId the id of pcc client | ||
| 81 | + * @return success or failure | ||
| 82 | + */ | ||
| 83 | + boolean analyzeSyncMsgList(PccId pccId); | ||
| 63 | } | 84 | } | ... | ... |
| ... | @@ -2,6 +2,7 @@ COMPILE_DEPS = [ | ... | @@ -2,6 +2,7 @@ COMPILE_DEPS = [ |
| 2 | '//lib:CORE_DEPS', | 2 | '//lib:CORE_DEPS', |
| 3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | 3 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', |
| 4 | '//protocols/pcep/api:onos-protocols-pcep-api', | 4 | '//protocols/pcep/api:onos-protocols-pcep-api', |
| 5 | + '//incubator/api:onos-incubator-api', | ||
| 5 | ] | 6 | ] |
| 6 | 7 | ||
| 7 | osgi_jar_with_tests ( | 8 | osgi_jar_with_tests ( | ... | ... |
| ... | @@ -55,6 +55,7 @@ import org.onosproject.pcepio.protocol.PcepVersion; | ... | @@ -55,6 +55,7 @@ import org.onosproject.pcepio.protocol.PcepVersion; |
| 55 | import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv; | 55 | import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv; |
| 56 | import org.onosproject.pcepio.types.NodeAttributesTlv; | 56 | import org.onosproject.pcepio.types.NodeAttributesTlv; |
| 57 | import org.onosproject.pcepio.types.PceccCapabilityTlv; | 57 | import org.onosproject.pcepio.types.PceccCapabilityTlv; |
| 58 | +import org.onosproject.pcepio.types.SrPceCapabilityTlv; | ||
| 58 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; | 59 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; |
| 59 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; | 60 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; |
| 60 | import org.onosproject.pcepio.types.PcepValueType; | 61 | import org.onosproject.pcepio.types.PcepValueType; |
| ... | @@ -260,6 +261,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -260,6 +261,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 260 | disconnectDuplicate(h); | 261 | disconnectDuplicate(h); |
| 261 | } else { | 262 | } else { |
| 262 | h.setState(ESTABLISHED); | 263 | h.setState(ESTABLISHED); |
| 264 | + //Session is established, add a PCEP device | ||
| 265 | + h.addNode(); | ||
| 263 | } | 266 | } |
| 264 | } | 267 | } |
| 265 | } | 268 | } |
| ... | @@ -469,6 +472,20 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -469,6 +472,20 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 469 | } | 472 | } |
| 470 | 473 | ||
| 471 | /** | 474 | /** |
| 475 | + * Adds PCEP device once session is established. | ||
| 476 | + */ | ||
| 477 | + private void addNode() { | ||
| 478 | + pc.addNode(pc); | ||
| 479 | + } | ||
| 480 | + | ||
| 481 | + /** | ||
| 482 | + * Deletes PCEP device when session is disconnected. | ||
| 483 | + */ | ||
| 484 | + private void deleteNode() { | ||
| 485 | + pc.deleteNode(pc.getPccId()); | ||
| 486 | + } | ||
| 487 | + | ||
| 488 | + /** | ||
| 472 | * Return a string describing this client based on the already available | 489 | * Return a string describing this client based on the already available |
| 473 | * information (ip address and/or remote socket). | 490 | * information (ip address and/or remote socket). |
| 474 | * | 491 | * |
| ... | @@ -523,6 +540,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -523,6 +540,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 523 | boolean pceccCapability = false; | 540 | boolean pceccCapability = false; |
| 524 | boolean statefulPceCapability = false; | 541 | boolean statefulPceCapability = false; |
| 525 | boolean pcInstantiationCapability = false; | 542 | boolean pcInstantiationCapability = false; |
| 543 | + boolean labelStackCapability = false; | ||
| 544 | + boolean srCapability = false; | ||
| 526 | 545 | ||
| 527 | ListIterator<PcepValueType> listIterator = tlvList.listIterator(); | 546 | ListIterator<PcepValueType> listIterator = tlvList.listIterator(); |
| 528 | while (listIterator.hasNext()) { | 547 | while (listIterator.hasNext()) { |
| ... | @@ -531,6 +550,9 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -531,6 +550,9 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 531 | switch (tlv.getType()) { | 550 | switch (tlv.getType()) { |
| 532 | case PceccCapabilityTlv.TYPE: | 551 | case PceccCapabilityTlv.TYPE: |
| 533 | pceccCapability = true; | 552 | pceccCapability = true; |
| 553 | + if (((PceccCapabilityTlv) tlv).sBit()) { | ||
| 554 | + labelStackCapability = true; | ||
| 555 | + } | ||
| 534 | break; | 556 | break; |
| 535 | case StatefulPceCapabilityTlv.TYPE: | 557 | case StatefulPceCapabilityTlv.TYPE: |
| 536 | statefulPceCapability = true; | 558 | statefulPceCapability = true; |
| ... | @@ -539,11 +561,15 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -539,11 +561,15 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 539 | pcInstantiationCapability = true; | 561 | pcInstantiationCapability = true; |
| 540 | } | 562 | } |
| 541 | break; | 563 | break; |
| 564 | + case SrPceCapabilityTlv.TYPE: | ||
| 565 | + srCapability = true; | ||
| 566 | + break; | ||
| 542 | default: | 567 | default: |
| 543 | continue; | 568 | continue; |
| 544 | } | 569 | } |
| 545 | } | 570 | } |
| 546 | - this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability); | 571 | + this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability, |
| 572 | + labelStackCapability, srCapability); | ||
| 547 | } | 573 | } |
| 548 | 574 | ||
| 549 | /** | 575 | /** |
| ... | @@ -563,6 +589,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -563,6 +589,8 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 563 | */ | 589 | */ |
| 564 | private void sendErrMsgAndCloseChannel() { | 590 | private void sendErrMsgAndCloseChannel() { |
| 565 | // TODO send error message | 591 | // TODO send error message |
| 592 | + //Remove PCEP device from topology | ||
| 593 | + deleteNode(); | ||
| 566 | channel.close(); | 594 | channel.close(); |
| 567 | } | 595 | } |
| 568 | 596 | ... | ... |
| ... | @@ -15,34 +15,66 @@ | ... | @@ -15,34 +15,66 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.pcep.controller.impl; | 16 | package org.onosproject.pcep.controller.impl; |
| 17 | 17 | ||
| 18 | +import java.util.Arrays; | ||
| 18 | import java.util.Collection; | 19 | import java.util.Collection; |
| 19 | import java.util.Collections; | 20 | import java.util.Collections; |
| 21 | +import java.util.HashMap; | ||
| 20 | import java.util.HashSet; | 22 | import java.util.HashSet; |
| 23 | +import java.util.Iterator; | ||
| 21 | import java.util.LinkedList; | 24 | import java.util.LinkedList; |
| 25 | +import java.util.List; | ||
| 26 | +import java.util.ListIterator; | ||
| 27 | +import java.util.Map; | ||
| 22 | import java.util.Set; | 28 | import java.util.Set; |
| 23 | import java.util.concurrent.ConcurrentHashMap; | 29 | import java.util.concurrent.ConcurrentHashMap; |
| 24 | 30 | ||
| 25 | import org.apache.felix.scr.annotations.Activate; | 31 | import org.apache.felix.scr.annotations.Activate; |
| 26 | import org.apache.felix.scr.annotations.Component; | 32 | import org.apache.felix.scr.annotations.Component; |
| 27 | import org.apache.felix.scr.annotations.Deactivate; | 33 | import org.apache.felix.scr.annotations.Deactivate; |
| 34 | +import org.apache.felix.scr.annotations.Reference; | ||
| 35 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 28 | import org.apache.felix.scr.annotations.Service; | 36 | import org.apache.felix.scr.annotations.Service; |
| 37 | +import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ||
| 38 | +import org.onosproject.incubator.net.tunnel.Tunnel; | ||
| 39 | +import org.onosproject.incubator.net.tunnel.TunnelService; | ||
| 40 | +import org.onosproject.incubator.net.tunnel.Tunnel.State; | ||
| 41 | +import org.onosproject.net.device.DeviceService; | ||
| 42 | +import org.onosproject.pcep.controller.LspKey; | ||
| 29 | import org.onosproject.pcep.controller.PccId; | 43 | import org.onosproject.pcep.controller.PccId; |
| 30 | import org.onosproject.pcep.controller.PcepClient; | 44 | import org.onosproject.pcep.controller.PcepClient; |
| 31 | import org.onosproject.pcep.controller.PcepClientController; | 45 | import org.onosproject.pcep.controller.PcepClientController; |
| 32 | import org.onosproject.pcep.controller.PcepClientListener; | 46 | import org.onosproject.pcep.controller.PcepClientListener; |
| 33 | import org.onosproject.pcep.controller.PcepEventListener; | 47 | import org.onosproject.pcep.controller.PcepEventListener; |
| 48 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
| 49 | +import org.onosproject.pcep.controller.PcepPacketListener; | ||
| 50 | +import org.onosproject.pcep.controller.PcepSyncStatus; | ||
| 34 | import org.onosproject.pcep.controller.driver.PcepAgent; | 51 | import org.onosproject.pcep.controller.driver.PcepAgent; |
| 52 | +import org.onosproject.pcepio.exceptions.PcepParseException; | ||
| 53 | +import org.onosproject.pcepio.protocol.PcInitiatedLspRequest; | ||
| 35 | import org.onosproject.pcepio.protocol.PcepError; | 54 | import org.onosproject.pcepio.protocol.PcepError; |
| 36 | import org.onosproject.pcepio.protocol.PcepErrorInfo; | 55 | import org.onosproject.pcepio.protocol.PcepErrorInfo; |
| 37 | import org.onosproject.pcepio.protocol.PcepErrorMsg; | 56 | import org.onosproject.pcepio.protocol.PcepErrorMsg; |
| 38 | import org.onosproject.pcepio.protocol.PcepErrorObject; | 57 | import org.onosproject.pcepio.protocol.PcepErrorObject; |
| 39 | import org.onosproject.pcepio.protocol.PcepFactory; | 58 | import org.onosproject.pcepio.protocol.PcepFactory; |
| 59 | +import org.onosproject.pcepio.protocol.PcepInitiateMsg; | ||
| 60 | +import org.onosproject.pcepio.protocol.PcepLspObject; | ||
| 40 | import org.onosproject.pcepio.protocol.PcepMessage; | 61 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 62 | +import org.onosproject.pcepio.protocol.PcepReportMsg; | ||
| 63 | +import org.onosproject.pcepio.protocol.PcepStateReport; | ||
| 64 | +import org.onosproject.pcepio.types.PcepValueType; | ||
| 65 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; | ||
| 66 | +import org.onosproject.pcepio.types.SymbolicPathNameTlv; | ||
| 41 | import org.slf4j.Logger; | 67 | import org.slf4j.Logger; |
| 42 | import org.slf4j.LoggerFactory; | 68 | import org.slf4j.LoggerFactory; |
| 43 | 69 | ||
| 44 | import com.google.common.collect.Sets; | 70 | import com.google.common.collect.Sets; |
| 71 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
| 45 | 72 | ||
| 73 | +import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC; | ||
| 74 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.REMOVE; | ||
| 75 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_UPDATE; | ||
| 76 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_DELETE; | ||
| 77 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.UNSTABLE; | ||
| 46 | import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19; | 78 | import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19; |
| 47 | import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5; | 79 | import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5; |
| 48 | 80 | ||
| ... | @@ -55,6 +87,9 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -55,6 +87,9 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 55 | 87 | ||
| 56 | private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class); | 88 | private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class); |
| 57 | 89 | ||
| 90 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 91 | + protected DeviceService deviceService; | ||
| 92 | + | ||
| 58 | protected ConcurrentHashMap<PccId, PcepClient> connectedClients = | 93 | protected ConcurrentHashMap<PccId, PcepClient> connectedClients = |
| 59 | new ConcurrentHashMap<>(); | 94 | new ConcurrentHashMap<>(); |
| 60 | 95 | ||
| ... | @@ -62,9 +97,23 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -62,9 +97,23 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 62 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | 97 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); |
| 63 | 98 | ||
| 64 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | 99 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); |
| 100 | + protected Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
| 101 | + protected Set<PcepPacketListener> pcepPacketListener = Sets.newHashSet(); | ||
| 65 | 102 | ||
| 66 | private final Controller ctrl = new Controller(); | 103 | private final Controller ctrl = new Controller(); |
| 67 | 104 | ||
| 105 | + public static final String BANDWIDTH = "bandwidth"; | ||
| 106 | + public static final String LSP_SIG_TYPE = "lspSigType"; | ||
| 107 | + public static final String PCC_TUNNEL_ID = "PccTunnelId"; | ||
| 108 | + public static final String PLSP_ID = "PLspId"; | ||
| 109 | + public static final String LOCAL_LSP_ID = "localLspId"; | ||
| 110 | + public static final String PCE_INIT = "pceInit"; | ||
| 111 | + public static final String COST_TYPE = "costType"; | ||
| 112 | + public static final String DELEGATE = "delegation"; | ||
| 113 | + | ||
| 114 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 115 | + protected TunnelService tunnelService; | ||
| 116 | + | ||
| 68 | @Activate | 117 | @Activate |
| 69 | public void activate() { | 118 | public void activate() { |
| 70 | ctrl.start(agent); | 119 | ctrl.start(agent); |
| ... | @@ -112,11 +161,31 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -112,11 +161,31 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 112 | } | 161 | } |
| 113 | 162 | ||
| 114 | @Override | 163 | @Override |
| 164 | + public void addPacketListener(PcepPacketListener listener) { | ||
| 165 | + pcepPacketListener.add(listener); | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + @Override | ||
| 169 | + public void removePacketListener(PcepPacketListener listener) { | ||
| 170 | + pcepPacketListener.remove(listener); | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + @Override | ||
| 115 | public void writeMessage(PccId pccId, PcepMessage msg) { | 174 | public void writeMessage(PccId pccId, PcepMessage msg) { |
| 116 | this.getClient(pccId).sendMessage(msg); | 175 | this.getClient(pccId).sendMessage(msg); |
| 117 | } | 176 | } |
| 118 | 177 | ||
| 119 | @Override | 178 | @Override |
| 179 | + public void addNodeListener(PcepNodeListener listener) { | ||
| 180 | + pcepNodeListener.add(listener); | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + @Override | ||
| 184 | + public void removeNodeListener(PcepNodeListener listener) { | ||
| 185 | + pcepNodeListener.remove(listener); | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + @Override | ||
| 120 | public void processClientMessage(PccId pccId, PcepMessage msg) { | 189 | public void processClientMessage(PccId pccId, PcepMessage msg) { |
| 121 | PcepClient pc = getClient(pccId); | 190 | PcepClient pc = getClient(pccId); |
| 122 | 191 | ||
| ... | @@ -162,8 +231,48 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -162,8 +231,48 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 162 | case REPORT: | 231 | case REPORT: |
| 163 | //Only update the listener if respective capability is supported else send PCEP-ERR msg | 232 | //Only update the listener if respective capability is supported else send PCEP-ERR msg |
| 164 | if (pc.capability().statefulPceCapability()) { | 233 | if (pc.capability().statefulPceCapability()) { |
| 165 | - for (PcepEventListener l : pcepEventListener) { | 234 | + |
| 166 | - l.handleMessage(pccId, msg); | 235 | + ListIterator<PcepStateReport> listIterator = ((PcepReportMsg) msg).getStateReportList().listIterator(); |
| 236 | + while (listIterator.hasNext()) { | ||
| 237 | + PcepStateReport stateRpt = listIterator.next(); | ||
| 238 | + if (stateRpt.getLspObject().getSFlag()) { | ||
| 239 | + if (pc.lspDbSyncStatus() != PcepSyncStatus.IN_SYNC) { | ||
| 240 | + // Initialize LSP DB sync and temporary cache. | ||
| 241 | + pc.setLspDbSyncStatus(PcepSyncStatus.IN_SYNC); | ||
| 242 | + pc.initializeSyncMsgList(pccId); | ||
| 243 | + } | ||
| 244 | + // Store stateRpt in temporary cache. | ||
| 245 | + pc.addSyncMsgToList(pccId, stateRpt); | ||
| 246 | + | ||
| 247 | + // Don't send to provider as of now. | ||
| 248 | + continue; | ||
| 249 | + } else { | ||
| 250 | + if (pc.lspDbSyncStatus() == PcepSyncStatus.IN_SYNC) { | ||
| 251 | + // Set end of LSPDB sync. | ||
| 252 | + pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED); | ||
| 253 | + | ||
| 254 | + // Call packet provider to initiate label DB sync (only if PCECC capable). | ||
| 255 | + if (pc.capability().pceccCapability()) { | ||
| 256 | + pc.setLabelDbSyncStatus(IN_SYNC); | ||
| 257 | + for (PcepPacketListener l : pcepPacketListener) { | ||
| 258 | + l.sendPacketIn(pccId); | ||
| 259 | + } | ||
| 260 | + } else { | ||
| 261 | + // If label db sync is not to be done, handle end of LSPDB sync actions. | ||
| 262 | + agent.analyzeSyncMsgList(pccId); | ||
| 263 | + } | ||
| 264 | + continue; | ||
| 265 | + } | ||
| 266 | + } | ||
| 267 | + | ||
| 268 | + // It's a usual report message while sync is not undergoing. So process it immediately. | ||
| 269 | + LinkedList<PcepStateReport> llPcRptList = new LinkedList<>(); | ||
| 270 | + llPcRptList.add(stateRpt); | ||
| 271 | + PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList)) | ||
| 272 | + .build(); | ||
| 273 | + for (PcepEventListener l : pcepEventListener) { | ||
| 274 | + l.handleMessage(pccId, pcReportMsg); | ||
| 275 | + } | ||
| 167 | } | 276 | } |
| 168 | } else { | 277 | } else { |
| 169 | // Send PCEP-ERROR message. | 278 | // Send PCEP-ERROR message. |
| ... | @@ -173,6 +282,8 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -173,6 +282,8 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 173 | break; | 282 | break; |
| 174 | case LABEL_RANGE_RESERV: | 283 | case LABEL_RANGE_RESERV: |
| 175 | break; | 284 | break; |
| 285 | + case LS_REPORT: //TODO: need to handle LS report to add or remove node | ||
| 286 | + break; | ||
| 176 | case MAX: | 287 | case MAX: |
| 177 | break; | 288 | break; |
| 178 | case END: | 289 | case END: |
| ... | @@ -270,5 +381,176 @@ public class PcepClientControllerImpl implements PcepClientController { | ... | @@ -270,5 +381,176 @@ public class PcepClientControllerImpl implements PcepClientController { |
| 270 | public void processPcepMessage(PccId pccId, PcepMessage m) { | 381 | public void processPcepMessage(PccId pccId, PcepMessage m) { |
| 271 | processClientMessage(pccId, m); | 382 | processClientMessage(pccId, m); |
| 272 | } | 383 | } |
| 384 | + | ||
| 385 | + @Override | ||
| 386 | + public void addNode(PcepClient pc) { | ||
| 387 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 388 | + l.addNode(pc); | ||
| 389 | + } | ||
| 390 | + } | ||
| 391 | + | ||
| 392 | + @Override | ||
| 393 | + public void deleteNode(PccId pccId) { | ||
| 394 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 395 | + l.deleteNode(pccId); | ||
| 396 | + } | ||
| 397 | + } | ||
| 398 | + | ||
| 399 | + @SuppressWarnings({ "unchecked", "rawtypes" }) | ||
| 400 | + @Override | ||
| 401 | + public boolean analyzeSyncMsgList(PccId pccId) { | ||
| 402 | + PcepClient pc = getClient(pccId); | ||
| 403 | + /* | ||
| 404 | + * PLSP_ID is null while tunnel is created at PCE and PCInit msg carries it as 0. It is allocated by PCC and | ||
| 405 | + * in that case it becomes the first PCRpt msg from PCC for this LSP, and hence symbolic path name must be | ||
| 406 | + * carried in the PCRpt msg. Draft says: The SYMBOLIC-PATH-NAME TLV "MUST" be included in the LSP object in | ||
| 407 | + * the LSP State Report (PCRpt) message when during a given PCEP session an LSP is "first" reported to a | ||
| 408 | + * PCE. So two separate lists with separate keys are maintained. | ||
| 409 | + */ | ||
| 410 | + Map<LspKey, Tunnel> preSyncLspDbByKey = new HashMap<>(); | ||
| 411 | + Map<String, Tunnel> preSyncLspDbByName = new HashMap<>(); | ||
| 412 | + | ||
| 413 | + // Query tunnel service and fetch all the tunnels with this PCC as ingress. | ||
| 414 | + // Organize into two maps, with LSP key if known otherwise with symbolic path name, for quick search. | ||
| 415 | + Collection<Tunnel> queriedTunnels = tunnelService.queryTunnel(Tunnel.Type.MPLS); | ||
| 416 | + for (Tunnel tunnel : queriedTunnels) { | ||
| 417 | + if (((IpTunnelEndPoint) tunnel.src()).ip().equals(pccId.ipAddress())) { | ||
| 418 | + String pLspId = tunnel.annotations().value(PLSP_ID); | ||
| 419 | + if (pLspId != null) { | ||
| 420 | + String localLspId = tunnel.annotations().value(LOCAL_LSP_ID); | ||
| 421 | + checkNotNull(localLspId); | ||
| 422 | + LspKey lspKey = new LspKey(Integer.valueOf(pLspId), Short.valueOf(localLspId)); | ||
| 423 | + preSyncLspDbByKey.put(lspKey, tunnel); | ||
| 424 | + } else { | ||
| 425 | + preSyncLspDbByName.put(tunnel.tunnelName().value(), tunnel); | ||
| 426 | + } | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + | ||
| 430 | + List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId); | ||
| 431 | + Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator(); | ||
| 432 | + | ||
| 433 | + // For every report, fetch PLSP id, local LSP id and symbolic path name from the message. | ||
| 434 | + while (syncStateRptList.iterator().hasNext()) { | ||
| 435 | + PcepStateReport stateRpt = stateRptListIterator.next(); | ||
| 436 | + Tunnel tunnel = null; | ||
| 437 | + | ||
| 438 | + PcepLspObject lspObj = stateRpt.getLspObject(); | ||
| 439 | + ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); | ||
| 440 | + StatefulIPv4LspIdentifiersTlv ipv4LspIdenTlv = null; | ||
| 441 | + SymbolicPathNameTlv pathNameTlv = null; | ||
| 442 | + | ||
| 443 | + while (listTlvIterator.hasNext()) { | ||
| 444 | + PcepValueType tlv = listTlvIterator.next(); | ||
| 445 | + switch (tlv.getType()) { | ||
| 446 | + case StatefulIPv4LspIdentifiersTlv.TYPE: | ||
| 447 | + ipv4LspIdenTlv = (StatefulIPv4LspIdentifiersTlv) tlv; | ||
| 448 | + break; | ||
| 449 | + | ||
| 450 | + case SymbolicPathNameTlv.TYPE: | ||
| 451 | + pathNameTlv = (SymbolicPathNameTlv) tlv; | ||
| 452 | + break; | ||
| 453 | + | ||
| 454 | + default: | ||
| 455 | + break; | ||
| 456 | + } | ||
| 457 | + } | ||
| 458 | + | ||
| 459 | + LspKey lspKeyOfRpt = new LspKey(lspObj.getPlspId(), ipv4LspIdenTlv.getLspId()); | ||
| 460 | + tunnel = preSyncLspDbByKey.get(lspKeyOfRpt); | ||
| 461 | + // PCE tunnel is matched with PCRpt LSP. Now delete it from the preSyncLspDb list as the residual | ||
| 462 | + // non-matching list will be processed at the end. | ||
| 463 | + if (tunnel != null) { | ||
| 464 | + preSyncLspDbByKey.remove(lspKeyOfRpt); | ||
| 465 | + } else if (pathNameTlv != null) { | ||
| 466 | + tunnel = preSyncLspDbByName.get(Arrays.toString(pathNameTlv.getValue())); | ||
| 467 | + if (tunnel != null) { | ||
| 468 | + preSyncLspDbByName.remove(tunnel.tunnelName()); | ||
| 469 | + } | ||
| 470 | + } | ||
| 471 | + | ||
| 472 | + if (tunnel == null) { | ||
| 473 | + // If remove flag is set, and tunnel is not known to PCE, ignore it. | ||
| 474 | + if (lspObj.getCFlag() && !lspObj.getRFlag()) { | ||
| 475 | + // For initiated LSP, need to send PCInit delete msg. | ||
| 476 | + try { | ||
| 477 | + PcInitiatedLspRequest releaseLspRequest = pc.factory().buildPcInitiatedLspRequest() | ||
| 478 | + .setLspObject(lspObj).build(); | ||
| 479 | + LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList | ||
| 480 | + = new LinkedList<PcInitiatedLspRequest>(); | ||
| 481 | + llPcInitiatedLspRequestList.add(releaseLspRequest); | ||
| 482 | + | ||
| 483 | + PcepInitiateMsg pcInitiateMsg = pc.factory().buildPcepInitiateMsg() | ||
| 484 | + .setPcInitiatedLspRequestList(llPcInitiatedLspRequestList).build(); | ||
| 485 | + | ||
| 486 | + for (PcepEventListener l : pcepEventListener) { | ||
| 487 | + l.handleEndOfSyncAction(pccId, pcInitiateMsg, SEND_DELETE); | ||
| 488 | + } | ||
| 489 | + | ||
| 490 | + } catch (PcepParseException e) { | ||
| 491 | + log.error("Exception occured while sending initiate delete message {}", e.getMessage()); | ||
| 492 | + } | ||
| 493 | + } | ||
| 494 | + continue; | ||
| 495 | + } | ||
| 496 | + | ||
| 497 | + if (!lspObj.getCFlag()) { | ||
| 498 | + // For learned LSP process both add/update PCRpt. | ||
| 499 | + LinkedList<PcepStateReport> llPcRptList = new LinkedList<>(); | ||
| 500 | + llPcRptList.add(stateRpt); | ||
| 501 | + PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList)) | ||
| 502 | + .build(); | ||
| 503 | + | ||
| 504 | + for (PcepEventListener l : pcepEventListener) { | ||
| 505 | + l.handleMessage(pccId, pcReportMsg); | ||
| 506 | + } | ||
| 507 | + continue; | ||
| 508 | + } | ||
| 509 | + | ||
| 510 | + // Implied that tunnel != null and lspObj.getCFlag() is set | ||
| 511 | + // State different for PCC sent LSP and PCE known LSP, send PCUpd msg. | ||
| 512 | + State tunnelState = PcepLspStatus | ||
| 513 | + .getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); | ||
| 514 | + if (tunnelState != tunnel.state()) { | ||
| 515 | + for (PcepEventListener l : pcepEventListener) { | ||
| 516 | + l.handleEndOfSyncAction(tunnel, SEND_UPDATE); | ||
| 517 | + } | ||
| 518 | + } | ||
| 519 | + } | ||
| 520 | + | ||
| 521 | + // Check which tunnels are extra at PCE that were not reported by PCC. | ||
| 522 | + Map<Object, Tunnel> preSyncLspDb = (Map) preSyncLspDbByKey; | ||
| 523 | + handleResidualTunnels(preSyncLspDb); | ||
| 524 | + preSyncLspDbByKey = null; | ||
| 525 | + | ||
| 526 | + preSyncLspDb = (Map) preSyncLspDbByName; | ||
| 527 | + handleResidualTunnels(preSyncLspDb); | ||
| 528 | + preSyncLspDbByName = null; | ||
| 529 | + preSyncLspDb = null; | ||
| 530 | + | ||
| 531 | + pc.removeSyncMsgList(pccId); | ||
| 532 | + return true; | ||
| 533 | + } | ||
| 534 | + | ||
| 535 | + /* | ||
| 536 | + * Go through the tunnels which are known by PCE but were not reported by PCC during LSP DB sync and take | ||
| 537 | + * appropriate actions. | ||
| 538 | + */ | ||
| 539 | + private void handleResidualTunnels(Map<Object, Tunnel> preSyncLspDb) { | ||
| 540 | + for (Tunnel pceExtraTunnel : preSyncLspDb.values()) { | ||
| 541 | + if (pceExtraTunnel.annotations().value(PCE_INIT) == null | ||
| 542 | + || "false".equalsIgnoreCase(pceExtraTunnel.annotations().value(PCE_INIT))) { | ||
| 543 | + // PCC initiated tunnels should be removed from tunnel store. | ||
| 544 | + for (PcepEventListener l : pcepEventListener) { | ||
| 545 | + l.handleEndOfSyncAction(pceExtraTunnel, REMOVE); | ||
| 546 | + } | ||
| 547 | + } else { | ||
| 548 | + // PCE initiated tunnels should be initiated again. | ||
| 549 | + for (PcepEventListener l : pcepEventListener) { | ||
| 550 | + l.handleEndOfSyncAction(pceExtraTunnel, UNSTABLE); | ||
| 551 | + } | ||
| 552 | + } | ||
| 553 | + } | ||
| 554 | + } | ||
| 273 | } | 555 | } |
| 274 | } | 556 | } | ... | ... |
| ... | @@ -19,13 +19,18 @@ package org.onosproject.pcep.controller.impl; | ... | @@ -19,13 +19,18 @@ package org.onosproject.pcep.controller.impl; |
| 19 | import java.net.InetSocketAddress; | 19 | import java.net.InetSocketAddress; |
| 20 | import java.net.SocketAddress; | 20 | import java.net.SocketAddress; |
| 21 | import java.util.Collections; | 21 | import java.util.Collections; |
| 22 | +import java.util.HashMap; | ||
| 23 | +import java.util.LinkedList; | ||
| 22 | import java.util.List; | 24 | import java.util.List; |
| 25 | +import java.util.Map; | ||
| 23 | import java.util.concurrent.RejectedExecutionException; | 26 | import java.util.concurrent.RejectedExecutionException; |
| 24 | 27 | ||
| 25 | import org.jboss.netty.channel.Channel; | 28 | import org.jboss.netty.channel.Channel; |
| 26 | import org.onlab.packet.IpAddress; | 29 | import org.onlab.packet.IpAddress; |
| 27 | import org.onosproject.pcep.controller.ClientCapability; | 30 | import org.onosproject.pcep.controller.ClientCapability; |
| 31 | +import org.onosproject.pcep.controller.LspKey; | ||
| 28 | import org.onosproject.pcep.controller.PccId; | 32 | import org.onosproject.pcep.controller.PccId; |
| 33 | +import org.onosproject.pcep.controller.PcepClient; | ||
| 29 | import org.onosproject.pcep.controller.PcepPacketStats; | 34 | import org.onosproject.pcep.controller.PcepPacketStats; |
| 30 | import org.onosproject.pcep.controller.PcepSyncStatus; | 35 | import org.onosproject.pcep.controller.PcepSyncStatus; |
| 31 | import org.onosproject.pcep.controller.driver.PcepAgent; | 36 | import org.onosproject.pcep.controller.driver.PcepAgent; |
| ... | @@ -33,6 +38,7 @@ import org.onosproject.pcep.controller.driver.PcepClientDriver; | ... | @@ -33,6 +38,7 @@ import org.onosproject.pcep.controller.driver.PcepClientDriver; |
| 33 | import org.onosproject.pcepio.protocol.PcepFactories; | 38 | import org.onosproject.pcepio.protocol.PcepFactories; |
| 34 | import org.onosproject.pcepio.protocol.PcepFactory; | 39 | import org.onosproject.pcepio.protocol.PcepFactory; |
| 35 | import org.onosproject.pcepio.protocol.PcepMessage; | 40 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 41 | +import org.onosproject.pcepio.protocol.PcepStateReport; | ||
| 36 | import org.onosproject.pcepio.protocol.PcepVersion; | 42 | import org.onosproject.pcepio.protocol.PcepVersion; |
| 37 | import org.slf4j.Logger; | 43 | import org.slf4j.Logger; |
| 38 | import org.slf4j.LoggerFactory; | 44 | import org.slf4j.LoggerFactory; |
| ... | @@ -66,6 +72,8 @@ public class PcepClientImpl implements PcepClientDriver { | ... | @@ -66,6 +72,8 @@ public class PcepClientImpl implements PcepClientDriver { |
| 66 | private byte deadTime; | 72 | private byte deadTime; |
| 67 | private byte sessionId; | 73 | private byte sessionId; |
| 68 | private PcepPacketStatsImpl pktStats; | 74 | private PcepPacketStatsImpl pktStats; |
| 75 | + private Map<LspKey, Boolean> lspDelegationInfo; | ||
| 76 | + private Map<PccId, List<PcepStateReport>> sycRptCache = new HashMap<>(); | ||
| 69 | 77 | ||
| 70 | @Override | 78 | @Override |
| 71 | public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) { | 79 | public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) { |
| ... | @@ -188,7 +196,14 @@ public class PcepClientImpl implements PcepClientDriver { | ... | @@ -188,7 +196,14 @@ public class PcepClientImpl implements PcepClientDriver { |
| 188 | 196 | ||
| 189 | @Override | 197 | @Override |
| 190 | public void setLabelDbSyncStatus(PcepSyncStatus syncStatus) { | 198 | public void setLabelDbSyncStatus(PcepSyncStatus syncStatus) { |
| 199 | + | ||
| 200 | + PcepSyncStatus syncOldStatus = labelDbSyncStatus(); | ||
| 191 | this.labelDbSyncStatus = syncStatus; | 201 | this.labelDbSyncStatus = syncStatus; |
| 202 | + | ||
| 203 | + if ((syncOldStatus == PcepSyncStatus.IN_SYNC) && (syncStatus == PcepSyncStatus.SYNCED)) { | ||
| 204 | + // Perform end of LSP DB sync actions. | ||
| 205 | + this.agent.analyzeSyncMsgList(pccId); | ||
| 206 | + } | ||
| 192 | } | 207 | } |
| 193 | 208 | ||
| 194 | @Override | 209 | @Override |
| ... | @@ -203,6 +218,16 @@ public class PcepClientImpl implements PcepClientDriver { | ... | @@ -203,6 +218,16 @@ public class PcepClientImpl implements PcepClientDriver { |
| 203 | } | 218 | } |
| 204 | 219 | ||
| 205 | @Override | 220 | @Override |
| 221 | + public void addNode(PcepClient pc) { | ||
| 222 | + this.agent.addNode(pc); | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + @Override | ||
| 226 | + public void deleteNode(PccId pccId) { | ||
| 227 | + this.agent.deleteNode(pccId); | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + @Override | ||
| 206 | public final boolean connectClient() { | 231 | public final boolean connectClient() { |
| 207 | return this.agent.addConnectedClient(pccId, this); | 232 | return this.agent.addConnectedClient(pccId, this); |
| 208 | } | 233 | } |
| ... | @@ -230,6 +255,39 @@ public class PcepClientImpl implements PcepClientDriver { | ... | @@ -230,6 +255,39 @@ public class PcepClientImpl implements PcepClientDriver { |
| 230 | } | 255 | } |
| 231 | 256 | ||
| 232 | @Override | 257 | @Override |
| 258 | + public void setLspAndDelegationInfo(LspKey lspKey, boolean dFlag) { | ||
| 259 | + lspDelegationInfo.put(lspKey, dFlag); | ||
| 260 | + } | ||
| 261 | + | ||
| 262 | + @Override | ||
| 263 | + public Boolean delegationInfo(LspKey lspKey) { | ||
| 264 | + return lspDelegationInfo.get(lspKey); | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + @Override | ||
| 268 | + public void initializeSyncMsgList(PccId pccId) { | ||
| 269 | + List<PcepStateReport> rptMsgList = new LinkedList<>(); | ||
| 270 | + sycRptCache.put(pccId, rptMsgList); | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + @Override | ||
| 274 | + public List<PcepStateReport> getSyncMsgList(PccId pccId) { | ||
| 275 | + return sycRptCache.get(pccId); | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + @Override | ||
| 279 | + public void removeSyncMsgList(PccId pccId) { | ||
| 280 | + sycRptCache.remove(pccId); | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + @Override | ||
| 284 | + public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) { | ||
| 285 | + List<PcepStateReport> rptMsgList = sycRptCache.get(pccId); | ||
| 286 | + rptMsgList.add(rptMsg); | ||
| 287 | + sycRptCache.put(pccId, rptMsgList); | ||
| 288 | + } | ||
| 289 | + | ||
| 290 | + @Override | ||
| 233 | public boolean isOptical() { | 291 | public boolean isOptical() { |
| 234 | return false; | 292 | return false; |
| 235 | } | 293 | } | ... | ... |
| ... | @@ -13,7 +13,7 @@ | ... | @@ -13,7 +13,7 @@ |
| 13 | * See the License for the specific language governing permissions and | 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | -package org.onosproject.provider.pcep.tunnel.impl; | 16 | +package org.onosproject.pcep.controller.impl; |
| 17 | 17 | ||
| 18 | import org.onosproject.incubator.net.tunnel.Tunnel.State; | 18 | import org.onosproject.incubator.net.tunnel.Tunnel.State; |
| 19 | 19 | ||
| ... | @@ -51,6 +51,7 @@ public enum PcepLspStatus { | ... | @@ -51,6 +51,7 @@ public enum PcepLspStatus { |
| 51 | * Returns the applicable PCEP LSP status corresponding to ONOS tunnel state. | 51 | * Returns the applicable PCEP LSP status corresponding to ONOS tunnel state. |
| 52 | * | 52 | * |
| 53 | * @param tunnelState ONOS tunnel state | 53 | * @param tunnelState ONOS tunnel state |
| 54 | + * @return LSP status as per protocol | ||
| 54 | */ | 55 | */ |
| 55 | public static PcepLspStatus getLspStatusFromTunnelStatus(State tunnelState) { | 56 | public static PcepLspStatus getLspStatusFromTunnelStatus(State tunnelState) { |
| 56 | 57 | ||
| ... | @@ -76,6 +77,7 @@ public enum PcepLspStatus { | ... | @@ -76,6 +77,7 @@ public enum PcepLspStatus { |
| 76 | * Returns the applicable ONOS tunnel state corresponding to PCEP LSP status. | 77 | * Returns the applicable ONOS tunnel state corresponding to PCEP LSP status. |
| 77 | * | 78 | * |
| 78 | * @param lspState PCEP LSP status | 79 | * @param lspState PCEP LSP status |
| 80 | + * @return tunnel state | ||
| 79 | */ | 81 | */ |
| 80 | public static State getTunnelStatusFromLspStatus(PcepLspStatus lspState) { | 82 | public static State getTunnelStatusFromLspStatus(PcepLspStatus lspState) { |
| 81 | 83 | ... | ... |
protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
100755 → 100644
| ... | @@ -29,14 +29,14 @@ public interface PcepBandwidthObject { | ... | @@ -29,14 +29,14 @@ public interface PcepBandwidthObject { |
| 29 | * | 29 | * |
| 30 | * @return bandwidth value | 30 | * @return bandwidth value |
| 31 | */ | 31 | */ |
| 32 | - int getBandwidth(); | 32 | + float getBandwidth(); |
| 33 | 33 | ||
| 34 | /** | 34 | /** |
| 35 | * Sets bandwidth with specified value. | 35 | * Sets bandwidth with specified value. |
| 36 | * | 36 | * |
| 37 | * @param iBandwidth Bandwidth's value | 37 | * @param iBandwidth Bandwidth's value |
| 38 | */ | 38 | */ |
| 39 | - void setBandwidth(int iBandwidth); | 39 | + void setBandwidth(float iBandwidth); |
| 40 | 40 | ||
| 41 | /** | 41 | /** |
| 42 | * Writes the BandwidthObject into channel buffer. | 42 | * Writes the BandwidthObject into channel buffer. | ... | ... |
| ... | @@ -51,6 +51,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -51,6 +51,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 51 | public static final byte BANDWIDTH_OBJ_TYPE = 1; | 51 | public static final byte BANDWIDTH_OBJ_TYPE = 1; |
| 52 | public static final byte BANDWIDTH_OBJ_CLASS = 5; | 52 | public static final byte BANDWIDTH_OBJ_CLASS = 5; |
| 53 | public static final byte BANDWIDTH_OBJECT_VERSION = 1; | 53 | public static final byte BANDWIDTH_OBJECT_VERSION = 1; |
| 54 | + public static final int NO_OF_BITS = 8; | ||
| 54 | public static final short BANDWIDTH_OBJ_MINIMUM_LENGTH = 8; | 55 | public static final short BANDWIDTH_OBJ_MINIMUM_LENGTH = 8; |
| 55 | 56 | ||
| 56 | static final PcepObjectHeader DEFAULT_BANDWIDTH_OBJECT_HEADER = new PcepObjectHeader(BANDWIDTH_OBJ_CLASS, | 57 | static final PcepObjectHeader DEFAULT_BANDWIDTH_OBJECT_HEADER = new PcepObjectHeader(BANDWIDTH_OBJ_CLASS, |
| ... | @@ -58,7 +59,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -58,7 +59,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 58 | BANDWIDTH_OBJ_MINIMUM_LENGTH); | 59 | BANDWIDTH_OBJ_MINIMUM_LENGTH); |
| 59 | 60 | ||
| 60 | private PcepObjectHeader bandwidthObjHeader; | 61 | private PcepObjectHeader bandwidthObjHeader; |
| 61 | - private int iBandwidth; | 62 | + private float iBandwidth; |
| 62 | 63 | ||
| 63 | /** | 64 | /** |
| 64 | * Constructor to bandwidth object header and bandwidth. | 65 | * Constructor to bandwidth object header and bandwidth. |
| ... | @@ -66,7 +67,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -66,7 +67,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 66 | * @param bandwidthObjHeader bandwidth object header | 67 | * @param bandwidthObjHeader bandwidth object header |
| 67 | * @param iBandwidth bandwidth value | 68 | * @param iBandwidth bandwidth value |
| 68 | */ | 69 | */ |
| 69 | - public PcepBandwidthObjectVer1(PcepObjectHeader bandwidthObjHeader, int iBandwidth) { | 70 | + public PcepBandwidthObjectVer1(PcepObjectHeader bandwidthObjHeader, float iBandwidth) { |
| 70 | this.bandwidthObjHeader = bandwidthObjHeader; | 71 | this.bandwidthObjHeader = bandwidthObjHeader; |
| 71 | this.iBandwidth = iBandwidth; | 72 | this.iBandwidth = iBandwidth; |
| 72 | } | 73 | } |
| ... | @@ -76,7 +77,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -76,7 +77,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 76 | * | 77 | * |
| 77 | * @param iBandwidth bandwidth value | 78 | * @param iBandwidth bandwidth value |
| 78 | */ | 79 | */ |
| 79 | - public PcepBandwidthObjectVer1(int iBandwidth) { | 80 | + public PcepBandwidthObjectVer1(float iBandwidth) { |
| 80 | this.bandwidthObjHeader = DEFAULT_BANDWIDTH_OBJECT_HEADER; | 81 | this.bandwidthObjHeader = DEFAULT_BANDWIDTH_OBJECT_HEADER; |
| 81 | this.iBandwidth = iBandwidth; | 82 | this.iBandwidth = iBandwidth; |
| 82 | } | 83 | } |
| ... | @@ -100,12 +101,12 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -100,12 +101,12 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | @Override | 103 | @Override |
| 103 | - public int getBandwidth() { | 104 | + public float getBandwidth() { |
| 104 | return this.iBandwidth; | 105 | return this.iBandwidth; |
| 105 | } | 106 | } |
| 106 | 107 | ||
| 107 | @Override | 108 | @Override |
| 108 | - public void setBandwidth(int iBandwidth) { | 109 | + public void setBandwidth(float iBandwidth) { |
| 109 | this.iBandwidth = iBandwidth; | 110 | this.iBandwidth = iBandwidth; |
| 110 | } | 111 | } |
| 111 | 112 | ||
| ... | @@ -119,12 +120,25 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -119,12 +120,25 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 119 | public static PcepBandwidthObject read(ChannelBuffer cb) throws PcepParseException { | 120 | public static PcepBandwidthObject read(ChannelBuffer cb) throws PcepParseException { |
| 120 | 121 | ||
| 121 | PcepObjectHeader bandwidthObjHeader; | 122 | PcepObjectHeader bandwidthObjHeader; |
| 122 | - int iBandwidth; | 123 | + float bandwidth; |
| 123 | 124 | ||
| 124 | bandwidthObjHeader = PcepObjectHeader.read(cb); | 125 | bandwidthObjHeader = PcepObjectHeader.read(cb); |
| 125 | - iBandwidth = cb.readInt(); | 126 | + bandwidth = ieeeToFloatRead(cb.readInt()) * NO_OF_BITS; |
| 126 | 127 | ||
| 127 | - return new PcepBandwidthObjectVer1(bandwidthObjHeader, iBandwidth); | 128 | + return new PcepBandwidthObjectVer1(bandwidthObjHeader, bandwidth); |
| 129 | + } | ||
| 130 | + | ||
| 131 | + /** | ||
| 132 | + * Parse the IEEE floating point notation and returns it in normal float. | ||
| 133 | + * | ||
| 134 | + * @param iVal IEEE floating point number | ||
| 135 | + * @return normal float | ||
| 136 | + */ | ||
| 137 | + public static float ieeeToFloatRead(int iVal) { | ||
| 138 | + iVal = (((iVal & 0xFF) << 24) | ((iVal & 0xFF00) << 8) | ||
| 139 | + | ((iVal & 0xFF0000) >> 8) | ((iVal >> 24) & 0xFF)); | ||
| 140 | + | ||
| 141 | + return Float.intBitsToFloat(iVal); | ||
| 128 | } | 142 | } |
| 129 | 143 | ||
| 130 | @Override | 144 | @Override |
| ... | @@ -138,7 +152,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { | ... | @@ -138,7 +152,7 @@ public class PcepBandwidthObjectVer1 implements PcepBandwidthObject { |
| 138 | throw new PcepParseException("Failed to write bandwidth object header. Index " + objLenIndex); | 152 | throw new PcepParseException("Failed to write bandwidth object header. Index " + objLenIndex); |
| 139 | } | 153 | } |
| 140 | 154 | ||
| 141 | - cb.writeInt(iBandwidth); | 155 | + cb.writeInt(Float.floatToIntBits(iBandwidth)); |
| 142 | short hLength = (short) (cb.writerIndex() - objStartIndex); | 156 | short hLength = (short) (cb.writerIndex() - objStartIndex); |
| 143 | cb.setShort(objLenIndex, hLength); | 157 | cb.setShort(objLenIndex, hLength); |
| 144 | //will be helpful during print(). | 158 | //will be helpful during print(). | ... | ... |
| ... | @@ -16,8 +16,10 @@ | ... | @@ -16,8 +16,10 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.pcepio.protocol.ver1; | 17 | package org.onosproject.pcepio.protocol.ver1; |
| 18 | 18 | ||
| 19 | +import java.util.Iterator; | ||
| 19 | import java.util.LinkedList; | 20 | import java.util.LinkedList; |
| 20 | import java.util.ListIterator; | 21 | import java.util.ListIterator; |
| 22 | +import java.util.Objects; | ||
| 21 | 23 | ||
| 22 | import org.jboss.netty.buffer.ChannelBuffer; | 24 | import org.jboss.netty.buffer.ChannelBuffer; |
| 23 | import org.onosproject.pcepio.exceptions.PcepParseException; | 25 | import org.onosproject.pcepio.exceptions.PcepParseException; |
| ... | @@ -399,10 +401,47 @@ public class PcepEroObjectVer1 implements PcepEroObject { | ... | @@ -399,10 +401,47 @@ public class PcepEroObjectVer1 implements PcepEroObject { |
| 399 | } | 401 | } |
| 400 | 402 | ||
| 401 | @Override | 403 | @Override |
| 404 | + public int hashCode() { | ||
| 405 | + return Objects.hash(eroObjHeader, subObjectList); | ||
| 406 | + } | ||
| 407 | + | ||
| 408 | + @Override | ||
| 402 | public String toString() { | 409 | public String toString() { |
| 403 | return MoreObjects.toStringHelper(getClass()).omitNullValues() | 410 | return MoreObjects.toStringHelper(getClass()).omitNullValues() |
| 404 | .add("EroObjHeader", eroObjHeader) | 411 | .add("EroObjHeader", eroObjHeader) |
| 405 | .add("SubObjects", subObjectList) | 412 | .add("SubObjects", subObjectList) |
| 406 | .toString(); | 413 | .toString(); |
| 407 | } | 414 | } |
| 415 | + | ||
| 416 | + @Override | ||
| 417 | + public boolean equals(Object obj) { | ||
| 418 | + if (this == obj) { | ||
| 419 | + return true; | ||
| 420 | + } | ||
| 421 | + | ||
| 422 | + if (obj instanceof PcepEroObjectVer1) { | ||
| 423 | + int countObjSubTlv = 0; | ||
| 424 | + int countOtherSubTlv = 0; | ||
| 425 | + boolean isCommonSubTlv = true; | ||
| 426 | + PcepEroObjectVer1 other = (PcepEroObjectVer1) obj; | ||
| 427 | + Iterator<PcepValueType> objListIterator = other.subObjectList.iterator(); | ||
| 428 | + countOtherSubTlv = other.subObjectList.size(); | ||
| 429 | + countObjSubTlv = subObjectList.size(); | ||
| 430 | + if (countObjSubTlv != countOtherSubTlv) { | ||
| 431 | + return false; | ||
| 432 | + } else { | ||
| 433 | + while (objListIterator.hasNext() && isCommonSubTlv) { | ||
| 434 | + PcepValueType subTlv = objListIterator.next(); | ||
| 435 | + if (subObjectList.contains(subTlv)) { | ||
| 436 | + isCommonSubTlv = Objects.equals(subObjectList.get(subObjectList.indexOf(subTlv)), | ||
| 437 | + other.subObjectList.get(other.subObjectList.indexOf(subTlv))); | ||
| 438 | + } else { | ||
| 439 | + isCommonSubTlv = false; | ||
| 440 | + } | ||
| 441 | + } | ||
| 442 | + return isCommonSubTlv && Objects.equals(eroObjHeader, other.eroObjHeader); | ||
| 443 | + } | ||
| 444 | + } | ||
| 445 | + return false; | ||
| 446 | + } | ||
| 408 | } | 447 | } | ... | ... |
| ... | @@ -57,6 +57,10 @@ public class PcepMetricObjectVer1 implements PcepMetricObject { | ... | @@ -57,6 +57,10 @@ public class PcepMetricObjectVer1 implements PcepMetricObject { |
| 57 | public static final int BFLAG_RESET = 0; | 57 | public static final int BFLAG_RESET = 0; |
| 58 | public static final byte CFLAG_CHECK = 0x02; | 58 | public static final byte CFLAG_CHECK = 0x02; |
| 59 | 59 | ||
| 60 | + public static final byte IGP_METRIC = 0x01; | ||
| 61 | + public static final byte TE_METRIC = 0x02; | ||
| 62 | + public static final byte HOP_COUNT_METRIC = 0x03; | ||
| 63 | + | ||
| 60 | static final PcepObjectHeader DEFAULT_METRIC_OBJECT_HEADER = new PcepObjectHeader(METRIC_OBJ_CLASS, | 64 | static final PcepObjectHeader DEFAULT_METRIC_OBJECT_HEADER = new PcepObjectHeader(METRIC_OBJ_CLASS, |
| 61 | METRIC_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, | 65 | METRIC_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, |
| 62 | METRIC_OBJ_MINIMUM_LENGTH); | 66 | METRIC_OBJ_MINIMUM_LENGTH); | ... | ... |
| ... | @@ -16,6 +16,8 @@ | ... | @@ -16,6 +16,8 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.pcepio.types; | 17 | package org.onosproject.pcepio.types; |
| 18 | 18 | ||
| 19 | +import java.util.Objects; | ||
| 20 | + | ||
| 19 | import org.jboss.netty.buffer.ChannelBuffer; | 21 | import org.jboss.netty.buffer.ChannelBuffer; |
| 20 | import org.slf4j.Logger; | 22 | import org.slf4j.Logger; |
| 21 | import org.slf4j.LoggerFactory; | 23 | import org.slf4j.LoggerFactory; |
| ... | @@ -212,6 +214,27 @@ public class PcepObjectHeader { | ... | @@ -212,6 +214,27 @@ public class PcepObjectHeader { |
| 212 | } | 214 | } |
| 213 | 215 | ||
| 214 | @Override | 216 | @Override |
| 217 | + public int hashCode() { | ||
| 218 | + return Objects.hash(objClass, objType, bPFlag, bIFlag, objLen); | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + @Override | ||
| 222 | + public boolean equals(Object obj) { | ||
| 223 | + if (this == obj) { | ||
| 224 | + return true; | ||
| 225 | + } | ||
| 226 | + if (obj instanceof PcepObjectHeader) { | ||
| 227 | + PcepObjectHeader other = (PcepObjectHeader) obj; | ||
| 228 | + return Objects.equals(objClass, other.objClass) | ||
| 229 | + && Objects.equals(objType, other.objType) | ||
| 230 | + && Objects.equals(bPFlag, other.bPFlag) | ||
| 231 | + && Objects.equals(bIFlag, other.bIFlag) | ||
| 232 | + && Objects.equals(objLen, other.objLen); | ||
| 233 | + } | ||
| 234 | + return false; | ||
| 235 | + } | ||
| 236 | + | ||
| 237 | + @Override | ||
| 215 | public String toString() { | 238 | public String toString() { |
| 216 | return MoreObjects.toStringHelper(getClass()) | 239 | return MoreObjects.toStringHelper(getClass()) |
| 217 | .add("ObjectClass", objClass) | 240 | .add("ObjectClass", objClass) | ... | ... |
providers/bgp/pom.xml
100755 → 100644
| ... | @@ -40,6 +40,11 @@ | ... | @@ -40,6 +40,11 @@ |
| 40 | </dependency> | 40 | </dependency> |
| 41 | <dependency> | 41 | <dependency> |
| 42 | <groupId>org.onosproject</groupId> | 42 | <groupId>org.onosproject</groupId> |
| 43 | + <artifactId>onos-incubator-api</artifactId> | ||
| 44 | + <version>${project.version}</version> | ||
| 45 | + </dependency> | ||
| 46 | + <dependency> | ||
| 47 | + <groupId>org.onosproject</groupId> | ||
| 43 | <artifactId>onos-api</artifactId> | 48 | <artifactId>onos-api</artifactId> |
| 44 | <classifier>tests</classifier> | 49 | <classifier>tests</classifier> |
| 45 | <scope>test</scope> | 50 | <scope>test</scope> | ... | ... |
| ... | @@ -3,6 +3,7 @@ COMPILE_DEPS = [ | ... | @@ -3,6 +3,7 @@ COMPILE_DEPS = [ |
| 3 | '//protocols/bgp/api:onos-protocols-bgp-api', | 3 | '//protocols/bgp/api:onos-protocols-bgp-api', |
| 4 | '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio', | 4 | '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio', |
| 5 | '//incubator/store:onos-incubator-store', | 5 | '//incubator/store:onos-incubator-store', |
| 6 | + '//incubator/api:onos-incubator-api', | ||
| 6 | ] | 7 | ] |
| 7 | 8 | ||
| 8 | TEST_DEPS = [ | 9 | TEST_DEPS = [ | ... | ... |
| ... | @@ -17,11 +17,16 @@ import static org.onosproject.bgp.controller.BgpDpid.uri; | ... | @@ -17,11 +17,16 @@ import static org.onosproject.bgp.controller.BgpDpid.uri; |
| 17 | import static org.onosproject.net.DeviceId.deviceId; | 17 | import static org.onosproject.net.DeviceId.deviceId; |
| 18 | import static org.onosproject.net.Device.Type.ROUTER; | 18 | import static org.onosproject.net.Device.Type.ROUTER; |
| 19 | import static org.onosproject.net.Device.Type.VIRTUAL; | 19 | import static org.onosproject.net.Device.Type.VIRTUAL; |
| 20 | +import static org.onosproject.incubator.net.resource.label.LabelResourceId.labelResourceId; | ||
| 21 | +import static java.util.stream.Collectors.toList; | ||
| 20 | 22 | ||
| 23 | +import java.util.LinkedList; | ||
| 21 | import java.util.List; | 24 | import java.util.List; |
| 22 | import java.util.Set; | 25 | import java.util.Set; |
| 23 | 26 | ||
| 24 | import org.onlab.packet.ChassisId; | 27 | import org.onlab.packet.ChassisId; |
| 28 | +import org.onlab.packet.Ip4Address; | ||
| 29 | +import org.onlab.util.Bandwidth; | ||
| 25 | import org.apache.felix.scr.annotations.Activate; | 30 | import org.apache.felix.scr.annotations.Activate; |
| 26 | import org.apache.felix.scr.annotations.Component; | 31 | import org.apache.felix.scr.annotations.Component; |
| 27 | import org.apache.felix.scr.annotations.Deactivate; | 32 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -45,9 +50,21 @@ import org.onosproject.bgpio.types.IPv4AddressTlv; | ... | @@ -45,9 +50,21 @@ import org.onosproject.bgpio.types.IPv4AddressTlv; |
| 45 | import org.onosproject.bgpio.types.IsIsNonPseudonode; | 50 | import org.onosproject.bgpio.types.IsIsNonPseudonode; |
| 46 | import org.onosproject.bgpio.types.IsIsPseudonode; | 51 | import org.onosproject.bgpio.types.IsIsPseudonode; |
| 47 | import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv; | 52 | import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv; |
| 53 | +import org.onosproject.bgpio.types.LinkStateAttributes; | ||
| 48 | import org.onosproject.bgpio.types.OspfNonPseudonode; | 54 | import org.onosproject.bgpio.types.OspfNonPseudonode; |
| 49 | import org.onosproject.bgpio.types.OspfPseudonode; | 55 | import org.onosproject.bgpio.types.OspfPseudonode; |
| 56 | +import org.onosproject.bgpio.types.attr.BgpAttrNodeFlagBitTlv; | ||
| 57 | +import org.onosproject.bgpio.types.attr.BgpAttrNodeIsIsAreaId; | ||
| 58 | +import org.onosproject.bgpio.types.attr.BgpAttrRouterIdV4; | ||
| 59 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrIgpMetric; | ||
| 60 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrMaxLinkBandwidth; | ||
| 61 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrTeDefaultMetric; | ||
| 50 | import org.onosproject.core.CoreService; | 62 | import org.onosproject.core.CoreService; |
| 63 | +import org.onosproject.incubator.net.resource.label.LabelResourceAdminService; | ||
| 64 | +import org.onosproject.incubator.net.resource.label.LabelResourceId; | ||
| 65 | +import org.onosproject.mastership.MastershipEvent; | ||
| 66 | +import org.onosproject.mastership.MastershipListener; | ||
| 67 | +import org.onosproject.mastership.MastershipService; | ||
| 51 | import org.onosproject.net.AnnotationKeys; | 68 | import org.onosproject.net.AnnotationKeys; |
| 52 | import org.onosproject.net.ConnectPoint; | 69 | import org.onosproject.net.ConnectPoint; |
| 53 | import org.onosproject.net.DefaultAnnotations; | 70 | import org.onosproject.net.DefaultAnnotations; |
| ... | @@ -56,12 +73,15 @@ import org.onosproject.net.DeviceId; | ... | @@ -56,12 +73,15 @@ import org.onosproject.net.DeviceId; |
| 56 | import org.onosproject.net.Link; | 73 | import org.onosproject.net.Link; |
| 57 | import org.onosproject.net.MastershipRole; | 74 | import org.onosproject.net.MastershipRole; |
| 58 | import org.onosproject.net.PortNumber; | 75 | import org.onosproject.net.PortNumber; |
| 76 | +import org.onosproject.net.config.NetworkConfigService; | ||
| 59 | import org.onosproject.net.device.DefaultDeviceDescription; | 77 | import org.onosproject.net.device.DefaultDeviceDescription; |
| 78 | +import org.onosproject.net.device.DefaultPortDescription; | ||
| 60 | import org.onosproject.net.device.DeviceDescription; | 79 | import org.onosproject.net.device.DeviceDescription; |
| 61 | import org.onosproject.net.device.DeviceProvider; | 80 | import org.onosproject.net.device.DeviceProvider; |
| 62 | import org.onosproject.net.device.DeviceProviderRegistry; | 81 | import org.onosproject.net.device.DeviceProviderRegistry; |
| 63 | import org.onosproject.net.device.DeviceProviderService; | 82 | import org.onosproject.net.device.DeviceProviderService; |
| 64 | import org.onosproject.net.device.DeviceService; | 83 | import org.onosproject.net.device.DeviceService; |
| 84 | +import org.onosproject.net.device.PortDescription; | ||
| 65 | import org.onosproject.net.link.DefaultLinkDescription; | 85 | import org.onosproject.net.link.DefaultLinkDescription; |
| 66 | import org.onosproject.net.link.LinkDescription; | 86 | import org.onosproject.net.link.LinkDescription; |
| 67 | import org.onosproject.net.link.LinkProvider; | 87 | import org.onosproject.net.link.LinkProvider; |
| ... | @@ -70,6 +90,7 @@ import org.onosproject.net.link.LinkProviderService; | ... | @@ -70,6 +90,7 @@ import org.onosproject.net.link.LinkProviderService; |
| 70 | import org.onosproject.net.link.LinkService; | 90 | import org.onosproject.net.link.LinkService; |
| 71 | import org.onosproject.net.provider.AbstractProvider; | 91 | import org.onosproject.net.provider.AbstractProvider; |
| 72 | import org.onosproject.net.provider.ProviderId; | 92 | import org.onosproject.net.provider.ProviderId; |
| 93 | +import org.onosproject.net.config.basics.BandwidthCapacity; | ||
| 73 | import org.slf4j.Logger; | 94 | import org.slf4j.Logger; |
| 74 | import org.slf4j.LoggerFactory; | 95 | import org.slf4j.LoggerFactory; |
| 75 | 96 | ||
| ... | @@ -106,16 +127,39 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -106,16 +127,39 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 106 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 127 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 107 | protected CoreService coreService; | 128 | protected CoreService coreService; |
| 108 | 129 | ||
| 130 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 131 | + protected MastershipService mastershipService; | ||
| 132 | + | ||
| 133 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 134 | + protected LabelResourceAdminService labelResourceAdminService; | ||
| 135 | + | ||
| 136 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 137 | + protected NetworkConfigService networkConfigService; | ||
| 138 | + | ||
| 109 | private DeviceProviderService deviceProviderService; | 139 | private DeviceProviderService deviceProviderService; |
| 110 | private LinkProviderService linkProviderService; | 140 | private LinkProviderService linkProviderService; |
| 111 | 141 | ||
| 142 | + private InternalMastershipListener masterListener = new InternalMastershipListener(); | ||
| 112 | private InternalBgpProvider listener = new InternalBgpProvider(); | 143 | private InternalBgpProvider listener = new InternalBgpProvider(); |
| 113 | private static final String UNKNOWN = "unknown"; | 144 | private static final String UNKNOWN = "unknown"; |
| 114 | public static final long IDENTIFIER_SET = 0x100000000L; | 145 | public static final long IDENTIFIER_SET = 0x100000000L; |
| 115 | public static final String AS_NUMBER = "asNumber"; | 146 | public static final String AS_NUMBER = "asNumber"; |
| 116 | public static final String DOMAIN_IDENTIFIER = "domainIdentifier"; | 147 | public static final String DOMAIN_IDENTIFIER = "domainIdentifier"; |
| 117 | public static final String ROUTING_UNIVERSE = "routingUniverse"; | 148 | public static final String ROUTING_UNIVERSE = "routingUniverse"; |
| 149 | + | ||
| 150 | + public static final String EXTERNAL_BIT = "externalBit"; | ||
| 151 | + public static final String ABR_BIT = "abrBit"; | ||
| 152 | + public static final String INTERNAL_BIT = "internalBit"; | ||
| 153 | + public static final String PSEUDO = "psuedo"; | ||
| 154 | + public static final String AREAID = "areaId"; | ||
| 155 | + public static final String LSRID = "lsrId"; | ||
| 156 | + public static final String COST = "cost"; | ||
| 157 | + public static final String TE_COST = "teCost"; | ||
| 158 | + | ||
| 118 | public static final long PSEUDO_PORT = 0xffffffff; | 159 | public static final long PSEUDO_PORT = 0xffffffff; |
| 160 | + public static final int DELAY = 2; | ||
| 161 | + private LabelResourceId beginLabel = labelResourceId(5122); | ||
| 162 | + private LabelResourceId endLabel = labelResourceId(9217); | ||
| 119 | 163 | ||
| 120 | @Activate | 164 | @Activate |
| 121 | public void activate() { | 165 | public void activate() { |
| ... | @@ -123,6 +167,7 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -123,6 +167,7 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 123 | deviceProviderService = deviceProviderRegistry.register(this); | 167 | deviceProviderService = deviceProviderRegistry.register(this); |
| 124 | linkProviderService = linkProviderRegistry.register(this); | 168 | linkProviderService = linkProviderRegistry.register(this); |
| 125 | controller.addListener(listener); | 169 | controller.addListener(listener); |
| 170 | + mastershipService.addListener(masterListener); | ||
| 126 | controller.addLinkListener(listener); | 171 | controller.addLinkListener(listener); |
| 127 | } | 172 | } |
| 128 | 173 | ||
| ... | @@ -135,6 +180,27 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -135,6 +180,27 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 135 | linkProviderService = null; | 180 | linkProviderService = null; |
| 136 | controller.removeListener(listener); | 181 | controller.removeListener(listener); |
| 137 | controller.removeLinkListener(listener); | 182 | controller.removeLinkListener(listener); |
| 183 | + mastershipService.removeListener(masterListener); | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + private class InternalMastershipListener implements MastershipListener { | ||
| 187 | + @Override | ||
| 188 | + public void event(MastershipEvent event) { | ||
| 189 | + if (event.type() == MastershipEvent.Type.MASTER_CHANGED) { | ||
| 190 | + if (mastershipService.getMasterFor(event.subject()) != null) { | ||
| 191 | + //Only for L3 device create label pool for that device | ||
| 192 | + Device device = deviceService.getDevice(event.subject()); | ||
| 193 | + if (device == null) { | ||
| 194 | + log.debug("Device {} doesn't exist", event.subject()); | ||
| 195 | + return; | ||
| 196 | + } | ||
| 197 | + //Reserve device label pool for L3 devices | ||
| 198 | + if (device.annotations().value(LSRID) != null) { | ||
| 199 | + createDevicePool(event.subject()); | ||
| 200 | + } | ||
| 201 | + } | ||
| 202 | + } | ||
| 203 | + } | ||
| 138 | } | 204 | } |
| 139 | 205 | ||
| 140 | /* | 206 | /* |
| ... | @@ -146,7 +212,7 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -146,7 +212,7 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 146 | public void addNode(BgpNodeLSNlriVer4 nodeNlri, PathAttrNlriDetails details) { | 212 | public void addNode(BgpNodeLSNlriVer4 nodeNlri, PathAttrNlriDetails details) { |
| 147 | log.debug("Add node {}", nodeNlri.toString()); | 213 | log.debug("Add node {}", nodeNlri.toString()); |
| 148 | 214 | ||
| 149 | - if (deviceProviderService == null) { | 215 | + if (deviceProviderService == null || deviceService == null) { |
| 150 | return; | 216 | return; |
| 151 | } | 217 | } |
| 152 | Device.Type deviceType = ROUTER; | 218 | Device.Type deviceType = ROUTER; |
| ... | @@ -154,6 +220,13 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -154,6 +220,13 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 154 | DeviceId deviceId = deviceId(uri(nodeUri.toString())); | 220 | DeviceId deviceId = deviceId(uri(nodeUri.toString())); |
| 155 | ChassisId cId = new ChassisId(); | 221 | ChassisId cId = new ChassisId(); |
| 156 | 222 | ||
| 223 | + /* | ||
| 224 | + * Check if device is already there (available) , if yes not updating to core. | ||
| 225 | + */ | ||
| 226 | + if (deviceService.isAvailable(deviceId)) { | ||
| 227 | + return; | ||
| 228 | + } | ||
| 229 | + | ||
| 157 | DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); | 230 | DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); |
| 158 | 231 | ||
| 159 | newBuilder.set(AnnotationKeys.TYPE, "L3"); | 232 | newBuilder.set(AnnotationKeys.TYPE, "L3"); |
| ... | @@ -183,11 +256,13 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -183,11 +256,13 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 183 | } | 256 | } |
| 184 | } | 257 | } |
| 185 | } | 258 | } |
| 259 | + DefaultAnnotations.Builder anntotations = DefaultAnnotations.builder(); | ||
| 260 | + anntotations = getAnnotations(newBuilder, true, details); | ||
| 186 | 261 | ||
| 187 | DeviceDescription description = new DefaultDeviceDescription(uri(nodeUri.toString()), deviceType, UNKNOWN, | 262 | DeviceDescription description = new DefaultDeviceDescription(uri(nodeUri.toString()), deviceType, UNKNOWN, |
| 188 | - UNKNOWN, UNKNOWN, UNKNOWN, cId, newBuilder.build()); | 263 | + UNKNOWN, UNKNOWN, UNKNOWN, cId, anntotations.build()); |
| 189 | - deviceProviderService.deviceConnected(deviceId, description); | ||
| 190 | 264 | ||
| 265 | + deviceProviderService.deviceConnected(deviceId, description); | ||
| 191 | } | 266 | } |
| 192 | 267 | ||
| 193 | @Override | 268 | @Override |
| ... | @@ -200,6 +275,12 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -200,6 +275,12 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 200 | 275 | ||
| 201 | BgpDpid deviceUri = new BgpDpid(nodeNlri); | 276 | BgpDpid deviceUri = new BgpDpid(nodeNlri); |
| 202 | DeviceId deviceId = deviceId(uri(deviceUri.toString())); | 277 | DeviceId deviceId = deviceId(uri(deviceUri.toString())); |
| 278 | + | ||
| 279 | + if (labelResourceAdminService != null) { | ||
| 280 | + //Destroy local device label pool reserved for that device | ||
| 281 | + labelResourceAdminService.destroyDevicePool(deviceId); | ||
| 282 | + } | ||
| 283 | + | ||
| 203 | deviceProviderService.deviceDisconnected(deviceId); | 284 | deviceProviderService.deviceDisconnected(deviceId); |
| 204 | } | 285 | } |
| 205 | 286 | ||
| ... | @@ -211,6 +292,24 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -211,6 +292,24 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 211 | return; | 292 | return; |
| 212 | } | 293 | } |
| 213 | LinkDescription linkDes = buildLinkDes(linkNlri, details, true); | 294 | LinkDescription linkDes = buildLinkDes(linkNlri, details, true); |
| 295 | + | ||
| 296 | + /* | ||
| 297 | + * Update link ports and configure bandwidth on source and destination port using networkConfig service | ||
| 298 | + * Only master of source link registers for bandwidth | ||
| 299 | + */ | ||
| 300 | + if (mastershipService.isLocalMaster(linkDes.src().deviceId())) { | ||
| 301 | + registerBandwidth(linkDes, details); | ||
| 302 | + } | ||
| 303 | + | ||
| 304 | + //Updating ports of the link | ||
| 305 | + List<PortDescription> srcPortDescriptions = new LinkedList<>(); | ||
| 306 | + srcPortDescriptions.add(new DefaultPortDescription(linkDes.src().port(), true)); | ||
| 307 | + deviceProviderService.updatePorts(linkDes.src().deviceId(), srcPortDescriptions); | ||
| 308 | + | ||
| 309 | + List<PortDescription> dstPortDescriptions = new LinkedList<>(); | ||
| 310 | + dstPortDescriptions.add(new DefaultPortDescription(linkDes.dst().port(), true)); | ||
| 311 | + deviceProviderService.updatePorts(linkDes.dst().deviceId(), dstPortDescriptions); | ||
| 312 | + | ||
| 214 | linkProviderService.linkDetected(linkDes); | 313 | linkProviderService.linkDetected(linkDes); |
| 215 | } | 314 | } |
| 216 | 315 | ||
| ... | @@ -273,7 +372,12 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -273,7 +372,12 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 273 | 372 | ||
| 274 | addOrDeletePseudoNode(isAddLink, localPseduo, remotePseduo, srcNodeNlri, | 373 | addOrDeletePseudoNode(isAddLink, localPseduo, remotePseduo, srcNodeNlri, |
| 275 | dstNodeNlri, srcId, dstId, details); | 374 | dstNodeNlri, srcId, dstId, details); |
| 276 | - return new DefaultLinkDescription(src, dst, Link.Type.DIRECT, false); | 375 | + DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder(); |
| 376 | + if (details != null) { | ||
| 377 | + annotationBuilder = getAnnotations(annotationBuilder, false, details); | ||
| 378 | + } | ||
| 379 | + | ||
| 380 | + return new DefaultLinkDescription(src, dst, Link.Type.DIRECT, false, annotationBuilder.build()); | ||
| 277 | } | 381 | } |
| 278 | 382 | ||
| 279 | private void addOrDeletePseudoNode(boolean isAddLink, boolean localPseduo, boolean remotePseduo, | 383 | private void addOrDeletePseudoNode(boolean isAddLink, boolean localPseduo, boolean remotePseduo, |
| ... | @@ -322,10 +426,140 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi | ... | @@ -322,10 +426,140 @@ public class BgpTopologyProvider extends AbstractProvider implements DeviceProvi |
| 322 | } | 426 | } |
| 323 | 427 | ||
| 324 | LinkDescription linkDes = buildLinkDes(linkNlri, null, false); | 428 | LinkDescription linkDes = buildLinkDes(linkNlri, null, false); |
| 429 | + | ||
| 430 | + /* | ||
| 431 | + * Only master for the link src will release the bandwidth resource. | ||
| 432 | + */ | ||
| 433 | + if (networkConfigService != null && mastershipService.isLocalMaster(linkDes.src().deviceId())) { | ||
| 434 | + // Releases registered resource for this link | ||
| 435 | + networkConfigService.removeConfig(linkDes.src(), BandwidthCapacity.class); | ||
| 436 | + networkConfigService.removeConfig(linkDes.dst(), BandwidthCapacity.class); | ||
| 437 | + } | ||
| 438 | + | ||
| 325 | linkProviderService.linkVanished(linkDes); | 439 | linkProviderService.linkVanished(linkDes); |
| 326 | } | 440 | } |
| 327 | } | 441 | } |
| 328 | 442 | ||
| 443 | + // Creates label resource pool for the specific device. For all devices label range is 5122-9217 | ||
| 444 | + private void createDevicePool(DeviceId deviceId) { | ||
| 445 | + if (labelResourceAdminService == null) { | ||
| 446 | + return; | ||
| 447 | + } | ||
| 448 | + | ||
| 449 | + labelResourceAdminService.createDevicePool(deviceId, beginLabel, endLabel); | ||
| 450 | + } | ||
| 451 | + | ||
| 452 | + private void registerBandwidth(LinkDescription linkDes, PathAttrNlriDetails details) { | ||
| 453 | + if (details == null) { | ||
| 454 | + log.error("Couldnot able to register bandwidth "); | ||
| 455 | + return; | ||
| 456 | + } | ||
| 457 | + | ||
| 458 | + List<BgpValueType> attribute = details.pathAttributes().stream() | ||
| 459 | + .filter(attr -> attr instanceof LinkStateAttributes).collect(toList()); | ||
| 460 | + if (attribute.isEmpty()) { | ||
| 461 | + return; | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + List<BgpValueType> tlvs = ((LinkStateAttributes) attribute.iterator().next()).linkStateAttributes(); | ||
| 465 | + float maxReservableBw = 0; | ||
| 466 | + | ||
| 467 | + for (BgpValueType tlv : tlvs) { | ||
| 468 | + switch (tlv.getType()) { | ||
| 469 | + case LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH: | ||
| 470 | + maxReservableBw = ((BgpLinkAttrMaxLinkBandwidth) tlv).linkAttrMaxLinkBandwidth(); | ||
| 471 | + break; | ||
| 472 | + default: // do nothing | ||
| 473 | + } | ||
| 474 | + } | ||
| 475 | + | ||
| 476 | + if (maxReservableBw == 0.0) { | ||
| 477 | + return; | ||
| 478 | + } | ||
| 479 | + | ||
| 480 | + //Configure bandwidth for src and dst port | ||
| 481 | + BandwidthCapacity config = networkConfigService.addConfig(linkDes.src(), BandwidthCapacity.class); | ||
| 482 | + config.capacity(Bandwidth.bps(maxReservableBw)).apply(); | ||
| 483 | + | ||
| 484 | + config = networkConfigService.addConfig(linkDes.dst(), BandwidthCapacity.class); | ||
| 485 | + config.capacity(Bandwidth.bps(maxReservableBw)).apply(); | ||
| 486 | + } | ||
| 487 | + | ||
| 488 | + private DefaultAnnotations.Builder getAnnotations(DefaultAnnotations.Builder annotationBuilder, boolean isNode, | ||
| 489 | + PathAttrNlriDetails details) { | ||
| 490 | + | ||
| 491 | + List<BgpValueType> attribute = details.pathAttributes().stream() | ||
| 492 | + .filter(attr -> attr instanceof LinkStateAttributes).collect(toList()); | ||
| 493 | + if (attribute.isEmpty()) { | ||
| 494 | + return annotationBuilder; | ||
| 495 | + } | ||
| 496 | + List<BgpValueType> tlvs = ((LinkStateAttributes) attribute.iterator().next()).linkStateAttributes(); | ||
| 497 | + boolean abrBit = false; | ||
| 498 | + boolean externalBit = false; | ||
| 499 | + boolean pseudo = false; | ||
| 500 | + int igpMetric = 0; | ||
| 501 | + int teMetric = 0; | ||
| 502 | + byte[] areaId = null; | ||
| 503 | + Ip4Address routerId = null; | ||
| 504 | + for (BgpValueType tlv : tlvs) { | ||
| 505 | + switch (tlv.getType()) { | ||
| 506 | + case LinkStateAttributes.ATTR_NODE_FLAG_BITS: | ||
| 507 | + abrBit = ((BgpAttrNodeFlagBitTlv) tlv).abrBit(); | ||
| 508 | + externalBit = ((BgpAttrNodeFlagBitTlv) tlv).externalBit(); | ||
| 509 | + break; | ||
| 510 | + case NodeDescriptors.IGP_ROUTERID_TYPE: | ||
| 511 | + if (tlv instanceof IsIsPseudonode || tlv instanceof OspfPseudonode) { | ||
| 512 | + pseudo = true; | ||
| 513 | + } | ||
| 514 | + break; | ||
| 515 | + case LinkStateAttributes.ATTR_NODE_ISIS_AREA_ID: | ||
| 516 | + areaId = ((BgpAttrNodeIsIsAreaId) tlv).attrNodeIsIsAreaId(); | ||
| 517 | + break; | ||
| 518 | + case LinkStateAttributes.ATTR_NODE_IPV4_LOCAL_ROUTER_ID: | ||
| 519 | + routerId = ((BgpAttrRouterIdV4) tlv).attrRouterId(); | ||
| 520 | + break; | ||
| 521 | + case LinkStateAttributes.ATTR_LINK_IGP_METRIC: | ||
| 522 | + igpMetric = ((BgpLinkAttrIgpMetric) tlv).attrLinkIgpMetric(); | ||
| 523 | + break; | ||
| 524 | + case LinkStateAttributes.ATTR_LINK_TE_DEFAULT_METRIC: | ||
| 525 | + teMetric = ((BgpLinkAttrTeDefaultMetric) tlv).attrLinkDefTeMetric(); | ||
| 526 | + break; | ||
| 527 | + default: // do nothing | ||
| 528 | + } | ||
| 529 | + } | ||
| 530 | + | ||
| 531 | + // Annotations for device | ||
| 532 | + if (isNode) { | ||
| 533 | + boolean internalBit = false; | ||
| 534 | + if (!abrBit && !externalBit) { | ||
| 535 | + internalBit = true; | ||
| 536 | + } | ||
| 537 | + | ||
| 538 | + annotationBuilder.set(EXTERNAL_BIT, String.valueOf(externalBit)); | ||
| 539 | + annotationBuilder.set(ABR_BIT, String.valueOf(abrBit)); | ||
| 540 | + annotationBuilder.set(INTERNAL_BIT, String.valueOf(internalBit)); | ||
| 541 | + annotationBuilder.set(PSEUDO, String.valueOf(pseudo)); | ||
| 542 | + | ||
| 543 | + if (areaId != null) { | ||
| 544 | + annotationBuilder.set(AREAID, new String(areaId)); | ||
| 545 | + } | ||
| 546 | + if (routerId != null) { | ||
| 547 | + // LsrID | ||
| 548 | + annotationBuilder.set(LSRID, String.valueOf(routerId)); | ||
| 549 | + } | ||
| 550 | + } else { | ||
| 551 | + // Annotations for link | ||
| 552 | + if (igpMetric != 0) { | ||
| 553 | + annotationBuilder.set(COST, String.valueOf(igpMetric)); | ||
| 554 | + } | ||
| 555 | + | ||
| 556 | + if (teMetric != 0) { | ||
| 557 | + annotationBuilder.set(TE_COST, String.valueOf(teMetric)); | ||
| 558 | + } | ||
| 559 | + } | ||
| 560 | + return annotationBuilder; | ||
| 561 | + } | ||
| 562 | + | ||
| 329 | @Override | 563 | @Override |
| 330 | public void triggerProbe(DeviceId deviceId) { | 564 | public void triggerProbe(DeviceId deviceId) { |
| 331 | // TODO Auto-generated method stub | 565 | // TODO Auto-generated method stub | ... | ... |
| ... | @@ -16,6 +16,8 @@ import static org.hamcrest.MatcherAssert.assertThat; | ... | @@ -16,6 +16,8 @@ import static org.hamcrest.MatcherAssert.assertThat; |
| 16 | import static org.hamcrest.core.Is.is; | 16 | import static org.hamcrest.core.Is.is; |
| 17 | import static org.hamcrest.core.IsNot.not; | 17 | import static org.hamcrest.core.IsNot.not; |
| 18 | import static org.onosproject.net.Link.State.ACTIVE; | 18 | import static org.onosproject.net.Link.State.ACTIVE; |
| 19 | +import static org.onosproject.net.MastershipRole.MASTER; | ||
| 20 | +import static org.hamcrest.Matchers.nullValue; | ||
| 19 | 21 | ||
| 20 | import java.util.Collection; | 22 | import java.util.Collection; |
| 21 | import java.util.HashMap; | 23 | import java.util.HashMap; |
| ... | @@ -29,7 +31,11 @@ import java.util.concurrent.CopyOnWriteArraySet; | ... | @@ -29,7 +31,11 @@ import java.util.concurrent.CopyOnWriteArraySet; |
| 29 | import org.junit.After; | 31 | import org.junit.After; |
| 30 | import org.junit.Before; | 32 | import org.junit.Before; |
| 31 | import org.junit.Test; | 33 | import org.junit.Test; |
| 34 | +import org.onlab.junit.TestUtils; | ||
| 35 | +import org.onlab.junit.TestUtils.TestUtilsException; | ||
| 32 | import org.onlab.packet.ChassisId; | 36 | import org.onlab.packet.ChassisId; |
| 37 | +import org.onlab.packet.Ip4Address; | ||
| 38 | +import org.onlab.util.Bandwidth; | ||
| 33 | import org.onosproject.bgp.controller.BgpLinkListener; | 39 | import org.onosproject.bgp.controller.BgpLinkListener; |
| 34 | import org.onosproject.bgp.controller.BgpNodeListener; | 40 | import org.onosproject.bgp.controller.BgpNodeListener; |
| 35 | import org.onosproject.bgpio.exceptions.BgpParseException; | 41 | import org.onosproject.bgpio.exceptions.BgpParseException; |
| ... | @@ -43,9 +49,26 @@ import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails; | ... | @@ -43,9 +49,26 @@ import org.onosproject.bgpio.protocol.linkstate.PathAttrNlriDetails; |
| 43 | import org.onosproject.bgpio.types.AutonomousSystemTlv; | 49 | import org.onosproject.bgpio.types.AutonomousSystemTlv; |
| 44 | import org.onosproject.bgpio.types.BgpValueType; | 50 | import org.onosproject.bgpio.types.BgpValueType; |
| 45 | import org.onosproject.bgpio.types.IsIsNonPseudonode; | 51 | import org.onosproject.bgpio.types.IsIsNonPseudonode; |
| 52 | +import org.onosproject.bgpio.types.LinkStateAttributes; | ||
| 53 | +import org.onosproject.incubator.net.resource.label.LabelResourceAdminService; | ||
| 54 | +import org.onosproject.incubator.net.resource.label.LabelResourceId; | ||
| 55 | +import org.onosproject.incubator.net.resource.label.LabelResourcePool; | ||
| 56 | +import org.onosproject.mastership.MastershipEvent; | ||
| 57 | +import org.onosproject.mastership.MastershipListener; | ||
| 58 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 59 | +import org.onosproject.mastership.MastershipEvent.Type; | ||
| 60 | +import org.onosproject.net.link.LinkServiceAdapter; | ||
| 46 | import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv; | 61 | import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv; |
| 47 | import org.onosproject.bgpio.types.RouteDistinguisher; | 62 | import org.onosproject.bgpio.types.RouteDistinguisher; |
| 63 | +import org.onosproject.bgpio.types.attr.BgpAttrNodeFlagBitTlv; | ||
| 64 | +import org.onosproject.bgpio.types.attr.BgpAttrNodeIsIsAreaId; | ||
| 65 | +import org.onosproject.bgpio.types.attr.BgpAttrRouterIdV4; | ||
| 66 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrIgpMetric; | ||
| 67 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrMaxLinkBandwidth; | ||
| 68 | +import org.onosproject.bgpio.types.attr.BgpLinkAttrTeDefaultMetric; | ||
| 48 | import org.onosproject.bgpio.util.Constants; | 69 | import org.onosproject.bgpio.util.Constants; |
| 70 | +import org.onosproject.cluster.NodeId; | ||
| 71 | +import org.onosproject.cluster.RoleInfo; | ||
| 49 | import org.onosproject.net.ConnectPoint; | 72 | import org.onosproject.net.ConnectPoint; |
| 50 | import org.onosproject.net.DefaultDevice; | 73 | import org.onosproject.net.DefaultDevice; |
| 51 | import org.onosproject.net.DefaultLink; | 74 | import org.onosproject.net.DefaultLink; |
| ... | @@ -53,6 +76,11 @@ import org.onosproject.net.Device; | ... | @@ -53,6 +76,11 @@ import org.onosproject.net.Device; |
| 53 | import org.onosproject.net.DeviceId; | 76 | import org.onosproject.net.DeviceId; |
| 54 | import org.onosproject.net.Link; | 77 | import org.onosproject.net.Link; |
| 55 | import org.onosproject.net.MastershipRole; | 78 | import org.onosproject.net.MastershipRole; |
| 79 | +import org.onosproject.net.PortNumber; | ||
| 80 | +import org.onosproject.net.config.Config; | ||
| 81 | +import org.onosproject.net.config.ConfigApplyDelegate; | ||
| 82 | +import org.onosproject.net.config.ConfigFactory; | ||
| 83 | +import org.onosproject.net.config.NetworkConfigRegistryAdapter; | ||
| 56 | import org.onosproject.net.device.DeviceDescription; | 84 | import org.onosproject.net.device.DeviceDescription; |
| 57 | import org.onosproject.net.device.DeviceProvider; | 85 | import org.onosproject.net.device.DeviceProvider; |
| 58 | import org.onosproject.net.device.DeviceProviderRegistry; | 86 | import org.onosproject.net.device.DeviceProviderRegistry; |
| ... | @@ -65,6 +93,15 @@ import org.onosproject.net.link.LinkProvider; | ... | @@ -65,6 +93,15 @@ import org.onosproject.net.link.LinkProvider; |
| 65 | import org.onosproject.net.link.LinkProviderRegistry; | 93 | import org.onosproject.net.link.LinkProviderRegistry; |
| 66 | import org.onosproject.net.link.LinkProviderService; | 94 | import org.onosproject.net.link.LinkProviderService; |
| 67 | import org.onosproject.net.provider.ProviderId; | 95 | import org.onosproject.net.provider.ProviderId; |
| 96 | +import org.onosproject.net.config.basics.BandwidthCapacity; | ||
| 97 | +import org.onosproject.net.resource.Resource; | ||
| 98 | +import org.onosproject.net.resource.ResourceAdminService; | ||
| 99 | +import org.onosproject.net.resource.ResourceId; | ||
| 100 | + | ||
| 101 | +import com.fasterxml.jackson.databind.JsonNode; | ||
| 102 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 103 | +import com.fasterxml.jackson.databind.node.JsonNodeFactory; | ||
| 104 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 68 | 105 | ||
| 69 | /** | 106 | /** |
| 70 | * Test for BGP topology provider. | 107 | * Test for BGP topology provider. |
| ... | @@ -73,21 +110,31 @@ public class BgpTopologyProviderTest { | ... | @@ -73,21 +110,31 @@ public class BgpTopologyProviderTest { |
| 73 | private static final DeviceId DID2 = DeviceId.deviceId("l3:rd=0::routinguniverse=0:asn=10"); | 110 | private static final DeviceId DID2 = DeviceId.deviceId("l3:rd=0::routinguniverse=0:asn=10"); |
| 74 | private static final String UNKNOWN = new String("unknown"); | 111 | private static final String UNKNOWN = new String("unknown"); |
| 75 | public static ProviderId providerId = new ProviderId("l3", "foo"); | 112 | public static ProviderId providerId = new ProviderId("l3", "foo"); |
| 113 | + private static final NodeId NODE1 = new NodeId("Master1"); | ||
| 76 | 114 | ||
| 77 | private final BgpTopologyProvider provider = new BgpTopologyProvider(); | 115 | private final BgpTopologyProvider provider = new BgpTopologyProvider(); |
| 78 | private final TestDeviceRegistry nodeRegistry = new TestDeviceRegistry(); | 116 | private final TestDeviceRegistry nodeRegistry = new TestDeviceRegistry(); |
| 79 | private final TestLinkRegistry linkRegistry = new TestLinkRegistry(); | 117 | private final TestLinkRegistry linkRegistry = new TestLinkRegistry(); |
| 80 | private final MockBgpController controller = new MockBgpController(); | 118 | private final MockBgpController controller = new MockBgpController(); |
| 81 | private MockDeviceService deviceService = new MockDeviceService(); | 119 | private MockDeviceService deviceService = new MockDeviceService(); |
| 120 | + private MockLinkService linkService = new MockLinkService(); | ||
| 121 | + private MockMastershipService mastershipService = new MockMastershipService(); | ||
| 122 | + private MockNetConfigRegistryAdapter networkConfigService = new MockNetConfigRegistryAdapter(); | ||
| 123 | + private MockLabelResourceService labelResourceAdminService = new MockLabelResourceService(); | ||
| 82 | private Map<DeviceId, Device> deviceMap = new HashMap<>(); | 124 | private Map<DeviceId, Device> deviceMap = new HashMap<>(); |
| 83 | - | 125 | + private MastershipListener listener; |
| 84 | 126 | ||
| 85 | @Before | 127 | @Before |
| 86 | - public void startUp() { | 128 | + public void startUp() throws TestUtilsException { |
| 87 | provider.deviceProviderRegistry = nodeRegistry; | 129 | provider.deviceProviderRegistry = nodeRegistry; |
| 88 | provider.linkProviderRegistry = linkRegistry; | 130 | provider.linkProviderRegistry = linkRegistry; |
| 89 | provider.controller = controller; | 131 | provider.controller = controller; |
| 90 | provider.deviceService = deviceService; | 132 | provider.deviceService = deviceService; |
| 133 | + provider.linkService = linkService; | ||
| 134 | + provider.labelResourceAdminService = labelResourceAdminService; | ||
| 135 | + provider.mastershipService = mastershipService; | ||
| 136 | + provider.networkConfigService = networkConfigService; | ||
| 137 | + listener = TestUtils.getField(provider, "masterListener"); | ||
| 91 | provider.activate(); | 138 | provider.activate(); |
| 92 | assertThat("device provider should be registered", not(nodeRegistry.provider)); | 139 | assertThat("device provider should be registered", not(nodeRegistry.provider)); |
| 93 | assertThat("link provider should be registered", not(linkRegistry.linkProvider)); | 140 | assertThat("link provider should be registered", not(linkRegistry.linkProvider)); |
| ... | @@ -101,15 +148,177 @@ public class BgpTopologyProviderTest { | ... | @@ -101,15 +148,177 @@ public class BgpTopologyProviderTest { |
| 101 | provider.controller = null; | 148 | provider.controller = null; |
| 102 | provider.deviceService = null; | 149 | provider.deviceService = null; |
| 103 | provider.deviceProviderRegistry = null; | 150 | provider.deviceProviderRegistry = null; |
| 151 | + provider.linkService = null; | ||
| 152 | + provider.mastershipService = null; | ||
| 153 | + provider.networkConfigService = null; | ||
| 154 | + provider.labelResourceAdminService = null; | ||
| 104 | assertThat(controller.nodeListener, is(new HashSet<BgpNodeListener>())); | 155 | assertThat(controller.nodeListener, is(new HashSet<BgpNodeListener>())); |
| 105 | assertThat(controller.linkListener, is(new HashSet<BgpLinkListener>())); | 156 | assertThat(controller.linkListener, is(new HashSet<BgpLinkListener>())); |
| 106 | } | 157 | } |
| 107 | 158 | ||
| 159 | + private class MockLabelResourceService implements LabelResourceAdminService { | ||
| 160 | + | ||
| 161 | + Map<DeviceId, LabelResourcePool> resourcePool = new HashMap<>(); | ||
| 162 | + | ||
| 163 | + @Override | ||
| 164 | + public boolean createDevicePool(DeviceId deviceId, LabelResourceId beginLabel, LabelResourceId endLabel) { | ||
| 165 | + LabelResourcePool labelResource = new LabelResourcePool(deviceId.toString(), | ||
| 166 | + beginLabel.labelId(), | ||
| 167 | + endLabel.labelId()); | ||
| 168 | + if (resourcePool.containsValue(labelResource)) { | ||
| 169 | + return false; | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + resourcePool.put(deviceId, labelResource); | ||
| 173 | + return true; | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + @Override | ||
| 177 | + public boolean createGlobalPool(LabelResourceId beginLabel, LabelResourceId endLabel) { | ||
| 178 | + // TODO Auto-generated method stub | ||
| 179 | + return false; | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + @Override | ||
| 183 | + public boolean destroyDevicePool(DeviceId deviceId) { | ||
| 184 | + LabelResourcePool devicePool = resourcePool.get(deviceId); | ||
| 185 | + | ||
| 186 | + if (devicePool == null) { | ||
| 187 | + return false; | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + resourcePool.remove(deviceId); | ||
| 191 | + return true; | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + @Override | ||
| 195 | + public boolean destroyGlobalPool() { | ||
| 196 | + // TODO Auto-generated method stub | ||
| 197 | + return false; | ||
| 198 | + } | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + /* Mock test for device service */ | ||
| 202 | + private class MockNetConfigRegistryAdapter extends NetworkConfigRegistryAdapter { | ||
| 203 | + private ConfigFactory cfgFactory; | ||
| 204 | + private Map<ConnectPoint, BandwidthCapacity> classConfig = new HashMap<>(); | ||
| 205 | + | ||
| 206 | + @Override | ||
| 207 | + public void registerConfigFactory(ConfigFactory configFactory) { | ||
| 208 | + cfgFactory = configFactory; | ||
| 209 | + } | ||
| 210 | + | ||
| 211 | + @Override | ||
| 212 | + public void unregisterConfigFactory(ConfigFactory configFactory) { | ||
| 213 | + cfgFactory = null; | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + @Override | ||
| 217 | + public <S, C extends Config<S>> C addConfig(S subject, Class<C> configClass) { | ||
| 218 | + if (configClass == BandwidthCapacity.class) { | ||
| 219 | + BandwidthCapacity devCap = new BandwidthCapacity(); | ||
| 220 | + classConfig.put((ConnectPoint) subject, devCap); | ||
| 221 | + | ||
| 222 | + JsonNode node = new ObjectNode(new MockJsonNode()); | ||
| 223 | + ObjectMapper mapper = new ObjectMapper(); | ||
| 224 | + ConfigApplyDelegate delegate = new InternalApplyDelegate(); | ||
| 225 | + devCap.init((ConnectPoint) subject, null, node, mapper, delegate); | ||
| 226 | + return (C) devCap; | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + return null; | ||
| 230 | + } | ||
| 231 | + | ||
| 232 | + @Override | ||
| 233 | + public <S, C extends Config<S>> void removeConfig(S subject, Class<C> configClass) { | ||
| 234 | + classConfig.remove(subject); | ||
| 235 | + } | ||
| 236 | + | ||
| 237 | + @Override | ||
| 238 | + public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) { | ||
| 239 | + if (configClass == BandwidthCapacity.class) { | ||
| 240 | + return (C) classConfig.get(subject); | ||
| 241 | + } | ||
| 242 | + return null; | ||
| 243 | + } | ||
| 244 | + | ||
| 245 | + private class MockJsonNode extends JsonNodeFactory { | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + // Auxiliary delegate to receive notifications about changes applied to | ||
| 249 | + // the network configuration - by the apps. | ||
| 250 | + private class InternalApplyDelegate implements ConfigApplyDelegate { | ||
| 251 | + @Override | ||
| 252 | + public void onApply(Config config) { | ||
| 253 | + } | ||
| 254 | + } | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + private class MockMastershipService extends MastershipServiceAdapter { | ||
| 258 | + @Override | ||
| 259 | + public MastershipRole getLocalRole(DeviceId deviceId) { | ||
| 260 | + return MASTER; | ||
| 261 | + } | ||
| 262 | + | ||
| 263 | + @Override | ||
| 264 | + public boolean isLocalMaster(DeviceId deviceId) { | ||
| 265 | + return getLocalRole(deviceId) == MASTER; | ||
| 266 | + } | ||
| 267 | + | ||
| 268 | + @Override | ||
| 269 | + public NodeId getMasterFor(DeviceId deviceId) { | ||
| 270 | + return NODE1; | ||
| 271 | + } | ||
| 272 | + } | ||
| 273 | + | ||
| 274 | + private class MockResourceAdminService implements ResourceAdminService { | ||
| 275 | + Map<ResourceId, List<Resource>> registeredRes = new HashMap<>(); | ||
| 276 | + | ||
| 277 | + @Override | ||
| 278 | + public boolean register(List<Resource> resources) { | ||
| 279 | + for (Resource res : resources) { | ||
| 280 | + List<Resource> resource = new LinkedList<>(); | ||
| 281 | + resource.add(res); | ||
| 282 | + if (registeredRes.containsKey(res.id())) { | ||
| 283 | + resource.addAll(registeredRes.get(res.id())); | ||
| 284 | + } | ||
| 285 | + registeredRes.put(res.id(), resource); | ||
| 286 | + } | ||
| 287 | + return true; | ||
| 288 | + } | ||
| 289 | + | ||
| 290 | + @Override | ||
| 291 | + public boolean unregister(List<ResourceId> ids) { | ||
| 292 | + for (ResourceId id : ids) { | ||
| 293 | + if (registeredRes.containsKey(id)) { | ||
| 294 | + registeredRes.remove(id); | ||
| 295 | + } else { | ||
| 296 | + return false; | ||
| 297 | + } | ||
| 298 | + } | ||
| 299 | + return true; | ||
| 300 | + } | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + private class MockLinkService extends LinkServiceAdapter { | ||
| 304 | + | ||
| 305 | + @Override | ||
| 306 | + public Link getLink(ConnectPoint src, ConnectPoint dst) { | ||
| 307 | + for (Link link : linkRegistry.links) { | ||
| 308 | + if (link.src().equals(src) && link.dst().equals(dst)) { | ||
| 309 | + return link; | ||
| 310 | + } | ||
| 311 | + } | ||
| 312 | + return null; | ||
| 313 | + } | ||
| 314 | + } | ||
| 315 | + | ||
| 108 | /* Class implement device test registry */ | 316 | /* Class implement device test registry */ |
| 109 | private class TestDeviceRegistry implements DeviceProviderRegistry { | 317 | private class TestDeviceRegistry implements DeviceProviderRegistry { |
| 110 | DeviceProvider provider; | 318 | DeviceProvider provider; |
| 111 | 319 | ||
| 112 | Set<DeviceId> connected = new HashSet<>(); | 320 | Set<DeviceId> connected = new HashSet<>(); |
| 321 | + Map<DeviceId, List<PortDescription>> portUpdated = new HashMap<>(); | ||
| 113 | 322 | ||
| 114 | @Override | 323 | @Override |
| 115 | public DeviceProviderService register(DeviceProvider provider) { | 324 | public DeviceProviderService register(DeviceProvider provider) { |
| ... | @@ -138,7 +347,7 @@ public class BgpTopologyProviderTest { | ... | @@ -138,7 +347,7 @@ public class BgpTopologyProviderTest { |
| 138 | if (!deviceId.equals(DID2)) { | 347 | if (!deviceId.equals(DID2)) { |
| 139 | connected.add(deviceId); | 348 | connected.add(deviceId); |
| 140 | Device device = new DefaultDevice(BgpTopologyProviderTest.providerId, deviceId, Device.Type.ROUTER, | 349 | Device device = new DefaultDevice(BgpTopologyProviderTest.providerId, deviceId, Device.Type.ROUTER, |
| 141 | - UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, new ChassisId()); | 350 | + UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, new ChassisId(), deviceDescription.annotations()); |
| 142 | deviceMap.put(deviceId, device); | 351 | deviceMap.put(deviceId, device); |
| 143 | } | 352 | } |
| 144 | } | 353 | } |
| ... | @@ -153,8 +362,7 @@ public class BgpTopologyProviderTest { | ... | @@ -153,8 +362,7 @@ public class BgpTopologyProviderTest { |
| 153 | 362 | ||
| 154 | @Override | 363 | @Override |
| 155 | public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) { | 364 | public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) { |
| 156 | - // TODO Auto-generated method stub | 365 | + portUpdated.put(deviceId, portDescriptions); |
| 157 | - | ||
| 158 | } | 366 | } |
| 159 | 367 | ||
| 160 | @Override | 368 | @Override |
| ... | @@ -202,9 +410,14 @@ public class BgpTopologyProviderTest { | ... | @@ -202,9 +410,14 @@ public class BgpTopologyProviderTest { |
| 202 | 410 | ||
| 203 | @Override | 411 | @Override |
| 204 | public void linkDetected(LinkDescription linkDescription) { | 412 | public void linkDetected(LinkDescription linkDescription) { |
| 205 | - links.add(DefaultLink.builder().src(linkDescription.src()) | 413 | + links.add(DefaultLink.builder() |
| 206 | - .dst(linkDescription.dst()).state(ACTIVE).type(linkDescription.type()) | 414 | + .src(linkDescription.src()) |
| 207 | - .providerId(BgpTopologyProviderTest.providerId).build()); | 415 | + .dst(linkDescription.dst()) |
| 416 | + .state(ACTIVE) | ||
| 417 | + .type(linkDescription.type()) | ||
| 418 | + .providerId(BgpTopologyProviderTest.providerId) | ||
| 419 | + .annotations(linkDescription.annotations()) | ||
| 420 | + .build()); | ||
| 208 | } | 421 | } |
| 209 | 422 | ||
| 210 | @Override | 423 | @Override |
| ... | @@ -349,6 +562,59 @@ public class BgpTopologyProviderTest { | ... | @@ -349,6 +562,59 @@ public class BgpTopologyProviderTest { |
| 349 | } | 562 | } |
| 350 | } | 563 | } |
| 351 | 564 | ||
| 565 | + | ||
| 566 | + /** | ||
| 567 | + * Validate node is added to the device with all device annotations. | ||
| 568 | + */ | ||
| 569 | + @Test | ||
| 570 | + public void bgpTopologyProviderTestAddDevice4() { | ||
| 571 | + LinkedList<BgpValueType> subTlvs = new LinkedList<>(); | ||
| 572 | + BgpValueType tlv = new AutonomousSystemTlv(100); | ||
| 573 | + short deslength = AutonomousSystemTlv.LENGTH; | ||
| 574 | + short desType = AutonomousSystemTlv.TYPE; | ||
| 575 | + | ||
| 576 | + subTlvs.add(tlv); | ||
| 577 | + BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, | ||
| 578 | + desType)); | ||
| 579 | + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, | ||
| 580 | + new RouteDistinguisher()); | ||
| 581 | + | ||
| 582 | + PathAttrNlriDetails details = new PathAttrNlriDetails(); | ||
| 583 | + details.setIdentifier(0); | ||
| 584 | + details.setProtocolID(ProtocolType.DIRECT); | ||
| 585 | + List<BgpValueType> pathAttributes = new LinkedList<>(); | ||
| 586 | + List<BgpValueType> linkStateAttr = new LinkedList<>(); | ||
| 587 | + tlv = BgpAttrNodeFlagBitTlv.of(true, true, true, false); | ||
| 588 | + linkStateAttr.add(tlv); | ||
| 589 | + tlv = BgpAttrNodeIsIsAreaId.of(new byte[] {01, 01, 01, 01}); | ||
| 590 | + linkStateAttr.add(tlv); | ||
| 591 | + tlv = BgpAttrRouterIdV4.of(Ip4Address.valueOf("1.1.1.1"), LinkStateAttributes.ATTR_NODE_IPV4_LOCAL_ROUTER_ID); | ||
| 592 | + linkStateAttr.add(tlv); | ||
| 593 | + pathAttributes.add(new LinkStateAttributes(linkStateAttr)); | ||
| 594 | + details.setPathAttribute(pathAttributes); | ||
| 595 | + | ||
| 596 | + for (BgpNodeListener l : controller.nodeListener) { | ||
| 597 | + l.addNode(nodeNlri, details); | ||
| 598 | + | ||
| 599 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.ABR_BIT), | ||
| 600 | + is("false")); | ||
| 601 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.EXTERNAL_BIT), | ||
| 602 | + is("true")); | ||
| 603 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.INTERNAL_BIT), | ||
| 604 | + is("false")); | ||
| 605 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.PSEUDO), | ||
| 606 | + is("false")); | ||
| 607 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.AREAID).getBytes(), | ||
| 608 | + is(new byte[] {01, 01, 01, 01})); | ||
| 609 | + assertThat(deviceMap.values().iterator().next().annotations().value(BgpTopologyProvider.LSRID), | ||
| 610 | + is("1.1.1.1")); | ||
| 611 | + | ||
| 612 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 613 | + l.deleteNode(nodeNlri); | ||
| 614 | + assertThat(nodeRegistry.connected.size(), is(0)); | ||
| 615 | + } | ||
| 616 | + } | ||
| 617 | + | ||
| 352 | /** | 618 | /** |
| 353 | * Add a link and two devices. | 619 | * Add a link and two devices. |
| 354 | * | 620 | * |
| ... | @@ -460,6 +726,82 @@ public class BgpTopologyProviderTest { | ... | @@ -460,6 +726,82 @@ public class BgpTopologyProviderTest { |
| 460 | } | 726 | } |
| 461 | 727 | ||
| 462 | /** | 728 | /** |
| 729 | + * Add a link and delete a link with registering/unregistering bandwidth. | ||
| 730 | + * | ||
| 731 | + * @throws BgpParseException while adding or removing the link | ||
| 732 | + * @throws InterruptedException while registering for bandwidth | ||
| 733 | + */ | ||
| 734 | + @Test | ||
| 735 | + public void bgpTopologyProviderTestAddLink3() throws BgpParseException, InterruptedException { | ||
| 736 | + LinkedList<BgpValueType> localTlvs = new LinkedList<>(); | ||
| 737 | + LinkedList<BgpValueType> remoteTlvs = new LinkedList<>(); | ||
| 738 | + LinkedList<BgpValueType> linkdes = new LinkedList<>(); | ||
| 739 | + BgpValueType tlv = new AutonomousSystemTlv(10); | ||
| 740 | + short deslength = AutonomousSystemTlv.LENGTH; | ||
| 741 | + short desType = AutonomousSystemTlv.TYPE; | ||
| 742 | + | ||
| 743 | + localTlvs.add(tlv); | ||
| 744 | + remoteTlvs.add(tlv); | ||
| 745 | + tlv = IsIsNonPseudonode.of(new byte[] {20, 20, 20, 20, 00, 20}); | ||
| 746 | + localTlvs.add(tlv); | ||
| 747 | + tlv = IsIsNonPseudonode.of(new byte[] {30, 30, 30, 30, 00, 30}); | ||
| 748 | + remoteTlvs.add(tlv); | ||
| 749 | + NodeDescriptors localNode = new NodeDescriptors(localTlvs, deslength, desType); | ||
| 750 | + NodeDescriptors remoteNode = new NodeDescriptors(remoteTlvs, deslength, desType); | ||
| 751 | + BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(localNode); | ||
| 752 | + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, | ||
| 753 | + new RouteDistinguisher()); | ||
| 754 | + | ||
| 755 | + BgpNodeLSIdentifier remoteNodeDescriptors = new BgpNodeLSIdentifier(remoteNode); | ||
| 756 | + BgpNodeLSNlriVer4 remNodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, remoteNodeDescriptors, false, | ||
| 757 | + new RouteDistinguisher()); | ||
| 758 | + | ||
| 759 | + PathAttrNlriDetails details = new PathAttrNlriDetails(); | ||
| 760 | + details.setIdentifier(0); | ||
| 761 | + details.setProtocolID(ProtocolType.DIRECT); | ||
| 762 | + List<BgpValueType> pathAttributes = new LinkedList<>(); | ||
| 763 | + details.setPathAttribute(pathAttributes); | ||
| 764 | + | ||
| 765 | + tlv = LinkLocalRemoteIdentifiersTlv.of(99, 100); | ||
| 766 | + linkdes.add(tlv); | ||
| 767 | + BgpLinkLSIdentifier linkId = new BgpLinkLSIdentifier(localNode, remoteNode, linkdes); | ||
| 768 | + BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4((byte) Constants.DIRECT, 0, linkId, | ||
| 769 | + new RouteDistinguisher(), false); | ||
| 770 | + | ||
| 771 | + for (BgpNodeListener l : controller.nodeListener) { | ||
| 772 | + l.addNode(nodeNlri, details); | ||
| 773 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 774 | + l.addNode(remNodeNlri, details); | ||
| 775 | + assertThat(nodeRegistry.connected.size(), is(2)); | ||
| 776 | + l.deleteNode(remNodeNlri); | ||
| 777 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 778 | + } | ||
| 779 | + | ||
| 780 | + List<BgpValueType> linkPathAttributes = new LinkedList<>(); | ||
| 781 | + List<BgpValueType> linkStateAttr = new LinkedList<>(); | ||
| 782 | + tlv = BgpLinkAttrIgpMetric.of(10, 4); | ||
| 783 | + linkStateAttr.add(tlv); | ||
| 784 | + tlv = BgpLinkAttrTeDefaultMetric.of(20); | ||
| 785 | + linkStateAttr.add(tlv); | ||
| 786 | + tlv = BgpLinkAttrMaxLinkBandwidth.of(30, LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH); | ||
| 787 | + linkStateAttr.add(tlv); | ||
| 788 | + linkPathAttributes.add(new LinkStateAttributes(linkStateAttr)); | ||
| 789 | + details.setPathAttribute(linkPathAttributes); | ||
| 790 | + | ||
| 791 | + for (BgpLinkListener l : controller.linkListener) { | ||
| 792 | + l.addLink(linkNlri, details); | ||
| 793 | + assertThat(linkRegistry.links.size(), is(1)); | ||
| 794 | + assertThat(linkRegistry.links.iterator().next().annotations().value(BgpTopologyProvider.COST), | ||
| 795 | + is("10")); | ||
| 796 | + assertThat(linkRegistry.links.iterator().next().annotations().value(BgpTopologyProvider.TE_COST), | ||
| 797 | + is("20")); | ||
| 798 | + | ||
| 799 | + l.deleteLink(linkNlri); | ||
| 800 | + assertThat(linkRegistry.links.size(), is(0)); | ||
| 801 | + } | ||
| 802 | + } | ||
| 803 | + | ||
| 804 | + /** | ||
| 463 | * Invalid link. | 805 | * Invalid link. |
| 464 | * | 806 | * |
| 465 | * @throws BgpParseException while adding or deleting a link | 807 | * @throws BgpParseException while adding or deleting a link |
| ... | @@ -512,4 +854,188 @@ public class BgpTopologyProviderTest { | ... | @@ -512,4 +854,188 @@ public class BgpTopologyProviderTest { |
| 512 | assertThat(linkRegistry.links.size(), is(0)); | 854 | assertThat(linkRegistry.links.size(), is(0)); |
| 513 | } | 855 | } |
| 514 | } | 856 | } |
| 857 | + | ||
| 858 | + /** | ||
| 859 | + * Add device check label registration is done. | ||
| 860 | + * | ||
| 861 | + * @throws BgpParseException while adding a device | ||
| 862 | + */ | ||
| 863 | + @Test | ||
| 864 | + public void bgpTopologyProviderDeviceTestLabel1() throws BgpParseException { | ||
| 865 | + LinkedList<BgpValueType> subTlvs = new LinkedList<>(); | ||
| 866 | + BgpValueType tlv = new AutonomousSystemTlv(100); | ||
| 867 | + short deslength = AutonomousSystemTlv.LENGTH; | ||
| 868 | + short desType = AutonomousSystemTlv.TYPE; | ||
| 869 | + | ||
| 870 | + subTlvs.add(tlv); | ||
| 871 | + BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, | ||
| 872 | + desType)); | ||
| 873 | + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, | ||
| 874 | + new RouteDistinguisher()); | ||
| 875 | + | ||
| 876 | + PathAttrNlriDetails details = new PathAttrNlriDetails(); | ||
| 877 | + details.setIdentifier(0); | ||
| 878 | + details.setProtocolID(ProtocolType.DIRECT); | ||
| 879 | + List<BgpValueType> pathAttributes = new LinkedList<>(); | ||
| 880 | + List<BgpValueType> linkStateAttributes = new LinkedList<>(); | ||
| 881 | + tlv = BgpAttrRouterIdV4.of(Ip4Address.valueOf("1.1.1.1"), LinkStateAttributes.ATTR_NODE_IPV4_LOCAL_ROUTER_ID); | ||
| 882 | + linkStateAttributes.add(tlv); | ||
| 883 | + pathAttributes.add(new LinkStateAttributes(linkStateAttributes)); | ||
| 884 | + details.setPathAttribute(pathAttributes); | ||
| 885 | + | ||
| 886 | + for (BgpNodeListener l : controller.nodeListener) { | ||
| 887 | + l.addNode(nodeNlri, details); | ||
| 888 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 889 | + } | ||
| 890 | + | ||
| 891 | + MastershipEvent event = new MastershipEvent(Type.MASTER_CHANGED, nodeRegistry.connected.iterator().next(), | ||
| 892 | + new RoleInfo(NodeId.nodeId("Node1"), new LinkedList<>())); | ||
| 893 | + | ||
| 894 | + listener.event(event); | ||
| 895 | + assertThat(labelResourceAdminService.resourcePool.keySet().size(), is(1)); | ||
| 896 | + } | ||
| 897 | + | ||
| 898 | + /** | ||
| 899 | + * Add device check label registration is done and delete node destroy label pool. | ||
| 900 | + * | ||
| 901 | + * @throws BgpParseException while adding a device | ||
| 902 | + */ | ||
| 903 | + @Test | ||
| 904 | + public void bgpTopologyProviderDeviceTestLabel2() throws BgpParseException { | ||
| 905 | + LinkedList<BgpValueType> subTlvs = new LinkedList<>(); | ||
| 906 | + BgpValueType tlv = new AutonomousSystemTlv(100); | ||
| 907 | + short deslength = AutonomousSystemTlv.LENGTH; | ||
| 908 | + short desType = AutonomousSystemTlv.TYPE; | ||
| 909 | + | ||
| 910 | + subTlvs.add(tlv); | ||
| 911 | + BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(new NodeDescriptors(subTlvs, deslength, | ||
| 912 | + desType)); | ||
| 913 | + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, | ||
| 914 | + new RouteDistinguisher()); | ||
| 915 | + | ||
| 916 | + PathAttrNlriDetails details = new PathAttrNlriDetails(); | ||
| 917 | + details.setIdentifier(0); | ||
| 918 | + details.setProtocolID(ProtocolType.DIRECT); | ||
| 919 | + List<BgpValueType> pathAttributes = new LinkedList<>(); | ||
| 920 | + List<BgpValueType> linkStateAttributes = new LinkedList<>(); | ||
| 921 | + tlv = BgpAttrRouterIdV4.of(Ip4Address.valueOf("1.1.1.1"), LinkStateAttributes.ATTR_NODE_IPV4_LOCAL_ROUTER_ID); | ||
| 922 | + linkStateAttributes.add(tlv); | ||
| 923 | + pathAttributes.add(new LinkStateAttributes(linkStateAttributes)); | ||
| 924 | + details.setPathAttribute(pathAttributes); | ||
| 925 | + | ||
| 926 | + for (BgpNodeListener l : controller.nodeListener) { | ||
| 927 | + l.addNode(nodeNlri, details); | ||
| 928 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 929 | + // Check label resource reserved for that device | ||
| 930 | + MastershipEvent event = new MastershipEvent(Type.MASTER_CHANGED, nodeRegistry.connected.iterator().next(), | ||
| 931 | + new RoleInfo(NodeId.nodeId("Node1"), new LinkedList<>())); | ||
| 932 | + listener.event(event); | ||
| 933 | + assertThat(labelResourceAdminService.resourcePool.keySet().size(), is(1)); | ||
| 934 | + | ||
| 935 | + l.deleteNode(nodeNlri); | ||
| 936 | + assertThat(nodeRegistry.connected.size(), is(0)); | ||
| 937 | + assertThat(labelResourceAdminService.resourcePool.keySet().size(), is(0)); | ||
| 938 | + } | ||
| 939 | + } | ||
| 940 | + | ||
| 941 | + /** | ||
| 942 | + * Add a link register bandwidth and remove link unregister bandwidth. | ||
| 943 | + * | ||
| 944 | + * @throws BgpParseException while registering/unregistering bandwidth | ||
| 945 | + */ | ||
| 946 | + @Test | ||
| 947 | + public void bgpTopologyProviderDeviceTestLabel3() throws BgpParseException { | ||
| 948 | + LinkedList<BgpValueType> localTlvs = new LinkedList<>(); | ||
| 949 | + LinkedList<BgpValueType> remoteTlvs = new LinkedList<>(); | ||
| 950 | + LinkedList<BgpValueType> linkdes = new LinkedList<>(); | ||
| 951 | + BgpValueType tlv = new AutonomousSystemTlv(10); | ||
| 952 | + short deslength = AutonomousSystemTlv.LENGTH; | ||
| 953 | + short desType = AutonomousSystemTlv.TYPE; | ||
| 954 | + | ||
| 955 | + localTlvs.add(tlv); | ||
| 956 | + remoteTlvs.add(tlv); | ||
| 957 | + tlv = IsIsNonPseudonode.of(new byte[] {20, 20, 20, 20, 00, 20}); | ||
| 958 | + localTlvs.add(tlv); | ||
| 959 | + tlv = IsIsNonPseudonode.of(new byte[] {30, 30, 30, 30, 00, 30}); | ||
| 960 | + remoteTlvs.add(tlv); | ||
| 961 | + NodeDescriptors localNode = new NodeDescriptors(localTlvs, deslength, desType); | ||
| 962 | + NodeDescriptors remoteNode = new NodeDescriptors(remoteTlvs, deslength, desType); | ||
| 963 | + BgpNodeLSIdentifier localNodeDescriptors = new BgpNodeLSIdentifier(localNode); | ||
| 964 | + BgpNodeLSNlriVer4 nodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, localNodeDescriptors, false, | ||
| 965 | + new RouteDistinguisher()); | ||
| 966 | + | ||
| 967 | + BgpNodeLSIdentifier remoteNodeDescriptors = new BgpNodeLSIdentifier(remoteNode); | ||
| 968 | + BgpNodeLSNlriVer4 remNodeNlri = new BgpNodeLSNlriVer4(0, (byte) Constants.DIRECT, remoteNodeDescriptors, false, | ||
| 969 | + new RouteDistinguisher()); | ||
| 970 | + | ||
| 971 | + PathAttrNlriDetails details = new PathAttrNlriDetails(); | ||
| 972 | + details.setIdentifier(0); | ||
| 973 | + details.setProtocolID(ProtocolType.DIRECT); | ||
| 974 | + List<BgpValueType> pathAttributes = new LinkedList<>(); | ||
| 975 | + List<BgpValueType> linkStateAttributes = new LinkedList<>(); | ||
| 976 | + tlv = BgpAttrRouterIdV4.of(Ip4Address.valueOf("1.1.1.1"), LinkStateAttributes.ATTR_NODE_IPV4_LOCAL_ROUTER_ID); | ||
| 977 | + linkStateAttributes.add(tlv); | ||
| 978 | + pathAttributes.add(new LinkStateAttributes(linkStateAttributes)); | ||
| 979 | + details.setPathAttribute(pathAttributes); | ||
| 980 | + | ||
| 981 | + tlv = LinkLocalRemoteIdentifiersTlv.of(99, 100); | ||
| 982 | + linkdes.add(tlv); | ||
| 983 | + BgpLinkLSIdentifier linkId = new BgpLinkLSIdentifier(localNode, remoteNode, linkdes); | ||
| 984 | + BgpLinkLsNlriVer4 linkNlri = new BgpLinkLsNlriVer4((byte) Constants.DIRECT, 0, linkId, | ||
| 985 | + new RouteDistinguisher(), false); | ||
| 986 | + | ||
| 987 | + for (BgpNodeListener l : controller.nodeListener) { | ||
| 988 | + l.addNode(nodeNlri, details); | ||
| 989 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 990 | + //Check label resource reserved for that device | ||
| 991 | + MastershipEvent event = new MastershipEvent(Type.MASTER_CHANGED, nodeRegistry.connected.iterator().next(), | ||
| 992 | + new RoleInfo(NodeId.nodeId("Node1"), new LinkedList<>())); | ||
| 993 | + listener.event(event); | ||
| 994 | + assertThat(labelResourceAdminService.resourcePool.keySet().size(), is(1)); | ||
| 995 | + l.addNode(remNodeNlri, details); | ||
| 996 | + assertThat(nodeRegistry.connected.size(), is(2)); | ||
| 997 | + l.deleteNode(remNodeNlri); | ||
| 998 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 999 | + assertThat(labelResourceAdminService.resourcePool.keySet().size(), is(1)); | ||
| 1000 | + } | ||
| 1001 | + | ||
| 1002 | + List<BgpValueType> linkPathAttributes = new LinkedList<>(); | ||
| 1003 | + List<BgpValueType> linkStateAttr = new LinkedList<>(); | ||
| 1004 | + tlv = BgpLinkAttrIgpMetric.of(10, 4); | ||
| 1005 | + linkStateAttr.add(tlv); | ||
| 1006 | + tlv = BgpLinkAttrTeDefaultMetric.of(20); | ||
| 1007 | + linkStateAttr.add(tlv); | ||
| 1008 | + tlv = BgpLinkAttrMaxLinkBandwidth.of(70, LinkStateAttributes.ATTR_LINK_MAX_RES_BANDWIDTH); | ||
| 1009 | + linkStateAttr.add(tlv); | ||
| 1010 | + linkPathAttributes.add(new LinkStateAttributes(linkStateAttr)); | ||
| 1011 | + details.setPathAttribute(linkPathAttributes); | ||
| 1012 | + | ||
| 1013 | + for (BgpLinkListener l : controller.linkListener) { | ||
| 1014 | + l.addLink(linkNlri, details); | ||
| 1015 | + assertThat(linkRegistry.links.size(), is(1)); | ||
| 1016 | + assertThat(linkRegistry.links.iterator().next().annotations().value(BgpTopologyProvider.COST), | ||
| 1017 | + is("10")); | ||
| 1018 | + assertThat(linkRegistry.links.iterator().next().annotations().value(BgpTopologyProvider.TE_COST), | ||
| 1019 | + is("20")); | ||
| 1020 | + | ||
| 1021 | + ConnectPoint src = new ConnectPoint( | ||
| 1022 | + DeviceId.deviceId("l3:rd=0::routinguniverse=0:asn=10:isoid=1414.1414.0014"), | ||
| 1023 | + PortNumber.portNumber(4294967395L)); | ||
| 1024 | + ConnectPoint dst = new ConnectPoint( | ||
| 1025 | + DeviceId.deviceId("l3:rd=0::routinguniverse=0:asn=10:isoid=1e1e.1e1e.001e"), | ||
| 1026 | + PortNumber.portNumber(4294967396L)); | ||
| 1027 | + BandwidthCapacity bandwidth = networkConfigService.getConfig(src, BandwidthCapacity.class); | ||
| 1028 | + assertThat(bandwidth.capacity().bps(), is(70.0 * 1_000_000L)); | ||
| 1029 | + | ||
| 1030 | + bandwidth = networkConfigService.getConfig(dst, BandwidthCapacity.class); | ||
| 1031 | + assertThat(bandwidth.capacity(), is(Bandwidth.bps(70.0 * 1_000_000L))); | ||
| 1032 | + | ||
| 1033 | + l.deleteLink(linkNlri); | ||
| 1034 | + assertThat(linkRegistry.links.size(), is(0)); | ||
| 1035 | + bandwidth = networkConfigService.getConfig(src, BandwidthCapacity.class); | ||
| 1036 | + assertThat(bandwidth, is(nullValue())); | ||
| 1037 | + bandwidth = networkConfigService.getConfig(dst, BandwidthCapacity.class); | ||
| 1038 | + assertThat(bandwidth, is(nullValue())); | ||
| 1039 | + } | ||
| 1040 | + } | ||
| 515 | } | 1041 | } | ... | ... |
providers/pcep/packet/pom.xml
0 → 100644
| 1 | +<!-- | ||
| 2 | + ~ Copyright 2016-present Open Networking Laboratory | ||
| 3 | + ~ | ||
| 4 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + ~ you may not use this file except in compliance with the License. | ||
| 6 | + ~ You may obtain a copy of the License at | ||
| 7 | + ~ | ||
| 8 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + ~ | ||
| 10 | + ~ Unless required by applicable law or agreed to in writing, software | ||
| 11 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + ~ See the License for the specific language governing permissions and | ||
| 14 | + ~ limitations under the License. | ||
| 15 | + --> | ||
| 16 | +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 17 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 18 | + <modelVersion>4.0.0</modelVersion> | ||
| 19 | + <parent> | ||
| 20 | + <groupId>org.onosproject</groupId> | ||
| 21 | + <artifactId>onos-pcep-providers</artifactId> | ||
| 22 | + <version>1.6.0-SNAPSHOT</version> | ||
| 23 | + </parent> | ||
| 24 | + <artifactId>onos-pcep-provider-packet</artifactId> | ||
| 25 | + <packaging>bundle</packaging> | ||
| 26 | + <description>PCEP packet provider</description> | ||
| 27 | + <dependencies> | ||
| 28 | + <dependency> | ||
| 29 | + <groupId>org.onosproject</groupId> | ||
| 30 | + <artifactId>onos-pcep-controller-api</artifactId> | ||
| 31 | + </dependency> | ||
| 32 | + </dependencies> | ||
| 33 | +</project> |
| 1 | +package org.onosproject.provider.pcep.packet.impl; | ||
| 2 | + | ||
| 3 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 4 | + | ||
| 5 | +import org.apache.felix.scr.annotations.Activate; | ||
| 6 | +import org.apache.felix.scr.annotations.Component; | ||
| 7 | +import org.apache.felix.scr.annotations.Deactivate; | ||
| 8 | +import org.apache.felix.scr.annotations.Reference; | ||
| 9 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 10 | +import org.apache.felix.scr.annotations.Service; | ||
| 11 | +import org.onlab.packet.Ethernet; | ||
| 12 | +import org.onlab.packet.IPv4; | ||
| 13 | +import org.onlab.packet.TCP; | ||
| 14 | +import org.onosproject.net.AnnotationKeys; | ||
| 15 | +import org.onosproject.net.ConnectPoint; | ||
| 16 | +import org.onosproject.net.Device; | ||
| 17 | +import org.onosproject.net.DeviceId; | ||
| 18 | +import org.onosproject.net.PortNumber; | ||
| 19 | +import org.onosproject.net.device.DeviceService; | ||
| 20 | +import org.onosproject.net.packet.DefaultInboundPacket; | ||
| 21 | +import org.onosproject.net.packet.DefaultPacketContext; | ||
| 22 | +import org.onosproject.net.packet.InboundPacket; | ||
| 23 | +import org.onosproject.net.packet.OutboundPacket; | ||
| 24 | +import org.onosproject.net.packet.PacketProvider; | ||
| 25 | +import org.onosproject.net.packet.PacketProviderRegistry; | ||
| 26 | +import org.onosproject.net.packet.PacketProviderService; | ||
| 27 | +import org.onosproject.net.provider.AbstractProvider; | ||
| 28 | +import org.onosproject.net.provider.ProviderId; | ||
| 29 | +import org.onosproject.pcep.controller.PccId; | ||
| 30 | +import org.onosproject.pcep.controller.PcepClientController; | ||
| 31 | +import org.onosproject.pcep.controller.PcepPacketListener; | ||
| 32 | +import org.slf4j.Logger; | ||
| 33 | + | ||
| 34 | +/** | ||
| 35 | + * Provider which uses an PCEP controller to process packets. | ||
| 36 | + */ | ||
| 37 | +@Component(immediate = true) | ||
| 38 | +@Service | ||
| 39 | +public class PcepPacketProvider extends AbstractProvider implements PacketProvider { | ||
| 40 | + | ||
| 41 | + private static final Logger log = getLogger(PcepPacketProvider.class); | ||
| 42 | + static final String PROVIDER_ID = "org.onosproject.provider.packet.pcep"; | ||
| 43 | + | ||
| 44 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 45 | + protected PacketProviderRegistry packetProviderRegistry; | ||
| 46 | + | ||
| 47 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 48 | + protected PcepClientController pcepClientController; | ||
| 49 | + | ||
| 50 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 51 | + protected DeviceService deviceService; | ||
| 52 | + | ||
| 53 | + PacketProviderService packetProviderService; | ||
| 54 | + | ||
| 55 | + private InnerPacketProvider listener = new InnerPacketProvider(); | ||
| 56 | + public static final String LSRID = "lsrId"; | ||
| 57 | + public static final int PCEP_PORT = 4189; | ||
| 58 | + | ||
| 59 | + /** | ||
| 60 | + * Creates a Packet provider. | ||
| 61 | + */ | ||
| 62 | + public PcepPacketProvider() { | ||
| 63 | + super(new ProviderId("pcep", PROVIDER_ID)); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + @Activate | ||
| 67 | + public void activate() { | ||
| 68 | + packetProviderService = packetProviderRegistry.register(this); | ||
| 69 | + pcepClientController.addPacketListener(listener); | ||
| 70 | + log.info("Started"); | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + @Deactivate | ||
| 74 | + public void deactivate() { | ||
| 75 | + packetProviderRegistry.unregister(this); | ||
| 76 | + pcepClientController.removePacketListener(listener); | ||
| 77 | + log.info("Stopped"); | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + private class InnerPacketProvider implements PcepPacketListener { | ||
| 81 | + @Override | ||
| 82 | + public void sendPacketIn(PccId pccId) { | ||
| 83 | + TCP tcp = new TCP(); | ||
| 84 | + // Set the well known PCEP port. To be used to decide to process/discard the packet while processing. | ||
| 85 | + tcp.setDestinationPort(PCEP_PORT); | ||
| 86 | + | ||
| 87 | + IPv4 ipv4 = new IPv4(); | ||
| 88 | + ipv4.setProtocol(IPv4.PROTOCOL_TCP); | ||
| 89 | + ipv4.setPayload(tcp); | ||
| 90 | + | ||
| 91 | + Ethernet eth = new Ethernet(); | ||
| 92 | + eth.setEtherType(Ethernet.TYPE_IPV4); | ||
| 93 | + eth.setPayload(ipv4); | ||
| 94 | + | ||
| 95 | + // Get lsrId of the PCEP client from the PCC ID. Session info is based on lsrID. | ||
| 96 | + String lsrId = String.valueOf(pccId.ipAddress()); | ||
| 97 | + DeviceId pccDeviceId = null; | ||
| 98 | + | ||
| 99 | + // Find PCC deviceID from lsrId stored as annotations | ||
| 100 | + Iterable<Device> devices = deviceService.getAvailableDevices(); | ||
| 101 | + for (Device dev : devices) { | ||
| 102 | + if ("L3".equals(dev.annotations().value(AnnotationKeys.TYPE)) | ||
| 103 | + && lsrId.equals(dev.annotations().value(LSRID))) { | ||
| 104 | + pccDeviceId = dev.id(); | ||
| 105 | + break; | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + if (pccDeviceId == null) { | ||
| 110 | + return; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + InboundPacket inPkt = new DefaultInboundPacket(new ConnectPoint(pccDeviceId, | ||
| 114 | + PortNumber.portNumber(PCEP_PORT)), | ||
| 115 | + eth, null); | ||
| 116 | + | ||
| 117 | + packetProviderService.processPacket(new PcepPacketContext(inPkt, null)); | ||
| 118 | + } | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + // Minimal PacketContext to make core and applications happy. | ||
| 122 | + private final class PcepPacketContext extends DefaultPacketContext { | ||
| 123 | + private PcepPacketContext(InboundPacket inPkt, OutboundPacket outPkt) { | ||
| 124 | + super(System.currentTimeMillis(), inPkt, outPkt, false); | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + @Override | ||
| 128 | + public void send() { | ||
| 129 | + // We don't send anything out. | ||
| 130 | + return; | ||
| 131 | + } | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + @Override | ||
| 135 | + public void emit(OutboundPacket packet) { | ||
| 136 | + // Nothing to emit | ||
| 137 | + return; | ||
| 138 | + | ||
| 139 | + } | ||
| 140 | +} |
providers/pcep/packet/src/main/java/org/onosproject/provider/pcep/packet/impl/package-info.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +/** | ||
| 17 | + *Provider that uses PCEP controller as a means to send packets. | ||
| 18 | + */ | ||
| 19 | +package org.onosproject.provider.pcep.packet.impl; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -27,5 +27,6 @@ | ... | @@ -27,5 +27,6 @@ |
| 27 | <module>topology</module> | 27 | <module>topology</module> |
| 28 | <module>tunnel</module> | 28 | <module>tunnel</module> |
| 29 | <module>app</module> | 29 | <module>app</module> |
| 30 | + <module>packet</module> | ||
| 30 | </modules> | 31 | </modules> |
| 31 | </project> | 32 | </project> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -3,6 +3,9 @@ COMPILE_DEPS = [ | ... | @@ -3,6 +3,9 @@ COMPILE_DEPS = [ |
| 3 | '//protocols/ovsdb/api:onos-protocols-ovsdb-api', | 3 | '//protocols/ovsdb/api:onos-protocols-ovsdb-api', |
| 4 | '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc', | 4 | '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc', |
| 5 | '//apps/pcep-api:onos-apps-pcep-api', | 5 | '//apps/pcep-api:onos-apps-pcep-api', |
| 6 | + '//protocols/pcep/api:onos-protocols-pcep-api', | ||
| 7 | + '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | ||
| 8 | + '//core/api:onos-api-tests', | ||
| 6 | ] | 9 | ] |
| 7 | 10 | ||
| 8 | osgi_jar_with_tests ( | 11 | osgi_jar_with_tests ( | ... | ... |
| ... | @@ -23,10 +23,20 @@ | ... | @@ -23,10 +23,20 @@ |
| 23 | <artifactId>onos-pcep-provider-topology</artifactId> | 23 | <artifactId>onos-pcep-provider-topology</artifactId> |
| 24 | <packaging>bundle</packaging> | 24 | <packaging>bundle</packaging> |
| 25 | <description>PCEP topology provider</description> | 25 | <description>PCEP topology provider</description> |
| 26 | - <dependencies> | 26 | + <dependencies> |
| 27 | - <dependency> | 27 | + <dependency> |
| 28 | - <groupId>org.onosproject</groupId> | 28 | + <groupId>org.onosproject</groupId> |
| 29 | - <artifactId>onos-app-pcep-api</artifactId> | 29 | + <artifactId>onos-app-pcep-api</artifactId> |
| 30 | - </dependency> | 30 | + </dependency> |
| 31 | - </dependencies> | 31 | + <dependency> |
| 32 | + <groupId>org.onosproject</groupId> | ||
| 33 | + <artifactId>onos-pcep-controller-api</artifactId> | ||
| 34 | + </dependency> | ||
| 35 | + <dependency> | ||
| 36 | + <groupId>org.onosproject</groupId> | ||
| 37 | + <artifactId>onos-api</artifactId> | ||
| 38 | + <classifier>tests</classifier> | ||
| 39 | + <scope>test</scope> | ||
| 40 | + </dependency> | ||
| 41 | + </dependencies> | ||
| 32 | </project> | 42 | </project> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -62,6 +62,10 @@ import org.onosproject.pcep.api.PcepLinkListener; | ... | @@ -62,6 +62,10 @@ import org.onosproject.pcep.api.PcepLinkListener; |
| 62 | import org.onosproject.pcep.api.PcepOperator.OperationType; | 62 | import org.onosproject.pcep.api.PcepOperator.OperationType; |
| 63 | import org.onosproject.pcep.api.PcepSwitch; | 63 | import org.onosproject.pcep.api.PcepSwitch; |
| 64 | import org.onosproject.pcep.api.PcepSwitchListener; | 64 | import org.onosproject.pcep.api.PcepSwitchListener; |
| 65 | +import org.onosproject.pcep.controller.PccId; | ||
| 66 | +import org.onosproject.pcep.controller.PcepClient; | ||
| 67 | +import org.onosproject.pcep.controller.PcepClientController; | ||
| 68 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
| 65 | import org.slf4j.Logger; | 69 | import org.slf4j.Logger; |
| 66 | import org.slf4j.LoggerFactory; | 70 | import org.slf4j.LoggerFactory; |
| 67 | 71 | ||
| ... | @@ -115,18 +119,40 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -115,18 +119,40 @@ public class PcepTopologyProvider extends AbstractProvider |
| 115 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 119 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 116 | protected ClusterService clusterService; | 120 | protected ClusterService clusterService; |
| 117 | 121 | ||
| 122 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 123 | + protected PcepClientController pcepClientController; | ||
| 124 | + | ||
| 118 | private DeviceProviderService deviceProviderService; | 125 | private DeviceProviderService deviceProviderService; |
| 119 | private LinkProviderService linkProviderService; | 126 | private LinkProviderService linkProviderService; |
| 120 | 127 | ||
| 121 | private HashMap<Long, List<PortDescription>> portMap = new HashMap<>(); | 128 | private HashMap<Long, List<PortDescription>> portMap = new HashMap<>(); |
| 122 | private InternalLinkProvider listener = new InternalLinkProvider(); | 129 | private InternalLinkProvider listener = new InternalLinkProvider(); |
| 123 | 130 | ||
| 131 | + /* | ||
| 132 | + * For the client supporting SR capability. | ||
| 133 | + */ | ||
| 134 | + public static final String SR_CAPABILITY = "srCapability"; | ||
| 135 | + | ||
| 136 | + /* | ||
| 137 | + * For the client supporting PCECC capability. | ||
| 138 | + */ | ||
| 139 | + public static final String PCECC_CAPABILITY = "pceccCapability"; | ||
| 140 | + | ||
| 141 | + /* | ||
| 142 | + * For the client supporting label stack capability. | ||
| 143 | + */ | ||
| 144 | + public static final String LABEL_STACK_CAPABILITY = "labelStackCapability"; | ||
| 145 | + | ||
| 146 | + public static final String LSRID = "lsrId"; | ||
| 147 | + private static final String UNKNOWN = "unknown"; | ||
| 148 | + | ||
| 124 | @Activate | 149 | @Activate |
| 125 | public void activate() { | 150 | public void activate() { |
| 126 | linkProviderService = linkProviderRegistry.register(this); | 151 | linkProviderService = linkProviderRegistry.register(this); |
| 127 | deviceProviderService = deviceProviderRegistry.register(this); | 152 | deviceProviderService = deviceProviderRegistry.register(this); |
| 128 | controller.addListener(listener); | 153 | controller.addListener(listener); |
| 129 | controller.addLinkListener(listener); | 154 | controller.addLinkListener(listener); |
| 155 | + pcepClientController.addNodeListener(listener); | ||
| 130 | } | 156 | } |
| 131 | 157 | ||
| 132 | @Deactivate | 158 | @Deactivate |
| ... | @@ -135,6 +161,7 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -135,6 +161,7 @@ public class PcepTopologyProvider extends AbstractProvider |
| 135 | linkProviderService = null; | 161 | linkProviderService = null; |
| 136 | controller.removeListener(listener); | 162 | controller.removeListener(listener); |
| 137 | controller.removeLinkListener(listener); | 163 | controller.removeLinkListener(listener); |
| 164 | + pcepClientController.removeNodeListener(listener); | ||
| 138 | } | 165 | } |
| 139 | 166 | ||
| 140 | private List<PortDescription> buildPortDescriptions(PcepDpid dpid, | 167 | private List<PortDescription> buildPortDescriptions(PcepDpid dpid, |
| ... | @@ -225,7 +252,7 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -225,7 +252,7 @@ public class PcepTopologyProvider extends AbstractProvider |
| 225 | } | 252 | } |
| 226 | 253 | ||
| 227 | private class InternalLinkProvider | 254 | private class InternalLinkProvider |
| 228 | - implements PcepSwitchListener, PcepLinkListener { | 255 | + implements PcepSwitchListener, PcepLinkListener, PcepNodeListener { |
| 229 | 256 | ||
| 230 | @Override | 257 | @Override |
| 231 | public void switchAdded(PcepDpid dpid) { | 258 | public void switchAdded(PcepDpid dpid) { |
| ... | @@ -306,6 +333,51 @@ public class PcepTopologyProvider extends AbstractProvider | ... | @@ -306,6 +333,51 @@ public class PcepTopologyProvider extends AbstractProvider |
| 306 | } | 333 | } |
| 307 | } | 334 | } |
| 308 | 335 | ||
| 336 | + @Override | ||
| 337 | + public void addNode(PcepClient pc) { | ||
| 338 | + if (deviceProviderService == null) { | ||
| 339 | + return; | ||
| 340 | + } | ||
| 341 | + | ||
| 342 | + //Right now device URI for PCEP devices is their LSRID | ||
| 343 | + DeviceId deviceId = deviceId(uri(new PcepDpid(pc.getPccId().id().getIp4Address().toInt()))); | ||
| 344 | + ChassisId cId = new ChassisId(); | ||
| 345 | + | ||
| 346 | + Device.Type deviceType = Device.Type.ROUTER; | ||
| 347 | + | ||
| 348 | + DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder(); | ||
| 349 | + //PCC capabilities (SR, PCECC and PCECC-SR) | ||
| 350 | + annotationBuilder.set(SR_CAPABILITY, String.valueOf(pc.capability().srCapability())); | ||
| 351 | + annotationBuilder.set(PCECC_CAPABILITY, String.valueOf(pc.capability().pceccCapability())); | ||
| 352 | + annotationBuilder.set(LABEL_STACK_CAPABILITY, String.valueOf(pc.capability().labelStackCapability())); | ||
| 353 | + //PccId is the lsrId contained in openMsg, if not present it will be the socket address | ||
| 354 | + annotationBuilder.set(LSRID, String.valueOf(pc.getPccId().id())); | ||
| 355 | + | ||
| 356 | + DeviceDescription description = new DefaultDeviceDescription( | ||
| 357 | + deviceId.uri(), | ||
| 358 | + deviceType, | ||
| 359 | + UNKNOWN, | ||
| 360 | + UNKNOWN, | ||
| 361 | + UNKNOWN, | ||
| 362 | + UNKNOWN, | ||
| 363 | + cId, | ||
| 364 | + annotationBuilder.build()); | ||
| 365 | + | ||
| 366 | + deviceProviderService.deviceConnected(deviceId, description); | ||
| 367 | + } | ||
| 368 | + | ||
| 369 | + @Override | ||
| 370 | + public void deleteNode(PccId pccId) { | ||
| 371 | + if (deviceProviderService == null || deviceService == null) { | ||
| 372 | + return; | ||
| 373 | + } | ||
| 374 | + //TODO: In device manager, in deviceDisconnected() method, get the device but null check is not validated | ||
| 375 | + if (deviceService.getDevice(DeviceId.deviceId(uri(new PcepDpid(pccId.id() | ||
| 376 | + .getIp4Address().toInt())))) == null) { | ||
| 377 | + return; | ||
| 378 | + } | ||
| 379 | + deviceProviderService.deviceDisconnected(deviceId(uri(new PcepDpid(pccId.id().getIp4Address().toInt())))); | ||
| 380 | + } | ||
| 309 | } | 381 | } |
| 310 | 382 | ||
| 311 | @Override | 383 | @Override | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.provider.pcep.topology.impl; | ||
| 17 | + | ||
| 18 | +import static org.junit.Assert.assertNotNull; | ||
| 19 | + | ||
| 20 | +import java.util.HashMap; | ||
| 21 | +import java.util.List; | ||
| 22 | +import java.util.Map; | ||
| 23 | +import java.util.concurrent.RejectedExecutionException; | ||
| 24 | + | ||
| 25 | +import org.jboss.netty.channel.Channel; | ||
| 26 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 27 | +import org.onosproject.pcep.controller.PccId; | ||
| 28 | +import org.onosproject.pcep.controller.LspKey; | ||
| 29 | +import org.onosproject.pcep.controller.PcepClient; | ||
| 30 | +import org.onosproject.pcep.controller.PcepSyncStatus; | ||
| 31 | +import org.onosproject.pcepio.protocol.PcepFactories; | ||
| 32 | +import org.onosproject.pcepio.protocol.PcepFactory; | ||
| 33 | +import org.onosproject.pcepio.protocol.PcepMessage; | ||
| 34 | +import org.onosproject.pcepio.protocol.PcepStateReport; | ||
| 35 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
| 36 | + | ||
| 37 | +/** | ||
| 38 | + * Representation of PCEP client adapter. | ||
| 39 | + */ | ||
| 40 | +public class PcepClientAdapter implements PcepClient { | ||
| 41 | + | ||
| 42 | + private Channel channel; | ||
| 43 | + protected String channelId; | ||
| 44 | + | ||
| 45 | + private boolean connected; | ||
| 46 | + private PccId pccId; | ||
| 47 | + private ClientCapability capability; | ||
| 48 | + | ||
| 49 | + private PcepVersion pcepVersion; | ||
| 50 | + private PcepSyncStatus lspDbSyncStatus; | ||
| 51 | + private PcepSyncStatus labelDbSyncStatus; | ||
| 52 | + private Map<LspKey, Boolean> lspDelegationInfo = new HashMap<>(); | ||
| 53 | + | ||
| 54 | + /** | ||
| 55 | + * Initialize instance with specified parameters. | ||
| 56 | + * | ||
| 57 | + * @param pccId PCC id | ||
| 58 | + * @param pcepVersion PCEP message version | ||
| 59 | + */ | ||
| 60 | + public void init(PccId pccId, PcepVersion pcepVersion) { | ||
| 61 | + this.pccId = pccId; | ||
| 62 | + this.pcepVersion = pcepVersion; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + @Override | ||
| 66 | + public final void disconnectClient() { | ||
| 67 | + this.channel.close(); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + @Override | ||
| 71 | + public final void sendMessage(PcepMessage m) { | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + @Override | ||
| 75 | + public final void sendMessage(List<PcepMessage> msgs) { | ||
| 76 | + try { | ||
| 77 | + PcepMessage pcepMsg = msgs.get(0); | ||
| 78 | + assertNotNull("PCEP MSG should be created.", pcepMsg); | ||
| 79 | + } catch (RejectedExecutionException e) { | ||
| 80 | + throw e; | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 85 | + public final boolean isConnected() { | ||
| 86 | + return this.connected; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + @Override | ||
| 90 | + public String channelId() { | ||
| 91 | + return channelId; | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + @Override | ||
| 95 | + public final PccId getPccId() { | ||
| 96 | + return this.pccId; | ||
| 97 | + }; | ||
| 98 | + | ||
| 99 | + @Override | ||
| 100 | + public final String getStringId() { | ||
| 101 | + return this.pccId.toString(); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + @Override | ||
| 105 | + public final void handleMessage(PcepMessage m) { | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + @Override | ||
| 109 | + public boolean isOptical() { | ||
| 110 | + return false; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + @Override | ||
| 114 | + public PcepFactory factory() { | ||
| 115 | + return PcepFactories.getFactory(pcepVersion); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + @Override | ||
| 119 | + public void setLspDbSyncStatus(PcepSyncStatus syncStatus) { | ||
| 120 | + this.lspDbSyncStatus = syncStatus; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + @Override | ||
| 124 | + public PcepSyncStatus lspDbSyncStatus() { | ||
| 125 | + return lspDbSyncStatus; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + @Override | ||
| 129 | + public void setLabelDbSyncStatus(PcepSyncStatus syncStatus) { | ||
| 130 | + this.labelDbSyncStatus = syncStatus; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + @Override | ||
| 134 | + public PcepSyncStatus labelDbSyncStatus() { | ||
| 135 | + return labelDbSyncStatus; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + @Override | ||
| 139 | + public void setCapability(ClientCapability capability) { | ||
| 140 | + this.capability = capability; | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + @Override | ||
| 144 | + public ClientCapability capability() { | ||
| 145 | + return capability; | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + @Override | ||
| 149 | + public void addNode(PcepClient pc) { | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + @Override | ||
| 153 | + public void deleteNode(PccId pccId) { | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + @Override | ||
| 157 | + public void setLspAndDelegationInfo(LspKey lspKey, boolean dFlag) { | ||
| 158 | + lspDelegationInfo.put(lspKey, dFlag); | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + @Override | ||
| 162 | + public Boolean delegationInfo(LspKey lspKey) { | ||
| 163 | + return lspDelegationInfo.get(lspKey); | ||
| 164 | + } | ||
| 165 | + | ||
| 166 | + @Override | ||
| 167 | + public void initializeSyncMsgList(PccId pccId) { | ||
| 168 | + // TODO Auto-generated method stub | ||
| 169 | + | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + @Override | ||
| 173 | + public List<PcepStateReport> getSyncMsgList(PccId pccId) { | ||
| 174 | + // TODO Auto-generated method stub | ||
| 175 | + return null; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + @Override | ||
| 179 | + public void removeSyncMsgList(PccId pccId) { | ||
| 180 | + // TODO Auto-generated method stub | ||
| 181 | + | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + @Override | ||
| 185 | + public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) { | ||
| 186 | + // TODO Auto-generated method stub | ||
| 187 | + | ||
| 188 | + } | ||
| 189 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.provider.pcep.topology.impl; | ||
| 17 | + | ||
| 18 | +import java.util.Collection; | ||
| 19 | +import java.util.Collections; | ||
| 20 | +import java.util.HashSet; | ||
| 21 | +import java.util.LinkedList; | ||
| 22 | +import java.util.Set; | ||
| 23 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 24 | + | ||
| 25 | +import org.apache.felix.scr.annotations.Activate; | ||
| 26 | +import org.apache.felix.scr.annotations.Deactivate; | ||
| 27 | +import org.onlab.packet.IpAddress; | ||
| 28 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 29 | +import org.onosproject.pcep.controller.PccId; | ||
| 30 | +import org.onosproject.pcep.controller.PcepClient; | ||
| 31 | +import org.onosproject.pcep.controller.PcepClientController; | ||
| 32 | +import org.onosproject.pcep.controller.PcepClientListener; | ||
| 33 | +import org.onosproject.pcep.controller.PcepEventListener; | ||
| 34 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
| 35 | +import org.onosproject.pcep.controller.PcepPacketListener; | ||
| 36 | +import org.onosproject.pcep.controller.driver.PcepAgent; | ||
| 37 | +import org.onosproject.pcepio.protocol.PcepError; | ||
| 38 | +import org.onosproject.pcepio.protocol.PcepErrorInfo; | ||
| 39 | +import org.onosproject.pcepio.protocol.PcepErrorMsg; | ||
| 40 | +import org.onosproject.pcepio.protocol.PcepErrorObject; | ||
| 41 | +import org.onosproject.pcepio.protocol.PcepFactory; | ||
| 42 | +import org.onosproject.pcepio.protocol.PcepMessage; | ||
| 43 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
| 44 | + | ||
| 45 | +import com.google.common.collect.Sets; | ||
| 46 | + | ||
| 47 | +import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19; | ||
| 48 | +import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5; | ||
| 49 | + | ||
| 50 | +/** | ||
| 51 | + * Representation of PCEP client controller adapter. | ||
| 52 | + */ | ||
| 53 | +public class PcepClientControllerAdapter implements PcepClientController { | ||
| 54 | + | ||
| 55 | + protected ConcurrentHashMap<PccId, PcepClient> connectedClients = | ||
| 56 | + new ConcurrentHashMap<PccId, PcepClient>(); | ||
| 57 | + | ||
| 58 | + protected PcepClientAgent agent = new PcepClientAgent(); | ||
| 59 | + protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | ||
| 60 | + | ||
| 61 | + protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | ||
| 62 | + public Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
| 63 | + | ||
| 64 | + @Activate | ||
| 65 | + public void activate() { | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + @Deactivate | ||
| 69 | + public void deactivate() { | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + @Override | ||
| 73 | + public Collection<PcepClient> getClients() { | ||
| 74 | + return connectedClients.values(); | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + @Override | ||
| 78 | + public PcepClient getClient(PccId pccId) { | ||
| 79 | + if (null != connectedClients.get(pccId)) { | ||
| 80 | + return connectedClients.get(pccId); | ||
| 81 | + } | ||
| 82 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 83 | + if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) | ||
| 84 | + || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { | ||
| 85 | + pc.setCapability(new ClientCapability(true, false, false, false, false)); | ||
| 86 | + } else { | ||
| 87 | + pc.setCapability(new ClientCapability(true, true, true, false, false)); | ||
| 88 | + } | ||
| 89 | + pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); | ||
| 90 | + connectedClients.put(pccId, pc); | ||
| 91 | + return pc; | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + @Override | ||
| 95 | + public void addListener(PcepClientListener listener) { | ||
| 96 | + if (!pcepClientListener.contains(listener)) { | ||
| 97 | + this.pcepClientListener.add(listener); | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + @Override | ||
| 102 | + public void addNodeListener(PcepNodeListener listener) { | ||
| 103 | + pcepNodeListener.add(listener); | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + @Override | ||
| 107 | + public void removeNodeListener(PcepNodeListener listener) { | ||
| 108 | + pcepNodeListener.remove(listener); | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + @Override | ||
| 112 | + public void removeListener(PcepClientListener listener) { | ||
| 113 | + this.pcepClientListener.remove(listener); | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + @Override | ||
| 117 | + public void addEventListener(PcepEventListener listener) { | ||
| 118 | + pcepEventListener.add(listener); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + @Override | ||
| 122 | + public void removeEventListener(PcepEventListener listener) { | ||
| 123 | + pcepEventListener.remove(listener); | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + @Override | ||
| 127 | + public void writeMessage(PccId pccId, PcepMessage msg) { | ||
| 128 | + this.getClient(pccId).sendMessage(msg); | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + @Override | ||
| 132 | + public void processClientMessage(PccId pccId, PcepMessage msg) { | ||
| 133 | + | ||
| 134 | + PcepClient pc = getClient(pccId); | ||
| 135 | + | ||
| 136 | + switch (msg.getType()) { | ||
| 137 | + case NONE: | ||
| 138 | + break; | ||
| 139 | + case OPEN: | ||
| 140 | + break; | ||
| 141 | + case KEEP_ALIVE: | ||
| 142 | + //log.debug("Sending Keep Alive Message to {" + pccIpAddress.toString() + "}"); | ||
| 143 | + pc.sendMessage(Collections.singletonList(pc.factory().buildKeepaliveMsg().build())); | ||
| 144 | + break; | ||
| 145 | + case PATH_COMPUTATION_REQUEST: | ||
| 146 | + break; | ||
| 147 | + case PATH_COMPUTATION_REPLY: | ||
| 148 | + break; | ||
| 149 | + case NOTIFICATION: | ||
| 150 | + break; | ||
| 151 | + case ERROR: | ||
| 152 | + break; | ||
| 153 | + case CLOSE: | ||
| 154 | + //log.debug("Sending Close Message to { }", pccIpAddress.toString()); | ||
| 155 | + pc.sendMessage(Collections.singletonList(pc.factory().buildCloseMsg().build())); | ||
| 156 | + break; | ||
| 157 | + case INITIATE: | ||
| 158 | + if (!pc.capability().pcInstantiationCapability()) { | ||
| 159 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
| 160 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
| 161 | + } | ||
| 162 | + break; | ||
| 163 | + case REPORT: | ||
| 164 | + //Only update the listener if respective capability is supported else send PCEP-ERR msg | ||
| 165 | + if (pc.capability().statefulPceCapability()) { | ||
| 166 | + for (PcepEventListener l : pcepEventListener) { | ||
| 167 | + l.handleMessage(pccId, msg); | ||
| 168 | + } | ||
| 169 | + } else { | ||
| 170 | + // Send PCEP-ERROR message. | ||
| 171 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
| 172 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
| 173 | + } | ||
| 174 | + break; | ||
| 175 | + case UPDATE: | ||
| 176 | + if (!pc.capability().statefulPceCapability()) { | ||
| 177 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
| 178 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
| 179 | + } | ||
| 180 | + break; | ||
| 181 | + case LABEL_UPDATE: | ||
| 182 | + if (!pc.capability().pceccCapability()) { | ||
| 183 | + pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), | ||
| 184 | + ERROR_TYPE_19, ERROR_VALUE_5))); | ||
| 185 | + } | ||
| 186 | + break; | ||
| 187 | + case MAX: | ||
| 188 | + break; | ||
| 189 | + case END: | ||
| 190 | + break; | ||
| 191 | + default: | ||
| 192 | + break; | ||
| 193 | + } | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + @Override | ||
| 197 | + public void closeConnectedClients() { | ||
| 198 | + PcepClient pc; | ||
| 199 | + for (PccId id : connectedClients.keySet()) { | ||
| 200 | + pc = getClient(id); | ||
| 201 | + pc.disconnectClient(); | ||
| 202 | + } | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + private PcepErrorMsg getErrMsg(PcepFactory factory, byte errorType, byte errorValue) { | ||
| 206 | + LinkedList<PcepError> llPcepErr = new LinkedList<>(); | ||
| 207 | + | ||
| 208 | + LinkedList<PcepErrorObject> llerrObj = new LinkedList<>(); | ||
| 209 | + PcepErrorMsg errMsg; | ||
| 210 | + | ||
| 211 | + PcepErrorObject errObj = factory.buildPcepErrorObject().setErrorValue(errorValue).setErrorType(errorType) | ||
| 212 | + .build(); | ||
| 213 | + | ||
| 214 | + llerrObj.add(errObj); | ||
| 215 | + PcepError pcepErr = factory.buildPcepError().setErrorObjList(llerrObj).build(); | ||
| 216 | + | ||
| 217 | + llPcepErr.add(pcepErr); | ||
| 218 | + | ||
| 219 | + PcepErrorInfo errInfo = factory.buildPcepErrorInfo().setPcepErrorList(llPcepErr).build(); | ||
| 220 | + | ||
| 221 | + errMsg = factory.buildPcepErrorMsg().setPcepErrorInfo(errInfo).build(); | ||
| 222 | + return errMsg; | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + /** | ||
| 226 | + * Implementation of an Pcep Agent which is responsible for | ||
| 227 | + * keeping track of connected clients and the state in which | ||
| 228 | + * they are. | ||
| 229 | + */ | ||
| 230 | + public class PcepClientAgent implements PcepAgent { | ||
| 231 | + | ||
| 232 | + @Override | ||
| 233 | + public boolean addConnectedClient(PccId pccId, PcepClient pc) { | ||
| 234 | + | ||
| 235 | + if (connectedClients.get(pccId) != null) { | ||
| 236 | + return false; | ||
| 237 | + } else { | ||
| 238 | + connectedClients.put(pccId, pc); | ||
| 239 | + for (PcepClientListener l : pcepClientListener) { | ||
| 240 | + l.clientConnected(pccId); | ||
| 241 | + } | ||
| 242 | + return true; | ||
| 243 | + } | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + @Override | ||
| 247 | + public boolean validActivation(PccId pccId) { | ||
| 248 | + if (connectedClients.get(pccId) == null) { | ||
| 249 | + //log.error("Trying to activate client but is not in " | ||
| 250 | + // + "connected switches: pccIp {}. Aborting ..", pccIpAddress.toString()); | ||
| 251 | + return false; | ||
| 252 | + } | ||
| 253 | + | ||
| 254 | + return true; | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + @Override | ||
| 258 | + public void removeConnectedClient(PccId pccId) { | ||
| 259 | + connectedClients.remove(pccId); | ||
| 260 | + for (PcepClientListener l : pcepClientListener) { | ||
| 261 | + //log.warn("removal for {}", pccIpAddress.toString()); | ||
| 262 | + l.clientDisconnected(pccId); | ||
| 263 | + } | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + @Override | ||
| 267 | + public void processPcepMessage(PccId pccId, PcepMessage m) { | ||
| 268 | + processClientMessage(pccId, m); | ||
| 269 | + } | ||
| 270 | + | ||
| 271 | + @Override | ||
| 272 | + public void addNode(PcepClient pc) { | ||
| 273 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 274 | + l.addNode(pc); | ||
| 275 | + } | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + @Override | ||
| 279 | + public void deleteNode(PccId pccId) { | ||
| 280 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 281 | + l.deleteNode(pccId); | ||
| 282 | + } | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + @Override | ||
| 286 | + public boolean analyzeSyncMsgList(PccId pccId) { | ||
| 287 | + // TODO Auto-generated method stub | ||
| 288 | + return false; | ||
| 289 | + } | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + @Override | ||
| 293 | + public void addPacketListener(PcepPacketListener listener) { | ||
| 294 | + // TODO Auto-generated method stub | ||
| 295 | + | ||
| 296 | + } | ||
| 297 | + | ||
| 298 | + @Override | ||
| 299 | + public void removePacketListener(PcepPacketListener listener) { | ||
| 300 | + // TODO Auto-generated method stub | ||
| 301 | + | ||
| 302 | + } | ||
| 303 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.provider.pcep.topology.impl; | ||
| 18 | + | ||
| 19 | +import org.onosproject.net.DeviceId; | ||
| 20 | +import org.onosproject.pcep.api.PcepController; | ||
| 21 | +import org.onosproject.pcep.api.PcepDpid; | ||
| 22 | +import org.onosproject.pcep.api.PcepLinkListener; | ||
| 23 | +import org.onosproject.pcep.api.PcepSwitch; | ||
| 24 | +import org.onosproject.pcep.api.PcepSwitchListener; | ||
| 25 | +import org.onosproject.pcep.api.PcepTunnel; | ||
| 26 | +import org.onosproject.pcep.api.PcepTunnelListener; | ||
| 27 | + | ||
| 28 | +/** | ||
| 29 | + * Implementation of PCEP controller. | ||
| 30 | + */ | ||
| 31 | +public class PcepControllerAdapter implements PcepController { | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public Iterable<PcepSwitch> getSwitches() { | ||
| 35 | + return null; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public PcepSwitch getSwitch(PcepDpid did) { | ||
| 40 | + return null; | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + @Override | ||
| 44 | + public void addListener(PcepSwitchListener listener) { | ||
| 45 | + | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public void removeListener(PcepSwitchListener listener) { | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public void addLinkListener(PcepLinkListener listener) { | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + @Override | ||
| 57 | + public void removeLinkListener(PcepLinkListener listener) { | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + @Override | ||
| 61 | + public void addTunnelListener(PcepTunnelListener listener) { | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + @Override | ||
| 65 | + public void removeTunnelListener(PcepTunnelListener listener) { | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + @Override | ||
| 69 | + public PcepTunnel applyTunnel(DeviceId srcDid, DeviceId dstDid, long srcPort, long dstPort, long bandwidth, | ||
| 70 | + String name) { | ||
| 71 | + return null; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + @Override | ||
| 75 | + public Boolean deleteTunnel(String id) { | ||
| 76 | + return null; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + @Override | ||
| 80 | + public Boolean updateTunnelBandwidth(String id, long bandwidth) { | ||
| 81 | + return null; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 85 | + public void getTunnelStatistics(String pcepTunnelId) { | ||
| 86 | + | ||
| 87 | + } | ||
| 88 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
| 5 | + * the License. You may obtain a copy of the License at | ||
| 6 | + * | ||
| 7 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 8 | + * | ||
| 9 | + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
| 10 | + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
| 11 | + * specific language governing permissions and limitations under the License. | ||
| 12 | + */ | ||
| 13 | +package org.onosproject.provider.pcep.topology.impl; | ||
| 14 | + | ||
| 15 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
| 16 | +import static org.hamcrest.core.Is.is; | ||
| 17 | +import static org.onosproject.net.Link.State.ACTIVE; | ||
| 18 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.LABEL_STACK_CAPABILITY; | ||
| 19 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.LSRID; | ||
| 20 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.PCECC_CAPABILITY; | ||
| 21 | +import static org.onosproject.provider.pcep.topology.impl.PcepTopologyProvider.SR_CAPABILITY; | ||
| 22 | + | ||
| 23 | +import java.util.Collection; | ||
| 24 | +import java.util.HashMap; | ||
| 25 | +import java.util.HashSet; | ||
| 26 | +import java.util.List; | ||
| 27 | +import java.util.Map; | ||
| 28 | +import java.util.Set; | ||
| 29 | + | ||
| 30 | +import org.junit.After; | ||
| 31 | +import org.junit.Before; | ||
| 32 | +import org.junit.Test; | ||
| 33 | +import org.onlab.packet.ChassisId; | ||
| 34 | +import org.onlab.packet.IpAddress; | ||
| 35 | +import org.onosproject.net.ConnectPoint; | ||
| 36 | +import org.onosproject.net.DefaultDevice; | ||
| 37 | +import org.onosproject.net.DefaultLink; | ||
| 38 | +import org.onosproject.net.Device; | ||
| 39 | +import org.onosproject.net.DeviceId; | ||
| 40 | +import org.onosproject.net.Link; | ||
| 41 | +import org.onosproject.net.MastershipRole; | ||
| 42 | +import org.onosproject.net.device.DeviceDescription; | ||
| 43 | +import org.onosproject.net.device.DeviceProvider; | ||
| 44 | +import org.onosproject.net.device.DeviceProviderRegistry; | ||
| 45 | +import org.onosproject.net.device.DeviceProviderService; | ||
| 46 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
| 47 | +import org.onosproject.net.device.PortDescription; | ||
| 48 | +import org.onosproject.net.device.PortStatistics; | ||
| 49 | +import org.onosproject.net.link.LinkDescription; | ||
| 50 | +import org.onosproject.net.link.LinkProvider; | ||
| 51 | +import org.onosproject.net.link.LinkProviderRegistry; | ||
| 52 | +import org.onosproject.net.link.LinkProviderService; | ||
| 53 | +import org.onosproject.net.provider.ProviderId; | ||
| 54 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 55 | +import org.onosproject.pcep.controller.PccId; | ||
| 56 | +import org.onosproject.pcep.controller.PcepClient; | ||
| 57 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
| 58 | + | ||
| 59 | +/** | ||
| 60 | + * Test for PCEP topology provider. | ||
| 61 | + */ | ||
| 62 | +public class PcepTopologyProviderTest { | ||
| 63 | + private static final String UNKNOWN = new String("unknown"); | ||
| 64 | + public static ProviderId providerId = new ProviderId("l3", "foo"); | ||
| 65 | + private final PcepClientControllerAdapter clientController = new PcepClientControllerAdapter(); | ||
| 66 | + private final PcepTopologyProvider provider = new PcepTopologyProvider(); | ||
| 67 | + private final MockDeviceRegistry nodeRegistry = new MockDeviceRegistry(); | ||
| 68 | + private final PcepControllerAdapter controller = new PcepControllerAdapter(); | ||
| 69 | + private final MockLinkRegistry linkRegistry = new MockLinkRegistry(); | ||
| 70 | + private final MockDeviceService deviceService = new MockDeviceService(); | ||
| 71 | + private Map<DeviceId, Device> deviceMap = new HashMap<>(); | ||
| 72 | + | ||
| 73 | + @Before | ||
| 74 | + public void startUp() { | ||
| 75 | + provider.pcepClientController = clientController; | ||
| 76 | + provider.deviceProviderRegistry = nodeRegistry; | ||
| 77 | + provider.linkProviderRegistry = linkRegistry; | ||
| 78 | + provider.controller = controller; | ||
| 79 | + provider.deviceService = deviceService; | ||
| 80 | + provider.activate(); | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + @After | ||
| 84 | + public void tearDown() { | ||
| 85 | + provider.deactivate(); | ||
| 86 | + provider.deviceProviderRegistry = null; | ||
| 87 | + provider.pcepClientController = null; | ||
| 88 | + provider.linkProviderRegistry = null; | ||
| 89 | + provider.controller = null; | ||
| 90 | + provider.deviceService = null; | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + /* Class implement device test registry */ | ||
| 94 | + private class MockLinkRegistry implements LinkProviderRegistry { | ||
| 95 | + LinkProvider linkProvider; | ||
| 96 | + Set<Link> links = new HashSet<>(); | ||
| 97 | + | ||
| 98 | + @Override | ||
| 99 | + public LinkProviderService register(LinkProvider provider) { | ||
| 100 | + this.linkProvider = provider; | ||
| 101 | + return new MockProviderService(); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + @Override | ||
| 105 | + public void unregister(LinkProvider provider) { | ||
| 106 | + // TODO Auto-generated method stub | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + @Override | ||
| 110 | + public Set<ProviderId> getProviders() { | ||
| 111 | + return null; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + private class MockProviderService implements LinkProviderService { | ||
| 115 | + | ||
| 116 | + @Override | ||
| 117 | + public void linkDetected(LinkDescription linkDescription) { | ||
| 118 | + links.add(DefaultLink.builder().src(linkDescription.src()) | ||
| 119 | + .dst(linkDescription.dst()).state(ACTIVE).type(linkDescription.type()) | ||
| 120 | + .providerId(ProviderId.NONE).build()); | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + @Override | ||
| 124 | + public void linkVanished(LinkDescription linkDescription) { | ||
| 125 | + links.remove(DefaultLink.builder().src(linkDescription.src()) | ||
| 126 | + .dst(linkDescription.dst()).state(ACTIVE).type(linkDescription.type()) | ||
| 127 | + .providerId(ProviderId.NONE).build()); | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + @Override | ||
| 131 | + public void linksVanished(ConnectPoint connectPoint) { | ||
| 132 | + // TODO Auto-generated method stub | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + @Override | ||
| 136 | + public void linksVanished(DeviceId deviceId) { | ||
| 137 | + // TODO Auto-generated method stub | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + @Override | ||
| 141 | + public LinkProvider provider() { | ||
| 142 | + // TODO Auto-generated method stub | ||
| 143 | + return null; | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + /* Class implement device test registry */ | ||
| 149 | + private class MockDeviceRegistry implements DeviceProviderRegistry { | ||
| 150 | + DeviceProvider provider; | ||
| 151 | + | ||
| 152 | + Set<DeviceId> connected = new HashSet<>(); | ||
| 153 | + | ||
| 154 | + @Override | ||
| 155 | + public DeviceProviderService register(DeviceProvider provider) { | ||
| 156 | + this.provider = provider; | ||
| 157 | + return new MockProviderService(); | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + @Override | ||
| 161 | + public void unregister(DeviceProvider provider) { | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + @Override | ||
| 165 | + public Set<ProviderId> getProviders() { | ||
| 166 | + return null; | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + private class MockProviderService implements DeviceProviderService { | ||
| 170 | + | ||
| 171 | + @Override | ||
| 172 | + public DeviceProvider provider() { | ||
| 173 | + return null; | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + @Override | ||
| 177 | + public void deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) { | ||
| 178 | + connected.add(deviceId); | ||
| 179 | + Device device = new DefaultDevice(ProviderId.NONE, deviceId, Device.Type.ROUTER, UNKNOWN, UNKNOWN, | ||
| 180 | + UNKNOWN, UNKNOWN, new ChassisId(), deviceDescription.annotations()); | ||
| 181 | + deviceMap.put(deviceId, device); | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + @Override | ||
| 185 | + public void deviceDisconnected(DeviceId deviceId) { | ||
| 186 | + connected.remove(deviceId); | ||
| 187 | + deviceMap.remove(deviceId); | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + @Override | ||
| 191 | + public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) { | ||
| 192 | + // TODO Auto-generated method stub | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + @Override | ||
| 196 | + public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) { | ||
| 197 | + // TODO Auto-generated method stub | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + @Override | ||
| 201 | + public void receivedRoleReply(DeviceId deviceId, MastershipRole requested, MastershipRole response) { | ||
| 202 | + // TODO Auto-generated method stub | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + @Override | ||
| 206 | + public void updatePortStatistics(DeviceId deviceId, Collection<PortStatistics> portStatistics) { | ||
| 207 | + // TODO Auto-generated method stub | ||
| 208 | + } | ||
| 209 | + } | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + /* Mock test for device service */ | ||
| 213 | + private class MockDeviceService extends DeviceServiceAdapter { | ||
| 214 | + @Override | ||
| 215 | + public Device getDevice(DeviceId deviceId) { | ||
| 216 | + return deviceMap.get(deviceId); | ||
| 217 | + } | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + /** | ||
| 221 | + * Adds the PCEP device and removes it. | ||
| 222 | + */ | ||
| 223 | + @Test | ||
| 224 | + public void testPcepTopologyProviderTestAddDevice1() { | ||
| 225 | + PcepClient pc = clientController.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))); | ||
| 226 | + for (PcepNodeListener l : clientController.pcepNodeListener) { | ||
| 227 | + pc.setCapability(new ClientCapability(true, true, false, true, true)); | ||
| 228 | + l.addNode(pc); | ||
| 229 | + assertThat(nodeRegistry.connected.size(), is(1)); | ||
| 230 | + assertThat(deviceMap.keySet().iterator().next(), is(DeviceId.deviceId("l3:1.1.1.1"))); | ||
| 231 | + assertThat(deviceMap.values().iterator().next().annotations().value(LABEL_STACK_CAPABILITY), is("true")); | ||
| 232 | + assertThat(deviceMap.values().iterator().next().annotations().value(LSRID), is("1.1.1.1")); | ||
| 233 | + assertThat(deviceMap.values().iterator().next().annotations().value(PCECC_CAPABILITY), is("true")); | ||
| 234 | + assertThat(deviceMap.values().iterator().next().annotations().value(SR_CAPABILITY), is("true")); | ||
| 235 | + | ||
| 236 | + l.deleteNode(pc.getPccId()); | ||
| 237 | + assertThat(nodeRegistry.connected.size(), is(0)); | ||
| 238 | + } | ||
| 239 | + } | ||
| 240 | +} |
| ... | @@ -6,6 +6,7 @@ COMPILE_DEPS = [ | ... | @@ -6,6 +6,7 @@ COMPILE_DEPS = [ |
| 6 | '//incubator/api:onos-incubator-api', | 6 | '//incubator/api:onos-incubator-api', |
| 7 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', | 7 | '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio', |
| 8 | '//protocols/pcep/api:onos-protocols-pcep-api', | 8 | '//protocols/pcep/api:onos-protocols-pcep-api', |
| 9 | + '//protocols/pcep/ctl:onos-protocols-pcep-ctl', | ||
| 9 | ] | 10 | ] |
| 10 | 11 | ||
| 11 | TEST_DEPS = [ | 12 | TEST_DEPS = [ | ... | ... |
| ... | @@ -49,5 +49,10 @@ | ... | @@ -49,5 +49,10 @@ |
| 49 | <version>${project.version} </version> | 49 | <version>${project.version} </version> |
| 50 | <scope>test</scope> | 50 | <scope>test</scope> |
| 51 | </dependency> | 51 | </dependency> |
| 52 | + <dependency> | ||
| 53 | + <groupId>org.onosproject</groupId> | ||
| 54 | + <artifactId>onos-pcep-controller-impl</artifactId> | ||
| 55 | + <version>${project.version} </version> | ||
| 56 | + </dependency> | ||
| 52 | </dependencies> | 57 | </dependencies> |
| 53 | </project> | 58 | </project> | ... | ... |
| ... | @@ -36,6 +36,7 @@ import org.onosproject.incubator.net.tunnel.OpticalLogicId; | ... | @@ -36,6 +36,7 @@ import org.onosproject.incubator.net.tunnel.OpticalLogicId; |
| 36 | import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint; | 36 | import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint; |
| 37 | import org.onosproject.incubator.net.tunnel.Tunnel; | 37 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 38 | import org.onosproject.incubator.net.tunnel.Tunnel.State; | 38 | import org.onosproject.incubator.net.tunnel.Tunnel.State; |
| 39 | +import org.onosproject.incubator.net.tunnel.TunnelAdminService; | ||
| 39 | import org.onosproject.incubator.net.tunnel.TunnelDescription; | 40 | import org.onosproject.incubator.net.tunnel.TunnelDescription; |
| 40 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | 41 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; |
| 41 | import org.onosproject.incubator.net.tunnel.TunnelId; | 42 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| ... | @@ -45,11 +46,14 @@ import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry; | ... | @@ -45,11 +46,14 @@ import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry; |
| 45 | import org.onosproject.incubator.net.tunnel.TunnelProviderService; | 46 | import org.onosproject.incubator.net.tunnel.TunnelProviderService; |
| 46 | import org.onosproject.incubator.net.tunnel.TunnelService; | 47 | import org.onosproject.incubator.net.tunnel.TunnelService; |
| 47 | import org.onosproject.incubator.net.tunnel.TunnelStatistics; | 48 | import org.onosproject.incubator.net.tunnel.TunnelStatistics; |
| 49 | +import org.onosproject.mastership.MastershipService; | ||
| 50 | +import org.onosproject.net.AnnotationKeys; | ||
| 48 | import org.onosproject.net.ConnectPoint; | 51 | import org.onosproject.net.ConnectPoint; |
| 49 | import org.onosproject.net.DefaultAnnotations; | 52 | import org.onosproject.net.DefaultAnnotations; |
| 50 | import org.onosproject.net.DefaultAnnotations.Builder; | 53 | import org.onosproject.net.DefaultAnnotations.Builder; |
| 51 | import org.onosproject.net.DefaultLink; | 54 | import org.onosproject.net.DefaultLink; |
| 52 | import org.onosproject.net.DefaultPath; | 55 | import org.onosproject.net.DefaultPath; |
| 56 | +import org.onosproject.net.Device; | ||
| 53 | import org.onosproject.net.DeviceId; | 57 | import org.onosproject.net.DeviceId; |
| 54 | import org.onosproject.net.ElementId; | 58 | import org.onosproject.net.ElementId; |
| 55 | import org.onosproject.net.IpElementId; | 59 | import org.onosproject.net.IpElementId; |
| ... | @@ -57,6 +61,7 @@ import org.onosproject.net.Link; | ... | @@ -57,6 +61,7 @@ import org.onosproject.net.Link; |
| 57 | import org.onosproject.net.Path; | 61 | import org.onosproject.net.Path; |
| 58 | import org.onosproject.net.PortNumber; | 62 | import org.onosproject.net.PortNumber; |
| 59 | import org.onosproject.net.SparseAnnotations; | 63 | import org.onosproject.net.SparseAnnotations; |
| 64 | +import org.onosproject.net.device.DeviceService; | ||
| 60 | import org.onosproject.net.provider.AbstractProvider; | 65 | import org.onosproject.net.provider.AbstractProvider; |
| 61 | import org.onosproject.net.provider.ProviderId; | 66 | import org.onosproject.net.provider.ProviderId; |
| 62 | import org.onosproject.pcep.api.PcepController; | 67 | import org.onosproject.pcep.api.PcepController; |
| ... | @@ -68,12 +73,14 @@ import org.onosproject.pcep.api.PcepTunnel.PathState; | ... | @@ -68,12 +73,14 @@ import org.onosproject.pcep.api.PcepTunnel.PathState; |
| 68 | import org.onosproject.pcep.api.PcepTunnel.PathType; | 73 | import org.onosproject.pcep.api.PcepTunnel.PathType; |
| 69 | import org.onosproject.pcep.api.PcepTunnelListener; | 74 | import org.onosproject.pcep.api.PcepTunnelListener; |
| 70 | import org.onosproject.pcep.api.PcepTunnelStatistics; | 75 | import org.onosproject.pcep.api.PcepTunnelStatistics; |
| 76 | +import org.onosproject.pcep.controller.LspKey; | ||
| 71 | import org.onosproject.pcep.controller.PccId; | 77 | import org.onosproject.pcep.controller.PccId; |
| 72 | import org.onosproject.pcep.controller.PcepClient; | 78 | import org.onosproject.pcep.controller.PcepClient; |
| 73 | import org.onosproject.pcep.controller.PcepClientController; | 79 | import org.onosproject.pcep.controller.PcepClientController; |
| 74 | import org.onosproject.pcep.controller.PcepClientListener; | 80 | import org.onosproject.pcep.controller.PcepClientListener; |
| 75 | import org.onosproject.pcep.controller.PcepEventListener; | 81 | import org.onosproject.pcep.controller.PcepEventListener; |
| 76 | -import org.onosproject.pcep.controller.PcepSyncStatus; | 82 | +import org.onosproject.pcep.controller.PcepLspSyncAction; |
| 83 | +import org.onosproject.pcep.controller.impl.PcepLspStatus; | ||
| 77 | import org.onosproject.pcepio.exceptions.PcepParseException; | 84 | import org.onosproject.pcepio.exceptions.PcepParseException; |
| 78 | import org.onosproject.pcepio.protocol.PcInitiatedLspRequest; | 85 | import org.onosproject.pcepio.protocol.PcInitiatedLspRequest; |
| 79 | import org.onosproject.pcepio.protocol.PcepAttribute; | 86 | import org.onosproject.pcepio.protocol.PcepAttribute; |
| ... | @@ -83,6 +90,7 @@ import org.onosproject.pcepio.protocol.PcepEroObject; | ... | @@ -83,6 +90,7 @@ import org.onosproject.pcepio.protocol.PcepEroObject; |
| 83 | import org.onosproject.pcepio.protocol.PcepInitiateMsg; | 90 | import org.onosproject.pcepio.protocol.PcepInitiateMsg; |
| 84 | import org.onosproject.pcepio.protocol.PcepLspObject; | 91 | import org.onosproject.pcepio.protocol.PcepLspObject; |
| 85 | import org.onosproject.pcepio.protocol.PcepMessage; | 92 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 93 | +import org.onosproject.pcepio.protocol.PcepMetricObject; | ||
| 86 | import org.onosproject.pcepio.protocol.PcepMsgPath; | 94 | import org.onosproject.pcepio.protocol.PcepMsgPath; |
| 87 | import org.onosproject.pcepio.protocol.PcepReportMsg; | 95 | import org.onosproject.pcepio.protocol.PcepReportMsg; |
| 88 | import org.onosproject.pcepio.protocol.PcepSrpObject; | 96 | import org.onosproject.pcepio.protocol.PcepSrpObject; |
| ... | @@ -107,8 +115,10 @@ import java.util.HashMap; | ... | @@ -107,8 +115,10 @@ import java.util.HashMap; |
| 107 | import java.util.LinkedList; | 115 | import java.util.LinkedList; |
| 108 | import java.util.List; | 116 | import java.util.List; |
| 109 | import java.util.ListIterator; | 117 | import java.util.ListIterator; |
| 110 | -import java.util.Map; | ||
| 111 | import java.util.Optional; | 118 | import java.util.Optional; |
| 119 | +import java.util.concurrent.Executors; | ||
| 120 | +import java.util.concurrent.ScheduledExecutorService; | ||
| 121 | +import java.util.concurrent.TimeUnit; | ||
| 112 | 122 | ||
| 113 | import static com.google.common.base.Preconditions.checkNotNull; | 123 | import static com.google.common.base.Preconditions.checkNotNull; |
| 114 | import static com.google.common.base.Strings.isNullOrEmpty; | 124 | import static com.google.common.base.Strings.isNullOrEmpty; |
| ... | @@ -125,14 +135,18 @@ import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL | ... | @@ -125,14 +135,18 @@ import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL |
| 125 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | 135 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; |
| 126 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; | 136 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; |
| 127 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; | 137 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; |
| 128 | -import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCE_INIT; | 138 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE; |
| 139 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.COST_TYPE; | ||
| 129 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE; | 140 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE; |
| 130 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE; | 141 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE; |
| 131 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT; | 142 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT; |
| 132 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.UPDATE; | 143 | import static org.onosproject.provider.pcep.tunnel.impl.RequestType.UPDATE; |
| 133 | -import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC; | ||
| 134 | -import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED; | ||
| 135 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE; | 144 | import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE; |
| 145 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.REMOVE; | ||
| 146 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_UPDATE; | ||
| 147 | +import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_DELETE; | ||
| 148 | +import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.IGP_METRIC; | ||
| 149 | +import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.TE_METRIC; | ||
| 136 | import static org.slf4j.LoggerFactory.getLogger; | 150 | import static org.slf4j.LoggerFactory.getLogger; |
| 137 | 151 | ||
| 138 | /** | 152 | /** |
| ... | @@ -148,6 +162,11 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -148,6 +162,11 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 148 | private static final long MIN_BANDWIDTH = 64; | 162 | private static final long MIN_BANDWIDTH = 64; |
| 149 | private static final String BANDWIDTH_UINT = "kbps"; | 163 | private static final String BANDWIDTH_UINT = "kbps"; |
| 150 | static final String PROVIDER_ID = "org.onosproject.provider.tunnel.pcep"; | 164 | static final String PROVIDER_ID = "org.onosproject.provider.tunnel.pcep"; |
| 165 | + public static final long IDENTIFIER_SET = 0x100000000L; | ||
| 166 | + public static final long SET = 0xFFFFFFFFL; | ||
| 167 | + private static final int DELAY = 2; | ||
| 168 | + private static final int WAIT_TIME = 5; | ||
| 169 | + public static final String LSRID = "lsrId"; | ||
| 151 | 170 | ||
| 152 | static final int POLL_INTERVAL = 10; | 171 | static final int POLL_INTERVAL = 10; |
| 153 | @Property(name = "tunnelStatsPollFrequency", intValue = POLL_INTERVAL, | 172 | @Property(name = "tunnelStatsPollFrequency", intValue = POLL_INTERVAL, |
| ... | @@ -171,6 +190,15 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -171,6 +190,15 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 171 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 190 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 172 | protected ComponentConfigService cfgService; | 191 | protected ComponentConfigService cfgService; |
| 173 | 192 | ||
| 193 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 194 | + protected TunnelAdminService tunnelAdminService; | ||
| 195 | + | ||
| 196 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 197 | + protected MastershipService mastershipService; | ||
| 198 | + | ||
| 199 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 200 | + protected DeviceService deviceService; | ||
| 201 | + | ||
| 174 | TunnelProviderService service; | 202 | TunnelProviderService service; |
| 175 | 203 | ||
| 176 | HashMap<String, TunnelId> tunnelMap = new HashMap<String, TunnelId>(); | 204 | HashMap<String, TunnelId> tunnelMap = new HashMap<String, TunnelId>(); |
| ... | @@ -182,10 +210,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -182,10 +210,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 182 | protected PcepTunnelApiMapper pcepTunnelApiMapper = new PcepTunnelApiMapper(); | 210 | protected PcepTunnelApiMapper pcepTunnelApiMapper = new PcepTunnelApiMapper(); |
| 183 | private static final int DEFAULT_BANDWIDTH_VALUE = 10; | 211 | private static final int DEFAULT_BANDWIDTH_VALUE = 10; |
| 184 | 212 | ||
| 185 | - private Map<IpAddress, Map<TunnelId, Tunnel>> preSyncLspDbMap = new HashMap<>(); | ||
| 186 | - private Map<IpAddress, List<Tunnel>> syncCompleteDeleteList = new HashMap<>(); | ||
| 187 | - private Map<IpAddress, List<Tunnel>> syncCompleteUpdateList = new HashMap<>(); | ||
| 188 | - | ||
| 189 | /** | 213 | /** |
| 190 | * Creates a Tunnel provider. | 214 | * Creates a Tunnel provider. |
| 191 | */ | 215 | */ |
| ... | @@ -263,7 +287,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -263,7 +287,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 263 | } | 287 | } |
| 264 | 288 | ||
| 265 | //If stateful and PC Initiation capability is not supported by client not sending Initiate msg | 289 | //If stateful and PC Initiation capability is not supported by client not sending Initiate msg |
| 266 | - if (pc.capability().pcInstantiationCapability()) { | 290 | + //Only master will initiate setup tunnel |
| 291 | + if (pc.capability().pcInstantiationCapability() && mastershipService.isLocalMaster(getDevice(pc.getPccId()))) { | ||
| 267 | pcepSetupTunnel(tunnel, path, pc); | 292 | pcepSetupTunnel(tunnel, path, pc); |
| 268 | } | 293 | } |
| 269 | } | 294 | } |
| ... | @@ -300,7 +325,10 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -300,7 +325,10 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 300 | return; | 325 | return; |
| 301 | } | 326 | } |
| 302 | 327 | ||
| 303 | - if (pc.capability().pcInstantiationCapability()) { | 328 | + //If stateful and PC Initiation capability is not supported by client not sending Initiate msg |
| 329 | + //Only master will initiate setup tunnel | ||
| 330 | + if (pc.capability().pcInstantiationCapability() | ||
| 331 | + && mastershipService.isLocalMaster(getDevice(pc.getPccId()))) { | ||
| 304 | pcepSetupTunnel(tunnel, path, pc); | 332 | pcepSetupTunnel(tunnel, path, pc); |
| 305 | } | 333 | } |
| 306 | } | 334 | } |
| ... | @@ -327,7 +355,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -327,7 +355,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 327 | return; | 355 | return; |
| 328 | } | 356 | } |
| 329 | 357 | ||
| 330 | - if (pc.capability().pcInstantiationCapability()) { | 358 | + //Only master will release tunnel |
| 359 | + if (pc.capability().pcInstantiationCapability() | ||
| 360 | + && mastershipService.isLocalMaster(getDevice(pc.getPccId()))) { | ||
| 331 | pcepReleaseTunnel(tunnel, pc); | 361 | pcepReleaseTunnel(tunnel, pc); |
| 332 | } | 362 | } |
| 333 | } | 363 | } |
| ... | @@ -358,7 +388,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -358,7 +388,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 358 | return; | 388 | return; |
| 359 | } | 389 | } |
| 360 | 390 | ||
| 361 | - if (pc.capability().pcInstantiationCapability()) { | 391 | + //Only master will release tunnel |
| 392 | + if (pc.capability().pcInstantiationCapability() | ||
| 393 | + && mastershipService.isLocalMaster(getDevice(pc.getPccId()))) { | ||
| 362 | pcepReleaseTunnel(tunnel, pc); | 394 | pcepReleaseTunnel(tunnel, pc); |
| 363 | } | 395 | } |
| 364 | } | 396 | } |
| ... | @@ -384,7 +416,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -384,7 +416,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 384 | return; | 416 | return; |
| 385 | } | 417 | } |
| 386 | 418 | ||
| 387 | - if (pc.capability().statefulPceCapability()) { | 419 | + // If delegation flag is set then only send update message[means delegated PCE can send update msg for that |
| 420 | + // LSP].If annotation is null D flag is not set else it is set. | ||
| 421 | + if (pc.capability().statefulPceCapability() | ||
| 422 | + && pc.delegationInfo( | ||
| 423 | + new LspKey(Integer.valueOf(tunnel.annotations().value(PLSP_ID)), Short.valueOf(tunnel | ||
| 424 | + .annotations().value(LOCAL_LSP_ID)))) != null) { | ||
| 388 | pcepUpdateTunnel(tunnel, path, pc); | 425 | pcepUpdateTunnel(tunnel, path, pc); |
| 389 | } | 426 | } |
| 390 | } | 427 | } |
| ... | @@ -416,7 +453,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -416,7 +453,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 416 | return; | 453 | return; |
| 417 | } | 454 | } |
| 418 | 455 | ||
| 419 | - if (pc.capability().statefulPceCapability()) { | 456 | + // If delegation flag is set then only send update message[means delegated PCE can send update msg for that |
| 457 | + // LSP].If annotation is null D flag is not set else it is set. | ||
| 458 | + if (pc.capability().statefulPceCapability() | ||
| 459 | + && pc.delegationInfo( | ||
| 460 | + new LspKey(Integer.valueOf(tunnel.annotations().value(PLSP_ID)), Short.valueOf(tunnel | ||
| 461 | + .annotations().value(LOCAL_LSP_ID)))) != null) { | ||
| 420 | pcepUpdateTunnel(tunnel, path, pc); | 462 | pcepUpdateTunnel(tunnel, path, pc); |
| 421 | } | 463 | } |
| 422 | } | 464 | } |
| ... | @@ -480,6 +522,43 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -480,6 +522,43 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 480 | return tunnelId; | 522 | return tunnelId; |
| 481 | } | 523 | } |
| 482 | 524 | ||
| 525 | + private void tunnelUpdated(Tunnel tunnel, Path path) { | ||
| 526 | + handleTunnelUpdate(tunnel, path); | ||
| 527 | + } | ||
| 528 | + | ||
| 529 | + //Handles tunnel updated using tunnel admin service[specially to update annotations]. | ||
| 530 | + private void handleTunnelUpdate(Tunnel tunnel, Path path) { | ||
| 531 | + | ||
| 532 | + if (tunnel.type() == MPLS) { | ||
| 533 | + pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.tunnelId()); | ||
| 534 | + | ||
| 535 | + tunnelAdminService.updateTunnel(tunnel, path); | ||
| 536 | + | ||
| 537 | + return; | ||
| 538 | + } | ||
| 539 | + | ||
| 540 | + Tunnel tunnelOld = tunnelQueryById(tunnel.tunnelId()); | ||
| 541 | + if (tunnelOld.type() != Tunnel.Type.VLAN) { | ||
| 542 | + error("Illegal tunnel type. Only support VLAN tunnel update."); | ||
| 543 | + return; | ||
| 544 | + } | ||
| 545 | + | ||
| 546 | + long bandwidth = Long | ||
| 547 | + .parseLong(tunnel.annotations().value("bandwidth")); | ||
| 548 | + if (bandwidth < MIN_BANDWIDTH || bandwidth > MAX_BANDWIDTH) { | ||
| 549 | + error("Update failed, invalid bandwidth."); | ||
| 550 | + return; | ||
| 551 | + } | ||
| 552 | + String pcepTunnelId = getPcepTunnelKey(tunnel.tunnelId()); | ||
| 553 | + | ||
| 554 | + checkNotNull(pcepTunnelId, "Invalid tunnel id"); | ||
| 555 | + if (!controller.updateTunnelBandwidth(pcepTunnelId, bandwidth)) { | ||
| 556 | + error("Update failed,maybe invalid bandwidth."); | ||
| 557 | + return; | ||
| 558 | + } | ||
| 559 | + tunnelAdminService.updateTunnel(tunnel, path); | ||
| 560 | + } | ||
| 561 | + | ||
| 483 | @Override | 562 | @Override |
| 484 | public void tunnelRemoved(TunnelDescription tunnel) { | 563 | public void tunnelRemoved(TunnelDescription tunnel) { |
| 485 | if (tunnel.type() == MPLS) { | 564 | if (tunnel.type() == MPLS) { |
| ... | @@ -681,7 +760,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -681,7 +760,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 681 | path, | 760 | path, |
| 682 | annotations); | 761 | annotations); |
| 683 | return tunnel; | 762 | return tunnel; |
| 684 | - | ||
| 685 | } | 763 | } |
| 686 | 764 | ||
| 687 | /** | 765 | /** |
| ... | @@ -1098,41 +1176,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1098,41 +1176,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1098 | log.debug("SRP ID in handle message " + srpId); | 1176 | log.debug("SRP ID in handle message " + srpId); |
| 1099 | 1177 | ||
| 1100 | if (!(pcepTunnelApiMapper.checkFromTunnelRequestQueue(srpId))) { | 1178 | if (!(pcepTunnelApiMapper.checkFromTunnelRequestQueue(srpId))) { |
| 1101 | - | 1179 | + // For PCRpt without matching SRP id. |
| 1102 | - // Check the sync status | 1180 | + handleRptWithoutSrpId(stateRpt, pccId); |
| 1103 | - if (lspObj.getSFlag()) { | ||
| 1104 | - if (pcepClientController.getClient(pccId).lspDbSyncStatus() != IN_SYNC) { | ||
| 1105 | - pcepClientController.getClient(pccId).setLspDbSyncStatus(IN_SYNC); | ||
| 1106 | - | ||
| 1107 | - // On starting LSP-DB sync, store LSP DB locally for this PCC. | ||
| 1108 | - Map<TunnelId, Tunnel> preSyncLspDb = new HashMap<>(); | ||
| 1109 | - Collection<Tunnel> queriedTunnels = tunnelService.queryTunnel(MPLS); | ||
| 1110 | - | ||
| 1111 | - for (Tunnel tunnel : queriedTunnels) { | ||
| 1112 | - if (((IpTunnelEndPoint) tunnel.src()).ip().equals(pccId.ipAddress())) { | ||
| 1113 | - preSyncLspDb.put(tunnel.tunnelId(), tunnel); | ||
| 1114 | - } | ||
| 1115 | - } | ||
| 1116 | - | ||
| 1117 | - preSyncLspDbMap.put(pccId.ipAddress(), preSyncLspDb); | ||
| 1118 | - syncCompleteDeleteList.put(pccId.ipAddress(), new LinkedList<>()); | ||
| 1119 | - syncCompleteUpdateList.put(pccId.ipAddress(), new LinkedList<>()); | ||
| 1120 | - } | ||
| 1121 | - handleRptWithoutSrpId(stateRpt, pccId, IN_SYNC); | ||
| 1122 | - continue; | ||
| 1123 | - | ||
| 1124 | - } else if (pcepClientController.getClient(pccId).lspDbSyncStatus() == IN_SYNC) { | ||
| 1125 | - // If sync flag is not set in the msg, and the | ||
| 1126 | - // previous state was "in sync" means this is | ||
| 1127 | - // end of sync message. PCRpt for end of sync | ||
| 1128 | - // does not carry any LSP report. | ||
| 1129 | - pcepClientController.getClient(pccId).setLspDbSyncStatus(SYNCED); | ||
| 1130 | - handleEndOfSyncAction(pccId); | ||
| 1131 | - continue; | ||
| 1132 | - } | ||
| 1133 | - | ||
| 1134 | - // For PCRpt without matching SRP id not during LSPDB sync. | ||
| 1135 | - handleRptWithoutSrpId(stateRpt, pccId, SYNCED); | ||
| 1136 | continue; | 1181 | continue; |
| 1137 | } | 1182 | } |
| 1138 | 1183 | ||
| ... | @@ -1226,27 +1271,30 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1226,27 +1271,30 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1226 | } | 1271 | } |
| 1227 | } | 1272 | } |
| 1228 | 1273 | ||
| 1229 | - private void handleRptWithoutSrpId(PcepStateReport stateRpt, PccId pccId, PcepSyncStatus syncStatus) { | 1274 | + private SparseAnnotations getAnnotations(PcepLspObject lspObj, StatefulIPv4LspIdentifiersTlv ipv4LspIdenTlv, |
| 1230 | - ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); | 1275 | + float bandwidth, LspType lspType, String costType) { |
| 1231 | - PcepStateReport.PcepMsgPath msgPath = stateRpt.getMsgPath(); | ||
| 1232 | - checkNotNull(msgPath); | ||
| 1233 | - PcepEroObject eroObj = msgPath.getEroObject(); | ||
| 1234 | - if (eroObj == null) { | ||
| 1235 | - log.error("ERO object is null in report message."); | ||
| 1236 | - return; | ||
| 1237 | - } | ||
| 1238 | - Path path = buildPathFromEroObj(eroObj, providerId); | ||
| 1239 | 1276 | ||
| 1240 | - int bandwidth = 0; | 1277 | + Builder builder = DefaultAnnotations.builder(); |
| 1241 | - if (msgPath.getBandwidthObject() != null) { | ||
| 1242 | - bandwidth = msgPath.getBandwidthObject().getBandwidth(); | ||
| 1243 | - } | ||
| 1244 | 1278 | ||
| 1245 | /* | 1279 | /* |
| 1246 | - * To carry PST TLV, SRP object can be present with value 0 even when PCRpt is not in response to any action | 1280 | + * [RFC 5440] The absence of the METRIC object MUST be interpreted by the PCE as a path computation request |
| 1247 | - * from PCE. | 1281 | + * for which no constraints need be applied to any of the metrics. |
| 1248 | */ | 1282 | */ |
| 1249 | - PcepSrpObject srpObj = stateRpt.getSrpObject(); | 1283 | + if (costType != null) { |
| 1284 | + builder.set(COST_TYPE, costType); | ||
| 1285 | + } | ||
| 1286 | + | ||
| 1287 | + SparseAnnotations annotations = builder | ||
| 1288 | + .set(BANDWIDTH, (new Float(bandwidth)).toString()).set(LSP_SIG_TYPE, lspType.name()) | ||
| 1289 | + .set(PCC_TUNNEL_ID, String.valueOf(ipv4LspIdenTlv.getTunnelId())) | ||
| 1290 | + .set(PLSP_ID, String.valueOf(lspObj.getPlspId())) | ||
| 1291 | + .set(LOCAL_LSP_ID, String.valueOf(ipv4LspIdenTlv.getLspId())) | ||
| 1292 | + .set(DELEGATE, String.valueOf(lspObj.getDFlag())) | ||
| 1293 | + .build(); | ||
| 1294 | + return annotations; | ||
| 1295 | + } | ||
| 1296 | + | ||
| 1297 | + private LspType getLspType(PcepSrpObject srpObj) { | ||
| 1250 | LspType lspType = WITH_SIGNALLING; | 1298 | LspType lspType = WITH_SIGNALLING; |
| 1251 | 1299 | ||
| 1252 | if (null != srpObj) { | 1300 | if (null != srpObj) { |
| ... | @@ -1266,6 +1314,55 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1266,6 +1314,55 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1266 | } | 1314 | } |
| 1267 | } | 1315 | } |
| 1268 | } | 1316 | } |
| 1317 | + return lspType; | ||
| 1318 | + } | ||
| 1319 | + | ||
| 1320 | + private void handleRptWithoutSrpId(PcepStateReport stateRpt, PccId pccId) { | ||
| 1321 | + ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); | ||
| 1322 | + String costType = null; | ||
| 1323 | + PcepStateReport.PcepMsgPath msgPath = stateRpt.getMsgPath(); | ||
| 1324 | + checkNotNull(msgPath); | ||
| 1325 | + PcepEroObject eroObj = msgPath.getEroObject(); | ||
| 1326 | + if (eroObj == null) { | ||
| 1327 | + log.error("ERO object is null in report message."); | ||
| 1328 | + return; | ||
| 1329 | + } | ||
| 1330 | + | ||
| 1331 | + PcepAttribute attributes = msgPath.getPcepAttribute(); | ||
| 1332 | + int cost = 0; | ||
| 1333 | + if (attributes != null && attributes.getMetricObjectList() != null) { | ||
| 1334 | + ListIterator<PcepMetricObject> iterator = attributes.getMetricObjectList().listIterator(); | ||
| 1335 | + PcepMetricObject metricObj = iterator.next(); | ||
| 1336 | + | ||
| 1337 | + while (metricObj != null) { | ||
| 1338 | + if (metricObj.getBType() == IGP_METRIC) { | ||
| 1339 | + costType = "COST"; | ||
| 1340 | + } else if (metricObj.getBType() == TE_METRIC) { | ||
| 1341 | + costType = "TE_COST"; | ||
| 1342 | + } | ||
| 1343 | + | ||
| 1344 | + if (costType != null) { | ||
| 1345 | + cost = metricObj.getMetricVal(); | ||
| 1346 | + log.debug("Path cost {}", cost); | ||
| 1347 | + break; | ||
| 1348 | + } | ||
| 1349 | + metricObj = iterator.next(); | ||
| 1350 | + } | ||
| 1351 | + } | ||
| 1352 | + | ||
| 1353 | + Path path = buildPathFromEroObj(eroObj, providerId, cost); | ||
| 1354 | + | ||
| 1355 | + float bandwidth = 0; | ||
| 1356 | + if (msgPath.getBandwidthObject() != null) { | ||
| 1357 | + bandwidth = msgPath.getBandwidthObject().getBandwidth(); | ||
| 1358 | + } | ||
| 1359 | + | ||
| 1360 | + /* | ||
| 1361 | + * To carry PST TLV, SRP object can be present with value 0 even when PCRpt is not in response to any action | ||
| 1362 | + * from PCE. | ||
| 1363 | + */ | ||
| 1364 | + PcepSrpObject srpObj = stateRpt.getSrpObject(); | ||
| 1365 | + LspType lspType = getLspType(srpObj); | ||
| 1269 | 1366 | ||
| 1270 | PcepLspObject lspObj = stateRpt.getLspObject(); | 1367 | PcepLspObject lspObj = stateRpt.getLspObject(); |
| 1271 | ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); | 1368 | ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); |
| ... | @@ -1287,7 +1384,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1287,7 +1384,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1287 | break; | 1384 | break; |
| 1288 | } | 1385 | } |
| 1289 | } | 1386 | } |
| 1290 | - | ||
| 1291 | /* | 1387 | /* |
| 1292 | * Draft says: The LSP-IDENTIFIERS TLV MUST be included in the LSP object in PCRpt messages for | 1388 | * Draft says: The LSP-IDENTIFIERS TLV MUST be included in the LSP object in PCRpt messages for |
| 1293 | * RSVP-signaled LSPs. For ONOS PCECC implementation, it is mandatory. | 1389 | * RSVP-signaled LSPs. For ONOS PCECC implementation, it is mandatory. |
| ... | @@ -1303,6 +1399,14 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1303,6 +1399,14 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1303 | .ipTunnelPoint(IpAddress.valueOf(ipv4LspIdenTlv.getIpv4EgressAddress())); | 1399 | .ipTunnelPoint(IpAddress.valueOf(ipv4LspIdenTlv.getIpv4EgressAddress())); |
| 1304 | Collection<Tunnel> tunnelQueryResult = tunnelService.queryTunnel(tunnelEndPointSrc, tunnelEndPointDst); | 1400 | Collection<Tunnel> tunnelQueryResult = tunnelService.queryTunnel(tunnelEndPointSrc, tunnelEndPointDst); |
| 1305 | 1401 | ||
| 1402 | + // Store delegation flag info and that LSP info because only delegated PCE sends update message | ||
| 1403 | + // Storing if D flag is set, if not dont store. while checking whether delegation if annotation for D flag | ||
| 1404 | + // not present then non-delegated , if present it is delegated. | ||
| 1405 | + if (lspObj.getDFlag()) { | ||
| 1406 | + pcepClientController.getClient(pccId).setLspAndDelegationInfo( | ||
| 1407 | + new LspKey(lspObj.getPlspId(), ipv4LspIdenTlv.getLspId()), lspObj.getDFlag()); | ||
| 1408 | + } | ||
| 1409 | + | ||
| 1306 | Tunnel tunnel = null; | 1410 | Tunnel tunnel = null; |
| 1307 | // Asynchronous status change message from PCC for LSP reported earlier. | 1411 | // Asynchronous status change message from PCC for LSP reported earlier. |
| 1308 | for (Tunnel tunnelObj : tunnelQueryResult) { | 1412 | for (Tunnel tunnelObj : tunnelQueryResult) { |
| ... | @@ -1321,7 +1425,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1321,7 +1425,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1321 | } | 1425 | } |
| 1322 | continue; | 1426 | continue; |
| 1323 | } | 1427 | } |
| 1324 | - | ||
| 1325 | if ((Integer.valueOf(tunnelObj.annotations().value(PLSP_ID)) == lspObj.getPlspId()) && (Integer | 1428 | if ((Integer.valueOf(tunnelObj.annotations().value(PLSP_ID)) == lspObj.getPlspId()) && (Integer |
| 1326 | .valueOf(tunnelObj.annotations().value(LOCAL_LSP_ID)) == ipv4LspIdenTlv.getLspId())) { | 1429 | .valueOf(tunnelObj.annotations().value(LOCAL_LSP_ID)) == ipv4LspIdenTlv.getLspId())) { |
| 1327 | tunnel = tunnelObj; | 1430 | tunnel = tunnelObj; |
| ... | @@ -1330,6 +1433,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1330,6 +1433,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1330 | } | 1433 | } |
| 1331 | 1434 | ||
| 1332 | DefaultTunnelDescription td; | 1435 | DefaultTunnelDescription td; |
| 1436 | + SparseAnnotations annotations = null; | ||
| 1333 | State tunnelState = PcepLspStatus.getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); | 1437 | State tunnelState = PcepLspStatus.getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); |
| 1334 | if (tunnel == null) { | 1438 | if (tunnel == null) { |
| 1335 | if (lspObj.getRFlag()) { | 1439 | if (lspObj.getRFlag()) { |
| ... | @@ -1340,91 +1444,96 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1340,91 +1444,96 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1340 | return; | 1444 | return; |
| 1341 | } | 1445 | } |
| 1342 | 1446 | ||
| 1343 | - if (lspObj.getCFlag()) { | 1447 | + DeviceId deviceId = getDevice(pccId); |
| 1344 | - /* | 1448 | + if (deviceId == null) { |
| 1345 | - * While in sync, if PCRpt is received for PCE init LSP and PCE doesn't have entry, mark to send | 1449 | + log.error("Ingress deviceId not found"); |
| 1346 | - * delete message on end of sync. | 1450 | + return; |
| 1347 | - */ | 1451 | + } |
| 1348 | - SparseAnnotations annotations = DefaultAnnotations.builder() | 1452 | + annotations = getAnnotations(lspObj, ipv4LspIdenTlv, bandwidth, lspType, costType); |
| 1349 | - .set(BANDWIDTH, (new Integer(bandwidth)).toString()) | ||
| 1350 | - .set(LSP_SIG_TYPE, lspType.name()) | ||
| 1351 | - .set(PCC_TUNNEL_ID, String.valueOf(ipv4LspIdenTlv.getTunnelId())) | ||
| 1352 | - .set(PLSP_ID, String.valueOf(lspObj.getPlspId())) | ||
| 1353 | - .set(LOCAL_LSP_ID, String.valueOf(ipv4LspIdenTlv.getLspId())).build(); | ||
| 1354 | - | ||
| 1355 | - // Gnenerate tunnel id for the temporary tunnel. | ||
| 1356 | - String onosTunnelId = "PCC" + String.valueOf(ipv4LspIdenTlv.getTunnelId()); | ||
| 1357 | - Tunnel tunnelToBeDeleted = new DefaultTunnel(providerId, tunnelEndPointSrc, tunnelEndPointDst, MPLS, | ||
| 1358 | - new DefaultGroupId(0), TunnelId.valueOf(onosTunnelId), | ||
| 1359 | - TunnelName.tunnelName(String | ||
| 1360 | - .valueOf(pathNameTlv.getValue())), | ||
| 1361 | - path, annotations); | ||
| 1362 | 1453 | ||
| 1363 | - /* | 1454 | + td = new DefaultTunnelDescription(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, new DefaultGroupId( |
| 1364 | - * Need to send PCInitiate delete msg for a tunnel which does not exist at PCE. For that some dummy | 1455 | + 0), providerId, TunnelName.tunnelName(new String(pathNameTlv.getValue())), path, |
| 1365 | - * data-structures need to be populated. | 1456 | + annotations); |
| 1366 | - */ | ||
| 1367 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnelToBeDeleted, path, RequestType.DELETE); | ||
| 1368 | - pcepTunnelData.setPlspId(lspObj.getPlspId()); | ||
| 1369 | - pcepTunnelData.setStatefulIpv4IndentifierTlv(ipv4LspIdenTlv); | ||
| 1370 | - pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 1371 | - pcepTunnelApiMapper.handleCreateTunnelRequestQueue(0, pcepTunnelData); | ||
| 1372 | 1457 | ||
| 1373 | - /* | 1458 | + // Do not support PCC initiated LSP after LSP DB sync is completed. |
| 1374 | - * Add to the list of tunnels for which PCInit delete will be sent at the end of sync. | 1459 | + if (!lspObj.getSFlag() && !lspObj.getCFlag()) { |
| 1375 | - */ | 1460 | + log.error("Received PCC initiated LSP while not in sync."); |
| 1376 | - List<Tunnel> tunnelToBeDeletedList = syncCompleteDeleteList.get(pccId.ipAddress()); | ||
| 1377 | - tunnelToBeDeletedList.add(tunnelToBeDeleted); | ||
| 1378 | - syncCompleteDeleteList.put(pccId.ipAddress(), tunnelToBeDeletedList); | ||
| 1379 | return; | 1461 | return; |
| 1380 | } | 1462 | } |
| 1381 | 1463 | ||
| 1382 | - SparseAnnotations annotations = DefaultAnnotations.builder() | 1464 | + /* |
| 1383 | - .set(BANDWIDTH, (new Integer(bandwidth)).toString()) | 1465 | + * If ONOS instance is master for PCC then set delegated flag as annotation and add the tunnel to store. |
| 1384 | - .set(LSP_SIG_TYPE, lspType.name()) | 1466 | + * Because all LSPs need not be delegated, hence mastership for the PCC is confirmed whereas not the |
| 1385 | - .set(PCC_TUNNEL_ID, String.valueOf(ipv4LspIdenTlv.getTunnelId())) | 1467 | + * delegation set to all LSPs.If ONOS is not the master for that PCC then check if D flag is set, if yes |
| 1386 | - .set(PLSP_ID, String.valueOf(lspObj.getPlspId())) | 1468 | + * wait for 2 seconds [while master has added the tunnel to the store] then update the tunnel. Tunnel is |
| 1387 | - .set(LOCAL_LSP_ID, String.valueOf(ipv4LspIdenTlv.getLspId())).build(); | 1469 | + * updated because in case of resilency only delegated LSPs are recomputed and only delegated PCE can |
| 1388 | - | 1470 | + * send update message to that client. |
| 1389 | - td = new DefaultTunnelDescription(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, | 1471 | + * |
| 1390 | - new DefaultGroupId(0), providerId, | 1472 | + * 1)Master can 1st get the Rpt message |
| 1391 | - TunnelName.tunnelName(String.valueOf(pathNameTlv.getValue())), path, | 1473 | + * a)Master adds the tunnel into core. |
| 1392 | - annotations); | 1474 | + * b)If a non-master for ingress gets Rpt message with D flag set[as delegation owner] |
| 1393 | - | 1475 | + * after master, then runs timer then update the tunnel with D flag set. |
| 1394 | - TunnelId tId = tunnelAdded(td, tunnelState); | 1476 | + * 2)Non-Master can 1st get the Rpt message |
| 1395 | - Tunnel tunnelInserted = new DefaultTunnel(providerId, tunnelEndPointSrc, tunnelEndPointDst, MPLS, | 1477 | + * a)Non-Master runs the timer check for the tunnel then updates the tunnel with D flag set |
| 1396 | - tunnelState, new DefaultGroupId(0), tId, | 1478 | + * b)Master would have got the message while the non-master running timer, hence master adds |
| 1397 | - TunnelName.tunnelName(String.valueOf(pathNameTlv.getValue())), | 1479 | + * tunnel to core |
| 1398 | - path, annotations); | 1480 | + * |
| 1399 | - | 1481 | + * In general always master adds the tunnel to the core |
| 1400 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnelInserted, path, LSP_STATE_RPT); | 1482 | + * while delegated owner [master or non-master with D flag set] always updates the tunnel running timer |
| 1401 | - pcepTunnelData.setStatefulIpv4IndentifierTlv(ipv4LspIdenTlv); | 1483 | + */ |
| 1402 | - pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 1484 | + if (mastershipService.isLocalMaster(deviceId)) { |
| 1485 | + TunnelId tId = tunnelAdded(td, tunnelState); | ||
| 1486 | + Tunnel tunnelInserted = new DefaultTunnel(providerId, tunnelEndPointSrc, tunnelEndPointDst, MPLS, | ||
| 1487 | + tunnelState, new DefaultGroupId(0), tId, TunnelName.tunnelName(String.valueOf(pathNameTlv | ||
| 1488 | + .getValue())), path, annotations); | ||
| 1489 | + | ||
| 1490 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnelInserted, path, LSP_STATE_RPT); | ||
| 1491 | + pcepTunnelData.setStatefulIpv4IndentifierTlv(ipv4LspIdenTlv); | ||
| 1492 | + pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 1493 | + } else if (!mastershipService.isLocalMaster(deviceId) && lspObj.getDFlag()) { | ||
| 1494 | + //Start timer then update the tunnel with D flag | ||
| 1495 | + tunnelUpdateInDelegatedCase(pccId, annotations, td, providerId); | ||
| 1496 | + } | ||
| 1403 | return; | 1497 | return; |
| 1404 | } | 1498 | } |
| 1405 | 1499 | ||
| 1406 | - if ((syncStatus == IN_SYNC) && (lspObj.getCFlag()) && (tunnelState != tunnel.state())) { | 1500 | + //delegated owner will update can be a master or non-master |
| 1407 | - // Mark to send PCUpd msg with state known at PCE. | 1501 | + if (lspObj.getDFlag()) { |
| 1408 | - List<Tunnel> tunnelToBeUpdateList = syncCompleteUpdateList.get(pccId.ipAddress()); | 1502 | + annotations = getAnnotations(lspObj, ipv4LspIdenTlv, bandwidth, lspType, costType); |
| 1409 | - tunnelToBeUpdateList.add(tunnel); | 1503 | + td = new DefaultTunnelDescription(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, new DefaultGroupId( |
| 1410 | - syncCompleteUpdateList.put(pccId.ipAddress(), tunnelToBeUpdateList); | 1504 | + 0), providerId, TunnelName.tunnelName(new String(pathNameTlv.getValue())), path, |
| 1411 | - return; | 1505 | + annotations); |
| 1506 | + tunnelUpdateInDelegatedCase(pccId, annotations, td, providerId); | ||
| 1412 | } | 1507 | } |
| 1508 | + removeOrUpdatetunnel(tunnel, pccId, lspObj, providerId, tunnelState); | ||
| 1509 | + return; | ||
| 1510 | + } | ||
| 1413 | 1511 | ||
| 1414 | - td = new DefaultTunnelDescription(tunnel.tunnelId(), tunnel.src(), tunnel.dst(), | 1512 | + private void removeOrUpdatetunnel(Tunnel tunnel, PccId pccId, PcepLspObject lspObj, ProviderId providerId, |
| 1415 | - tunnel.type(), tunnel.groupId(), providerId, | 1513 | + State tunnelState) { |
| 1416 | - tunnel.tunnelName(), tunnel.path(), | 1514 | + DefaultTunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), tunnel.src(), tunnel.dst(), |
| 1417 | - (SparseAnnotations) tunnel.annotations()); | 1515 | + tunnel.type(), tunnel.groupId(), providerId, tunnel.tunnelName(), tunnel.path(), |
| 1418 | - | 1516 | + (SparseAnnotations) tunnel.annotations()); |
| 1419 | if (lspObj.getRFlag()) { | 1517 | if (lspObj.getRFlag()) { |
| 1420 | tunnelRemoved(td); | 1518 | tunnelRemoved(td); |
| 1421 | } else { | 1519 | } else { |
| 1422 | - if (syncStatus == IN_SYNC) { | ||
| 1423 | - markLspDbEntryAsLatest(pccId, tunnel.tunnelId()); | ||
| 1424 | - } | ||
| 1425 | tunnelUpdated(td, tunnelState); | 1520 | tunnelUpdated(td, tunnelState); |
| 1426 | } | 1521 | } |
| 1427 | - return; | 1522 | + } |
| 1523 | + | ||
| 1524 | + private void tunnelUpdateInDelegatedCase(PccId pccId, SparseAnnotations annotations, | ||
| 1525 | + DefaultTunnelDescription td, ProviderId providerId) { | ||
| 1526 | + //Wait for 2sec then query tunnel based on ingress PLSP-ID and local LSP-ID | ||
| 1527 | + | ||
| 1528 | + /* | ||
| 1529 | + * If ONOS is not the master for that PCC then check if D flag is set, if yes wait [while | ||
| 1530 | + * master has added the tunnel to the store] then update the tunnel. | ||
| 1531 | + */ | ||
| 1532 | + ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); | ||
| 1533 | + | ||
| 1534 | + // Thread is started after 2 seconds first time later periodically after 2 seconds to update the tunnel | ||
| 1535 | + executor.scheduleAtFixedRate(new UpdateDelegation(td, providerId, annotations, pccId, | ||
| 1536 | + executor), DELAY, DELAY, TimeUnit.SECONDS); | ||
| 1428 | } | 1537 | } |
| 1429 | 1538 | ||
| 1430 | /** | 1539 | /** |
| ... | @@ -1432,9 +1541,10 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1432,9 +1541,10 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1432 | * | 1541 | * |
| 1433 | * @param eroObj ERO object | 1542 | * @param eroObj ERO object |
| 1434 | * @param providerId provider id | 1543 | * @param providerId provider id |
| 1544 | + * @param cost cost of path | ||
| 1435 | * @return path object | 1545 | * @return path object |
| 1436 | */ | 1546 | */ |
| 1437 | - private Path buildPathFromEroObj(PcepEroObject eroObj, ProviderId providerId) { | 1547 | + private Path buildPathFromEroObj(PcepEroObject eroObj, ProviderId providerId, int cost) { |
| 1438 | checkNotNull(eroObj); | 1548 | checkNotNull(eroObj); |
| 1439 | List<Link> links = new ArrayList<Link>(); | 1549 | List<Link> links = new ArrayList<Link>(); |
| 1440 | LinkedList<PcepValueType> llSubObj = eroObj.getSubObjects(); | 1550 | LinkedList<PcepValueType> llSubObj = eroObj.getSubObjects(); |
| ... | @@ -1474,7 +1584,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1474,7 +1584,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1474 | // the other sub objects are not required | 1584 | // the other sub objects are not required |
| 1475 | } | 1585 | } |
| 1476 | } | 1586 | } |
| 1477 | - return new DefaultPath(providerId, links, 0, EMPTY); | 1587 | + |
| 1588 | + return new DefaultPath(providerId, links, cost, EMPTY); | ||
| 1478 | } | 1589 | } |
| 1479 | 1590 | ||
| 1480 | @Override | 1591 | @Override |
| ... | @@ -1493,44 +1604,14 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1493,44 +1604,14 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1493 | TunnelStatistics tunnelStatistics = buildTunnelStatistics(pcepTunnelStatistics); | 1604 | TunnelStatistics tunnelStatistics = buildTunnelStatistics(pcepTunnelStatistics); |
| 1494 | tunnelStatisticsMap.put(id, tunnelStatistics); | 1605 | tunnelStatisticsMap.put(id, tunnelStatistics); |
| 1495 | } | 1606 | } |
| 1496 | - } | ||
| 1497 | - | ||
| 1498 | - @Override | ||
| 1499 | - public Tunnel tunnelQueryById(TunnelId tunnelId) { | ||
| 1500 | - return service.tunnelQueryById(tunnelId); | ||
| 1501 | - } | ||
| 1502 | - | ||
| 1503 | - /** | ||
| 1504 | - * Removes the entry from temporary copy of LSPDB, signifying its status as upto date. | ||
| 1505 | - * | ||
| 1506 | - * @param pccId the key for temporary LSPDB | ||
| 1507 | - * @param tunnelId the tunnel id for which information is updated. | ||
| 1508 | - */ | ||
| 1509 | - private void markLspDbEntryAsLatest(PccId pccId, TunnelId tunnelId) { | ||
| 1510 | - checkNotNull(pccId); | ||
| 1511 | - checkNotNull(tunnelId); | ||
| 1512 | - | ||
| 1513 | - Map<TunnelId, Tunnel> preSyncLspDb = preSyncLspDbMap.get(pccId.ipAddress()); | ||
| 1514 | - checkNotNull(preSyncLspDb); | ||
| 1515 | 1607 | ||
| 1516 | - preSyncLspDb.remove(tunnelId); | 1608 | + @Override |
| 1517 | - preSyncLspDbMap.put(pccId.ipAddress(), preSyncLspDb); | 1609 | + public void handleEndOfSyncAction(Tunnel tunnel, PcepLspSyncAction endOfSyncAction) { |
| 1518 | - } | ||
| 1519 | - | ||
| 1520 | - /** | ||
| 1521 | - * Sends PCInit, PCInit(R) or PCUpd messages for initiated LSPs at the end | ||
| 1522 | - * of LSP DB sync based on actions decided while sync was in progress. Also | ||
| 1523 | - * triggers label DB sync. | ||
| 1524 | - * | ||
| 1525 | - * @param pccId the key for temporary DBs storing required end of sync | ||
| 1526 | - * actions. | ||
| 1527 | - */ | ||
| 1528 | - private void handleEndOfSyncAction(PccId pccId) { | ||
| 1529 | - | ||
| 1530 | - Map<TunnelId, Tunnel> preSyncLspDb = preSyncLspDbMap.get(pccId.ipAddress()); | ||
| 1531 | - checkNotNull(preSyncLspDb); | ||
| 1532 | 1610 | ||
| 1533 | - for (Tunnel tunnel : preSyncLspDb.values()) { | 1611 | + if (endOfSyncAction == SEND_UPDATE) { |
| 1612 | + updateTunnel(tunnel, tunnel.path()); | ||
| 1613 | + return; | ||
| 1614 | + } | ||
| 1534 | 1615 | ||
| 1535 | TunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), | 1616 | TunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), |
| 1536 | tunnel.src(), tunnel.dst(), | 1617 | tunnel.src(), tunnel.dst(), |
| ... | @@ -1541,41 +1622,133 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1541,41 +1622,133 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1541 | tunnel.path(), | 1622 | tunnel.path(), |
| 1542 | (SparseAnnotations) tunnel.annotations()); | 1623 | (SparseAnnotations) tunnel.annotations()); |
| 1543 | 1624 | ||
| 1544 | - if ((tunnel.annotations().value(PCE_INIT) == null) | ||
| 1545 | - || (tunnel.annotations().value(PCE_INIT).equals("false"))) { | ||
| 1546 | 1625 | ||
| 1547 | - tunnelRemoved(td); | 1626 | + if (endOfSyncAction == PcepLspSyncAction.UNSTABLE) { |
| 1548 | - } else { | 1627 | + |
| 1549 | // Send PCInit msg again after global reoptimization. | 1628 | // Send PCInit msg again after global reoptimization. |
| 1550 | tunnelUpdated(td, UNSTABLE); | 1629 | tunnelUpdated(td, UNSTABLE); |
| 1551 | 1630 | ||
| 1552 | // To remove the old tunnel from store whose PLSPID is not | 1631 | // To remove the old tunnel from store whose PLSPID is not |
| 1553 | // recognized by ingress PCC. | 1632 | // recognized by ingress PCC. |
| 1554 | tunnelRemoved(td); | 1633 | tunnelRemoved(td); |
| 1634 | + | ||
| 1635 | + } else if (endOfSyncAction == REMOVE) { | ||
| 1636 | + tunnelRemoved(td); | ||
| 1555 | } | 1637 | } |
| 1556 | } | 1638 | } |
| 1557 | 1639 | ||
| 1558 | - List<Tunnel> tunnelsToBeDeletedList = syncCompleteDeleteList.get(pccId.ipAddress()); | 1640 | + @Override |
| 1559 | - checkNotNull(tunnelsToBeDeletedList); | 1641 | + public void handleEndOfSyncAction(PccId pccId, PcepMessage msg, PcepLspSyncAction endOfSyncAction) { |
| 1560 | - for (Tunnel tunnel: tunnelsToBeDeletedList) { | 1642 | + try { |
| 1561 | - releaseTunnel(tunnel); | 1643 | + if ((msg instanceof PcepInitiateMsg) && (endOfSyncAction == SEND_DELETE)) { |
| 1644 | + PcepClient pc = pcepClientController.getClient(pccId); | ||
| 1645 | + LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = ((PcepInitiateMsg) msg) | ||
| 1646 | + .getPcInitiatedLspRequestList(); | ||
| 1647 | + PcInitiatedLspRequest pcInitMsg = llPcInitiatedLspRequestList.iterator().next(); | ||
| 1648 | + | ||
| 1649 | + if (pcInitMsg != null) { | ||
| 1650 | + PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(SrpIdGenerators.create()) | ||
| 1651 | + .setRFlag(true).build(); | ||
| 1652 | + | ||
| 1653 | + PcInitiatedLspRequest releaseLspRequest = pc.factory().buildPcInitiatedLspRequest() | ||
| 1654 | + .setLspObject(pcInitMsg.getLspObject()).setSrpObject(srpobj).build(); | ||
| 1655 | + | ||
| 1656 | + llPcInitiatedLspRequestList.remove(pcInitMsg); | ||
| 1657 | + llPcInitiatedLspRequestList.add(releaseLspRequest); | ||
| 1658 | + | ||
| 1659 | + PcepInitiateMsg pcInitiateMsg = pc.factory().buildPcepInitiateMsg() | ||
| 1660 | + .setPcInitiatedLspRequestList(llPcInitiatedLspRequestList).build(); | ||
| 1661 | + | ||
| 1662 | + pc.sendMessage(Collections.singletonList(pcInitiateMsg)); | ||
| 1663 | + } | ||
| 1664 | + } | ||
| 1665 | + } catch (PcepParseException e) { | ||
| 1666 | + log.error("Exception occured while sending initiate delete message {}", e.getMessage()); | ||
| 1667 | + } | ||
| 1562 | } | 1668 | } |
| 1669 | + } | ||
| 1670 | + @Override | ||
| 1671 | + public Tunnel tunnelQueryById(TunnelId tunnelId) { | ||
| 1672 | + return service.tunnelQueryById(tunnelId); | ||
| 1673 | + } | ||
| 1674 | + | ||
| 1563 | 1675 | ||
| 1564 | - List<Tunnel> tunnelsToBeUpdatedList = syncCompleteUpdateList.get(pccId.ipAddress()); | 1676 | + private DeviceId getDevice(PccId pccId) { |
| 1565 | - checkNotNull(tunnelsToBeUpdatedList); | 1677 | + // Get lsrId of the PCEP client from the PCC ID. Session info is based on lsrID. |
| 1566 | - for (Tunnel tunnel: tunnelsToBeUpdatedList) { | 1678 | + IpAddress lsrId = pccId.ipAddress(); |
| 1567 | - updateTunnel(tunnel, tunnel.path()); | 1679 | + String lsrIdentifier = String.valueOf(lsrId); |
| 1680 | + | ||
| 1681 | + // Find PCC deviceID from lsrId stored as annotations | ||
| 1682 | + Iterable<Device> devices = deviceService.getAvailableDevices(); | ||
| 1683 | + for (Device dev : devices) { | ||
| 1684 | + if (dev.annotations().value(AnnotationKeys.TYPE).equals("L3") | ||
| 1685 | + && dev.annotations().value(LSRID).equals(lsrIdentifier)) { | ||
| 1686 | + return dev.id(); | ||
| 1687 | + } | ||
| 1688 | + } | ||
| 1689 | + return null; | ||
| 1690 | + } | ||
| 1691 | + | ||
| 1692 | + /** | ||
| 1693 | + * Updates the tunnel with updated tunnel annotation after a delay of two seconds and checks it till | ||
| 1694 | + * tunnel is found. | ||
| 1695 | + */ | ||
| 1696 | + private class UpdateDelegation implements Runnable { | ||
| 1697 | + DefaultTunnelDescription td; | ||
| 1698 | + ProviderId providerId; | ||
| 1699 | + SparseAnnotations annotations; | ||
| 1700 | + PccId pccId; | ||
| 1701 | + ScheduledExecutorService executor; | ||
| 1702 | + | ||
| 1703 | + /** | ||
| 1704 | + * Creates an instance of UpdateDelegation. | ||
| 1705 | + * | ||
| 1706 | + * @param td tunnel description | ||
| 1707 | + * @param providerId provider id | ||
| 1708 | + * @param annotations tunnel annotations | ||
| 1709 | + * @param pccId PCEP client id | ||
| 1710 | + * @param executor service of delegated owner | ||
| 1711 | + */ | ||
| 1712 | + public UpdateDelegation(DefaultTunnelDescription td, ProviderId providerId, SparseAnnotations annotations, | ||
| 1713 | + PccId pccId, ScheduledExecutorService executor) { | ||
| 1714 | + this.td = td; | ||
| 1715 | + this.providerId = providerId; | ||
| 1716 | + this.annotations = annotations; | ||
| 1717 | + this.pccId = pccId; | ||
| 1718 | + this.executor = executor; | ||
| 1568 | } | 1719 | } |
| 1569 | 1720 | ||
| 1570 | - /* On end of sync, empty all temporary data structures. */ | 1721 | + //Temporary using annotations later will use projection/network config service |
| 1571 | - preSyncLspDbMap.remove(pccId.ipAddress()); | 1722 | + @Override |
| 1572 | - syncCompleteDeleteList.remove(pccId.ipAddress()); | 1723 | + public void run() { |
| 1573 | - syncCompleteUpdateList.remove(pccId.ipAddress()); | 1724 | + Collection<Tunnel> tunnelQueryResult = tunnelService.queryTunnel(td.src(), td.dst()); |
| 1725 | + TunnelId tempTunnelId = null; | ||
| 1726 | + for (Tunnel t : tunnelQueryResult) { | ||
| 1727 | + if (t.annotations().value(LOCAL_LSP_ID) == null || t.annotations().value(PLSP_ID) == null) { | ||
| 1728 | + continue; | ||
| 1729 | + } | ||
| 1574 | 1730 | ||
| 1575 | - // TODO: If SR capable, send a notification to | 1731 | + if (t.annotations().value(LOCAL_LSP_ID).equals(td.annotations().value(LOCAL_LSP_ID)) |
| 1576 | - // PCE APP to start label DB sync. | 1732 | + && t.annotations().value(PLSP_ID).equals(td.annotations().value(PLSP_ID)) |
| 1577 | - if (true) { | 1733 | + && ((IpTunnelEndPoint) t.src()).ip().equals(pccId.id())) { |
| 1578 | - pcepClientController.getClient(pccId).setLabelDbSyncStatus(IN_SYNC); | 1734 | + tempTunnelId = t.tunnelId(); |
| 1735 | + break; | ||
| 1736 | + } | ||
| 1737 | + } | ||
| 1738 | + | ||
| 1739 | + //If tunnel is found update the tunnel and shutdown the thread otherwise thread will be executing | ||
| 1740 | + //periodically | ||
| 1741 | + if (tempTunnelId != null) { | ||
| 1742 | + Tunnel tunnel = new DefaultTunnel(providerId, td.src(), td.dst(), MPLS, new DefaultGroupId(0), | ||
| 1743 | + tempTunnelId, td.tunnelName(), td.path(), annotations); | ||
| 1744 | + tunnelUpdated(tunnel, td.path()); | ||
| 1745 | + executor.shutdown(); | ||
| 1746 | + try { | ||
| 1747 | + executor.awaitTermination(WAIT_TIME, TimeUnit.SECONDS); | ||
| 1748 | + } catch (InterruptedException e) { | ||
| 1749 | + log.error("updating delegation failed"); | ||
| 1750 | + } | ||
| 1751 | + } | ||
| 1579 | } | 1752 | } |
| 1580 | } | 1753 | } |
| 1581 | } | 1754 | } | ... | ... |
providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepClientAdapter.java
| ... | @@ -17,17 +17,22 @@ package org.onosproject.provider.pcep.tunnel.impl; | ... | @@ -17,17 +17,22 @@ package org.onosproject.provider.pcep.tunnel.impl; |
| 17 | 17 | ||
| 18 | import static org.junit.Assert.assertNotNull; | 18 | import static org.junit.Assert.assertNotNull; |
| 19 | 19 | ||
| 20 | +import java.util.HashMap; | ||
| 21 | +import java.util.LinkedList; | ||
| 20 | import java.util.List; | 22 | import java.util.List; |
| 23 | +import java.util.Map; | ||
| 21 | import java.util.concurrent.RejectedExecutionException; | 24 | import java.util.concurrent.RejectedExecutionException; |
| 22 | 25 | ||
| 23 | import org.jboss.netty.channel.Channel; | 26 | import org.jboss.netty.channel.Channel; |
| 24 | import org.onosproject.pcep.controller.ClientCapability; | 27 | import org.onosproject.pcep.controller.ClientCapability; |
| 28 | +import org.onosproject.pcep.controller.LspKey; | ||
| 25 | import org.onosproject.pcep.controller.PccId; | 29 | import org.onosproject.pcep.controller.PccId; |
| 26 | import org.onosproject.pcep.controller.PcepClient; | 30 | import org.onosproject.pcep.controller.PcepClient; |
| 27 | import org.onosproject.pcep.controller.PcepSyncStatus; | 31 | import org.onosproject.pcep.controller.PcepSyncStatus; |
| 28 | import org.onosproject.pcepio.protocol.PcepFactories; | 32 | import org.onosproject.pcepio.protocol.PcepFactories; |
| 29 | import org.onosproject.pcepio.protocol.PcepFactory; | 33 | import org.onosproject.pcepio.protocol.PcepFactory; |
| 30 | import org.onosproject.pcepio.protocol.PcepMessage; | 34 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 35 | +import org.onosproject.pcepio.protocol.PcepStateReport; | ||
| 31 | import org.onosproject.pcepio.protocol.PcepVersion; | 36 | import org.onosproject.pcepio.protocol.PcepVersion; |
| 32 | 37 | ||
| 33 | /** | 38 | /** |
| ... | @@ -45,6 +50,8 @@ public class PcepClientAdapter implements PcepClient { | ... | @@ -45,6 +50,8 @@ public class PcepClientAdapter implements PcepClient { |
| 45 | private PcepVersion pcepVersion; | 50 | private PcepVersion pcepVersion; |
| 46 | private PcepSyncStatus lspDbSyncStatus; | 51 | private PcepSyncStatus lspDbSyncStatus; |
| 47 | private PcepSyncStatus labelDbSyncStatus; | 52 | private PcepSyncStatus labelDbSyncStatus; |
| 53 | + private Map<LspKey, Boolean> lspDelegationInfo = new HashMap<>(); | ||
| 54 | + private Map<PccId, List<PcepStateReport>> sycRptCache = new HashMap<>(); | ||
| 48 | 55 | ||
| 49 | /** | 56 | /** |
| 50 | * Initialize instance with specified parameters. | 57 | * Initialize instance with specified parameters. |
| ... | @@ -139,4 +146,45 @@ public class PcepClientAdapter implements PcepClient { | ... | @@ -139,4 +146,45 @@ public class PcepClientAdapter implements PcepClient { |
| 139 | public ClientCapability capability() { | 146 | public ClientCapability capability() { |
| 140 | return capability; | 147 | return capability; |
| 141 | } | 148 | } |
| 149 | + | ||
| 150 | + @Override | ||
| 151 | + public void addNode(PcepClient pc) { | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + @Override | ||
| 155 | + public void deleteNode(PccId pccId) { | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + @Override | ||
| 159 | + public void setLspAndDelegationInfo(LspKey lspKey, boolean dFlag) { | ||
| 160 | + lspDelegationInfo.put(lspKey, dFlag); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + @Override | ||
| 164 | + public Boolean delegationInfo(LspKey lspKey) { | ||
| 165 | + return lspDelegationInfo.get(lspKey); | ||
| 166 | + } | ||
| 167 | + | ||
| 168 | + @Override | ||
| 169 | + public void initializeSyncMsgList(PccId pccId) { | ||
| 170 | + List<PcepStateReport> rptMsgList = new LinkedList<>(); | ||
| 171 | + sycRptCache.put(pccId, rptMsgList); | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + @Override | ||
| 175 | + public List<PcepStateReport> getSyncMsgList(PccId pccId) { | ||
| 176 | + return sycRptCache.get(pccId); | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + @Override | ||
| 180 | + public void removeSyncMsgList(PccId pccId) { | ||
| 181 | + sycRptCache.remove(pccId); | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + @Override | ||
| 185 | + public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) { | ||
| 186 | + List<PcepStateReport> rptMsgList = sycRptCache.get(pccId); | ||
| 187 | + rptMsgList.add(rptMsg); | ||
| 188 | + sycRptCache.put(pccId, rptMsgList); | ||
| 189 | + } | ||
| 142 | } | 190 | } | ... | ... |
| ... | @@ -24,13 +24,13 @@ import java.util.concurrent.ConcurrentHashMap; | ... | @@ -24,13 +24,13 @@ import java.util.concurrent.ConcurrentHashMap; |
| 24 | 24 | ||
| 25 | import org.apache.felix.scr.annotations.Activate; | 25 | import org.apache.felix.scr.annotations.Activate; |
| 26 | import org.apache.felix.scr.annotations.Deactivate; | 26 | import org.apache.felix.scr.annotations.Deactivate; |
| 27 | -import org.onlab.packet.IpAddress; | ||
| 28 | -import org.onosproject.pcep.controller.ClientCapability; | ||
| 29 | import org.onosproject.pcep.controller.PccId; | 27 | import org.onosproject.pcep.controller.PccId; |
| 30 | import org.onosproject.pcep.controller.PcepClient; | 28 | import org.onosproject.pcep.controller.PcepClient; |
| 31 | import org.onosproject.pcep.controller.PcepClientController; | 29 | import org.onosproject.pcep.controller.PcepClientController; |
| 32 | import org.onosproject.pcep.controller.PcepClientListener; | 30 | import org.onosproject.pcep.controller.PcepClientListener; |
| 33 | import org.onosproject.pcep.controller.PcepEventListener; | 31 | import org.onosproject.pcep.controller.PcepEventListener; |
| 32 | +import org.onosproject.pcep.controller.PcepNodeListener; | ||
| 33 | +import org.onosproject.pcep.controller.PcepPacketListener; | ||
| 34 | import org.onosproject.pcep.controller.driver.PcepAgent; | 34 | import org.onosproject.pcep.controller.driver.PcepAgent; |
| 35 | import org.onosproject.pcepio.protocol.PcepError; | 35 | import org.onosproject.pcepio.protocol.PcepError; |
| 36 | import org.onosproject.pcepio.protocol.PcepErrorInfo; | 36 | import org.onosproject.pcepio.protocol.PcepErrorInfo; |
| ... | @@ -57,6 +57,8 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -57,6 +57,8 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 57 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); | 57 | protected Set<PcepClientListener> pcepClientListener = new HashSet<>(); |
| 58 | 58 | ||
| 59 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); | 59 | protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet(); |
| 60 | + public Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet(); | ||
| 61 | + protected Set<PcepPacketListener> pcepPacketListener = Sets.newHashSet(); | ||
| 60 | 62 | ||
| 61 | @Activate | 63 | @Activate |
| 62 | public void activate() { | 64 | public void activate() { |
| ... | @@ -73,16 +75,11 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -73,16 +75,11 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 73 | 75 | ||
| 74 | @Override | 76 | @Override |
| 75 | public PcepClient getClient(PccId pccId) { | 77 | public PcepClient getClient(PccId pccId) { |
| 76 | - if (null != connectedClients.get(pccId)) { | 78 | + if (connectedClients.get(pccId) != null) { |
| 77 | return connectedClients.get(pccId); | 79 | return connectedClients.get(pccId); |
| 78 | } | 80 | } |
| 79 | PcepClientAdapter pc = new PcepClientAdapter(); | 81 | PcepClientAdapter pc = new PcepClientAdapter(); |
| 80 | - if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) | 82 | + |
| 81 | - || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { | ||
| 82 | - pc.setCapability(new ClientCapability(true, false, false)); | ||
| 83 | - } else { | ||
| 84 | - pc.setCapability(new ClientCapability(true, true, true)); | ||
| 85 | - } | ||
| 86 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); | 83 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); |
| 87 | connectedClients.put(pccId, pc); | 84 | connectedClients.put(pccId, pc); |
| 88 | return pc; | 85 | return pc; |
| ... | @@ -96,6 +93,16 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -96,6 +93,16 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 96 | } | 93 | } |
| 97 | 94 | ||
| 98 | @Override | 95 | @Override |
| 96 | + public void addNodeListener(PcepNodeListener listener) { | ||
| 97 | + pcepNodeListener.add(listener); | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + @Override | ||
| 101 | + public void removeNodeListener(PcepNodeListener listener) { | ||
| 102 | + pcepNodeListener.remove(listener); | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + @Override | ||
| 99 | public void removeListener(PcepClientListener listener) { | 106 | public void removeListener(PcepClientListener listener) { |
| 100 | this.pcepClientListener.remove(listener); | 107 | this.pcepClientListener.remove(listener); |
| 101 | } | 108 | } |
| ... | @@ -111,6 +118,16 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -111,6 +118,16 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 111 | } | 118 | } |
| 112 | 119 | ||
| 113 | @Override | 120 | @Override |
| 121 | + public void addPacketListener(PcepPacketListener listener) { | ||
| 122 | + pcepPacketListener.add(listener); | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + @Override | ||
| 126 | + public void removePacketListener(PcepPacketListener listener) { | ||
| 127 | + pcepPacketListener.remove(listener); | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + @Override | ||
| 114 | public void writeMessage(PccId pccId, PcepMessage msg) { | 131 | public void writeMessage(PccId pccId, PcepMessage msg) { |
| 115 | this.getClient(pccId).sendMessage(msg); | 132 | this.getClient(pccId).sendMessage(msg); |
| 116 | } | 133 | } |
| ... | @@ -254,5 +271,25 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -254,5 +271,25 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 254 | public void processPcepMessage(PccId pccId, PcepMessage m) { | 271 | public void processPcepMessage(PccId pccId, PcepMessage m) { |
| 255 | processClientMessage(pccId, m); | 272 | processClientMessage(pccId, m); |
| 256 | } | 273 | } |
| 274 | + | ||
| 275 | + @Override | ||
| 276 | + public void addNode(PcepClient pc) { | ||
| 277 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 278 | + l.addNode(pc); | ||
| 279 | + } | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + @Override | ||
| 283 | + public void deleteNode(PccId pccId) { | ||
| 284 | + for (PcepNodeListener l : pcepNodeListener) { | ||
| 285 | + l.deleteNode(pccId); | ||
| 286 | + } | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + @Override | ||
| 290 | + public boolean analyzeSyncMsgList(PccId pccId) { | ||
| 291 | + // TODO Auto-generated method stub | ||
| 292 | + return false; | ||
| 293 | + } | ||
| 257 | } | 294 | } |
| 258 | } | 295 | } | ... | ... |
| ... | @@ -40,6 +40,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -40,6 +40,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 40 | import org.onosproject.incubator.net.tunnel.Tunnel; | 40 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 41 | import org.onosproject.incubator.net.tunnel.TunnelId; | 41 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 42 | import org.onosproject.incubator.net.tunnel.TunnelName; | 42 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 43 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 43 | import org.onosproject.net.Annotations; | 44 | import org.onosproject.net.Annotations; |
| 44 | import org.onosproject.net.ConnectPoint; | 45 | import org.onosproject.net.ConnectPoint; |
| 45 | import org.onosproject.net.DefaultAnnotations; | 46 | import org.onosproject.net.DefaultAnnotations; |
| ... | @@ -49,7 +50,10 @@ import org.onosproject.net.IpElementId; | ... | @@ -49,7 +50,10 @@ import org.onosproject.net.IpElementId; |
| 49 | import org.onosproject.net.Link; | 50 | import org.onosproject.net.Link; |
| 50 | import org.onosproject.net.Path; | 51 | import org.onosproject.net.Path; |
| 51 | import org.onosproject.net.PortNumber; | 52 | import org.onosproject.net.PortNumber; |
| 53 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
| 52 | import org.onosproject.net.provider.ProviderId; | 54 | import org.onosproject.net.provider.ProviderId; |
| 55 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 56 | +import org.onosproject.pcep.controller.PccId; | ||
| 53 | import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; | 57 | import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 54 | 58 | ||
| 55 | /** | 59 | /** |
| ... | @@ -64,12 +68,16 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -64,12 +68,16 @@ public class PcepReleaseTunnelProviderTest { |
| 64 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); | 68 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); |
| 65 | private final PcepTunnelApiMapper pcepTunnelAPIMapper = new PcepTunnelApiMapper(); | 69 | private final PcepTunnelApiMapper pcepTunnelAPIMapper = new PcepTunnelApiMapper(); |
| 66 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); | 70 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); |
| 71 | + private final DeviceServiceAdapter deviceService = new DeviceServiceAdapter(); | ||
| 72 | + private final MastershipServiceAdapter mastershipService = new MastershipServiceAdapter(); | ||
| 67 | 73 | ||
| 68 | @Before | 74 | @Before |
| 69 | public void setUp() throws IOException { | 75 | public void setUp() throws IOException { |
| 70 | tunnelProvider.tunnelProviderRegistry = registry; | 76 | tunnelProvider.tunnelProviderRegistry = registry; |
| 71 | tunnelProvider.pcepClientController = controller; | 77 | tunnelProvider.pcepClientController = controller; |
| 72 | tunnelProvider.controller = ctl; | 78 | tunnelProvider.controller = ctl; |
| 79 | + tunnelProvider.deviceService = deviceService; | ||
| 80 | + tunnelProvider.mastershipService = mastershipService; | ||
| 73 | tunnelProvider.tunnelService = tunnelService; | 81 | tunnelProvider.tunnelService = tunnelService; |
| 74 | tunnelProvider.pcepTunnelApiMapper = pcepTunnelAPIMapper; | 82 | tunnelProvider.pcepTunnelApiMapper = pcepTunnelAPIMapper; |
| 75 | tunnelProvider.cfgService = new ComponentConfigAdapter(); | 83 | tunnelProvider.cfgService = new ComponentConfigAdapter(); |
| ... | @@ -125,6 +133,8 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -125,6 +133,8 @@ public class PcepReleaseTunnelProviderTest { |
| 125 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 133 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 126 | 134 | ||
| 127 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 135 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 136 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xB6024E20))).setCapability( | ||
| 137 | + new ClientCapability(true, true, true, true, true)); | ||
| 128 | 138 | ||
| 129 | tunnelProvider.releaseTunnel(tunnel); | 139 | tunnelProvider.releaseTunnel(tunnel); |
| 130 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 140 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -179,6 +189,8 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -179,6 +189,8 @@ public class PcepReleaseTunnelProviderTest { |
| 179 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 189 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 180 | 190 | ||
| 181 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 191 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 192 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xB6024E22))).setCapability( | ||
| 193 | + new ClientCapability(true, false, false, true, true)); | ||
| 182 | 194 | ||
| 183 | tunnelProvider.releaseTunnel(tunnel); | 195 | tunnelProvider.releaseTunnel(tunnel); |
| 184 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 196 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| ... | @@ -233,6 +245,8 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -233,6 +245,8 @@ public class PcepReleaseTunnelProviderTest { |
| 233 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 245 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 234 | 246 | ||
| 235 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 247 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 248 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xB6024E20))).setCapability( | ||
| 249 | + new ClientCapability(true, true, true, true, true)); | ||
| 236 | 250 | ||
| 237 | tunnelProvider.releaseTunnel(tunnel); | 251 | tunnelProvider.releaseTunnel(tunnel); |
| 238 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 252 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -287,6 +301,8 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -287,6 +301,8 @@ public class PcepReleaseTunnelProviderTest { |
| 287 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 301 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 288 | 302 | ||
| 289 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 303 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 304 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xB6024E20))).setCapability( | ||
| 305 | + new ClientCapability(true, true, true, true, true)); | ||
| 290 | 306 | ||
| 291 | tunnelProvider.releaseTunnel(tunnel); | 307 | tunnelProvider.releaseTunnel(tunnel); |
| 292 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 308 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -298,5 +314,7 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -298,5 +314,7 @@ public class PcepReleaseTunnelProviderTest { |
| 298 | tunnelProvider.controller = null; | 314 | tunnelProvider.controller = null; |
| 299 | tunnelProvider.pcepClientController = null; | 315 | tunnelProvider.pcepClientController = null; |
| 300 | tunnelProvider.tunnelProviderRegistry = null; | 316 | tunnelProvider.tunnelProviderRegistry = null; |
| 317 | + tunnelProvider.deviceService = null; | ||
| 318 | + tunnelProvider.mastershipService = null; | ||
| 301 | } | 319 | } |
| 302 | } | 320 | } | ... | ... |
| ... | @@ -40,6 +40,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -40,6 +40,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 40 | import org.onosproject.incubator.net.tunnel.Tunnel; | 40 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 41 | import org.onosproject.incubator.net.tunnel.TunnelId; | 41 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 42 | import org.onosproject.incubator.net.tunnel.TunnelName; | 42 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 43 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 43 | import org.onosproject.net.Annotations; | 44 | import org.onosproject.net.Annotations; |
| 44 | import org.onosproject.net.ConnectPoint; | 45 | import org.onosproject.net.ConnectPoint; |
| 45 | import org.onosproject.net.DefaultAnnotations; | 46 | import org.onosproject.net.DefaultAnnotations; |
| ... | @@ -49,7 +50,10 @@ import org.onosproject.net.IpElementId; | ... | @@ -49,7 +50,10 @@ import org.onosproject.net.IpElementId; |
| 49 | import org.onosproject.net.Link; | 50 | import org.onosproject.net.Link; |
| 50 | import org.onosproject.net.Path; | 51 | import org.onosproject.net.Path; |
| 51 | import org.onosproject.net.PortNumber; | 52 | import org.onosproject.net.PortNumber; |
| 53 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
| 52 | import org.onosproject.net.provider.ProviderId; | 54 | import org.onosproject.net.provider.ProviderId; |
| 55 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 56 | +import org.onosproject.pcep.controller.PccId; | ||
| 53 | 57 | ||
| 54 | /** | 58 | /** |
| 55 | * Test for PCEP setup tunnel. | 59 | * Test for PCEP setup tunnel. |
| ... | @@ -62,12 +66,16 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -62,12 +66,16 @@ public class PcepSetupTunnelProviderTest { |
| 62 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); | 66 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); |
| 63 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); | 67 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); |
| 64 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); | 68 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); |
| 69 | + private final DeviceServiceAdapter deviceService = new DeviceServiceAdapter(); | ||
| 70 | + private final MastershipServiceAdapter mastershipService = new MastershipServiceAdapter(); | ||
| 65 | 71 | ||
| 66 | @Before | 72 | @Before |
| 67 | public void setUp() throws IOException { | 73 | public void setUp() throws IOException { |
| 68 | tunnelProvider.tunnelProviderRegistry = registry; | 74 | tunnelProvider.tunnelProviderRegistry = registry; |
| 69 | tunnelProvider.pcepClientController = controller; | 75 | tunnelProvider.pcepClientController = controller; |
| 70 | tunnelProvider.controller = ctl; | 76 | tunnelProvider.controller = ctl; |
| 77 | + tunnelProvider.deviceService = deviceService; | ||
| 78 | + tunnelProvider.mastershipService = mastershipService; | ||
| 71 | tunnelProvider.cfgService = new ComponentConfigAdapter(); | 79 | tunnelProvider.cfgService = new ComponentConfigAdapter(); |
| 72 | tunnelProvider.tunnelService = tunnelService; | 80 | tunnelProvider.tunnelService = tunnelService; |
| 73 | tunnelProvider.activate(); | 81 | tunnelProvider.activate(); |
| ... | @@ -111,6 +119,8 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -111,6 +119,8 @@ public class PcepSetupTunnelProviderTest { |
| 111 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 119 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 112 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 120 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 113 | path, annotations); | 121 | path, annotations); |
| 122 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xC010101))).setCapability( | ||
| 123 | + new ClientCapability(true, true, true, true, true)); | ||
| 114 | 124 | ||
| 115 | tunnelProvider.setupTunnel(tunnel, path); | 125 | tunnelProvider.setupTunnel(tunnel, path); |
| 116 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 126 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -154,6 +164,8 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -154,6 +164,8 @@ public class PcepSetupTunnelProviderTest { |
| 154 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 164 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 155 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 165 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 156 | path, annotations); | 166 | path, annotations); |
| 167 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xC010103))).setCapability( | ||
| 168 | + new ClientCapability(true, true, true, true, true)); | ||
| 157 | 169 | ||
| 158 | tunnelProvider.setupTunnel(tunnel, path); | 170 | tunnelProvider.setupTunnel(tunnel, path); |
| 159 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 171 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| ... | @@ -197,6 +209,8 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -197,6 +209,8 @@ public class PcepSetupTunnelProviderTest { |
| 197 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 209 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 198 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 210 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 199 | path, annotations); | 211 | path, annotations); |
| 212 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xC010101))).setCapability( | ||
| 213 | + new ClientCapability(true, true, true, true, true)); | ||
| 200 | 214 | ||
| 201 | tunnelProvider.setupTunnel(tunnel, path); | 215 | tunnelProvider.setupTunnel(tunnel, path); |
| 202 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 216 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -240,6 +254,8 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -240,6 +254,8 @@ public class PcepSetupTunnelProviderTest { |
| 240 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 254 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 241 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 255 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 242 | path, annotations); | 256 | path, annotations); |
| 257 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xC010101))).setCapability( | ||
| 258 | + new ClientCapability(true, true, true, true, true)); | ||
| 243 | 259 | ||
| 244 | tunnelProvider.setupTunnel(tunnel, path); | 260 | tunnelProvider.setupTunnel(tunnel, path); |
| 245 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 261 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -251,5 +267,7 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -251,5 +267,7 @@ public class PcepSetupTunnelProviderTest { |
| 251 | tunnelProvider.controller = null; | 267 | tunnelProvider.controller = null; |
| 252 | tunnelProvider.pcepClientController = null; | 268 | tunnelProvider.pcepClientController = null; |
| 253 | tunnelProvider.tunnelProviderRegistry = null; | 269 | tunnelProvider.tunnelProviderRegistry = null; |
| 270 | + tunnelProvider.deviceService = null; | ||
| 271 | + tunnelProvider.mastershipService = null; | ||
| 254 | } | 272 | } |
| 255 | } | 273 | } | ... | ... |
| ... | @@ -24,27 +24,35 @@ import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL | ... | @@ -24,27 +24,35 @@ import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL |
| 24 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | 24 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; |
| 25 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; | 25 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; |
| 26 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; | 26 | import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; |
| 27 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE; | ||
| 27 | import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | 28 | import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; |
| 28 | import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED; | 29 | import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED; |
| 29 | -import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC; | 30 | +import static org.onosproject.net.Device.Type.ROUTER; |
| 31 | +import static org.onosproject.net.MastershipRole.MASTER; | ||
| 30 | 32 | ||
| 31 | import java.io.IOException; | 33 | import java.io.IOException; |
| 32 | import java.util.Collection; | 34 | import java.util.Collection; |
| 33 | import java.util.Collections; | 35 | import java.util.Collections; |
| 34 | import java.util.HashMap; | 36 | import java.util.HashMap; |
| 35 | import java.util.HashSet; | 37 | import java.util.HashSet; |
| 38 | +import java.util.LinkedList; | ||
| 39 | +import java.util.List; | ||
| 40 | +import java.util.concurrent.TimeUnit; | ||
| 36 | 41 | ||
| 37 | import org.jboss.netty.buffer.ChannelBuffer; | 42 | import org.jboss.netty.buffer.ChannelBuffer; |
| 38 | import org.jboss.netty.buffer.ChannelBuffers; | 43 | import org.jboss.netty.buffer.ChannelBuffers; |
| 39 | import org.junit.After; | 44 | import org.junit.After; |
| 40 | import org.junit.Before; | 45 | import org.junit.Before; |
| 41 | import org.junit.Test; | 46 | import org.junit.Test; |
| 47 | +import org.onlab.packet.ChassisId; | ||
| 42 | import org.onlab.packet.IpAddress; | 48 | import org.onlab.packet.IpAddress; |
| 43 | import org.onosproject.cfg.ComponentConfigAdapter; | 49 | import org.onosproject.cfg.ComponentConfigAdapter; |
| 44 | import org.onosproject.core.ApplicationId; | 50 | import org.onosproject.core.ApplicationId; |
| 45 | import org.onosproject.incubator.net.tunnel.DefaultTunnel; | 51 | import org.onosproject.incubator.net.tunnel.DefaultTunnel; |
| 46 | import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | 52 | import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 47 | import org.onosproject.incubator.net.tunnel.Tunnel; | 53 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 54 | +import org.onosproject.incubator.net.tunnel.Tunnel.Type; | ||
| 55 | +import org.onosproject.incubator.net.tunnel.TunnelAdminService; | ||
| 48 | import org.onosproject.incubator.net.tunnel.TunnelDescription; | 56 | import org.onosproject.incubator.net.tunnel.TunnelDescription; |
| 49 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | 57 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; |
| 50 | import org.onosproject.incubator.net.tunnel.TunnelId; | 58 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| ... | @@ -52,16 +60,26 @@ import org.onosproject.incubator.net.tunnel.TunnelName; | ... | @@ -52,16 +60,26 @@ import org.onosproject.incubator.net.tunnel.TunnelName; |
| 52 | import org.onosproject.incubator.net.tunnel.TunnelProvider; | 60 | import org.onosproject.incubator.net.tunnel.TunnelProvider; |
| 53 | import org.onosproject.incubator.net.tunnel.TunnelProviderService; | 61 | import org.onosproject.incubator.net.tunnel.TunnelProviderService; |
| 54 | import org.onosproject.incubator.net.tunnel.Tunnel.State; | 62 | import org.onosproject.incubator.net.tunnel.Tunnel.State; |
| 63 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 64 | +import org.onosproject.net.AnnotationKeys; | ||
| 55 | import org.onosproject.net.DefaultAnnotations; | 65 | import org.onosproject.net.DefaultAnnotations; |
| 66 | +import org.onosproject.net.DefaultDevice; | ||
| 67 | +import org.onosproject.net.Device; | ||
| 68 | +import org.onosproject.net.DeviceId; | ||
| 56 | import org.onosproject.net.ElementId; | 69 | import org.onosproject.net.ElementId; |
| 70 | +import org.onosproject.net.MastershipRole; | ||
| 57 | import org.onosproject.net.Path; | 71 | import org.onosproject.net.Path; |
| 58 | import org.onosproject.net.SparseAnnotations; | 72 | import org.onosproject.net.SparseAnnotations; |
| 73 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
| 74 | +import org.onosproject.net.provider.ProviderId; | ||
| 59 | import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException; | 75 | import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException; |
| 60 | import org.onosproject.pcepio.exceptions.PcepParseException; | 76 | import org.onosproject.pcepio.exceptions.PcepParseException; |
| 61 | import org.onosproject.pcepio.protocol.PcepFactories; | 77 | import org.onosproject.pcepio.protocol.PcepFactories; |
| 62 | import org.onosproject.pcepio.protocol.PcepMessage; | 78 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 63 | import org.onosproject.pcepio.protocol.PcepMessageReader; | 79 | import org.onosproject.pcepio.protocol.PcepMessageReader; |
| 80 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
| 64 | import org.onosproject.pcep.controller.ClientCapability; | 81 | import org.onosproject.pcep.controller.ClientCapability; |
| 82 | +import org.onosproject.pcep.controller.LspKey; | ||
| 65 | import org.onosproject.pcep.controller.PccId; | 83 | import org.onosproject.pcep.controller.PccId; |
| 66 | 84 | ||
| 67 | import com.google.common.collect.ImmutableSet; | 85 | import com.google.common.collect.ImmutableSet; |
| ... | @@ -71,13 +89,73 @@ import com.google.common.collect.ImmutableSet; | ... | @@ -71,13 +89,73 @@ import com.google.common.collect.ImmutableSet; |
| 71 | */ | 89 | */ |
| 72 | public class PcepTunnelAddedTest { | 90 | public class PcepTunnelAddedTest { |
| 73 | 91 | ||
| 74 | - static final String PROVIDER_ID = "org.onosproject.provider.tunnel.pcep"; | 92 | + public static final String PROVIDER_ID = "org.onosproject.provider.tunnel.pcep"; |
| 93 | + public static final String UNKOWN = "UNKOWN"; | ||
| 75 | PcepTunnelProvider tunnelProvider = new PcepTunnelProvider(); | 94 | PcepTunnelProvider tunnelProvider = new PcepTunnelProvider(); |
| 76 | private final MockTunnelProviderRegistryAdapter registry = new MockTunnelProviderRegistryAdapter(); | 95 | private final MockTunnelProviderRegistryAdapter registry = new MockTunnelProviderRegistryAdapter(); |
| 77 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); | 96 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); |
| 78 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); | 97 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); |
| 79 | private final PcepTunnelApiMapper pcepTunnelAPIMapper = new PcepTunnelApiMapper(); | 98 | private final PcepTunnelApiMapper pcepTunnelAPIMapper = new PcepTunnelApiMapper(); |
| 80 | private final MockTunnelServiceAdapter tunnelService = new MockTunnelServiceAdapter(); | 99 | private final MockTunnelServiceAdapter tunnelService = new MockTunnelServiceAdapter(); |
| 100 | + public final MockDeviceService deviceService = new MockDeviceService(); | ||
| 101 | + private final MockMasterShipService masterShipService = new MockMasterShipService(); | ||
| 102 | + private final MockTunnelAdminService tunnelAdminService = new MockTunnelAdminService(); | ||
| 103 | + | ||
| 104 | + private class MockTunnelAdminService implements TunnelAdminService { | ||
| 105 | + | ||
| 106 | + @Override | ||
| 107 | + public void removeTunnel(TunnelId tunnelId) { | ||
| 108 | + // TODO Auto-generated method stub | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + @Override | ||
| 112 | + public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, ProviderId producerName) { | ||
| 113 | + // TODO Auto-generated method stub | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + @Override | ||
| 117 | + public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type, ProviderId producerName) { | ||
| 118 | + // TODO Auto-generated method stub | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + @Override | ||
| 122 | + public void updateTunnel(Tunnel tunnel, Path path) { | ||
| 123 | + if (tunnelService.tunnelIdAsKeyStore.containsKey(tunnel.tunnelId())) { | ||
| 124 | + tunnelService.tunnelIdAsKeyStore.replace(tunnel.tunnelId(), tunnel); | ||
| 125 | + } | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + private class MockMasterShipService extends MastershipServiceAdapter { | ||
| 130 | + boolean set; | ||
| 131 | + | ||
| 132 | + private void setMaster(boolean isMaster) { | ||
| 133 | + this.set = isMaster; | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + @Override | ||
| 137 | + public MastershipRole getLocalRole(DeviceId deviceId) { | ||
| 138 | + return set ? MastershipRole.MASTER : MastershipRole.STANDBY; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + @Override | ||
| 142 | + public boolean isLocalMaster(DeviceId deviceId) { | ||
| 143 | + return getLocalRole(deviceId) == MASTER; | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + private class MockDeviceService extends DeviceServiceAdapter { | ||
| 148 | + List<Device> devices = new LinkedList<>(); | ||
| 149 | + | ||
| 150 | + private void addDevice(Device dev) { | ||
| 151 | + devices.add(dev); | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + @Override | ||
| 155 | + public Iterable<Device> getAvailableDevices() { | ||
| 156 | + return devices; | ||
| 157 | + } | ||
| 158 | + } | ||
| 81 | 159 | ||
| 82 | private class MockTunnelProviderRegistryAdapter extends TunnelProviderRegistryAdapter { | 160 | private class MockTunnelProviderRegistryAdapter extends TunnelProviderRegistryAdapter { |
| 83 | public long tunnelIdCounter; | 161 | public long tunnelIdCounter; |
| ... | @@ -97,12 +175,34 @@ public class PcepTunnelAddedTest { | ... | @@ -97,12 +175,34 @@ public class PcepTunnelAddedTest { |
| 97 | 175 | ||
| 98 | @Override | 176 | @Override |
| 99 | public TunnelId tunnelAdded(TunnelDescription tunnel) { | 177 | public TunnelId tunnelAdded(TunnelDescription tunnel) { |
| 100 | - return TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); | 178 | + TunnelId id = TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); |
| 179 | + Tunnel storedTunnel = new DefaultTunnel(ProviderId.NONE, | ||
| 180 | + tunnel.src(), tunnel.dst(), | ||
| 181 | + tunnel.type(), | ||
| 182 | + tunnel.groupId(), | ||
| 183 | + id, | ||
| 184 | + tunnel.tunnelName(), | ||
| 185 | + tunnel.path(), | ||
| 186 | + tunnel.resource(), | ||
| 187 | + tunnel.annotations()); | ||
| 188 | + tunnelService.tunnelIdAsKeyStore.put(id, storedTunnel); | ||
| 189 | + return id; | ||
| 101 | } | 190 | } |
| 102 | 191 | ||
| 103 | @Override | 192 | @Override |
| 104 | public TunnelId tunnelAdded(TunnelDescription tunnel, State state) { | 193 | public TunnelId tunnelAdded(TunnelDescription tunnel, State state) { |
| 105 | - return TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); | 194 | + TunnelId id = TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); |
| 195 | + Tunnel storedTunnel = new DefaultTunnel(ProviderId.NONE, | ||
| 196 | + tunnel.src(), tunnel.dst(), | ||
| 197 | + tunnel.type(), | ||
| 198 | + tunnel.groupId(), | ||
| 199 | + id, | ||
| 200 | + tunnel.tunnelName(), | ||
| 201 | + tunnel.path(), | ||
| 202 | + tunnel.resource(), | ||
| 203 | + tunnel.annotations()); | ||
| 204 | + tunnelService.tunnelIdAsKeyStore.put(id, storedTunnel); | ||
| 205 | + return id; | ||
| 106 | } | 206 | } |
| 107 | 207 | ||
| 108 | @Override | 208 | @Override |
| ... | @@ -168,9 +268,12 @@ public class PcepTunnelAddedTest { | ... | @@ -168,9 +268,12 @@ public class PcepTunnelAddedTest { |
| 168 | tunnelProvider.tunnelProviderRegistry = registry; | 268 | tunnelProvider.tunnelProviderRegistry = registry; |
| 169 | tunnelProvider.pcepClientController = controller; | 269 | tunnelProvider.pcepClientController = controller; |
| 170 | tunnelProvider.controller = ctl; | 270 | tunnelProvider.controller = ctl; |
| 271 | + tunnelProvider.deviceService = deviceService; | ||
| 272 | + tunnelProvider.mastershipService = masterShipService; | ||
| 171 | tunnelProvider.pcepTunnelApiMapper = pcepTunnelAPIMapper; | 273 | tunnelProvider.pcepTunnelApiMapper = pcepTunnelAPIMapper; |
| 172 | tunnelProvider.cfgService = new ComponentConfigAdapter(); | 274 | tunnelProvider.cfgService = new ComponentConfigAdapter(); |
| 173 | tunnelProvider.tunnelService = tunnelService; | 275 | tunnelProvider.tunnelService = tunnelService; |
| 276 | + tunnelProvider.tunnelAdminService = tunnelAdminService; | ||
| 174 | tunnelProvider.service = registry.register(tunnelProvider); | 277 | tunnelProvider.service = registry.register(tunnelProvider); |
| 175 | tunnelProvider.activate(); | 278 | tunnelProvider.activate(); |
| 176 | } | 279 | } |
| ... | @@ -210,6 +313,19 @@ public class PcepTunnelAddedTest { | ... | @@ -210,6 +313,19 @@ public class PcepTunnelAddedTest { |
| 210 | 313 | ||
| 211 | PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | 314 | PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); |
| 212 | PcepMessage message = reader.readFrom(buffer); | 315 | PcepMessage message = reader.readFrom(buffer); |
| 316 | + | ||
| 317 | + DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); | ||
| 318 | + newBuilder.set(PcepTunnelProvider.LSRID, "1.1.1.1"); | ||
| 319 | + newBuilder.set(AnnotationKeys.TYPE, "L3"); | ||
| 320 | + Device device = new DefaultDevice(ProviderId.NONE, DeviceId.deviceId("1.1.1.1"), ROUTER, | ||
| 321 | + UNKOWN, UNKOWN, UNKOWN, | ||
| 322 | + UNKOWN, new ChassisId(), | ||
| 323 | + newBuilder.build()); | ||
| 324 | + | ||
| 325 | + deviceService.addDevice(device); | ||
| 326 | + controller.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))).setCapability( | ||
| 327 | + new ClientCapability(true, true, true, true, true)); | ||
| 328 | + masterShipService.setMaster(true); | ||
| 213 | controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message); | 329 | controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message); |
| 214 | 330 | ||
| 215 | assertThat(registry.tunnelIdCounter, is((long) 1)); | 331 | assertThat(registry.tunnelIdCounter, is((long) 1)); |
| ... | @@ -254,14 +370,20 @@ public class PcepTunnelAddedTest { | ... | @@ -254,14 +370,20 @@ public class PcepTunnelAddedTest { |
| 254 | .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | 370 | .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) |
| 255 | .set(PCC_TUNNEL_ID, String.valueOf(1)) | 371 | .set(PCC_TUNNEL_ID, String.valueOf(1)) |
| 256 | .set(PLSP_ID, String.valueOf(1)) | 372 | .set(PLSP_ID, String.valueOf(1)) |
| 257 | - .set(LOCAL_LSP_ID, String.valueOf(1)).build(); | 373 | + .set(LOCAL_LSP_ID, String.valueOf(1)) |
| 374 | + .set(DELEGATE, String.valueOf("true")) | ||
| 375 | + .build(); | ||
| 258 | 376 | ||
| 259 | Tunnel tunnel = new DefaultTunnel(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, INIT, null, null, | 377 | Tunnel tunnel = new DefaultTunnel(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, INIT, null, null, |
| 260 | TunnelName.tunnelName("T123"), null, annotations); | 378 | TunnelName.tunnelName("T123"), null, annotations); |
| 261 | tunnelService.setupTunnel(null, null, tunnel, null); | 379 | tunnelService.setupTunnel(null, null, tunnel, null); |
| 262 | 380 | ||
| 263 | PccId pccId = PccId.pccId(IpAddress.valueOf(0x4e1f0400)); | 381 | PccId pccId = PccId.pccId(IpAddress.valueOf(0x4e1f0400)); |
| 264 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 382 | + PcepClientAdapter pc = new PcepClientAdapter(); |
| 383 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 384 | + masterShipService.setMaster(true); | ||
| 385 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 386 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); | ||
| 265 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); | 387 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); |
| 266 | 388 | ||
| 267 | // Process update message. | 389 | // Process update message. |
| ... | @@ -281,7 +403,7 @@ public class PcepTunnelAddedTest { | ... | @@ -281,7 +403,7 @@ public class PcepTunnelAddedTest { |
| 281 | 0x00, 0x00, 0x00, 0x00, | 403 | 0x00, 0x00, 0x00, 0x00, |
| 282 | 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | 404 | 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV |
| 283 | 0x00, 0x00, 0x00, 0x02, | 405 | 0x00, 0x00, 0x00, 0x02, |
| 284 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, // LSP object | 406 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x1B, // LSP object |
| 285 | 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | 407 | 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV |
| 286 | 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | 408 | 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV |
| 287 | 0x01, 0x01, 0x01, 0x01, | 409 | 0x01, 0x01, 0x01, 0x01, |
| ... | @@ -308,167 +430,139 @@ public class PcepTunnelAddedTest { | ... | @@ -308,167 +430,139 @@ public class PcepTunnelAddedTest { |
| 308 | PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | 430 | PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); |
| 309 | PcepMessage message = reader.readFrom(buffer); | 431 | PcepMessage message = reader.readFrom(buffer); |
| 310 | 432 | ||
| 433 | + DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); | ||
| 434 | + newBuilder.set(PcepTunnelProvider.LSRID, "1.1.1.1"); | ||
| 435 | + newBuilder.set(AnnotationKeys.TYPE, "L3"); | ||
| 436 | + Device device = new DefaultDevice(ProviderId.NONE, DeviceId.deviceId("1.1.1.1"), ROUTER, | ||
| 437 | + UNKOWN, UNKOWN, UNKOWN, | ||
| 438 | + UNKOWN, new ChassisId(), | ||
| 439 | + newBuilder.build()); | ||
| 440 | + | ||
| 441 | + deviceService.addDevice(device); | ||
| 442 | + | ||
| 311 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | 443 | PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); |
| 312 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); | 444 | controller.getClient(pccId).setLspDbSyncStatus(SYNCED); |
| 313 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 445 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); |
| 446 | + | ||
| 447 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 448 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 449 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 450 | + masterShipService.setMaster(true); | ||
| 314 | controller.processClientMessage(pccId, message); | 451 | controller.processClientMessage(pccId, message); |
| 315 | 452 | ||
| 316 | assertThat(registry.tunnelIdCounter, is((long) 1)); | 453 | assertThat(registry.tunnelIdCounter, is((long) 1)); |
| 317 | } | 454 | } |
| 318 | 455 | ||
| 319 | /** | 456 | /** |
| 320 | - * Tests LSPDB sync where PCC reports less LSPs than known by PCE and PCE deletes at the end of DB sync. | 457 | + * Tests PCRpt msg with D flag set and delegated to non-master. |
| 458 | + * | ||
| 459 | + * @throws InterruptedException while waiting for delay | ||
| 321 | */ | 460 | */ |
| 322 | @Test | 461 | @Test |
| 323 | - public void testCaseLspDbSync1() throws PcepParseException, PcepOutOfBoundMessageException { | 462 | + public void tunnelProviderAddedTest4() throws PcepParseException, PcepOutOfBoundMessageException, |
| 324 | - /* Step 1 create 2 LSPs */ | 463 | + InterruptedException { |
| 325 | - byte[] reportMsg1 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | 464 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, |
| 326 | - 0x21, 0x10, 0x00, 0x14, //SRP object | 465 | + 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object |
| 327 | - 0x00, 0x00, 0x00, 0x00, | 466 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV |
| 328 | - 0x00, 0x00, 0x00, 0x00, | 467 | + 0x00, 0x00, 0x00, 0x02, |
| 329 | - 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | 468 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x02, //LSP object |
| 330 | - 0x00, 0x00, 0x00, 0x00, | 469 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv |
| 331 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, // LSP object | 470 | + 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV |
| 332 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | 471 | + 0x01, 0x01, 0x01, 0x01, |
| 333 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | 472 | + 0x00, 0x01, 0x00, 0x01, |
| 334 | - 0x01, 0x01, 0x01, 0x01, | 473 | + 0x01, 0x01, 0x01, 0x01, |
| 335 | - 0x00, 0x01, 0x00, 0x01, | 474 | + 0x05, 0x05, 0x05, 0x05, |
| 336 | - 0x01, 0x01, 0x01, 0x01, | ||
| 337 | - 0x05, 0x05, 0x05, 0x05, | ||
| 338 | 475 | ||
| 339 | - 0x07, 0x10, 0x00, 0x14, //ERO object | 476 | + 0x07, 0x10, 0x00, 0x14, //ERO object |
| 340 | - 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | 477 | + 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects |
| 341 | - 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | 478 | + 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, |
| 342 | 479 | ||
| 343 | - 0x08, 0x10, 0x00, 0x34, //RRO object | 480 | + 0x08, 0x10, 0x00, 0x34, //RRO object |
| 344 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | 481 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects |
| 345 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | 482 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, |
| 346 | - 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | 483 | + 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, |
| 347 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | 484 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, |
| 348 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | 485 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, |
| 349 | - 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | 486 | + 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 |
| 350 | - }; | 487 | + }; |
| 351 | 488 | ||
| 352 | - ChannelBuffer buffer1 = ChannelBuffers.dynamicBuffer(); | 489 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); |
| 353 | - buffer1.writeBytes(reportMsg1); | 490 | + buffer.writeBytes(reportMsg); |
| 354 | 491 | ||
| 355 | - PcepMessageReader<PcepMessage> reader1 = PcepFactories.getGenericReader(); | 492 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); |
| 356 | - PcepMessage message1 = reader1.readFrom(buffer1); | 493 | + PcepMessage message = reader.readFrom(buffer); |
| 357 | 494 | ||
| 358 | - PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | 495 | + //PCC 1.1.1.1, D=0, ONOS as master |
| 359 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | 496 | + masterShipService.setMaster(true); |
| 360 | - controller.processClientMessage(pccId, message1); | 497 | + DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); |
| 498 | + newBuilder.set(PcepTunnelProvider.LSRID, "1.1.1.1"); | ||
| 499 | + newBuilder.set(AnnotationKeys.TYPE, "L3"); | ||
| 500 | + Device device = new DefaultDevice(ProviderId.NONE, DeviceId.deviceId("1.1.1.1"), ROUTER, | ||
| 501 | + UNKOWN, UNKOWN, UNKOWN, | ||
| 502 | + UNKOWN, new ChassisId(), | ||
| 503 | + newBuilder.build()); | ||
| 504 | + | ||
| 505 | + deviceService.addDevice(device); | ||
| 506 | + controller.getClient(PccId.pccId(IpAddress.valueOf("1.1.1.1"))).setCapability( | ||
| 507 | + new ClientCapability(true, true, true, true, true)); | ||
| 508 | + controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message); | ||
| 509 | + assertThat(tunnelService.tunnelIdAsKeyStore.values().iterator().next().annotations().value(DELEGATE), | ||
| 510 | + is("false")); | ||
| 361 | 511 | ||
| 362 | - /* create 2nd LSP */ | 512 | + //PCC 1.1.1.1, D=1, non-master |
| 363 | - byte[] reportMsg2 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | 513 | + masterShipService.setMaster(false); |
| 364 | - 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 365 | - 0x00, 0x00, 0x00, 0x00, | ||
| 366 | - 0x00, 0x00, 0x00, 0x00, | ||
| 367 | - 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 368 | - 0x00, 0x00, 0x00, 0x00, | ||
| 369 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x20, 0x19, // LSP object | ||
| 370 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | ||
| 371 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 372 | - 0x01, 0x01, 0x01, 0x01, | ||
| 373 | - 0x00, 0x02, 0x00, 0x02, | ||
| 374 | - 0x01, 0x01, 0x01, 0x01, | ||
| 375 | - 0x05, 0x05, 0x05, 0x05, | ||
| 376 | 514 | ||
| 377 | - 0x07, 0x10, 0x00, 0x14, //ERO object | 515 | + reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, |
| 378 | - 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | 516 | + 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object |
| 379 | - 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | 517 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV |
| 518 | + 0x00, 0x00, 0x00, 0x02, | ||
| 519 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03, //LSP object | ||
| 520 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv | ||
| 521 | + 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 522 | + 0x01, 0x01, 0x01, 0x01, | ||
| 523 | + 0x00, 0x01, 0x00, 0x01, | ||
| 524 | + 0x01, 0x01, 0x01, 0x01, | ||
| 525 | + 0x05, 0x05, 0x05, 0x05, | ||
| 380 | 526 | ||
| 381 | - 0x08, 0x10, 0x00, 0x34, //RRO object | 527 | + 0x07, 0x10, 0x00, 0x14, //ERO object |
| 382 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | 528 | + 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects |
| 383 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | 529 | + 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, |
| 384 | - 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | 530 | + |
| 385 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | 531 | + 0x08, 0x10, 0x00, 0x34, //RRO object |
| 386 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | 532 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects |
| 387 | - 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | 533 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, |
| 388 | - }; | 534 | + 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, |
| 535 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 536 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 537 | + 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 538 | + }; | ||
| 539 | + | ||
| 540 | + buffer = ChannelBuffers.dynamicBuffer(); | ||
| 541 | + buffer.writeBytes(reportMsg); | ||
| 389 | 542 | ||
| 390 | - ChannelBuffer buffer2 = ChannelBuffers.dynamicBuffer(); | 543 | + reader = PcepFactories.getGenericReader(); |
| 391 | - buffer2.writeBytes(reportMsg2); | 544 | + message = reader.readFrom(buffer); |
| 392 | - | 545 | + |
| 393 | - PcepMessageReader<PcepMessage> reader2 = PcepFactories.getGenericReader(); | 546 | + controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message); |
| 394 | - PcepMessage message2 = reader2.readFrom(buffer2); | 547 | + TimeUnit.MILLISECONDS.sleep(4000); |
| 395 | - | 548 | + assertThat(registry.tunnelIdCounter, is((long) 1)); |
| 396 | - controller.processClientMessage(pccId, message2); | 549 | + assertThat(tunnelService.tunnelIdAsKeyStore.values().iterator().next().annotations().value(DELEGATE), |
| 397 | - | 550 | + is("true")); |
| 398 | - /* Assert number of LSPs in DB to be 2. */ | ||
| 399 | - assertThat(registry.tunnelIdCounter, is((long) 2)); | ||
| 400 | - | ||
| 401 | - /* Step 2 send sync begin message and LSP 1. */ | ||
| 402 | - byte[] reportMsg3 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | ||
| 403 | - 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 404 | - 0x00, 0x00, 0x00, 0x00, | ||
| 405 | - 0x00, 0x00, 0x00, 0x00, | ||
| 406 | - 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 407 | - 0x00, 0x00, 0x00, 0x00, | ||
| 408 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x1B, // LSP object | ||
| 409 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | ||
| 410 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 411 | - 0x01, 0x01, 0x01, 0x01, | ||
| 412 | - 0x00, 0x01, 0x00, 0x01, | ||
| 413 | - 0x01, 0x01, 0x01, 0x01, | ||
| 414 | - 0x05, 0x05, 0x05, 0x05, | ||
| 415 | - | ||
| 416 | - 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 417 | - 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | ||
| 418 | - 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | ||
| 419 | - | ||
| 420 | - 0x08, 0x10, 0x00, 0x34, //RRO object | ||
| 421 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | ||
| 422 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 423 | - 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | ||
| 424 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 425 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 426 | - 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 427 | - }; | ||
| 428 | - | ||
| 429 | - ChannelBuffer buffer3 = ChannelBuffers.dynamicBuffer(); | ||
| 430 | - buffer3.writeBytes(reportMsg3); | ||
| 431 | - PcepMessageReader<PcepMessage> reader3 = PcepFactories.getGenericReader(); | ||
| 432 | - PcepMessage message3 = reader3.readFrom(buffer3); | ||
| 433 | - controller.processClientMessage(pccId, message3); | ||
| 434 | - | ||
| 435 | - assertThat(controller.getClient(pccId).lspDbSyncStatus(), is(IN_SYNC)); | ||
| 436 | - | ||
| 437 | - /* Step 3 send end of sync marker */ | ||
| 438 | - byte[] reportMsg4 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x24, | ||
| 439 | - 0x20, 0x10, 0x00, 0x1C, // LSP object | ||
| 440 | - 0x00, 0x00, 0x10, 0x19, | ||
| 441 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 442 | - 0x00, 0x00, 0x00, 0x00, | ||
| 443 | - 0x00, 0x00, 0x00, 0x00, | ||
| 444 | - 0x00, 0x00, 0x00, 0x00, | ||
| 445 | - 0x00, 0x00, 0x00, 0x00, | ||
| 446 | - 0x07, 0x10, 0x00, 0x04, //ERO object | ||
| 447 | - }; | ||
| 448 | - | ||
| 449 | - ChannelBuffer buffer4 = ChannelBuffers.dynamicBuffer(); | ||
| 450 | - buffer4.writeBytes(reportMsg4); | ||
| 451 | - PcepMessageReader<PcepMessage> reader4 = PcepFactories.getGenericReader(); | ||
| 452 | - PcepMessage message4 = reader4.readFrom(buffer4); | ||
| 453 | - controller.processClientMessage(pccId, message4); | ||
| 454 | - | ||
| 455 | - assertThat(controller.getClient(pccId).lspDbSyncStatus(), is(SYNCED)); | ||
| 456 | } | 551 | } |
| 457 | 552 | ||
| 458 | /** | 553 | /** |
| 459 | - * Tests PCC PCRpt PCE initiated LSP which PCE doesn't know and hence should send PCInit delete msg. | 554 | + * Tests adding PCC Init LSP after LSP DB sync is over. |
| 460 | */ | 555 | */ |
| 461 | @Test | 556 | @Test |
| 462 | - public void testCaseLspDbSync2() throws PcepParseException, PcepOutOfBoundMessageException { | 557 | + public void tunnelProviderAddedTest5() throws PcepParseException, PcepOutOfBoundMessageException { |
| 463 | - /* Step 1 create 2 LSPs */ | 558 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, |
| 464 | - byte[] reportMsg1 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | ||
| 465 | 0x21, 0x10, 0x00, 0x14, //SRP object | 559 | 0x21, 0x10, 0x00, 0x14, //SRP object |
| 466 | 0x00, 0x00, 0x00, 0x00, | 560 | 0x00, 0x00, 0x00, 0x00, |
| 467 | 0x00, 0x00, 0x00, 0x00, | 561 | 0x00, 0x00, 0x00, 0x00, |
| 468 | 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | 562 | 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV |
| 469 | - 0x00, 0x00, 0x00, 0x00, | 563 | + 0x00, 0x00, 0x00, 0x02, |
| 470 | 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, // LSP object | 564 | 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, // LSP object |
| 471 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | 565 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV |
| 472 | 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | 566 | 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV |
| 473 | 0x01, 0x01, 0x01, 0x01, | 567 | 0x01, 0x01, 0x01, 0x01, |
| 474 | 0x00, 0x01, 0x00, 0x01, | 568 | 0x00, 0x01, 0x00, 0x01, |
| ... | @@ -488,110 +582,33 @@ public class PcepTunnelAddedTest { | ... | @@ -488,110 +582,33 @@ public class PcepTunnelAddedTest { |
| 488 | 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | 582 | 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 |
| 489 | }; | 583 | }; |
| 490 | 584 | ||
| 491 | - ChannelBuffer buffer1 = ChannelBuffers.dynamicBuffer(); | 585 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); |
| 492 | - buffer1.writeBytes(reportMsg1); | 586 | + buffer.writeBytes(reportMsg); |
| 493 | - | ||
| 494 | - PcepMessageReader<PcepMessage> reader1 = PcepFactories.getGenericReader(); | ||
| 495 | - PcepMessage message1 = reader1.readFrom(buffer1); | ||
| 496 | - | ||
| 497 | - PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | ||
| 498 | - controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | ||
| 499 | - controller.processClientMessage(pccId, message1); | ||
| 500 | 587 | ||
| 501 | - /* create 2nd LSP */ | 588 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); |
| 502 | - byte[] reportMsg2 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | 589 | + PcepMessage message = reader.readFrom(buffer); |
| 503 | - 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 504 | - 0x00, 0x00, 0x00, 0x00, | ||
| 505 | - 0x00, 0x00, 0x00, 0x00, | ||
| 506 | - 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 507 | - 0x00, 0x00, 0x00, 0x00, | ||
| 508 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x20, 0x19, // LSP object | ||
| 509 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | ||
| 510 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 511 | - 0x01, 0x01, 0x01, 0x01, | ||
| 512 | - 0x00, 0x02, 0x00, 0x02, | ||
| 513 | - 0x01, 0x01, 0x01, 0x01, | ||
| 514 | - 0x05, 0x05, 0x05, 0x05, | ||
| 515 | 590 | ||
| 516 | - 0x07, 0x10, 0x00, 0x14, //ERO object | 591 | + DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder(); |
| 517 | - 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | 592 | + newBuilder.set(PcepTunnelProvider.LSRID, "1.1.1.1"); |
| 518 | - 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | 593 | + newBuilder.set(AnnotationKeys.TYPE, "L3"); |
| 594 | + Device device = new DefaultDevice(ProviderId.NONE, DeviceId.deviceId("1.1.1.1"), ROUTER, | ||
| 595 | + UNKOWN, UNKOWN, UNKOWN, | ||
| 596 | + UNKOWN, new ChassisId(), | ||
| 597 | + newBuilder.build()); | ||
| 519 | 598 | ||
| 520 | - 0x08, 0x10, 0x00, 0x34, //RRO object | 599 | + deviceService.addDevice(device); |
| 521 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | ||
| 522 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 523 | - 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | ||
| 524 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 525 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 526 | - 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 527 | - }; | ||
| 528 | 600 | ||
| 529 | - ChannelBuffer buffer2 = ChannelBuffers.dynamicBuffer(); | 601 | + PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); |
| 530 | - buffer2.writeBytes(reportMsg2); | 602 | + controller.getClient(pccId).setLspDbSyncStatus(SYNCED); |
| 531 | - | 603 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); |
| 532 | - PcepMessageReader<PcepMessage> reader2 = PcepFactories.getGenericReader(); | ||
| 533 | - PcepMessage message2 = reader2.readFrom(buffer2); | ||
| 534 | - | ||
| 535 | - controller.processClientMessage(pccId, message2); | ||
| 536 | - | ||
| 537 | - /* Assert number of LSPs in DB to be 2. */ | ||
| 538 | - assertThat(registry.tunnelIdCounter, is((long) 2)); | ||
| 539 | - | ||
| 540 | - /* Step 2 send sync begin message and LSP 1. */ | ||
| 541 | - byte[] reportMsg3 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | ||
| 542 | - 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 543 | - 0x00, 0x00, 0x00, 0x00, | ||
| 544 | - 0x00, 0x00, 0x00, 0x00, | ||
| 545 | - 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 546 | - 0x00, 0x00, 0x00, 0x00, | ||
| 547 | - 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, (byte) 0x9B, // LSP object | ||
| 548 | - 0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | ||
| 549 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 550 | - 0x01, 0x01, 0x01, 0x01, | ||
| 551 | - 0x00, 0x01, 0x00, 0x03, | ||
| 552 | - 0x01, 0x01, 0x01, 0x01, | ||
| 553 | - 0x05, 0x05, 0x05, 0x05, | ||
| 554 | - | ||
| 555 | - 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 556 | - 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | ||
| 557 | - 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | ||
| 558 | - | ||
| 559 | - 0x08, 0x10, 0x00, 0x34, //RRO object | ||
| 560 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | ||
| 561 | - 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 562 | - 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | ||
| 563 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 564 | - 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 565 | - 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 566 | - }; | ||
| 567 | - | ||
| 568 | - ChannelBuffer buffer3 = ChannelBuffers.dynamicBuffer(); | ||
| 569 | - buffer3.writeBytes(reportMsg3); | ||
| 570 | - PcepMessageReader<PcepMessage> reader3 = PcepFactories.getGenericReader(); | ||
| 571 | - PcepMessage message3 = reader3.readFrom(buffer3); | ||
| 572 | - controller.processClientMessage(pccId, message3); | ||
| 573 | - | ||
| 574 | - assertThat(controller.getClient(pccId).lspDbSyncStatus(), is(IN_SYNC)); | ||
| 575 | - | ||
| 576 | - /* Step 3 send end of sync marker */ | ||
| 577 | - byte[] reportMsg4 = new byte[] {0x20, 0x0a, 0x00, (byte) 0x24, | ||
| 578 | - 0x20, 0x10, 0x00, 0x1C, // LSP object | ||
| 579 | - 0x00, 0x00, 0x10, 0x19, | ||
| 580 | - 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 581 | - 0x00, 0x00, 0x00, 0x00, | ||
| 582 | - 0x00, 0x00, 0x00, 0x00, | ||
| 583 | - 0x00, 0x00, 0x00, 0x00, | ||
| 584 | - 0x00, 0x00, 0x00, 0x00, | ||
| 585 | - 0x07, 0x10, 0x00, 0x04, //ERO object | ||
| 586 | - }; | ||
| 587 | 604 | ||
| 588 | - ChannelBuffer buffer4 = ChannelBuffers.dynamicBuffer(); | 605 | + PcepClientAdapter pc = new PcepClientAdapter(); |
| 589 | - buffer4.writeBytes(reportMsg4); | 606 | + pc.init(pccId, PcepVersion.PCEP_1); |
| 590 | - PcepMessageReader<PcepMessage> reader4 = PcepFactories.getGenericReader(); | 607 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); |
| 591 | - PcepMessage message4 = reader4.readFrom(buffer4); | 608 | + masterShipService.setMaster(true); |
| 592 | - controller.processClientMessage(pccId, message4); | 609 | + controller.processClientMessage(pccId, message); |
| 593 | 610 | ||
| 594 | - assertThat(controller.getClient(pccId).lspDbSyncStatus(), is(SYNCED)); | 611 | + assertThat(registry.tunnelIdCounter, is((long) 0)); |
| 595 | } | 612 | } |
| 596 | 613 | ||
| 597 | @After | 614 | @After |
| ... | @@ -604,6 +621,9 @@ public class PcepTunnelAddedTest { | ... | @@ -604,6 +621,9 @@ public class PcepTunnelAddedTest { |
| 604 | tunnelProvider.pcepTunnelApiMapper = null; | 621 | tunnelProvider.pcepTunnelApiMapper = null; |
| 605 | tunnelProvider.cfgService = null; | 622 | tunnelProvider.cfgService = null; |
| 606 | tunnelProvider.tunnelService = null; | 623 | tunnelProvider.tunnelService = null; |
| 624 | + tunnelProvider.tunnelAdminService = null; | ||
| 625 | + tunnelProvider.deviceService = null; | ||
| 626 | + tunnelProvider.mastershipService = null; | ||
| 607 | tunnelProvider.service = null; | 627 | tunnelProvider.service = null; |
| 608 | } | 628 | } |
| 609 | } | 629 | } | ... | ... |
| ... | @@ -35,6 +35,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -35,6 +35,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 35 | import org.onosproject.incubator.net.tunnel.Tunnel; | 35 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 36 | import org.onosproject.incubator.net.tunnel.TunnelId; | 36 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 37 | import org.onosproject.incubator.net.tunnel.TunnelName; | 37 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 38 | +import org.onosproject.mastership.MastershipServiceAdapter; | ||
| 38 | import org.onosproject.net.Annotations; | 39 | import org.onosproject.net.Annotations; |
| 39 | import org.onosproject.net.ConnectPoint; | 40 | import org.onosproject.net.ConnectPoint; |
| 40 | import org.onosproject.net.DefaultAnnotations; | 41 | import org.onosproject.net.DefaultAnnotations; |
| ... | @@ -44,7 +45,10 @@ import org.onosproject.net.IpElementId; | ... | @@ -44,7 +45,10 @@ import org.onosproject.net.IpElementId; |
| 44 | import org.onosproject.net.Link; | 45 | import org.onosproject.net.Link; |
| 45 | import org.onosproject.net.Path; | 46 | import org.onosproject.net.Path; |
| 46 | import org.onosproject.net.PortNumber; | 47 | import org.onosproject.net.PortNumber; |
| 48 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
| 47 | import org.onosproject.net.provider.ProviderId; | 49 | import org.onosproject.net.provider.ProviderId; |
| 50 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 51 | +import org.onosproject.pcep.controller.PccId; | ||
| 48 | import org.onosproject.cfg.ComponentConfigAdapter; | 52 | import org.onosproject.cfg.ComponentConfigAdapter; |
| 49 | 53 | ||
| 50 | public class PcepTunnelProviderTest { | 54 | public class PcepTunnelProviderTest { |
| ... | @@ -55,6 +59,8 @@ public class PcepTunnelProviderTest { | ... | @@ -55,6 +59,8 @@ public class PcepTunnelProviderTest { |
| 55 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); | 59 | private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); |
| 56 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); | 60 | private final PcepControllerAdapter ctl = new PcepControllerAdapter(); |
| 57 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); | 61 | private final TunnelServiceAdapter tunnelService = new TunnelServiceAdapter(); |
| 62 | + private final DeviceServiceAdapter deviceService = new DeviceServiceAdapter(); | ||
| 63 | + private final MastershipServiceAdapter mastershipService = new MastershipServiceAdapter(); | ||
| 58 | 64 | ||
| 59 | @Test | 65 | @Test |
| 60 | public void testCasePcepSetupTunnel() { | 66 | public void testCasePcepSetupTunnel() { |
| ... | @@ -62,6 +68,8 @@ public class PcepTunnelProviderTest { | ... | @@ -62,6 +68,8 @@ public class PcepTunnelProviderTest { |
| 62 | tunnelProvider.tunnelProviderRegistry = registry; | 68 | tunnelProvider.tunnelProviderRegistry = registry; |
| 63 | tunnelProvider.pcepClientController = controller; | 69 | tunnelProvider.pcepClientController = controller; |
| 64 | tunnelProvider.controller = ctl; | 70 | tunnelProvider.controller = ctl; |
| 71 | + tunnelProvider.deviceService = deviceService; | ||
| 72 | + tunnelProvider.mastershipService = mastershipService; | ||
| 65 | tunnelProvider.cfgService = new ComponentConfigAdapter(); | 73 | tunnelProvider.cfgService = new ComponentConfigAdapter(); |
| 66 | tunnelProvider.tunnelService = tunnelService; | 74 | tunnelProvider.tunnelService = tunnelService; |
| 67 | tunnelProvider.activate(); | 75 | tunnelProvider.activate(); |
| ... | @@ -99,6 +107,8 @@ public class PcepTunnelProviderTest { | ... | @@ -99,6 +107,8 @@ public class PcepTunnelProviderTest { |
| 99 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 107 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 100 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 108 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 101 | path, annotations); | 109 | path, annotations); |
| 110 | + controller.getClient(PccId.pccId(IpAddress.valueOf(0xC010101))).setCapability( | ||
| 111 | + new ClientCapability(true, true, true, true, true)); | ||
| 102 | 112 | ||
| 103 | tunnelProvider.setupTunnel(tunnel, path); | 113 | tunnelProvider.setupTunnel(tunnel, path); |
| 104 | 114 | ||
| ... | @@ -109,6 +119,8 @@ public class PcepTunnelProviderTest { | ... | @@ -109,6 +119,8 @@ public class PcepTunnelProviderTest { |
| 109 | public void tearDown() throws IOException { | 119 | public void tearDown() throws IOException { |
| 110 | tunnelProvider.deactivate(); | 120 | tunnelProvider.deactivate(); |
| 111 | tunnelProvider.controller = null; | 121 | tunnelProvider.controller = null; |
| 122 | + tunnelProvider.deviceService = null; | ||
| 123 | + tunnelProvider.mastershipService = null; | ||
| 112 | tunnelProvider.pcepClientController = null; | 124 | tunnelProvider.pcepClientController = null; |
| 113 | tunnelProvider.tunnelProviderRegistry = null; | 125 | tunnelProvider.tunnelProviderRegistry = null; |
| 114 | } | 126 | } | ... | ... |
| ... | @@ -47,6 +47,10 @@ import org.onosproject.net.Link; | ... | @@ -47,6 +47,10 @@ import org.onosproject.net.Link; |
| 47 | import org.onosproject.net.Path; | 47 | import org.onosproject.net.Path; |
| 48 | import org.onosproject.net.PortNumber; | 48 | import org.onosproject.net.PortNumber; |
| 49 | import org.onosproject.net.provider.ProviderId; | 49 | import org.onosproject.net.provider.ProviderId; |
| 50 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 51 | +import org.onosproject.pcep.controller.LspKey; | ||
| 52 | +import org.onosproject.pcep.controller.PccId; | ||
| 53 | +import org.onosproject.pcepio.protocol.PcepVersion; | ||
| 50 | import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; | 54 | import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 51 | 55 | ||
| 52 | import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | 56 | import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; |
| ... | @@ -99,7 +103,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -99,7 +103,7 @@ public class PcepUpdateTunnelProviderTest { |
| 99 | 103 | ||
| 100 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | 104 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); |
| 101 | 105 | ||
| 102 | - ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | 106 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10024)); |
| 103 | 107 | ||
| 104 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | 108 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) |
| 105 | .type(Link.Type.DIRECT).build(); | 109 | .type(Link.Type.DIRECT).build(); |
| ... | @@ -108,6 +112,8 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -108,6 +112,8 @@ public class PcepUpdateTunnelProviderTest { |
| 108 | path = new DefaultPath(pid, links, 20, EMPTY); | 112 | path = new DefaultPath(pid, links, 20, EMPTY); |
| 109 | 113 | ||
| 110 | Annotations annotations = DefaultAnnotations.builder() | 114 | Annotations annotations = DefaultAnnotations.builder() |
| 115 | + .set(PcepAnnotationKeys.PLSP_ID, "1") | ||
| 116 | + .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") | ||
| 111 | .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | 117 | .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) |
| 112 | .build(); | 118 | .build(); |
| 113 | 119 | ||
| ... | @@ -124,6 +130,12 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -124,6 +130,12 @@ public class PcepUpdateTunnelProviderTest { |
| 124 | 130 | ||
| 125 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 131 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 126 | 132 | ||
| 133 | + PccId pccId = PccId.pccId(IpAddress.valueOf(0xD010101)); | ||
| 134 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 135 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 136 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 137 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); | ||
| 138 | + | ||
| 127 | tunnelProvider.updateTunnel(tunnel, path); | 139 | tunnelProvider.updateTunnel(tunnel, path); |
| 128 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 140 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| 129 | } | 141 | } |
| ... | @@ -137,7 +149,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -137,7 +149,7 @@ public class PcepUpdateTunnelProviderTest { |
| 137 | Path path; | 149 | Path path; |
| 138 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 150 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 139 | List<Link> links = new ArrayList<>(); | 151 | List<Link> links = new ArrayList<>(); |
| 140 | - IpAddress srcIp = IpAddress.valueOf(0xC010103); | 152 | + IpAddress srcIp = IpAddress.valueOf(0xD010101); |
| 141 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 153 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 142 | 154 | ||
| 143 | IpAddress dstIp = IpAddress.valueOf(0xD010102); | 155 | IpAddress dstIp = IpAddress.valueOf(0xD010102); |
| ... | @@ -151,7 +163,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -151,7 +163,7 @@ public class PcepUpdateTunnelProviderTest { |
| 151 | 163 | ||
| 152 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | 164 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); |
| 153 | 165 | ||
| 154 | - ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | 166 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10024)); |
| 155 | 167 | ||
| 156 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | 168 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) |
| 157 | .type(Link.Type.DIRECT).build(); | 169 | .type(Link.Type.DIRECT).build(); |
| ... | @@ -161,6 +173,8 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -161,6 +173,8 @@ public class PcepUpdateTunnelProviderTest { |
| 161 | 173 | ||
| 162 | Annotations annotations = DefaultAnnotations.builder() | 174 | Annotations annotations = DefaultAnnotations.builder() |
| 163 | .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | 175 | .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) |
| 176 | + .set(PcepAnnotationKeys.PLSP_ID, "1") | ||
| 177 | + .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") | ||
| 164 | .build(); | 178 | .build(); |
| 165 | 179 | ||
| 166 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 180 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| ... | @@ -176,6 +190,12 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -176,6 +190,12 @@ public class PcepUpdateTunnelProviderTest { |
| 176 | 190 | ||
| 177 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 191 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 178 | 192 | ||
| 193 | + PccId pccId = PccId.pccId(IpAddress.valueOf(0xD010101)); | ||
| 194 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 195 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 196 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 197 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); | ||
| 198 | + | ||
| 179 | tunnelProvider.updateTunnel(tunnel, path); | 199 | tunnelProvider.updateTunnel(tunnel, path); |
| 180 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 200 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| 181 | } | 201 | } |
| ... | @@ -203,7 +223,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -203,7 +223,7 @@ public class PcepUpdateTunnelProviderTest { |
| 203 | 223 | ||
| 204 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | 224 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); |
| 205 | 225 | ||
| 206 | - ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | 226 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10024)); |
| 207 | 227 | ||
| 208 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | 228 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) |
| 209 | .type(Link.Type.DIRECT).build(); | 229 | .type(Link.Type.DIRECT).build(); |
| ... | @@ -213,6 +233,8 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -213,6 +233,8 @@ public class PcepUpdateTunnelProviderTest { |
| 213 | 233 | ||
| 214 | Annotations annotations = DefaultAnnotations.builder() | 234 | Annotations annotations = DefaultAnnotations.builder() |
| 215 | .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) | 235 | .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) |
| 236 | + .set(PcepAnnotationKeys.PLSP_ID, "1") | ||
| 237 | + .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") | ||
| 216 | .build(); | 238 | .build(); |
| 217 | 239 | ||
| 218 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 240 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| ... | @@ -228,6 +250,12 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -228,6 +250,12 @@ public class PcepUpdateTunnelProviderTest { |
| 228 | 250 | ||
| 229 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 251 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 230 | 252 | ||
| 253 | + PccId pccId = PccId.pccId(IpAddress.valueOf(0xD010101)); | ||
| 254 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 255 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 256 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 257 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); | ||
| 258 | + | ||
| 231 | tunnelProvider.updateTunnel(tunnel, path); | 259 | tunnelProvider.updateTunnel(tunnel, path); |
| 232 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 260 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| 233 | } | 261 | } |
| ... | @@ -255,7 +283,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -255,7 +283,7 @@ public class PcepUpdateTunnelProviderTest { |
| 255 | 283 | ||
| 256 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | 284 | ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); |
| 257 | 285 | ||
| 258 | - ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | 286 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10024)); |
| 259 | 287 | ||
| 260 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | 288 | Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) |
| 261 | .type(Link.Type.DIRECT).build(); | 289 | .type(Link.Type.DIRECT).build(); |
| ... | @@ -265,6 +293,8 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -265,6 +293,8 @@ public class PcepUpdateTunnelProviderTest { |
| 265 | 293 | ||
| 266 | Annotations annotations = DefaultAnnotations.builder() | 294 | Annotations annotations = DefaultAnnotations.builder() |
| 267 | .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | 295 | .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) |
| 296 | + .set(PcepAnnotationKeys.PLSP_ID, "1") | ||
| 297 | + .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") | ||
| 268 | .build(); | 298 | .build(); |
| 269 | 299 | ||
| 270 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 300 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| ... | @@ -280,6 +310,12 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -280,6 +310,12 @@ public class PcepUpdateTunnelProviderTest { |
| 280 | 310 | ||
| 281 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | 311 | tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); |
| 282 | 312 | ||
| 313 | + PccId pccId = PccId.pccId(IpAddress.valueOf(0xD010101)); | ||
| 314 | + PcepClientAdapter pc = new PcepClientAdapter(); | ||
| 315 | + pc.init(pccId, PcepVersion.PCEP_1); | ||
| 316 | + controller.getClient(pccId).setLspAndDelegationInfo(new LspKey(1, (short) 1), true); | ||
| 317 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true, true, true)); | ||
| 318 | + | ||
| 283 | tunnelProvider.updateTunnel(tunnel, path); | 319 | tunnelProvider.updateTunnel(tunnel, path); |
| 284 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 320 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| 285 | } | 321 | } | ... | ... |
-
Please register or login to post a comment