Bug 6717 - Output to external network group entry is not installed on NAPT FIB table... 63/46163/19
authorTali <tali.ben-meir@hpe.com>
Sun, 25 Sep 2016 09:02:14 +0000 (12:02 +0300)
committerSam Hague <shague@redhat.com>
Sat, 22 Oct 2016 15:31:19 +0000 (15:31 +0000)
Change-Id: Ic76eaba6b6840315513830cbf846ebc0cef42a7a
Signed-off-by: Tali <tali.ben-meir@hpe.com>
Signed-off-by: Sam Hague <shague@redhat.com>
Author: Sam Hague <shague@redhat.com>

vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SubnetmapListener.java
vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml

index 3c266fa57c6236cf2e16ead84c2e53a6da666deb..84afe1478e6a0fecdc8cc296dc6d978429c5111c 100644 (file)
@@ -52,7 +52,7 @@ public class ExternalNetworkGroupInstaller {
         this.interfaceManager = interfaceManager;
     }
 
-    public void installExtNetGroupEntires(Subnetmap subnetMap) {
+    public void installExtNetGroupEntries(Subnetmap subnetMap) {
         if (subnetMap == null) {
             LOG.trace("Subnetmap is null");
             return;
@@ -74,10 +74,6 @@ public class ExternalNetworkGroupInstaller {
         installExtNetGroupEntries(subnetMap, macAddress);
     }
 
-    public void removeExtNetGroupEntires(Subnetmap subnetMap) {
-        removeExtNetGroupEntries(subnetMap);
-    }
-
     public void installExtNetGroupEntries(Uuid subnetId, String macAddress) {
         Subnetmap subnetMap = NatUtil.getSubnetMap(broker, subnetId);
         if (NatUtil.isIPv6Subnet(subnetMap.getSubnetIp())) {
@@ -87,6 +83,23 @@ public class ExternalNetworkGroupInstaller {
         installExtNetGroupEntries(subnetMap, macAddress);
     }
 
+    public void installExtNetGroupEntries(Uuid networkId, BigInteger dpnId) {
+        if (networkId == null) {
+            return;
+        }
+
+        List<Uuid> subnetIds = NatUtil.getSubnetIdsFromNetworkId(broker, networkId);
+        if (subnetIds == null || subnetIds.isEmpty()) {
+            LOG.trace("No subnet ids associated network id {}", networkId.getValue());
+            return;
+        }
+
+        for (Uuid subnetId : subnetIds) {
+            String macAddress = NatUtil.getSubnetGwMac(broker, subnetId, networkId.getValue());
+            installExtNetGroupEntry(networkId, subnetId, dpnId, macAddress);
+        }
+    }
+
     private void installExtNetGroupEntries(Subnetmap subnetMap, String macAddress) {
         if (subnetMap == null) {
             LOG.trace("Subnetmap is null");
@@ -111,14 +124,32 @@ public class ExternalNetworkGroupInstaller {
         LOG.info("Installing ext-net group {} entry for subnet {} with macAddress {} (extInterfaces: {})",
                  groupId, subnetName, macAddress, Arrays.toString(extInterfaces.toArray()));
         for (String extInterface : extInterfaces) {
-            GroupEntity groupEntity = buildExtNetGroupEntity(macAddress, subnetName, groupId, extInterface);
-            if (groupEntity != null) {
-                mdsalManager.syncInstallGroup(groupEntity, FIXED_DELAY_IN_MILLISECONDS);
-            }
+            installExtNetGroupEntry(groupId, subnetName, extInterface, macAddress);
+        }
+    }
+
+    private void installExtNetGroupEntry(Uuid networkId, Uuid subnetId, BigInteger dpnId, String macAddress) {
+        String subnetName = subnetId.getValue();
+        String extInterface = elanService.getExternalElanInterface(networkId.getValue(), dpnId);
+        if (extInterface == null) {
+            LOG.trace("No external ELAN interface attached to subnet {} DPN id {}", subnetName, dpnId);
+            return;
+        }
+
+        long groupId = NatUtil.createGroupId(NatUtil.getGroupIdKey(subnetName), idManager);
+        LOG.info("Installing ext-net group {} entry for subnet {} with macAddress {} (extInterface: {})", groupId,
+                subnetName, macAddress, extInterface);
+        installExtNetGroupEntry(groupId, subnetName, extInterface, macAddress);
+    }
+
+    private void installExtNetGroupEntry(long groupId, String subnetName, String extInterface, String macAddress) {
+        GroupEntity groupEntity = buildExtNetGroupEntity(macAddress, subnetName, groupId, extInterface);
+        if (groupEntity != null) {
+            mdsalManager.syncInstallGroup(groupEntity, FIXED_DELAY_IN_MILLISECONDS);
         }
     }
 
-    private void removeExtNetGroupEntries(Subnetmap subnetMap) {
+    public void removeExtNetGroupEntries(Subnetmap subnetMap) {
         if (subnetMap == null) {
             return;
         }
index 58a5293ffb2e047d5164bd72a9903889c9bcf519..9fcd0611ab0f13050732319325f4c0a9f1564b80 100644 (file)
@@ -79,9 +79,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev16011
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.snatint.ip.port.map.intip.port.map.ip.port.IntIpProtoTypeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.NeutronRouterDpns;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnIdToVpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NetworkMaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronVpnPortipPortData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.Subnetmaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.VpnMaps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMapKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnList;
@@ -1181,6 +1184,13 @@ public class NatUtil {
         return subnetOpt.isPresent() ? subnetOpt.get() : null;
     }
 
+    public static List<Uuid> getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) {
+        InstanceIdentifier<NetworkMap> id = InstanceIdentifier.builder(NetworkMaps.class)
+                .child(NetworkMap.class, new NetworkMapKey(networkId)).build();
+        Optional<NetworkMap> optionalNetworkMap = read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        return optionalNetworkMap.isPresent() ? optionalNetworkMap.get().getSubnetIdList() : null;
+    }
+
     public static String getSubnetGwMac(DataBroker broker, Uuid subnetId, String vpnName) {
         if (subnetId == null) {
             return null;
index 6b0481e782f0192146fd343c7be8622bdf6025e9..43788076d029bcb835fc8fad0397b585382385b3 100644 (file)
@@ -41,17 +41,20 @@ public class RouterDpnChangeListener extends AbstractDataChangeListener<DpnVpnin
     private final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer;
     private final NaptSwitchHA naptSwitchHA;
     private final IdManagerService idManager;
+    private final ExternalNetworkGroupInstaller extNetGroupInstaller;
 
     public RouterDpnChangeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
                                    final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer,
                                    final NaptSwitchHA naptSwitchHA,
-                                   final IdManagerService idManager) {
+                                   final IdManagerService idManager,
+                                   final ExternalNetworkGroupInstaller extNetGroupInstaller) {
         super(DpnVpninterfacesList.class);
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalManager;
         this.snatDefaultRouteProgrammer = snatDefaultRouteProgrammer;
         this.naptSwitchHA = naptSwitchHA;
         this.idManager = idManager;
+        this.extNetGroupInstaller = extNetGroupInstaller;
     }
 
     public void init() {
@@ -115,6 +118,7 @@ public class RouterDpnChangeListener extends AbstractDataChangeListener<DpnVpnin
                     LOG.debug("Installing default route in FIB on dpn {} for routerId {} with vpnId {}...", dpnId,routerId,vpnId);
                     snatDefaultRouteProgrammer.installDefNATRouteInDPN(dpnId, vpnId, routId);
                 }
+                extNetGroupInstaller.installExtNetGroupEntries(networkId, dpnId);
 
                 if (routerData.get().isEnableSnat()) {
                     LOG.info("SNAT enabled for router {}", routerId);
index a1364f0ef2ed472d071777b2093ac10a29384f19..47ddffb412b0801ea3181e738286ed0e69c8923b 100644 (file)
@@ -41,21 +41,21 @@ public class SubnetmapListener extends AsyncDataTreeChangeListenerBase<Subnetmap
     protected void remove(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.trace("SubnetmapListener remove subnetmap method - key: " + identifier + ", value" + subnetmap);
         NatServiceCounters.subnetmap_remove.inc();
-        externalNetworkGroupInstaller.removeExtNetGroupEntires(subnetmap);
+        externalNetworkGroupInstaller.removeExtNetGroupEntries(subnetmap);
     }
 
     @Override
     protected void update(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmapBefore, Subnetmap subnetmapAfter) {
         LOG.trace("SubnetmapListener update subnetmap method - key: " + identifier + ", original=" + subnetmapBefore + ", update=" + subnetmapAfter);
         NatServiceCounters.subnetmap_update.inc();
-        externalNetworkGroupInstaller.installExtNetGroupEntires(subnetmapAfter);
+        externalNetworkGroupInstaller.installExtNetGroupEntries(subnetmapAfter);
     }
 
     @Override
     protected void add(InstanceIdentifier<Subnetmap> identifier, Subnetmap subnetmap) {
         LOG.trace("SubnetmapListener add subnetmap method - key: " + identifier + ", value=" + subnetmap);
         NatServiceCounters.subnetmap_add.inc();
-        externalNetworkGroupInstaller.installExtNetGroupEntires(subnetmap);
+        externalNetworkGroupInstaller.installExtNetGroupEntries(subnetmap);
     }
 
     @Override
index ed383da066baf77c209636989bbe9b982f71ec4a..d341b25630ceecb65319d95f57d7779f18ec93ae 100644 (file)
     <argument ref="sNATDefaultRouteProgrammer" />
     <argument ref="naptSwitchHA" />
     <argument ref="idManagerService" />
+    <argument ref="externalNetworkGroupInstaller" />
   </bean>
 
   <bean id="routerToVpnListener"