blob: 3350cd188d82d74f920650cab59c1dc9590eb054 [file] [log] [blame]
wei wei89ddc322015-03-22 16:29:04 -05001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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
jccd8697232015-05-05 14:42:23 +080018import static com.google.common.base.Preconditions.checkNotNull;
jcc4a20a5f2015-04-30 15:43:39 +080019import static org.slf4j.LoggerFactory.getLogger;
20
21import java.util.Collection;
22import java.util.Set;
jcc4a20a5f2015-04-30 15:43:39 +080023
wei wei89ddc322015-03-22 16:29:04 -050024import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
jcc4a20a5f2015-04-30 15:43:39 +080030import org.onosproject.core.ApplicationId;
wei wei89ddc322015-03-22 16:29:04 -050031import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070032import org.onosproject.event.ListenerRegistry;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070033import org.onosproject.incubator.net.tunnel.DefaultTunnel;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070034import org.onosproject.incubator.net.tunnel.Tunnel.Type;
samuel7a5691a2015-05-23 00:36:32 +080035import org.onosproject.incubator.net.tunnel.Tunnel;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070036import org.onosproject.incubator.net.tunnel.TunnelAdminService;
37import org.onosproject.incubator.net.tunnel.TunnelDescription;
38import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
39import org.onosproject.incubator.net.tunnel.TunnelEvent;
40import org.onosproject.incubator.net.tunnel.TunnelId;
41import org.onosproject.incubator.net.tunnel.TunnelListener;
42import org.onosproject.incubator.net.tunnel.TunnelName;
43import org.onosproject.incubator.net.tunnel.TunnelProvider;
44import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
45import org.onosproject.incubator.net.tunnel.TunnelProviderService;
46import org.onosproject.incubator.net.tunnel.TunnelService;
47import org.onosproject.incubator.net.tunnel.TunnelStore;
48import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
49import org.onosproject.incubator.net.tunnel.TunnelSubscription;
samuel7a5691a2015-05-23 00:36:32 +080050import org.onosproject.net.Annotations;
51import org.onosproject.net.Path;
52import org.onosproject.net.provider.AbstractProviderRegistry;
53import org.onosproject.net.provider.AbstractProviderService;
54import org.onosproject.net.provider.ProviderId;
wei wei89ddc322015-03-22 16:29:04 -050055import org.slf4j.Logger;
56
57/**
58 * Provides implementation of the tunnel NB/SB APIs.
59 */
60@Component(immediate = true, enabled = true)
61@Service
jcc4a20a5f2015-04-30 15:43:39 +080062public class TunnelManager
63 extends AbstractProviderRegistry<TunnelProvider, TunnelProviderService>
wei wei89ddc322015-03-22 16:29:04 -050064 implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
65
66 private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
67
68 private final Logger log = getLogger(getClass());
69
Simon Huntff663742015-05-14 13:33:05 -070070 protected final ListenerRegistry<TunnelEvent, TunnelListener>
71 listenerRegistry = new ListenerRegistry<>();
wei wei89ddc322015-03-22 16:29:04 -050072
73 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080074
wei wei89ddc322015-03-22 16:29:04 -050075
76 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected TunnelStore store;
78
79 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
80 protected EventDeliveryService eventDispatcher;
81
wei wei89ddc322015-03-22 16:29:04 -050082 @Activate
83 public void activate() {
jccd8697232015-05-05 14:42:23 +080084 store.setDelegate(delegate);
85 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050086 log.info("Started");
87 }
88
89 @Deactivate
90 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080091 store.unsetDelegate(delegate);
92 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050093 log.info("Stopped");
94 }
95
96 @Override
jccd8697232015-05-05 14:42:23 +080097 public void removeTunnel(TunnelId tunnelId) {
98 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
99 store.deleteTunnel(tunnelId);
100 Tunnel tunnel = store.queryTunnel(tunnelId);
101 if (tunnel.providerId() != null) {
102 TunnelProvider provider = getProvider(tunnel.providerId());
103 if (provider != null) {
104 provider.releaseTunnel(tunnel);
105 }
106 } else {
107 Set<ProviderId> ids = getProviders();
108 for (ProviderId providerId : ids) {
109 TunnelProvider provider = getProvider(providerId);
110 provider.releaseTunnel(tunnel);
111 }
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) {
135 store.deleteTunnel(src, dst, producerName);
136 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
137 for (Tunnel tunnel : setTunnels) {
138 if (producerName != null
139 && !tunnel.providerId().equals(producerName)) {
140 continue;
141 }
142 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 }
153 }
154 }
155 }
156
157 @Override
158 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
159 ProviderId producerName) {
160 store.deleteTunnel(src, dst, type, producerName);
161 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
162 for (Tunnel tunnel : setTunnels) {
163 if (producerName != null
164 && !tunnel.providerId().equals(producerName)
165 || !type.equals(tunnel.type())) {
166 continue;
167 }
168 if (tunnel.providerId() != null) {
169 TunnelProvider provider = getProvider(tunnel.providerId());
170 if (provider != null) {
171 provider.releaseTunnel(tunnel);
172 }
173 } else {
174 Set<ProviderId> ids = getProviders();
175 for (ProviderId providerId : ids) {
176 TunnelProvider provider = getProvider(providerId);
177 provider.releaseTunnel(tunnel);
178 }
179 }
180 }
181 }
182
183 @Override
184 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
185 Annotations... annotations) {
186 return store.borrowTunnel(consumerId, tunnelId, annotations);
187 }
188
189 @Override
190 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
191 TunnelName tunnelName,
192 Annotations... annotations) {
193 return store.borrowTunnel(consumerId, tunnelName, annotations);
194 }
195
196 @Override
197 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
198 TunnelEndPoint src, TunnelEndPoint dst,
199 Annotations... annotations) {
200 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
201 dst, annotations);
202 if (tunnels == null || tunnels.size() == 0) {
203 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
204 null, null, annotations);
205 Set<ProviderId> ids = getProviders();
206 for (ProviderId providerId : ids) {
207 TunnelProvider provider = getProvider(providerId);
208 provider.setupTunnel(tunnel, null);
209 }
210 }
211 return tunnels;
212 }
213
214 @Override
215 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
216 TunnelEndPoint src, TunnelEndPoint dst,
217 Type type, Annotations... annotations) {
218 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
219 dst, type,
220 annotations);
221 if (tunnels == null || tunnels.size() == 0) {
222 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
223 null, null, annotations);
224 Set<ProviderId> ids = getProviders();
225 for (ProviderId providerId : ids) {
226 TunnelProvider provider = getProvider(providerId);
227 provider.setupTunnel(tunnel, null);
228 }
229 }
230 return tunnels;
231 }
232
233 @Override
234 public boolean returnTunnel(ApplicationId consumerId,
235 TunnelId tunnelId, Annotations... annotations) {
236 return store.returnTunnel(consumerId, tunnelId, annotations);
237 }
238
239 @Override
240 public boolean returnTunnel(ApplicationId consumerId,
241 TunnelName tunnelName,
242 Annotations... annotations) {
243 return store.returnTunnel(consumerId, tunnelName, annotations);
244 }
245
246 @Override
247 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
248 TunnelEndPoint dst, Type type,
249 Annotations... annotations) {
250 return store.returnTunnel(consumerId, src, dst, type, annotations);
251 }
252
253 @Override
254 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
255 TunnelEndPoint dst, Annotations... annotations) {
256 return store.returnTunnel(consumerId, src, dst, annotations);
257 }
258
259 @Override
260 public Tunnel queryTunnel(TunnelId tunnelId) {
261 return store.queryTunnel(tunnelId);
262 }
263
264 @Override
265 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
266 return store.queryTunnelSubscription(consumerId);
267 }
268
269 @Override
270 public Collection<Tunnel> queryTunnel(Type type) {
271 return store.queryTunnel(type);
272 }
273
274 @Override
275 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
276 return store.queryTunnel(src, dst);
277 }
278
samuel7a5691a2015-05-23 00:36:32 +0800279
280 @Override
281 public Collection<Tunnel> queryAllTunnels() {
282 return store.queryAllTunnels();
283 }
284
jccd8697232015-05-05 14:42:23 +0800285 @Override
286 public int tunnelCount() {
287 return store.tunnelCount();
288 }
289
290 @Override
wei wei89ddc322015-03-22 16:29:04 -0500291 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500292 return new InternalTunnelProviderService(provider);
293 }
294
295 @Override
wei wei89ddc322015-03-22 16:29:04 -0500296 public void addListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800297 listenerRegistry.addListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500298 }
299
300 @Override
301 public void removeListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800302 listenerRegistry.removeListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500303 }
304
305 private class InternalTunnelProviderService
306 extends AbstractProviderService<TunnelProvider>
307 implements TunnelProviderService {
308 protected InternalTunnelProviderService(TunnelProvider provider) {
309 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500310 }
311
jccd8697232015-05-05 14:42:23 +0800312
wei wei89ddc322015-03-22 16:29:04 -0500313 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800314 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800315 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
316 tunnel.src(), tunnel.dst(),
317 tunnel.type(),
318 tunnel.groupId(),
319 tunnel.id(),
320 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800321 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800322 tunnel.annotations());
323 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500324 }
325
326 @Override
327 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
340 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800341 if (tunnel.id() != null) {
342 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800343 return;
jccd8697232015-05-05 14:42:23 +0800344 }
345 if (tunnel.src() != null && tunnel.dst() != null
346 && tunnel.type() != null) {
347 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
348 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800349 return;
jccd8697232015-05-05 14:42:23 +0800350 }
351 if (tunnel.src() != null && tunnel.dst() != null
352 && tunnel.type() == null) {
353 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800354 return;
jccd8697232015-05-05 14:42:23 +0800355 }
wei wei89ddc322015-03-22 16:29:04 -0500356 }
357
samuel7a5691a2015-05-23 00:36:32 +0800358
359 @Override
360 public Tunnel tunnelQueryById(TunnelId tunnelId) {
361 return store.queryTunnel(tunnelId);
362 }
363
364
wei wei89ddc322015-03-22 16:29:04 -0500365 }
366
367 private class InternalStoreDelegate implements TunnelStoreDelegate {
368 @Override
369 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500370 if (event != null) {
371 eventDispatcher.post(event);
372 }
373 }
374 }
samuel7a5691a2015-05-23 00:36:32 +0800375
wei wei89ddc322015-03-22 16:29:04 -0500376}