Migrate VlanMemberConfigListener to use new listeners fw
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / listeners / VlanMemberConfigListener.java
index d585a23a12fdbfe7b6f4240ad276c32332f804b0..32d6bf5867b11e14139f5d2e0f0bc52bc1ae1129 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2016, 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,
  */
 package org.opendaylight.genius.interfacemanager.listeners;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
-import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.listeners.AbstractSyncDataTreeChangeListener;
+import org.opendaylight.genius.interfacemanager.IfmConstants;
 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigAddHelper;
 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigRemoveHelper;
 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigUpdateHelper;
-import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.concurrent.Callable;
+@Singleton
+public class VlanMemberConfigListener extends AbstractSyncDataTreeChangeListener<Interface> {
 
-public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<Interface, VlanMemberConfigListener> {
     private static final Logger LOG = LoggerFactory.getLogger(VlanMemberConfigListener.class);
-    private DataBroker dataBroker;
-    private IdManagerService idManager;
-    private AlivenessMonitorService alivenessMonitorService;
-    private IMdsalApiManager mdsalApiManager;
 
-    public VlanMemberConfigListener(final DataBroker dataBroker, final IdManagerService idManager,
-                                    final AlivenessMonitorService alivenessMonitorService,
-                                    final IMdsalApiManager mdsalApiManager) {
-        super(Interface.class, VlanMemberConfigListener.class);
-        this.dataBroker = dataBroker;
-        this.idManager = idManager;
-        this.alivenessMonitorService = alivenessMonitorService;
-        this.mdsalApiManager = mdsalApiManager;
+    private final JobCoordinator coordinator;
+    private final OvsVlanMemberConfigAddHelper ovsVlanMemberConfigAddHelper;
+    private final OvsVlanMemberConfigRemoveHelper ovsVlanMemberConfigRemoveHelper;
+    private final OvsVlanMemberConfigUpdateHelper ovsVlanMemberConfigUpdateHelper;
+
+    @Inject
+    public VlanMemberConfigListener(final DataBroker dataBroker,
+            final JobCoordinator coordinator,
+            final OvsVlanMemberConfigAddHelper ovsVlanMemberConfigAddHelper,
+            final OvsVlanMemberConfigRemoveHelper ovsVlanMemberConfigRemoveHelper,
+            final OvsVlanMemberConfigUpdateHelper ovsVlanMemberConfigUpdateHelper) {
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+              InstanceIdentifier.create(Interfaces.class).child(Interface.class));
+        this.coordinator = coordinator;
+        this.ovsVlanMemberConfigAddHelper = ovsVlanMemberConfigAddHelper;
+        this.ovsVlanMemberConfigRemoveHelper = ovsVlanMemberConfigRemoveHelper;
+        this.ovsVlanMemberConfigUpdateHelper = ovsVlanMemberConfigUpdateHelper;
     }
 
     @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
-        IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
+    public void remove(@Nonnull Interface removedInterface) {
+        IfL2vlan ifL2vlan = removedInterface.getAugmentation(IfL2vlan.class);
         if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
             return;
         }
+        removeVlanMember(removedInterface);
+    }
 
-        ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
+    private void removeVlanMember(Interface removedInterface) {
+        ParentRefs parentRefs = removedInterface.getAugmentation(ParentRefs.class);
         if (parentRefs == null) {
-            LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", interfaceOld);
+            LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", removedInterface);
             return;
         }
 
         String lowerLayerIf = parentRefs.getParentInterface();
-        if (lowerLayerIf.equals(interfaceOld.getName())) {
-            LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", interfaceOld);
+        if (lowerLayerIf.equals(removedInterface.getName())) {
+            LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", removedInterface);
             return;
         }
-
-        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-        RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs, ifL2vlan);
-        coordinator.enqueueJob(lowerLayerIf, removeWorker);
+        coordinator.enqueueJob(lowerLayerIf,
+            () -> ovsVlanMemberConfigRemoveHelper.removeConfiguration(parentRefs, removedInterface),
+                               IfmConstants.JOB_MAX_RETRIES);
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
-        IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
-        if (ifL2vlanNew == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlanNew.getL2vlanMode()) {
+    public void update(@Nonnull Interface originalInterface, @Nonnull Interface updatedInterface) {
+        IfL2vlan ifL2vlanNew = updatedInterface.getAugmentation(IfL2vlan.class);
+        if (ifL2vlanNew == null) {
+            return;
+        }
+        IfL2vlan ifL2vlanOld = originalInterface.getAugmentation(IfL2vlan.class);
+        if (IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanNew.getL2vlanMode()
+                && IfL2vlan.L2vlanMode.Trunk == ifL2vlanOld.getL2vlanMode()) {
+            // Trunk subport add use case
+            addVlanMember(updatedInterface);
+            return;
+        } else if (IfL2vlan.L2vlanMode.Trunk == ifL2vlanNew.getL2vlanMode()
+                && IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanOld.getL2vlanMode()) {
+            // Trunk subport remove use case
+            removeVlanMember(originalInterface);
+        } else if (IfL2vlan.L2vlanMode.TrunkMember != ifL2vlanNew.getL2vlanMode()) {
             return;
         }
 
-        ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
+        ParentRefs parentRefsNew = updatedInterface.getAugmentation(ParentRefs.class);
         if (parentRefsNew == null) {
-            LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " +
-                    "parent interface", interfaceNew);
+            LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " + "parent interface",
+                      updatedInterface);
             return;
         }
 
         String lowerLayerIf = parentRefsNew.getParentInterface();
-        if (lowerLayerIf.equals(interfaceNew.getName())) {
-            LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " +
-                    "interface name.", interfaceNew);
+        if (lowerLayerIf.equals(updatedInterface.getName())) {
+            LOG.error(
+                    "Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " + "interface name.",
+                    updatedInterface);
             return;
         }
-
-        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-        RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
-                parentRefsNew, ifL2vlanNew);
-        coordinator.enqueueJob(lowerLayerIf, updateWorker);
+        coordinator.enqueueJob(lowerLayerIf, () -> ovsVlanMemberConfigUpdateHelper
+                                       .updateConfiguration(parentRefsNew, originalInterface, ifL2vlanNew,
+                                                            updatedInterface),
+                               IfmConstants.JOB_MAX_RETRIES);
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
-        IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
+    public void add(@Nonnull Interface newInterface) {
+        IfL2vlan ifL2vlan = newInterface.getAugmentation(IfL2vlan.class);
         if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
             return;
         }
+        addVlanMember(newInterface);
+    }
 
