Bug 8962: Fix non-parameterized LOG statements as per guidelines
[netvirt.git] / vpnservice / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / netvirt / vpnmanager / InterfaceStateChangeListener.java
index 3570ca0715c341aa21da4bab4ed3bff3a7cbf13c..979a9887df6774959adfcf70cc3a946ff4d58e10 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -12,6 +12,8 @@ import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -19,9 +21,10 @@ import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,56 +62,71 @@ public class InterfaceStateChangeListener
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
     protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
-        LOG.trace("Received interface {} add event", intrf);
-        LOG.info("Received interface {} add event", intrf.getName());
         try {
-            final String interfaceName = intrf.getName();
-            LOG.info("Received interface add event for interface {} ", interfaceName);
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface
-                    configInterface = InterfaceUtils.getInterface(dataBroker, interfaceName);
-            if (configInterface != null) {
-                if (!configInterface.getType().equals(Tunnel.class)) {
-                    // We service only VM interfaces and Router interfaces here.
-                    // We donot service Tunnel Interfaces here.
-                    // Tunnel events are directly serviced
-                    // by TunnelInterfacesStateListener present as part of VpnInterfaceManager
-                    LOG.debug("Config Interface Name {}", configInterface.getName());
-                    final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
-                    if (vpnInterface != null) {
-                        LOG.debug("VPN Interface Name {}", vpnInterface);
-                        BigInteger intfDpnId = BigInteger.ZERO;
-                        try {
-                            intfDpnId = InterfaceUtils.getDpIdFromInterface(intrf);
-                        } catch (Exception e) {
-                            LOG.error(
-                                "Unable to retrieve dpnId for interface {}. Process vpn interface add failed",
-                                intrf.getName(), e);
-                            return;
-                        }
-                        final BigInteger dpnId = intfDpnId;
-                        final int ifIndex = intrf.getIfIndex();
-                        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
-                        dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + intrf.getName(),
-                            () -> {
-                                WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
-                                WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
-                                WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
-                                vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, ifIndex, false,
-                                        writeConfigTxn, writeOperTxn, writeInvTxn);
-                                List<ListenableFuture<Void>> futures = new ArrayList<>();
-                                futures.add(writeOperTxn.submit());
+            if (L2vlan.class.equals(intrf.getType())) {
+                LOG.info("VPN Interface add event - intfName {} from InterfaceStateChangeListener",
+                                intrf.getName());
+                DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+                dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + intrf.getName(),
+                    () -> {
+                        WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                        WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
+                        List<ListenableFuture<Void>> futures = new ArrayList<>();
+
+                        final String interfaceName = intrf.getName();
+                        LOG.info("Detected interface add event for interface {}", interfaceName);
+
+                        final VpnInterface vpnInterface =
+                                VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
+                        if (vpnInterface != null) {
+                            String primaryRd = VpnUtil.getPrimaryRd(dataBroker,
+                                    vpnInterface.getVpnInstanceName());
+                            if (!VpnUtil.isVpnPendingDelete(dataBroker, primaryRd)) {
+                                LOG.debug("VPN Interface Name {}", vpnInterface);
+                                BigInteger intfDpnId = BigInteger.ZERO;
+                                try {
+                                    intfDpnId = InterfaceUtils.getDpIdFromInterface(intrf);
+                                } catch (Exception e) {
+                                    LOG.error("Unable to retrieve dpnId for interface {}. "
+                                            + "Process vpn interface add failed",intrf.getName(), e);
+                                    return futures;
+                                }
+                                final BigInteger dpnId = intfDpnId;
+                                final int ifIndex = intrf.getIfIndex();
+                                if (!vpnInterfaceManager.isVpnInstanceReady(vpnInterface.getVpnInstanceName())) {
+                                    LOG.info("VPN Interface add event - intfName {} onto vpnName {} "
+                                                    + "running oper-driven, VpnInstance not ready, holding on",
+                                            vpnInterface.getName(), vpnInterface.getVpnInstanceName());
+                                    return futures;
+
+                                }
+                                LOG.info("VPN Interface add event - intfName {} onto vpnName {} running oper-driven",
+                                        vpnInterface.getName(), vpnInterface.getVpnInstanceName());
+                                vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, primaryRd, ifIndex,
+                                        false, writeConfigTxn, writeOperTxn, writeInvTxn, intrf);
+                                ListenableFuture<Void> operFuture = writeOperTxn.submit();
+                                try {
+                                    operFuture.get();
+                                } catch (ExecutionException e) {
+                                    LOG.error("InterfaceStateChange - Exception encountered while submitting"
+                                                    + " operational future for addVpnInterface {}",
+                                            vpnInterface.getName(), e);
+                                    return null;
+                                }
                                 futures.add(writeConfigTxn.submit());
                                 futures.add(writeInvTxn.submit());
-                                return futures;
-                            });
-                    }
-                }
-            } else {
-                LOG.error("Unable to process add for interface {},"
-                    + "since Interface ConfigDS entry absent for the same", interfaceName);
+                            } else {
+                                LOG.error("add: Ignoring addition of vpnInterface {}, as vpnInstance {}"
+                                        + " with primaryRd {} is already marked for deletion", interfaceName,
+                                        vpnInterface.getVpnInstanceName(), primaryRd);
+                            }
+                        }
+                        return futures;
+                    });
             }
         } catch (Exception e) {
-            LOG.error("Exception caught in Interface Operational State Up event", e);
+            LOG.error("Exception caught in Interface {} Operational State Up event", intrf.getName(), e);
         }
     }
 
