- LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
- //VM Migration: Delete existing interface entry for older DPN
- remove(key, fcNodeConnectorNew, false);
- String portName = fcNodeConnectorNew.getName();
- NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
- DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-
- InterfaceStateAddWorker ifStateAddWorker = new InterfaceStateAddWorker(idManager, nodeConnectorId,
- fcNodeConnectorNew, portName);
- coordinator.enqueueJob(portName, ifStateAddWorker);
- }
-
- /**
- * VM Migration: VM migrated from DPN1 to DPN2.
- * VM booted from new DPN host will preserves its configuration including ID, name and other properties.
- * In certain vm migration scenario like nova evacuate, vm reboot
- * it is expected to receive the events in a non-sequential manner
- * In Nova evacuate scenario, OFPPR_ADD from DPN2 will be received before OFPPR_DELETE from DPN1.
- * To cleanup existing entry in OperDS, remove method will be called from add()
- *
- */
- private void remove(InstanceIdentifier<FlowCapableNodeConnector> key,
- FlowCapableNodeConnector flowCapableNodeConnectorOld, boolean isNwTrigger) {
- LOG.debug("Received user/network NodeConnector Remove Event: {}, {}", key, flowCapableNodeConnectorOld);
- String portName = flowCapableNodeConnectorOld.getName();
- NodeConnectorId nodeConnectorIdNew = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
-
- //VM Migration: Skip OFPPR_DELETE event received after OFPPR_ADD for same interface
- NodeConnectorId nodeConnectorIdOld = IfmUtil.getNodeConnectorIdFromInterface(portName, dataBroker);
- if(nodeConnectorIdOld != null && !nodeConnectorIdNew.equals(nodeConnectorIdOld)) {
- if(isNwTrigger) {
- LOG.info("Received NodeConnector Remove Event for the interface exists in another DPN: {}, {}", nodeConnectorIdNew, nodeConnectorIdOld);
- return;
+ IfmClusterUtils.runOnlyInLeaderNode(() -> {
+ LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
+ String portName = fcNodeConnectorNew.getName();
+ NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
+
+ //VM Migration: Delete existing interface entry for older DPN
+ if (InterfaceManagerCommonUtils.isNovaOrTunnelPort(portName)) {
+ NodeConnectorId nodeConnectorIdOld = IfmUtil.getNodeConnectorIdFromInterface(portName, dataBroker);
+ if (nodeConnectorIdOld != null && !nodeConnectorId.equals(nodeConnectorIdOld)) {
+ if (InterfaceManagerCommonUtils.isTunnelPort(portName)) {
+ BigInteger oldDpnId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorIdOld);
+ BigInteger newDpnId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
+ LOG.warn("DPNID changed for tunnel interface {}: old {} new {}", portName, oldDpnId, newDpnId);
+ if(InterfaceMetaUtils.isPortConfiguredOnBridge(portName, oldDpnId, dataBroker) ||
+ !InterfaceMetaUtils.isPortConfiguredOnBridge(portName, newDpnId, dataBroker)) {
+ // Remove old interface only it wasn't configured through us and new one is.
+ return;
+ }
+ }
+ LOG.debug("Triggering NodeConnector Remove Event for the interface: {}, {}, {}", portName, nodeConnectorId, nodeConnectorIdOld);
+ remove(nodeConnectorId, nodeConnectorIdOld, fcNodeConnectorNew, portName, false);
+ //Adding a delay of 10sec for VM migration, so applications can process remove and add events
+ try {
+ Thread.sleep(IfmConstants.DELAY_TIME_IN_MILLISECOND);
+ } catch (InterruptedException e) {
+ LOG.error("Error while waiting for the vm migration remove events to get processed");
+ }
+ }
+ } else {
+ portName = getDpnPrefixedPortName(nodeConnectorId, portName);