blob: 1930ea1f2c954b761935e390be71556f692b5ff8 [file] [log] [blame]
tomdb0d03f2014-08-27 16:34:15 -07001package org.onlab.onos.net.trivial.impl;
2
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;
19import org.onlab.onos.net.link.LinkAdminService;
tomdb0d03f2014-08-27 16:34:15 -070020import org.onlab.onos.net.link.LinkDescription;
tom5f38b3a2014-08-27 23:50:54 -070021import org.onlab.onos.net.link.LinkEvent;
22import org.onlab.onos.net.link.LinkListener;
tomdb0d03f2014-08-27 16:34:15 -070023import org.onlab.onos.net.link.LinkProvider;
tom96dfcab2014-08-28 09:26:03 -070024import org.onlab.onos.net.link.LinkProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070025import org.onlab.onos.net.link.LinkProviderService;
tomeadbb462014-09-07 16:10:19 -070026import org.onlab.onos.net.link.LinkService;
tom96dfcab2014-08-28 09:26:03 -070027import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070028import org.onlab.onos.net.provider.AbstractProviderService;
29import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070030
alshabibdf652ad2014-09-09 11:53:19 -070031import com.google.common.collect.Sets;
tomdb0d03f2014-08-27 16:34:15 -070032
33/**
34 * Provides basic implementation of the link SB & NB APIs.
35 */
36@Component(immediate = true)
37@Service
tom5f38b3a2014-08-27 23:50:54 -070038public class SimpleLinkManager
tomdc361b62014-09-09 20:36:52 -070039 extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
40 implements LinkService, LinkAdminService, LinkProviderRegistry {
tomeadbb462014-09-07 16:10:19 -070041
42 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
43 private static final String LINK_DESC_NULL = "Link description cannot be null";
44 private static final String CONNECT_POINT_NULL = "Connection point cannot be null";
tomdb0d03f2014-08-27 16:34:15 -070045
tom5f38b3a2014-08-27 23:50:54 -070046 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070047
tom96dfcab2014-08-28 09:26:03 -070048 private final AbstractListenerRegistry<LinkEvent, LinkListener>
tomdc361b62014-09-09 20:36:52 -070049 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070050
tom4c6606f2014-09-07 11:11:21 -070051 private final SimpleLinkStore store = new SimpleLinkStore();
52
tom5f38b3a2014-08-27 23:50:54 -070053 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom0d395262014-09-07 16:53:40 -070054 protected EventDeliveryService eventDispatcher;
tomdb0d03f2014-08-27 16:34:15 -070055
56 @Activate
57 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070058 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070059 log.info("Started");
60 }
61
62 @Deactivate
63 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070064 eventDispatcher.removeSink(LinkEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070065 log.info("Stopped");
66 }
67
68 @Override
tomeadbb462014-09-07 16:10:19 -070069 public int getLinkCount() {
70 return store.getLinkCount();
71 }
72
73 @Override
74 public Iterable<Link> getLinks() {
75 return store.getLinks();
76 }
77
78 @Override
79 public Set<Link> getDeviceLinks(DeviceId deviceId) {
80 checkNotNull(deviceId, DEVICE_ID_NULL);
81 return Sets.union(store.getDeviceEgressLinks(deviceId),
tomdc361b62014-09-09 20:36:52 -070082 store.getDeviceIngressLinks(deviceId));
tomeadbb462014-09-07 16:10:19 -070083 }
84
85 @Override
86 public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
87 checkNotNull(deviceId, DEVICE_ID_NULL);
88 return store.getDeviceEgressLinks(deviceId);
89 }
90
91 @Override
tomd176fc42014-09-08 00:12:30 -070092 public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
tomeadbb462014-09-07 16:10:19 -070093 checkNotNull(deviceId, DEVICE_ID_NULL);
94 return store.getDeviceIngressLinks(deviceId);
95 }
96
97 @Override
98 public Set<Link> getLinks(ConnectPoint connectPoint) {
99 checkNotNull(connectPoint, CONNECT_POINT_NULL);
100 return Sets.union(store.getEgressLinks(connectPoint),
tomdc361b62014-09-09 20:36:52 -0700101 store.getIngressLinks(connectPoint));
tomeadbb462014-09-07 16:10:19 -0700102 }
103
104 @Override
105 public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
106 checkNotNull(connectPoint, CONNECT_POINT_NULL);
107 return store.getEgressLinks(connectPoint);
108 }
109
110 @Override
tomd176fc42014-09-08 00:12:30 -0700111 public Set<Link> getIngressLinks(ConnectPoint connectPoint) {
tomeadbb462014-09-07 16:10:19 -0700112 checkNotNull(connectPoint, CONNECT_POINT_NULL);
113 return store.getIngressLinks(connectPoint);
114 }
115
116 @Override
tomd176fc42014-09-08 00:12:30 -0700117 public Link getLink(ConnectPoint src, ConnectPoint dst) {
tomeadbb462014-09-07 16:10:19 -0700118 checkNotNull(src, CONNECT_POINT_NULL);
119 checkNotNull(dst, CONNECT_POINT_NULL);
tomd176fc42014-09-08 00:12:30 -0700120 return store.getLink(src, dst);
tomeadbb462014-09-07 16:10:19 -0700121 }
122
123 @Override
124 public void removeLinks(ConnectPoint connectPoint) {
125 removeLinks(getLinks(connectPoint));
126 }
127
128 @Override
129 public void removeLinks(DeviceId deviceId) {
130 removeLinks(getDeviceLinks(deviceId));
131 }
132
133 @Override
134 public void addListener(LinkListener listener) {
135 listenerRegistry.addListener(listener);
136 }
137
138 @Override
139 public void removeListener(LinkListener listener) {
140 listenerRegistry.removeListener(listener);
141 }
142
tom7869ad92014-09-09 14:32:08 -0700143 @Override
144 protected LinkProviderService createProviderService(LinkProvider provider) {
145 return new InternalLinkProviderService(provider);
146 }
147
tomdb0d03f2014-08-27 16:34:15 -0700148 // Personalized link provider service issued to the supplied provider.
tomdc361b62014-09-09 20:36:52 -0700149 private class InternalLinkProviderService
150 extends AbstractProviderService<LinkProvider>
151 implements LinkProviderService {
tomdb0d03f2014-08-27 16:34:15 -0700152
tomcfde0622014-09-09 11:02:42 -0700153 InternalLinkProviderService(LinkProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700154 super(provider);
155 }
156
157 @Override
158 public void linkDetected(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700159 checkNotNull(linkDescription, LINK_DESC_NULL);
160 checkValidity();
tomeadbb462014-09-07 16:10:19 -0700161 LinkEvent event = store.createOrUpdateLink(provider().id(),
tomdc361b62014-09-09 20:36:52 -0700162 linkDescription);
163 if (event != null) {
164 log.debug("Link {} detected", linkDescription);
165 post(event);
166 }
tomdb0d03f2014-08-27 16:34:15 -0700167 }
168
169 @Override
170 public void linkVanished(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700171 checkNotNull(linkDescription, LINK_DESC_NULL);
172 checkValidity();
tomeadbb462014-09-07 16:10:19 -0700173 LinkEvent event = store.removeLink(linkDescription.src(),
tomdc361b62014-09-09 20:36:52 -0700174 linkDescription.dst());
175 if (event != null) {
176 log.info("Link {} vanished", linkDescription);
177 post(event);
178 }
tomeadbb462014-09-07 16:10:19 -0700179 }
180
181 @Override
182 public void linksVanished(ConnectPoint connectPoint) {
183 checkNotNull(connectPoint, "Connect point cannot be null");
184 checkValidity();
tomdc361b62014-09-09 20:36:52 -0700185 log.info("Links for connection point {} vanished", connectPoint);
tomeadbb462014-09-07 16:10:19 -0700186 removeLinks(getLinks(connectPoint));
187 }
188
189 @Override
190 public void linksVanished(DeviceId deviceId) {
191 checkNotNull(deviceId, DEVICE_ID_NULL);
192 checkValidity();
tomdc361b62014-09-09 20:36:52 -0700193 log.info("Links for device {} vanished", deviceId);
tomeadbb462014-09-07 16:10:19 -0700194 removeLinks(getDeviceLinks(deviceId));
tomdb0d03f2014-08-27 16:34:15 -0700195 }
196 }
tomeadbb462014-09-07 16:10:19 -0700197
198 // Removes all links in the specified set and emits appropriate events.
199 private void removeLinks(Set<Link> links) {
200 for (Link link : links) {
201 LinkEvent event = store.removeLink(link.src(), link.dst());
202 post(event);
203 }
204 }
205
206 // Posts the specified event to the local event dispatcher.
207 private void post(LinkEvent event) {
tomdc361b62014-09-09 20:36:52 -0700208 if (event != null) {
tomeadbb462014-09-07 16:10:19 -0700209 eventDispatcher.post(event);
210 }
211 }
212
tomdb0d03f2014-08-27 16:34:15 -0700213}