2 * Copyright (c) 2016 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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
15 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
16 import org.opendaylight.genius.interfacemanager.IfmConstants;
17 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigAddHelper;
18 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigRemoveHelper;
19 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigUpdateHelper;
20 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<Interface, VlanMemberConfigListener> {
32 private static final Logger LOG = LoggerFactory.getLogger(VlanMemberConfigListener.class);
33 private final DataBroker dataBroker;
34 private final IdManagerService idManager;
35 private final AlivenessMonitorService alivenessMonitorService;
36 private final IMdsalApiManager mdsalApiManager;
38 public VlanMemberConfigListener(final DataBroker dataBroker, final IdManagerService idManager,
39 final AlivenessMonitorService alivenessMonitorService,
40 final IMdsalApiManager mdsalApiManager) {
41 this.dataBroker = dataBroker;
42 this.idManager = idManager;
43 this.alivenessMonitorService = alivenessMonitorService;
44 this.mdsalApiManager = mdsalApiManager;
48 protected InstanceIdentifier<Interface> getWildCardPath() {
49 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
53 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
54 IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
55 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
58 removeVlanMember(key, interfaceOld);
61 private void removeVlanMember(InstanceIdentifier<Interface> key, Interface deleted) {
62 IfL2vlan ifL2vlan = deleted.getAugmentation(IfL2vlan.class);
63 ParentRefs parentRefs = deleted.getAugmentation(ParentRefs.class);
64 if (parentRefs == null) {
65 LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", deleted);
69 String lowerLayerIf = parentRefs.getParentInterface();
70 if (lowerLayerIf.equals(deleted.getName())) {
71 LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", deleted);
75 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
76 RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, deleted, parentRefs, ifL2vlan);
77 coordinator.enqueueJob(lowerLayerIf, removeWorker, IfmConstants.JOB_MAX_RETRIES);
81 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
82 IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
83 if (ifL2vlanNew == null) {
86 IfL2vlan ifL2vlanOld = interfaceOld.getAugmentation(IfL2vlan.class);
87 if (IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanNew.getL2vlanMode() &&
88 IfL2vlan.L2vlanMode.Trunk == ifL2vlanOld.getL2vlanMode()) {
89 // Trunk subport add use case
90 addVlanMember(key, interfaceNew);
92 } else if (IfL2vlan.L2vlanMode.Trunk == ifL2vlanNew.getL2vlanMode() &&
93 IfL2vlan.L2vlanMode.TrunkMember == ifL2vlanOld.getL2vlanMode()) {
94 // Trunk subport remove use case
95 removeVlanMember(key, interfaceOld);
96 } else if (IfL2vlan.L2vlanMode.TrunkMember != ifL2vlanNew.getL2vlanMode()) {
100 ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
101 if (parentRefsNew == null) {
102 LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " +
103 "parent interface", interfaceNew);
107 String lowerLayerIf = parentRefsNew.getParentInterface();
108 if (lowerLayerIf.equals(interfaceNew.getName())) {
109 LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " +
110 "interface name.", interfaceNew);
114 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
115 RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
116 parentRefsNew, ifL2vlanNew);
117 coordinator.enqueueJob(lowerLayerIf, updateWorker, IfmConstants.JOB_MAX_RETRIES);
121 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
122 IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
123 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
126 addVlanMember(key, interfaceNew);
129 private void addVlanMember(InstanceIdentifier<Interface> key, Interface added) {
130 IfL2vlan ifL2vlan = added.getAugmentation(IfL2vlan.class);
131 ParentRefs parentRefs = added.getAugmentation(ParentRefs.class);
132 if (parentRefs == null) {
136 String lowerLayerIf = parentRefs.getParentInterface();
137 if (lowerLayerIf.equals(added.getName())) {
138 LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", added);
142 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
143 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, added, parentRefs, ifL2vlan);
144 coordinator.enqueueJob(lowerLayerIf, configWorker, IfmConstants.JOB_MAX_RETRIES);
148 protected VlanMemberConfigListener getDataTreeChangeListener() {
149 return VlanMemberConfigListener.this;
152 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
153 InstanceIdentifier<Interface> key;
154 Interface interfaceNew;
156 ParentRefs parentRefs;
158 public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
159 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
161 this.interfaceNew = interfaceNew;
162 this.ifL2vlan = ifL2vlan;
163 this.parentRefs = parentRefs;
167 public List<ListenableFuture<Void>> call() {
168 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
169 // to call the respective helpers.
170 return OvsVlanMemberConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew,
171 ifL2vlan, idManager);
175 private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
176 InstanceIdentifier<Interface> key;
177 Interface interfaceNew;
178 Interface interfaceOld;
179 IfL2vlan ifL2vlanNew;
180 ParentRefs parentRefsNew;
182 public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
183 Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
185 this.interfaceNew = interfaceNew;
186 this.interfaceOld = interfaceOld;
187 this.ifL2vlanNew = ifL2vlanNew;
188 this.parentRefsNew = parentRefsNew;
192 public List<ListenableFuture<Void>> call() {
193 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
194 // to call the respective helpers.
195 return OvsVlanMemberConfigUpdateHelper.updateConfiguration(dataBroker, alivenessMonitorService,
196 parentRefsNew, interfaceOld, ifL2vlanNew, interfaceNew, idManager, mdsalApiManager);
200 private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
201 InstanceIdentifier<Interface> key;
202 Interface interfaceOld;
204 ParentRefs parentRefs;
206 public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
207 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
209 this.interfaceOld = interfaceOld;
210 this.ifL2vlan = ifL2vlan;
211 this.parentRefs = parentRefs;
215 public List<ListenableFuture<Void>> call() {
216 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
217 // to call the respective helpers.
218 return OvsVlanMemberConfigRemoveHelper.removeConfiguration(dataBroker, parentRefs, interfaceOld,
219 ifL2vlan, idManager);