blob: 281f1e8659e8cda3cfd5a034e704967965a48925 [file] [log] [blame]
wei wei89ddc322015-03-22 16:29:04 -05001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
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
wei wei89ddc322015-03-22 16:29:04 -050018import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070024import org.onosproject.net.provider.AbstractListenerProviderRegistry;
jcc4a20a5f2015-04-30 15:43:39 +080025import org.onosproject.core.ApplicationId;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070026import org.onosproject.incubator.net.tunnel.DefaultTunnel;
samuel7a5691a2015-05-23 00:36:32 +080027import org.onosproject.incubator.net.tunnel.Tunnel;
Avantika-Huawei1e0a5862016-04-04 14:22:22 +053028import org.onosproject.incubator.net.tunnel.Tunnel.State;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070029import org.onosproject.incubator.net.tunnel.Tunnel.Type;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070030import org.onosproject.incubator.net.tunnel.TunnelAdminService;
31import org.onosproject.incubator.net.tunnel.TunnelDescription;
32import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
33import org.onosproject.incubator.net.tunnel.TunnelEvent;
34import org.onosproject.incubator.net.tunnel.TunnelId;
35import org.onosproject.incubator.net.tunnel.TunnelListener;
36import org.onosproject.incubator.net.tunnel.TunnelName;
37import org.onosproject.incubator.net.tunnel.TunnelProvider;
38import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
39import org.onosproject.incubator.net.tunnel.TunnelProviderService;
40import org.onosproject.incubator.net.tunnel.TunnelService;
41import org.onosproject.incubator.net.tunnel.TunnelStore;
42import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
43import org.onosproject.incubator.net.tunnel.TunnelSubscription;
samuel7a5691a2015-05-23 00:36:32 +080044import org.onosproject.net.Annotations;
cheng fan35dc0f22015-06-10 06:02:47 +080045import org.onosproject.net.DeviceId;
Avantika-Huaweie10a6e92016-04-06 21:06:41 +053046import org.onosproject.net.ElementId;
samuel7a5691a2015-05-23 00:36:32 +080047import org.onosproject.net.Path;
samuel7a5691a2015-05-23 00:36:32 +080048import org.onosproject.net.provider.AbstractProviderService;
49import org.onosproject.net.provider.ProviderId;
wei wei89ddc322015-03-22 16:29:04 -050050import org.slf4j.Logger;
51
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070052import java.util.Collection;
53import java.util.Collections;
54import java.util.Set;
55
56import static com.google.common.base.Preconditions.checkNotNull;
57import static org.slf4j.LoggerFactory.getLogger;
58
wei wei89ddc322015-03-22 16:29:04 -050059/**
60 * Provides implementation of the tunnel NB/SB APIs.
61 */
62@Component(immediate = true, enabled = true)
63@Service
jcc4a20a5f2015-04-30 15:43:39 +080064public class TunnelManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070065 extends AbstractListenerProviderRegistry<TunnelEvent, TunnelListener,
66 TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050067 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
68
69 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
Satish Kd70e9572016-04-28 13:58:51 +053070 private static final String TUNNNEL_NULL = "Tunnel cannot be null";
wei wei89ddc322015-03-22 16:29:04 -050071
72 private final Logger log = getLogger(getClass());
73
wei wei89ddc322015-03-22 16:29:04 -050074 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080075
wei wei89ddc322015-03-22 16:29:04 -050076 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected TunnelStore store;
78
wei wei89ddc322015-03-22 16:29:04 -050079
wei wei89ddc322015-03-22 16:29:04 -050080 @Activate
81 public void activate() {
jccd8697232015-05-05 14:42:23 +080082 store.setDelegate(delegate);
83 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050084 log.info("Started");
85 }
86
87 @Deactivate
88 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080089 store.unsetDelegate(delegate);
90 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050091 log.info("Stopped");
92 }
93
94 @Override
jccd8697232015-05-05 14:42:23 +080095 public void removeTunnel(TunnelId tunnelId) {
96 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
jccd8697232015-05-05 14:42:23 +080097 Tunnel tunnel = store.queryTunnel(tunnelId);
Satish Kd8adcef2016-04-26 16:31:14 +053098 if (tunnel != null) {
99 store.deleteTunnel(tunnelId);
100 if (tunnel.providerId() != null) {
101 TunnelProvider provider = getProvider(tunnel.providerId());
102 if (provider != null) {
103 provider.releaseTunnel(tunnel);
104 }
105 } else {
106 Set<ProviderId> ids = getProviders();
107 for (ProviderId providerId : ids) {
108 TunnelProvider provider = getProvider(providerId);
109 provider.releaseTunnel(tunnel);
110 }
jccd8697232015-05-05 14:42:23 +0800111 }
112 }
113 }
114
115 @Override
116 public void updateTunnel(Tunnel tunnel, Path path) {
117 store.createOrUpdateTunnel(tunnel);
118 if (tunnel.providerId() != null) {
119 TunnelProvider provider = getProvider(tunnel.providerId());
120 if (provider != null) {
121 provider.updateTunnel(tunnel, path);
122 }
123 } else {
124 Set<ProviderId> ids = getProviders();
125 for (ProviderId providerId : ids) {
126 TunnelProvider provider = getProvider(providerId);
127 provider.updateTunnel(tunnel, path);
128 }
129 }
130 }
131
132 @Override
tony-liu1abfb632016-11-09 15:22:51 +0800133 public void updateTunnelState(Tunnel tunnel, State state) {
134 Tunnel storedTunnel = store.queryTunnel(tunnel.tunnelId());
135 store.createOrUpdateTunnel(storedTunnel, state);
136 }
137
138 @Override
jccd8697232015-05-05 14:42:23 +0800139 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
140 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800141 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530142 if (!setTunnels.isEmpty()) {
143 store.deleteTunnel(src, dst, producerName);
144 for (Tunnel tunnel : setTunnels) {
145 if (producerName != null
146 && !tunnel.providerId().equals(producerName)) {
147 continue;
jccd8697232015-05-05 14:42:23 +0800148 }
Satish Kd8adcef2016-04-26 16:31:14 +0530149 if (tunnel.providerId() != null) {
150 TunnelProvider provider = getProvider(tunnel.providerId());
151 if (provider != null) {
152 provider.releaseTunnel(tunnel);
153 }
154 } else {
155 Set<ProviderId> ids = getProviders();
156 for (ProviderId providerId : ids) {
157 TunnelProvider provider = getProvider(providerId);
158 provider.releaseTunnel(tunnel);
159 }
jccd8697232015-05-05 14:42:23 +0800160 }
161 }
162 }
163 }
164
165 @Override
166 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
167 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800168 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530169 if (!setTunnels.isEmpty()) {
170 store.deleteTunnel(src, dst, type, producerName);
171 for (Tunnel tunnel : setTunnels) {
172 if (producerName != null
173 && !tunnel.providerId().equals(producerName)
174 || !type.equals(tunnel.type())) {
175 continue;
jccd8697232015-05-05 14:42:23 +0800176 }
Satish Kd8adcef2016-04-26 16:31:14 +0530177 if (tunnel.providerId() != null) {
178 TunnelProvider provider = getProvider(tunnel.providerId());
179 if (provider != null) {
180 provider.releaseTunnel(tunnel);
181 }
182 } else {
183 Set<ProviderId> ids = getProviders();
184 for (ProviderId providerId : ids) {
185 TunnelProvider provider = getProvider(providerId);
186 provider.releaseTunnel(tunnel);
187 }
jccd8697232015-05-05 14:42:23 +0800188 }
189 }
190 }
191 }
192
193 @Override
194 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
195 Annotations... annotations) {
196 return store.borrowTunnel(consumerId, tunnelId, annotations);
197 }
198
199 @Override
200 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
201 TunnelName tunnelName,
202 Annotations... annotations) {
203 return store.borrowTunnel(consumerId, tunnelName, annotations);
204 }
205
206 @Override
207 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
208 TunnelEndPoint src, TunnelEndPoint dst,
209 Annotations... annotations) {
210 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
211 dst, annotations);
212 if (tunnels == null || tunnels.size() == 0) {
213 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
214 null, null, annotations);
215 Set<ProviderId> ids = getProviders();
216 for (ProviderId providerId : ids) {
217 TunnelProvider provider = getProvider(providerId);
218 provider.setupTunnel(tunnel, null);
219 }
220 }
221 return tunnels;
222 }
223
224 @Override
225 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
226 TunnelEndPoint src, TunnelEndPoint dst,
227 Type type, Annotations... annotations) {
228 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
229 dst, type,
230 annotations);
231 if (tunnels == null || tunnels.size() == 0) {
232 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
233 null, null, annotations);
234 Set<ProviderId> ids = getProviders();
235 for (ProviderId providerId : ids) {
236 TunnelProvider provider = getProvider(providerId);
237 provider.setupTunnel(tunnel, null);
238 }
239 }
240 return tunnels;
241 }
242
243 @Override
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530244 public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) {
Satish Kd70e9572016-04-28 13:58:51 +0530245 // TODO: producerId to check if really required to consider while setup the tunnel.
246 checkNotNull(tunnel, TUNNNEL_NULL);
247 TunnelId tunnelId = store.createOrUpdateTunnel(tunnel, State.INIT);
248 if (tunnelId != null) {
249 Set<ProviderId> ids = getProviders();
250 for (ProviderId providerId : ids) {
251 TunnelProvider provider = getProvider(providerId);
252 provider.setupTunnel(srcElementId, tunnel, path);
253 }
254 }
255 return tunnelId;
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530256 }
257
258 @Override
259 public boolean downTunnel(ApplicationId producerId, TunnelId tunnelId) {
Satish Kd70e9572016-04-28 13:58:51 +0530260 // TODO: producerId to check if really required to consider while deleting the tunnel.
261 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
262 Tunnel tunnel = store.queryTunnel(tunnelId);
263 if (tunnel != null) {
264 TunnelId updtTunnelId = store.createOrUpdateTunnel(tunnel, State.INACTIVE);
265 if (updtTunnelId != null) {
266 Set<ProviderId> ids = getProviders();
267 for (ProviderId providerId : ids) {
268 TunnelProvider provider = getProvider(providerId);
269 provider.releaseTunnel(tunnel);
270 }
271 }
272 return true;
273 }
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530274 return false;
275 }
276
277 @Override
jccd8697232015-05-05 14:42:23 +0800278 public boolean returnTunnel(ApplicationId consumerId,
279 TunnelId tunnelId, Annotations... annotations) {
280 return store.returnTunnel(consumerId, tunnelId, annotations);
281 }
282
283 @Override
284 public boolean returnTunnel(ApplicationId consumerId,
285 TunnelName tunnelName,
286 Annotations... annotations) {
287 return store.returnTunnel(consumerId, tunnelName, annotations);
288 }
289
290 @Override
291 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
292 TunnelEndPoint dst, Type type,
293 Annotations... annotations) {
294 return store.returnTunnel(consumerId, src, dst, type, annotations);
295 }
296
297 @Override
298 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
299 TunnelEndPoint dst, Annotations... annotations) {
300 return store.returnTunnel(consumerId, src, dst, annotations);
301 }
302
303 @Override
304 public Tunnel queryTunnel(TunnelId tunnelId) {
305 return store.queryTunnel(tunnelId);
306 }
307
308 @Override
309 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
310 return store.queryTunnelSubscription(consumerId);
311 }
312
313 @Override
314 public Collection<Tunnel> queryTunnel(Type type) {
315 return store.queryTunnel(type);
316 }
317
318 @Override
319 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
320 return store.queryTunnel(src, dst);
321 }
322
samuel7a5691a2015-05-23 00:36:32 +0800323
324 @Override
325 public Collection<Tunnel> queryAllTunnels() {
326 return store.queryAllTunnels();
327 }
328
jccd8697232015-05-05 14:42:23 +0800329 @Override
330 public int tunnelCount() {
331 return store.tunnelCount();
332 }
333
334 @Override
wei wei89ddc322015-03-22 16:29:04 -0500335 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500336 return new InternalTunnelProviderService(provider);
337 }
338
wei wei89ddc322015-03-22 16:29:04 -0500339 private class InternalTunnelProviderService
340 extends AbstractProviderService<TunnelProvider>
341 implements TunnelProviderService {
342 protected InternalTunnelProviderService(TunnelProvider provider) {
343 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500344 }
345
jccd8697232015-05-05 14:42:23 +0800346
wei wei89ddc322015-03-22 16:29:04 -0500347 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800348 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800349 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
350 tunnel.src(), tunnel.dst(),
351 tunnel.type(),
352 tunnel.groupId(),
353 tunnel.id(),
354 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800355 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530356 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800357 tunnel.annotations());
358 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500359 }
360
361 @Override
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530362 public TunnelId tunnelAdded(TunnelDescription tunnel, State state) {
363 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
364 tunnel.src(), tunnel.dst(),
365 tunnel.type(),
366 state,
367 tunnel.groupId(),
368 tunnel.id(),
369 tunnel.tunnelName(),
370 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530371 tunnel.resource(),
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530372 tunnel.annotations());
373 return store.createOrUpdateTunnel(storedTunnel);
374 }
375
376 @Override
wei wei89ddc322015-03-22 16:29:04 -0500377 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800378 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
379 tunnel.src(), tunnel.dst(),
380 tunnel.type(),
381 tunnel.groupId(),
382 tunnel.id(),
383 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800384 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530385 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800386 tunnel.annotations());
387 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500388 }
389
390 @Override
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530391 public void tunnelUpdated(TunnelDescription tunnel, State state) {
392 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
393 tunnel.src(), tunnel.dst(),
394 tunnel.type(),
395 state,
396 tunnel.groupId(),
397 tunnel.id(),
398 tunnel.tunnelName(),
399 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530400 tunnel.resource(),
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530401 tunnel.annotations());
402 store.createOrUpdateTunnel(storedTunnel, state);
403 }
404
405 @Override
wei wei89ddc322015-03-22 16:29:04 -0500406 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800407 if (tunnel.id() != null) {
408 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800409 return;
jccd8697232015-05-05 14:42:23 +0800410 }
411 if (tunnel.src() != null && tunnel.dst() != null
412 && tunnel.type() != null) {
413 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
414 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800415 return;
jccd8697232015-05-05 14:42:23 +0800416 }
417 if (tunnel.src() != null && tunnel.dst() != null
418 && tunnel.type() == null) {
419 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800420 return;
jccd8697232015-05-05 14:42:23 +0800421 }
wei wei89ddc322015-03-22 16:29:04 -0500422 }
423
samuel7a5691a2015-05-23 00:36:32 +0800424
425 @Override
426 public Tunnel tunnelQueryById(TunnelId tunnelId) {
427 return store.queryTunnel(tunnelId);
428 }
429
430
wei wei89ddc322015-03-22 16:29:04 -0500431 }
432
433 private class InternalStoreDelegate implements TunnelStoreDelegate {
434 @Override
435 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500436 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700437 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500438 }
439 }
440 }
samuel7a5691a2015-05-23 00:36:32 +0800441
cheng fan35dc0f22015-06-10 06:02:47 +0800442 @Override
443 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
444 return Collections.emptyList();
445 }
446
wei wei89ddc322015-03-22 16:29:04 -0500447}