2 * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.genius.interfacemanager.listeners;
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.List;
12 import java.util.concurrent.Callable;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
18 import org.opendaylight.genius.interfacemanager.IfmConstants;
19 import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
20 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigAddHelper;
21 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigRemoveHelper;
22 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigUpdateHelper;
23 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
24 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<Interface, VlanMemberConfigListener> {
37 private static final Logger LOG = LoggerFactory.getLogger(VlanMemberConfigListener.class);
38 private final JobCoordinator coordinator;
39 private final OvsVlanMemberConfigAddHelper ovsVlanMemberConfigAddHelper;
40 private final OvsVlanMemberConfigRemoveHelper ovsVlanMemberConfigRemoveHelper;
41 private final OvsVlanMemberConfigUpdateHelper ovsVlanMemberConfigUpdateHelper;
44 public VlanMemberConfigListener(final DataBroker dataBroker, final IdManagerService idManagerService,
45 final IMdsalApiManager mdsalApiManager, final AlivenessMonitorService alivenessMonitorService,
46 final JobCoordinator coordinator, final InterfaceManagerCommonUtils interfaceManagerCommonUtils) {
47 super(Interface.class, VlanMemberConfigListener.class);
48 this.coordinator = coordinator;
49 this.ovsVlanMemberConfigAddHelper = new OvsVlanMemberConfigAddHelper(dataBroker, idManagerService,
50 interfaceManagerCommonUtils);
51 this.ovsVlanMemberConfigRemoveHelper = new OvsVlanMemberConfigRemoveHelper(dataBroker,
52 interfaceManagerCommonUtils);
53 this.ovsVlanMemberConfigUpdateHelper = new OvsVlanMemberConfigUpdateHelper(ovsVlanMemberConfigAddHelper,
54 ovsVlanMemberConfigRemoveHelper);
55 this.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
59 protected InstanceIdentifier<Interface> getWildCardPath() {
60 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
64 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
65 IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
66 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
69 removeVlanMember(key, interfaceOld);
72 private void removeVlanMember(InstanceIdentifier<Interface> key, Interface deleted) {
73 ParentRefs parentRefs = deleted.getAugmentation(ParentRefs.class);
74 if (parentRefs == null) {
75 LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", deleted);
79 String lowerLayerIf = parentRefs.getParentInterface();
80 if (lowerLayerIf.equals(deleted.getName())) {
81 LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", deleted);
85 RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(deleted, parentRefs);
86 coordinator.enqueueJob(lowerLayerIf, removeWorker, IfmConstants.JOB_MAX_RETRIES);
90 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
91 IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
92 if (ifL2vlanNew == null) {
95 IfL2vlan ifL2vlanOld = interfaceOld.getAugmentation(IfL2vlan.class);
96 if (IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanNew.getL2vlanMode()
97 && IfL2vlan.L2vlanMode.Trunk == ifL2vlanOld.getL2vlanMode()) {
98 // Trunk subport add use case
99 addVlanMember(key, interfaceNew);
101 } else if (IfL2vlan.L2vlanMode.Trunk == ifL2vlanNew.getL2vlanMode()
102 && IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanOld.getL2vlanMode()) {
103 // Trunk subport remove use case
104 removeVlanMember(key, interfaceOld);
105 } else if (IfL2vlan.L2vlanMode.TrunkMember != ifL2vlanNew.getL2vlanMode()) {
109 ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
110 if (parentRefsNew == null) {
111 LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " + "parent interface",
116 String lowerLayerIf = parentRefsNew.getParentInterface();
117 if (lowerLayerIf.equals(interfaceNew.getName())) {
119 "Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " + "interface name.",
124 RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(interfaceNew, interfaceOld,
125 parentRefsNew, ifL2vlanNew);
126 coordinator.enqueueJob(lowerLayerIf, updateWorker, IfmConstants.JOB_MAX_RETRIES);
130 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
131 IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
132 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
135 addVlanMember(key, interfaceNew);
138 private void addVlanMember(InstanceIdentifier<Interface> key, Interface added) {
139 ParentRefs parentRefs = added.getAugmentation(ParentRefs.class);
140 if (parentRefs == null) {
144 String lowerLayerIf = parentRefs.getParentInterface();
145 if (lowerLayerIf.equals(added.getName())) {
146 LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", added);
150 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(added, parentRefs);
151 coordinator.enqueueJob(lowerLayerIf, configWorker, IfmConstants.JOB_MAX_RETRIES);
155 protected VlanMemberConfigListener getDataTreeChangeListener() {
156 return VlanMemberConfigListener.this;
159 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
160 Interface interfaceNew;
161 ParentRefs parentRefs;
163 RendererConfigAddWorker(Interface interfaceNew, ParentRefs parentRefs) {
164 this.interfaceNew = interfaceNew;
165 this.parentRefs = parentRefs;
169 public List<ListenableFuture<Void>> call() {
170 return ovsVlanMemberConfigAddHelper.addConfiguration(parentRefs, interfaceNew);
174 private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
175 Interface interfaceNew;
176 Interface interfaceOld;
177 IfL2vlan ifL2vlanNew;
178 ParentRefs parentRefsNew;
180 RendererConfigUpdateWorker(Interface interfaceNew, Interface interfaceOld, ParentRefs parentRefsNew,
181 IfL2vlan ifL2vlanNew) {
182 this.interfaceNew = interfaceNew;
183 this.interfaceOld = interfaceOld;
184 this.ifL2vlanNew = ifL2vlanNew;
185 this.parentRefsNew = parentRefsNew;
189 public List<ListenableFuture<Void>> call() {
190 return ovsVlanMemberConfigUpdateHelper.updateConfiguration(parentRefsNew, interfaceOld, ifL2vlanNew,
195 private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
196 Interface interfaceOld;
197 ParentRefs parentRefs;
199 RendererConfigRemoveWorker(Interface interfaceOld, ParentRefs parentRefs) {
200 this.interfaceOld = interfaceOld;
201 this.parentRefs = parentRefs;
205 public List<ListenableFuture<Void>> call() {
206 return ovsVlanMemberConfigRemoveHelper.removeConfiguration(parentRefs, interfaceOld);