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