Bug 8960: port information for 1 dpn is missing in subnet-op-data and
[netvirt.git] / vpnservice / vpnmanager / vpnmanager-impl / src / main / java / org / opendaylight / netvirt / vpnmanager / SubnetRouteInterfaceStateChangeListener.java
index 360c2185c7de6391af89183e195a80006e13fe0e..7f6c346f90285ddae2a7137b4908a649f59e3cd4 100644 (file)
@@ -16,6 +16,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
+import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 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.L2vlan;
@@ -23,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 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.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.port.op.data.PortOpDataEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,16 +38,19 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     private final VpnInterfaceManager vpnInterfaceManager;
     private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
     private final SubnetOpDpnManager subOpDpnManager;
+    private final INeutronVpnManager neutronVpnManager;
 
     public SubnetRouteInterfaceStateChangeListener(final DataBroker dataBroker,
         final VpnInterfaceManager vpnInterfaceManager,
         final VpnSubnetRouteHandler vpnSubnetRouteHandler,
-        final SubnetOpDpnManager subnetOpDpnManager) {
+        final SubnetOpDpnManager subnetOpDpnManager,
+        final INeutronVpnManager neutronVpnService) {
         super(Interface.class, SubnetRouteInterfaceStateChangeListener.class);
         this.dataBroker = dataBroker;
         this.vpnInterfaceManager = vpnInterfaceManager;
         this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
         this.subOpDpnManager = subnetOpDpnManager;
+        this.neutronVpnManager = neutronVpnService;
     }
 
     public void start() {
@@ -67,17 +73,17 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     @Override
     protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("{} add: Received interface {} up event", LOGGING_PREFIX, intrf);
+        final Uuid subnetId;
         try {
             if (L2vlan.class.equals(intrf.getType())) {
                 LOG.trace("SubnetRouteInterfaceListener add: Received interface {} up event", intrf);
                 if (intrf.getOperStatus().equals(Interface.OperStatus.Up)) {
-                    PortOpDataEntry portOpEntry = subOpDpnManager.getPortOpDataEntry(intrf.getName());
-                    if (portOpEntry == null) {
-                        LOG.trace("{} SubnetRouteInterfaceListener add: Received Port UP event for {}"
-                                + " that is not part of subnetRoute, ignoring", LOGGING_PREFIX, intrf.getName());
+                    subnetId = getSubnetId(intrf);
+                    if (subnetId == null) {
+                        LOG.error("SubnetRouteInterfaceListener add: Port {} doesnt exist in configDS",
+                                intrf.getName());
                         return;
                     }
-                    final Uuid subnetId = portOpEntry.getSubnetId();
                     DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
                     dataStoreCoordinator.enqueueJob("SUBNETROUTE-" + subnetId,
                         () -> {
@@ -108,16 +114,16 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     @SuppressWarnings("checkstyle:IllegalCatch")
     @Override
     protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
+        final Uuid subnetId;
         try {
             if (L2vlan.class.equals(intrf.getType())) {
-                LOG.trace("{} remove: Received interface {} down event", LOGGING_PREFIX, intrf);
-                PortOpDataEntry portOpEntry = subOpDpnManager.getPortOpDataEntry(intrf.getName());
-                if (portOpEntry == null) {
-                    LOG.trace("{} SubnetRouteInterfaceListener remove: Received Port DOWN event for {}"
-                            + " that is not part of subnetRoute, ignoring", LOGGING_PREFIX, intrf.getName());
+                LOG.trace("SubnetRouteInterfaceListener remove: Received interface {} down event", intrf);
+                subnetId = getSubnetId(intrf);
+                if (subnetId == null) {
+                    LOG.error("SubnetRouteInterfaceListener add: Port {} doesnt exist in configDS",
+                            intrf.getName());
                     return;
                 }
-                final Uuid subnetId = portOpEntry.getSubnetId();
                 DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
                 dataStoreCoordinator.enqueueJob("SUBNETROUTE-" + subnetId,
                     () -> {
@@ -158,19 +164,18 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
     @Override
     protected void update(InstanceIdentifier<Interface> identifier,
         Interface original, Interface update) {
+        final Uuid subnetId;
         try {
             String interfaceName = update.getName();
             if (L2vlan.class.equals(update.getType())) {
                 LOG.trace("{} update: Operation Interface update event - Old: {}, New: {}", LOGGING_PREFIX,
                     original, update);
-                PortOpDataEntry portOpEntry = subOpDpnManager.getPortOpDataEntry(update.getName());
-                if (portOpEntry == null) {
-                    LOG.trace("{} SubnetRouteInterfaceListener update: Received Port {} event for {}"
-                            + " that is not part of subnetRoute, ignoring", LOGGING_PREFIX, update.getOperStatus(),
+                subnetId = getSubnetId(update);
+                if (subnetId == null) {
+                    LOG.error("SubnetRouteInterfaceListener update: Port {} doesnt exist in configDS",
                             update.getName());
                     return;
                 }
-                final Uuid subnetId = portOpEntry.getSubnetId();
                 DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
                 dataStoreCoordinator.enqueueJob("SUBNETROUTE-" + subnetId,
                     () -> {
@@ -216,4 +221,25 @@ public class SubnetRouteInterfaceStateChangeListener extends AsyncDataTreeChange
                     update.getName(), e);
         }
     }
+
+    protected Uuid getSubnetId(Interface intrf) {
+
+        if (!NeutronUtils.isUuid(intrf.getName())) {
+            LOG.debug("SubnetRouteInterfaceListener: Interface {} doesnt have valid uuid pattern", intrf.getName());
+            return null;
+        }
+
+        PortOpDataEntry portOpEntry = subOpDpnManager.getPortOpDataEntry(intrf.getName());
+        if (portOpEntry != null) {
+            return portOpEntry.getSubnetId();
+        }
+        LOG.trace("SubnetRouteInterfaceListener : Received Port {} event for {} that is not part of subnetRoute",
+                intrf.getOperStatus(), intrf.getName());
+        Port port = neutronVpnManager.getNeutronPort(intrf.getName());
+        if (port != null && port.getFixedIps() != null && port.getFixedIps().size() > 0) {
+            return port.getFixedIps().get(0).getSubnetId();
+        } else {
+            return null;
+        }
+    }
 }