Bug 6934: VpnPseudoPort flows not moved to a new DPN (II) 71/47871/3
authorMiguel Perez <francisco.miguel.perez@ericsson.com>
Thu, 3 Nov 2016 09:26:53 +0000 (10:26 +0100)
committerSam Hague <shague@redhat.com>
Fri, 11 Nov 2016 14:01:04 +0000 (14:01 +0000)
 + This change completes change [1]

 + When karaf is started, Cache wasn't being fed with existing data
   in MD-SAL

 [1] https://git.opendaylight.org/gerrit/#/c/46779/

Change-Id: I93d03094181093bcaa1608b3c95d6dbcfca55741
Signed-off-by: Miguel Perez <francisco.miguel.perez@ericsson.com>
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/VPNServiceChainHandler.java
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/jobs/AddVpnPseudoPortDataJob.java
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/listeners/VpnPseudoPortListener.java
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnPseudoPortCache.java
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/java/org/opendaylight/netvirt/cloudservicechain/utils/VpnServiceChainUtils.java
vpnservice/cloud-servicechain/cloud-servicechain-impl/src/main/resources/org/opendaylight/blueprint/cloud-servicechain-impl.xml

index 54f5847d3d87de0a7ba99218f0e7642f1a280f82..deda2f86291c3f1c5c16ca8a319757a9aab76502 100755 (executable)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.netvirt.cloudservicechain;
 
-import java.math.BigInteger;;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -21,6 +21,7 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.netvirt.cloudservicechain.jobs.AddVpnPseudoPortDataJob;
 import org.opendaylight.netvirt.cloudservicechain.jobs.RemoveVpnPseudoPortDataJob;
+import org.opendaylight.netvirt.cloudservicechain.utils.VpnPseudoPortCache;
 import org.opendaylight.netvirt.cloudservicechain.utils.VpnServiceChainUtils;
 import org.opendaylight.genius.mdsalutil.NWUtil;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
@@ -31,7 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
@@ -61,6 +61,14 @@ public class VPNServiceChainHandler implements AutoCloseable {
         this.fibRpcService = fibRpcSrv;
     }
 
