Vector cost proposed to TST on 2016-07-13
First part implemented: weight interface introduced and integrated, default weight implementation added.
Change-Id: Ia46f1b44139069aa171a3c13faf168351bd7cc56
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 cb57aee..81e0fcc8 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
@@ -20,6 +20,9 @@
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.graph.DefaultEdgeWeigher;
+import org.onlab.graph.ScalarWeight;
+import org.onlab.graph.Weight;
import org.onosproject.net.DisjointPath;
import org.onosproject.net.ElementId;
import org.onosproject.net.Path;
@@ -30,9 +33,10 @@
import org.onosproject.net.intent.impl.PathNotFoundException;
import org.onosproject.net.resource.ResourceQueryService;
import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.topology.LinkWeight;
+import org.onosproject.net.topology.LinkWeigher;
import org.onosproject.net.topology.PathService;
import org.onosproject.net.topology.TopologyEdge;
+import org.onosproject.net.topology.TopologyVertex;
import java.util.Collections;
import java.util.Iterator;
@@ -65,8 +69,8 @@
* @param constraints path constraints
* @return edge-weight function
*/
- protected LinkWeight weight(List<Constraint> constraints) {
- return new ConstraintBasedLinkWeight(constraints);
+ protected LinkWeigher weigher(List<Constraint> constraints) {
+ return new ConstraintBasedLinkWeigher(constraints);
}
/**
@@ -115,7 +119,7 @@
*/
protected Path getPath(ConnectivityIntent intent,
ElementId one, ElementId two) {
- Set<Path> paths = pathService.getPaths(one, two, weight(intent.constraints()));
+ Set<Path> paths = pathService.getPaths(one, two, weigher(intent.constraints()));
final List<Constraint> constraints = intent.constraints();
ImmutableList<Path> filtered = FluentIterable.from(paths)
.filter(path -> checkPath(path, constraints))
@@ -138,7 +142,7 @@
*/
protected DisjointPath getDisjointPath(ConnectivityIntent intent,
ElementId one, ElementId two) {
- Set<DisjointPath> paths = pathService.getDisjointPaths(one, two, weight(intent.constraints()));
+ Set<DisjointPath> paths = pathService.getDisjointPaths(one, two, weigher(intent.constraints()));
final List<Constraint> constraints = intent.constraints();
ImmutableList<DisjointPath> filtered = FluentIterable.from(paths)
.filter(path -> checkPath(path, constraints))
@@ -153,7 +157,8 @@
/**
* Edge-weight capable of evaluating link cost using a set of constraints.
*/
- protected class ConstraintBasedLinkWeight implements LinkWeight {
+ protected class ConstraintBasedLinkWeigher extends DefaultEdgeWeigher<TopologyVertex, TopologyEdge>
+ implements LinkWeigher {
private final List<Constraint> constraints;
@@ -163,7 +168,7 @@
*
* @param constraints path constraints
*/
- ConstraintBasedLinkWeight(List<Constraint> constraints) {
+ ConstraintBasedLinkWeigher(List<Constraint> constraints) {
if (constraints == null) {
this.constraints = Collections.emptyList();
} else {
@@ -172,23 +177,23 @@
}
@Override
- public double weight(TopologyEdge edge) {
+ public Weight weight(TopologyEdge edge) {
// iterate over all constraints in order and return the weight of
// the first one with fast fail over the first failure
Iterator<Constraint> it = constraints.iterator();
if (!it.hasNext()) {
- return 1.0;
+ return new ScalarWeight(HOP_WEIGHT_VALUE);
}
double cost = it.next().cost(edge.link(), resourceService::isAvailable);
while (it.hasNext() && cost > 0) {
if (it.next().cost(edge.link(), resourceService::isAvailable) < 0) {
- return -1;
+ cost = -1;
}
}
- return cost;
+ return new ScalarWeight(cost);
}
}
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java b/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
index 5c41ff4..ec650da 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
@@ -26,6 +26,7 @@
import org.onosproject.net.Link;
import org.onosproject.net.Path;
import org.onosproject.net.host.HostService;
+import org.onosproject.net.topology.LinkWeigher;
import org.onosproject.net.topology.LinkWeight;
import org.onosproject.net.topology.PathService;
import org.onosproject.net.topology.TopologyService;
@@ -74,7 +75,7 @@
public Set<Path> getPaths(ElementId src, ElementId dst) {
checkPermission(TOPOLOGY_READ);
- return getPaths(src, dst, null);
+ return getPaths(src, dst, (LinkWeigher) null);
}
@Override
@@ -83,11 +84,17 @@
return super.getPaths(src, dst, weight);
}
+ @Override
+ public Set<Path> getPaths(ElementId src, ElementId dst, LinkWeigher weigher) {
+ checkPermission(TOPOLOGY_READ);
+ return super.getPaths(src, dst, weigher);
+ }
+
@Override
public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst) {
checkPermission(TOPOLOGY_READ);
- return getDisjointPaths(src, dst, (LinkWeight) null);
+ return getDisjointPaths(src, dst, (LinkWeigher) null);
}
@Override
@@ -97,10 +104,16 @@
}
@Override
+ public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeigher weigher) {
+ checkPermission(TOPOLOGY_READ);
+ return super.getDisjointPaths(src, dst, weigher);
+ }
+
+ @Override
public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst,
Map<Link, Object> riskProfile) {
checkPermission(TOPOLOGY_READ);
- return getDisjointPaths(src, dst, null, riskProfile);
+ return getDisjointPaths(src, dst, (LinkWeigher) null, riskProfile);
}
@Override
@@ -110,4 +123,11 @@
return super.getDisjointPaths(src, dst, weight, riskProfile);
}
+ @Override
+ public Set<DisjointPath> getDisjointPaths(ElementId src, ElementId dst, LinkWeigher weigher,
+ Map<Link, Object> riskProfile) {
+ checkPermission(TOPOLOGY_READ);
+ return super.getDisjointPaths(src, dst, weigher, riskProfile);
+ }
+
}
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java b/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
index 4203a8e..ecf7e25 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
@@ -31,6 +31,7 @@
import org.onosproject.net.provider.AbstractProviderService;
import org.onosproject.net.topology.ClusterId;
import org.onosproject.net.topology.GraphDescription;
+import org.onosproject.net.topology.LinkWeigher;
import org.onosproject.net.topology.LinkWeight;
import org.onosproject.net.topology.Topology;
import org.onosproject.net.topology.TopologyCluster;
@@ -50,6 +51,7 @@
import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.topology.AdapterLinkWeigher.adapt;
import static org.onosproject.security.AppGuard.checkPermission;
import static org.slf4j.LoggerFactory.getLogger;
import static org.onosproject.security.AppPermission.Type.*;
@@ -154,18 +156,26 @@
}
@Override
- public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
+ public Set<Path> getPaths(Topology topology, DeviceId src,
+ DeviceId dst, LinkWeight weight) {
+ return getPaths(topology, src, dst, adapt(weight));
+ }
+
+ @Override
+ public Set<Path> getPaths(Topology topology, DeviceId src,
+ DeviceId dst, LinkWeigher weigher) {
checkPermission(TOPOLOGY_READ);
checkNotNull(topology, TOPOLOGY_NULL);
checkNotNull(src, DEVICE_ID_NULL);
checkNotNull(dst, DEVICE_ID_NULL);
- checkNotNull(weight, "Link weight cannot be null");
- return store.getPaths(topology, src, dst, weight);
+ checkNotNull(weigher, "Link weight cannot be null");
+ return store.getPaths(topology, src, dst, weigher);
}
@Override
- public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst) {
+ public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
+ DeviceId dst) {
checkPermission(TOPOLOGY_READ);
checkNotNull(topology, TOPOLOGY_NULL);
checkNotNull(src, DEVICE_ID_NULL);
@@ -175,17 +185,26 @@
@Override
public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
- DeviceId dst, LinkWeight weight) {
+ DeviceId dst,
+ LinkWeight weight) {
+ return getDisjointPaths(topology, src, dst, adapt(weight));
+ }
+
+ @Override
+ public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
+ DeviceId dst,
+ LinkWeigher weigher) {
checkPermission(TOPOLOGY_READ);
checkNotNull(topology, TOPOLOGY_NULL);
checkNotNull(src, DEVICE_ID_NULL);
checkNotNull(dst, DEVICE_ID_NULL);
- checkNotNull(weight, LINK_WEIGHT_NULL);
- return store.getDisjointPaths(topology, src, dst, weight);
+ checkNotNull(weigher, LINK_WEIGHT_NULL);
+ return store.getDisjointPaths(topology, src, dst, weigher);
}
@Override
- public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src, DeviceId dst,
+ public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
+ DeviceId dst,
Map<Link, Object> riskProfile) {
checkPermission(TOPOLOGY_READ);
checkNotNull(topology, TOPOLOGY_NULL);
@@ -198,12 +217,20 @@
public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
DeviceId dst, LinkWeight weight,
Map<Link, Object> riskProfile) {
+ return getDisjointPaths(topology, src, dst, adapt(weight), riskProfile);
+ }
+
+ @Override
+ public Set<DisjointPath> getDisjointPaths(Topology topology, DeviceId src,
+ DeviceId dst,
+ LinkWeigher weigher,
+ Map<Link, Object> riskProfile) {
checkPermission(TOPOLOGY_READ);
checkNotNull(topology, TOPOLOGY_NULL);
checkNotNull(src, DEVICE_ID_NULL);
checkNotNull(dst, DEVICE_ID_NULL);
- checkNotNull(weight, LINK_WEIGHT_NULL);
- return store.getDisjointPaths(topology, src, dst, weight, riskProfile);
+ checkNotNull(weigher, LINK_WEIGHT_NULL);
+ return store.getDisjointPaths(topology, src, dst, weigher, riskProfile);
}
@Override