Committed by
Gerrit Code Review
[ONOS-4167] Identify the impacted tunnels based on network events, reilency with UT
Change-Id: I2bae0b789a22b8a6854f4e12b692d03cd6f7415d
Showing
2 changed files
with
72 additions
and
0 deletions
... | @@ -52,6 +52,7 @@ import org.onosproject.incubator.net.tunnel.TunnelId; | ... | @@ -52,6 +52,7 @@ import org.onosproject.incubator.net.tunnel.TunnelId; |
52 | import org.onosproject.incubator.net.tunnel.TunnelListener; | 52 | import org.onosproject.incubator.net.tunnel.TunnelListener; |
53 | import org.onosproject.incubator.net.tunnel.TunnelName; | 53 | import org.onosproject.incubator.net.tunnel.TunnelName; |
54 | import org.onosproject.incubator.net.tunnel.TunnelService; | 54 | import org.onosproject.incubator.net.tunnel.TunnelService; |
55 | +import org.onosproject.mastership.MastershipService; | ||
55 | import org.onosproject.net.DefaultAnnotations; | 56 | import org.onosproject.net.DefaultAnnotations; |
56 | import org.onosproject.net.DefaultAnnotations.Builder; | 57 | import org.onosproject.net.DefaultAnnotations.Builder; |
57 | import org.onosproject.net.Device; | 58 | import org.onosproject.net.Device; |
... | @@ -63,6 +64,7 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; | ... | @@ -63,6 +64,7 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; |
63 | import org.onosproject.net.flowobjective.Objective; | 64 | import org.onosproject.net.flowobjective.Objective; |
64 | import org.onosproject.net.intent.Constraint; | 65 | import org.onosproject.net.intent.Constraint; |
65 | import org.onosproject.net.intent.constraint.BandwidthConstraint; | 66 | import org.onosproject.net.intent.constraint.BandwidthConstraint; |
67 | +import org.onosproject.net.link.LinkEvent; | ||
66 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint; | 68 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint; |
67 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType; | 69 | import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType; |
68 | import org.onosproject.pce.pceservice.constraint.CostConstraint; | 70 | import org.onosproject.pce.pceservice.constraint.CostConstraint; |
... | @@ -76,6 +78,9 @@ import org.onosproject.net.resource.Resources; | ... | @@ -76,6 +78,9 @@ import org.onosproject.net.resource.Resources; |
76 | import org.onosproject.net.topology.LinkWeight; | 78 | import org.onosproject.net.topology.LinkWeight; |
77 | import org.onosproject.net.topology.PathService; | 79 | import org.onosproject.net.topology.PathService; |
78 | import org.onosproject.net.topology.TopologyEdge; | 80 | import org.onosproject.net.topology.TopologyEdge; |
81 | +import org.onosproject.net.topology.TopologyEvent; | ||
82 | +import org.onosproject.net.topology.TopologyListener; | ||
83 | +import org.onosproject.net.topology.TopologyService; | ||
79 | import org.onosproject.pce.pceservice.api.PceService; | 84 | import org.onosproject.pce.pceservice.api.PceService; |
80 | import org.onosproject.pce.pcestore.PcePathInfo; | 85 | import org.onosproject.pce.pcestore.PcePathInfo; |
81 | import org.onosproject.pce.pcestore.PceccTunnelInfo; | 86 | import org.onosproject.pce.pcestore.PceccTunnelInfo; |
... | @@ -171,12 +176,19 @@ public class PceManager implements PceService { | ... | @@ -171,12 +176,19 @@ public class PceManager implements PceService { |
171 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 176 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
172 | protected FlowObjectiveService flowObjectiveService; | 177 | protected FlowObjectiveService flowObjectiveService; |
173 | 178 | ||
179 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
180 | + protected MastershipService mastershipService; | ||
181 | + | ||
182 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
183 | + protected TopologyService topologyService; | ||
184 | + | ||
174 | private TunnelListener listener = new InnerTunnelListener(); | 185 | private TunnelListener listener = new InnerTunnelListener(); |
175 | private BasicPceccHandler crHandler; | 186 | private BasicPceccHandler crHandler; |
176 | private PceccSrTeBeHandler srTeHandler; | 187 | private PceccSrTeBeHandler srTeHandler; |
177 | private ApplicationId appId; | 188 | private ApplicationId appId; |
178 | 189 | ||
179 | private final PcepPacketProcessor processor = new PcepPacketProcessor(); | 190 | private final PcepPacketProcessor processor = new PcepPacketProcessor(); |
191 | + private final TopologyListener topologyListener = new InternalTopologyListener(); | ||
180 | 192 | ||
181 | /** | 193 | /** |
182 | * Creates new instance of PceManager. | 194 | * Creates new instance of PceManager. |
... | @@ -204,6 +216,7 @@ public class PceManager implements PceService { | ... | @@ -204,6 +216,7 @@ public class PceManager implements PceService { |
204 | .asDistributedSet(); | 216 | .asDistributedSet(); |
205 | 217 | ||
206 | packetService.addProcessor(processor, PacketProcessor.director(4)); | 218 | packetService.addProcessor(processor, PacketProcessor.director(4)); |
219 | + topologyService.addListener(topologyListener); | ||
207 | log.info("Started"); | 220 | log.info("Started"); |
208 | } | 221 | } |
209 | 222 | ||
... | @@ -211,6 +224,7 @@ public class PceManager implements PceService { | ... | @@ -211,6 +224,7 @@ public class PceManager implements PceService { |
211 | protected void deactivate() { | 224 | protected void deactivate() { |
212 | tunnelService.removeListener(listener); | 225 | tunnelService.removeListener(listener); |
213 | packetService.removeProcessor(processor); | 226 | packetService.removeProcessor(processor); |
227 | + topologyService.removeListener(topologyListener); | ||
214 | log.info("Stopped"); | 228 | log.info("Stopped"); |
215 | } | 229 | } |
216 | 230 | ||
... | @@ -395,6 +409,7 @@ public class PceManager implements PceService { | ... | @@ -395,6 +409,7 @@ public class PceManager implements PceService { |
395 | List<Link> links = tunnel.path().links(); | 409 | List<Link> links = tunnel.path().links(); |
396 | String lspSigType = tunnel.annotations().value(LSP_SIG_TYPE); | 410 | String lspSigType = tunnel.annotations().value(LSP_SIG_TYPE); |
397 | double bwConstraintValue = 0; | 411 | double bwConstraintValue = 0; |
412 | + String costType = null; | ||
398 | SharedBandwidthConstraint shBwConstraint = null; | 413 | SharedBandwidthConstraint shBwConstraint = null; |
399 | BandwidthConstraint bwConstraint = null; | 414 | BandwidthConstraint bwConstraint = null; |
400 | CostConstraint costConstraint = null; | 415 | CostConstraint costConstraint = null; |
... | @@ -409,6 +424,7 @@ public class PceManager implements PceService { | ... | @@ -409,6 +424,7 @@ public class PceManager implements PceService { |
409 | bwConstraintValue = bwConstraint.bandwidth().bps(); | 424 | bwConstraintValue = bwConstraint.bandwidth().bps(); |
410 | } else if (constraint instanceof CostConstraint) { | 425 | } else if (constraint instanceof CostConstraint) { |
411 | costConstraint = (CostConstraint) constraint; | 426 | costConstraint = (CostConstraint) constraint; |
427 | + costType = costConstraint.type().name(); | ||
412 | } | 428 | } |
413 | } | 429 | } |
414 | 430 | ||
... | @@ -454,6 +470,9 @@ public class PceManager implements PceService { | ... | @@ -454,6 +470,9 @@ public class PceManager implements PceService { |
454 | 470 | ||
455 | Builder annotationBuilder = DefaultAnnotations.builder(); | 471 | Builder annotationBuilder = DefaultAnnotations.builder(); |
456 | annotationBuilder.set(BANDWIDTH, String.valueOf(bwConstraintValue)); | 472 | annotationBuilder.set(BANDWIDTH, String.valueOf(bwConstraintValue)); |
473 | + if (costType != null) { | ||
474 | + annotationBuilder.set(COST_TYPE, costType); | ||
475 | + } | ||
457 | annotationBuilder.set(LSP_SIG_TYPE, lspSigType); | 476 | annotationBuilder.set(LSP_SIG_TYPE, lspSigType); |
458 | annotationBuilder.set(PCE_INIT, TRUE); | 477 | annotationBuilder.set(PCE_INIT, TRUE); |
459 | annotationBuilder.set(DELEGATE, TRUE); | 478 | annotationBuilder.set(DELEGATE, TRUE); |
... | @@ -594,6 +613,59 @@ public class PceManager implements PceService { | ... | @@ -594,6 +613,59 @@ public class PceManager implements PceService { |
594 | } | 613 | } |
595 | } | 614 | } |
596 | 615 | ||
616 | + //TODO: annotations used for temporarily later projection/network config will be used | ||
617 | + private class InternalTopologyListener implements TopologyListener { | ||
618 | + @Override | ||
619 | + public void event(TopologyEvent event) { | ||
620 | + event.reasons().forEach(e -> { | ||
621 | + //If event type is link removed, get the impacted tunnel | ||
622 | + if (e instanceof LinkEvent) { | ||
623 | + LinkEvent linkEvent = (LinkEvent) e; | ||
624 | + if (linkEvent.type() == LinkEvent.Type.LINK_REMOVED) { | ||
625 | + tunnelService.queryTunnel(MPLS).forEach(t -> { | ||
626 | + if (t.path().links().contains(((Link) e.subject()))) { | ||
627 | + // Check whether this ONOS instance is master for ingress device if yes, | ||
628 | + // recompute and send update | ||
629 | + checkForMasterAndUpdateTunnel(t.path().src().deviceId(), t); | ||
630 | + } | ||
631 | + }); | ||
632 | + } | ||
633 | + } | ||
634 | + }); | ||
635 | + } | ||
636 | + } | ||
637 | + | ||
638 | + private boolean checkForMasterAndUpdateTunnel(DeviceId src, Tunnel tunnel) { | ||
639 | + /** | ||
640 | + * Master of ingress node will recompute and also delegation flag must be set. | ||
641 | + */ | ||
642 | + if (mastershipService.isLocalMaster(src) | ||
643 | + && Boolean.valueOf(tunnel.annotations().value(DELEGATE)) != null) { | ||
644 | + LinkedList<Constraint> constraintList = new LinkedList<>(); | ||
645 | + | ||
646 | + if (tunnel.annotations().value(BANDWIDTH) != null) { | ||
647 | + //Requested bandwidth will be same as previous allocated bandwidth for the tunnel | ||
648 | + BandwidthConstraint localConst = new BandwidthConstraint(Bandwidth.bps(Double.parseDouble(tunnel | ||
649 | + .annotations().value(BANDWIDTH)))); | ||
650 | + constraintList.add(localConst); | ||
651 | + } | ||
652 | + if (tunnel.annotations().value(COST_TYPE) != null) { | ||
653 | + constraintList.add(CostConstraint.of(CostConstraint.Type.valueOf(tunnel.annotations().value( | ||
654 | + COST_TYPE)))); | ||
655 | + } | ||
656 | + if (!updatePath(tunnel.tunnelId(), constraintList)) { | ||
657 | + // If updation fails store in PCE store as failed path | ||
658 | + // then PCInitiate (Remove) | ||
659 | + pceStore.addFailedPathInfo(new PcePathInfo(tunnel.path().src().deviceId(), tunnel | ||
660 | + .path().dst().deviceId(), tunnel.tunnelName().value(), constraintList, | ||
661 | + LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)))); | ||
662 | + //Release that tunnel calling PCInitiate | ||
663 | + releasePath(tunnel.tunnelId()); | ||
664 | + } | ||
665 | + } | ||
666 | + | ||
667 | + return false; | ||
668 | + } | ||
597 | 669 | ||
598 | // Allocates the bandwidth locally for PCECC tunnels. | 670 | // Allocates the bandwidth locally for PCECC tunnels. |
599 | private TunnelConsumerId reserveBandwidth(Path computedPath, double bandwidthConstraint, | 671 | private TunnelConsumerId reserveBandwidth(Path computedPath, double bandwidthConstraint, | ... | ... |
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment