blob: 159dbb0a1193ebe1456ee3fe83f7910b87ca9a94 [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;
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";
tom13cb4852014-09-11 12:44:17 -070049 private static final String CLUSTER_ID_NULL = "Cluster ID cannot be null";
50 private static final String CLUSTER_NULL = "Topology cluster cannot be null";
tomcfde0622014-09-09 11:02:42 -070051 public static final String CONNECTION_POINT_NULL = "Connection point cannot be null";
52
53 private final Logger log = getLogger(getClass());
54
55 private final AbstractListenerRegistry<TopologyEvent, TopologyListener>
56 listenerRegistry = new AbstractListenerRegistry<>();
57
tom0efbb1d2014-09-09 11:54:28 -070058 private final SimpleTopologyStore store = new SimpleTopologyStore();
59
tomcfde0622014-09-09 11:02:42 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4d0dd3a2014-09-14 23:12:28 -070061 protected EventDeliveryService eventDispatcher;
tomcfde0622014-09-09 11:02:42 -070062
63
64 @Activate
65 public void activate() {
66 eventDispatcher.addSink(TopologyEvent.class, listenerRegistry);
67 log.info("Started");
68 }
69
70 @Deactivate
71 public void deactivate() {
72 eventDispatcher.removeSink(TopologyEvent.class);
73 log.info("Stopped");
74 }
75
76 @Override
tomdc361b62014-09-09 20:36:52 -070077 public Topology currentTopology() {
78 return store.currentTopology();
tomcfde0622014-09-09 11:02:42 -070079 }
80
81 @Override
tomdc361b62014-09-09 20:36:52 -070082 public boolean isLatest(Topology topology) {
83 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -070084 return store.isLatest(defaultTopology(topology));
85 }
86
87 // Validates the specified topology and returns it as a default
88 private DefaultTopology defaultTopology(Topology topology) {
89 if (topology instanceof DefaultTopology) {
90 return (DefaultTopology) topology;
91 }
92 throw new IllegalArgumentException("Topology class " + topology.getClass() +
93 " not supported");
tomcfde0622014-09-09 11:02:42 -070094 }
95
96 @Override
97 public Set<TopologyCluster> getClusters(Topology topology) {
98 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -070099 return store.getClusters(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -0700100 }
101
102 @Override
tom13cb4852014-09-11 12:44:17 -0700103 public TopologyCluster getCluster(Topology topology, ClusterId clusterId) {
104 checkNotNull(topology, TOPOLOGY_NULL);
105 checkNotNull(topology, CLUSTER_ID_NULL);
106 return store.getCluster(defaultTopology(topology), clusterId);
107 }
108
109 @Override
110 public Set<DeviceId> getClusterDevices(Topology topology, TopologyCluster cluster) {
111 checkNotNull(topology, TOPOLOGY_NULL);
112 checkNotNull(topology, CLUSTER_NULL);
113 return store.getClusterDevices(defaultTopology(topology), cluster);
114 }
115
116 @Override
117 public Set<Link> getClusterLinks(Topology topology, TopologyCluster cluster) {
118 checkNotNull(topology, TOPOLOGY_NULL);
119 checkNotNull(topology, CLUSTER_NULL);
120 return store.getClusterLinks(defaultTopology(topology), cluster);
121 }
122
123 @Override
tom97937552014-09-11 10:48:42 -0700124 public TopologyGraph getGraph(Topology topology) {
tomcfde0622014-09-09 11:02:42 -0700125 checkNotNull(topology, TOPOLOGY_NULL);
tome52ce702014-09-11 00:12:54 -0700126 return store.getGraph(defaultTopology(topology));
tomcfde0622014-09-09 11:02:42 -0700127 }
128
129 @Override
130 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst) {
131 checkNotNull(topology, TOPOLOGY_NULL);
132 checkNotNull(src, DEVICE_ID_NULL);
133 checkNotNull(dst, DEVICE_ID_NULL);
tome52ce702014-09-11 00:12:54 -0700134 return store.getPaths(defaultTopology(topology), src, dst);
tomcfde0622014-09-09 11:02:42 -0700135 }
136
137 @Override
138 public Set<Path> getPaths(Topology topology, DeviceId src, DeviceId dst, LinkWeight weight) {
139 checkNotNull(topology, TOPOLOGY_NULL);
140 checkNotNull(src, DEVICE_ID_NULL);
141 checkNotNull(dst, DEVICE_ID_NULL);
142 checkNotNull(weight, "Link weight cannot be null");
tome52ce702014-09-11 00:12:54 -0700143 return store.getPaths(defaultTopology(topology), src, dst, weight);
tomcfde0622014-09-09 11:02:42 -0700144 }
145
146 @Override
147 public boolean isInfrastructure(Topology topology, ConnectPoint connectPoint) {
148 checkNotNull(topology, TOPOLOGY_NULL);
149 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tome52ce702014-09-11 00:12:54 -0700150 return store.isInfrastructure(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700151 }
152
153 @Override
tom4d0dd3a2014-09-14 23:12:28 -0700154 public boolean isBroadcastPoint(Topology topology, ConnectPoint connectPoint) {
tomcfde0622014-09-09 11:02:42 -0700155 checkNotNull(topology, TOPOLOGY_NULL);
156 checkNotNull(connectPoint, CONNECTION_POINT_NULL);
tom4d0dd3a2014-09-14 23:12:28 -0700157 return store.isBroadcastPoint(defaultTopology(topology), connectPoint);
tomcfde0622014-09-09 11:02:42 -0700158 }
159
160 @Override
161 public void addListener(TopologyListener listener) {
162 listenerRegistry.addListener(listener);
163 }
164
165 @Override
166 public void removeListener(TopologyListener listener) {
167 listenerRegistry.removeListener(listener);
168 }
169
170 // Personalized host provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700171 @Override
172 protected TopologyProviderService createProviderService(TopologyProvider provider) {
173 return new InternalTopologyProviderService(provider);
174 }
175
tomcfde0622014-09-09 11:02:42 -0700176 private class InternalTopologyProviderService
177 extends AbstractProviderService<TopologyProvider>
178 implements TopologyProviderService {
179
180 InternalTopologyProviderService(TopologyProvider provider) {
181 super(provider);
182 }
183
184 @Override
tom97937552014-09-11 10:48:42 -0700185 public void topologyChanged(GraphDescription topoDescription,
tomcfde0622014-09-09 11:02:42 -0700186 List<Event> reasons) {
187 checkNotNull(topoDescription, "Topology description cannot be null");
tomcbff9392014-09-10 00:45:23 -0700188
tome52ce702014-09-11 00:12:54 -0700189 TopologyEvent event = store.updateTopology(provider().id(),
190 topoDescription, reasons);
tomdc361b62014-09-09 20:36:52 -0700191 if (event != null) {
tom782a7cf2014-09-11 23:58:38 -0700192 log.info("Topology {} changed", event.subject());
tomdc361b62014-09-09 20:36:52 -0700193 eventDispatcher.post(event);
194 }
tomcfde0622014-09-09 11:02:42 -0700195 }
196 }
197
198}