blob: c7b56c0d5ae9ae3774807906610b609f8580d2ff [file] [log] [blame]
tomdb0d03f2014-08-27 16:34:15 -07001package org.onlab.onos.net.trivial.impl;
2
tomeadbb462014-09-07 16:10:19 -07003import com.google.common.collect.Sets;
tomdb0d03f2014-08-27 16:34:15 -07004import org.apache.felix.scr.annotations.Activate;
5import org.apache.felix.scr.annotations.Component;
6import org.apache.felix.scr.annotations.Deactivate;
tom5f38b3a2014-08-27 23:50:54 -07007import org.apache.felix.scr.annotations.Reference;
8import org.apache.felix.scr.annotations.ReferenceCardinality;
tomdb0d03f2014-08-27 16:34:15 -07009import org.apache.felix.scr.annotations.Service;
tom96dfcab2014-08-28 09:26:03 -070010import org.onlab.onos.event.AbstractListenerRegistry;
11import org.onlab.onos.event.EventDeliveryService;
tomeadbb462014-09-07 16:10:19 -070012import org.onlab.onos.net.ConnectPoint;
13import org.onlab.onos.net.DeviceId;
14import org.onlab.onos.net.Link;
15import org.onlab.onos.net.link.LinkAdminService;
tomdb0d03f2014-08-27 16:34:15 -070016import org.onlab.onos.net.link.LinkDescription;
tom5f38b3a2014-08-27 23:50:54 -070017import org.onlab.onos.net.link.LinkEvent;
18import org.onlab.onos.net.link.LinkListener;
tomdb0d03f2014-08-27 16:34:15 -070019import org.onlab.onos.net.link.LinkProvider;
tom96dfcab2014-08-28 09:26:03 -070020import org.onlab.onos.net.link.LinkProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070021import org.onlab.onos.net.link.LinkProviderService;
tomeadbb462014-09-07 16:10:19 -070022import org.onlab.onos.net.link.LinkService;
tom96dfcab2014-08-28 09:26:03 -070023import org.onlab.onos.net.provider.AbstractProviderRegistry;
tomdb0d03f2014-08-27 16:34:15 -070024import org.onlab.onos.net.provider.AbstractProviderService;
25import org.slf4j.Logger;
tom5f38b3a2014-08-27 23:50:54 -070026
tomeadbb462014-09-07 16:10:19 -070027import java.util.Set;
28
29import static com.google.common.base.Preconditions.checkNotNull;
tom5f38b3a2014-08-27 23:50:54 -070030import static org.slf4j.LoggerFactory.getLogger;
tomdb0d03f2014-08-27 16:34:15 -070031
32/**
33 * Provides basic implementation of the link SB & NB APIs.
34 */
35@Component(immediate = true)
36@Service
tom5f38b3a2014-08-27 23:50:54 -070037public class SimpleLinkManager
tom96dfcab2014-08-28 09:26:03 -070038 extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
tomeadbb462014-09-07 16:10:19 -070039 implements LinkService, LinkAdminService, LinkProviderRegistry {
40
41 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
42 private static final String LINK_DESC_NULL = "Link description cannot be null";
43 private static final String CONNECT_POINT_NULL = "Connection point cannot be null";
tomdb0d03f2014-08-27 16:34:15 -070044
tom5f38b3a2014-08-27 23:50:54 -070045 private final Logger log = getLogger(getClass());
tomdb0d03f2014-08-27 16:34:15 -070046
tom96dfcab2014-08-28 09:26:03 -070047 private final AbstractListenerRegistry<LinkEvent, LinkListener>
48 listenerRegistry = new AbstractListenerRegistry<>();
tom5f38b3a2014-08-27 23:50:54 -070049
tom4c6606f2014-09-07 11:11:21 -070050 private final SimpleLinkStore store = new SimpleLinkStore();
51
tom5f38b3a2014-08-27 23:50:54 -070052 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom0d395262014-09-07 16:53:40 -070053 protected EventDeliveryService eventDispatcher;
tomdb0d03f2014-08-27 16:34:15 -070054
55 @Activate
56 public void activate() {
tom96dfcab2014-08-28 09:26:03 -070057 eventDispatcher.addSink(LinkEvent.class, listenerRegistry);
tomdb0d03f2014-08-27 16:34:15 -070058 log.info("Started");
59 }
60
61 @Deactivate
62 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070063 eventDispatcher.removeSink(LinkEvent.class);
tomdb0d03f2014-08-27 16:34:15 -070064 log.info("Stopped");
65 }
66
67 @Override
tom5f38b3a2014-08-27 23:50:54 -070068 protected LinkProviderService createProviderService(LinkProvider provider) {
69 return new InternalLinkProviderService(provider);
tomdb0d03f2014-08-27 16:34:15 -070070 }
71
tomeadbb462014-09-07 16:10:19 -070072 @Override
73 public int getLinkCount() {
74 return store.getLinkCount();
75 }
76
77 @Override
78 public Iterable<Link> getLinks() {
79 return store.getLinks();
80 }
81
82 @Override
83 public Set<Link> getDeviceLinks(DeviceId deviceId) {
84 checkNotNull(deviceId, DEVICE_ID_NULL);
85 return Sets.union(store.getDeviceEgressLinks(deviceId),
86 store.getDeviceIngressLinks(deviceId));
87 }
88
89 @Override
90 public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
91 checkNotNull(deviceId, DEVICE_ID_NULL);
92 return store.getDeviceEgressLinks(deviceId);
93 }
94
95 @Override
tomd176fc42014-09-08 00:12:30 -070096 public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
tomeadbb462014-09-07 16:10:19 -070097 checkNotNull(deviceId, DEVICE_ID_NULL);
98 return store.getDeviceIngressLinks(deviceId);
99 }
100
101 @Override
102 public Set<Link> getLinks(ConnectPoint connectPoint) {
103 checkNotNull(connectPoint, CONNECT_POINT_NULL);
104 return Sets.union(store.getEgressLinks(connectPoint),
105 store.getIngressLinks(connectPoint));
106 }
107
108 @Override
109 public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
110 checkNotNull(connectPoint, CONNECT_POINT_NULL);
111 return store.getEgressLinks(connectPoint);
112 }
113
114 @Override
tomd176fc42014-09-08 00:12:30 -0700115 public Set<Link> getIngressLinks(ConnectPoint connectPoint) {
tomeadbb462014-09-07 16:10:19 -0700116 checkNotNull(connectPoint, CONNECT_POINT_NULL);
117 return store.getIngressLinks(connectPoint);
118 }
119
120 @Override
tomd176fc42014-09-08 00:12:30 -0700121 public Link getLink(ConnectPoint src, ConnectPoint dst) {
tomeadbb462014-09-07 16:10:19 -0700122 checkNotNull(src, CONNECT_POINT_NULL);
123 checkNotNull(dst, CONNECT_POINT_NULL);
tomd176fc42014-09-08 00:12:30 -0700124 return store.getLink(src, dst);
tomeadbb462014-09-07 16:10:19 -0700125 }
126
127 @Override
128 public void removeLinks(ConnectPoint connectPoint) {
129 removeLinks(getLinks(connectPoint));
130 }
131
132 @Override
133 public void removeLinks(DeviceId deviceId) {
134 removeLinks(getDeviceLinks(deviceId));
135 }
136
137 @Override
138 public void addListener(LinkListener listener) {
139 listenerRegistry.addListener(listener);
140 }
141
142 @Override
143 public void removeListener(LinkListener listener) {
144 listenerRegistry.removeListener(listener);
145 }
146
tomdb0d03f2014-08-27 16:34:15 -0700147 // Personalized link provider service issued to the supplied provider.
148 private class InternalLinkProviderService extends AbstractProviderService<LinkProvider>
149 implements LinkProviderService {
150
tomcfde0622014-09-09 11:02:42 -0700151 InternalLinkProviderService(LinkProvider provider) {
tomdb0d03f2014-08-27 16:34:15 -0700152 super(provider);
153 }
154
155 @Override
156 public void linkDetected(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700157 checkNotNull(linkDescription, LINK_DESC_NULL);
158 checkValidity();
tomdb0d03f2014-08-27 16:34:15 -0700159 log.info("Link {} detected", linkDescription);
tomeadbb462014-09-07 16:10:19 -0700160 LinkEvent event = store.createOrUpdateLink(provider().id(),
161 linkDescription);
162 post(event);
tomdb0d03f2014-08-27 16:34:15 -0700163 }
164
165 @Override
166 public void linkVanished(LinkDescription linkDescription) {
tomeadbb462014-09-07 16:10:19 -0700167 checkNotNull(linkDescription, LINK_DESC_NULL);
168 checkValidity();
tomdb0d03f2014-08-27 16:34:15 -0700169 log.info("Link {} vanished", linkDescription);
tomeadbb462014-09-07 16:10:19 -0700170 LinkEvent event = store.removeLink(linkDescription.src(),
171 linkDescription.dst());
172 post(event);
173 }
174
175 @Override
176 public void linksVanished(ConnectPoint connectPoint) {
177 checkNotNull(connectPoint, "Connect point cannot be null");
178 checkValidity();
179 log.info("Link for connection point {} vanished", connectPoint);
180 removeLinks(getLinks(connectPoint));
181 }
182
183 @Override
184 public void linksVanished(DeviceId deviceId) {
185 checkNotNull(deviceId, DEVICE_ID_NULL);
186 checkValidity();
187 log.info("Link for device {} vanished", deviceId);
188 removeLinks(getDeviceLinks(deviceId));
tomdb0d03f2014-08-27 16:34:15 -0700189 }
190 }
tomeadbb462014-09-07 16:10:19 -0700191
192 // Removes all links in the specified set and emits appropriate events.
193 private void removeLinks(Set<Link> links) {
194 for (Link link : links) {
195 LinkEvent event = store.removeLink(link.src(), link.dst());
196 post(event);
197 }
198 }
199
200 // Posts the specified event to the local event dispatcher.
201 private void post(LinkEvent event) {
202 if (event != null && eventDispatcher != null) {
203 eventDispatcher.post(event);
204 }
205 }
206
tomdb0d03f2014-08-27 16:34:15 -0700207}