@@ -117,40 +135,54 @@ public class InterfaceStateChangeListener
     @SuppressWarnings("checkstyle:IllegalCatch")
     protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         final String interfaceName = intrf.getName();
-        LOG.trace("Received interface {} down event", intrf);
-        LOG.info("Received interface {} remove event", interfaceName);
+        BigInteger dpId = BigInteger.ZERO;
         try {
-            LOG.info("Received port DOWN event for interface {} ", interfaceName);
-            if (intrf != null && intrf.getType() != null && !intrf.getType().equals(Tunnel.class)) {
-                BigInteger dpId;
-                InstanceIdentifier<VpnInterface> id = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
-                Optional<VpnInterface> optVpnInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
-                if (!optVpnInterface.isPresent()) {
-                    LOG.debug("Interface {} is not a vpninterface, ignoring.", interfaceName);
-                    return;
-                }
-                final VpnInterface vpnInterface = optVpnInterface.get();
+            if (L2vlan.class.equals(intrf.getType())) {
+                LOG.info("VPN Interface remove event - intfName {} from InterfaceStateChangeListener",
+                                intrf.getName());
                 try {
                     dpId = InterfaceUtils.getDpIdFromInterface(intrf);
                 } catch (Exception e) {
-                    LOG.error("Unable to retrieve dpnId from interface operational data store for interface {}. "
-                        + "Fetching from vpn interface op data store. ", interfaceName, e);
-                    dpId = vpnInterface.getDpnId();
+                    LOG.error("Unable to retrieve dpnId from interface operational data store for interface"
+                            + " {}. Fetching from vpn interface op data store. ", interfaceName, e);
                 }
-                final BigInteger dpnId = dpId;
-                final int ifIndex = intrf.getIfIndex();
+                final BigInteger inputDpId = dpId;
                 DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
                 dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
                     () -> {
                         WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
                         WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
                         WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
-                        vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, false, false,
-                                writeConfigTxn, writeOperTxn, writeInvTxn);
                         List<ListenableFuture<Void>> futures = new ArrayList<>();
-                        futures.add(writeOperTxn.submit());
-                        futures.add(writeConfigTxn.submit());
-                        futures.add(writeInvTxn.submit());
+
+                        InstanceIdentifier<VpnInterface> id = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
+                        Optional<VpnInterface> optVpnInterface =
+                                VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+                        if (optVpnInterface.isPresent()) {
+                            final VpnInterface vpnInterface = optVpnInterface.get();
+                            BigInteger dpnId = inputDpId;
+                            if (dpnId == null || dpnId.equals(BigInteger.ZERO)) {
+                                dpnId = vpnInterface.getDpnId();
+                            }
+                            final int ifIndex = intrf.getIfIndex();
+                            LOG.info("VPN Interface remove event - intfName {} onto vpnName {} running oper-driven",
+                                    vpnInterface.getName(), vpnInterface.getVpnInstanceName());
+                            vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, intrf,
+                                    vpnInterface, false, writeConfigTxn, writeOperTxn, writeInvTxn);
+                            ListenableFuture<Void> operFuture = writeOperTxn.submit();
+                            try {
+                                operFuture.get();
+                            } catch (ExecutionException e) {
+                                LOG.error("InterfaceStateChange - Exception encountered while submitting operational"
+                                        + " future for removeVpnInterface {}", vpnInterface.getName(), e);
+                                return null;
+                            }
+                            futures.add(writeConfigTxn.submit());
+                            futures.add(writeInvTxn.submit());
+                        } else {
+                            LOG.debug("Interface {} is not a vpninterface, ignoring.", interfaceName);
+                        }
+
                         return futures;
                     });
             }
