From 930a8ee16aa523943660e0271134423c97a0a19c Mon Sep 17 00:00:00 2001 From: Thomas Vachuska Date: Tue, 4 Aug 2015 18:49:36 -0700 Subject: [PATCH] Refactoring to eliminate duplicate DefaultTopology and DefaultTopologyGraph; eliminating a few fixmes. Change-Id: I4461b6f1c8ae60d39f5da909bf6995294cbfa84d --- .../net/topology/DefaultGraphDescription.java | 51 +- .../onosproject/common}/DefaultTopology.java | 98 ++-- .../common}/DefaultTopologyGraph.java | 2 +- .../DefaultTopologyTest.java | 2 +- .../store/trivial/DefaultTopology.java | 492 ------------------ .../store/trivial/SimpleTopologyStore.java | 1 + .../topology/impl/DefaultTopologyGraph.java | 43 -- .../impl/DistributedTopologyStore.java | 33 +- 8 files changed, 80 insertions(+), 642 deletions(-) rename core/{store/dist/src/main/java/org/onosproject/store/topology/impl => common/src/main/java/org/onosproject/common}/DefaultTopology.java (91%) rename core/common/src/{test/java/org/onosproject/store/trivial => main/java/org/onosproject/common}/DefaultTopologyGraph.java (97%) rename core/common/src/test/java/org/onosproject/{store/trivial => common}/DefaultTopologyTest.java (99%) delete mode 100644 core/common/src/test/java/org/onosproject/store/trivial/DefaultTopology.java delete mode 100644 core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopologyGraph.java 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 ed4ae32217..d635d748d3 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.Link; 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 @@ implements GraphDescription { private final ImmutableSet vertexes; private final ImmutableSet edges; - private final Map vertexesById = Maps - .newHashMap(); + private final Map 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 devices, - Iterable links, - SparseAnnotations... annotations) { + Iterable links, + SparseAnnotations... annotations) { this(nanos, System.currentTimeMillis(), devices, links, annotations); } @@ -70,21 +65,16 @@ implements GraphDescription { * 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 devices, - Iterable links, - SparseAnnotations... annotations) { + Iterable devices, + Iterable links, + SparseAnnotations... annotations) { super(annotations); this.nanos = nanos; this.creationTime = millis; @@ -114,8 +104,7 @@ implements GraphDescription { } // Builds a set of topology vertexes from the specified list of devices - private ImmutableSet - buildVertexes(Iterable devices) { + private ImmutableSet buildVertexes(Iterable devices) { ImmutableSet.Builder 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 639e2a0d04..51857c7e04 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; - -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; +package org.onosproject.common; +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.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; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +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; -// FIXME: Move to onos-core-common when ready /** * Default implementation of the topology descriptor. This carries the backing * topology data. @@ -83,19 +81,17 @@ public class DefaultTopology extends AbstractModel implements Topology { /** * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * * @return topology graph */ - TopologyGraph getGraph() { + public TopologyGraph getGraph() { return graph; } @@ -165,7 +160,7 @@ public class DefaultTopology extends AbstractModel implements Topology { * * @return set of clusters */ - Set getClusters() { + public Set getClusters() { return ImmutableSet.copyOf(clusters.get().values()); } @@ -173,10 +168,9 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * Returns the set of cluster devices. * * @param cluster topology cluster - * * @return cluster devices */ - Set getClusterDevices(TopologyCluster cluster) { + public Set getClusterDevices(TopologyCluster cluster) { return devicesByCluster().get(cluster); } @@ -206,10 +198,9 @@ public class DefaultTopology extends AbstractModel implements Topology { * Returns the set of cluster links. * * @param cluster topology cluster - * * @return cluster links */ - Set getClusterLinks(TopologyCluster cluster) { + public Set getClusterLinks(TopologyCluster cluster) { return linksByCluster().get(cluster); } @@ -217,10 +208,9 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 @@ public class DefaultTopology extends AbstractModel implements Topology { * destination devices. * * @param src source device - * * @param dst destination device - * * @return set of shortest paths */ - Set getPaths(DeviceId src, DeviceId dst) { + public Set getPaths(DeviceId src, DeviceId dst) { return getPaths(src, dst, null); } @@ -279,15 +265,12 @@ public class DefaultTopology extends AbstractModel implements Topology { * 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 getPaths(DeviceId src, DeviceId dst, LinkWeight weight) { + public Set getPaths(DeviceId src, DeviceId dst, LinkWeight weight) { final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); Set vertices = graph.getVertexes(); @@ -470,10 +453,9 @@ public class DefaultTopology extends AbstractModel implements Topology { final ImmutableSetMultimap devicesByCluster; final ImmutableSetMultimap linksByCluster; - public ClusterIndexes( - ImmutableMap clustersByDevice, - ImmutableSetMultimap devicesByCluster, - ImmutableSetMultimap linksByCluster) { + public ClusterIndexes(ImmutableMap clustersByDevice, + ImmutableSetMultimap devicesByCluster, + ImmutableSetMultimap linksByCluster) { this.clustersByDevice = clustersByDevice; this.devicesByCluster = devicesByCluster; this.linksByCluster = linksByCluster; diff --git a/core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyGraph.java b/core/common/src/main/java/org/onosproject/common/DefaultTopologyGraph.java similarity index 97% rename from core/common/src/test/java/org/onosproject/store/trivial/DefaultTopologyGraph.java rename to core/common/src/main/java/org/onosproject/common/DefaultTopologyGraph.java index 610d72437d..b06065e75f 100644 --- a/core/common/src/test/java/org/onosproject/store/trivial/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.trivial; +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 99% 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 3ff340a883..4d435cfefc 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 9f436b6201..0000000000 --- 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 DIJKSTRA = new DijkstraGraphSearch<>(); - private static final TarjanGraphSearch 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> clusterResults; - private final Supplier> clusters; - private final Supplier> infrastructurePoints; - private final Supplier> broadcastSets; - - private final Supplier 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 clustersByDevice() { - return clusterIndexes.get().clustersByDevice; - } - - private ImmutableSetMultimap devicesByCluster() { - return clusterIndexes.get().devicesByCluster; - } - - private ImmutableSetMultimap 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 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 getClusterDevices(TopologyCluster cluster) { - return devicesByCluster().get(cluster); - } - - /** - * Returns the set of cluster links. - * - * @param cluster topology cluster - * - * @return cluster links - */ - Set 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 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 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 getPaths(DeviceId src, DeviceId dst, LinkWeight weight) { - final DefaultTopologyVertex srcV = new DefaultTopologyVertex(src); - final DefaultTopologyVertex dstV = new DefaultTopologyVertex(dst); - Set vertices = graph.getVertexes(); - if (!vertices.contains(srcV) || !vertices.contains(dstV)) { - // src or dst not part of the current graph - return ImmutableSet.of(); - } - - GraphPathSearch.Result result = - DIJKSTRA.search(graph, srcV, dstV, weight, ALL_PATHS); - ImmutableSet.Builder builder = ImmutableSet.builder(); - for (org.onlab.graph.Path 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 path) { - List 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 searchForClusters() { - return TARJAN.search(graph, new NoIndirectLinksWeight()); - } - - // Builds the topology clusters and returns the id-cluster bindings. - private ImmutableMap buildTopologyClusters() { - ImmutableMap.Builder clusterBuilder = ImmutableMap.builder(); - SCCResult results = clusterResults.get(); - // Extract both vertexes and edges from the results; the lists form - // pairs along the same index. - List> clusterVertexes = results.clusterVertexes(); - List> 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 vertexSet = clusterVertexes.get(i); - Set 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 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 buildBroadcastSets() { - Builder 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 builder) { - // Use the graph root search results to build the broadcast set. - Result result = - DIJKSTRA.search(graph, cluster.root(), null, weight, 1); - for (Map.Entry> 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 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 findInfrastructurePoints() { - ImmutableSet.Builder 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 clusterBuilder = - ImmutableMap.builder(); - ImmutableSetMultimap.Builder devicesBuilder = - ImmutableSetMultimap.builder(); - ImmutableSetMultimap.Builder 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 clustersByDevice; - final ImmutableSetMultimap devicesByCluster; - final ImmutableSetMultimap linksByCluster; - - public ClusterIndexes( - ImmutableMap clustersByDevice, - ImmutableSetMultimap devicesByCluster, - ImmutableSetMultimap 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/SimpleTopologyStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java index cd564f0170..6a89c01902 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.Activate; 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/DefaultTopologyGraph.java b/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DefaultTopologyGraph.java deleted file mode 100644 index cbe73ad55d..0000000000 --- a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/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.topology.impl; - -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 - 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 vertexes, Set edges) { - super(vertexes, edges); - } - -} 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 78bc186527..928603c3e6 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.Activate; 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 @@ import org.slf4j.Logger; /** * Manages inventory of topology snapshots using trivial in-memory * structures implementation. - * + *

* 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 -implements TopologyStore { + extends AbstractStore + implements TopologyStore { private final Logger log = getLogger(getClass()); private volatile DefaultTopology current = new DefaultTopology(ProviderId.NONE, - new DefaultGraphDescription(0L, - Collections.emptyList(), - Collections.emptyList())); + new DefaultGraphDescription(0L, 0L, + Collections.emptyList(), + Collections.emptyList())); @Activate public void activate() { @@ -75,6 +78,7 @@ implements TopologyStore { public void deactivate() { log.info("Stopped"); } + @Override public Topology currentTopology() { return current; @@ -118,7 +122,7 @@ implements TopologyStore { @Override public Set getPaths(Topology topology, DeviceId src, DeviceId dst, - LinkWeight weight) { + LinkWeight weight) { return defaultTopology(topology).getPaths(src, dst, weight); } @@ -134,8 +138,8 @@ implements TopologyStore { @Override public TopologyEvent updateTopology(ProviderId providerId, - GraphDescription graphDescription, - List reasons) { + GraphDescription graphDescription, + List 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 @@ implements TopologyStore { // 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; } }