import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.Uint64;
import org.slf4j.Logger;
public class SnatNodeEventListener extends AbstractClusteredAsyncDataTreeChangeListener<Node> {
private static final Logger LOG = LoggerFactory.getLogger(SnatNodeEventListener.class);
private final NatSwitchCache centralizedSwitchCache;
+ private final NatserviceConfig.NatMode natMode;
@Inject
public SnatNodeEventListener(final DataBroker dataBroker,
- final NatSwitchCache centralizedSwitchCache) {
+ final NatSwitchCache centralizedSwitchCache,
+ final NatserviceConfig config) {
super(dataBroker,new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
.create(Nodes.class).child(Node.class)),
Executors.newSingleThreadExecutor());
this.centralizedSwitchCache = centralizedSwitchCache;
+ if (config != null) {
+ this.natMode = config.getNatMode();
+ } else {
+ this.natMode = NatserviceConfig.NatMode.Controller;
+ }
}
@Override
public void remove(Node dataObjectModification) {
- NodeKey nodeKey = dataObjectModification.key();
- Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
- LOG.info("Dpn removed {}", dpnId);
- centralizedSwitchCache.removeSwitch(dpnId);
+ if (natMode == NatserviceConfig.NatMode.Conntrack) {
+ NodeKey nodeKey = dataObjectModification.key();
+ Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
+ LOG.info("Dpn removed {}", dpnId);
+ centralizedSwitchCache.removeSwitch(dpnId);
+ }
}
@Override
@Override
public void add(Node dataObjectModification) {
- NodeKey nodeKey = dataObjectModification.key();
- Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
- LOG.info("Dpn added {}", dpnId);
- centralizedSwitchCache.addSwitch(dpnId);
+ if (natMode == NatserviceConfig.NatMode.Conntrack) {
+ NodeKey nodeKey = dataObjectModification.key();
+ Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
+ LOG.info("Dpn added {}", dpnId);
+ centralizedSwitchCache.addSwitch(dpnId);
+ }
}
}
}
final Uint32 label = tempLabel;
final String externalIp = NatUtil.validateAndAddNetworkMask(extIp);
+ RemoveFibEntryInput input = null;
if (extNwProvType == ProviderTypes.FLAT || extNwProvType == ProviderTypes.VLAN) {
LOG.debug("delFibTsAndReverseTraffic : Using extSubnetId as vpnName for FLAT/VLAN use-cases");
Routers extRouter = NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
}
}
final String externalVpn = vpnName;
- RemoveFibEntryInput input = new RemoveFibEntryInputBuilder().setVpnName(externalVpn)
+ if (label != null && label.toJava() <= 0) {
+ LOG.error("delFibTsAndReverseTraffic : Label not found for externalIp {} with router id {}",
+ extIp, routerId);
+ input = new RemoveFibEntryInputBuilder().setVpnName(vpnName)
+ .setSourceDpid(dpnId).setIpAddress(externalIp)
+ .setIpAddressSource(RemoveFibEntryInput.IpAddressSource.ExternalFixedIP).build();
+ } else {
+ input = new RemoveFibEntryInputBuilder().setVpnName(vpnName)
.setSourceDpid(dpnId).setIpAddress(externalIp).setServiceId(label)
.setIpAddressSource(RemoveFibEntryInput.IpAddressSource.ExternalFixedIP).build();
+ removeTunnelTableEntry(dpnId, label, removeFlowInvTx);
+ removeLFibTableEntry(dpnId, label, removeFlowInvTx);
+ }
ListenableFuture<RpcResult<RemoveFibEntryOutput>> future = fibService.removeFibEntry(input);
removeTunnelTableEntry(dpnId, label, removeFlowInvTx);
ListenableFuture<RpcResult<RemoveVpnLabelOutput>> labelFuture =
Futures.transformAsync(future, result -> {
//Release label
- if (result.isSuccessful()) {
+ if (result.isSuccessful() && label != null && label.toJava() > 0) {
NatUtil.removePreDnatToSnatTableEntry(removeFlowInvTx, mdsalManager, dpnId);
RemoveVpnLabelInput labelInput = new RemoveVpnLabelInputBuilder()
.setVpnName(externalVpn).setIpPrefix(externalIp).build();
LOG.info("clearBgpRoutes : Informing BGP to remove route for externalIP {} of vpn {}", externalIp, vpnName);
String rd = NatUtil.getVpnRd(dataBroker, vpnName);
NatUtil.removePrefixFromBGP(bgpManager, fibManager, rd, externalIp, vpnName);
+ NatUtil.deletePrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, vpnName), externalIp);
}
private void removeTunnelTableEntry(Uint64 dpnId, Uint32 serviceId,
.prefix.to._interface.VpnIdsKey(vpnId)).child(Prefixes.class, new PrefixesKey(ipPrefix))
.build());
} catch (TransactionCommitFailedException e) {
- LOG.error("addPrefixToInterface : Failed to write prefxi-to-interface for vpn-id {}",
+ LOG.error("deletePrefixToInterface : Failed to delete prefxi-to-interface for vpn-id {}",
vpnId, e);
}
}