blob: 3c846a68be489dd75a1185306ad0e23e6551ef0f [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
133 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
134 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800135 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530136 if (!setTunnels.isEmpty()) {
137 store.deleteTunnel(src, dst, producerName);
138 for (Tunnel tunnel : setTunnels) {
139 if (producerName != null
140 && !tunnel.providerId().equals(producerName)) {
141 continue;
jccd8697232015-05-05 14:42:23 +0800142 }
Satish Kd8adcef2016-04-26 16:31:14 +0530143 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 }
jccd8697232015-05-05 14:42:23 +0800154 }
155 }
156 }
157 }
158
159 @Override
160 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
161 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800162 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530163 if (!setTunnels.isEmpty()) {
164 store.deleteTunnel(src, dst, type, producerName);
165 for (Tunnel tunnel : setTunnels) {
166 if (producerName != null
167 && !tunnel.providerId().equals(producerName)
168 || !type.equals(tunnel.type())) {
169 continue;
jccd8697232015-05-05 14:42:23 +0800170 }
Satish Kd8adcef2016-04-26 16:31:14 +0530171 if (tunnel.providerId() != null) {
172 TunnelProvider provider = getProvider(tunnel.providerId());
173 if (provider != null) {
174 provider.releaseTunnel(tunnel);
175 }
176 } else {
177 Set<ProviderId> ids = getProviders();
178 for (ProviderId providerId : ids) {
179 TunnelProvider provider = getProvider(providerId);
180 provider.releaseTunnel(tunnel);
181 }
jccd8697232015-05-05 14:42:23 +0800182 }
183 }
184 }
185 }
186
187 @Override
188 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
189 Annotations... annotations) {
190 return store.borrowTunnel(consumerId, tunnelId, annotations);
191 }
192
193 @Override
194 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
195 TunnelName tunnelName,
196 Annotations... annotations) {
197 return store.borrowTunnel(consumerId, tunnelName, annotations);
198 }
199
200 @Override
201 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
202 TunnelEndPoint src, TunnelEndPoint dst,
203 Annotations... annotations) {
204 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
205 dst, annotations);
206 if (tunnels == null || tunnels.size() == 0) {
207 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
208 null, null, annotations);
209 Set<ProviderId> ids = getProviders();
210 for (ProviderId providerId : ids) {
211 TunnelProvider provider = getProvider(providerId);
212 provider.setupTunnel(tunnel, null);
213 }
214 }
215 return tunnels;
216 }
217
218 @Override
219 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
220 TunnelEndPoint src, TunnelEndPoint dst,
221 Type type, Annotations... annotations) {
222 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
223 dst, type,
224 annotations);
225 if (tunnels == null || tunnels.size() == 0) {
226 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
227 null, null, annotations);
228 Set<ProviderId> ids = getProviders();
229 for (ProviderId providerId : ids) {
230 TunnelProvider provider = getProvider(providerId);
231 provider.setupTunnel(tunnel, null);
232 }
233 }
234 return tunnels;
235 }
236
237 @Override
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530238 public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) {
Satish Kd70e9572016-04-28 13:58:51 +0530239 // TODO: producerId to check if really required to consider while setup the tunnel.
240 checkNotNull(tunnel, TUNNNEL_NULL);
241 TunnelId tunnelId = store.createOrUpdateTunnel(tunnel, State.INIT);
242 if (tunnelId != null) {
243 Set<ProviderId> ids = getProviders();
244 for (ProviderId providerId : ids) {
245 TunnelProvider provider = getProvider(providerId);
246 provider.setupTunnel(srcElementId, tunnel, path);
247 }
248 }
249 return tunnelId;
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530250 }
251
252 @Override
253 public boolean downTunnel(ApplicationId producerId, TunnelId tunnelId) {
Satish Kd70e9572016-04-28 13:58:51 +0530254 // TODO: producerId to check if really required to consider while deleting the tunnel.
255 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
256 Tunnel tunnel = store.queryTunnel(tunnelId);
257 if (tunnel != null) {
258 TunnelId updtTunnelId = store.createOrUpdateTunnel(tunnel, State.INACTIVE);
259 if (updtTunnelId != null) {
260 Set<ProviderId> ids = getProviders();
261 for (ProviderId providerId : ids) {
262 TunnelProvider provider = getProvider(providerId);
263 provider.releaseTunnel(tunnel);
264 }
265 }
266 return true;
267 }
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530268 return false;
269 }
270
271 @Override
jccd8697232015-05-05 14:42:23 +0800272 public boolean returnTunnel(ApplicationId consumerId,
273 TunnelId tunnelId, Annotations... annotations) {
274 return store.returnTunnel(consumerId, tunnelId, annotations);
275 }
276
277 @Override
278 public boolean returnTunnel(ApplicationId consumerId,
279 TunnelName tunnelName,
280 Annotations... annotations) {
281 return store.returnTunnel(consumerId, tunnelName, annotations);
282 }
283
284 @Override
285 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
286 TunnelEndPoint dst, Type type,
287 Annotations... annotations) {
288 return store.returnTunnel(consumerId, src, dst, type, annotations);
289 }
290
291 @Override
292 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
293 TunnelEndPoint dst, Annotations... annotations) {
294 return store.returnTunnel(consumerId, src, dst, annotations);
295 }
296
297 @Override
298 public Tunnel queryTunnel(TunnelId tunnelId) {
299 return store.queryTunnel(tunnelId);
300 }
301
302 @Override
303 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
304 return store.queryTunnelSubscription(consumerId);
305 }
306
307 @Override
308 public Collection<Tunnel> queryTunnel(Type type) {
309 return store.queryTunnel(type);
310 }
311
312 @Override
313 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
314 return store.queryTunnel(src, dst);
315 }
316
samuel7a5691a2015-05-23 00:36:32 +0800317
318 @Override
319 public Collection<Tunnel> queryAllTunnels() {
320 return store.queryAllTunnels();
321 }
322
jccd8697232015-05-05 14:42:23 +0800323 @Override
324 public int tunnelCount() {
325 return store.tunnelCount();
326 }
327
328 @Override
wei wei89ddc322015-03-22 16:29:04 -0500329 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500330 return new InternalTunnelProviderService(provider);
331 }
332
wei wei89ddc322015-03-22 16:29:04 -0500333 private class InternalTunnelProviderService
334 extends AbstractProviderService<TunnelProvider>
335 implements TunnelProviderService {
336 protected InternalTunnelProviderService(TunnelProvider provider) {
337 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500338 }
339
jccd8697232015-05-05 14:42:23 +0800340
wei wei89ddc322015-03-22 16:29:04 -0500341 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800342 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800343 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
344 tunnel.src(), tunnel.dst(),
345 tunnel.type(),
346 tunnel.groupId(),
347 tunnel.id(),
348 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800349 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530350 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800351 tunnel.annotations());
352 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500353 }
354
355 @Override
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530356 public TunnelId tunnelAdded(TunnelDescription tunnel, State state) {
357 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
358 tunnel.src(), tunnel.dst(),
359 tunnel.type(),
360 state,
361 tunnel.groupId(),
362 tunnel.id(),
363 tunnel.tunnelName(),
364 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530365 tunnel.resource(),
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530366 tunnel.annotations());
367 return store.createOrUpdateTunnel(storedTunnel);
368 }
369
370 @Override
wei wei89ddc322015-03-22 16:29:04 -0500371 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800372 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
373 tunnel.src(), tunnel.dst(),
374 tunnel.type(),
375 tunnel.groupId(),
376 tunnel.id(),
377 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800378 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530379 tunnel.resource(),
jccd8697232015-05-05 14:42:23 +0800380 tunnel.annotations());
381 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500382 }
383
384 @Override
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530385 public void tunnelUpdated(TunnelDescription tunnel, State state) {
386 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
387 tunnel.src(), tunnel.dst(),
388 tunnel.type(),
389 state,
390 tunnel.groupId(),
391 tunnel.id(),
392 tunnel.tunnelName(),
393 tunnel.path(),
Satish Kd70e9572016-04-28 13:58:51 +0530394 tunnel.resource(),
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530395 tunnel.annotations());
396 store.createOrUpdateTunnel(storedTunnel, state);
397 }
398
399 @Override
wei wei89ddc322015-03-22 16:29:04 -0500400 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800401 if (tunnel.id() != null) {
402 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800403 return;
jccd8697232015-05-05 14:42:23 +0800404 }
405 if (tunnel.src() != null && tunnel.dst() != null
406 && tunnel.type() != null) {
407 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
408 provider().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(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800414 return;
jccd8697232015-05-05 14:42:23 +0800415 }
wei wei89ddc322015-03-22 16:29:04 -0500416 }
417
samuel7a5691a2015-05-23 00:36:32 +0800418
419 @Override
420 public Tunnel tunnelQueryById(TunnelId tunnelId) {
421 return store.queryTunnel(tunnelId);
422 }
423
424
wei wei89ddc322015-03-22 16:29:04 -0500425 }
426
427 private class InternalStoreDelegate implements TunnelStoreDelegate {
428 @Override
429 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500430 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700431 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500432 }
433 }
434 }
samuel7a5691a2015-05-23 00:36:32 +0800435
cheng fan35dc0f22015-06-10 06:02:47 +0800436 @Override
437 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
438 return Collections.emptyList();
439 }
440
wei wei89ddc322015-03-22 16:29:04 -0500441}