blob: 24bb256604a352eabee1288c3b38d72537fbe098 [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;
14import org.onlab.onos.net.Path;
15import org.onlab.onos.net.provider.AbstractProviderRegistry;
16import org.onlab.onos.net.provider.AbstractProviderService;
tom97937552014-09-11 10:48:42 -070017import org.onlab.onos.net.topology.GraphDescription;
tomcfde0622014-09-09 11:02:42 -070018import org.onlab.onos.net.topology.LinkWeight;
tomcfde0622014-09-09 11:02:42 -070019import org.onlab.onos.net.topology.Topology;
20import org.onlab.onos.net.topology.TopologyCluster;
tomcfde0622014-09-09 11:02:42 -070021import org.onlab.onos.net.topology.TopologyEvent;
tom97937552014-09-11 10:48:42 -070022import org.onlab.onos.net.topology.TopologyGraph;
tomcfde0622014-09-09 11:02:42 -070023import org.onlab.onos.net.topology.TopologyListener;
24import org.onlab.onos.net.topology.TopologyProvider;
25import org.onlab.onos.net.topology.TopologyProviderRegistry;
26import org.onlab.onos.net.topology.TopologyProviderService;
27import org.onlab.onos.net.topology.TopologyService;
28import org.slf4j.Logger;
29
30import java.util.List;
31import java.util.Set;
32
33import static com.google.common.base.Preconditions.checkNotNull;
34import static org.slf4j.LoggerFactory.getLogger;
35
36/**
37 * Provides basic implementation of the topology SB & NB APIs.
38 */
39@Component(immediate = true)
40@Service
41public class SimpleTopologyManager
42 extends AbstractProviderRegistry<TopologyProvider, TopologyProviderService>
43 implements TopologyService, TopologyProviderRegistry {
44
45 public static final String TOPOLOGY_NULL = "Topology cannot be null";
46 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
47 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
48
49 private final Logger log = getLogger(getClass());
50
51 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
52 listenerRegistry = new AbstractListenerRegistry<>();
53
tom0efbb1d2014-09-09 11:54:28 -070054 private final SimpleTopologyStore store = new SimpleTopologyStore();
55
tomcfde0622014-09-09 11:02:42 -070056 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 private EventDeliveryService eventDispatcher;
58
59
60 @Activate
61 public void activate() {
62 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
63 log.info("Started");
64 }
65
66 @Deactivate
67 public void deactivate() {
68 eventDispatcher.removeSink(TopologyEvent.class);
69 log.info("Stopped");
70 }
71
72 @Override
tomdc361b62014-09-09 20:36:52 -070073 public Topology currentTopology() {
74 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070075 }
76
77 @Override
tomdc361b62014-09-09 20:36:52 -070078 public boolean isLatest(Topology topology) {
79 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -070080 return store.isLatest(defaultTopology(topology));
81 }
82
83 // Validates the specified topology and returns it as a default
84 private DefaultTopology defaultTopology(Topology topology) {
85 if (topology instanceof DefaultTopology) {
86 return (DefaultTopology) topology;
87 }
88 throw new IllegalArgumentException("Topology class " + topology.getClass() +
89 " not supported");
tomcfde0622014-09-09 11:02:42 -070090 }
91
92 @Override
93 public Set<TopologyCluster> getClusters(Topology topology) {
94 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -070095 return store.getClusters(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -070096 }
97
98 @Override
tom97937552014-09-11 10:48:42 -070099 public TopologyGraph getGraph(Topology topology) {
tomcfde0622014-09-09 11:02:42 -0700100 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -0700101 return store.getGraph(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -0700102 }
103
104 @Override
105 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
106 checkNotNull(topology, TOPOLOGY_NULL);
107 checkNotNull(src, DEVICE_ID_NULL);
108 checkNotNull(dst, DEVICE_ID_NULL);
tome52ce702014-09-11 00:12:54 -0700109 return store.getPaths(defaultTopology(topology), src, dst);
tomcfde0622014-09-09 11:02:42 -0700110 }
111
112 @Override
113 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
114 checkNotNull(topology, TOPOLOGY_NULL);
115 checkNotNull(src, DEVICE_ID_NULL);
116 checkNotNull(dst, DEVICE_ID_NULL);
117 checkNotNull(weight, "Link weight cannot be null");
tome52ce702014-09-11 00:12:54 -0700118 return store.getPaths(defaultTopology(topology), src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700119 }
120
121 @Override
122 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
123 checkNotNull(topology, TOPOLOGY_NULL);
124 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tome52ce702014-09-11 00:12:54 -0700125 return store.isInfrastructure(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700126 }
127
128 @Override
129 public boolean isInBroadcastTree(Topology topology, ConnectPoint connectPoint) {
130 checkNotNull(topology, TOPOLOGY_NULL);
131 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tome52ce702014-09-11 00:12:54 -0700132 return store.isInBroadcastTree(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700133 }
134
135 @Override
136 public void addListener(TopologyListener listener) {
137 listenerRegistry.addListener(listener);
138 }
139
140 @Override
141 public void removeListener(TopologyListener listener) {
142 listenerRegistry.removeListener(listener);
143 }
144
145 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700146 @Override
147 protected TopologyProviderService createProviderService(TopologyProvider provider) {
148 return new InternalTopologyProviderService(provider);
149 }
150
tomcfde0622014-09-09 11:02:42 -0700151 private class InternalTopologyProviderService
152 extends AbstractProviderService<TopologyProvider>
153 implements TopologyProviderService {
154
155 InternalTopologyProviderService(TopologyProvider provider) {
156 super(provider);
157 }
158
159 @Override
tom97937552014-09-11 10:48:42 -0700160 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700161 List<Event> reasons) {
162 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700163
tome52ce702014-09-11 00:12:54 -0700164 TopologyEvent event = store.updateTopology(provider().id(),
165 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700166 if (event != null) {
tom97937552014-09-11 10:48:42 -0700167 log.info("Topology {} changed due to: {}", event.subject(),
tomdc361b62014-09-09 20:36:52 -0700168 reasons == null ? "initial compute" : reasons);
169 eventDispatcher.post(event);
170 }
tomcfde0622014-09-09 11:02:42 -0700171 }
172 }
173
174}