blob: bd7db8ad3741e7614af3399a1ef9a9adeccec480 [file] [log] [blame]
tomea961ff2014-10-01 12:45:15 -07001package org.onlab.onos.store.trivial.impl;
tom0efbb1d2014-09-09 11:54:28 -07002
tom10262dd2014-09-19 10:51:19 -07003import org.apache.felix.scr.annotations.Activate;
4import org.apache.felix.scr.annotations.Component;
5import org.apache.felix.scr.annotations.Deactivate;
6import org.apache.felix.scr.annotations.Service;
tomdc361b62014-09-09 20:36:52 -07007import org.onlab.onos.event.Event;
8import org.onlab.onos.net.ConnectPoint;
9import org.onlab.onos.net.DeviceId;
tom13cb4852014-09-11 12:44:17 -070010import org.onlab.onos.net.Link;
tomdc361b62014-09-09 20:36:52 -070011import org.onlab.onos.net.Path;
tome52ce702014-09-11 00:12:54 -070012import org.onlab.onos.net.provider.ProviderId;
tom13cb4852014-09-11 12:44:17 -070013import org.onlab.onos.net.topology.ClusterId;
tom97937552014-09-11 10:48:42 -070014import org.onlab.onos.net.topology.GraphDescription;
tomdc361b62014-09-09 20:36:52 -070015import org.onlab.onos.net.topology.LinkWeight;
tomdc361b62014-09-09 20:36:52 -070016import org.onlab.onos.net.topology.Topology;
17import org.onlab.onos.net.topology.TopologyCluster;
tomdc361b62014-09-09 20:36:52 -070018import org.onlab.onos.net.topology.TopologyEvent;
tom97937552014-09-11 10:48:42 -070019import org.onlab.onos.net.topology.TopologyGraph;
tom10262dd2014-09-19 10:51:19 -070020import org.onlab.onos.net.topology.TopologyStore;
tomc78acee2014-09-24 15:16:55 -070021import org.onlab.onos.net.topology.TopologyStoreDelegate;
22import org.onlab.onos.store.AbstractStore;
tom10262dd2014-09-19 10:51:19 -070023import org.slf4j.Logger;
tomdc361b62014-09-09 20:36:52 -070024
25import java.util.List;
26import java.util.Set;
27
tom10262dd2014-09-19 10:51:19 -070028import static org.slf4j.LoggerFactory.getLogger;
29
tom0efbb1d2014-09-09 11:54:28 -070030/**
31 * Manages inventory of topology snapshots using trivial in-memory
tomcbff9392014-09-10 00:45:23 -070032 * structures implementation.
tom0efbb1d2014-09-09 11:54:28 -070033 */
tom10262dd2014-09-19 10:51:19 -070034@Component(immediate = true)
35@Service
tomc78acee2014-09-24 15:16:55 -070036public class SimpleTopologyStore
37 extends AbstractStore<TopologyEvent, TopologyStoreDelegate>
38 implements TopologyStore {
tom10262dd2014-09-19 10:51:19 -070039
40 private final Logger log = getLogger(getClass());
tomdc361b62014-09-09 20:36:52 -070041
42 private volatile DefaultTopology current;
43
tom10262dd2014-09-19 10:51:19 -070044 @Activate
45 public void activate() {
46 log.info("Started");
47 }
48
49 @Deactivate
50 public void deactivate() {
51 log.info("Stopped");
52 }
53 @Override
54 public Topology currentTopology() {
tomdc361b62014-09-09 20:36:52 -070055 return current;
56 }
57
tom10262dd2014-09-19 10:51:19 -070058 @Override
59 public boolean isLatest(Topology topology) {
tomcbff9392014-09-10 00:45:23 -070060 // Topology is current only if it is the same as our current topology
tomdc361b62014-09-09 20:36:52 -070061 return topology == current;
62 }
63
tom10262dd2014-09-19 10:51:19 -070064 @Override
65 public TopologyGraph getGraph(Topology topology) {
66 return defaultTopology(topology).getGraph();
tom13cb4852014-09-11 12:44:17 -070067 }
68
tom10262dd2014-09-19 10:51:19 -070069 @Override
70 public Set<TopologyCluster> getClusters(Topology topology) {
71 return defaultTopology(topology).getClusters();
tomdc361b62014-09-09 20:36:52 -070072 }
73
tom10262dd2014-09-19 10:51:19 -070074 @Override
75 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
76 return defaultTopology(topology).getCluster(clusterId);
tom13cb4852014-09-11 12:44:17 -070077 }
78
tom10262dd2014-09-19 10:51:19 -070079 @Override
80 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
81 return defaultTopology(topology).getClusterDevices(cluster);
tom13cb4852014-09-11 12:44:17 -070082 }
83
tom10262dd2014-09-19 10:51:19 -070084 @Override
85 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
86 return defaultTopology(topology).getClusterLinks(cluster);
tomdc361b62014-09-09 20:36:52 -070087 }
88
tom10262dd2014-09-19 10:51:19 -070089 @Override
90 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
91 return defaultTopology(topology).getPaths(src, dst);
tomdc361b62014-09-09 20:36:52 -070092 }
93
tom10262dd2014-09-19 10:51:19 -070094 @Override
95 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst,
96 LinkWeight weight) {
97 return defaultTopology(topology).getPaths(src, dst, weight);
tomdc361b62014-09-09 20:36:52 -070098 }
99
tom10262dd2014-09-19 10:51:19 -0700100 @Override
101 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
102 return defaultTopology(topology).isInfrastructure(connectPoint);
tomdc361b62014-09-09 20:36:52 -0700103 }
104
tom10262dd2014-09-19 10:51:19 -0700105 @Override
106 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
107 return defaultTopology(topology).isBroadcastPoint(connectPoint);
tomdc361b62014-09-09 20:36:52 -0700108 }
109
tom10262dd2014-09-19 10:51:19 -0700110 @Override
111 public TopologyEvent updateTopology(ProviderId providerId,
112 GraphDescription graphDescription,
113 List<Event> reasons) {
tome52ce702014-09-11 00:12:54 -0700114 // First off, make sure that what we're given is indeed newer than
115 // what we already have.
tom97937552014-09-11 10:48:42 -0700116 if (current != null && graphDescription.timestamp() < current.time()) {
tome52ce702014-09-11 00:12:54 -0700117 return null;
118 }
119
120 // Have the default topology construct self from the description data.
121 DefaultTopology newTopology =
tom97937552014-09-11 10:48:42 -0700122 new DefaultTopology(providerId, graphDescription);
tome52ce702014-09-11 00:12:54 -0700123
124 // Promote the new topology to current and return a ready-to-send event.
tom97937552014-09-11 10:48:42 -0700125 synchronized (this) {
126 current = newTopology;
tom95329eb2014-10-06 08:40:06 -0700127 return new TopologyEvent(TopologyEvent.Type.TOPOLOGY_CHANGED,
128 current, reasons);
tom97937552014-09-11 10:48:42 -0700129 }
tomdc361b62014-09-09 20:36:52 -0700130 }
131
tom10262dd2014-09-19 10:51:19 -0700132 // Validates the specified topology and returns it as a default
133 private DefaultTopology defaultTopology(Topology topology) {
134 if (topology instanceof DefaultTopology) {
135 return (DefaultTopology) topology;
136 }
137 throw new IllegalArgumentException("Topology class " + topology.getClass() +
138 " not supported");
139 }
140
tom0efbb1d2014-09-09 11:54:28 -0700141}