-        ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
+    private void addVlanMember(Interface added) {
+        ParentRefs parentRefs = added.getAugmentation(ParentRefs.class);
         if (parentRefs == null) {
             return;
         }
 
         String lowerLayerIf = parentRefs.getParentInterface();
-        if (lowerLayerIf.equals(interfaceNew.getName())) {
-            LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", interfaceNew);
+        if (lowerLayerIf.equals(added.getName())) {
+            LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", added);
             return;
         }
-
-        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-        RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifL2vlan);
-        coordinator.enqueueJob(lowerLayerIf, configWorker);
-    }
-
-    @Override
-    protected VlanMemberConfigListener getDataTreeChangeListener() {
-        return VlanMemberConfigListener.this;
-    }
-
-    private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
-        InstanceIdentifier<Interface> key;
-        Interface interfaceNew;
-        IfL2vlan ifL2vlan;
-        ParentRefs parentRefs;
-
-        public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
-                                       ParentRefs parentRefs, IfL2vlan ifL2vlan) {
-            this.key = key;
-            this.interfaceNew = interfaceNew;
-            this.ifL2vlan = ifL2vlan;
-            this.parentRefs = parentRefs;
-        }
-
-        @Override
-        public List<ListenableFuture<Void>> call() throws Exception {
-            // If another renderer(for eg : CSS) needs to be supported, check can be performed here
-            // to call the respective helpers.
-            return OvsVlanMemberConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew,
-                    ifL2vlan, idManager);
-        }
-    }
-
-    private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
-        InstanceIdentifier<Interface> key;
-        Interface interfaceNew;
-        Interface interfaceOld;
-        IfL2vlan ifL2vlanNew;
-        ParentRefs parentRefsNew;
-
-        public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
-                                          Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
-            this.key = key;
-            this.interfaceNew = interfaceNew;
-            this.interfaceOld = interfaceOld;
-            this.ifL2vlanNew = ifL2vlanNew;
-            this.parentRefsNew = parentRefsNew;
-        }
-
-        @Override
-        public List<ListenableFuture<Void>> call() throws Exception {
-            // If another renderer(for eg : CSS) needs to be supported, check can be performed here
-            // to call the respective helpers.
-            return OvsVlanMemberConfigUpdateHelper.updateConfiguration(dataBroker, alivenessMonitorService,
-                    parentRefsNew, interfaceOld, ifL2vlanNew, interfaceNew, idManager, mdsalApiManager);
-        }
-    }
-
-    private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
-        InstanceIdentifier<Interface> key;
-        Interface interfaceOld;
-        IfL2vlan ifL2vlan;
-        ParentRefs parentRefs;
-
-        public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
-                                          ParentRefs parentRefs, IfL2vlan ifL2vlan) {
-            this.key = key;
-            this.interfaceOld = interfaceOld;
-            this.ifL2vlan = ifL2vlan;
-            this.parentRefs = parentRefs;
-        }
-
-        @Override
-        public List<ListenableFuture<Void>> call() throws Exception {
-            // If another renderer(for eg : CSS) needs to be supported, check can be performed here
-            // to call the respective helpers.
-            return OvsVlanMemberConfigRemoveHelper.removeConfiguration(dataBroker, parentRefs, interfaceOld,
-                    ifL2vlan, idManager);
-        }
+        coordinator.enqueueJob(lowerLayerIf, () -> ovsVlanMemberConfigAddHelper.addConfiguration(parentRefs, added),
+                               IfmConstants.JOB_MAX_RETRIES);
     }
-}
\ No newline at end of file
+}