blob: b6614a3ec43716e6a5f56bdf70a880b92be78d47 [file] [log] [blame]
tom8bf2e6b2014-09-10 20:53:54 -07001package org.onlab.onos.net.trivial.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;
tomcfde0622014-09-09 11:02:42 -070031import org.slf4j.Logger;
32
33import java.util.List;
34import java.util.Set;
35
36import static com.google.common.base.Preconditions.checkNotNull;
37import static org.slf4j.LoggerFactory.getLogger;
38
39/**
40 * Provides basic implementation of the topology SB & NB APIs.
41 */
42@Component(immediate = true)
43@Service
tom10262dd2014-09-19 10:51:19 -070044public class TopologyManager
tomcfde0622014-09-09 11:02:42 -070045 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
46 implements TopologyService, TopologyProviderRegistry {
47
48 public static final String TOPOLOGY_NULL = "Topology cannot be null";
49 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
tom13cb4852014-09-11 12:44:17 -070050 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
51 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
tomcfde0622014-09-09 11:02:42 -070052 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
53
54 private final Logger log = getLogger(getClass());
55
56 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
57 listenerRegistry = new AbstractListenerRegistry<>();
58
tom10262dd2014-09-19 10:51:19 -070059 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
60 protected TopologyStore store;
tom0efbb1d2014-09-09 11:54:28 -070061
tomcfde0622014-09-09 11:02:42 -070062 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4d0dd3a2014-09-14 23:12:28 -070063 protected EventDeliveryService eventDispatcher;
tomcfde0622014-09-09 11:02:42 -070064
65
66 @Activate
67 public void activate() {
68 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
69 log.info("Started");
70 }
71
72 @Deactivate
73 public void deactivate() {
74 eventDispatcher.removeSink(TopologyEvent.class);
75 log.info("Stopped");
76 }
77
78 @Override
tomdc361b62014-09-09 20:36:52 -070079 public Topology currentTopology() {
80 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070081 }
82
83 @Override
tomdc361b62014-09-09 20:36:52 -070084 public boolean isLatest(Topology topology) {
85 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -070086 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -070087 }
88
89 @Override
90 public Set<TopologyCluster> getClusters(Topology topology) {
91 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -070092 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -070093 }
94
95 @Override
tom13cb4852014-09-11 12:44:17 -070096 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
97 checkNotNull(topology, TOPOLOGY_NULL);
98 checkNotNull(topology, CLUSTER_ID_NULL);
tom10262dd2014-09-19 10:51:19 -070099 return store.getCluster(topology, clusterId);
tom13cb4852014-09-11 12:44:17 -0700100 }
101
102 @Override
103 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
104 checkNotNull(topology, TOPOLOGY_NULL);
105 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700106 return store.getClusterDevices(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700107 }
108
109 @Override
110 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
111 checkNotNull(topology, TOPOLOGY_NULL);
112 checkNotNull(topology, CLUSTER_NULL);
tom10262dd2014-09-19 10:51:19 -0700113 return store.getClusterLinks(topology, cluster);
tom13cb4852014-09-11 12:44:17 -0700114 }
115
116 @Override
tom97937552014-09-11 10:48:42 -0700117 public TopologyGraph getGraph(Topology topology) {
tomcfde0622014-09-09 11:02:42 -0700118 checkNotNull(topology, TOPOLOGY_NULL);
tom10262dd2014-09-19 10:51:19 -0700119 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -0700120 }
121
122 @Override
123 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
124 checkNotNull(topology, TOPOLOGY_NULL);
125 checkNotNull(src, DEVICE_ID_NULL);
126 checkNotNull(dst, DEVICE_ID_NULL);
tom10262dd2014-09-19 10:51:19 -0700127 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700128 }
129
130 @Override
131 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
132 checkNotNull(topology, TOPOLOGY_NULL);
133 checkNotNull(src, DEVICE_ID_NULL);
134 checkNotNull(dst, DEVICE_ID_NULL);
135 checkNotNull(weight, "Link weight cannot be null");
tom10262dd2014-09-19 10:51:19 -0700136 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700137 }
138
139 @Override
140 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
141 checkNotNull(topology, TOPOLOGY_NULL);
142 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700143 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700144 }
145
146 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700147 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
tomcfde0622014-09-09 11:02:42 -0700148 checkNotNull(topology, TOPOLOGY_NULL);
149 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom10262dd2014-09-19 10:51:19 -0700150 return store.isBroadcastPoint(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700151 }
152
153 @Override
154 public void addListener(TopologyListener listener) {
155 listenerRegistry.addListener(listener);
156 }
157
158 @Override
159 public void removeListener(TopologyListener listener) {
160 listenerRegistry.removeListener(listener);
161 }
162
163 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700164 @Override
165 protected TopologyProviderService createProviderService(TopologyProvider provider) {
166 return new InternalTopologyProviderService(provider);
167 }
168
tomcfde0622014-09-09 11:02:42 -0700169 private class InternalTopologyProviderService
170 extends AbstractProviderService<TopologyProvider>
171 implements TopologyProviderService {
172
173 InternalTopologyProviderService(TopologyProvider provider) {
174 super(provider);
175 }
176
177 @Override
tom97937552014-09-11 10:48:42 -0700178 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700179 List<Event> reasons) {
180 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700181
tome52ce702014-09-11 00:12:54 -0700182 TopologyEvent event = store.updateTopology(provider().id(),
183 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700184 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700185 log.info("Topology {} changed", event.subject());
tomdc361b62014-09-09 20:36:52 -0700186 eventDispatcher.post(event);
187 }
tomcfde0622014-09-09 11:02:42 -0700188 }
189 }
190
191}