blob: bb344b7f111fe99b403d410badd42481c13ca8a0 [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;
cheng fan35dc0f22015-06-10 06:02:47 +080022import java.util.Collections;
jcc4a20a5f2015-04-30 15:43:39 +080023import java.util.Set;
jcc4a20a5f2015-04-30 15:43:39 +080024
wei wei89ddc322015-03-22 16:29:04 -050025import org.apache.felix.scr.annotations.Activate;
26import org.apache.felix.scr.annotations.Component;
27import org.apache.felix.scr.annotations.Deactivate;
28import org.apache.felix.scr.annotations.Reference;
29import org.apache.felix.scr.annotations.ReferenceCardinality;
30import org.apache.felix.scr.annotations.Service;
jcc4a20a5f2015-04-30 15:43:39 +080031import org.onosproject.core.ApplicationId;
wei wei89ddc322015-03-22 16:29:04 -050032import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070033import org.onosproject.event.ListenerRegistry;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070034import org.onosproject.incubator.net.tunnel.DefaultTunnel;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070035import org.onosproject.incubator.net.tunnel.Tunnel.Type;
samuel7a5691a2015-05-23 00:36:32 +080036import org.onosproject.incubator.net.tunnel.Tunnel;
Thomas Vachuskabf916ea2015-05-20 18:24:34 -070037import org.onosproject.incubator.net.tunnel.TunnelAdminService;
38import org.onosproject.incubator.net.tunnel.TunnelDescription;
39import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
40import org.onosproject.incubator.net.tunnel.TunnelEvent;
41import org.onosproject.incubator.net.tunnel.TunnelId;
42import org.onosproject.incubator.net.tunnel.TunnelListener;
43import org.onosproject.incubator.net.tunnel.TunnelName;
44import org.onosproject.incubator.net.tunnel.TunnelProvider;
45import org.onosproject.incubator.net.tunnel.TunnelProviderRegistry;
46import org.onosproject.incubator.net.tunnel.TunnelProviderService;
47import org.onosproject.incubator.net.tunnel.TunnelService;
48import org.onosproject.incubator.net.tunnel.TunnelStore;
49import org.onosproject.incubator.net.tunnel.TunnelStoreDelegate;
50import org.onosproject.incubator.net.tunnel.TunnelSubscription;
samuel7a5691a2015-05-23 00:36:32 +080051import org.onosproject.net.Annotations;
cheng fan35dc0f22015-06-10 06:02:47 +080052import org.onosproject.net.DeviceId;
samuel7a5691a2015-05-23 00:36:32 +080053import org.onosproject.net.Path;
54import org.onosproject.net.provider.AbstractProviderRegistry;
55import org.onosproject.net.provider.AbstractProviderService;
56import org.onosproject.net.provider.ProviderId;
wei wei89ddc322015-03-22 16:29:04 -050057import org.slf4j.Logger;
58
59/**
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
65 extends AbstractProviderRegistry<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
Simon Huntff663742015-05-14 13:33:05 -070072 protected final ListenerRegistry<TunnelEvent, TunnelListener>
73 listenerRegistry = new ListenerRegistry<>();
wei wei89ddc322015-03-22 16:29:04 -050074
75 private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
jccd8697232015-05-05 14:42:23 +080076
wei wei89ddc322015-03-22 16:29:04 -050077
78 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 protected TunnelStore store;
80
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected EventDeliveryService eventDispatcher;
83
wei wei89ddc322015-03-22 16:29:04 -050084 @Activate
85 public void activate() {
jccd8697232015-05-05 14:42:23 +080086 store.setDelegate(delegate);
87 eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
wei wei89ddc322015-03-22 16:29:04 -050088 log.info("Started");
89 }
90
91 @Deactivate
92 public void deactivate() {
jccd8697232015-05-05 14:42:23 +080093 store.unsetDelegate(delegate);
94 eventDispatcher.removeSink(TunnelEvent.class);
wei wei89ddc322015-03-22 16:29:04 -050095 log.info("Stopped");
96 }
97
98 @Override
jccd8697232015-05-05 14:42:23 +080099 public void removeTunnel(TunnelId tunnelId) {
100 checkNotNull(tunnelId, TUNNNEL_ID_NULL);
101 store.deleteTunnel(tunnelId);
102 Tunnel tunnel = store.queryTunnel(tunnelId);
103 if (tunnel.providerId() != null) {
104 TunnelProvider provider = getProvider(tunnel.providerId());
105 if (provider != null) {
106 provider.releaseTunnel(tunnel);
107 }
108 } else {
109 Set<ProviderId> ids = getProviders();
110 for (ProviderId providerId : ids) {
111 TunnelProvider provider = getProvider(providerId);
112 provider.releaseTunnel(tunnel);
113 }
114 }
115 }
116
117 @Override
118 public void updateTunnel(Tunnel tunnel, Path path) {
119 store.createOrUpdateTunnel(tunnel);
120 if (tunnel.providerId() != null) {
121 TunnelProvider provider = getProvider(tunnel.providerId());
122 if (provider != null) {
123 provider.updateTunnel(tunnel, path);
124 }
125 } else {
126 Set<ProviderId> ids = getProviders();
127 for (ProviderId providerId : ids) {
128 TunnelProvider provider = getProvider(providerId);
129 provider.updateTunnel(tunnel, path);
130 }
131 }
132 }
133
134 @Override
135 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
136 ProviderId producerName) {
137 store.deleteTunnel(src, dst, producerName);
138 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
139 for (Tunnel tunnel : setTunnels) {
140 if (producerName != null
141 && !tunnel.providerId().equals(producerName)) {
142 continue;
143 }
144 if (tunnel.providerId() != null) {
145 TunnelProvider provider = getProvider(tunnel.providerId());
146 if (provider != null) {
147 provider.releaseTunnel(tunnel);
148 }
149 } else {
150 Set<ProviderId> ids = getProviders();
151 for (ProviderId providerId : ids) {
152 TunnelProvider provider = getProvider(providerId);
153 provider.releaseTunnel(tunnel);
154 }
155 }
156 }
157 }
158
159 @Override
160 public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
161 ProviderId producerName) {
162 store.deleteTunnel(src, dst, type, producerName);
163 Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
164 for (Tunnel tunnel : setTunnels) {
165 if (producerName != null
166 && !tunnel.providerId().equals(producerName)
167 || !type.equals(tunnel.type())) {
168 continue;
169 }
170 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 }
181 }
182 }
183 }
184
185 @Override
186 public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
187 Annotations... annotations) {
188 return store.borrowTunnel(consumerId, tunnelId, annotations);
189 }
190
191 @Override
192 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
193 TunnelName tunnelName,
194 Annotations... annotations) {
195 return store.borrowTunnel(consumerId, tunnelName, annotations);
196 }
197
198 @Override
199 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
200 TunnelEndPoint src, TunnelEndPoint dst,
201 Annotations... annotations) {
202 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
203 dst, annotations);
204 if (tunnels == null || tunnels.size() == 0) {
205 Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
206 null, null, annotations);
207 Set<ProviderId> ids = getProviders();
208 for (ProviderId providerId : ids) {
209 TunnelProvider provider = getProvider(providerId);
210 provider.setupTunnel(tunnel, null);
211 }
212 }
213 return tunnels;
214 }
215
216 @Override
217 public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
218 TunnelEndPoint src, TunnelEndPoint dst,
219 Type type, Annotations... annotations) {
220 Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
221 dst, type,
222 annotations);
223 if (tunnels == null || tunnels.size() == 0) {
224 Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
225 null, null, annotations);
226 Set<ProviderId> ids = getProviders();
227 for (ProviderId providerId : ids) {
228 TunnelProvider provider = getProvider(providerId);
229 provider.setupTunnel(tunnel, null);
230 }
231 }
232 return tunnels;
233 }
234
235 @Override
236 public boolean returnTunnel(ApplicationId consumerId,
237 TunnelId tunnelId, Annotations... annotations) {
238 return store.returnTunnel(consumerId, tunnelId, annotations);
239 }
240
241 @Override
242 public boolean returnTunnel(ApplicationId consumerId,
243 TunnelName tunnelName,
244 Annotations... annotations) {
245 return store.returnTunnel(consumerId, tunnelName, annotations);
246 }
247
248 @Override
249 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
250 TunnelEndPoint dst, Type type,
251 Annotations... annotations) {
252 return store.returnTunnel(consumerId, src, dst, type, annotations);
253 }
254
255 @Override
256 public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
257 TunnelEndPoint dst, Annotations... annotations) {
258 return store.returnTunnel(consumerId, src, dst, annotations);
259 }
260
261 @Override
262 public Tunnel queryTunnel(TunnelId tunnelId) {
263 return store.queryTunnel(tunnelId);
264 }
265
266 @Override
267 public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
268 return store.queryTunnelSubscription(consumerId);
269 }
270
271 @Override
272 public Collection<Tunnel> queryTunnel(Type type) {
273 return store.queryTunnel(type);
274 }
275
276 @Override
277 public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
278 return store.queryTunnel(src, dst);
279 }
280
samuel7a5691a2015-05-23 00:36:32 +0800281
282 @Override
283 public Collection<Tunnel> queryAllTunnels() {
284 return store.queryAllTunnels();
285 }
286
jccd8697232015-05-05 14:42:23 +0800287 @Override
288 public int tunnelCount() {
289 return store.tunnelCount();
290 }
291
292 @Override
wei wei89ddc322015-03-22 16:29:04 -0500293 protected TunnelProviderService createProviderService(TunnelProvider provider) {
wei wei89ddc322015-03-22 16:29:04 -0500294 return new InternalTunnelProviderService(provider);
295 }
296
297 @Override
wei wei89ddc322015-03-22 16:29:04 -0500298 public void addListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800299 listenerRegistry.addListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500300 }
301
302 @Override
303 public void removeListener(TunnelListener listener) {
jccd8697232015-05-05 14:42:23 +0800304 listenerRegistry.removeListener(listener);
wei wei89ddc322015-03-22 16:29:04 -0500305 }
306
307 private class InternalTunnelProviderService
308 extends AbstractProviderService<TunnelProvider>
309 implements TunnelProviderService {
310 protected InternalTunnelProviderService(TunnelProvider provider) {
311 super(provider);
wei wei89ddc322015-03-22 16:29:04 -0500312 }
313
jccd8697232015-05-05 14:42:23 +0800314
wei wei89ddc322015-03-22 16:29:04 -0500315 @Override
jcc4a20a5f2015-04-30 15:43:39 +0800316 public TunnelId tunnelAdded(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800317 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
318 tunnel.src(), tunnel.dst(),
319 tunnel.type(),
320 tunnel.groupId(),
321 tunnel.id(),
322 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800323 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800324 tunnel.annotations());
325 return store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500326 }
327
328 @Override
329 public void tunnelUpdated(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800330 Tunnel storedTunnel = new DefaultTunnel(provider().id(),
331 tunnel.src(), tunnel.dst(),
332 tunnel.type(),
333 tunnel.groupId(),
334 tunnel.id(),
335 tunnel.tunnelName(),
samuel7a5691a2015-05-23 00:36:32 +0800336 tunnel.path(),
jccd8697232015-05-05 14:42:23 +0800337 tunnel.annotations());
338 store.createOrUpdateTunnel(storedTunnel);
wei wei89ddc322015-03-22 16:29:04 -0500339 }
340
341 @Override
342 public void tunnelRemoved(TunnelDescription tunnel) {
jccd8697232015-05-05 14:42:23 +0800343 if (tunnel.id() != null) {
344 store.deleteTunnel(tunnel.id());
samuel7a5691a2015-05-23 00:36:32 +0800345 return;
jccd8697232015-05-05 14:42:23 +0800346 }
347 if (tunnel.src() != null && tunnel.dst() != null
348 && tunnel.type() != null) {
349 store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
350 provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800351 return;
jccd8697232015-05-05 14:42:23 +0800352 }
353 if (tunnel.src() != null && tunnel.dst() != null
354 && tunnel.type() == null) {
355 store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
samuel7a5691a2015-05-23 00:36:32 +0800356 return;
jccd8697232015-05-05 14:42:23 +0800357 }
wei wei89ddc322015-03-22 16:29:04 -0500358 }
359
samuel7a5691a2015-05-23 00:36:32 +0800360
361 @Override
362 public Tunnel tunnelQueryById(TunnelId tunnelId) {
363 return store.queryTunnel(tunnelId);
364 }
365
366
wei wei89ddc322015-03-22 16:29:04 -0500367 }
368
369 private class InternalStoreDelegate implements TunnelStoreDelegate {
370 @Override
371 public void notify(TunnelEvent event) {
wei wei89ddc322015-03-22 16:29:04 -0500372 if (event != null) {
373 eventDispatcher.post(event);
374 }
375 }
376 }
samuel7a5691a2015-05-23 00:36:32 +0800377
cheng fan35dc0f22015-06-10 06:02:47 +0800378 @Override
379 public Iterable<Tunnel> getTunnels(DeviceId deviceId) {
380 return Collections.emptyList();
381 }
382
wei wei89ddc322015-03-22 16:29:04 -0500383}