Bug 8860 : Populate elantag at time of elanInstance creation 29/63129/6
authorAbhinav Gupta <abhinav.gupta@ericsson.com>
Thu, 14 Sep 2017 09:51:42 +0000 (15:21 +0530)
committerVivekanandan Narasimhan <n.vivekanandan@ericsson.com>
Sun, 17 Sep 2017 15:40:28 +0000 (15:40 +0000)
This patch eliminates the delay in elantag being available for use by
SubnetRoute Engine.

Change-Id: I0c3e28758c49d5a600f1213b94172fb532c7a77c
Signed-off-by: Abhinav Gupta <abhinav.gupta@ericsson.com>
vpnservice/elanmanager/elanmanager-api/src/main/java/org/opendaylight/netvirt/elanmanager/api/IElanService.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java
vpnservice/neutronvpn/neutronvpn-impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronNetworkChangeListener.java

index 8446d65ef0af9d292483e4609cc7fbd2ead3d0cc..6ddd5e16978f8d277080045eba82b510ed8ecffd 100644 (file)
@@ -95,4 +95,6 @@ public interface IElanService extends IEtreeService {
      */
     void removeArpResponderFlow(ArpResponderInput arpResponderInput);
 
+    Long retrieveNewElanTag(String idKey);
+
 }
index 1ab8a58c6d89fbb4eb07e5fbe8120a34b506edd2..d789ada54150efd72445395eb659246ef11d6cbb 100644 (file)
@@ -829,4 +829,16 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi
                 arpResponderInput.getSpa(), arpResponderInput.getLportTag());
     }
 
+    /**
+     * Uses the IdManager to retrieve a brand new ElanTag.
+     *
+     * @param idKey
+     *            the id key
+     * @return the integer
+     */
+    @Override
+    public Long retrieveNewElanTag(String idKey) {
+        return elanUtils.retrieveNewElanTag(idManager, idKey);
+    }
+
 }
index 960633d18c1fa2f8bd1d5f593a2160beca3282d9..cd8948ea25e8854552e5cf356edef4e465ee0965 100755 (executable)
@@ -1247,7 +1247,8 @@ public class ElanUtils {
                 .setKey(new ElanTagNameKey(elanTag)).setName(elanInstanceName);
         long etreeLeafTag = -1;
         if (isEtreeInstance(elanInstanceAdded)) {
-            etreeLeafTag = retrieveNewElanTag(idManager, elanInstanceName + ElanConstants.LEAVES_POSTFIX);
+            etreeLeafTag = retrieveNewElanTag(idManager,elanInstanceName + ElanConstants
+                    .LEAVES_POSTFIX);
             EtreeLeafTagName etreeLeafTagName = new EtreeLeafTagNameBuilder()
                     .setEtreeLeafTag(new EtreeLeafTag(etreeLeafTag)).build();
             elanTagNameBuilder.addAugmentation(EtreeLeafTagName.class, etreeLeafTagName);
index c56f30f5cf560a55197dbb0e61523098e90ac786..3cef7203d297d4dcc4b48e46f609c0a2b5e1a912 100644 (file)
@@ -148,7 +148,6 @@ public class NeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBas
         Class<? extends SegmentTypeBase> updateSegmentType = NeutronvpnUtils.getSegmentTypeFromNeutronNetwork(update);
         String updateSegmentationId = NeutronvpnUtils.getSegmentationIdFromNeutronNetwork(update);
         String updatePhysicalNetwork = NeutronvpnUtils.getPhysicalNetworkName(update);
-        Boolean updateExternal = NeutronvpnUtils.getIsExternal(update);
 
         if (!Objects.equals(origSegmentType, updateSegmentType)
                 || !Objects.equals(origSegmentationId, updateSegmentationId)
@@ -163,7 +162,7 @@ public class NeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBas
             if (elanInstance != null) {
                 elanService.deleteExternalElanNetwork(elanInstance);
                 elanInstance = updateElanInstance(elanInstanceName, updateSegmentType, updateSegmentationId,
-                        updatePhysicalNetwork, buildSegments(update), updateExternal);
+                        updatePhysicalNetwork, update);
                 elanService.updateExternalElanNetwork(elanInstance);
             }
 
@@ -208,17 +207,19 @@ public class NeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBas
         Class<? extends SegmentTypeBase> segmentType = NeutronvpnUtils.getSegmentTypeFromNeutronNetwork(input);
         String segmentationId = NeutronvpnUtils.getSegmentationIdFromNeutronNetwork(input);
         String physicalNetworkName = NeutronvpnUtils.getPhysicalNetworkName(input);
-        Boolean isExternal = NeutronvpnUtils.getIsExternal(input);
-        ElanInstance elanInstance = createElanInstance(elanInstanceName, segmentType, segmentationId,
-                                                       physicalNetworkName, buildSegments(input), isExternal);
+        long elanTag = elanService.retrieveNewElanTag(elanInstanceName);
+        ElanInstance elanInstance = createElanInstanceBuilder(elanInstanceName, segmentType, segmentationId,
+                physicalNetworkName, input).setElanTag(elanTag).build();
         MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, id, elanInstance);
-        LOG.debug("ELANInstance {} created", elanInstanceName);
+        LOG.debug("ELANInstance {} created with elan tag {} and segmentation ID {}", elanInstanceName, elanTag,
+                segmentationId);
         return elanInstance;
     }
 
-    private ElanInstance createElanInstance(String elanInstanceName, Class<? extends SegmentTypeBase> segmentType,
-                                            String segmentationId, String physicalNetworkName,
-                                            List<ElanSegments> segments, Boolean isExternal) {
+    private ElanInstanceBuilder createElanInstanceBuilder(String elanInstanceName, Class<? extends SegmentTypeBase>
+            segmentType, String segmentationId, String physicalNetworkName, Network network) {
+        Boolean isExternal = NeutronvpnUtils.getIsExternal(network);
+        List<ElanSegments> segments = buildSegments(network);
         ElanInstanceBuilder elanInstanceBuilder = new ElanInstanceBuilder().setElanInstanceName(elanInstanceName);
         if (segmentType != null) {
             elanInstanceBuilder.setSegmentType(segmentType);
@@ -234,7 +235,7 @@ public class NeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBas
         }
         elanInstanceBuilder.setExternal(isExternal);
         elanInstanceBuilder.setKey(new ElanInstanceKey(elanInstanceName));
-        return elanInstanceBuilder.build();
+        return elanInstanceBuilder;
     }
 
     private void deleteElanInstance(String elanInstanceName) {
@@ -244,10 +245,10 @@ public class NeutronNetworkChangeListener extends AsyncDataTreeChangeListenerBas
     }
 
     private ElanInstance updateElanInstance(String elanInstanceName, Class<? extends SegmentTypeBase> segmentType,
-            String segmentationId, String physicalNetworkName, List<ElanSegments> segments, Boolean isExternal) {
+                                            String segmentationId, String physicalNetworkName, Network network) {
 
-        ElanInstance elanInstance = createElanInstance(elanInstanceName, segmentType, segmentationId,
-                physicalNetworkName, segments, isExternal);
+        ElanInstance elanInstance = createElanInstanceBuilder(elanInstanceName, segmentType, segmentationId,
+                physicalNetworkName, network).build();
         InstanceIdentifier<ElanInstance> id = createElanInstanceIdentifier(elanInstanceName);
         MDSALUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, id, elanInstance);
         return elanInstance;