package org.opendaylight.netvirt.natservice.internal;
import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
private final FibRpcService fibRpcService;
private final IElanService elanManager;
private final IInterfaceManager interfaceManager;
+ private final NatOverVxlanUtil natOverVxlanUtil;
private final NatMode natMode;
protected enum TunnelAction {
* @param config - Nat Service Config
* @param elanManager - Elan Manager
* @param interfaceManager - Interface Manager
+ * @param natOverVxlanUtils - Nat Over Vxlan Utility
*/
@Inject
public NatTunnelInterfaceStateListener(final DataBroker dataBroker,
final FibRpcService fibRpcService,
final NatserviceConfig config,
final IElanService elanManager,
- final IInterfaceManager interfaceManager) {
+ final IInterfaceManager interfaceManager,
+ final NatOverVxlanUtil natOverVxlanUtils) {
super(StateTunnelList.class, NatTunnelInterfaceStateListener.class);
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.fibRpcService = fibRpcService;
this.elanManager = elanManager;
this.interfaceManager = interfaceManager;
+ this.natOverVxlanUtil = natOverVxlanUtils;
if (config != null) {
this.natMode = config.getNatMode();
} else {
} catch (Exception e) {
/* this dpn does not have the VTEP */
LOG.error("handleTepDelForAllRtrs : DPN {} does not have the VTEP", srcDpnId);
- endpointIpForDPN = null;
}
if (endpointIpForDPN != null) {
return;
}
if (natMode == NatMode.Conntrack) {
- natServiceManager.notify(writeFlowInvTx, routerData.get(), naptId, srcDpnId,
- SnatServiceManager.Action.SNAT_ROUTER_ENBL);
+ Routers extRouter = routerData.get();
+ natServiceManager.notify(writeFlowInvTx, extRouter, null, naptId, srcDpnId,
+ SnatServiceManager.Action.CNT_ROUTER_ALL_SWITCH_ENBL);
+ if (extRouter.isEnableSnat()) {
+ natServiceManager.notify(writeFlowInvTx, extRouter, null, naptId, srcDpnId,
+ SnatServiceManager.Action.SNAT_ROUTER_ENBL);
+ }
} else {
Uuid bgpVpnUuId = NatUtil.getVpnForRouter(dataBroker, routerName);
//Check if the DPN having the router is the NAPT switch
} else {
LOG.debug("hndlTepAddOnNaptSwitch : SNAT -> Private BGP VPN associated to router {}", routerId);
vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
- if (vpnId == null || vpnId == NatConstants.INVALID_ID) {
+ if (vpnId == NatConstants.INVALID_ID) {
LOG.error("hndlTepAddOnNaptSwitch : Invalid vpnId returned for routerName {}", routerName);
return false;
}
LOG.debug("hndlTepAddOnNaptSwitch : L3VNI value is not configured in Internet VPN {} and RD {} "
+ "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ "NAT flows", vpnName, rd);
- l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, routerId).longValue();
+ l3Vni = natOverVxlanUtil.getInternetVpnVni(externalVpnName, routerId).longValue();
}
}
+ "having nextHopIp {}", externalIp, nextHopIp);
long l3vni = 0;
if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
- l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, l3vni).longValue();
+ l3vni = natOverVxlanUtil.getInternetVpnVni(externalVpnName, l3vni).longValue();
}
- Uuid externalSubnetId = NatUtil.getExternalSubnetForRouterExternalIp(externalIp, router);
- NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd, externalSubnetId,
- fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
+ NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd,
+ fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
RouteOrigin.STATIC, srcDpnId);
serviceId = label;
}
LOG.debug("hndlTepAddForDnatInEachRtr : L3VNI value is not configured in Internet VPN {} and RD {} "
+ "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ "NAT flows", vpnName, rd);
- l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+ l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId).longValue();
}
}
- List<Ports> interfaces = routerPorts.getPorts();
- for (Ports port : interfaces) {
+ for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
//Get the DPN on which this interface resides
final String interfaceName = port.getPortName();
final BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
tepAddedDpnId, fipCfgdDpnId, interfaceName);
continue;
}
- List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
- for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+ for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+ Collections.<InternalToExternalPortMap>emptyList())) {
final String internalIp = intExtPortMap.getInternalIp();
final String externalIp = intExtPortMap.getExternalIp();
LOG.debug("hndlTepAddForDnatInEachRtr : DNAT -> Advertising the FIB route to the floating IP {} "
+ "having nextHopIp {}", externalIp, nextHopIp);
long l3vni = 0;
if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
- l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, l3vni).longValue();
+ l3vni = natOverVxlanUtil.getInternetVpnVni(vpnName, l3vni).longValue();
}
- NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd, null,
- fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
+ NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd,
+ fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
fipCfgdDpnId);
serviceId = label;
}
return;
}
if (natMode == NatMode.Conntrack) {
- natServiceManager.notify(confTx, routerData.get(), naptId, dpnId,
- SnatServiceManager.Action.SNAT_ROUTER_DISBL);
+ Routers extRouter = routerData.get();
+ natServiceManager.notify(confTx, extRouter, null, naptId, dpnId,
+ SnatServiceManager.Action.CNT_ROUTER_DISBL);
+ if (extRouter.isEnableSnat()) {
+ natServiceManager.notify(confTx,extRouter, null, naptId, dpnId,
+ SnatServiceManager.Action.SNAT_ROUTER_DISBL);
+ }
} else {
LOG.debug("hndlTepDelForDnatInEachRtr : L3VNI value is not configured in Internet VPN {} and RD {} "
+ "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ "NAT flows", vpnName, rd);
- l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+ l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId).longValue();
}
}
- List<Ports> interfaces = routerPorts.getPorts();
- for (Ports port : interfaces) {
+ for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
//Get the DPN on which this interface resides
String interfaceName = port.getPortName();
BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
tepDeletedDpnId, fipCfgdDpnId, interfaceName);
continue;
}
- List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
- for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+ for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+ Collections.<InternalToExternalPortMap>emptyList())) {
String internalIp = intExtPortMap.getInternalIp();
String externalIp = intExtPortMap.getExternalIp();
externalIp = NatUtil.validateAndAddNetworkMask(externalIp);