Remove dependency on LinkResourceService from Constraint

Change-Id: Ib9c488331b22eef6769a767c6186ef7d2e8b1501
diff --git a/core/api/src/main/java/org/onosproject/net/intent/Constraint.java b/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
index 03acf17..be88cc9 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/Constraint.java
@@ -18,7 +18,6 @@
 import com.google.common.annotations.Beta;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 /**
  * Representation of a connectivity constraint capable of evaluating a link
@@ -33,21 +32,19 @@
     /**
      * Evaluates the specified link and provides the cost for its traversal.
      *
-     * @param link            link to be evaluated
-     * @param resourceService resource service for validating availability of
-     *                        link resources
+     * @param link    link to be evaluated
+     * @param context resource context for validating availability of resources
      * @return cost of link traversal
      */
-    double cost(Link link, LinkResourceService resourceService);
+    double cost(Link link, ResourceContext context);
 
     /**
      * Validates that the specified path satisfies the constraint.
      *
      * @param path            path to be validated
-     * @param resourceService resource service for validating availability of
-     *                        link resources
+     * @param context resource context for validating availability of resources
      * @return cost of link traversal
      */
-    boolean validate(Path path, LinkResourceService resourceService);
+    boolean validate(Path path, ResourceContext context);
 
 }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java b/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java
new file mode 100644
index 0000000..0193c61
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/intent/ResourceContext.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.intent;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.newresource.Resource;
+
+/**
+ * Class providing resource information to constraints.
+ * This class is subject to be removed during refactorings on Constraint.
+ */
+@Beta
+public interface ResourceContext {
+    /**
+     * Returns the availability of the specified resource.
+     *
+     * @param resource resource to check the availability
+     * @return true if available, otherwise false
+     */
+    boolean isAvailable(Resource resource);
+}
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
index f5439ef..1edb79c 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/AnnotationConstraint.java
@@ -18,7 +18,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 
@@ -68,16 +68,28 @@
         return threshold;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         double value = getAnnotatedValue(link, key);
 
         return value <= threshold;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
