blob: 4846944d01e34368a3fb215c638086d880b65958 [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.topology.impl;
tomcfde0622014-09-09 11:02:42 -07002
3import 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.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
8import org.apache.felix.scr.annotations.Service;
tomcfde0622014-09-09 11:02:42 -07009import org.onlab.onos.event.AbstractListenerRegistry;
10import org.onlab.onos.event.Event;
11import org.onlab.onos.event.EventDeliveryService;
12import org.onlab.onos.net.ConnectPoint;
13import org.onlab.onos.net.DeviceId;
tom13cb4852014-09-11 12:44:17 -070014import org.onlab.onos.net.Link;
tomcfde0622014-09-09 11:02:42 -070015import org.onlab.onos.net.Path;
16import org.onlab.onos.net.provider.AbstractProviderRegistry;
17import org.onlab.onos.net.provider.AbstractProviderService;
tom13cb4852014-09-11 12:44:17 -070018import org.onlab.onos.net.topology.ClusterId;
tom97937552014-09-11 10:48:42 -070019import org.onlab.onos.net.topology.GraphDescription;
tomcfde0622014-09-09 11:02:42 -070020import org.onlab.onos.net.topology.LinkWeight;
tomcfde0622014-09-09 11:02:42 -070021import org.onlab.onos.net.topology.Topology;
22import org.onlab.onos.net.topology.TopologyCluster;
tomcfde0622014-09-09 11:02:42 -070023import org.onlab.onos.net.topology.TopologyEvent;
tom97937552014-09-11 10:48:42 -070024import org.onlab.onos.net.topology.TopologyGraph;
tomcfde0622014-09-09 11:02:42 -070025import org.onlab.onos.net.topology.TopologyListener;
26import org.onlab.onos.net.topology.TopologyProvider;
27import org.onlab.onos.net.topology.TopologyProviderRegistry;
28import org.onlab.onos.net.topology.TopologyProviderService;
29import org.onlab.onos.net.topology.TopologyService;
tom10262dd2014-09-19 10:51:19 -070030import org.onlab.onos.net.topology.TopologyStore;
tomc78acee2014-09-24 15:16:55 -070031import org.onlab.onos.net.topology.TopologyStoreDelegate;
tomcfde0622014-09-09 11:02:42 -070032import org.slf4j.Logger;
33
34import java.util.List;
35import java.util.Set;
36
37import static com.google.common.base.Preconditions.checkNotNull;
38import static org.slf4j.LoggerFactory.getLogger;
39
40/**
41 * Provides basic implementation of the topology SB & NB APIs.
42 */
43@Component(immediate = true)
44@Service
tom10262dd2014-09-19 10:51:19 -070045public class TopologyManager
tomcfde0622014-09-09 11:02:42 -070046 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
47 implements TopologyService, TopologyProviderRegistry {
48
49 public static final String TOPOLOGY_NULL = "Topology cannot be null";
50 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
tom13cb4852014-09-11 12:44:17 -070051 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
52 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
tomcfde0622014-09-09 11:02:42 -070053 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
54
55 private final Logger log = getLogger(getClass());
56
57 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
58 listenerRegistry = new AbstractListenerRegistry<>();
59
tomc78acee2014-09-24 15:16:55 -070060 private TopologyStoreDelegate delegate = new InternalStoreDelegate();
61
tom10262dd2014-09-19 10:51:19 -070062 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070064
tomcfde0622014-09-09 11:02:42 -070065 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4d0dd3a2014-09-14 23:12:28 -070066 protected EventDeliveryService eventDispatcher;
tomcfde0622014-09-09 11:02:42 -070067
68
69 @Activate
70 public void activate() {
tomc78acee2014-09-24 15:16:55 -070071 store.setDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070072 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
73 log.info("Started");
74 }
75
76 @Deactivate
77 public void deactivate() {
tomc78acee2014-09-24 15:16:55 -070078 store.unsetDelegate(delegate);
tomcfde0622014-09-09 11:02:42 -070079 eventDispatcher.removeSink(TopologyEvent.class);
80 log.info("Stopped");
81 }
82
83 @Override
tomdc361b62014-09-09 20:36:52 -070084 public Topology currentTopology() {
85 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070086 }
87
88 @Override
tomdc361b62014-09-09 20:36:52 -070089 public boolean isLatest(Topology topology) {
90 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -070091 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -070092 }
93
94 @Override
95 public Set<TopologyCluster> getClusters(Topology topology) {
96 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -070097 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -070098 }
99
100 @Override
tom13cb4852014-09-11 12:44:17 -0700101 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
102 checkNotNull(topology, TOPOLOGY_NULL);
103 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700104 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700105 }
106
107 @Override
108 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
109 checkNotNull(topology, TOPOLOGY_NULL);
110 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700111 return store.getClusterDevices(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700112 }
113
114 @Override
115 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
116 checkNotNull(topology, TOPOLOGY_NULL);
117 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700118 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700119 }
120
121 @Override
tom97937552014-09-11 10:48:42 -0700122 public TopologyGraph getGraph(Topology topology) {
tomcfde0622014-09-09 11:02:42 -0700123 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700124 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700125 }
126
127 @Override
128 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
129 checkNotNull(topology, TOPOLOGY_NULL);
130 checkNotNull(src, DEVICE_ID_NULL);
131 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700132 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700133 }
134
135 @Override
136 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
137 checkNotNull(topology, TOPOLOGY_NULL);
138 checkNotNull(src, DEVICE_ID_NULL);
139 checkNotNull(dst, DEVICE_ID_NULL);
140 checkNotNull(weight, "Link weight cannot be null");
tom10262dd2014-09-19 10:51:19 -0700141 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700142 }
143
144 @Override
145 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
146 checkNotNull(topology, TOPOLOGY_NULL);
147 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700148 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700149 }
150
151 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700152 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
tomcfde0622014-09-09 11:02:42 -0700153 checkNotNull(topology, TOPOLOGY_NULL);
154 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700155 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700156 }
157
158 @Override
159 public void addListener(TopologyListener listener) {
160 listenerRegistry.addListener(listener);
161 }
162
163 @Override
164 public void removeListener(TopologyListener listener) {
165 listenerRegistry.removeListener(listener);
166 }
167
168 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700169 @Override
170 protected TopologyProviderService createProviderService(TopologyProvider provider) {
171 return new InternalTopologyProviderService(provider);
172 }
173
tomcfde0622014-09-09 11:02:42 -0700174 private class InternalTopologyProviderService
175 extends AbstractProviderService<TopologyProvider>
176 implements TopologyProviderService {
177
178 InternalTopologyProviderService(TopologyProvider provider) {
179 super(provider);
180 }
181
182 @Override
tom97937552014-09-11 10:48:42 -0700183 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700184 List<Event> reasons) {
185 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700186
tome52ce702014-09-11 00:12:54 -0700187 TopologyEvent event = store.updateTopology(provider().id(),
188 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700189 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700190 log.info("Topology {} changed", event.subject());
tomdc361b62014-09-09 20:36:52 -0700191 eventDispatcher.post(event);
192 }
tomcfde0622014-09-09 11:02:42 -0700193 }
194 }
195
tomc78acee2014-09-24 15:16:55 -0700196 // Store delegate to re-post events emitted from the store.
197 private class InternalStoreDelegate implements TopologyStoreDelegate {
198 @Override
199 public void notify(TopologyEvent event) {
200 eventDispatcher.post(event);
201 }
202 }
tomcfde0622014-09-09 11:02:42 -0700203}