blob: 8a9225b6df6fa494863656d416c81a61d2801fc9 [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;
samuel7a5691a2015-05-23 00:36:32 +080046import org.onosproject.net.Path;
samuel7a5691a2015-05-23 00:36:32 +080047import org.onosproject.net.provider.AbstractProviderService;
48import org.onosproject.net.provider.ProviderId;
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 */
61@Component(immediate = true, enabled = true)
62@Service
jcc4a20a5f2015-04-30 15:43:39 +080063public class TunnelManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070064 extends AbstractListenerProviderRegistry<TunnelEvent, TunnelListener,
65 TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050066 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
67
68 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
69
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
wei wei89ddc322015-03-22 16:29:04 -050074 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
75 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);
95 store.deleteTunnel(tunnelId);
96 Tunnel tunnel = store.queryTunnel(tunnelId);
97 if (tunnel.providerId() != null) {
98 TunnelProvider provider = getProvider(tunnel.providerId());
99 if (provider != null) {
100 provider.releaseTunnel(tunnel);
101 }
102 } else {
103 Set<ProviderId> ids = getProviders();
104 for (ProviderId providerId : ids) {
105 TunnelProvider provider = getProvider(providerId);
106 provider.releaseTunnel(tunnel);
107 }
108 }
109 }
110
111 @Override
112 public void updateTunnel(Tunnel tunnel, Path path) {
113 store.createOrUpdateTunnel(tunnel);
114 if (tunnel.providerId() != null) {
115 TunnelProvider provider = getProvider(tunnel.providerId());
116 if (provider != null) {
117 provider.updateTunnel(tunnel, path);
118 }
119 } else {
120 Set<ProviderId> ids = getProviders();
121 for (ProviderId providerId : ids) {
122 TunnelProvider provider = getProvider(providerId);
123 provider.updateTunnel(tunnel, path);
124 }
125 }
126 }
127
128 @Override
129 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
130 ProviderId producerName) {
131 store.deleteTunnel(src, dst, producerName);
132 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
133 for (Tunnel tunnel : setTunnels) {
134 if (producerName != null
135 && !tunnel.providerId().equals(producerName)) {
136 continue;
137 }
138 if (tunnel.providerId() != null) {
139 TunnelProvider provider = getProvider(tunnel.providerId());
140 if (provider != null) {
141 provider.releaseTunnel(tunnel);
142 }
143 } else {
144 Set<ProviderId> ids = getProviders();
145 for (ProviderId providerId : ids) {
146 TunnelProvider provider = getProvider(providerId);
147 provider.releaseTunnel(tunnel);
148 }
149 }
150 }
151 }
152
153 @Override
154 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
155 ProviderId producerName) {
156 store.deleteTunnel(src, dst, type, producerName);
157 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
158 for (Tunnel tunnel : setTunnels) {
159 if (producerName != null
160 && !tunnel.providerId().equals(producerName)
161 || !type.equals(tunnel.type())) {
162 continue;
163 }
164 if (tunnel.providerId() != null) {
165 TunnelProvider provider = getProvider(tunnel.providerId());
166 if (provider != null) {
167 provider.releaseTunnel(tunnel);
168 }
169 } else {
170 Set<ProviderId> ids = getProviders();
171 for (ProviderId providerId : ids) {
172 TunnelProvider provider = getProvider(providerId);
173 provider.releaseTunnel(tunnel);
174 }
175 }
176 }
177 }
178
179 @Override
180 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
181 Annotations... annotations) {
182 return store.borrowTunnel(consumerId, tunnelId, annotations);
183 }
184
185 @Override
186 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
187 TunnelName tunnelName,
188 Annotations... annotations) {
189 return store.borrowTunnel(consumerId, tunnelName, annotations);
190 }
191
192 @Override
193 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
194 TunnelEndPoint src, TunnelEndPoint dst,
195 Annotations... annotations) {
196 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
197 dst, annotations);
198 if (tunnels == null || tunnels.size() == 0) {
199 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
200 null, null, annotations);
201 Set<ProviderId> ids = getProviders();
202 for (ProviderId providerId : ids) {
203 TunnelProvider provider = getProvider(providerId);
204 provider.setupTunnel(tunnel, null);
205 }
206 }
207 return tunnels;
208 }
209
210 @Override
211 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
212 TunnelEndPoint src, TunnelEndPoint dst,
213 Type type, Annotations... annotations) {
214 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
215 dst, type,
216 annotations);
217 if (tunnels == null || tunnels.size() == 0) {
218 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
219 null, null, annotations);
220 Set<ProviderId> ids = getProviders();
221 for (ProviderId providerId : ids) {
222 TunnelProvider provider = getProvider(providerId);
223 provider.setupTunnel(tunnel, null);
224 }
225 }
226 return tunnels;
227 }
228
229 @Override
230 public boolean returnTunnel(ApplicationId consumerId,
231 TunnelId tunnelId, Annotations... annotations) {
232 return store.returnTunnel(consumerId, tunnelId, annotations);
233 }
234
235 @Override
236 public boolean returnTunnel(ApplicationId consumerId,
237 TunnelName tunnelName,
238 Annotations... annotations) {
239 return store.returnTunnel(consumerId, tunnelName, annotations);
240 }
241
242 @Override
243 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
244 TunnelEndPoint dst, Type type,
245 Annotations... annotations) {
246 return store.returnTunnel(consumerId, src, dst, type, annotations);
247 }
248
249 @Override
250 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
251 TunnelEndPoint dst, Annotations... annotations) {
252 return store.returnTunnel(consumerId, src, dst, annotations);
253 }
254
255 @Override
256 public Tunnel queryTunnel(TunnelId tunnelId) {
257 return store.queryTunnel(tunnelId);
258 }
259
260 @Override
261 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
262 return store.queryTunnelSubscription(consumerId);
263 }
264
265 @Override
266 public Collection<Tunnel> queryTunnel(Type type) {
267 return store.queryTunnel(type);
268 }
269
270 @Override
271 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
272 return store.queryTunnel(src, dst);
273 }
274
samuel7a5691a2015-05-23 00:36:32 +0800275
276 @Override
277 public Collection<Tunnel> queryAllTunnels() {
278 return store.queryAllTunnels();
279 }
280
jccd8697232015-05-05 14:42:23 +0800281 @Override
282 public int tunnelCount() {
283 return store.tunnelCount();
284 }
285
286 @Override
wei wei89ddc322015-03-22 16:29:04 -0500287 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500288 return new InternalTunnelProviderService(provider);
289 }
290
wei wei89ddc322015-03-22 16:29:04 -0500291 private class InternalTunnelProviderService
292 extends AbstractProviderService<TunnelProvider>
293 implements TunnelProviderService {
294 protected InternalTunnelProviderService(TunnelProvider provider) {
295 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500296 }
297
jccd8697232015-05-05 14:42:23 +0800298
wei wei89ddc322015-03-22 16:29:04 -0500299 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800300 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800301 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
302 tunnel.src(), tunnel.dst(),
303 tunnel.type(),
304 tunnel.groupId(),
305 tunnel.id(),
306 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800307 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800308 tunnel.annotations());
309 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500310 }
311
312 @Override
Avantika-Huawei1e0a5862016-04-04 14:22:22 +0530313 public TunnelId tunnelAdded(TunnelDescription tunnel, State state) {
314 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
315 tunnel.src(), tunnel.dst(),
316 tunnel.type(),
317 state,
318 tunnel.groupId(),
319 tunnel.id(),
320 tunnel.tunnelName(),
321 tunnel.path(),
322 tunnel.annotations());
323 return store.createOrUpdateTunnel(storedTunnel);
324 }
325
326 @Override
wei wei89ddc322015-03-22 16:29:04 -0500327 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800328 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
329 tunnel.src(), tunnel.dst(),
330 tunnel.type(),
331 tunnel.groupId(),
332 tunnel.id(),
333 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800334 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800335 tunnel.annotations());
336 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500337 }
338
339 @Override
Avantika-Huawei4c3c9972016-04-05 14:51:46 +0530340 public void tunnelUpdated(TunnelDescription tunnel, State state) {
341 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
342 tunnel.src(), tunnel.dst(),
343 tunnel.type(),
344 state,
345 tunnel.groupId(),
346 tunnel.id(),
347 tunnel.tunnelName(),
348 tunnel.path(),
349 tunnel.annotations());
350 store.createOrUpdateTunnel(storedTunnel, state);
351 }
352
353 @Override
wei wei89ddc322015-03-22 16:29:04 -0500354 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800355 if (tunnel.id() != null) {
356 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800357 return;
jccd8697232015-05-05 14:42:23 +0800358 }
359 if (tunnel.src() != null && tunnel.dst() != null
360 && tunnel.type() != null) {
361 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
362 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800363 return;
jccd8697232015-05-05 14:42:23 +0800364 }
365 if (tunnel.src() != null && tunnel.dst() != null
366 && tunnel.type() == null) {
367 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800368 return;
jccd8697232015-05-05 14:42:23 +0800369 }
wei wei89ddc322015-03-22 16:29:04 -0500370 }
371
samuel7a5691a2015-05-23 00:36:32 +0800372
373 @Override
374 public Tunnel tunnelQueryById(TunnelId tunnelId) {
375 return store.queryTunnel(tunnelId);
376 }
377
378
wei wei89ddc322015-03-22 16:29:04 -0500379 }
380
381 private class InternalStoreDelegate implements TunnelStoreDelegate {
382 @Override
383 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500384 if (event != null) {
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700385 post(event);
wei wei89ddc322015-03-22 16:29:04 -0500386 }
387 }
388 }
samuel7a5691a2015-05-23 00:36:32 +0800389
cheng fan35dc0f22015-06-10 06:02:47 +0800390 @Override
391 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
392 return Collections.emptyList();
393 }
394
wei wei89ddc322015-03-22 16:29:04 -0500395}