blob: 33b2a18267c87140e33b9442349fda96fcf63335 [file] [log] [blame]
tomcfde0622014-09-09 11:02:42 -07001package org.onlab.onos.net.trivial.impl;
2
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;
9import org.onlab.graph.Graph;
10import org.onlab.onos.event.AbstractListenerRegistry;
11import org.onlab.onos.event.Event;
12import org.onlab.onos.event.EventDeliveryService;
13import org.onlab.onos.net.ConnectPoint;
14import org.onlab.onos.net.DeviceId;
15import org.onlab.onos.net.Path;
16import org.onlab.onos.net.provider.AbstractProviderRegistry;
17import org.onlab.onos.net.provider.AbstractProviderService;
18import org.onlab.onos.net.topology.LinkWeight;
19import org.onlab.onos.net.topology.TopoEdge;
20import org.onlab.onos.net.topology.TopoVertex;
21import org.onlab.onos.net.topology.Topology;
22import org.onlab.onos.net.topology.TopologyCluster;
23import org.onlab.onos.net.topology.TopologyDescription;
24import org.onlab.onos.net.topology.TopologyEvent;
25import 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;
30import org.slf4j.Logger;
31
32import java.util.List;
33import java.util.Set;
34
35import static com.google.common.base.Preconditions.checkNotNull;
36import static org.slf4j.LoggerFactory.getLogger;
37
38/**
39 * Provides basic implementation of the topology SB & NB APIs.
40 */
41@Component(immediate = true)
42@Service
43public class SimpleTopologyManager
44 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
45 implements TopologyService, TopologyProviderRegistry {
46
47 public static final String TOPOLOGY_NULL = "Topology cannot be null";
48 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
49 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
50
51 private final Logger log = getLogger(getClass());
52
53 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
54 listenerRegistry = new AbstractListenerRegistry<>();
55
tom0efbb1d2014-09-09 11:54:28 -070056 private final SimpleTopologyStore store = new SimpleTopologyStore();
57
tomcfde0622014-09-09 11:02:42 -070058 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 private EventDeliveryService eventDispatcher;
60
61
62 @Activate
63 public void activate() {
64 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
65 log.info("Started");
66 }
67
68 @Deactivate
69 public void deactivate() {
70 eventDispatcher.removeSink(TopologyEvent.class);
71 log.info("Stopped");
72 }
73
74 @Override
tomdc361b62014-09-09 20:36:52 -070075 public Topology currentTopology() {
76 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070077 }
78
79 @Override
tomdc361b62014-09-09 20:36:52 -070080 public boolean isLatest(Topology topology) {
81 checkNotNull(topology, TOPOLOGY_NULL);
82 return store.isLatest(topology);
tomcfde0622014-09-09 11:02:42 -070083 }
84
85 @Override
86 public Set<TopologyCluster> getClusters(Topology topology) {
87 checkNotNull(topology, TOPOLOGY_NULL);
tomdc361b62014-09-09 20:36:52 -070088 return store.getClusters(topology);
tomcfde0622014-09-09 11:02:42 -070089 }
90
91 @Override
92 public Graph<TopoVertex, TopoEdge> getGraph(Topology topology) {
93 checkNotNull(topology, TOPOLOGY_NULL);
tomdc361b62014-09-09 20:36:52 -070094 return store.getGraph(topology);
tomcfde0622014-09-09 11:02:42 -070095 }
96
97 @Override
98 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
99 checkNotNull(topology, TOPOLOGY_NULL);
100 checkNotNull(src, DEVICE_ID_NULL);
101 checkNotNull(dst, DEVICE_ID_NULL);
tomdc361b62014-09-09 20:36:52 -0700102 return store.getPaths(topology, src, dst);
tomcfde0622014-09-09 11:02:42 -0700103 }
104
105 @Override
106 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
107 checkNotNull(topology, TOPOLOGY_NULL);
108 checkNotNull(src, DEVICE_ID_NULL);
109 checkNotNull(dst, DEVICE_ID_NULL);
110 checkNotNull(weight, "Link weight cannot be null");
tomdc361b62014-09-09 20:36:52 -0700111 return store.getPaths(topology, src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700112 }
113
114 @Override
115 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
116 checkNotNull(topology, TOPOLOGY_NULL);
117 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tomdc361b62014-09-09 20:36:52 -0700118 return store.isInfrastructure(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700119 }
120
121 @Override
122 public boolean isInBroadcastTree(Topology topology, ConnectPoint connectPoint) {
123 checkNotNull(topology, TOPOLOGY_NULL);
124 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tomdc361b62014-09-09 20:36:52 -0700125 return store.isInBroadcastTree(topology, connectPoint);
tomcfde0622014-09-09 11:02:42 -0700126 }
127
128 @Override
129 public void addListener(TopologyListener listener) {
130 listenerRegistry.addListener(listener);
131 }
132
133 @Override
134 public void removeListener(TopologyListener listener) {
135 listenerRegistry.removeListener(listener);
136 }
137
138 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700139 @Override
140 protected TopologyProviderService createProviderService(TopologyProvider provider) {
141 return new InternalTopologyProviderService(provider);
142 }
143
tomcfde0622014-09-09 11:02:42 -0700144 private class InternalTopologyProviderService
145 extends AbstractProviderService<TopologyProvider>
146 implements TopologyProviderService {
147
148 InternalTopologyProviderService(TopologyProvider provider) {
149 super(provider);
150 }
151
152 @Override
153 public void topologyChanged(TopologyDescription topoDescription,
154 List<Event> reasons) {
155 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700156
157 log.info("Topology changed due to: {}", // to be removed soon
158 reasons == null ? "initial compute" : reasons);
tomdc361b62014-09-09 20:36:52 -0700159 TopologyEvent event = store.updateTopology(topoDescription, reasons);
160 if (event != null) {
161 log.info("Topology changed due to: {}",
162 reasons == null ? "initial compute" : reasons);
163 eventDispatcher.post(event);
164 }
tomcfde0622014-09-09 11:02:42 -0700165 }
166 }
167
168}