diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java index 5fd1c85d69..449b898ac7 100644 --- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java +++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java @@ -47,6 +47,7 @@ import org.onosproject.net.intent.IntentCompiler; import org.onosproject.net.intent.IntentExtensionService; import org.onosproject.net.intent.MplsPathIntent; import org.onosproject.net.link.LinkStore; +import org.onosproject.net.resource.ResourceRequest; import org.onosproject.net.resource.link.DefaultLinkResourceRequest; import org.onosproject.net.resource.link.LinkResourceAllocations; import org.onosproject.net.resource.link.LinkResourceRequest; @@ -55,13 +56,18 @@ import org.onosproject.net.resource.link.MplsLabel; import org.onosproject.net.resource.link.MplsLabelResourceAllocation; import org.onosproject.net.resource.ResourceAllocation; import org.onosproject.net.resource.ResourceType; +import org.onosproject.net.resource.link.MplsLabelResourceRequest; import org.slf4j.Logger; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; +import java.util.stream.StreamSupport; import static com.google.common.base.Preconditions.checkNotNull; import static org.slf4j.LoggerFactory.getLogger; @@ -117,11 +123,34 @@ public class MplsPathIntentCompiler implements IntentCompiler { linkRequest.add(linkStore.getLink(link.dst(), link.src())); } - LinkResourceRequest.Builder request = DefaultLinkResourceRequest - .builder(intent.id(), linkRequest).addMplsRequest(); - LinkResourceAllocations reqMpls = resourceService - .requestResources(request.build()); - return reqMpls; + Map labels = findMplsLabels(linkRequest); + + LinkResourceRequest request = DefaultLinkResourceRequest + .builder(intent.id(), linkRequest) + .addMplsRequest(labels) + .build(); + return resourceService.requestResources(request); + } + + private Map findMplsLabels(Set links) { + Map labels = new HashMap<>(); + for (Link link : links) { + Optional label = findMplsLabel(link); + if (label.isPresent()) { + labels.put(link, label.get()); + } + } + + return labels; + } + + private Optional findMplsLabel(Link link) { + Iterable freeLabels = resourceService.getAvailableResources(link); + return StreamSupport.stream(freeLabels.spliterator(), false) + .filter(x -> x instanceof MplsLabelResourceRequest) + .map(x -> (MplsLabelResourceRequest) x) + .map(MplsLabelResourceRequest::mplsLabel) + .findFirst(); } private MplsLabel getMplsLabel(LinkResourceAllocations allocations, Link link) { diff --git a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java b/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java index fe05379ff9..7eb189e57b 100644 --- a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java +++ b/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java @@ -45,7 +45,6 @@ import org.onosproject.net.resource.link.MplsLabelResourceAllocation; import org.onosproject.net.resource.link.MplsLabelResourceRequest; import org.slf4j.Logger; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -84,28 +83,6 @@ public class LinkResourceManager } - /** - * Returns available MPLS label on specified link. - * - * @param link the link - * @return available MPLS labels on specified link - */ - private Iterable getAvailableMplsLabels(Link link) { - Set resAllocs = store.getFreeResources(link); - if (resAllocs == null) { - return Collections.emptySet(); - } - Set mplsLabels = new HashSet<>(); - for (ResourceAllocation res : resAllocs) { - if (res.type() == ResourceType.MPLS_LABEL) { - - mplsLabels.add(((MplsLabelResourceAllocation) res).mplsLabel()); - } - } - - return mplsLabels; - } - @Override public LinkResourceAllocations requestResources(LinkResourceRequest req) { checkPermission(LINK_WRITE);