blob: 623d0052dafd889894e46a971cbb6c175f7adeff [file] [log] [blame]
wei wei89ddc322015-03-22 16:29:04 -05001/*
Thomas Vachuska52f2cd12018-11-08 21:20:04 -08002 * Copyright 2018-present Open Networking Foundation
wei wei89ddc322015-03-22 16:29:04 -05003 *
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 -070016package org.onosproject.incubator.net.tunnel.impl;
wei wei89ddc322015-03-22 16:29:04 -050017
jcc4a20a5f2015-04-30 15:43:39 +080018import org.onosproject.core.ApplicationId;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070019import org.onosproject.incubator.net.tunnel.DefaultTunnel;
samuel7a5691a2015-05-23 00:36:32 +080020import org.onosproject.incubator.net.tunnel.Tunnel;
Avantika-Huawei1e0a5862016-04-04 14:22:22 +053021import org.onosproject.incubator.net.tunnel.Tunnel.State;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070022import org.onosproject.incubator.net.tunnel.Tunnel.Type;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070023import org.onosproject.incubator.net.tunnel.TunnelAdminService;
24import org.onosproject.incubator.net.tunnel.TunnelDescription;
25import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
26import org.onosproject.incubator.net.tunnel.TunnelEvent;
27import org.onosproject.incubator.net.tunnel.TunnelId;
28import org.onosproject.incubator.net.tunnel.TunnelListener;
29import org.onosproject.incubator.net.tunnel.TunnelName;
30import org.onosproject.incubator.net.tunnel.TunnelProvider;
31import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
32import org.onosproject.incubator.net.tunnel.TunnelProviderService;
33import org.onosproject.incubator.net.tunnel.TunnelService;
34import org.onosproject.incubator.net.tunnel.TunnelStore;
35import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
36import org.onosproject.incubator.net.tunnel.TunnelSubscription;
samuel7a5691a2015-05-23 00:36:32 +080037import org.onosproject.net.Annotations;
cheng fan35dc0f22015-06-10 06:02:47 +080038import org.onosproject.net.DeviceId;
Avantika-Huaweie10a6e92016-04-06 21:06:41 +053039import org.onosproject.net.ElementId;
samuel7a5691a2015-05-23 00:36:32 +080040import org.onosproject.net.Path;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070041import org.onosproject.net.provider.AbstractListenerProviderRegistry;
samuel7a5691a2015-05-23 00:36:32 +080042import org.onosproject.net.provider.AbstractProviderService;
43import org.onosproject.net.provider.ProviderId;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070044import org.osgi.service.component.annotations.Activate;
45import org.osgi.service.component.annotations.Component;
46import org.osgi.service.component.annotations.Deactivate;
47import org.osgi.service.component.annotations.Reference;
48import org.osgi.service.component.annotations.ReferenceCardinality;
wei wei89ddc322015-03-22 16:29:04 -050049import org.slf4j.Logger;
50
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070051import java.util.Collection;
52import java.util.Collections;
53import java.util.Set;
54
55import static com.google.common.base.Preconditions.checkNotNull;
56import static org.slf4j.LoggerFactory.getLogger;
57
wei wei89ddc322015-03-22 16:29:04 -050058/**
59 * Provides implementation of the tunnel NB/SB APIs.
60 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070061@Component(immediate = true, service = {TunnelService.class, TunnelAdminService.class, TunnelProviderRegistry.class})
jcc4a20a5f2015-04-30 15:43:39 +080062public class TunnelManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070063 extends AbstractListenerProviderRegistry<TunnelEvent, TunnelListener,
64 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";
Satish Kd70e9572016-04-28 13:58:51 +053068 private static final String TUNNNEL_NULL = "Tunnel cannot be null";
wei wei89ddc322015-03-22 16:29:04 -050069
70 private final Logger log = getLogger(getClass());
71
wei wei89ddc322015-03-22 16:29:04 -050072 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080073
Ray Milkeyd84f89b2018-08-17 14:54:17 -070074 @Reference(cardinality = ReferenceCardinality.MANDATORY)
wei wei89ddc322015-03-22 16:29:04 -050075 protected TunnelStore store;
76
wei wei89ddc322015-03-22 16:29:04 -050077
wei wei89ddc322015-03-22 16:29:04 -050078 @Activate
79 public void activate() {
jccd8697232015-05-05 14:42:23 +080080 store.setDelegate(delegate);
81 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050082 log.info("Started");
83 }
84
85 @Deactivate
86 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080087 store.unsetDelegate(delegate);
88 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050089 log.info("Stopped");
90 }
91
92 @Override
jccd8697232015-05-05 14:42:23 +080093 public void removeTunnel(TunnelId tunnelId) {
94 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
jccd8697232015-05-05 14:42:23 +080095 Tunnel tunnel = store.queryTunnel(tunnelId);
Satish Kd8adcef2016-04-26 16:31:14 +053096 if (tunnel != null) {
97 store.deleteTunnel(tunnelId);
98 if (tunnel.providerId() != null) {
99 TunnelProvider provider = getProvider(tunnel.providerId());
100 if (provider != null) {
101 provider.releaseTunnel(tunnel);
102 }
103 } else {
104 Set<ProviderId> ids = getProviders();
105 for (ProviderId providerId : ids) {
106 TunnelProvider provider = getProvider(providerId);
107 provider.releaseTunnel(tunnel);
108 }
jccd8697232015-05-05 14:42:23 +0800109 }
110 }
111 }
112
113 @Override
114 public void updateTunnel(Tunnel tunnel, Path path) {
115 store.createOrUpdateTunnel(tunnel);
116 if (tunnel.providerId() != null) {
117 TunnelProvider provider = getProvider(tunnel.providerId());
118 if (provider != null) {
119 provider.updateTunnel(tunnel, path);
120 }
121 } else {
122 Set<ProviderId> ids = getProviders();
123 for (ProviderId providerId : ids) {
124 TunnelProvider provider = getProvider(providerId);
125 provider.updateTunnel(tunnel, path);
126 }
127 }
128 }
129
130 @Override
tony-liu1abfb632016-11-09 15:22:51 +0800131 public void updateTunnelState(Tunnel tunnel, State state) {
132 Tunnel storedTunnel = store.queryTunnel(tunnel.tunnelId());
133 store.createOrUpdateTunnel(storedTunnel, state);
134 }
135
136 @Override
jccd8697232015-05-05 14:42:23 +0800137 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
138 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800139 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530140 if (!setTunnels.isEmpty()) {
141 store.deleteTunnel(src, dst, producerName);
142 for (Tunnel tunnel : setTunnels) {
143 if (producerName != null
144 && !tunnel.providerId().equals(producerName)) {
145 continue;
jccd8697232015-05-05 14:42:23 +0800146 }
Satish Kd8adcef2016-04-26 16:31:14 +0530147 if (tunnel.providerId() != null) {
148 TunnelProvider provider = getProvider(tunnel.providerId());
149 if (provider != null) {
150 provider.releaseTunnel(tunnel);
151 }
152 } else {
153 Set<ProviderId> ids = getProviders();
154 for (ProviderId providerId : ids) {
155 TunnelProvider provider = getProvider(providerId);
156 provider.releaseTunnel(tunnel);
157 }
jccd8697232015-05-05 14:42:23 +0800158 }
159 }
160 }
161 }
162
163 @Override
164 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
165 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800166 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530167 if (!setTunnels.isEmpty()) {
168 store.deleteTunnel(src, dst, type, producerName);
169 for (Tunnel tunnel : setTunnels) {
170 if (producerName != null
171 && !tunnel.providerId().equals(producerName)
172 || !type.equals(tunnel.type())) {
173 continue;
jccd8697232015-05-05 14:42:23 +0800174 }
Satish Kd8adcef2016-04-26 16:31:14 +0530175 if (tunnel.providerId() != null) {
176 TunnelProvider provider = getProvider(tunnel.providerId());
177 if (provider != null) {
178 provider.releaseTunnel(tunnel);
179 }
180 } else {
181 Set<ProviderId> ids = getProviders();
182 for (ProviderId providerId : ids) {
183 TunnelProvider provider = getProvider(providerId);
184 provider.releaseTunnel(tunnel);
185 }
jccd8697232015-05-05 14:42:23 +0800186 }
187 }
188 }
189 }
190
191 @Override
192 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
193 Annotations... annotations) {
194 return store.borrowTunnel(consumerId, tunnelId, annotations);
195 }
196
197 @Override
198 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
199 TunnelName tunnelName,
200 Annotations... annotations) {
201 return store.borrowTunnel(consumerId, tunnelName, annotations);
202 }
203
204 @Override
205 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
206 TunnelEndPoint src, TunnelEndPoint dst,
207 Annotations... annotations) {
208 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
209 dst, annotations);
Jon Hallcbd1b392017-01-18 20:15:44 -0800210 if (tunnels == null || tunnels.isEmpty()) {
jccd8697232015-05-05 14:42:23 +0800211 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
212 null, null, annotations);
213 Set<ProviderId> ids = getProviders();
214 for (ProviderId providerId : ids) {
215 TunnelProvider provider = getProvider(providerId);
216 provider.setupTunnel(tunnel, null);
217 }
218 }
219 return tunnels;
220 }
221
222 @Override
223 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
224 TunnelEndPoint src, TunnelEndPoint dst,
225 Type type, Annotations... annotations) {
226 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
227 dst, type,
228 annotations);
Jon Hallcbd1b392017-01-18 20:15:44 -0800229 if (tunnels == null || tunnels.isEmpty()) {
jccd8697232015-05-05 14:42:23 +0800230 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
231 null, null, annotations);
232 Set<ProviderId> ids = getProviders();
233 for (ProviderId providerId : ids) {
234 TunnelProvider provider = getProvider(providerId);
235 provider.setupTunnel(tunnel, null);
236 }
237 }
238 return tunnels;
239 }
240
241 @Override
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530242 public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) {
Satish Kd70e9572016-04-28 13:58:51 +0530243 // TODO: producerId to check if really required to consider while setup the tunnel.
244 checkNotNull(tunnel, TUNNNEL_NULL);
245 TunnelId tunnelId = store.createOrUpdateTunnel(tunnel, State.INIT);
246 if (tunnelId != null) {
247 Set<ProviderId> ids = getProviders();
chengfan42782b52016-12-30 15:03:55 +0800248 Tunnel newT = queryTunnel(tunnelId);
Satish Kd70e9572016-04-28 13:58:51 +0530249 for (ProviderId providerId : ids) {
250 TunnelProvider provider = getProvider(providerId);
chengfan42782b52016-12-30 15:03:55 +0800251 provider.setupTunnel(srcElementId, newT, path);
Satish Kd70e9572016-04-28 13:58:51 +0530252 }
253 }
254 return tunnelId;
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530255 }
256
257 @Override
258 public boolean downTunnel(ApplicationId producerId, TunnelId tunnelId) {
Satish Kd70e9572016-04-28 13:58:51 +0530259 // TODO: producerId to check if really required to consider while deleting the tunnel.
260 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
261 Tunnel tunnel = store.queryTunnel(tunnelId);
262 if (tunnel != null) {
263 TunnelId updtTunnelId = store.createOrUpdateTunnel(tunnel, State.INACTIVE);
264 if (updtTunnelId != null) {
265 Set<ProviderId> ids = getProviders();
266 for (ProviderId providerId : ids) {
267 TunnelProvider provider = getProvider(providerId);
268 provider.releaseTunnel(tunnel);
269 }
270 }
271 return true;
272 }
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530273 return false;
274 }
275
276 @Override
jccd8697232015-05-05 14:42:23 +0800277 public boolean returnTunnel(ApplicationId consumerId,
278 TunnelId tunnelId, Annotations... annotations) {
279 return store.returnTunnel(consumerId, tunnelId, annotations);
280 }
281
282 @Override
283 public boolean returnTunnel(ApplicationId consumerId,
284 TunnelName tunnelName,
285 Annotations... annotations) {
286 return store.returnTunnel(consumerId, tunnelName, annotations);
287 }
288
289 @Override
290 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
291 TunnelEndPoint dst, Type type,
292 Annotations... annotations) {
293 return store.returnTunnel(consumerId, src, dst, type, annotations);
294 }
295
296 @Override
297 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
298 TunnelEndPoint dst, Annotations... annotations) {
299 return store.returnTunnel(consumerId, src, dst, annotations);
300 }
301
302 @Override
303 public Tunnel queryTunnel(TunnelId tunnelId) {
304 return store.queryTunnel(tunnelId);
305 }
306
307 @Override
308 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
309 return store.queryTunnelSubscription(consumerId);
310 }
311
312 @Override
313 public Collection<Tunnel> queryTunnel(Type type) {
314 return store.queryTunnel(type);
315 }
316
317 @Override
318 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
319 return store.queryTunnel(src, dst);
320 }
321
samuel7a5691a2015-05-23 00:36:32 +0800322
323 @Override
324 public Collection<Tunnel> queryAllTunnels() {
325 return store.queryAllTunnels();
326 }
327
jccd8697232015-05-05 14:42:23 +0800328 @Override
329 public int tunnelCount() {
330 return store.tunnelCount();
331 }
332
333 @Override
wei wei89ddc322015-03-22 16:29:04 -0500334 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500335 return new InternalTunnelProviderService(provider);
336 }
337
wei wei89ddc322015-03-22 16:29:04 -0500338 private class InternalTunnelProviderService
339 extends AbstractProviderService<TunnelProvider>
340 implements TunnelProviderService {
341 protected InternalTunnelProviderService(TunnelProvider provider) {
342 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500343 }
344
jccd8697232015-05-05 14:42:23 +0800345
wei wei89ddc322015-03-22 16:29:04 -0500346 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800347 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800348 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
349 tunnel.src(), tunnel.dst(),
350 tunnel.type(),
351 tunnel.groupId(),
352 tunnel.id(),
353 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800354 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530355 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800356 tunnel.annotations());
357 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500358 }
359
360 @Override
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530361 public TunnelId tunnelAdded(TunnelDescription tunnel, State state) {
362 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
363 tunnel.src(), tunnel.dst(),
364 tunnel.type(),
365 state,
366 tunnel.groupId(),
367 tunnel.id(),
368 tunnel.tunnelName(),
369 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530370 tunnel.resource(),
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530371 tunnel.annotations());
372 return store.createOrUpdateTunnel(storedTunnel);
373 }
374
375 @Override
wei wei89ddc322015-03-22 16:29:04 -0500376 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800377 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
378 tunnel.src(), tunnel.dst(),
379 tunnel.type(),
380 tunnel.groupId(),
381 tunnel.id(),
382 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800383 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530384 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800385 tunnel.annotations());
386 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500387 }
388
389 @Override
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530390 public void tunnelUpdated(TunnelDescription tunnel, State state) {
391 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
392 tunnel.src(), tunnel.dst(),
393 tunnel.type(),
394 state,
395 tunnel.groupId(),
396 tunnel.id(),
397 tunnel.tunnelName(),
398 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530399 tunnel.resource(),
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530400 tunnel.annotations());
401 store.createOrUpdateTunnel(storedTunnel, state);
402 }
403
404 @Override
wei wei89ddc322015-03-22 16:29:04 -0500405 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800406 if (tunnel.id() != null) {
407 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800408 return;
jccd8697232015-05-05 14:42:23 +0800409 }
410 if (tunnel.src() != null && tunnel.dst() != null
411 && tunnel.type() != null) {
412 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
413 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800414 return;
jccd8697232015-05-05 14:42:23 +0800415 }
416 if (tunnel.src() != null && tunnel.dst() != null
417 && tunnel.type() == null) {
418 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800419 return;
jccd8697232015-05-05 14:42:23 +0800420 }
wei wei89ddc322015-03-22 16:29:04 -0500421 }
422
samuel7a5691a2015-05-23 00:36:32 +0800423
424 @Override
425 public Tunnel tunnelQueryById(TunnelId tunnelId) {
426 return store.queryTunnel(tunnelId);
427 }
428
429
wei wei89ddc322015-03-22 16:29:04 -0500430 }
431
432 private class InternalStoreDelegate implements TunnelStoreDelegate {
433 @Override
434 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500435 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700436 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500437 }
438 }
439 }
samuel7a5691a2015-05-23 00:36:32 +0800440
cheng fan35dc0f22015-06-10 06:02:47 +0800441 @Override
442 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
443 return Collections.emptyList();
444 }
445
wei wei89ddc322015-03-22 16:29:04 -0500446}