blob: e6e54b80434b356df95645fab03f03aab3c56edb [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;
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);
tome52ce702014-09-11 00:12:54 -070082 return store.isLatest(defaultTopology(topology));
83 }
84
85 // Validates the specified topology and returns it as a default
86 private DefaultTopology defaultTopology(Topology topology) {
87 if (topology instanceof DefaultTopology) {
88 return (DefaultTopology) topology;
89 }
90 throw new IllegalArgumentException("Topology class " + topology.getClass() +
91 " not supported");
tomcfde0622014-09-09 11:02:42 -070092 }
93
94 @Override
95 public Set<TopologyCluster> getClusters(Topology topology) {
96 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -070097 return store.getClusters(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -070098 }
99
100 @Override
101 public Graph<TopoVertex, TopoEdge> getGraph(Topology topology) {
102 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -0700103 return store.getGraph(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -0700104 }
105
106 @Override
107 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
108 checkNotNull(topology, TOPOLOGY_NULL);
109 checkNotNull(src, DEVICE_ID_NULL);
110 checkNotNull(dst, DEVICE_ID_NULL);
tome52ce702014-09-11 00:12:54 -0700111 return store.getPaths(defaultTopology(topology), src, dst);
tomcfde0622014-09-09 11:02:42 -0700112 }
113
114 @Override
115 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
116 checkNotNull(topology, TOPOLOGY_NULL);
117 checkNotNull(src, DEVICE_ID_NULL);
118 checkNotNull(dst, DEVICE_ID_NULL);
119 checkNotNull(weight, "Link weight cannot be null");
tome52ce702014-09-11 00:12:54 -0700120 return store.getPaths(defaultTopology(topology), src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700121 }
122
123 @Override
124 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
125 checkNotNull(topology, TOPOLOGY_NULL);
126 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tome52ce702014-09-11 00:12:54 -0700127 return store.isInfrastructure(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700128 }
129
130 @Override
131 public boolean isInBroadcastTree(Topology topology, ConnectPoint connectPoint) {
132 checkNotNull(topology, TOPOLOGY_NULL);
133 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tome52ce702014-09-11 00:12:54 -0700134 return store.isInBroadcastTree(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700135 }
136
137 @Override
138 public void addListener(TopologyListener listener) {
139 listenerRegistry.addListener(listener);
140 }
141
142 @Override
143 public void removeListener(TopologyListener listener) {
144 listenerRegistry.removeListener(listener);
145 }
146
147 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700148 @Override
149 protected TopologyProviderService createProviderService(TopologyProvider provider) {
150 return new InternalTopologyProviderService(provider);
151 }
152
tomcfde0622014-09-09 11:02:42 -0700153 private class InternalTopologyProviderService
154 extends AbstractProviderService<TopologyProvider>
155 implements TopologyProviderService {
156
157 InternalTopologyProviderService(TopologyProvider provider) {
158 super(provider);
159 }
160
161 @Override
162 public void topologyChanged(TopologyDescription topoDescription,
163 List<Event> reasons) {
164 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700165
166 log.info("Topology changed due to: {}", // to be removed soon
167 reasons == null ? "initial compute" : reasons);
tome52ce702014-09-11 00:12:54 -0700168 TopologyEvent event = store.updateTopology(provider().id(),
169 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700170 if (event != null) {
171 log.info("Topology changed due to: {}",
172 reasons == null ? "initial compute" : reasons);
173 eventDispatcher.post(event);
174 }
tomcfde0622014-09-09 11:02:42 -0700175 }
176 }
177
178}