@@ -163,58 +195,89 @@ public class InterfaceStateChangeListener
     @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
     protected void update(InstanceIdentifier<Interface> identifier,
-        Interface original, Interface update) {
-        LOG.trace("Operation Interface update event - Old: {}, New: {}", original, update);
+                    Interface original, Interface update) {
+        final String interfaceName = update.getName();
         try {
-            final String interfaceName = update.getName();
-            if (original.getOperStatus().equals(Interface.OperStatus.Unknown)
-                || update.getOperStatus().equals(Interface.OperStatus.Unknown)) {
-                LOG.debug("Interface {} state change is from/to UNKNOWN. Ignoring the update event.", interfaceName);
+            OperStatus originalOperStatus = original.getOperStatus();
+            OperStatus updateOperStatus = update.getOperStatus();
+            if (originalOperStatus.equals(Interface.OperStatus.Unknown)
+                  || updateOperStatus.equals(Interface.OperStatus.Unknown)) {
+                LOG.debug("Interface {} state change is from/to null/UNKNOWN. Ignoring the update event.",
+                        interfaceName);
                 return;
             }
-            final BigInteger dpnId = InterfaceUtils.getDpIdFromInterface(update);
 
             if (update.getIfIndex() == null) {
                 return;
             }
-            if (update != null && (update.getType() != null)) {
-                if (!update.getType().equals(Tunnel.class)) {
-                    final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
-                    if (vpnInterface != null) {
-                        final int ifIndex = update.getIfIndex();
-                        if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
-                            DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
-                            dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
-                                () -> {
-                                    WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
-                                    WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
-                                    WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
-                                    vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, ifIndex,
-                                        true, writeConfigTxn, writeOperTxn, writeInvTxn);
-                                    List<ListenableFuture<Void>> futures = new ArrayList<>();
-                                    futures.add(writeOperTxn.submit());
-                                    futures.add(writeConfigTxn.submit());
-                                    futures.add(writeInvTxn.submit());
-                                    return futures;
-                                });
-                        } else if (update.getOperStatus().equals(Interface.OperStatus.Down)) {
-                            DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
-                            dataStoreCoordinator.enqueueJob(interfaceName,
-                                () -> {
-                                    WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
-                                    WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
-                                    WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
-                                    vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, true,
-                                            false, writeConfigTxn, writeOperTxn, writeInvTxn);
-                                    List<ListenableFuture<Void>> futures = new ArrayList<>();
-                                    futures.add(writeOperTxn.submit());
-                                    futures.add(writeConfigTxn.submit());
-                                    futures.add(writeInvTxn.submit());
+            if (L2vlan.class.equals(update.getType())) {
+                LOG.info("VPN Interface update event - intfName {} from InterfaceStateChangeListener",
+                        update.getName());
+                DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+                dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
+                    () -> {
+                        WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                        WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
+                        List<ListenableFuture<Void>> futures = new ArrayList<>();
+                        final VpnInterface vpnInterface =
+                                VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
+                        if (vpnInterface != null) {
+                            final int ifIndex = update.getIfIndex();
+                            final BigInteger dpnId = InterfaceUtils.getDpIdFromInterface(update);
+                            if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
+                                String primaryRd = VpnUtil.getPrimaryRd(dataBroker,
+                                        vpnInterface.getVpnInstanceName());
+                                if (!VpnUtil.isVpnPendingDelete(dataBroker, primaryRd)) {
+                                    LOG.info("VPN Interface update event - intfName {} onto vpnName {} running "
+                                                    + " oper-driven UP", vpnInterface.getName(),
+                                            vpnInterface.getVpnInstanceName());
+                                    if (!vpnInterfaceManager.isVpnInstanceReady(vpnInterface.getVpnInstanceName())) {
+                                        LOG.info("VPN Interface update event - intfName {} onto vpnName {} "
+                                                        + "running oper-driven UP, VpnInstance not ready, holding on",
+                                                vpnInterface.getName(), vpnInterface.getVpnInstanceName());
+                                        return futures;
+                                    }
+                                    vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, primaryRd, ifIndex,
+                                            true, writeConfigTxn, writeOperTxn, writeInvTxn, update);
+                                } else {
+                                    LOG.error("update: Ignoring UP event for vpnInterface {}, as vpnInstance {}"
+                                            + " with primaryRd {} is already marked for deletion", interfaceName,
+                                            vpnInterface.getVpnInstanceName(), primaryRd);
+                                }
+                            } else if (update.getOperStatus().equals(Interface.OperStatus.Down)) {
+                                LOG.info("VPN Interface update event - intfName {} onto vpnName {} running oper-driven"
+                                        + " DOWN", vpnInterface.getName(), vpnInterface.getVpnInstanceName());
+                                InstanceIdentifier<VpnInterface> id = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
+                                Optional<VpnInterface> optVpnInterface =
+                                        VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+                                if (optVpnInterface.isPresent()) {
+                                    VpnInterface vpnOpInterface = optVpnInterface.get();
+                                    vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, update,
+                                            vpnOpInterface, true, writeConfigTxn, writeOperTxn,
+                                            writeInvTxn);
+                                } else {
+                                    LOG.error("InterfaceStateChangeListener Update DOWN - vpnInterface {}"
+                                            + " not available, ignoring event", vpnInterface.getName());
                                     return futures;
-                                });
+                                }
+                            }
+                            ListenableFuture<Void> operFuture = writeOperTxn.submit();
+                            try {
+                                operFuture.get();
+                            } catch (ExecutionException e) {
+                                LOG.error("InterfaceStateChange - Exception encountered while submitting operational"
+                                        + " future for updateVpnInterface {}", vpnInterface.getName(), e);
+                                return null;
+                            }
+                            futures.add(writeConfigTxn.submit());
+                            futures.add(writeInvTxn.submit());
+                        } else {
+                            LOG.debug("Interface {} is not a vpninterface, ignoring.", interfaceName);
                         }
-                    }
-                }
+
+                        return futures;
+                    });
             }
         } catch (Exception e) {
             LOG.error("Exception observed in handling updation of VPN Interface {}. ", update.getName(), e);