API to getdpn list for a given vpn 89/20089/1
authorSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Tue, 12 May 2015 08:26:52 +0000 (13:56 +0530)
committerSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Tue, 12 May 2015 08:27:38 +0000 (13:57 +0530)
Change-Id: Iac5417da54c910a93bdc5f6c311f2f71fc9cb857
Signed-off-by: Sasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
features/src/main/features/features.xml
vpnmanager/vpnmanager-api/pom.xml
vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java [new file with mode: 0644]
vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang [new file with mode: 0644]
vpnmanager/vpnmanager-impl/src/main/config/default-config.xml
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java
vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang

index bf8e1b3b0e8f46c2d8f8d5d34b8083cd8451b643..38b6f759a72eda01defa8af4aae3fb6cf32bcf0b 100644 (file)
@@ -15,6 +15,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin/${openflowplugin.version}/xml/features</repository>
   <repository>mvn:org.opendaylight.controller/features-restconf/${mdsal.version}/xml/features</repository>
   <feature name='odl-vpnservice-api' version='${project.version}' description='OpenDaylight :: vpnservice :: api '>
+    <feature version='${mdsal.version}'>odl-mdsal-broker</feature>
     <feature version='${yangtools.version}'>odl-yangtools-models</feature>
     <feature version='${openflowplugin.version}'>odl-openflowplugin-nsf-model</feature>
     <bundle>mvn:org.opendaylight.vpnservice/model-bgp/{{VERSION}}</bundle>
index cd7e9fc9631e5d57983969d24ae0ab0a60848e1c..1f9f1584bc9471215eb9c78c147c2f20699ec296 100644 (file)
@@ -9,7 +9,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
     <groupId>org.opendaylight.vpnservice</groupId>
-    <artifactId>binding-parent</artifactId>
+    <artifactId>config-parent</artifactId>
     <version>0.1.0-SNAPSHOT</version>
     <relativePath>../../commons/binding-parent</relativePath>
   </parent>
@@ -61,5 +61,9 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>model-bgp</artifactId>
       <version>${model.bgp.version}</version>
     </dependency>
+    <dependency>
+        <groupId>org.opendaylight.controller</groupId>
+        <artifactId>config-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
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 (file)
index 0000000..3748ec1
--- /dev/null
@@ -0,0 +1,7 @@
+package org.opendaylight.vpnmanager.api;
+
+import java.util.Collection;
+
+public interface IVpnManager {
+    Collection<Long> 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 (file)
index 0000000..eb73fb4
--- /dev/null
@@ -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
index ac872246db3060a63b9c277c4a24919b4e85a8ed..8312c9f7904e7fd56b49f203c425c0c191753719 100644 (file)
@@ -44,6 +44,15 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
           </odlinterface>
         </module>
       </modules>
+      <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+        <service>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:vpnmanager:api">prefix:vpnmanager-api</type>
+          <instance>
+            <name>vpnmanager</name>
+            <provider>/modules/module[type='vpnservice-impl'][name='vpnservice-default']</provider>
+          </instance>
+        </service>
+      </services>
     </data>
   </configuration>
 </snapshot>
index 6d7d7d02ca784be62ef7e88de74e991d9b172133..380d974e011601ca6403f62c2588662682b983f6 100644 (file)
@@ -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<VpnInterface
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
     private IdManagerService idManager;
+    private Map<Long, Collection<Long>> vpnToDpnsDb;
+    private Map<Long, Collection<String>> dpnToInterfaceDb;
 
     private static final FutureCallback<Void> DEFAULT_CALLBACK =
             new FutureCallback<Void>() {
@@ -92,6 +100,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         super(VpnInterface.class);
         broker = db;
         this.bgpManager = bgpManager;
+        vpnToDpnsDb = new ConcurrentHashMap<>();
+        dpnToInterfaceDb = new ConcurrentHashMap<>();
         registerListener(db);
     }
 
@@ -230,6 +240,41 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         return rd;
     }
 
+    private synchronized void updateMappingDbs(long vpnId, long dpnId, String intfName) {
+        Collection<Long> 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<String> 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<String> intfNames = dpnToInterfaceDb.get(dpnId);
+        if(intfNames == null) {
+            return;
+        }
+        intfNames.remove(inftName);
+        dpnToInterfaceDb.put(dpnId, intfNames);
+        if(intfNames.isEmpty()) {
+            Collection<Long> 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<VpnInterface
         if(dpId == 0L) {
             LOG.warn("DPN for interface {} not found. Bind service on this interface aborted.", intf.getName());
             return;
+        } else {
+            updateMappingDbs(vpnId, dpId, intf.getName());
         }
 
         long portNo = interfaceManager.getPortForInterface(intf.getName());
@@ -307,8 +354,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Optional<Interface> 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<VpnInterface
         if(dpId == 0L) {
             LOG.warn("DPN for interface {} not found. Unbind service on this interface aborted.", intf.getName());
             return;
+        } else {
+            remoteFromMappingDbs(vpnId, dpId, intf.getName());
         }
 
         long portNo = interfaceManager.getPortForInterface(intf.getName());
@@ -388,4 +437,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         tx.put(datastoreType, path, data, true);
         Futures.addCallback(tx.submit(), callback);
     }
+
+    synchronized Collection<Long> getDpnsForVpn(long vpnId) {
+        Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
+        if(dpnIds != null) {
+            return ImmutableList.copyOf(dpnIds);
+        } else {
+            return Collections.emptyList();
+        }
+    }
 }
index 441733217736d8aace2164a5bfbe2c93d783a4e2..6b462e4e5d975e10698194576f9b470ecc9ea0c2 100644 (file)
@@ -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<Long> getDpnsForVpn(long vpnId) {
+        return vpnInterfaceManager.getDpnsForVpn(vpnId);
+    }
 }
index d73c9d621d6aad569804fdbadfdfb699aff2c75f..2aac44cf474e2222b19b7ffe71bac5cac6767a87 100644 (file)
@@ -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;
     }