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