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