/*
- * 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
+}