blob: c2c99755022349be33df11e32bff86665da4b64d [file] [log] [blame]
wei wei89ddc322015-03-22 16:29:04 -05001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070016
17package org.onosproject.incubator.net.tunnel.impl;
wei wei89ddc322015-03-22 16:29:04 -050018
jccd8697232015-05-05 14:42:23 +080019import static com.google.common.base.Preconditions.checkNotNull;
jcc4a20a5f2015-04-30 15:43:39 +080020import static org.slf4j.LoggerFactory.getLogger;
21
22import java.util.Collection;
23import java.util.Set;
jcc4a20a5f2015-04-30 15:43:39 +080024
wei wei89ddc322015-03-22 16:29:04 -050025import org.apache.felix.scr.annotations.Activate;
26import org.apache.felix.scr.annotations.Component;
27import org.apache.felix.scr.annotations.Deactivate;
28import org.apache.felix.scr.annotations.Reference;
29import org.apache.felix.scr.annotations.ReferenceCardinality;
30import org.apache.felix.scr.annotations.Service;
jcc4a20a5f2015-04-30 15:43:39 +080031import org.onosproject.core.ApplicationId;
wei wei89ddc322015-03-22 16:29:04 -050032import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070033import org.onosproject.event.ListenerRegistry;
jcc4a20a5f2015-04-30 15:43:39 +080034import org.onosproject.net.Annotations;
wei wei89ddc322015-03-22 16:29:04 -050035import org.onosproject.net.Path;
wei wei89ddc322015-03-22 16:29:04 -050036import org.onosproject.net.provider.AbstractProviderRegistry;
37import org.onosproject.net.provider.AbstractProviderService;
38import org.onosproject.net.provider.ProviderId;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070039import org.onosproject.incubator.net.tunnel.DefaultTunnel;
40import org.onosproject.incubator.net.tunnel.Tunnel;
41import org.onosproject.incubator.net.tunnel.Tunnel.Type;
42import org.onosproject.incubator.net.tunnel.TunnelAdminService;
43import org.onosproject.incubator.net.tunnel.TunnelDescription;
44import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
45import org.onosproject.incubator.net.tunnel.TunnelEvent;
46import org.onosproject.incubator.net.tunnel.TunnelId;
47import org.onosproject.incubator.net.tunnel.TunnelListener;
48import org.onosproject.incubator.net.tunnel.TunnelName;
49import org.onosproject.incubator.net.tunnel.TunnelProvider;
50import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
51import org.onosproject.incubator.net.tunnel.TunnelProviderService;
52import org.onosproject.incubator.net.tunnel.TunnelService;
53import org.onosproject.incubator.net.tunnel.TunnelStore;
54import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
55import org.onosproject.incubator.net.tunnel.TunnelSubscription;
wei wei89ddc322015-03-22 16:29:04 -050056import org.slf4j.Logger;
57
58/**
59 * Provides implementation of the tunnel NB/SB APIs.
60 */
61@Component(immediate = true, enabled = true)
62@Service
jcc4a20a5f2015-04-30 15:43:39 +080063public class TunnelManager
64 extends AbstractProviderRegistry<TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050065 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
66
67 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
68
69 private final Logger log = getLogger(getClass());
70
Simon Huntff663742015-05-14 13:33:05 -070071 protected final ListenerRegistry<TunnelEvent, TunnelListener>
72 listenerRegistry = new ListenerRegistry<>();
wei wei89ddc322015-03-22 16:29:04 -050073
74 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080075
wei wei89ddc322015-03-22 16:29:04 -050076
77 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
78 protected TunnelStore store;
79
80 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
81 protected EventDeliveryService eventDispatcher;
82
wei wei89ddc322015-03-22 16:29:04 -050083 @Activate
84 public void activate() {
jccd8697232015-05-05 14:42:23 +080085 store.setDelegate(delegate);
86 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050087 log.info("Started");
88 }
89
90 @Deactivate
91 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080092 store.unsetDelegate(delegate);
93 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050094 log.info("Stopped");
95 }
96
97 @Override
jccd8697232015-05-05 14:42:23 +080098 public void removeTunnel(TunnelId tunnelId) {
99 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
100 store.deleteTunnel(tunnelId);
101 Tunnel tunnel = store.queryTunnel(tunnelId);
102 if (tunnel.providerId() != null) {
103 TunnelProvider provider = getProvider(tunnel.providerId());
104 if (provider != null) {
105 provider.releaseTunnel(tunnel);
106 }
107 } else {
108 Set<ProviderId> ids = getProviders();
109 for (ProviderId providerId : ids) {
110 TunnelProvider provider = getProvider(providerId);
111 provider.releaseTunnel(tunnel);
112 }
113 }
114 }
115
116 @Override
117 public void updateTunnel(Tunnel tunnel, Path path) {
118 store.createOrUpdateTunnel(tunnel);
119 if (tunnel.providerId() != null) {
120 TunnelProvider provider = getProvider(tunnel.providerId());
121 if (provider != null) {
122 provider.updateTunnel(tunnel, path);
123 }
124 } else {
125 Set<ProviderId> ids = getProviders();
126 for (ProviderId providerId : ids) {
127 TunnelProvider provider = getProvider(providerId);
128 provider.updateTunnel(tunnel, path);
129 }
130 }
131 }
132
133 @Override
134 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
135 ProviderId producerName) {
136 store.deleteTunnel(src, dst, producerName);
137 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
138 for (Tunnel tunnel : setTunnels) {
139 if (producerName != null
140 && !tunnel.providerId().equals(producerName)) {
141 continue;
142 }
143 if (tunnel.providerId() != null) {
144 TunnelProvider provider = getProvider(tunnel.providerId());
145 if (provider != null) {
146 provider.releaseTunnel(tunnel);
147 }
148 } else {
149 Set<ProviderId> ids = getProviders();
150 for (ProviderId providerId : ids) {
151 TunnelProvider provider = getProvider(providerId);
152 provider.releaseTunnel(tunnel);
153 }
154 }
155 }
156 }
157
158 @Override
159 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
160 ProviderId producerName) {
161 store.deleteTunnel(src, dst, type, producerName);
162 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
163 for (Tunnel tunnel : setTunnels) {
164 if (producerName != null
165 && !tunnel.providerId().equals(producerName)
166 || !type.equals(tunnel.type())) {
167 continue;
168 }
169 if (tunnel.providerId() != null) {
170 TunnelProvider provider = getProvider(tunnel.providerId());
171 if (provider != null) {
172 provider.releaseTunnel(tunnel);
173 }
174 } else {
175 Set<ProviderId> ids = getProviders();
176 for (ProviderId providerId : ids) {
177 TunnelProvider provider = getProvider(providerId);
178 provider.releaseTunnel(tunnel);
179 }
180 }
181 }
182 }
183
184 @Override
185 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
186 Annotations... annotations) {
187 return store.borrowTunnel(consumerId, tunnelId, annotations);
188 }
189
190 @Override
191 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
192 TunnelName tunnelName,
193 Annotations... annotations) {
194 return store.borrowTunnel(consumerId, tunnelName, annotations);
195 }
196
197 @Override
198 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
199 TunnelEndPoint src, TunnelEndPoint dst,
200 Annotations... annotations) {
201 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
202 dst, annotations);
203 if (tunnels == null || tunnels.size() == 0) {
204 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
205 null, null, annotations);
206 Set<ProviderId> ids = getProviders();
207 for (ProviderId providerId : ids) {
208 TunnelProvider provider = getProvider(providerId);
209 provider.setupTunnel(tunnel, null);
210 }
211 }
212 return tunnels;
213 }
214
215 @Override
216 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
217 TunnelEndPoint src, TunnelEndPoint dst,
218 Type type, Annotations... annotations) {
219 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
220 dst, type,
221 annotations);
222 if (tunnels == null || tunnels.size() == 0) {
223 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
224 null, null, annotations);
225 Set<ProviderId> ids = getProviders();
226 for (ProviderId providerId : ids) {
227 TunnelProvider provider = getProvider(providerId);
228 provider.setupTunnel(tunnel, null);
229 }
230 }
231 return tunnels;
232 }
233
234 @Override
235 public boolean returnTunnel(ApplicationId consumerId,
236 TunnelId tunnelId, Annotations... annotations) {
237 return store.returnTunnel(consumerId, tunnelId, annotations);
238 }
239
240 @Override
241 public boolean returnTunnel(ApplicationId consumerId,
242 TunnelName tunnelName,
243 Annotations... annotations) {
244 return store.returnTunnel(consumerId, tunnelName, annotations);
245 }
246
247 @Override
248 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
249 TunnelEndPoint dst, Type type,
250 Annotations... annotations) {
251 return store.returnTunnel(consumerId, src, dst, type, annotations);
252 }
253
254 @Override
255 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
256 TunnelEndPoint dst, Annotations... annotations) {
257 return store.returnTunnel(consumerId, src, dst, annotations);
258 }
259
260 @Override
261 public Tunnel queryTunnel(TunnelId tunnelId) {
262 return store.queryTunnel(tunnelId);
263 }
264
265 @Override
266 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
267 return store.queryTunnelSubscription(consumerId);
268 }
269
270 @Override
271 public Collection<Tunnel> queryTunnel(Type type) {
272 return store.queryTunnel(type);
273 }
274
275 @Override
276 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
277 return store.queryTunnel(src, dst);
278 }
279
280 @Override
281 public int tunnelCount() {
282 return store.tunnelCount();
283 }
284
285 @Override
wei wei89ddc322015-03-22 16:29:04 -0500286 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500287 return new InternalTunnelProviderService(provider);
288 }
289
290 @Override
wei wei89ddc322015-03-22 16:29:04 -0500291 public void addListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800292 listenerRegistry.addListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500293 }
294
295 @Override
296 public void removeListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800297 listenerRegistry.removeListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500298 }
299
300 private class InternalTunnelProviderService
301 extends AbstractProviderService<TunnelProvider>
302 implements TunnelProviderService {
303 protected InternalTunnelProviderService(TunnelProvider provider) {
304 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500305 }
306
jccd8697232015-05-05 14:42:23 +0800307
wei wei89ddc322015-03-22 16:29:04 -0500308 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800309 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800310 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
311 tunnel.src(), tunnel.dst(),
312 tunnel.type(),
313 tunnel.groupId(),
314 tunnel.id(),
315 tunnel.tunnelName(),
316 tunnel.annotations());
317 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500318 }
319
320 @Override
321 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800322 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
323 tunnel.src(), tunnel.dst(),
324 tunnel.type(),
325 tunnel.groupId(),
326 tunnel.id(),
327 tunnel.tunnelName(),
328 tunnel.annotations());
329 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500330 }
331
332 @Override
333 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800334 if (tunnel.id() != null) {
335 store.deleteTunnel(tunnel.id());
336 }
337 if (tunnel.src() != null && tunnel.dst() != null
338 && tunnel.type() != null) {
339 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
340 provider().id());
341 }
342 if (tunnel.src() != null && tunnel.dst() != null
343 && tunnel.type() == null) {
344 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
345 }
wei wei89ddc322015-03-22 16:29:04 -0500346 }
347
348 }
349
350 private class InternalStoreDelegate implements TunnelStoreDelegate {
351 @Override
352 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500353 if (event != null) {
354 eventDispatcher.post(event);
355 }
356 }
357 }
wei wei89ddc322015-03-22 16:29:04 -0500358}