From: Tali Date: Sun, 25 Sep 2016 09:02:14 +0000 (+0300) Subject: Bug 6717 - Output to external network group entry is not installed on NAPT FIB table... X-Git-Tag: release/carbon~703 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=b37bdc7b0fd8090792e1aaa9c145cd8d9108e6d2;hp=b23bfc10d1361735b9836f3ca26223ca8c4bcdea;p=netvirt.git Bug 6717 - Output to external network group entry is not installed on NAPT FIB table for new DPN Change-Id: Ic76eaba6b6840315513830cbf846ebc0cef42a7a Signed-off-by: Tali Signed-off-by: Sam Hague Author: Sam Hague --- diff --git a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java index 3c266fa57c..84afe1478e 100644 --- a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java +++ b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java @@ -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 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; } diff --git a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java index 58a5293ffb..9fcd0611ab 100644 --- a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java +++ b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java @@ -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 getSubnetIdsFromNetworkId(DataBroker broker, Uuid networkId) { + InstanceIdentifier id = InstanceIdentifier.builder(NetworkMaps.class) + .child(NetworkMap.class, new NetworkMapKey(networkId)).build(); + Optional 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; diff --git a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java index 6b0481e782..43788076d0 100644 --- a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java +++ b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterDpnChangeListener.java @@ -41,17 +41,20 @@ public class RouterDpnChangeListener extends AbstractDataChangeListener 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 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 identifier, Subnetmap subnetmap) { LOG.trace("SubnetmapListener add subnetmap method - key: " + identifier + ", value=" + subnetmap); NatServiceCounters.subnetmap_add.inc(); - externalNetworkGroupInstaller.installExtNetGroupEntires(subnetmap); + externalNetworkGroupInstaller.installExtNetGroupEntries(subnetmap); } @Override diff --git a/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml b/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml index ed383da066..d341b25630 100644 --- a/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml +++ b/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml @@ -204,6 +204,7 @@ +