Committed by
Thomas Vachuska
Disjoint Path Utils Exposed
- to TopologyStores - to TopologyServices - to PathServices - to REST API Change-Id: Ib2b5840df0f8e94f327ec8f91827d3d850634562 Change-Id: I03e59210e9c79c4f92dcfa8c7983642572708429 Change-Id: Ia5c17d1ded374ef688990bd30e7f99184aaca95b Change-Id: Ibebae50bc722701e8212263587727ad8abd79805
Showing
13 changed files
with
495 additions
and
26 deletions
| ... | @@ -15,9 +15,12 @@ | ... | @@ -15,9 +15,12 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.topology; | 16 | package org.onosproject.net.topology; |
| 17 | 17 | ||
| 18 | +import org.onosproject.net.DisjointPath; | ||
| 18 | import org.onosproject.net.ElementId; | 19 | import org.onosproject.net.ElementId; |
| 20 | +import org.onosproject.net.Link; | ||
| 19 | import org.onosproject.net.Path; | 21 | import org.onosproject.net.Path; |
| 20 | 22 | ||
| 23 | +import java.util.Map; | ||
| 21 | import java.util.Set; | 24 | import java.util.Set; |
| 22 | 25 | ||
| 23 | /** | 26 | /** |
| ... | @@ -48,4 +51,51 @@ public interface PathService { | ... | @@ -48,4 +51,51 @@ public interface PathService { |
| 48 | */ | 51 | */ |
| 49 | Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight); | 52 | Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight); |
| 50 | 53 | ||
| 54 | + /** | ||
| 55 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 56 | + * between the specified source and destination devices. | ||
| 57 | + * | ||
| 58 | + * @param src source device | ||
| 59 | + * @param dst destination device | ||
| 60 | + * @return set of all shortest paths between the two devices | ||
| 61 | + */ | ||
| 62 | + Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst); | ||
| 63 | + | ||
| 64 | + /** | ||
| 65 | + * Returns the set of all disjoint shortest path pairs, computed using the supplied | ||
| 66 | + * edge-weight entity, between the specified source and destination devices. | ||
| 67 | + * | ||
| 68 | + * @param src source device | ||
| 69 | + * @param dst destination device | ||
| 70 | + * @param weight edge-weight entity | ||
| 71 | + * @return set of all shortest paths between the two devices | ||
| 72 | + */ | ||
| 73 | + Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, | ||
| 74 | + LinkWeight weight); | ||
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 78 | + * between the specified source and destination devices. | ||
| 79 | + * | ||
| 80 | + * @param src source device | ||
| 81 | + * @param dst destination device | ||
| 82 | + * @param riskProfile map of edges to risk profiles | ||
| 83 | + * @return set of all shortest paths between the two devices | ||
| 84 | + */ | ||
| 85 | + Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, | ||
| 86 | + Map<Link, Object> riskProfile); | ||
| 87 | + | ||
| 88 | + /** | ||
| 89 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 90 | + * between the specified source and destination devices. | ||
| 91 | + * | ||
| 92 | + * @param src source device | ||
| 93 | + * @param dst destination device | ||
| 94 | + * @param weight edge-weight entity | ||
| 95 | + * @param riskProfile map of edges to risk profiles | ||
| 96 | + * @return set of all shortest paths between the two devices | ||
| 97 | + */ | ||
| 98 | + Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, | ||
| 99 | + LinkWeight weight, Map<Link, Object> riskProfile); | ||
| 100 | + | ||
| 51 | } | 101 | } | ... | ... |
| ... | @@ -18,9 +18,11 @@ package org.onosproject.net.topology; | ... | @@ -18,9 +18,11 @@ package org.onosproject.net.topology; |
| 18 | import org.onosproject.event.ListenerService; | 18 | import org.onosproject.event.ListenerService; |
| 19 | import org.onosproject.net.ConnectPoint; | 19 | import org.onosproject.net.ConnectPoint; |
| 20 | import org.onosproject.net.DeviceId; | 20 | import org.onosproject.net.DeviceId; |
| 21 | +import org.onosproject.net.DisjointPath; | ||
| 21 | import org.onosproject.net.Link; | 22 | import org.onosproject.net.Link; |
| 22 | import org.onosproject.net.Path; | 23 | import org.onosproject.net.Path; |
| 23 | 24 | ||
| 25 | +import java.util.Map; | ||
| 24 | import java.util.Set; | 26 | import java.util.Set; |
| 25 | 27 | ||
| 26 | /** | 28 | /** |
| ... | @@ -112,6 +114,56 @@ public interface TopologyService | ... | @@ -112,6 +114,56 @@ public interface TopologyService |
| 112 | LinkWeight weight); | 114 | LinkWeight weight); |
| 113 | 115 | ||
| 114 | /** | 116 | /** |
| 117 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 118 | + * between the specified source and destination devices. | ||
| 119 | + * | ||
| 120 | + * @param topology topology descriptor | ||
| 121 | + * @param src source device | ||
| 122 | + * @param dst destination device | ||
| 123 | + * @return set of all shortest paths between the two devices | ||
| 124 | + */ | ||
| 125 | + Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst); | ||
| 126 | + | ||
| 127 | + /** | ||
| 128 | + * Returns the set of all disjoint shortest path pairs, computed using the supplied | ||
| 129 | + * edge-weight entity, between the specified source and destination devices. | ||
| 130 | + * | ||
| 131 | + * @param topology topology descriptor | ||
| 132 | + * @param src source device | ||
| 133 | + * @param dst destination device | ||
| 134 | + * @param weight edge-weight entity | ||
| 135 | + * @return set of all shortest paths between the two devices | ||
| 136 | + */ | ||
| 137 | + Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 138 | + LinkWeight weight); | ||
| 139 | + | ||
| 140 | + /** | ||
| 141 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 142 | + * between the specified source and destination devices. | ||
| 143 | + * | ||
| 144 | + * @param topology topology descriptor | ||
| 145 | + * @param src source device | ||
| 146 | + * @param dst destination device | ||
| 147 | + * @param riskProfile map of edges to risk profiles | ||
| 148 | + * @return set of all shortest paths between the two devices | ||
| 149 | + */ | ||
| 150 | + Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 151 | + Map<Link, Object> riskProfile); | ||
| 152 | + | ||
| 153 | + /** | ||
| 154 | + * Returns the set of all disjoint shortest path pairs, precomputed in terms of hop-count, | ||
| 155 | + * between the specified source and destination devices. | ||
| 156 | + * | ||
| 157 | + * @param topology topology descriptor | ||
| 158 | + * @param src source device | ||
| 159 | + * @param dst destination device | ||
| 160 | + * @param weight edge-weight entity | ||
| 161 | + * @param riskProfile map of edges to risk profiles | ||
| 162 | + * @return set of all shortest paths between the two devices | ||
| 163 | + */ | ||
| 164 | + Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 165 | + LinkWeight weight, Map<Link, Object> riskProfile); | ||
| 166 | + /** | ||
| 115 | * Indicates whether the specified connection point is part of the network | 167 | * Indicates whether the specified connection point is part of the network |
| 116 | * infrastructure or part of network edge. | 168 | * infrastructure or part of network edge. |
| 117 | * | 169 | * | ... | ... |
| ... | @@ -20,11 +20,13 @@ import org.onosproject.net.ConnectPoint; | ... | @@ -20,11 +20,13 @@ import org.onosproject.net.ConnectPoint; |
| 20 | import org.onosproject.net.DeviceId; | 20 | import org.onosproject.net.DeviceId; |
| 21 | import org.onosproject.net.Link; | 21 | import org.onosproject.net.Link; |
| 22 | import org.onosproject.net.Path; | 22 | import org.onosproject.net.Path; |
| 23 | +import org.onosproject.net.DisjointPath; | ||
| 23 | import org.onosproject.net.provider.ProviderId; | 24 | import org.onosproject.net.provider.ProviderId; |
| 24 | import org.onosproject.store.Store; | 25 | import org.onosproject.store.Store; |
| 25 | 26 | ||
| 26 | import java.util.List; | 27 | import java.util.List; |
| 27 | import java.util.Set; | 28 | import java.util.Set; |
| 29 | +import java.util.Map; | ||
| 28 | 30 | ||
| 29 | /** | 31 | /** |
| 30 | * Manages inventory of topology snapshots; not intended for direct use. | 32 | * Manages inventory of topology snapshots; not intended for direct use. |
| ... | @@ -112,6 +114,59 @@ public interface TopologyStore extends Store<TopologyEvent, TopologyStoreDelegat | ... | @@ -112,6 +114,59 @@ public interface TopologyStore extends Store<TopologyEvent, TopologyStoreDelegat |
| 112 | LinkWeight weight); | 114 | LinkWeight weight); |
| 113 | 115 | ||
| 114 | /** | 116 | /** |
| 117 | + * Computes and returns the set of disjoint shortest path pairs | ||
| 118 | + * between src and dst. | ||
| 119 | + * | ||
| 120 | + * @param topology topology descriptor | ||
| 121 | + * @param src source device | ||
| 122 | + * @param dst destination device | ||
| 123 | + * @param weight link weight function | ||
| 124 | + * @return set of shortest paths | ||
| 125 | + */ | ||
| 126 | + Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 127 | + LinkWeight weight); | ||
| 128 | + | ||
| 129 | + /** | ||
| 130 | + * Computes and returns the set of disjoint shortest path pairs | ||
| 131 | + * between src and dst. | ||
| 132 | + * | ||
| 133 | + * @param topology topology descriptor | ||
| 134 | + * @param src source device | ||
| 135 | + * @param dst destination device | ||
| 136 | + * @return set of shortest paths | ||
| 137 | + */ | ||
| 138 | + Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst); | ||
| 139 | + | ||
| 140 | + /** | ||
| 141 | + * Computes and returns the set of SRLG disjoint shortest path pairs between source | ||
| 142 | + * and dst, given a mapping of edges to SRLG risk groups. | ||
| 143 | + * | ||
| 144 | + * @param topology topology descriptor | ||
| 145 | + * @param src source device | ||
| 146 | + * @param dst destination device | ||
| 147 | + * @param weight link weight function | ||
| 148 | + * @param riskProfile map of edges to objects. Edges that map to the same object will | ||
| 149 | + * be treated as if they were in the same risk group. | ||
| 150 | + * @return set of shortest paths | ||
| 151 | + */ | ||
| 152 | + Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 153 | + LinkWeight weight, Map<Link, Object> riskProfile); | ||
| 154 | + | ||
| 155 | + /** | ||
| 156 | + * Returns the set of pre-computed SRLG shortest paths between src and dest. | ||
| 157 | + * | ||
| 158 | + * @param topology topology descriptor | ||
| 159 | + * @param src source device | ||
| 160 | + * @param dst destination device | ||
| 161 | + * @param riskProfile map of edges to objects. Edges that map to the same object will | ||
| 162 | + * be treated as if they were in the same risk group. | ||
| 163 | + * @return set of shortest paths | ||
| 164 | + */ | ||
| 165 | + Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 166 | + Map<Link, Object> riskProfile); | ||
| 167 | + | ||
| 168 | + | ||
| 169 | + /** | ||
| 115 | * Indicates whether the given connect point is part of the network fabric. | 170 | * Indicates whether the given connect point is part of the network fabric. |
| 116 | * | 171 | * |
| 117 | * @param topology topology descriptor | 172 | * @param topology topology descriptor | ... | ... |
| ... | @@ -22,6 +22,7 @@ import org.onlab.util.Bandwidth; | ... | @@ -22,6 +22,7 @@ import org.onlab.util.Bandwidth; |
| 22 | import org.onosproject.core.DefaultGroupId; | 22 | import org.onosproject.core.DefaultGroupId; |
| 23 | import org.onosproject.core.GroupId; | 23 | import org.onosproject.core.GroupId; |
| 24 | import org.onosproject.net.DeviceId; | 24 | import org.onosproject.net.DeviceId; |
| 25 | +import org.onosproject.net.DisjointPath; | ||
| 25 | import org.onosproject.net.ElementId; | 26 | import org.onosproject.net.ElementId; |
| 26 | import org.onosproject.net.Link; | 27 | import org.onosproject.net.Link; |
| 27 | import org.onosproject.net.NetTestTools; | 28 | import org.onosproject.net.NetTestTools; |
| ... | @@ -64,6 +65,7 @@ import java.util.Collections; | ... | @@ -64,6 +65,7 @@ import java.util.Collections; |
| 64 | import java.util.HashSet; | 65 | import java.util.HashSet; |
| 65 | import java.util.LinkedList; | 66 | import java.util.LinkedList; |
| 66 | import java.util.List; | 67 | import java.util.List; |
| 68 | +import java.util.Map; | ||
| 67 | import java.util.Objects; | 69 | import java.util.Objects; |
| 68 | import java.util.Set; | 70 | import java.util.Set; |
| 69 | import java.util.concurrent.atomic.AtomicLong; | 71 | import java.util.concurrent.atomic.AtomicLong; |
| ... | @@ -185,6 +187,28 @@ public class IntentTestsMocks { | ... | @@ -185,6 +187,28 @@ public class IntentTestsMocks { |
| 185 | } | 187 | } |
| 186 | return paths; | 188 | return paths; |
| 187 | } | 189 | } |
| 190 | + | ||
| 191 | + @Override | ||
| 192 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst) { | ||
| 193 | + return null; | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + @Override | ||
| 197 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeight weight) { | ||
| 198 | + return null; | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + @Override | ||
| 202 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, | ||
| 203 | + Map<Link, Object> riskProfile) { | ||
| 204 | + return null; | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + @Override | ||
| 208 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, LinkWeight weight, | ||
| 209 | + Map<Link, Object> riskProfile) { | ||
| 210 | + return null; | ||
| 211 | + } | ||
| 188 | } | 212 | } |
| 189 | 213 | ||
| 190 | public static class MockLinkResourceAllocations implements LinkResourceAllocations { | 214 | public static class MockLinkResourceAllocations implements LinkResourceAllocations { |
| ... | @@ -424,7 +448,7 @@ public class IntentTestsMocks { | ... | @@ -424,7 +448,7 @@ public class IntentTestsMocks { |
| 424 | } | 448 | } |
| 425 | final MockFlowRule other = (MockFlowRule) obj; | 449 | final MockFlowRule other = (MockFlowRule) obj; |
| 426 | return Objects.equals(this.timestamp, other.timestamp) && | 450 | return Objects.equals(this.timestamp, other.timestamp) && |
| 427 | - this.id == other.id; | 451 | + this.id == other.id; |
| 428 | } | 452 | } |
| 429 | 453 | ||
| 430 | @Override | 454 | @Override |
| ... | @@ -450,7 +474,7 @@ public class IntentTestsMocks { | ... | @@ -450,7 +474,7 @@ public class IntentTestsMocks { |
| 450 | 474 | ||
| 451 | public MockIntent(Long number) { | 475 | public MockIntent(Long number) { |
| 452 | super(NetTestTools.APP_ID, null, Collections.emptyList(), | 476 | super(NetTestTools.APP_ID, null, Collections.emptyList(), |
| 453 | - Intent.DEFAULT_INTENT_PRIORITY); | 477 | + Intent.DEFAULT_INTENT_PRIORITY); |
| 454 | this.number = number; | 478 | this.number = number; |
| 455 | } | 479 | } |
| 456 | 480 | ... | ... |
| ... | @@ -17,9 +17,11 @@ package org.onosproject.net.topology; | ... | @@ -17,9 +17,11 @@ package org.onosproject.net.topology; |
| 17 | 17 | ||
| 18 | import org.onosproject.net.ConnectPoint; | 18 | import org.onosproject.net.ConnectPoint; |
| 19 | import org.onosproject.net.DeviceId; | 19 | import org.onosproject.net.DeviceId; |
| 20 | +import org.onosproject.net.DisjointPath; | ||
| 20 | import org.onosproject.net.Link; | 21 | import org.onosproject.net.Link; |
| 21 | import org.onosproject.net.Path; | 22 | import org.onosproject.net.Path; |
| 22 | 23 | ||
| 24 | +import java.util.Map; | ||
| 23 | import java.util.Set; | 25 | import java.util.Set; |
| 24 | 26 | ||
| 25 | /** | 27 | /** |
| ... | @@ -88,5 +90,26 @@ public class TopologyServiceAdapter implements TopologyService { | ... | @@ -88,5 +90,26 @@ public class TopologyServiceAdapter implements TopologyService { |
| 88 | @Override | 90 | @Override |
| 89 | public void removeListener(TopologyListener listener) { | 91 | public void removeListener(TopologyListener listener) { |
| 90 | } | 92 | } |
| 93 | + @Override | ||
| 94 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
| 95 | + return null; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + @Override | ||
| 99 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { | ||
| 100 | + return null; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + @Override | ||
| 104 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 105 | + Map<Link, Object> riskProfile) { | ||
| 106 | + return null; | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + @Override | ||
| 110 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight, | ||
| 111 | + Map<Link, Object> riskProfile) { | ||
| 112 | + return null; | ||
| 113 | + } | ||
| 91 | 114 | ||
| 92 | } | 115 | } | ... | ... |
| ... | @@ -322,8 +322,9 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -322,8 +322,9 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 322 | } | 322 | } |
| 323 | return builder.build(); | 323 | return builder.build(); |
| 324 | } | 324 | } |
| 325 | + | ||
| 325 | /** | 326 | /** |
| 326 | - /** | 327 | + * /** |
| 327 | * Returns the set of pre-computed shortest disjoint path pairs between source and | 328 | * Returns the set of pre-computed shortest disjoint path pairs between source and |
| 328 | * destination devices. | 329 | * destination devices. |
| 329 | * | 330 | * |
| ... | @@ -331,7 +332,7 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -331,7 +332,7 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 331 | * @param dst destination device | 332 | * @param dst destination device |
| 332 | * @return set of shortest disjoint path pairs | 333 | * @return set of shortest disjoint path pairs |
| 333 | */ | 334 | */ |
| 334 | - Set<DisjointPath> getDisjointPaths(DeviceId src, DeviceId dst) { | 335 | + public Set<DisjointPath> getDisjointPaths(DeviceId src, DeviceId dst) { |
| 335 | return getDisjointPaths(src, dst, null); | 336 | return getDisjointPaths(src, dst, null); |
| 336 | } | 337 | } |
| 337 | 338 | ||
| ... | @@ -344,7 +345,7 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -344,7 +345,7 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 344 | * @param weight link weight function | 345 | * @param weight link weight function |
| 345 | * @return set of disjoint shortest path pairs | 346 | * @return set of disjoint shortest path pairs |
| 346 | */ | 347 | */ |
| 347 | - Set<DisjointPath> getDisjointPaths(DeviceId src, DeviceId dst, LinkWeight weight) { | 348 | + public Set<DisjointPath> getDisjointPaths(DeviceId src, DeviceId dst, LinkWeight weight) { |
| 348 | final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); | 349 | final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); |
| 349 | final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); | 350 | final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); |
| 350 | Set<TopologyVertex> vertices = graph.getVertexes(); | 351 | Set<TopologyVertex> vertices = graph.getVertexes(); |
| ... | @@ -366,12 +367,12 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -366,12 +367,12 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 366 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and | 367 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and |
| 367 | * destination devices. | 368 | * destination devices. |
| 368 | * | 369 | * |
| 369 | - * @param src source device | 370 | + * @param src source device |
| 370 | - * @param dst destination device | 371 | + * @param dst destination device |
| 371 | - * @param riskProfile map representing risk groups for each edge | 372 | + * @param riskProfile map representing risk groups for each edge |
| 372 | - * @return set of shortest disjoint paths | 373 | + * @return set of shortest disjoint paths |
| 373 | */ | 374 | */ |
| 374 | - Set<DisjointPath> getSRLGDisjointPathsD(DeviceId src, DeviceId dst, Map<TopologyEdge, Object> riskProfile) { | 375 | + public Set<DisjointPath> getSRLGDisjointPathsD(DeviceId src, DeviceId dst, Map<TopologyEdge, Object> riskProfile) { |
| 375 | return getSRLGDisjointPathsD(src, dst, null, riskProfile); | 376 | return getSRLGDisjointPathsD(src, dst, null, riskProfile); |
| 376 | } | 377 | } |
| 377 | 378 | ||
| ... | @@ -379,13 +380,13 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -379,13 +380,13 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 379 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and | 380 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and |
| 380 | * destination devices. | 381 | * destination devices. |
| 381 | * | 382 | * |
| 382 | - * @param src source device | 383 | + * @param src source device |
| 383 | - * @param dst destination device | 384 | + * @param dst destination device |
| 384 | - * @param weight edge weight object | 385 | + * @param weight edge weight object |
| 385 | - * @param riskProfile map representing risk groups for each edge | 386 | + * @param riskProfile map representing risk groups for each edge |
| 386 | * @return set of shortest disjoint paths | 387 | * @return set of shortest disjoint paths |
| 387 | */ | 388 | */ |
| 388 | - Set<DisjointPath> getSRLGDisjointPathsD(DeviceId src, DeviceId dst, LinkWeight weight, Map<TopologyEdge, | 389 | + public Set<DisjointPath> getSRLGDisjointPathsD(DeviceId src, DeviceId dst, LinkWeight weight, Map<TopologyEdge, |
| 389 | Object> riskProfile) { | 390 | Object> riskProfile) { |
| 390 | final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); | 391 | final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); |
| 391 | final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); | 392 | final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); |
| ... | @@ -409,14 +410,14 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -409,14 +410,14 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 409 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and | 410 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and |
| 410 | * destination devices. | 411 | * destination devices. |
| 411 | * | 412 | * |
| 412 | - * @param src source device | 413 | + * @param src source device |
| 413 | - * @param dst destination device | 414 | + * @param dst destination device |
| 414 | - * @param weight edge weight object | 415 | + * @param weight edge weight object |
| 415 | - * @param riskProfile map representing risk groups for each link | 416 | + * @param riskProfile map representing risk groups for each link |
| 416 | * @return set of shortest disjoint paths | 417 | * @return set of shortest disjoint paths |
| 417 | */ | 418 | */ |
| 418 | - Set<DisjointPath> getSRLGDisjointPaths(DeviceId src, DeviceId dst, LinkWeight weight, | 419 | + public Set<DisjointPath> getSRLGDisjointPaths(DeviceId src, DeviceId dst, LinkWeight weight, |
| 419 | - Map<Link, Object> riskProfile) { | 420 | + Map<Link, Object> riskProfile) { |
| 420 | Map<TopologyEdge, Object> riskProfile2 = new HashMap<>(); | 421 | Map<TopologyEdge, Object> riskProfile2 = new HashMap<>(); |
| 421 | for (Link l : riskProfile.keySet()) { | 422 | for (Link l : riskProfile.keySet()) { |
| 422 | riskProfile2.put(new TopologyEdge() { | 423 | riskProfile2.put(new TopologyEdge() { |
| ... | @@ -450,12 +451,12 @@ public class DefaultTopology extends AbstractModel implements Topology { | ... | @@ -450,12 +451,12 @@ public class DefaultTopology extends AbstractModel implements Topology { |
| 450 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and | 451 | * Computes on-demand the set of shortest disjoint risk groups path pairs between source and |
| 451 | * destination devices. | 452 | * destination devices. |
| 452 | * | 453 | * |
| 453 | - * @param src source device | 454 | + * @param src source device |
| 454 | - * @param dst destination device | 455 | + * @param dst destination device |
| 455 | - * @param riskProfile map representing risk groups for each link | 456 | + * @param riskProfile map representing risk groups for each link |
| 456 | * @return set of shortest disjoint paths | 457 | * @return set of shortest disjoint paths |
| 457 | */ | 458 | */ |
| 458 | - Set<DisjointPath> getSRLGDisjointPaths(DeviceId src, DeviceId dst, Map<Link, Object> riskProfile) { | 459 | + public Set<DisjointPath> getSRLGDisjointPaths(DeviceId src, DeviceId dst, Map<Link, Object> riskProfile) { |
| 459 | return getSRLGDisjointPaths(src, dst, null, riskProfile); | 460 | return getSRLGDisjointPaths(src, dst, null, riskProfile); |
| 460 | } | 461 | } |
| 461 | 462 | ... | ... |
| ... | @@ -23,6 +23,7 @@ import org.onosproject.common.DefaultTopology; | ... | @@ -23,6 +23,7 @@ import org.onosproject.common.DefaultTopology; |
| 23 | import org.onosproject.event.Event; | 23 | import org.onosproject.event.Event; |
| 24 | import org.onosproject.net.ConnectPoint; | 24 | import org.onosproject.net.ConnectPoint; |
| 25 | import org.onosproject.net.DeviceId; | 25 | import org.onosproject.net.DeviceId; |
| 26 | +import org.onosproject.net.DisjointPath; | ||
| 26 | import org.onosproject.net.Link; | 27 | import org.onosproject.net.Link; |
| 27 | import org.onosproject.net.Path; | 28 | import org.onosproject.net.Path; |
| 28 | import org.onosproject.net.provider.ProviderId; | 29 | import org.onosproject.net.provider.ProviderId; |
| ... | @@ -39,6 +40,7 @@ import org.onosproject.store.AbstractStore; | ... | @@ -39,6 +40,7 @@ import org.onosproject.store.AbstractStore; |
| 39 | import org.slf4j.Logger; | 40 | import org.slf4j.Logger; |
| 40 | 41 | ||
| 41 | import java.util.List; | 42 | import java.util.List; |
| 43 | +import java.util.Map; | ||
| 42 | import java.util.Set; | 44 | import java.util.Set; |
| 43 | 45 | ||
| 44 | import static org.slf4j.LoggerFactory.getLogger; | 46 | import static org.slf4j.LoggerFactory.getLogger; |
| ... | @@ -114,6 +116,29 @@ public class SimpleTopologyStore | ... | @@ -114,6 +116,29 @@ public class SimpleTopologyStore |
| 114 | } | 116 | } |
| 115 | 117 | ||
| 116 | @Override | 118 | @Override |
| 119 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
| 120 | + return defaultTopology(topology).getDisjointPaths(src, dst); | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + @Override | ||
| 124 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 125 | + LinkWeight weight) { | ||
| 126 | + return defaultTopology(topology).getDisjointPaths(src, dst, weight); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + @Override | ||
| 130 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 131 | + Map<Link, Object> riskProfile) { | ||
| 132 | + return defaultTopology(topology).getSRLGDisjointPaths(src, dst, riskProfile); | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + @Override | ||
| 136 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 137 | + LinkWeight weight, Map<Link, Object> riskProfile) { | ||
| 138 | + return defaultTopology(topology).getSRLGDisjointPaths(src, dst, weight, riskProfile); | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + @Override | ||
| 117 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { | 142 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { |
| 118 | return defaultTopology(topology).isInfrastructure(connectPoint); | 143 | return defaultTopology(topology).isInfrastructure(connectPoint); |
| 119 | } | 144 | } | ... | ... |
| ... | @@ -27,6 +27,8 @@ import org.apache.felix.scr.annotations.Service; | ... | @@ -27,6 +27,8 @@ import org.apache.felix.scr.annotations.Service; |
| 27 | import org.onosproject.net.ConnectPoint; | 27 | import org.onosproject.net.ConnectPoint; |
| 28 | import org.onosproject.net.DefaultEdgeLink; | 28 | import org.onosproject.net.DefaultEdgeLink; |
| 29 | import org.onosproject.net.DefaultPath; | 29 | import org.onosproject.net.DefaultPath; |
| 30 | +import org.onosproject.net.DisjointPath; | ||
| 31 | +import org.onosproject.net.DefaultDisjointPath; | ||
| 30 | import org.onosproject.net.DeviceId; | 32 | import org.onosproject.net.DeviceId; |
| 31 | import org.onosproject.net.EdgeLink; | 33 | import org.onosproject.net.EdgeLink; |
| 32 | import org.onosproject.net.ElementId; | 34 | import org.onosproject.net.ElementId; |
| ... | @@ -46,6 +48,8 @@ import org.slf4j.Logger; | ... | @@ -46,6 +48,8 @@ import org.slf4j.Logger; |
| 46 | 48 | ||
| 47 | import java.util.List; | 49 | import java.util.List; |
| 48 | import java.util.Set; | 50 | import java.util.Set; |
| 51 | +import java.util.Map; | ||
| 52 | + | ||
| 49 | 53 | ||
| 50 | import static com.google.common.base.Preconditions.checkNotNull; | 54 | import static com.google.common.base.Preconditions.checkNotNull; |
| 51 | import static org.slf4j.LoggerFactory.getLogger; | 55 | import static org.slf4j.LoggerFactory.getLogger; |
| ... | @@ -128,6 +132,84 @@ public class PathManager implements PathService { | ... | @@ -128,6 +132,84 @@ public class PathManager implements PathService { |
| 128 | return edgeToEdgePaths(srcEdge, dstEdge, paths); | 132 | return edgeToEdgePaths(srcEdge, dstEdge, paths); |
| 129 | } | 133 | } |
| 130 | 134 | ||
| 135 | + @Override | ||
| 136 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst) { | ||
| 137 | + return getDisjointPaths(src, dst, null); | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + @Override | ||
| 141 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeight weight) { | ||
| 142 | + checkNotNull(src, ELEMENT_ID_NULL); | ||
| 143 | + checkNotNull(dst, ELEMENT_ID_NULL); | ||
| 144 | + | ||
| 145 | + // Get the source and destination edge locations | ||
| 146 | + EdgeLink srcEdge = getEdgeLink(src, true); | ||
| 147 | + EdgeLink dstEdge = getEdgeLink(dst, false); | ||
| 148 | + | ||
| 149 | + // If either edge is null, bail with no paths. | ||
| 150 | + if (srcEdge == null || dstEdge == null) { | ||
| 151 | + return ImmutableSet.of(); | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + DeviceId srcDevice = srcEdge != NOT_HOST ? srcEdge.dst().deviceId() : (DeviceId) src; | ||
| 155 | + DeviceId dstDevice = dstEdge != NOT_HOST ? dstEdge.src().deviceId() : (DeviceId) dst; | ||
| 156 | + | ||
| 157 | + // If the source and destination are on the same edge device, there | ||
| 158 | + // is just one path, so build it and return it. | ||
| 159 | + if (srcDevice.equals(dstDevice)) { | ||
| 160 | + return edgeToEdgePathsDisjoint(srcEdge, dstEdge); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + // Otherwise get all paths between the source and destination edge | ||
| 164 | + // devices. | ||
| 165 | + Topology topology = topologyService.currentTopology(); | ||
| 166 | + Set<DisjointPath> paths = weight == null ? | ||
| 167 | + topologyService.getDisjointPaths(topology, srcDevice, dstDevice) : | ||
| 168 | + topologyService.getDisjointPaths(topology, srcDevice, dstDevice, weight); | ||
| 169 | + | ||
| 170 | + return edgeToEdgePathsDisjoint(srcEdge, dstEdge, paths); | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + @Override | ||
| 174 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, | ||
| 175 | + Map<Link, Object> riskProfile) { | ||
| 176 | + return getSRLGDisjointPaths(src, dst, null, riskProfile); | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + @Override | ||
| 180 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, LinkWeight weight, | ||
| 181 | + Map<Link, Object> riskProfile) { | ||
| 182 | + checkNotNull(src, ELEMENT_ID_NULL); | ||
| 183 | + checkNotNull(dst, ELEMENT_ID_NULL); | ||
| 184 | + | ||
| 185 | + // Get the source and destination edge locations | ||
| 186 | + EdgeLink srcEdge = getEdgeLink(src, true); | ||
| 187 | + EdgeLink dstEdge = getEdgeLink(dst, false); | ||
| 188 | + | ||
| 189 | + // If either edge is null, bail with no paths. | ||
| 190 | + if (srcEdge == null || dstEdge == null) { | ||
| 191 | + return ImmutableSet.of(); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + DeviceId srcDevice = srcEdge != NOT_HOST ? srcEdge.dst().deviceId() : (DeviceId) src; | ||
| 195 | + DeviceId dstDevice = dstEdge != NOT_HOST ? dstEdge.src().deviceId() : (DeviceId) dst; | ||
| 196 | + | ||
| 197 | + // If the source and destination are on the same edge device, there | ||
| 198 | + // is just one path, so build it and return it. | ||
| 199 | + if (srcDevice.equals(dstDevice)) { | ||
| 200 | + return edgeToEdgePathsDisjoint(srcEdge, dstEdge); | ||
| 201 | + } | ||
| 202 | + | ||
| 203 | + // Otherwise get all paths between the source and destination edge | ||
| 204 | + // devices. | ||
| 205 | + Topology topology = topologyService.currentTopology(); | ||
| 206 | + Set<DisjointPath> paths = weight == null ? | ||
| 207 | + topologyService.getSRLGDisjointPaths(topology, srcDevice, dstDevice, riskProfile) : | ||
| 208 | + topologyService.getSRLGDisjointPaths(topology, srcDevice, dstDevice, weight, riskProfile); | ||
| 209 | + | ||
| 210 | + return edgeToEdgePathsDisjoint(srcEdge, dstEdge, paths); | ||
| 211 | + } | ||
| 212 | + | ||
| 131 | // Finds the host edge link if the element ID is a host id of an existing | 213 | // Finds the host edge link if the element ID is a host id of an existing |
| 132 | // host. Otherwise, if the host does not exist, it returns null and if | 214 | // host. Otherwise, if the host does not exist, it returns null and if |
| 133 | // the element ID is not a host ID, returns NOT_HOST edge link. | 215 | // the element ID is not a host ID, returns NOT_HOST edge link. |
| ... | @@ -162,6 +244,19 @@ public class PathManager implements PathService { | ... | @@ -162,6 +244,19 @@ public class PathManager implements PathService { |
| 162 | return endToEndPaths; | 244 | return endToEndPaths; |
| 163 | } | 245 | } |
| 164 | 246 | ||
| 247 | + private Set<DisjointPath> edgeToEdgePathsDisjoint(EdgeLink srcLink, EdgeLink dstLink) { | ||
| 248 | + Set<DisjointPath> endToEndPaths = Sets.newHashSetWithExpectedSize(1); | ||
| 249 | + endToEndPaths.add(edgeToEdgePathD(srcLink, dstLink, null)); | ||
| 250 | + return endToEndPaths; | ||
| 251 | + } | ||
| 252 | + private Set<DisjointPath> edgeToEdgePathsDisjoint(EdgeLink srcLink, EdgeLink dstLink, Set<DisjointPath> paths) { | ||
| 253 | + Set<DisjointPath> endToEndPaths = Sets.newHashSetWithExpectedSize(paths.size()); | ||
| 254 | + for (DisjointPath path : paths) { | ||
| 255 | + endToEndPaths.add(edgeToEdgePathD(srcLink, dstLink, path)); | ||
| 256 | + } | ||
| 257 | + return endToEndPaths; | ||
| 258 | + } | ||
| 259 | + | ||
| 165 | // Produces a direct edge-to-edge path. | 260 | // Produces a direct edge-to-edge path. |
| 166 | private Path edgeToEdgePath(EdgeLink srcLink, EdgeLink dstLink, Path path) { | 261 | private Path edgeToEdgePath(EdgeLink srcLink, EdgeLink dstLink, Path path) { |
| 167 | List<Link> links = Lists.newArrayListWithCapacity(2); | 262 | List<Link> links = Lists.newArrayListWithCapacity(2); |
| ... | @@ -179,6 +274,13 @@ public class PathManager implements PathService { | ... | @@ -179,6 +274,13 @@ public class PathManager implements PathService { |
| 179 | return new DefaultPath(PID, links, 2); | 274 | return new DefaultPath(PID, links, 2); |
| 180 | } | 275 | } |
| 181 | 276 | ||
| 277 | + // Produces a direct edge-to-edge path. | ||
| 278 | + private DisjointPath edgeToEdgePathD(EdgeLink srcLink, EdgeLink dstLink, DisjointPath path) { | ||
| 279 | + return new DefaultDisjointPath(PID, (DefaultPath) edgeToEdgePath(srcLink, dstLink, path.primary()), | ||
| 280 | + (DefaultPath) edgeToEdgePath(srcLink, dstLink, path.backup())); | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + | ||
| 182 | // Special value for edge link to represent that this is really not an | 284 | // Special value for edge link to represent that this is really not an |
| 183 | // edge link since the src or dst are really an infrastructure device. | 285 | // edge link since the src or dst are really an infrastructure device. |
| 184 | private static class NotHost extends DefaultEdgeLink implements EdgeLink { | 286 | private static class NotHost extends DefaultEdgeLink implements EdgeLink { | ... | ... |
| ... | @@ -21,6 +21,7 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -21,6 +21,7 @@ import org.apache.felix.scr.annotations.Deactivate; |
| 21 | import org.apache.felix.scr.annotations.Reference; | 21 | import org.apache.felix.scr.annotations.Reference; |
| 22 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 22 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 23 | import org.apache.felix.scr.annotations.Service; | 23 | import org.apache.felix.scr.annotations.Service; |
| 24 | +import org.onosproject.net.DisjointPath; | ||
| 24 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; | 25 | import org.onosproject.net.provider.AbstractListenerProviderRegistry; |
| 25 | import org.onosproject.event.Event; | 26 | import org.onosproject.event.Event; |
| 26 | import org.onosproject.net.ConnectPoint; | 27 | import org.onosproject.net.ConnectPoint; |
| ... | @@ -46,6 +47,7 @@ import org.slf4j.Logger; | ... | @@ -46,6 +47,7 @@ import org.slf4j.Logger; |
| 46 | 47 | ||
| 47 | import java.util.List; | 48 | import java.util.List; |
| 48 | import java.util.Set; | 49 | import java.util.Set; |
| 50 | +import java.util.Map; | ||
| 49 | 51 | ||
| 50 | import static com.google.common.base.Preconditions.checkNotNull; | 52 | import static com.google.common.base.Preconditions.checkNotNull; |
| 51 | import static org.onosproject.security.AppGuard.checkPermission; | 53 | import static org.onosproject.security.AppGuard.checkPermission; |
| ... | @@ -162,6 +164,42 @@ public class TopologyManager | ... | @@ -162,6 +164,42 @@ public class TopologyManager |
| 162 | } | 164 | } |
| 163 | 165 | ||
| 164 | @Override | 166 | @Override |
| 167 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
| 168 | + checkNotNull(topology, TOPOLOGY_NULL); | ||
| 169 | + checkNotNull(src, DEVICE_ID_NULL); | ||
| 170 | + checkNotNull(dst, DEVICE_ID_NULL); | ||
| 171 | + return store.getDisjointPaths(topology, src, dst); | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + @Override | ||
| 175 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { | ||
| 176 | + checkNotNull(topology, TOPOLOGY_NULL); | ||
| 177 | + checkNotNull(src, DEVICE_ID_NULL); | ||
| 178 | + checkNotNull(dst, DEVICE_ID_NULL); | ||
| 179 | + checkNotNull(weight, "Link weight cannot be null"); | ||
| 180 | + return store.getDisjointPaths(topology, src, dst, weight); | ||
| 181 | + } | ||
| 182 | + | ||
| 183 | + @Override | ||
| 184 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 185 | + Map<Link, Object> riskProfile) { | ||
| 186 | + checkNotNull(topology, TOPOLOGY_NULL); | ||
| 187 | + checkNotNull(src, DEVICE_ID_NULL); | ||
| 188 | + checkNotNull(dst, DEVICE_ID_NULL); | ||
| 189 | + return store.getSRLGDisjointPaths(topology, src, dst, riskProfile); | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + @Override | ||
| 193 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight, | ||
| 194 | + Map<Link, Object> riskProfile) { | ||
| 195 | + checkNotNull(topology, TOPOLOGY_NULL); | ||
| 196 | + checkNotNull(src, DEVICE_ID_NULL); | ||
| 197 | + checkNotNull(dst, DEVICE_ID_NULL); | ||
| 198 | + checkNotNull(weight, "Link weight cannot be null"); | ||
| 199 | + return store.getSRLGDisjointPaths(topology, src, dst, weight, riskProfile); | ||
| 200 | + } | ||
| 201 | + | ||
| 202 | + @Override | ||
| 165 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { | 203 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { |
| 166 | checkPermission(TOPOLOGY_READ); | 204 | checkPermission(TOPOLOGY_READ); |
| 167 | checkNotNull(topology, TOPOLOGY_NULL); | 205 | checkNotNull(topology, TOPOLOGY_NULL); | ... | ... |
| ... | @@ -21,7 +21,9 @@ import org.onosproject.TestApplicationId; | ... | @@ -21,7 +21,9 @@ import org.onosproject.TestApplicationId; |
| 21 | import org.onosproject.core.ApplicationId; | 21 | import org.onosproject.core.ApplicationId; |
| 22 | import org.onosproject.net.ConnectPoint; | 22 | import org.onosproject.net.ConnectPoint; |
| 23 | import org.onosproject.net.DeviceId; | 23 | import org.onosproject.net.DeviceId; |
| 24 | +import org.onosproject.net.DisjointPath; | ||
| 24 | import org.onosproject.net.ElementId; | 25 | import org.onosproject.net.ElementId; |
| 26 | +import org.onosproject.net.Link; | ||
| 25 | import org.onosproject.net.Path; | 27 | import org.onosproject.net.Path; |
| 26 | import org.onosproject.net.device.DeviceServiceAdapter; | 28 | import org.onosproject.net.device.DeviceServiceAdapter; |
| 27 | import org.onosproject.net.flow.TrafficSelector; | 29 | import org.onosproject.net.flow.TrafficSelector; |
| ... | @@ -36,6 +38,7 @@ import org.onosproject.net.topology.PathService; | ... | @@ -36,6 +38,7 @@ import org.onosproject.net.topology.PathService; |
| 36 | 38 | ||
| 37 | import java.util.HashSet; | 39 | import java.util.HashSet; |
| 38 | import java.util.List; | 40 | import java.util.List; |
| 41 | +import java.util.Map; | ||
| 39 | import java.util.Set; | 42 | import java.util.Set; |
| 40 | 43 | ||
| 41 | import static org.hamcrest.CoreMatchers.instanceOf; | 44 | import static org.hamcrest.CoreMatchers.instanceOf; |
| ... | @@ -91,6 +94,28 @@ public class MultiPointToSinglePointIntentCompilerTest extends AbstractIntentTes | ... | @@ -91,6 +94,28 @@ public class MultiPointToSinglePointIntentCompilerTest extends AbstractIntentTes |
| 91 | public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { | 94 | public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeight weight) { |
| 92 | return null; | 95 | return null; |
| 93 | } | 96 | } |
| 97 | + | ||
| 98 | + @Override | ||
| 99 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst) { | ||
| 100 | + return null; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + @Override | ||
| 104 | + public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeight weight) { | ||
| 105 | + return null; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + @Override | ||
| 109 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, | ||
| 110 | + Map<Link, Object> riskProfile) { | ||
| 111 | + return null; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + @Override | ||
| 115 | + public Set<DisjointPath> getSRLGDisjointPaths(ElementId src, ElementId dst, LinkWeight weight, | ||
| 116 | + Map<Link, Object> riskProfile) { | ||
| 117 | + return null; | ||
| 118 | + } | ||
| 94 | } | 119 | } |
| 95 | 120 | ||
| 96 | /** | 121 | /** | ... | ... |
| ... | @@ -19,9 +19,11 @@ import org.junit.After; | ... | @@ -19,9 +19,11 @@ import org.junit.After; |
| 19 | import org.junit.Before; | 19 | import org.junit.Before; |
| 20 | import org.junit.Test; | 20 | import org.junit.Test; |
| 21 | import org.onosproject.net.DeviceId; | 21 | import org.onosproject.net.DeviceId; |
| 22 | +import org.onosproject.net.DisjointPath; | ||
| 22 | import org.onosproject.net.ElementId; | 23 | import org.onosproject.net.ElementId; |
| 23 | import org.onosproject.net.Host; | 24 | import org.onosproject.net.Host; |
| 24 | import org.onosproject.net.HostId; | 25 | import org.onosproject.net.HostId; |
| 26 | +import org.onosproject.net.Link; | ||
| 25 | import org.onosproject.net.Path; | 27 | import org.onosproject.net.Path; |
| 26 | import org.onosproject.net.host.HostService; | 28 | import org.onosproject.net.host.HostService; |
| 27 | import org.onosproject.net.host.HostServiceAdapter; | 29 | import org.onosproject.net.host.HostServiceAdapter; |
| ... | @@ -149,6 +151,28 @@ public class PathManagerTest { | ... | @@ -149,6 +151,28 @@ public class PathManagerTest { |
| 149 | public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { | 151 | public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { |
| 150 | return paths; | 152 | return paths; |
| 151 | } | 153 | } |
| 154 | + | ||
| 155 | + @Override | ||
| 156 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
| 157 | + return null; | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + @Override | ||
| 161 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) { | ||
| 162 | + return null; | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + @Override | ||
| 166 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 167 | + Map<Link, Object> riskProfile) { | ||
| 168 | + return null; | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + @Override | ||
| 172 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight, | ||
| 173 | + Map<Link, Object> riskProfile) { | ||
| 174 | + return null; | ||
| 175 | + } | ||
| 152 | } | 176 | } |
| 153 | 177 | ||
| 154 | // Fake entity to give out hosts. | 178 | // Fake entity to give out hosts. | ... | ... |
| ... | @@ -21,6 +21,7 @@ import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED; | ... | @@ -21,6 +21,7 @@ import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED; |
| 21 | import static org.slf4j.LoggerFactory.getLogger; | 21 | import static org.slf4j.LoggerFactory.getLogger; |
| 22 | 22 | ||
| 23 | import java.util.Collections; | 23 | import java.util.Collections; |
| 24 | +import java.util.Map; | ||
| 24 | import java.util.List; | 25 | import java.util.List; |
| 25 | import java.util.Set; | 26 | import java.util.Set; |
| 26 | import java.util.stream.Collectors; | 27 | import java.util.stream.Collectors; |
| ... | @@ -40,6 +41,7 @@ import org.onosproject.net.Device; | ... | @@ -40,6 +41,7 @@ import org.onosproject.net.Device; |
| 40 | import org.onosproject.net.DeviceId; | 41 | import org.onosproject.net.DeviceId; |
| 41 | import org.onosproject.net.Link; | 42 | import org.onosproject.net.Link; |
| 42 | import org.onosproject.net.Path; | 43 | import org.onosproject.net.Path; |
| 44 | +import org.onosproject.net.DisjointPath; | ||
| 43 | import org.onosproject.net.provider.ProviderId; | 45 | import org.onosproject.net.provider.ProviderId; |
| 44 | import org.onosproject.net.topology.ClusterId; | 46 | import org.onosproject.net.topology.ClusterId; |
| 45 | import org.onosproject.net.topology.DefaultGraphDescription; | 47 | import org.onosproject.net.topology.DefaultGraphDescription; |
| ... | @@ -74,7 +76,6 @@ public class DistributedTopologyStore | ... | @@ -74,7 +76,6 @@ public class DistributedTopologyStore |
| 74 | implements TopologyStore { | 76 | implements TopologyStore { |
| 75 | 77 | ||
| 76 | private final Logger log = getLogger(getClass()); | 78 | private final Logger log = getLogger(getClass()); |
| 77 | - | ||
| 78 | private volatile DefaultTopology current = | 79 | private volatile DefaultTopology current = |
| 79 | new DefaultTopology(ProviderId.NONE, | 80 | new DefaultTopology(ProviderId.NONE, |
| 80 | new DefaultGraphDescription(0L, System.currentTimeMillis(), | 81 | new DefaultGraphDescription(0L, System.currentTimeMillis(), |
| ... | @@ -167,6 +168,29 @@ public class DistributedTopologyStore | ... | @@ -167,6 +168,29 @@ public class DistributedTopologyStore |
| 167 | } | 168 | } |
| 168 | 169 | ||
| 169 | @Override | 170 | @Override |
| 171 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) { | ||
| 172 | + return defaultTopology(topology).getDisjointPaths(src, dst); | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + @Override | ||
| 176 | + public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 177 | + LinkWeight weight) { | ||
| 178 | + return defaultTopology(topology).getDisjointPaths(src, dst, weight); | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + @Override | ||
| 182 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 183 | + Map<Link, Object> riskProfile) { | ||
| 184 | + return defaultTopology(topology).getSRLGDisjointPaths(src, dst, riskProfile); | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + @Override | ||
| 188 | + public Set<DisjointPath> getSRLGDisjointPaths(Topology topology, DeviceId src, DeviceId dst, | ||
| 189 | + LinkWeight weight, Map<Link, Object> riskProfile) { | ||
| 190 | + return defaultTopology(topology).getSRLGDisjointPaths(src, dst, weight, riskProfile); | ||
| 191 | + } | ||
| 192 | + | ||
| 193 | + @Override | ||
| 170 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { | 194 | public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) { |
| 171 | return defaultTopology(topology).isInfrastructure(connectPoint); | 195 | return defaultTopology(topology).isInfrastructure(connectPoint); |
| 172 | } | 196 | } | ... | ... |
| ... | @@ -82,4 +82,30 @@ public class PathsWebResource extends AbstractWebResource { | ... | @@ -82,4 +82,30 @@ public class PathsWebResource extends AbstractWebResource { |
| 82 | return ok(root).build(); | 82 | return ok(root).build(); |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | + @GET | ||
| 86 | + @Produces(MediaType.APPLICATION_JSON) | ||
| 87 | + @Path("{src}/{dst}/disjoint") | ||
| 88 | + | ||
| 89 | + public Response getDisjointPath(@PathParam("src") String src, | ||
| 90 | + @PathParam("dst") String dst) { | ||
| 91 | + PathService pathService = get(PathService.class); | ||
| 92 | + | ||
| 93 | + ElementId srcElement = isHostId(src); | ||
| 94 | + ElementId dstElement = isHostId(dst); | ||
| 95 | + | ||
| 96 | + if (srcElement == null) { | ||
| 97 | + // Doesn't look like a host, assume it is a device | ||
| 98 | + srcElement = DeviceId.deviceId(src); | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + if (dstElement == null) { | ||
| 102 | + // Doesn't look like a host, assume it is a device | ||
| 103 | + dstElement = DeviceId.deviceId(dst); | ||
| 104 | + } | ||
| 105 | + Set<org.onosproject.net.DisjointPath> paths = | ||
| 106 | + pathService.getDisjointPaths(srcElement, dstElement); | ||
| 107 | + ObjectNode root = | ||
| 108 | + encodeArray(org.onosproject.net.DisjointPath.class, "paths", paths); | ||
| 109 | + return ok(root).build(); | ||
| 110 | + } | ||
| 85 | } | 111 | } | ... | ... |
-
Please register or login to post a comment