Committed by
Gerrit Code Review
Remove dependency on LinkResourceService from optical intent compiler
Change-Id: I1fae0a33817de973676a02cf40d4bb378aac0460
Showing
1 changed file
with
25 additions
and
84 deletions
... | @@ -28,6 +28,7 @@ import org.onlab.util.Frequency; | ... | @@ -28,6 +28,7 @@ import org.onlab.util.Frequency; |
28 | import org.onosproject.net.AnnotationKeys; | 28 | import org.onosproject.net.AnnotationKeys; |
29 | import org.onosproject.net.ConnectPoint; | 29 | import org.onosproject.net.ConnectPoint; |
30 | import org.onosproject.net.DeviceId; | 30 | import org.onosproject.net.DeviceId; |
31 | +import org.onosproject.net.IndexedLambda; | ||
31 | import org.onosproject.net.Link; | 32 | import org.onosproject.net.Link; |
32 | import org.onosproject.net.OchPort; | 33 | import org.onosproject.net.OchPort; |
33 | import org.onosproject.net.OchSignal; | 34 | import org.onosproject.net.OchSignal; |
... | @@ -42,16 +43,10 @@ import org.onosproject.net.intent.IntentExtensionService; | ... | @@ -42,16 +43,10 @@ import org.onosproject.net.intent.IntentExtensionService; |
42 | import org.onosproject.net.intent.OpticalConnectivityIntent; | 43 | import org.onosproject.net.intent.OpticalConnectivityIntent; |
43 | import org.onosproject.net.intent.OpticalPathIntent; | 44 | import org.onosproject.net.intent.OpticalPathIntent; |
44 | import org.onosproject.net.intent.impl.IntentCompilationException; | 45 | import org.onosproject.net.intent.impl.IntentCompilationException; |
46 | +import org.onosproject.net.newresource.ResourceAllocation; | ||
45 | import org.onosproject.net.newresource.ResourcePath; | 47 | import org.onosproject.net.newresource.ResourcePath; |
46 | import org.onosproject.net.newresource.ResourceService; | 48 | import org.onosproject.net.newresource.ResourceService; |
47 | -import org.onosproject.net.resource.ResourceType; | ||
48 | -import org.onosproject.net.resource.link.DefaultLinkResourceRequest; | ||
49 | -import org.onosproject.net.resource.link.LambdaResource; | ||
50 | -import org.onosproject.net.resource.link.LambdaResourceAllocation; | ||
51 | -import org.onosproject.net.resource.link.LambdaResourceRequest; | ||
52 | import org.onosproject.net.resource.link.LinkResourceAllocations; | 49 | import org.onosproject.net.resource.link.LinkResourceAllocations; |
53 | -import org.onosproject.net.resource.link.LinkResourceRequest; | ||
54 | -import org.onosproject.net.resource.link.LinkResourceService; | ||
55 | import org.onosproject.net.topology.LinkWeight; | 50 | import org.onosproject.net.topology.LinkWeight; |
56 | import org.onosproject.net.topology.Topology; | 51 | import org.onosproject.net.topology.Topology; |
57 | import org.onosproject.net.topology.TopologyService; | 52 | import org.onosproject.net.topology.TopologyService; |
... | @@ -64,6 +59,7 @@ import java.util.Set; | ... | @@ -64,6 +59,7 @@ import java.util.Set; |
64 | import java.util.stream.Collectors; | 59 | import java.util.stream.Collectors; |
65 | 60 | ||
66 | import static com.google.common.base.Preconditions.checkArgument; | 61 | import static com.google.common.base.Preconditions.checkArgument; |
62 | +import static org.onosproject.net.LinkKey.linkKey; | ||
67 | 63 | ||
68 | /** | 64 | /** |
69 | * An intent compiler for {@link org.onosproject.net.intent.OpticalConnectivityIntent}. | 65 | * An intent compiler for {@link org.onosproject.net.intent.OpticalConnectivityIntent}. |
... | @@ -86,9 +82,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical | ... | @@ -86,9 +82,6 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical |
86 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 82 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
87 | protected ResourceService resourceService; | 83 | protected ResourceService resourceService; |
88 | 84 | ||
89 | - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
90 | - protected LinkResourceService linkResourceService; | ||
91 | - | ||
92 | @Activate | 85 | @Activate |
93 | public void activate() { | 86 | public void activate() { |
94 | intentManager.registerCompiler(OpticalConnectivityIntent.class, this); | 87 | intentManager.registerCompiler(OpticalConnectivityIntent.class, this); |
... | @@ -144,13 +137,12 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical | ... | @@ -144,13 +137,12 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical |
144 | ochSignal = srcOchPort.lambda(); | 137 | ochSignal = srcOchPort.lambda(); |
145 | } else { | 138 | } else { |
146 | // Request and reserve lambda on path | 139 | // Request and reserve lambda on path |
147 | - LinkResourceAllocations linkAllocs = assignWavelength(intent, path); | 140 | + IndexedLambda lambda = assignWavelength(intent, path); |
148 | - if (linkAllocs == null) { | 141 | + if (lambda == null) { |
149 | continue; | 142 | continue; |
150 | } | 143 | } |
151 | - LambdaResourceAllocation lambdaAlloc = getWavelength(path, linkAllocs); | ||
152 | OmsPort omsPort = (OmsPort) deviceService.getPort(path.src().deviceId(), path.src().port()); | 144 | OmsPort omsPort = (OmsPort) deviceService.getPort(path.src().deviceId(), path.src().port()); |
153 | - ochSignal = new OchSignal(lambdaAlloc.lambda().toInt(), omsPort.maxFrequency(), omsPort.grid()); | 145 | + ochSignal = new OchSignal((int) lambda.index(), omsPort.maxFrequency(), omsPort.grid()); |
154 | } | 146 | } |
155 | 147 | ||
156 | // Create installable optical path intent | 148 | // Create installable optical path intent |
... | @@ -177,99 +169,48 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical | ... | @@ -177,99 +169,48 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical |
177 | } | 169 | } |
178 | 170 | ||
179 | /** | 171 | /** |
180 | - * Find the lambda allocated to the path. | ||
181 | - * | ||
182 | - * @param path the path | ||
183 | - * @param linkAllocs the link allocations | ||
184 | - * @return lambda allocated to the given path | ||
185 | - */ | ||
186 | - private LambdaResourceAllocation getWavelength(Path path, LinkResourceAllocations linkAllocs) { | ||
187 | - return path.links().stream() | ||
188 | - .flatMap(x -> linkAllocs.getResourceAllocation(x).stream()) | ||
189 | - .filter(x -> x.type() == ResourceType.LAMBDA) | ||
190 | - .findFirst() | ||
191 | - .map(x -> (LambdaResourceAllocation) x) | ||
192 | - .orElse(null); | ||
193 | - } | ||
194 | - | ||
195 | - /** | ||
196 | * Request and reserve first available wavelength across path. | 172 | * Request and reserve first available wavelength across path. |
197 | * | 173 | * |
198 | * @param path path in WDM topology | 174 | * @param path path in WDM topology |
199 | - * @return first available lambda resource allocation | 175 | + * @return first available lambda allocated |
200 | */ | 176 | */ |
201 | - private LinkResourceAllocations assignWavelength(Intent intent, Path path) { | 177 | + private IndexedLambda assignWavelength(Intent intent, Path path) { |
202 | - Set<LambdaResource> lambdas = findCommonLambdasOverLinks(path.links()); | 178 | + Set<IndexedLambda> lambdas = findCommonLambdasOverLinks(path.links()); |
203 | if (lambdas.isEmpty()) { | 179 | if (lambdas.isEmpty()) { |
204 | return null; | 180 | return null; |
205 | } | 181 | } |
206 | 182 | ||
207 | - LambdaResource minLambda = findFirstLambda(lambdas); | 183 | + IndexedLambda minLambda = findFirstLambda(lambdas); |
208 | - | 184 | + List<ResourcePath> lambdaResources = path.links().stream() |
209 | - LinkResourceRequest request = | 185 | + .map(x -> new ResourcePath(linkKey(x.src(), x.dst()))) |
210 | - DefaultLinkResourceRequest.builder(intent.id(), path.links()) | 186 | + .map(x -> ResourcePath.child(x, minLambda)) |
211 | - .addLambdaRequest(minLambda) | 187 | + .collect(Collectors.toList()); |
212 | - .build(); | ||
213 | - | ||
214 | - LinkResourceAllocations allocations = linkResourceService.requestResources(request); | ||
215 | 188 | ||
216 | - if (!checkWavelengthContinuity(allocations, path)) { | 189 | + List<ResourceAllocation> allocations = resourceService.allocate(intent.id(), lambdaResources); |
217 | - linkResourceService.releaseResources(allocations); | 190 | + if (allocations.isEmpty()) { |
218 | - return null; | 191 | + log.info("Resource allocation for {} failed (resource request: {})", intent, lambdaResources); |
219 | } | 192 | } |
220 | 193 | ||
221 | - return allocations; | 194 | + return minLambda; |
222 | } | 195 | } |
223 | 196 | ||
224 | - private Set<LambdaResource> findCommonLambdasOverLinks(List<Link> links) { | 197 | + private Set<IndexedLambda> findCommonLambdasOverLinks(List<Link> links) { |
225 | return links.stream() | 198 | return links.stream() |
226 | - .map(x -> ImmutableSet.copyOf(linkResourceService.getAvailableResources(x))) | 199 | + .map(x -> new ResourcePath(linkKey(x.src(), x.dst()))) |
227 | - .map(x -> Sets.filter(x, req -> req instanceof LambdaResourceRequest)) | 200 | + .map(resourceService::getAvailableResources) |
228 | - .map(x -> Iterables.transform(x, req -> (LambdaResourceRequest) req)) | 201 | + .map(x -> Iterables.filter(x, r -> r.lastComponent() instanceof IndexedLambda)) |
229 | - .map(x -> Iterables.transform(x, LambdaResourceRequest::lambda)) | 202 | + .map(x -> Iterables.transform(x, r -> (IndexedLambda) r.lastComponent())) |
230 | - .map(x -> (Set<LambdaResource>) ImmutableSet.copyOf(x)) | 203 | + .map(x -> (Set<IndexedLambda>) ImmutableSet.copyOf(x)) |
231 | .reduce(Sets::intersection) | 204 | .reduce(Sets::intersection) |
232 | .orElse(Collections.emptySet()); | 205 | .orElse(Collections.emptySet()); |
233 | } | 206 | } |
234 | 207 | ||
235 | - private LambdaResource findFirstLambda(Set<LambdaResource> lambdas) { | 208 | + private IndexedLambda findFirstLambda(Set<IndexedLambda> lambdas) { |
236 | return lambdas.stream() | 209 | return lambdas.stream() |
237 | .findFirst() | 210 | .findFirst() |
238 | .get(); | 211 | .get(); |
239 | } | 212 | } |
240 | 213 | ||
241 | - /** | ||
242 | - * Checks wavelength continuity constraint across path, i.e., an identical lambda is used on all links. | ||
243 | - * @return true if wavelength continuity is met, false otherwise | ||
244 | - */ | ||
245 | - private boolean checkWavelengthContinuity(LinkResourceAllocations allocations, Path path) { | ||
246 | - if (allocations == null) { | ||
247 | - return false; | ||
248 | - } | ||
249 | - | ||
250 | - List<LambdaResource> lambdas = path.links().stream() | ||
251 | - .flatMap(x -> allocations.getResourceAllocation(x).stream()) | ||
252 | - .filter(x -> x.type() == ResourceType.LAMBDA) | ||
253 | - .map(x -> ((LambdaResourceAllocation) x).lambda()) | ||
254 | - .collect(Collectors.toList()); | ||
255 | - | ||
256 | - LambdaResource lambda = null; | ||
257 | - for (LambdaResource nextLambda: lambdas) { | ||
258 | - if (nextLambda == null) { | ||
259 | - return false; | ||
260 | - } | ||
261 | - if (lambda == null) { | ||
262 | - lambda = nextLambda; | ||
263 | - continue; | ||
264 | - } | ||
265 | - if (!lambda.equals(nextLambda)) { | ||
266 | - return false; | ||
267 | - } | ||
268 | - } | ||
269 | - | ||
270 | - return true; | ||
271 | - } | ||
272 | - | ||
273 | private ConnectPoint staticPort(ConnectPoint connectPoint) { | 214 | private ConnectPoint staticPort(ConnectPoint connectPoint) { |
274 | Port port = deviceService.getPort(connectPoint.deviceId(), connectPoint.port()); | 215 | Port port = deviceService.getPort(connectPoint.deviceId(), connectPoint.port()); |
275 | 216 | ... | ... |
-
Please register or login to post a comment