blob: 724264239e19769818d8c2dc90a4123384552f89 [file] [log] [blame]
tom8bf2e6b2014-09-10 20:53:54 -07001package org.onlab.onos.net.trivial.link.impl;
tomdb0d03f2014-08-27 16:34:15 -07002
alshabibdf652ad2014-09-09 11:53:19 -07003import static com.google.common.base.Preconditions.checkNotNull;
4import static org.slf4j.LoggerFactory.getLogger;
5
6import java.util.Set;
7
tomdb0d03f2014-08-27 16:34:15 -07008import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -070011import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -070013import org.apache.felix.scr.annotations.Service;
tom96dfcab2014-08-28 09:26:03 -070014import org.onlab.onos.event.AbstractListenerRegistry;
15import org.onlab.onos.event.EventDeliveryService;
tomeadbb462014-09-07 16:10:19 -070016import org.onlab.onos.net.ConnectPoint;
17import org.onlab.onos.net.DeviceId;
18import org.onlab.onos.net.Link;
tom89b63c52014-09-16 09:19:51 -070019import org.onlab.onos.net.device.DeviceEvent;
20import org.onlab.onos.net.device.DeviceListener;
21import org.onlab.onos.net.device.DeviceService;
tomeadbb462014-09-07 16:10:19 -070022import org.onlab.onos.net.link.LinkAdminService;
tomdb0d03f2014-08-27 16:34:15 -070023import org.onlab.onos.net.link.LinkDescription;
tom5f38b3a2014-08-27 23:50:54 -070024import org.onlab.onos.net.link.LinkEvent;
25import org.onlab.onos.net.link.LinkListener;
tomdb0d03f2014-08-27 16:34:15 -070026import org.onlab.onos.net.link.LinkProvider;
tom96dfcab2014-08-28 09:26:03 -070027import org.onlab.onos.net.link.LinkProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070028import org.onlab.onos.net.link.LinkProviderService;
tomeadbb462014-09-07 16:10:19 -070029import org.onlab.onos.net.link.LinkService;
tom96dfcab2014-08-28 09:26:03 -070030import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070031import org.onlab.onos.net.provider.AbstractProviderService;
32import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070033
alshabibdf652ad2014-09-09 11:53:19 -070034import com.google.common.collect.Sets;
tomdb0d03f2014-08-27 16:34:15 -070035
36/**
37 * Provides basic implementation of the link SB & NB APIs.
38 */
39@Component(immediate = true)
40@Service
tom5f38b3a2014-08-27 23:50:54 -070041public class SimpleLinkManager
tomdc361b62014-09-09 20:36:52 -070042 extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
43 implements LinkService, LinkAdminService, LinkProviderRegistry {
tomeadbb462014-09-07 16:10:19 -070044
45 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
46 private static final String LINK_DESC_NULL = "Link description cannot be null";
47 private static final String CONNECT_POINT_NULL = "Connection point cannot be null";
tomdb0d03f2014-08-27 16:34:15 -070048
tom5f38b3a2014-08-27 23:50:54 -070049 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070050
tomb86066b2014-09-15 09:52:24 -070051 protected final AbstractListenerRegistry<LinkEvent, LinkListener>
tomdc361b62014-09-09 20:36:52 -070052 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070053
tom4c6606f2014-09-07 11:11:21 -070054 private final SimpleLinkStore store = new SimpleLinkStore();
tom89b63c52014-09-16 09:19:51 -070055 private final DeviceListener deviceListener = new InnerDeviceListener();
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected DeviceService deviceService;
tom4c6606f2014-09-07 11:11:21 -070059
tom5f38b3a2014-08-27 23:50:54 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom0d395262014-09-07 16:53:40 -070061 protected EventDeliveryService eventDispatcher;
tomdb0d03f2014-08-27 16:34:15 -070062
63 @Activate
64 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070065 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
tom89b63c52014-09-16 09:19:51 -070066 deviceService.addListener(deviceListener);
tomdb0d03f2014-08-27 16:34:15 -070067 log.info("Started");
68 }
69
70 @Deactivate
71 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070072 eventDispatcher.removeSink(LinkEvent.class);
tom89b63c52014-09-16 09:19:51 -070073 deviceService.removeListener(deviceListener);
tomdb0d03f2014-08-27 16:34:15 -070074 log.info("Stopped");
75 }
76
77 @Override
tomeadbb462014-09-07 16:10:19 -070078 public int getLinkCount() {
79 return store.getLinkCount();
80 }
81
82 @Override
83 public Iterable<Link> getLinks() {
84 return store.getLinks();
85 }
86
87 @Override
88 public Set<Link> getDeviceLinks(DeviceId deviceId) {
89 checkNotNull(deviceId, DEVICE_ID_NULL);
90 return Sets.union(store.getDeviceEgressLinks(deviceId),
tomdc361b62014-09-09 20:36:52 -070091 store.getDeviceIngressLinks(deviceId));
tomeadbb462014-09-07 16:10:19 -070092 }
93
94 @Override
95 public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
96 checkNotNull(deviceId, DEVICE_ID_NULL);
97 return store.getDeviceEgressLinks(deviceId);
98 }
99
100 @Override
tomd176fc42014-09-08 00:12:30 -0700101 public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
tomeadbb462014-09-07 16:10:19 -0700102 checkNotNull(deviceId, DEVICE_ID_NULL);
103 return store.getDeviceIngressLinks(deviceId);
104 }
105
106 @Override
107 public Set<Link> getLinks(ConnectPoint connectPoint) {
108 checkNotNull(connectPoint, CONNECT_POINT_NULL);
109 return Sets.union(store.getEgressLinks(connectPoint),
tomdc361b62014-09-09 20:36:52 -0700110 store.getIngressLinks(connectPoint));
tomeadbb462014-09-07 16:10:19 -0700111 }
112
113 @Override
114 public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
115 checkNotNull(connectPoint, CONNECT_POINT_NULL);
116 return store.getEgressLinks(connectPoint);
117 }
118
119 @Override
tomd176fc42014-09-08 00:12:30 -0700120 public Set<Link> getIngressLinks(ConnectPoint connectPoint) {
tomeadbb462014-09-07 16:10:19 -0700121 checkNotNull(connectPoint, CONNECT_POINT_NULL);
122 return store.getIngressLinks(connectPoint);
123 }
124
125 @Override
tomd176fc42014-09-08 00:12:30 -0700126 public Link getLink(ConnectPoint src, ConnectPoint dst) {
tomeadbb462014-09-07 16:10:19 -0700127 checkNotNull(src, CONNECT_POINT_NULL);
128 checkNotNull(dst, CONNECT_POINT_NULL);
tomd176fc42014-09-08 00:12:30 -0700129 return store.getLink(src, dst);
tomeadbb462014-09-07 16:10:19 -0700130 }
131
132 @Override
133 public void removeLinks(ConnectPoint connectPoint) {
134 removeLinks(getLinks(connectPoint));
135 }
136
137 @Override
138 public void removeLinks(DeviceId deviceId) {
139 removeLinks(getDeviceLinks(deviceId));
140 }
141
142 @Override
143 public void addListener(LinkListener listener) {
144 listenerRegistry.addListener(listener);
145 }
146
147 @Override
148 public void removeListener(LinkListener listener) {
149 listenerRegistry.removeListener(listener);
150 }
151
tom89b63c52014-09-16 09:19:51 -0700152 // Auxiliary interceptor for device remove events to prune links that
153 // are associated with the removed device or its port.
154 private class InnerDeviceListener implements DeviceListener {
155 @Override
156 public void event(DeviceEvent event) {
157 if (event.type() == DeviceEvent.Type.DEVICE_REMOVED) {
158 removeLinks(event.subject().id());
159 } else if (event.type() == DeviceEvent.Type.PORT_REMOVED) {
160 removeLinks(new ConnectPoint(event.subject().id(),
161 event.port().number()));
162 }
163 }
164 }
165
tom7869ad92014-09-09 14:32:08 -0700166 @Override
167 protected LinkProviderService createProviderService(LinkProvider provider) {
168 return new InternalLinkProviderService(provider);
169 }
170
tomdb0d03f2014-08-27 16:34:15 -0700171 // Personalized link provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700172 private class InternalLinkProviderService
173 extends AbstractProviderService<LinkProvider>
174 implements LinkProviderService {
tomdb0d03f2014-08-27 16:34:15 -0700175
tomcfde0622014-09-09 11:02:42 -0700176 InternalLinkProviderService(LinkProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700177 super(provider);
178 }
179
180 @Override
181 public void linkDetected(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700182 checkNotNull(linkDescription, LINK_DESC_NULL);
183 checkValidity();
tomeadbb462014-09-07 16:10:19 -0700184 LinkEvent event = store.createOrUpdateLink(provider().id(),
tomdc361b62014-09-09 20:36:52 -0700185 linkDescription);
186 if (event != null) {
187 log.debug("Link {} detected", linkDescription);
188 post(event);
189 }
tomdb0d03f2014-08-27 16:34:15 -0700190 }
191
192 @Override
193 public void linkVanished(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700194 checkNotNull(linkDescription, LINK_DESC_NULL);
195 checkValidity();
tomeadbb462014-09-07 16:10:19 -0700196 LinkEvent event = store.removeLink(linkDescription.src(),
tomdc361b62014-09-09 20:36:52 -0700197 linkDescription.dst());
198 if (event != null) {
199 log.info("Link {} vanished", linkDescription);
200 post(event);
201 }
tomeadbb462014-09-07 16:10:19 -0700202 }
203
204 @Override
205 public void linksVanished(ConnectPoint connectPoint) {
206 checkNotNull(connectPoint, "Connect point cannot be null");
207 checkValidity();
tomdc361b62014-09-09 20:36:52 -0700208 log.info("Links for connection point {} vanished", connectPoint);
tomeadbb462014-09-07 16:10:19 -0700209 removeLinks(getLinks(connectPoint));
210 }
211
212 @Override
213 public void linksVanished(DeviceId deviceId) {
214 checkNotNull(deviceId, DEVICE_ID_NULL);
215 checkValidity();
tomdc361b62014-09-09 20:36:52 -0700216 log.info("Links for device {} vanished", deviceId);
tomeadbb462014-09-07 16:10:19 -0700217 removeLinks(getDeviceLinks(deviceId));
tomdb0d03f2014-08-27 16:34:15 -0700218 }
219 }
tomeadbb462014-09-07 16:10:19 -0700220
221 // Removes all links in the specified set and emits appropriate events.
222 private void removeLinks(Set<Link> links) {
223 for (Link link : links) {
224 LinkEvent event = store.removeLink(link.src(), link.dst());
225 post(event);
226 }
227 }
228
229 // Posts the specified event to the local event dispatcher.
230 private void post(LinkEvent event) {
tomdc361b62014-09-09 20:36:52 -0700231 if (event != null) {
tomeadbb462014-09-07 16:10:19 -0700232 eventDispatcher.post(event);
233 }
234 }
235
tomdb0d03f2014-08-27 16:34:15 -0700236}