Move wavelength selection logic to OpticalConnectivityIntentCompiler
Now, LinkResourceManager doesn't have a logic to select lambda(s)
Change-Id: I008d770f4f142f3d67afa734e50bd8761a0aafd2
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 88f94c0..e4df227 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -16,6 +16,9 @@
package org.onosproject.net.intent.impl.compiler;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
@@ -45,6 +48,7 @@
import org.onosproject.net.resource.link.DefaultLinkResourceRequest;
import org.onosproject.net.resource.link.LambdaResource;
import org.onosproject.net.resource.link.LambdaResourceAllocation;
+import org.onosproject.net.resource.link.LambdaResourceRequest;
import org.onosproject.net.resource.link.LinkResourceAllocations;
import org.onosproject.net.resource.link.LinkResourceRequest;
import org.onosproject.net.resource.link.LinkResourceService;
@@ -54,6 +58,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -194,11 +199,19 @@
* @return first available lambda resource allocation
*/
private LinkResourceAllocations assignWavelength(Intent intent, Path path) {
- LinkResourceRequest.Builder request =
- DefaultLinkResourceRequest.builder(intent.id(), path.links())
- .addLambdaRequest();
+ Set<LambdaResource> lambdas = findCommonLambdasOverLinks(path.links());
+ if (lambdas.isEmpty()) {
+ return null;
+ }
- LinkResourceAllocations allocations = linkResourceService.requestResources(request.build());
+ LambdaResource minLambda = findFirstLambda(lambdas);
+
+ LinkResourceRequest request =
+ DefaultLinkResourceRequest.builder(intent.id(), path.links())
+ .addLambdaRequest(minLambda)
+ .build();
+
+ LinkResourceAllocations allocations = linkResourceService.requestResources(request);
if (!checkWavelengthContinuity(allocations, path)) {
linkResourceService.releaseResources(allocations);
@@ -208,6 +221,23 @@
return allocations;
}
+ private Set<LambdaResource> findCommonLambdasOverLinks(List<Link> links) {
+ return links.stream()
+ .map(x -> ImmutableSet.copyOf(linkResourceService.getAvailableResources(x)))
+ .map(x -> Sets.filter(x, req -> req instanceof LambdaResourceRequest))
+ .map(x -> Iterables.transform(x, req -> (LambdaResourceRequest) req))
+ .map(x -> Iterables.transform(x, LambdaResourceRequest::lambda))
+ .map(x -> (Set<LambdaResource>) ImmutableSet.copyOf(x))
+ .reduce(Sets::intersection)
+ .orElse(Collections.emptySet());
+ }
+
+ private LambdaResource findFirstLambda(Set<LambdaResource> lambdas) {
+ return lambdas.stream()
+ .findFirst()
+ .get();
+ }
+
/**
* Checks wavelength continuity constraint across path, i.e., an identical lambda is used on all links.
* @return true if wavelength continuity is met, false otherwise