From 7db736dca77331dccde261a7bd5245e6bb9f432b Mon Sep 17 00:00:00 2001 From: Sasidharan Sambasivam Date: Tue, 12 May 2015 13:56:52 +0530 Subject: [PATCH] API to getdpn list for a given vpn Change-Id: Iac5417da54c910a93bdc5f6c311f2f71fc9cb857 Signed-off-by: Sasidharan Sambasivam --- features/src/main/features/features.xml | 1 + vpnmanager/vpnmanager-api/pom.xml | 6 +- .../vpnmanager/api/IVpnManager.java | 7 +++ .../src/main/yang/vpnmanager-api.yang | 20 +++++++ .../src/main/config/default-config.xml | 9 +++ .../vpnservice/VpnInterfaceManager.java | 60 ++++++++++++++++++- .../vpnservice/VpnserviceProvider.java | 9 ++- .../src/main/yang/vpnservice-impl.yang | 2 + 8 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java create mode 100644 vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang diff --git a/features/src/main/features/features.xml b/features/src/main/features/features.xml index bf8e1b3b..38b6f759 100644 --- a/features/src/main/features/features.xml +++ b/features/src/main/features/features.xml @@ -15,6 +15,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html mvn:org.opendaylight.openflowplugin/features-openflowplugin/${openflowplugin.version}/xml/features mvn:org.opendaylight.controller/features-restconf/${mdsal.version}/xml/features + odl-mdsal-broker odl-yangtools-models odl-openflowplugin-nsf-model mvn:org.opendaylight.vpnservice/model-bgp/{{VERSION}} diff --git a/vpnmanager/vpnmanager-api/pom.xml b/vpnmanager/vpnmanager-api/pom.xml index cd7e9fc9..1f9f1584 100644 --- a/vpnmanager/vpnmanager-api/pom.xml +++ b/vpnmanager/vpnmanager-api/pom.xml @@ -9,7 +9,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.vpnservice - binding-parent + config-parent 0.1.0-SNAPSHOT ../../commons/binding-parent @@ -61,5 +61,9 @@ and is available at http://www.eclipse.org/legal/epl-v10.html model-bgp ${model.bgp.version} + + org.opendaylight.controller + config-api + diff --git a/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java b/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java new file mode 100644 index 00000000..3748ec13 --- /dev/null +++ b/vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java @@ -0,0 +1,7 @@ +package org.opendaylight.vpnmanager.api; + +import java.util.Collection; + +public interface IVpnManager { + Collection getDpnsForVpn(long vpnId); +} diff --git a/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang b/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang new file mode 100644 index 00000000..eb73fb45 --- /dev/null +++ b/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang @@ -0,0 +1,20 @@ +module vpnmanager-api { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:vpnmanager:api"; + prefix "vpnmanager-api"; + + import config { prefix config; revision-date 2013-04-05; } + + description + "Service definition for vpnmanager project"; + + revision "2015-05-08" { + description + "Initial revision"; + } + + identity vpnmanager-api { + base "config:service-type"; + config:java-class "org.opendaylight.vpnmanager.api.IVpnManager"; + } +} \ No newline at end of file diff --git a/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml b/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml index ac872246..8312c9f7 100644 --- a/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml +++ b/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml @@ -44,6 +44,15 @@ and is available at http://www.eclipse.org/legal/epl-v10.html + + + prefix:vpnmanager-api + + vpnmanager + /modules/module[type='vpnservice-impl'][name='vpnservice-default'] + + + diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index 6d7d7d02..380d974e 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -8,12 +8,18 @@ package org.opendaylight.vpnservice; import java.math.BigInteger; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.FutureCallback; @@ -70,6 +76,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener> vpnToDpnsDb; + private Map> dpnToInterfaceDb; private static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { @@ -92,6 +100,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener(); + dpnToInterfaceDb = new ConcurrentHashMap<>(); registerListener(db); } @@ -230,6 +240,41 @@ public class VpnInterfaceManager extends AbstractDataChangeListener dpnIds = vpnToDpnsDb.get(vpnId); + if(dpnIds == null) { + dpnIds = new HashSet<>(); + } + if(dpnIds.add(dpnId)) { + vpnToDpnsDb.put(vpnId, dpnIds); + //TODO: Send an Event that new DPN added... + } + + Collection intfNames = dpnToInterfaceDb.get(dpnId); + if(intfNames == null) { + intfNames = new ArrayList<>(); + } + intfNames.add(intfName); + dpnToInterfaceDb.put(dpnId, intfNames); + } + + private synchronized void remoteFromMappingDbs(long vpnId, long dpnId, String inftName) { + Collection intfNames = dpnToInterfaceDb.get(dpnId); + if(intfNames == null) { + return; + } + intfNames.remove(inftName); + dpnToInterfaceDb.put(dpnId, intfNames); + if(intfNames.isEmpty()) { + Collection dpnIds = vpnToDpnsDb.get(vpnId); + if(dpnIds == null) { + return; + } + dpnIds.remove(dpnId); + vpnToDpnsDb.put(vpnId, dpnIds); + } + } + private void bindServiceOnInterface(Interface intf, long vpnId) { LOG.info("Bind service on interface {} for VPN: {}", intf, vpnId); @@ -237,6 +282,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener port = read(LogicalDatastoreType.CONFIGURATION, id); if (port.isPresent()) { Interface interf = port.get(); - unbindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName())); removeNextHops(identifier, vpnInterface); + unbindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName())); } else { LOG.info("No nexthops were available to handle remove event {}", interfaceName); } @@ -347,6 +394,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener getDpnsForVpn(long vpnId) { + Collection dpnIds = vpnToDpnsDb.get(vpnId); + if(dpnIds != null) { + return ImmutableList.copyOf(dpnIds); + } else { + return Collections.emptyList(); + } + } } diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java index 44173321..6b462e4e 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java @@ -8,6 +8,7 @@ package org.opendaylight.vpnservice; import java.math.BigInteger; +import java.util.Collection; import java.util.Collections; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -16,6 +17,7 @@ import org.opendaylight.bgpmanager.api.IBgpManager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; +import org.opendaylight.vpnmanager.api.IVpnManager; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput; @@ -25,7 +27,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VpnserviceProvider implements BindingAwareProvider, +public class VpnserviceProvider implements BindingAwareProvider, IVpnManager, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class); @@ -91,4 +93,9 @@ public class VpnserviceProvider implements BindingAwareProvider, vpnManager.close(); vpnInterfaceManager.close(); } + + @Override + public Collection getDpnsForVpn(long vpnId) { + return vpnInterfaceManager.getDpnsForVpn(vpnId); + } } diff --git a/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang b/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang index d73c9d62..2aac44cf 100644 --- a/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang +++ b/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang @@ -6,6 +6,7 @@ module vpnservice-impl { import config { prefix config; revision-date 2013-04-05; } import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;} import bgpmanager-api { prefix bgpmgr-api; revision-date 2015-04-20;} + import vpnmanager-api { prefix vpnmgr-api; revision-date 2015-05-08;} import odl-mdsalutil { prefix odl-mdsal; revision-date 2015-04-10;} import odl-interface {prefix odlif; revision-date 2015-03-31;} @@ -19,6 +20,7 @@ module vpnservice-impl { identity vpnservice-impl { base config:module-type; + config:provided-service vpnmgr-api:vpnmanager-api; config:java-name-prefix VpnserviceImpl; } -- 2.36.6