+    public void init() {
+        VpnPseudoPortCache.createVpnPseudoPortCache(broker);
+    }
+
+    @Override
+    public void close() throws Exception {
+        VpnPseudoPortCache.destroyVpnPseudoPortCache();
+    }
     /**
      * Get RouterDistinguisher by VpnName
      *
@@ -145,7 +153,7 @@ public class VPNServiceChainHandler implements AutoCloseable {
                 }
             }
         } catch (Exception ex) {
-            LOG.error("Exception: programSCFinVPNPipeline", ex);
+            LOG.error("Exception: programVpnToScfPipeline", ex);
         }
     }
 
@@ -174,10 +182,7 @@ public class VPNServiceChainHandler implements AutoCloseable {
     }
 
 
-    @Override
-    public void close() throws Exception {
-        // add
-    }
+
 
 
     /**
index 589a5bcf69ffb6151fc13ecbf3a565bffac03ff5..524825315b30b53a5fa66ea05c6b899fb95a1da3 100644 (file)
@@ -55,8 +55,7 @@ public class AddVpnPseudoPortDataJob extends VpnPseudoPortDataBaseJob {
                                             .setVpnLportTag(vpnPseudoLportTag).build();
         LOG.trace("Adding lportTag={} to VpnToLportTag map for VPN with rd={}", vpnPseudoLportTag, vpnRd);
         InstanceIdentifier<VpnToPseudoPortData> path = VpnServiceChainUtils.getVpnToPseudoPortTagIid(vpnRd);
-        writeTxn.merge(LogicalDatastoreType.CONFIGURATION, path, newValue, true);
-        MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, path, newValue);
+        writeTxn.put(LogicalDatastoreType.CONFIGURATION, path, newValue, true);
 
         result.add(writeTxn.submit());
 
index 173d8c9f06f840842ecc456e1d5cf9d8d1c1133f..c7414f8d86ffee9f6754e846ea20103ab30fe11b 100755 (executable)
@@ -38,7 +38,7 @@ public class VpnPseudoPortListener
     }
 
     public void init() {
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
index 950418105cf070cef4f4441ae67008b98bedca19..ba0c0cdbe1bd028899f41cd3fc60cb506a2aa55a 100755 (executable)
@@ -7,8 +7,10 @@
  */
 package org.opendaylight.netvirt.cloudservicechain.utils;
 
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.utils.cache.CacheUtil;
-
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.cloud.servicechain.state.rev170511.vpn.to.pseudo.port.list.VpnToPseudoPortData;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.slf4j.Logger;
@@ -23,8 +25,25 @@ public class VpnPseudoPortCache {
     public static final Logger LOG = LoggerFactory.getLogger(VpnPseudoPortCache.class);
     public static final String VPNPSEUDOPORT_CACHE_NAME = "VrfToVpnPseudoPortCache";
 
-    static {
-        CacheUtil.createCache(VPNPSEUDOPORT_CACHE_NAME);
+    public static void createVpnPseudoPortCache(DataBroker broker) {
+        if (CacheUtil.getCache(VPNPSEUDOPORT_CACHE_NAME) == null) {
+            CacheUtil.createCache(VPNPSEUDOPORT_CACHE_NAME);
+            initialLoadFromDS(broker);
+        }
+    }
+
+    public static void destroyVpnPseudoPortCache() {
+        if (CacheUtil.getCache(VPNPSEUDOPORT_CACHE_NAME) != null) {
+            CacheUtil.destroyCache(VPNPSEUDOPORT_CACHE_NAME);
+        }
+    }
+
+    private static void initialLoadFromDS(DataBroker broker) {
+        LOG.info("Initial read of Vpn to VpnPseudoPort map from Datastore");
+        List<VpnToPseudoPortData> allVpnToPseudoPortData = VpnServiceChainUtils.getAllVpnToPseudoPortData(broker);
+        for ( VpnToPseudoPortData vpnToPseudoPort : allVpnToPseudoPortData ) {
+           addVpnPseudoPortToCache(vpnToPseudoPort.getVrfId(), vpnToPseudoPort.getVpnLportTag());
+        }
     }
 
     public static void addVpnPseudoPortToCache(String vrfId, long vpnPseudoLportTag) {
index 473f27d7d13354f70fa71d2cc760577ebf060700..23583861c9e411c0392588e32871723df62420e4 100755 (executable)
@@ -146,8 +146,16 @@ public class VpnServiceChainUtils {
         return MDSALDataStoreUtils.read(broker, LogicalDatastoreType.CONFIGURATION, id);
     }
 
+    public static List<VpnToPseudoPortData> getAllVpnToPseudoPortData(DataBroker broker) {
+        InstanceIdentifier<VpnToPseudoPortList> path = InstanceIdentifier.builder(VpnToPseudoPortList.class).build();
+        Optional<VpnToPseudoPortList> all = MDSALDataStoreUtils.read(broker, LogicalDatastoreType.CONFIGURATION, path);
+
+        return all.isPresent() ? all.get().getVpnToPseudoPortData() : new ArrayList<>();
+    }
+
+
     /**
-     *      * Retrieves the VpnId searching by VpnInstanceName
+     * Retrieves the VpnId searching by VpnInstanceName
      *
      * @param broker
      * @param vpnName
index ff688e6397b3ff523d9b148ce3befec1563190b3..31aab34a5efc4ee6afcd0f0a994d031ab87620fa 100644 (file)
@@ -10,7 +10,8 @@
     <odl:rpc-service id="fibRpcService"
                      interface="org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService"/>
 
-    <bean id="vpnServiceChainHandler" class="org.opendaylight.netvirt.cloudservicechain.VPNServiceChainHandler">
+    <bean id="vpnServiceChainHandler" class="org.opendaylight.netvirt.cloudservicechain.VPNServiceChainHandler"
+          init-method="init" destroy-method="close">
         <argument ref="dataBroker" />
         <argument ref="mdsalManager" />
         <argument ref="fibRpcService" />