[ONOS-1284][ONOS-1869]the implementation of tunnel subsystem.It includes
test
commands, store, service. the store use eventually consistent.
Change-Id: Id54224ff65f3f2fa0a1d7adb072a2fe664987d18
diff --git a/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java b/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java
index 563651c..47e5311 100644
--- a/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java
+++ b/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java
@@ -15,11 +15,11 @@
*/
package org.onosproject.net.tunnel.impl;
+import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Collection;
import java.util.Set;
-import java.util.concurrent.ExecutorService;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
@@ -28,16 +28,14 @@
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
import org.onosproject.event.EventDeliveryService;
import org.onosproject.event.ListenerRegistry;
import org.onosproject.net.Annotations;
import org.onosproject.net.Path;
-import org.onosproject.net.link.LinkEvent;
-import org.onosproject.net.link.LinkListener;
import org.onosproject.net.provider.AbstractProviderRegistry;
import org.onosproject.net.provider.AbstractProviderService;
import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.tunnel.DefaultTunnel;
import org.onosproject.net.tunnel.Tunnel;
import org.onosproject.net.tunnel.Tunnel.Type;
import org.onosproject.net.tunnel.TunnelAdminService;
@@ -73,8 +71,7 @@
listenerRegistry = new ListenerRegistry<>();
private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
- private final InternalTunnelListener tunnelListener = new InternalTunnelListener();
- private InternalLinkListener linkListener = new InternalLinkListener();
+
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected TunnelStore store;
@@ -82,73 +79,221 @@
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected EventDeliveryService eventDispatcher;
- @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected CoreService coreService;
-
- private ExecutorService futureService;
-
@Activate
public void activate() {
- // TODO Auto-generated method stub
+ store.setDelegate(delegate);
+ eventDispatcher.addSink(TunnelEvent.class, listenerRegistry);
log.info("Started");
}
@Deactivate
public void deactivate() {
- // TODO Auto-generated method stub
+ store.unsetDelegate(delegate);
+ eventDispatcher.removeSink(TunnelEvent.class);
log.info("Stopped");
}
@Override
+ public void removeTunnel(TunnelId tunnelId) {
+ checkNotNull(tunnelId, TUNNNEL_ID_NULL);
+ store.deleteTunnel(tunnelId);
+ Tunnel tunnel = store.queryTunnel(tunnelId);
+ if (tunnel.providerId() != null) {
+ TunnelProvider provider = getProvider(tunnel.providerId());
+ if (provider != null) {
+ provider.releaseTunnel(tunnel);
+ }
+ } else {
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.releaseTunnel(tunnel);
+ }
+ }
+ }
+
+ @Override
+ public void updateTunnel(Tunnel tunnel, Path path) {
+ store.createOrUpdateTunnel(tunnel);
+ if (tunnel.providerId() != null) {
+ TunnelProvider provider = getProvider(tunnel.providerId());
+ if (provider != null) {
+ provider.updateTunnel(tunnel, path);
+ }
+ } else {
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.updateTunnel(tunnel, path);
+ }
+ }
+ }
+
+ @Override
+ public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
+ ProviderId producerName) {
+ store.deleteTunnel(src, dst, producerName);
+ Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
+ for (Tunnel tunnel : setTunnels) {
+ if (producerName != null
+ && !tunnel.providerId().equals(producerName)) {
+ continue;
+ }
+ if (tunnel.providerId() != null) {
+ TunnelProvider provider = getProvider(tunnel.providerId());
+ if (provider != null) {
+ provider.releaseTunnel(tunnel);
+ }
+ } else {
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.releaseTunnel(tunnel);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst, Type type,
+ ProviderId producerName) {
+ store.deleteTunnel(src, dst, type, producerName);
+ Collection<Tunnel> setTunnels = store.queryTunnel(src, dst);
+ for (Tunnel tunnel : setTunnels) {
+ if (producerName != null
+ && !tunnel.providerId().equals(producerName)
+ || !type.equals(tunnel.type())) {
+ continue;
+ }
+ if (tunnel.providerId() != null) {
+ TunnelProvider provider = getProvider(tunnel.providerId());
+ if (provider != null) {
+ provider.releaseTunnel(tunnel);
+ }
+ } else {
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.releaseTunnel(tunnel);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
+ Annotations... annotations) {
+ return store.borrowTunnel(consumerId, tunnelId, annotations);
+ }
+
+ @Override
+ public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
+ TunnelName tunnelName,
+ Annotations... annotations) {
+ return store.borrowTunnel(consumerId, tunnelName, annotations);
+ }
+
+ @Override
+ public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
+ TunnelEndPoint src, TunnelEndPoint dst,
+ Annotations... annotations) {
+ Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
+ dst, annotations);
+ if (tunnels == null || tunnels.size() == 0) {
+ Tunnel tunnel = new DefaultTunnel(null, src, dst, null, null, null,
+ null, null, annotations);
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.setupTunnel(tunnel, null);
+ }
+ }
+ return tunnels;
+ }
+
+ @Override
+ public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
+ TunnelEndPoint src, TunnelEndPoint dst,
+ Type type, Annotations... annotations) {
+ Collection<Tunnel> tunnels = store.borrowTunnel(consumerId, src,
+ dst, type,
+ annotations);
+ if (tunnels == null || tunnels.size() == 0) {
+ Tunnel tunnel = new DefaultTunnel(null, src, dst, type, null, null,
+ null, null, annotations);
+ Set<ProviderId> ids = getProviders();
+ for (ProviderId providerId : ids) {
+ TunnelProvider provider = getProvider(providerId);
+ provider.setupTunnel(tunnel, null);
+ }
+ }
+ return tunnels;
+ }
+
+ @Override
+ public boolean returnTunnel(ApplicationId consumerId,
+ TunnelId tunnelId, Annotations... annotations) {
+ return store.returnTunnel(consumerId, tunnelId, annotations);
+ }
+
+ @Override
+ public boolean returnTunnel(ApplicationId consumerId,
+ TunnelName tunnelName,
+ Annotations... annotations) {
+ return store.returnTunnel(consumerId, tunnelName, annotations);
+ }
+
+ @Override
+ public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
+ TunnelEndPoint dst, Type type,
+ Annotations... annotations) {
+ return store.returnTunnel(consumerId, src, dst, type, annotations);
+ }
+
+ @Override
+ public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
+ TunnelEndPoint dst, Annotations... annotations) {
+ return store.returnTunnel(consumerId, src, dst, annotations);
+ }
+
+ @Override
+ public Tunnel queryTunnel(TunnelId tunnelId) {
+ return store.queryTunnel(tunnelId);
+ }
+
+ @Override
+ public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
+ return store.queryTunnelSubscription(consumerId);
+ }
+
+ @Override
+ public Collection<Tunnel> queryTunnel(Type type) {
+ return store.queryTunnel(type);
+ }
+
+ @Override
+ public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
+ return store.queryTunnel(src, dst);
+ }
+
+ @Override
+ public int tunnelCount() {
+ return store.tunnelCount();
+ }
+
+ @Override
protected TunnelProviderService createProviderService(TunnelProvider provider) {
- // TODO Auto-generated method stub
return new InternalTunnelProviderService(provider);
}
@Override
- public TunnelProviderService register(TunnelProvider provider) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void unregister(TunnelProvider provider) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public Set<ProviderId> getProviders() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
public void addListener(TunnelListener listener) {
- // TODO Auto-generated method stub
-
+ listenerRegistry.addListener(listener);
}
@Override
public void removeListener(TunnelListener listener) {
- // TODO Auto-generated method stub
-
- }
-
- private class InternalTunnelListener implements TunnelListener {
- @Override
- public void event(TunnelEvent event) {
- // TODO Auto-generated method stub
-
- }
- }
-
- private class InternalLinkListener implements LinkListener {
- @Override
- public void event(LinkEvent event) {
- // TODO Auto-generated method stub
-
- }
+ listenerRegistry.removeListener(listener);
}
private class InternalTunnelProviderService
@@ -156,25 +301,47 @@
implements TunnelProviderService {
protected InternalTunnelProviderService(TunnelProvider provider) {
super(provider);
- // TODO Auto-generated constructor stub
}
+
@Override
public TunnelId tunnelAdded(TunnelDescription tunnel) {
- // TODO Auto-generated method stub
- return null;
+ Tunnel storedTunnel = new DefaultTunnel(provider().id(),
+ tunnel.src(), tunnel.dst(),
+ tunnel.type(),
+ tunnel.groupId(),
+ tunnel.id(),
+ tunnel.tunnelName(),
+ tunnel.annotations());
+ return store.createOrUpdateTunnel(storedTunnel);
}
@Override
public void tunnelUpdated(TunnelDescription tunnel) {
- // TODO Auto-generated method stub
-
+ Tunnel storedTunnel = new DefaultTunnel(provider().id(),
+ tunnel.src(), tunnel.dst(),
+ tunnel.type(),
+ tunnel.groupId(),
+ tunnel.id(),
+ tunnel.tunnelName(),
+ tunnel.annotations());
+ store.createOrUpdateTunnel(storedTunnel);
}
@Override
public void tunnelRemoved(TunnelDescription tunnel) {
- // TODO Auto-generated method stub
-
+ if (tunnel.id() != null) {
+ store.deleteTunnel(tunnel.id());
+ }
+ if (tunnel.src() != null && tunnel.dst() != null
+ && tunnel.type() != null) {
+ store.deleteTunnel(tunnel.src(), tunnel.dst(), tunnel.type(),
+ provider().id());
+ }
+ if (tunnel.src() != null && tunnel.dst() != null
+ && tunnel.type() == null) {
+ store.deleteTunnel(tunnel.src(), tunnel.dst(), provider().id());
+ }
}
}
@@ -182,129 +349,9 @@
private class InternalStoreDelegate implements TunnelStoreDelegate {
@Override
public void notify(TunnelEvent event) {
- // TODO Auto-generated method stub
if (event != null) {
eventDispatcher.post(event);
}
}
}
-
- @Override
- public void removeTunnel(TunnelId tunnelId) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
- ProviderId producerName) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void removeTunnels(TunnelEndPoint src, TunnelEndPoint dst,
- Type type, ProviderId producerName) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void updateTunnel(Tunnel tunnel, Path path) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public Tunnel borrowTunnel(ApplicationId consumerId, TunnelId tunnelId,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
- TunnelName tunnelName,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
- TunnelEndPoint src,
- TunnelEndPoint dst,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<Tunnel> borrowTunnel(ApplicationId consumerId,
- TunnelEndPoint src,
- TunnelEndPoint dst, Type type,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean returnTunnel(ApplicationId consumerId, TunnelId tunnelId,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean returnTunnel(ApplicationId consumerId,
- TunnelName tunnelName, Annotations... annotations) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
- TunnelEndPoint dst, Type type,
- Annotations... annotations) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean returnTunnel(ApplicationId consumerId, TunnelEndPoint src,
- TunnelEndPoint dst, Annotations... annotations) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public Tunnel queryTunnel(TunnelId tunnelId) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<Tunnel> queryTunnel(Type type) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int tunnelCount() {
- // TODO Auto-generated method stub
- return 0;
- }
-
}