Refactoring to eliminate duplicate DefaultTopology and DefaultTopologyGraph; eliminating a few fixmes.
Change-Id: I4461b6f1c8ae60d39f5da909bf6995294cbfa84d
diff --git a/core/api/src/main/java/org/onosproject/net/topology/DefaultGraphDescription.java b/core/api/src/main/java/org/onosproject/net/topology/DefaultGraphDescription.java
index ed4ae32..d635d74 100644
--- a/core/api/src/main/java/org/onosproject/net/topology/DefaultGraphDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/topology/DefaultGraphDescription.java
@@ -15,10 +15,8 @@
*/
package org.onosproject.net.topology;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Map;
-
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
import org.onosproject.net.AbstractDescription;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.Device;
@@ -27,14 +25,15 @@
import org.onosproject.net.SparseAnnotations;
import org.slf4j.Logger;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
+import java.util.Map;
+
+import static org.slf4j.LoggerFactory.getLogger;
/**
* Default implementation of an immutable topology graph data carrier.
*/
public class DefaultGraphDescription extends AbstractDescription
-implements GraphDescription {
+ implements GraphDescription {
private static final Logger log = getLogger(DefaultGraphDescription.class);
@@ -43,26 +42,22 @@
private final ImmutableSet<TopologyVertex> vertexes;
private final ImmutableSet<TopologyEdge> edges;
- private final Map<DeviceId, TopologyVertex> vertexesById = Maps
- .newHashMap();
+ private final Map<DeviceId, TopologyVertex> vertexesById = Maps.newHashMap();
/**
* Creates a minimal topology graph description to allow core to construct
* and process the topology graph.
*
- * @param nanos time in nanos of when the topology description was created
- *
- * @param devices collection of infrastructure devices
- *
- * @param links collection of infrastructure links
- *
+ * @param nanos time in nanos of when the topology description was created
+ * @param devices collection of infrastructure devices
+ * @param links collection of infrastructure links
* @param annotations optional key/value annotations map
* @deprecated in Cardinal Release
*/
@Deprecated
public DefaultGraphDescription(long nanos, Iterable<Device> devices,
- Iterable<Link> links,
- SparseAnnotations... annotations) {
+ Iterable<Link> links,
+ SparseAnnotations... annotations) {
this(nanos, System.currentTimeMillis(), devices, links, annotations);
}
@@ -70,21 +65,16 @@
* Creates a minimal topology graph description to allow core to construct
* and process the topology graph.
*
- * @param nanos time in nanos of when the topology description was created
- *
- * @param millis time in millis of when the topology description was created
- *
- * @param devices collection of infrastructure devices
- *
- * @param links collection of infrastructure links
- *
+ * @param nanos time in nanos of when the topology description was created
+ * @param millis time in millis of when the topology description was created
+ * @param devices collection of infrastructure devices
+ * @param links collection of infrastructure links
* @param annotations optional key/value annotations map
- *
*/
public DefaultGraphDescription(long nanos, long millis,
- Iterable<Device> devices,
- Iterable<Link> links,
- SparseAnnotations... annotations) {
+ Iterable<Device> devices,
+ Iterable<Link> links,
+ SparseAnnotations... annotations) {
super(annotations);
this.nanos = nanos;
this.creationTime = millis;
@@ -114,8 +104,7 @@
}
// Builds a set of topology vertexes from the specified list of devices
- private ImmutableSet<TopologyVertex>
- buildVertexes(Iterable<Device> devices) {
+ private ImmutableSet<TopologyVertex> buildVertexes(Iterable<Device> devices) {
ImmutableSet.Builder<TopologyVertex> vertexes = ImmutableSet.builder();
for (Device device : devices) {
TopologyVertex vertex = new DefaultTopologyVertex(device.id());
diff --git a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopology.java b/core/common/src/main/java/org/onosproject/common/DefaultTopology.java
similarity index 91%
rename from core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopology.java
rename to core/common/src/main/java/org/onosproject/common/DefaultTopology.java
index 639e2a0..51857c7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopology.java
+++ b/core/common/src/main/java/org/onosproject/common/DefaultTopology.java
@@ -13,20 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.store.topology.impl;
+package org.onosproject.common;
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
-import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
-import static org.onosproject.net.Link.State.ACTIVE;
-import static org.onosproject.net.Link.State.INACTIVE;
-import static org.onosproject.net.Link.Type.INDIRECT;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.ImmutableSetMultimap.Builder;
import org.onlab.graph.DijkstraGraphSearch;
import org.onlab.graph.GraphPathSearch;
import org.onlab.graph.GraphPathSearch.Result;
@@ -50,14 +44,18 @@
import org.onosproject.net.topology.TopologyGraph;
import org.onosproject.net.topology.TopologyVertex;
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.ImmutableSetMultimap.Builder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
-// FIXME: Move to onos-core-common when ready
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
+import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
+import static org.onosproject.net.Link.State.ACTIVE;
+import static org.onosproject.net.Link.State.INACTIVE;
+import static org.onosproject.net.Link.Type.INDIRECT;
+
/**
* Default implementation of the topology descriptor. This carries the backing
* topology data.
@@ -83,19 +81,17 @@
/**
* Creates a topology descriptor attributed to the specified provider.
*
- * @param providerId
- * identity of the provider
- * @param description
- * data describing the new topology
+ * @param providerId identity of the provider
+ * @param description data describing the new topology
*/
- DefaultTopology(ProviderId providerId, GraphDescription description) {
+ public DefaultTopology(ProviderId providerId, GraphDescription description) {
super(providerId);
this.time = description.timestamp();
this.creationTime = description.creationTime();
// Build the graph
this.graph = new DefaultTopologyGraph(description.vertexes(),
- description.edges());
+ description.edges());
this.clusterResults = Suppliers.memoize(() -> searchForClusters());
this.clusters = Suppliers.memoize(() -> buildTopologyClusters());
@@ -104,8 +100,7 @@
this.weight = new HopCountLinkWeight(graph.getVertexes().size());
this.broadcastSets = Suppliers.memoize(() -> buildBroadcastSets());
- this.infrastructurePoints = Suppliers
- .memoize(() -> findInfrastructurePoints());
+ this.infrastructurePoints = Suppliers.memoize(() -> findInfrastructurePoints());
this.computeCost = Math.max(0, System.nanoTime() - time);
}
@@ -156,7 +151,7 @@
*
* @return topology graph
*/
- TopologyGraph getGraph() {
+ public TopologyGraph getGraph() {
return graph;
}
@@ -165,7 +160,7 @@
*
* @return set of clusters
*/
- Set<TopologyCluster> getClusters() {
+ public Set<TopologyCluster> getClusters() {
return ImmutableSet.copyOf(clusters.get().values());
}
@@ -173,10 +168,9 @@
* Returns the specified topology cluster.
*
* @param clusterId cluster identifier
- *
* @return topology cluster
*/
- TopologyCluster getCluster(ClusterId clusterId) {
+ public TopologyCluster getCluster(ClusterId clusterId) {
return clusters.get().get(clusterId);
}
@@ -184,10 +178,9 @@
* Returns the topology cluster that contains the given device.
*
* @param deviceId device identifier
- *
* @return topology cluster
*/
- TopologyCluster getCluster(DeviceId deviceId) {
+ public TopologyCluster getCluster(DeviceId deviceId) {
return clustersByDevice().get(deviceId);
}
@@ -195,10 +188,9 @@
* Returns the set of cluster devices.
*
* @param cluster topology cluster
- *
* @return cluster devices
*/
- Set<DeviceId> getClusterDevices(TopologyCluster cluster) {
+ public Set<DeviceId> getClusterDevices(TopologyCluster cluster) {
return devicesByCluster().get(cluster);
}
@@ -206,10 +198,9 @@
* Returns the set of cluster links.
*
* @param cluster topology cluster
- *
* @return cluster links
*/
- Set<Link> getClusterLinks(TopologyCluster cluster) {
+ public Set<Link> getClusterLinks(TopologyCluster cluster) {
return linksByCluster().get(cluster);
}
@@ -217,10 +208,9 @@
* Indicates whether the given point is an infrastructure link end-point.
*
* @param connectPoint connection point
- *
* @return true if infrastructure
*/
- boolean isInfrastructure(ConnectPoint connectPoint) {
+ public boolean isInfrastructure(ConnectPoint connectPoint) {
return infrastructurePoints.get().contains(connectPoint);
}
@@ -228,10 +218,9 @@
* Indicates whether the given point is part of a broadcast set.
*
* @param connectPoint connection point
- *
* @return true if in broadcast set
*/
- boolean isBroadcastPoint(ConnectPoint connectPoint) {
+ public boolean isBroadcastPoint(ConnectPoint connectPoint) {
// Any non-infrastructure, i.e. edge points are assumed to be OK.
if (!isInfrastructure(connectPoint)) {
return true;
@@ -241,7 +230,7 @@
TopologyCluster cluster = clustersByDevice().get(connectPoint.deviceId());
if (cluster == null) {
throw new IllegalArgumentException("No cluster found for device "
- + connectPoint.deviceId());
+ + connectPoint.deviceId());
}
// If the broadcast set is null or empty, or if the point explicitly
@@ -254,10 +243,9 @@
* Returns the size of the cluster broadcast set.
*
* @param clusterId cluster identifier
- *
* @return size of the cluster broadcast set
*/
- int broadcastSetSize(ClusterId clusterId) {
+ public int broadcastSetSize(ClusterId clusterId) {
return broadcastSets.get().get(clusterId).size();
}
@@ -266,12 +254,10 @@
* destination devices.
*
* @param src source device
- *
* @param dst destination device
- *
* @return set of shortest paths
*/
- Set<Path> getPaths(DeviceId src, DeviceId dst) {
+ public Set<Path> getPaths(DeviceId src, DeviceId dst) {
return getPaths(src, dst, null);
}
@@ -279,15 +265,12 @@
* Computes on-demand the set of shortest paths between source and
* destination devices.
*
- * @param src source device
- *
- * @param dst destination device
- *
+ * @param src source device
+ * @param dst destination device
* @param weight link weight function
- *
* @return set of shortest paths
*/
- Set<Path> getPaths(DeviceId src, DeviceId dst, LinkWeight weight) {
+ public Set<Path> getPaths(DeviceId src, DeviceId dst, LinkWeight weight) {
final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src);
final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst);
Set<TopologyVertex> vertices = graph.getVertexes();
@@ -470,10 +453,9 @@
final ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster;
final ImmutableSetMultimap<TopologyCluster, Link> linksByCluster;
- public ClusterIndexes(
- ImmutableMap<DeviceId, TopologyCluster> clustersByDevice,
- ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster,
- ImmutableSetMultimap<TopologyCluster, Link> linksByCluster) {
+ public ClusterIndexes(ImmutableMap<DeviceId, TopologyCluster> clustersByDevice,
+ ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster,
+ ImmutableSetMultimap<TopologyCluster, Link> linksByCluster) {
this.clustersByDevice = clustersByDevice;
this.devicesByCluster = devicesByCluster;
this.linksByCluster = linksByCluster;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopologyGraph.java b/core/common/src/main/java/org/onosproject/common/DefaultTopologyGraph.java
similarity index 96%
rename from core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopologyGraph.java
rename to core/common/src/main/java/org/onosproject/common/DefaultTopologyGraph.java
index cbe73ad..b06065e 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopologyGraph.java
+++ b/core/common/src/main/java/org/onosproject/common/DefaultTopologyGraph.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.store.topology.impl;
+package org.onosproject.common;
import org.onlab.graph.AdjacencyListsGraph;
import org.onosproject.net.topology.TopologyEdge;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyTest.java b/core/common/src/test/java/org/onosproject/common/DefaultTopologyTest.java
similarity index 98%
rename from core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyTest.java
rename to core/common/src/test/java/org/onosproject/common/DefaultTopologyTest.java
index 3ff340a..4d435cf 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyTest.java
+++ b/core/common/src/test/java/org/onosproject/common/DefaultTopologyTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.store.trivial;
+package org.onosproject.common;
import org.junit.Before;
import org.junit.Test;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopology.java b/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopology.java
deleted file mode 100644
index 9f436b6..0000000
--- a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopology.java
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * Copyright 2014-2015 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.store.trivial;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
-import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
-import static org.onosproject.net.Link.State.ACTIVE;
-import static org.onosproject.net.Link.State.INACTIVE;
-import static org.onosproject.net.Link.Type.INDIRECT;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.onlab.graph.DijkstraGraphSearch;
-import org.onlab.graph.GraphPathSearch;
-import org.onlab.graph.GraphPathSearch.Result;
-import org.onlab.graph.TarjanGraphSearch;
-import org.onlab.graph.TarjanGraphSearch.SCCResult;
-import org.onosproject.net.AbstractModel;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DefaultPath;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.net.Path;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.topology.ClusterId;
-import org.onosproject.net.topology.DefaultTopologyCluster;
-import org.onosproject.net.topology.DefaultTopologyVertex;
-import org.onosproject.net.topology.GraphDescription;
-import org.onosproject.net.topology.LinkWeight;
-import org.onosproject.net.topology.Topology;
-import org.onosproject.net.topology.TopologyCluster;
-import org.onosproject.net.topology.TopologyEdge;
-import org.onosproject.net.topology.TopologyGraph;
-import org.onosproject.net.topology.TopologyVertex;
-
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.ImmutableSetMultimap.Builder;
-
-// FIXME: Move to onos-core-common when ready
-/**
- * Default implementation of the topology descriptor. This carries the backing
- * topology data.
- */
-public class DefaultTopology extends AbstractModel implements Topology {
-
- private static final DijkstraGraphSearch<TopologyVertex, TopologyEdge> DIJKSTRA = new DijkstraGraphSearch<>();
- private static final TarjanGraphSearch<TopologyVertex, TopologyEdge> TARJAN = new TarjanGraphSearch<>();
-
- private final long time;
- private final long creationTime;
- private final long computeCost;
- private final TopologyGraph graph;
-
- private final LinkWeight weight;
- private final Supplier<SCCResult<TopologyVertex, TopologyEdge>> clusterResults;
- private final Supplier<ImmutableMap<ClusterId, TopologyCluster>> clusters;
- private final Supplier<ImmutableSet<ConnectPoint>> infrastructurePoints;
- private final Supplier<ImmutableSetMultimap<ClusterId, ConnectPoint>> broadcastSets;
-
- private final Supplier<ClusterIndexes> clusterIndexes;
-
- /**
- * Creates a topology descriptor attributed to the specified provider.
- *
- * @param providerId
- * identity of the provider
- * @param description
- * data describing the new topology
- */
- DefaultTopology(ProviderId providerId, GraphDescription description) {
- super(providerId);
- this.time = description.timestamp();
- this.creationTime = description.creationTime();
-
- // Build the graph
- this.graph = new DefaultTopologyGraph(description.vertexes(),
- description.edges());
-
- this.clusterResults = Suppliers.memoize(() -> searchForClusters());
- this.clusters = Suppliers.memoize(() -> buildTopologyClusters());
-
- this.clusterIndexes = Suppliers.memoize(() -> buildIndexes());
-
- this.weight = new HopCountLinkWeight(graph.getVertexes().size());
- this.broadcastSets = Suppliers.memoize(() -> buildBroadcastSets());
- this.infrastructurePoints = Suppliers
- .memoize(() -> findInfrastructurePoints());
- this.computeCost = Math.max(0, System.nanoTime() - time);
- }
-
- @Override
- public long time() {
- return time;
- }
-
- @Override
- public long creationTime() {
- return creationTime;
- }
-
- @Override
- public long computeCost() {
- return computeCost;
- }
-
- @Override
- public int clusterCount() {
- return clusters.get().size();
- }
-
- @Override
- public int deviceCount() {
- return graph.getVertexes().size();
- }
-
- @Override
- public int linkCount() {
- return graph.getEdges().size();
- }
-
- private ImmutableMap<DeviceId, TopologyCluster> clustersByDevice() {
- return clusterIndexes.get().clustersByDevice;
- }
-
- private ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster() {
- return clusterIndexes.get().devicesByCluster;
- }
-
- private ImmutableSetMultimap<TopologyCluster, Link> linksByCluster() {
- return clusterIndexes.get().linksByCluster;
- }
-
- /**
- * Returns the backing topology graph.
- *
- * @return topology graph
- */
- TopologyGraph getGraph() {
- return graph;
- }
-
- /**
- * Returns the set of topology clusters.
- *
- * @return set of clusters
- */
- Set<TopologyCluster> getClusters() {
- return ImmutableSet.copyOf(clusters.get().values());
- }
-
- /**
- * Returns the specified topology cluster.
- *
- * @param clusterId cluster identifier
- *
- * @return topology cluster
- */
- TopologyCluster getCluster(ClusterId clusterId) {
- return clusters.get().get(clusterId);
- }
-
- /**
- * Returns the topology cluster that contains the given device.
- *
- * @param deviceId device identifier
- *
- * @return topology cluster
- */
- TopologyCluster getCluster(DeviceId deviceId) {
- return clustersByDevice().get(deviceId);
- }
-
- /**
- * Returns the set of cluster devices.
- *
- * @param cluster topology cluster
- *
- * @return cluster devices
- */
- Set<DeviceId> getClusterDevices(TopologyCluster cluster) {
- return devicesByCluster().get(cluster);
- }
-
- /**
- * Returns the set of cluster links.
- *
- * @param cluster topology cluster
- *
- * @return cluster links
- */
- Set<Link> getClusterLinks(TopologyCluster cluster) {
- return linksByCluster().get(cluster);
- }
-
- /**
- * Indicates whether the given point is an infrastructure link end-point.
- *
- * @param connectPoint connection point
- *
- * @return true if infrastructure
- */
- boolean isInfrastructure(ConnectPoint connectPoint) {
- return infrastructurePoints.get().contains(connectPoint);
- }
-
- /**
- * Indicates whether the given point is part of a broadcast set.
- *
- * @param connectPoint connection point
- *
- * @return true if in broadcast set
- */
- boolean isBroadcastPoint(ConnectPoint connectPoint) {
- // Any non-infrastructure, i.e. edge points are assumed to be OK.
- if (!isInfrastructure(connectPoint)) {
- return true;
- }
-
- // Find the cluster to which the device belongs.
- TopologyCluster cluster = clustersByDevice().get(connectPoint.deviceId());
- if (cluster == null) {
- throw new IllegalArgumentException("No cluster found for device "
- + connectPoint.deviceId());
- }
-
- // If the broadcast set is null or empty, or if the point explicitly
- // belongs to it, return true;
- Set<ConnectPoint> points = broadcastSets.get().get(cluster.id());
- return (points == null) || points.isEmpty() || points.contains(connectPoint);
- }
-
- /**
- * Returns the size of the cluster broadcast set.
- *
- * @param clusterId cluster identifier
- *
- * @return size of the cluster broadcast set
- */
- int broadcastSetSize(ClusterId clusterId) {
- return broadcastSets.get().get(clusterId).size();
- }
-
- /**
- * Returns the set of pre-computed shortest paths between source and
- * destination devices.
- *
- * @param src source device
- *
- * @param dst destination device
- *
- * @return set of shortest paths
- */
- Set<Path> getPaths(DeviceId src, DeviceId dst) {
- return getPaths(src, dst, null);
- }
-
- /**
- * Computes on-demand the set of shortest paths between source and
- * destination devices.
- *
- * @param src source device
- *
- * @param dst destination device
- *
- * @param weight link weight function
- *
- * @return set of shortest paths
- */
- Set<Path> getPaths(DeviceId src, DeviceId dst, LinkWeight weight) {
- final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src);
- final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst);
- Set<TopologyVertex> vertices = graph.getVertexes();
- if (!vertices.contains(srcV) || !vertices.contains(dstV)) {
- // src or dst not part of the current graph
- return ImmutableSet.of();
- }
-
- GraphPathSearch.Result<TopologyVertex, TopologyEdge> result =
- DIJKSTRA.search(graph, srcV, dstV, weight, ALL_PATHS);
- ImmutableSet.Builder<Path> builder = ImmutableSet.builder();
- for (org.onlab.graph.Path<TopologyVertex, TopologyEdge> path : result.paths()) {
- builder.add(networkPath(path));
- }
- return builder.build();
- }
-
- // Converts graph path to a network path with the same cost.
- private Path networkPath(org.onlab.graph.Path<TopologyVertex, TopologyEdge> path) {
- List<Link> links = new ArrayList<>();
- for (TopologyEdge edge : path.edges()) {
- links.add(edge.link());
- }
- return new DefaultPath(CORE_PROVIDER_ID, links, path.cost());
- }
-
- // Searches for SCC clusters in the network topology graph using Tarjan
- // algorithm.
- private SCCResult<TopologyVertex, TopologyEdge> searchForClusters() {
- return TARJAN.search(graph, new NoIndirectLinksWeight());
- }
-
- // Builds the topology clusters and returns the id-cluster bindings.
- private ImmutableMap<ClusterId, TopologyCluster> buildTopologyClusters() {
- ImmutableMap.Builder<ClusterId, TopologyCluster> clusterBuilder = ImmutableMap.builder();
- SCCResult<TopologyVertex, TopologyEdge> results = clusterResults.get();
- // Extract both vertexes and edges from the results; the lists form
- // pairs along the same index.
- List<Set<TopologyVertex>> clusterVertexes = results.clusterVertexes();
- List<Set<TopologyEdge>> clusterEdges = results.clusterEdges();
-
- // Scan over the lists and create a cluster from the results.
- for (int i = 0, n = results.clusterCount(); i < n; i++) {
- Set<TopologyVertex> vertexSet = clusterVertexes.get(i);
- Set<TopologyEdge> edgeSet = clusterEdges.get(i);
-
- ClusterId cid = ClusterId.clusterId(i);
- DefaultTopologyCluster cluster = new DefaultTopologyCluster(cid,
- vertexSet.size(),
- edgeSet.size(),
- findRoot(vertexSet));
- clusterBuilder.put(cid, cluster);
- }
- return clusterBuilder.build();
- }
-
- // Finds the vertex whose device id is the lexicographical minimum in the
- // specified set.
- private TopologyVertex findRoot(Set<TopologyVertex> vertexSet) {
- TopologyVertex minVertex = null;
- for (TopologyVertex vertex : vertexSet) {
- if ((minVertex == null) || (minVertex.deviceId().toString()
- .compareTo(minVertex.deviceId().toString()) < 0)) {
- minVertex = vertex;
- }
- }
- return minVertex;
- }
-
- // Processes a map of broadcast sets for each cluster.
- private ImmutableSetMultimap<ClusterId, ConnectPoint> buildBroadcastSets() {
- Builder<ClusterId, ConnectPoint> builder = ImmutableSetMultimap.builder();
- for (TopologyCluster cluster : clusters.get().values()) {
- addClusterBroadcastSet(cluster, builder);
- }
- return builder.build();
- }
-
- // Finds all broadcast points for the cluster. These are those connection
- // points which lie along the shortest paths between the cluster root and
- // all other devices within the cluster.
- private void addClusterBroadcastSet(TopologyCluster cluster, Builder<ClusterId, ConnectPoint> builder) {
- // Use the graph root search results to build the broadcast set.
- Result<TopologyVertex, TopologyEdge> result =
- DIJKSTRA.search(graph, cluster.root(), null, weight, 1);
- for (Map.Entry<TopologyVertex, Set<TopologyEdge>> entry : result.parents().entrySet()) {
- TopologyVertex vertex = entry.getKey();
-
- // Ignore any parents that lead outside the cluster.
- if (clustersByDevice().get(vertex.deviceId()) != cluster) {
- continue;
- }
-
- // Ignore any back-link sets that are empty.
- Set<TopologyEdge> parents = entry.getValue();
- if (parents.isEmpty()) {
- continue;
- }
-
- // Use the first back-link source and destinations to add to the
- // broadcast set.
- Link link = parents.iterator().next().link();
- builder.put(cluster.id(), link.src());
- builder.put(cluster.id(), link.dst());
- }
- }
-
- // Collects and returns an set of all infrastructure link end-points.
- private ImmutableSet<ConnectPoint> findInfrastructurePoints() {
- ImmutableSet.Builder<ConnectPoint> builder = ImmutableSet.builder();
- for (TopologyEdge edge : graph.getEdges()) {
- builder.add(edge.link().src());
- builder.add(edge.link().dst());
- }
- return builder.build();
- }
-
- // Builds cluster-devices, cluster-links and device-cluster indexes.
- private ClusterIndexes buildIndexes() {
- // Prepare the index builders
- ImmutableMap.Builder<DeviceId, TopologyCluster> clusterBuilder =
- ImmutableMap.builder();
- ImmutableSetMultimap.Builder<TopologyCluster, DeviceId> devicesBuilder =
- ImmutableSetMultimap.builder();
- ImmutableSetMultimap.Builder<TopologyCluster, Link> linksBuilder =
- ImmutableSetMultimap.builder();
-
- // Now scan through all the clusters
- for (TopologyCluster cluster : clusters.get().values()) {
- int i = cluster.id().index();
-
- // Scan through all the cluster vertexes.
- for (TopologyVertex vertex : clusterResults.get().clusterVertexes().get(i)) {
- devicesBuilder.put(cluster, vertex.deviceId());
- clusterBuilder.put(vertex.deviceId(), cluster);
- }
-
- // Scan through all the cluster edges.
- for (TopologyEdge edge : clusterResults.get().clusterEdges().get(i)) {
- linksBuilder.put(cluster, edge.link());
- }
- }
-
- // Finalize all indexes.
- return new ClusterIndexes(clusterBuilder.build(),
- devicesBuilder.build(), linksBuilder.build());
- }
-
- // Link weight for measuring link cost as hop count with indirect links
- // being as expensive as traversing the entire graph to assume the worst.
- private static class HopCountLinkWeight implements LinkWeight {
- private final int indirectLinkCost;
-
- HopCountLinkWeight(int indirectLinkCost) {
- this.indirectLinkCost = indirectLinkCost;
- }
-
- @Override
- public double weight(TopologyEdge edge) {
- // To force preference to use direct paths first, make indirect
- // links as expensive as the linear vertex traversal.
- return edge.link().state() ==
- ACTIVE ? (edge.link().type() ==
- INDIRECT ? indirectLinkCost : 1) : -1;
- }
- }
-
- // Link weight for preventing traversal over indirect links.
- private static class NoIndirectLinksWeight implements LinkWeight {
- @Override
- public double weight(TopologyEdge edge) {
- return (edge.link().state() == INACTIVE)
- || (edge.link().type() == INDIRECT) ? -1 : 1;
- }
- }
-
- static final class ClusterIndexes {
- final ImmutableMap<DeviceId, TopologyCluster> clustersByDevice;
- final ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster;
- final ImmutableSetMultimap<TopologyCluster, Link> linksByCluster;
-
- public ClusterIndexes(
- ImmutableMap<DeviceId, TopologyCluster> clustersByDevice,
- ImmutableSetMultimap<TopologyCluster, DeviceId> devicesByCluster,
- ImmutableSetMultimap<TopologyCluster, Link> linksByCluster) {
- this.clustersByDevice = clustersByDevice;
- this.devicesByCluster = devicesByCluster;
- this.linksByCluster = linksByCluster;
- }
- }
-
- @Override
- public String toString() {
- return toStringHelper(this)
- .add("time", time)
- .add("created", creationTime)
- .add("computeCost", computeCost)
- .add("clusters", clusterCount())
- .add("devices", deviceCount())
- .add("links", linkCount()).toString();
- }
-}
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyGraph.java b/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyGraph.java
deleted file mode 100644
index 610d724..0000000
--- a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyGraph.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2014 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.store.trivial;
-
-import org.onlab.graph.AdjacencyListsGraph;
-import org.onosproject.net.topology.TopologyEdge;
-import org.onosproject.net.topology.TopologyGraph;
-import org.onosproject.net.topology.TopologyVertex;
-
-import java.util.Set;
-
-/**
- * Default implementation of an immutable topology graph based on a generic
- * implementation of adjacency lists graph.
- */
-public class DefaultTopologyGraph
- extends AdjacencyListsGraph<TopologyVertex, TopologyEdge>
- implements TopologyGraph {
-
- /**
- * Creates a topology graph comprising of the specified vertexes and edges.
- *
- * @param vertexes set of graph vertexes
- * @param edges set of graph edges
- */
- public DefaultTopologyGraph(Set<TopologyVertex> vertexes, Set<TopologyEdge> edges) {
- super(vertexes, edges);
- }
-
-}
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
index cd564f0..6a89c01 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
@@ -19,6 +19,7 @@
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
+import org.onosproject.common.DefaultTopology;
import org.onosproject.event.Event;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java b/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
index 78bc186..928603c 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
@@ -15,6 +15,8 @@
*/
package org.onosproject.store.topology.impl;
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Collections;
@@ -25,6 +27,7 @@
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
+import org.onosproject.common.DefaultTopology;
import org.onosproject.event.Event;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.Device;
@@ -48,23 +51,23 @@
/**
* Manages inventory of topology snapshots using trivial in-memory
* structures implementation.
- *
+ * <p>
* Note: This component is not distributed per-se. It runs on every
* instance and feeds off of other distributed stores.
*/
@Component(immediate = true)
@Service
public class DistributedTopologyStore
-extends AbstractStore<TopologyEvent, TopologyStoreDelegate>
-implements TopologyStore {
+ extends AbstractStore<TopologyEvent, TopologyStoreDelegate>
+ implements TopologyStore {
private final Logger log = getLogger(getClass());
private volatile DefaultTopology current =
new DefaultTopology(ProviderId.NONE,
- new DefaultGraphDescription(0L,
- Collections.<Device>emptyList(),
- Collections.<Link>emptyList()));
+ new DefaultGraphDescription(0L, 0L,
+ Collections.<Device>emptyList(),
+ Collections.<Link>emptyList()));
@Activate
public void activate() {
@@ -75,6 +78,7 @@
public void deactivate() {
log.info("Stopped");
}
+
@Override
public Topology currentTopology() {
return current;
@@ -118,7 +122,7 @@
@Override
public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst,
- LinkWeight weight) {
+ LinkWeight weight) {
return defaultTopology(topology).getPaths(src, dst, weight);
}
@@ -134,8 +138,8 @@
@Override
public TopologyEvent updateTopology(ProviderId providerId,
- GraphDescription graphDescription,
- List<Event> reasons) {
+ GraphDescription graphDescription,
+ List<Event> reasons) {
// First off, make sure that what we're given is indeed newer than
// what we already have.
if (current != null && graphDescription.timestamp() < current.time()) {
@@ -149,18 +153,15 @@
// Promote the new topology to current and return a ready-to-send event.
synchronized (this) {
current = newTopology;
- return new TopologyEvent(TopologyEvent.Type.TOPOLOGY_CHANGED,
- current, reasons);
+ return new TopologyEvent(TOPOLOGY_CHANGED, current, reasons);
}
}
// Validates the specified topology and returns it as a default
private DefaultTopology defaultTopology(Topology topology) {
- if (topology instanceof DefaultTopology) {
- return (DefaultTopology) topology;
- }
- throw new IllegalArgumentException("Topology class " + topology.getClass() +
- " not supported");
+ checkArgument(topology instanceof DefaultTopology,
+ "Topology class %s not supported", topology.getClass());
+ return (DefaultTopology) topology;
}
}