-        if (isValid(link, resourceService)) {
+    public double cost(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return cost(link);
+    }
+
+    private double cost(Link link) {
+        if (isValid(link)) {
             return getAnnotatedValue(link, key);
         } else {
             return -1;
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
index e0f8614..dcc2e95 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/AsymmetricPathConstraint.java
@@ -19,7 +19,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 
@@ -31,13 +31,15 @@
 @Beta
 public class AsymmetricPathConstraint implements Constraint {
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return true;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
index 1b4a260..9ef0243 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/BandwidthConstraint.java
@@ -20,12 +20,11 @@
 import org.onlab.util.Bandwidth;
 import org.onlab.util.DataRateUnit;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.BandwidthResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.resource.ResourceRequest;
-import org.onosproject.net.resource.ResourceType;
+import org.onosproject.net.intent.ResourceContext;
+import org.onosproject.net.newresource.Resources;
 
 import java.util.Objects;
+import java.util.stream.Stream;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -64,16 +63,10 @@
     }
 
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
-        for (ResourceRequest request : resourceService.getAvailableResources(link)) {
-            if (request.type() == ResourceType.BANDWIDTH) {
-                BandwidthResourceRequest brr = (BandwidthResourceRequest) request;
-                if (brr.bandwidth().toDouble() >= bandwidth.bps()) {
-                    return true;
-                }
-            }
-        }
-        return false;
+    public boolean isValid(Link link, ResourceContext context) {
+        return Stream.of(link.src(), link.dst())
+                .map(cp -> Resources.continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(bandwidth.bps()))
+                .allMatch(context::isAvailable);
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
index b644692..9cff6fd 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/BooleanConstraint.java
@@ -19,7 +19,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 /**
  * Abstract base class for various constraints that evaluate link viability
@@ -32,10 +32,10 @@
      * Returns true if the specified link satisfies the constraint.
      *
      * @param link            link to be validated
-     * @param resourceService resource service for checking available link resources
+     * @param context resource context for checking available resources
      * @return true if link is viable
      */
-    public abstract boolean isValid(Link link, LinkResourceService resourceService);
+    public abstract boolean isValid(Link link, ResourceContext context);
 
     /**
      * {@inheritDoc}
@@ -43,18 +43,18 @@
      * Negative return value means the specified link does not satisfy this constraint.
      *
      * @param link {@inheritDoc}
-     * @param resourceService {@inheritDoc}
+     * @param context {@inheritDoc}
      * @return {@inheritDoc}
      */
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
-        return isValid(link, resourceService) ? +1 : -1;
+    public double cost(Link link, ResourceContext context) {
+        return isValid(link, context) ? +1 : -1;
     }
 
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return path.links().stream()
-                .allMatch(link -> isValid(link, resourceService));
+                .allMatch(link -> isValid(link, context));
     }
 
 }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
index e853939..5e4b93a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/EncapsulationConstraint.java
@@ -19,7 +19,7 @@
 
 import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -42,8 +42,9 @@
     }
 
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
         //TODO: validate the availability of the resources for each link in the path.
         //e.g., availability of MPLSlabels, VLANID
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
index aecef87..1e0d12a 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/LatencyConstraint.java
@@ -20,7 +20,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
@@ -54,14 +54,26 @@
         return latency;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return cost(link);
+    }
+
+    private double cost(Link link) {
         return getAnnotatedValue(link, LATENCY);
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
-        double pathLatency = path.links().stream().mapToDouble(link -> cost(link, resourceService)).sum();
+    public boolean validate(Path path, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return validate(path);
+    }
+
+    private boolean validate(Path path) {
+        double pathLatency = path.links().stream().mapToDouble(this::cost).sum();
         return Duration.of((long) pathLatency, ChronoUnit.MICROS).compareTo(latency) <= 0;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
index fae76d6..0ff5332 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/LinkTypeConstraint.java
@@ -18,7 +18,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Objects;
 import java.util.Set;
@@ -57,8 +57,14 @@
         this.isInclusive = false;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         boolean contains = types.contains(link.type());
         return isInclusive == contains;
     }
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
index ca4f3fd..7487512 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/ObstacleConstraint.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -56,8 +56,14 @@
         return obstacles;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean isValid(Link link, LinkResourceService resourceService) {
+    public boolean isValid(Link link, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return isValid(link);
+    }
+
+    private boolean isValid(Link link) {
         DeviceId src = link.src().deviceId();
         DeviceId dst = link.dst().deviceId();
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
index 827859b..7256a55 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/PartialFailureConstraint.java
@@ -20,7 +20,7 @@
 import org.onosproject.net.intent.ConnectivityIntent;
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.Intent;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 /**
  * A constraint that allows intents that can only be partially compiled
@@ -28,13 +28,15 @@
  * to be installed when some endpoints or paths are not found.
  */
 public class PartialFailureConstraint implements Constraint {
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
         return true;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java b/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
index 4839fee..98ed34c 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/constraint/WaypointConstraint.java
@@ -22,7 +22,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.intent.Constraint;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.intent.ResourceContext;
 
 import java.util.Collections;
 import java.util.LinkedList;
@@ -60,14 +60,21 @@
         return waypoints;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public double cost(Link link, LinkResourceService resourceService) {
+    public double cost(Link link, ResourceContext context) {
         // Always consider the number of hops
         return 1;
     }
 
+    // doesn't use LinkResourceService
     @Override
-    public boolean validate(Path path, LinkResourceService resourceService) {
+    public boolean validate(Path path, ResourceContext context) {
+        // explicitly call a method not depending on LinkResourceService
+        return validate(path);
+    }
+
+    private boolean validate(Path path) {
         LinkedList<DeviceId> waypoints = new LinkedList<>(this.waypoints);
         DeviceId current = waypoints.poll();
         // This is safe because Path class ensures the number of links are more than 0
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
index 5cc1b4f..f92be7b 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
@@ -16,7 +16,6 @@
 package org.onosproject.net.intent;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableSet;
 import org.onlab.util.Bandwidth;
 import org.onosproject.core.DefaultGroupId;
 import org.onosproject.core.GroupId;
@@ -36,20 +35,13 @@
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.flow.instructions.Instructions.MetadataInstruction;
-import org.onosproject.net.resource.ResourceAllocation;
-import org.onosproject.net.resource.ResourceRequest;
-import org.onosproject.net.resource.ResourceType;
-import org.onosproject.net.resource.link.BandwidthResource;
-import org.onosproject.net.resource.link.BandwidthResourceRequest;
-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.LinkResourceListener;
-import org.onosproject.net.resource.link.LinkResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.resource.link.MplsLabel;
-import org.onosproject.net.resource.link.MplsLabelResourceAllocation;
+import org.onosproject.net.newresource.DiscreteResourceId;
+import org.onosproject.net.newresource.Resource;
+import org.onosproject.net.newresource.ResourceAllocation;
+import org.onosproject.net.newresource.ResourceConsumer;
+import org.onosproject.net.newresource.ResourceId;
+import org.onosproject.net.newresource.ResourceListener;
+import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.topology.DefaultTopologyEdge;
 import org.onosproject.net.topology.DefaultTopologyVertex;
 import org.onosproject.net.topology.LinkWeight;
@@ -61,9 +53,9 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -184,145 +176,84 @@
         }
     }
 
-    public static class MockLinkResourceAllocations implements LinkResourceAllocations {
-        @Override
-        public Set<ResourceAllocation> getResourceAllocation(Link link) {
-            return ImmutableSet.of(
-                    new LambdaResourceAllocation(LambdaResource.valueOf(77)),
-                    new MplsLabelResourceAllocation(MplsLabel.valueOf(10)));
+    public static final class MockResourceService implements ResourceService {
+
+        private final double bandwidth;
+
+        public static ResourceService makeBandwidthResourceService(double bandwidth) {
+            return new MockResourceService(bandwidth);
+        }
+
+        private MockResourceService(double bandwidth) {
+            this.bandwidth = bandwidth;
         }
 
         @Override
-        public IntentId intentId() {
+        public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<Resource> resources) {
             return null;
         }
 
         @Override
-        public Collection<Link> links() {
+        public boolean release(List<ResourceAllocation> allocations) {
+            return false;
+        }
+
+        @Override
+        public boolean release(ResourceConsumer consumer) {
+            return false;
+        }
+
+        @Override
+        public List<ResourceAllocation> getResourceAllocations(ResourceId id) {
             return null;
         }
 
         @Override
-        public Set<ResourceRequest> resources() {
+        public <T> Collection<ResourceAllocation> getResourceAllocations(DiscreteResourceId parent, Class<T> cls) {
             return null;
         }
 
         @Override
-        public ResourceType type() {
+        public Collection<ResourceAllocation> getResourceAllocations(ResourceConsumer consumer) {
             return null;
         }
-    }
-
-    public static class MockedAllocationFailure extends RuntimeException { }
-
-    public static class MockResourceService implements LinkResourceService {
-
-        double availableBandwidth = -1.0;
-        int availableLambda = -1;
-
-        /**
-         * Allocates a resource service that will allow bandwidth allocations
-         * up to a limit.
-         *
-         * @param bandwidth available bandwidth limit
-         * @return resource manager for bandwidth requests
-         */
-        public static MockResourceService makeBandwidthResourceService(double bandwidth) {
-            final MockResourceService result = new MockResourceService();
-            result.availableBandwidth = bandwidth;
-            return result;
-        }
-
-        /**
-         * Allocates a resource service that will allow lambda allocations.
-         *
-         * @param lambda Lambda to return for allocation requests. Currently unused
-         * @return resource manager for lambda requests
-         */
-        public static MockResourceService makeLambdaResourceService(int lambda) {
-            final MockResourceService result = new MockResourceService();
-            result.availableLambda = lambda;
-            return result;
-        }
 
         @Override
-        public LinkResourceAllocations requestResources(LinkResourceRequest req) {
-            int lambda = -1;
-            double bandwidth = -1.0;
+        public Set<Resource> getAvailableResources(DiscreteResourceId parent) {
+            return null;
+        }
 
-            for (ResourceRequest resourceRequest : req.resources()) {
-                if (resourceRequest.type() == ResourceType.BANDWIDTH) {
-                    final BandwidthResourceRequest brr = (BandwidthResourceRequest) resourceRequest;
-                    bandwidth = brr.bandwidth().toDouble();
-                } else if (resourceRequest.type() == ResourceType.LAMBDA) {
-                    lambda = 1;
-                }
+        @Override
+        public <T> Set<Resource> getAvailableResources(DiscreteResourceId parent, Class<T> cls) {
+            return null;
+        }
+
+        @Override
+        public <T> Set<T> getAvailableResourceValues(DiscreteResourceId parent, Class<T> cls) {
+            return null;
+        }
+
+        @Override
+        public Set<Resource> getRegisteredResources(DiscreteResourceId parent) {
+            return null;
+        }
+
+        @Override
+        public boolean isAvailable(Resource resource) {
+            if (!resource.isTypeOf(Bandwidth.class)) {
+                return false;
             }
 
-            if (availableBandwidth < bandwidth) {
-                throw new MockedAllocationFailure();
-            }
-            if (lambda > 0 && availableLambda == 0) {
-                throw new MockedAllocationFailure();
-            }
-
-            return new IntentTestsMocks.MockLinkResourceAllocations();
+            Optional<Double> value = resource.valueAs(Double.class);
+            return value.filter(requested -> requested <= bandwidth).isPresent();
         }
 
         @Override
-        public void releaseResources(LinkResourceAllocations allocations) {
-            // Mock
+        public void addListener(ResourceListener listener) {
         }
 
         @Override
-        public LinkResourceAllocations updateResources(LinkResourceRequest req,
-                                                       LinkResourceAllocations oldAllocations) {
-            return null;
-        }
-
-        @Override
-        public Iterable<LinkResourceAllocations> getAllocations() {
-            return ImmutableSet.of(
-                    new IntentTestsMocks.MockLinkResourceAllocations());
-        }
-
-        @Override
-        public Iterable<LinkResourceAllocations> getAllocations(Link link) {
-            return ImmutableSet.of(
-                    new IntentTestsMocks.MockLinkResourceAllocations());
-        }
-
-        @Override
-        public LinkResourceAllocations getAllocations(IntentId intentId) {
-            return new IntentTestsMocks.MockLinkResourceAllocations();
-        }
-
-        @Override
-        public Iterable<ResourceRequest> getAvailableResources(Link link) {
-            final List<ResourceRequest> result = new LinkedList<>();
-            if (availableBandwidth > 0.0) {
-                result.add(new BandwidthResourceRequest(
-                        new BandwidthResource(Bandwidth.bps(availableBandwidth))));
-            }
-            if (availableLambda > 0) {
-                result.add(new LambdaResourceRequest());
-            }
-            return result;
-        }
-
-        @Override
-        public Iterable<ResourceRequest> getAvailableResources(Link link, LinkResourceAllocations allocations) {
-            return null;
-        }
-
-        @Override
-        public void addListener(LinkResourceListener listener) {
-
-        }
-
-        @Override
-        public void removeListener(LinkResourceListener listener) {
-
+        public void removeListener(ResourceListener listener) {
         }
     }
 
diff --git a/core/api/src/test/java/org/onosproject/net/intent/constraint/AnnotationConstraintTest.java b/core/api/src/test/java/org/onosproject/net/intent/constraint/AnnotationConstraintTest.java
index 299eaef..480d63c 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/constraint/AnnotationConstraintTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/constraint/AnnotationConstraintTest.java
@@ -23,8 +23,8 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.intent.ResourceContext;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 import static org.easymock.EasyMock.createMock;
 import static org.hamcrest.Matchers.closeTo;
@@ -51,11 +51,11 @@
 
     private AnnotationConstraint sut;
     private Link link;
-    private LinkResourceService linkResourceService;
+    private ResourceContext resourceContext;
 
     @Before
     public void setUp() {
-        linkResourceService = createMock(LinkResourceService.class);
+        resourceContext = createMock(ResourceContext.class);
 
         DefaultAnnotations annotations = DefaultAnnotations.builder().set(KEY, String.valueOf(VALUE)).build();
 
@@ -75,8 +75,8 @@
         double value = 120;
         sut = new AnnotationConstraint(KEY, value);
 
-        assertThat(sut.isValid(link, linkResourceService), is(true));
-        assertThat(sut.cost(link, linkResourceService), is(closeTo(VALUE, 1.0e-6)));
+        assertThat(sut.isValid(link, resourceContext), is(true));
+        assertThat(sut.cost(link, resourceContext), is(closeTo(VALUE, 1.0e-6)));
     }
 
     /**
@@ -87,8 +87,8 @@
         double value = 80;
         sut = new AnnotationConstraint(KEY, value);
 
-        assertThat(sut.isValid(link, linkResourceService), is(false));
-        assertThat(sut.cost(link, linkResourceService), is(lessThan(0.0)));
+        assertThat(sut.isValid(link, resourceContext), is(false));
+        assertThat(sut.cost(link, resourceContext), is(lessThan(0.0)));
     }
 
     @Test
diff --git a/core/api/src/test/java/org/onosproject/net/intent/constraint/LatencyConstraintTest.java b/core/api/src/test/java/org/onosproject/net/intent/constraint/LatencyConstraintTest.java
index a08caab..ca45d8c 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/constraint/LatencyConstraintTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/constraint/LatencyConstraintTest.java
@@ -26,8 +26,8 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.intent.ResourceContext;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
@@ -56,7 +56,7 @@
     private static final String LATENCY2 = "4.0";
 
     private LatencyConstraint sut;
-    private LinkResourceService linkResourceService;
+    private ResourceContext resourceContext;
 
     private Path path;
     private Link link1;
@@ -64,7 +64,7 @@
 
     @Before
     public void setUp() {
-        linkResourceService = createMock(LinkResourceService.class);
+        resourceContext = createMock(ResourceContext.class);
 
         Annotations annotations1 = DefaultAnnotations.builder().set(LATENCY, LATENCY1).build();
         Annotations annotations2 = DefaultAnnotations.builder().set(LATENCY, LATENCY2).build();
@@ -93,7 +93,7 @@
     public void testLessThanLatency() {
         sut = new LatencyConstraint(Duration.of(10, ChronoUnit.MICROS));
 
-        assertThat(sut.validate(path, linkResourceService), is(true));
+        assertThat(sut.validate(path, resourceContext), is(true));
     }
 
     /**
@@ -103,7 +103,7 @@
     public void testMoreThanLatency() {
         sut = new LatencyConstraint(Duration.of(3, ChronoUnit.MICROS));
 
-        assertThat(sut.validate(path, linkResourceService), is(false));
+        assertThat(sut.validate(path, resourceContext), is(false));
     }
 
     /**
@@ -113,8 +113,8 @@
     public void testCost() {
         sut = new LatencyConstraint(Duration.of(10, ChronoUnit.MICROS));
 
-        assertThat(sut.cost(link1, linkResourceService), is(closeTo(Double.parseDouble(LATENCY1), 1.0e-6)));
-        assertThat(sut.cost(link2, linkResourceService), is(closeTo(Double.parseDouble(LATENCY2), 1.0e-6)));
+        assertThat(sut.cost(link1, resourceContext), is(closeTo(Double.parseDouble(LATENCY1), 1.0e-6)));
+        assertThat(sut.cost(link2, resourceContext), is(closeTo(Double.parseDouble(LATENCY2), 1.0e-6)));
     }
 
     /**
diff --git a/core/api/src/test/java/org/onosproject/net/intent/constraint/ObstacleConstraintTest.java b/core/api/src/test/java/org/onosproject/net/intent/constraint/ObstacleConstraintTest.java
index 99cd338..c9b301a 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/constraint/ObstacleConstraintTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/constraint/ObstacleConstraintTest.java
@@ -26,8 +26,8 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.intent.ResourceContext;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 import java.util.Arrays;
 
@@ -50,7 +50,7 @@
     private static final PortNumber PN4 = PortNumber.portNumber(4);
     private static final ProviderId PROVIDER_ID = new ProviderId("of", "foo");
 
-    private LinkResourceService linkResourceService;
+    private ResourceContext resourceContext;
 
     private Path path;
     private DefaultLink link2;
@@ -60,7 +60,7 @@
 
     @Before
     public void setUp() {
-        linkResourceService = createMock(LinkResourceService.class);
+        resourceContext = createMock(ResourceContext.class);
 
         link1 = DefaultLink.builder()
                 .providerId(PROVIDER_ID)
@@ -97,7 +97,7 @@
     public void testPathNotThroughObstacles() {
         sut = new ObstacleConstraint(DID4);
 
-        assertThat(sut.validate(path, linkResourceService), is(true));
+        assertThat(sut.validate(path, resourceContext), is(true));
     }
 
     /**
@@ -107,6 +107,6 @@
     public void testPathThroughObstacle() {
         sut = new ObstacleConstraint(DID1);
 
-        assertThat(sut.validate(path, linkResourceService), is(false));
+        assertThat(sut.validate(path, resourceContext), is(false));
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/intent/constraint/WaypointConstraintTest.java b/core/api/src/test/java/org/onosproject/net/intent/constraint/WaypointConstraintTest.java
index bbd10a6..668614a 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/constraint/WaypointConstraintTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/constraint/WaypointConstraintTest.java
@@ -24,8 +24,8 @@
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.ResourceContext;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.resource.link.LinkResourceService;
 
 import java.util.Arrays;
 
@@ -52,7 +52,7 @@
     private static final ProviderId PROVIDER_ID = new ProviderId("of", "foo");
 
     private WaypointConstraint sut;
-    private LinkResourceService linkResourceService;
+    private ResourceContext resourceContext;
 
     private Path path;
     private DefaultLink link2;
@@ -60,7 +60,7 @@
 
     @Before
     public void setUp() {
-        linkResourceService = createMock(LinkResourceService.class);
+        resourceContext = createMock(ResourceContext.class);
 
         link1 = DefaultLink.builder()
                 .providerId(PROVIDER_ID)
@@ -85,7 +85,7 @@
     public void testSatisfyWaypoints() {
         sut = new WaypointConstraint(DID1, DID2, DID3);
 
-        assertThat(sut.validate(path, linkResourceService), is(true));
+        assertThat(sut.validate(path, resourceContext), is(true));
     }
 
     /**
@@ -95,7 +95,7 @@
     public void testNotSatisfyWaypoint() {
         sut = new WaypointConstraint(DID4);
 
-        assertThat(sut.validate(path, linkResourceService), is(false));
+        assertThat(sut.validate(path, resourceContext), is(false));
     }
 
     @Test
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
index 6de4cfd..69101a9 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
@@ -27,8 +27,8 @@
 import org.onosproject.net.intent.IntentCompiler;
 import org.onosproject.net.intent.IntentExtensionService;
 import org.onosproject.net.intent.impl.PathNotFoundException;
+import org.onosproject.net.newresource.ResourceService;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.resource.link.LinkResourceService;
 import org.onosproject.net.topology.LinkWeight;
 import org.onosproject.net.topology.PathService;
 import org.onosproject.net.topology.TopologyEdge;
@@ -55,7 +55,7 @@
     protected PathService pathService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LinkResourceService resourceService;
+    protected ResourceService resourceService;
 
     /**
      * Returns an edge-weight capable of evaluating links on the basis of the
@@ -77,7 +77,7 @@
      */
     protected boolean checkPath(Path path, List<Constraint> constraints) {
         for (Constraint constraint : constraints) {
-            if (!constraint.validate(path, resourceService)) {
+            if (!constraint.validate(path, resourceService::isAvailable)) {
                 return false;
             }
         }
@@ -138,9 +138,9 @@
             // the first one with fast fail over the first failure
             Iterator<Constraint> it = constraints.iterator();
 
-            double cost = it.next().cost(edge.link(), resourceService);
+            double cost = it.next().cost(edge.link(), resourceService::isAvailable);
             while (it.hasNext() && cost > 0) {
-                if (it.next().cost(edge.link(), resourceService) < 0) {
+                if (it.next().cost(edge.link(), resourceService::isAvailable) < 0) {
                     return -1;
                 }
             }
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompilerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompilerTest.java
index 5588904..4eef4f2 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompilerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompilerTest.java
@@ -110,6 +110,7 @@
                 new HostToHostIntentCompiler();
         compiler.pathService = new IntentTestsMocks.MockPathService(hops);
         compiler.hostService = mockHostService;
+        compiler.resourceService = new MockResourceService();
         return compiler;
     }
 
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
index c38ea53..f42e179 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompilerTest.java
@@ -33,7 +33,7 @@
 import org.onosproject.net.intent.PointToPointIntent;
 import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import org.onosproject.net.intent.impl.PathNotFoundException;
-import org.onosproject.net.resource.link.LinkResourceService;
+import org.onosproject.net.newresource.ResourceService;
 
 import java.util.Collections;
 import java.util.List;
@@ -118,7 +118,7 @@
      * @param resourceService service to use for resource allocation requests
      * @return point to point compiler
      */
-    private PointToPointIntentCompiler makeCompiler(String[] hops, LinkResourceService resourceService) {
+    private PointToPointIntentCompiler makeCompiler(String[] hops, ResourceService resourceService) {
         final PointToPointIntentCompiler compiler = new PointToPointIntentCompiler();
         compiler.resourceService = resourceService;
         compiler.pathService = new IntentTestsMocks.MockPathService(hops);
@@ -223,7 +223,7 @@
     @Test
     public void testBandwidthConstrainedIntentSuccess() {
 
-        final LinkResourceService resourceService =
+        final ResourceService resourceService =
                 IntentTestsMocks.MockResourceService.makeBandwidthResourceService(1000.0);
         final List<Constraint> constraints =
                 Collections.singletonList(new BandwidthConstraint(Bandwidth.bps(100.0)));
@@ -245,7 +245,7 @@
     @Test
     public void testBandwidthConstrainedIntentFailure() {
 
-        final LinkResourceService resourceService =
+        final ResourceService resourceService =
                 IntentTestsMocks.MockResourceService.makeBandwidthResourceService(10.0);
         final List<Constraint> constraints =
                 Collections.singletonList(new BandwidthConstraint(Bandwidth.bps(100.0)));