blob: f93fae9b4952cd63a29232648cb8ab564da03820 [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";
70
71 private final Logger log = getLogger(getClass());
72
wei wei89ddc322015-03-22 16:29:04 -050073 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080074
wei wei89ddc322015-03-22 16:29:04 -050075 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
76 protected TunnelStore store;
77
wei wei89ddc322015-03-22 16:29:04 -050078
wei wei89ddc322015-03-22 16:29:04 -050079 @Activate
80 public void activate() {
jccd8697232015-05-05 14:42:23 +080081 store.setDelegate(delegate);
82 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050083 log.info("Started");
84 }
85
86 @Deactivate
87 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080088 store.unsetDelegate(delegate);
89 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050090 log.info("Stopped");
91 }
92
93 @Override
jccd8697232015-05-05 14:42:23 +080094 public void removeTunnel(TunnelId tunnelId) {
95 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
jccd8697232015-05-05 14:42:23 +080096 Tunnel tunnel = store.queryTunnel(tunnelId);
Satish Kd8adcef2016-04-26 16:31:14 +053097 if (tunnel != null) {
98 store.deleteTunnel(tunnelId);
99 if (tunnel.providerId() != null) {
100 TunnelProvider provider = getProvider(tunnel.providerId());
101 if (provider != null) {
102 provider.releaseTunnel(tunnel);
103 }
104 } else {
105 Set<ProviderId> ids = getProviders();
106 for (ProviderId providerId : ids) {
107 TunnelProvider provider = getProvider(providerId);
108 provider.releaseTunnel(tunnel);
109 }
jccd8697232015-05-05 14:42:23 +0800110 }
111 }
112 }
113
114 @Override
115 public void updateTunnel(Tunnel tunnel, Path path) {
116 store.createOrUpdateTunnel(tunnel);
117 if (tunnel.providerId() != null) {
118 TunnelProvider provider = getProvider(tunnel.providerId());
119 if (provider != null) {
120 provider.updateTunnel(tunnel, path);
121 }
122 } else {
123 Set<ProviderId> ids = getProviders();
124 for (ProviderId providerId : ids) {
125 TunnelProvider provider = getProvider(providerId);
126 provider.updateTunnel(tunnel, path);
127 }
128 }
129 }
130
131 @Override
132 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
133 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800134 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530135 if (!setTunnels.isEmpty()) {
136 store.deleteTunnel(src, dst, producerName);
137 for (Tunnel tunnel : setTunnels) {
138 if (producerName != null
139 && !tunnel.providerId().equals(producerName)) {
140 continue;
jccd8697232015-05-05 14:42:23 +0800141 }
Satish Kd8adcef2016-04-26 16:31:14 +0530142 if (tunnel.providerId() != null) {
143 TunnelProvider provider = getProvider(tunnel.providerId());
144 if (provider != null) {
145 provider.releaseTunnel(tunnel);
146 }
147 } else {
148 Set<ProviderId> ids = getProviders();
149 for (ProviderId providerId : ids) {
150 TunnelProvider provider = getProvider(providerId);
151 provider.releaseTunnel(tunnel);
152 }
jccd8697232015-05-05 14:42:23 +0800153 }
154 }
155 }
156 }
157
158 @Override
159 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
160 ProviderId producerName) {
jccd8697232015-05-05 14:42:23 +0800161 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
Satish Kd8adcef2016-04-26 16:31:14 +0530162 if (!setTunnels.isEmpty()) {
163 store.deleteTunnel(src, dst, type, producerName);
164 for (Tunnel tunnel : setTunnels) {
165 if (producerName != null
166 && !tunnel.providerId().equals(producerName)
167 || !type.equals(tunnel.type())) {
168 continue;
jccd8697232015-05-05 14:42:23 +0800169 }
Satish Kd8adcef2016-04-26 16:31:14 +0530170 if (tunnel.providerId() != null) {
171 TunnelProvider provider = getProvider(tunnel.providerId());
172 if (provider != null) {
173 provider.releaseTunnel(tunnel);
174 }
175 } else {
176 Set<ProviderId> ids = getProviders();
177 for (ProviderId providerId : ids) {
178 TunnelProvider provider = getProvider(providerId);
179 provider.releaseTunnel(tunnel);
180 }
jccd8697232015-05-05 14:42:23 +0800181 }
182 }
183 }
184 }
185
186 @Override
187 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
188 Annotations... annotations) {
189 return store.borrowTunnel(consumerId, tunnelId, annotations);
190 }
191
192 @Override
193 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
194 TunnelName tunnelName,
195 Annotations... annotations) {
196 return store.borrowTunnel(consumerId, tunnelName, annotations);
197 }
198
199 @Override
200 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
201 TunnelEndPoint src, TunnelEndPoint dst,
202 Annotations... annotations) {
203 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
204 dst, annotations);
205 if (tunnels == null || tunnels.size() == 0) {
206 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
207 null, null, annotations);
208 Set<ProviderId> ids = getProviders();
209 for (ProviderId providerId : ids) {
210 TunnelProvider provider = getProvider(providerId);
211 provider.setupTunnel(tunnel, null);
212 }
213 }
214 return tunnels;
215 }
216
217 @Override
218 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
219 TunnelEndPoint src, TunnelEndPoint dst,
220 Type type, Annotations... annotations) {
221 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
222 dst, type,
223 annotations);
224 if (tunnels == null || tunnels.size() == 0) {
225 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
226 null, null, annotations);
227 Set<ProviderId> ids = getProviders();
228 for (ProviderId providerId : ids) {
229 TunnelProvider provider = getProvider(providerId);
230 provider.setupTunnel(tunnel, null);
231 }
232 }
233 return tunnels;
234 }
235
236 @Override
Avantika-Huaweie10a6e92016-04-06 21:06:41 +0530237 public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) {
238 // TODO: Insert into store and trigger provider API.
239 return null;
240 }
241
242 @Override
243 public boolean downTunnel(ApplicationId producerId, TunnelId tunnelId) {
244 // TODO: Change the tunnel status and trigger provider API.
245 return false;
246 }
247
248 @Override
jccd8697232015-05-05 14:42:23 +0800249 public boolean returnTunnel(ApplicationId consumerId,
250 TunnelId tunnelId, Annotations... annotations) {
251 return store.returnTunnel(consumerId, tunnelId, annotations);
252 }
253
254 @Override
255 public boolean returnTunnel(ApplicationId consumerId,
256 TunnelName tunnelName,
257 Annotations... annotations) {
258 return store.returnTunnel(consumerId, tunnelName, annotations);
259 }
260
261 @Override
262 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
263 TunnelEndPoint dst, Type type,
264 Annotations... annotations) {
265 return store.returnTunnel(consumerId, src, dst, type, annotations);
266 }
267
268 @Override
269 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
270 TunnelEndPoint dst, Annotations... annotations) {
271 return store.returnTunnel(consumerId, src, dst, annotations);
272 }
273
274 @Override
275 public Tunnel queryTunnel(TunnelId tunnelId) {
276 return store.queryTunnel(tunnelId);
277 }
278
279 @Override
280 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
281 return store.queryTunnelSubscription(consumerId);
282 }
283
284 @Override
285 public Collection<Tunnel> queryTunnel(Type type) {
286 return store.queryTunnel(type);
287 }
288
289 @Override
290 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
291 return store.queryTunnel(src, dst);
292 }
293
samuel7a5691a2015-05-23 00:36:32 +0800294
295 @Override
296 public Collection<Tunnel> queryAllTunnels() {
297 return store.queryAllTunnels();
298 }
299
jccd8697232015-05-05 14:42:23 +0800300 @Override
301 public int tunnelCount() {
302 return store.tunnelCount();
303 }
304
305 @Override
wei wei89ddc322015-03-22 16:29:04 -0500306 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500307 return new InternalTunnelProviderService(provider);
308 }
309
wei wei89ddc322015-03-22 16:29:04 -0500310 private class InternalTunnelProviderService
311 extends AbstractProviderService<TunnelProvider>
312 implements TunnelProviderService {
313 protected InternalTunnelProviderService(TunnelProvider provider) {
314 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500315 }
316
jccd8697232015-05-05 14:42:23 +0800317
wei wei89ddc322015-03-22 16:29:04 -0500318 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800319 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800320 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
321 tunnel.src(), tunnel.dst(),
322 tunnel.type(),
323 tunnel.groupId(),
324 tunnel.id(),
325 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800326 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800327 tunnel.annotations());
328 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500329 }
330
331 @Override
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530332 public TunnelId tunnelAdded(TunnelDescription tunnel, State state) {
333 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
334 tunnel.src(), tunnel.dst(),
335 tunnel.type(),
336 state,
337 tunnel.groupId(),
338 tunnel.id(),
339 tunnel.tunnelName(),
340 tunnel.path(),
341 tunnel.annotations());
342 return store.createOrUpdateTunnel(storedTunnel);
343 }
344
345 @Override
wei wei89ddc322015-03-22 16:29:04 -0500346 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800347 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
348 tunnel.src(), tunnel.dst(),
349 tunnel.type(),
350 tunnel.groupId(),
351 tunnel.id(),
352 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800353 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800354 tunnel.annotations());
355 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500356 }
357
358 @Override
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530359 public void tunnelUpdated(TunnelDescription tunnel, State state) {
360 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
361 tunnel.src(), tunnel.dst(),
362 tunnel.type(),
363 state,
364 tunnel.groupId(),
365 tunnel.id(),
366 tunnel.tunnelName(),
367 tunnel.path(),
368 tunnel.annotations());
369 store.createOrUpdateTunnel(storedTunnel, state);
370 }
371
372 @Override
wei wei89ddc322015-03-22 16:29:04 -0500373 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800374 if (tunnel.id() != null) {
375 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800376 return;
jccd8697232015-05-05 14:42:23 +0800377 }
378 if (tunnel.src() != null && tunnel.dst() != null
379 && tunnel.type() != null) {
380 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
381 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800382 return;
jccd8697232015-05-05 14:42:23 +0800383 }
384 if (tunnel.src() != null && tunnel.dst() != null
385 && tunnel.type() == null) {
386 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800387 return;
jccd8697232015-05-05 14:42:23 +0800388 }
wei wei89ddc322015-03-22 16:29:04 -0500389 }
390
samuel7a5691a2015-05-23 00:36:32 +0800391
392 @Override
393 public Tunnel tunnelQueryById(TunnelId tunnelId) {
394 return store.queryTunnel(tunnelId);
395 }
396
397
wei wei89ddc322015-03-22 16:29:04 -0500398 }
399
400 private class InternalStoreDelegate implements TunnelStoreDelegate {
401 @Override
402 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500403 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700404 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500405 }
406 }
407 }
samuel7a5691a2015-05-23 00:36:32 +0800408
cheng fan35dc0f22015-06-10 06:02:47 +0800409 @Override
410 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
411 return Collections.emptyList();
412 }
413
wei wei89ddc322015-03-22 16:29:04 -0500414}