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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
13 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
14 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigAddHelper;
15 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigRemoveHelper;
16 import org.opendaylight.genius.interfacemanager.renderer.ovs.confighelpers.OvsVlanMemberConfigUpdateHelper;
17 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import java.util.List;
29 import java.util.concurrent.Callable;
31 public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<Interface, VlanMemberConfigListener> {
32 private static final Logger LOG = LoggerFactory.getLogger(VlanMemberConfigListener.class);
33 private DataBroker dataBroker;
34 private IdManagerService idManager;
35 private AlivenessMonitorService alivenessMonitorService;
36 private IMdsalApiManager mdsalApiManager;
38 public VlanMemberConfigListener(final DataBroker dataBroker, final IdManagerService idManager,
39 final AlivenessMonitorService alivenessMonitorService,
40 final IMdsalApiManager mdsalApiManager) {
41 super(Interface.class, VlanMemberConfigListener.class);
42 this.dataBroker = dataBroker;
43 this.idManager = idManager;
44 this.alivenessMonitorService = alivenessMonitorService;
45 this.mdsalApiManager = mdsalApiManager;
49 protected InstanceIdentifier<Interface> getWildCardPath() {
50 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
54 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
55 IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
56 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
60 ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
61 if (parentRefs == null) {
62 LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", interfaceOld);
66 String lowerLayerIf = parentRefs.getParentInterface();
67 if (lowerLayerIf.equals(interfaceOld.getName())) {
68 LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", interfaceOld);
72 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
73 RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs, ifL2vlan);
74 coordinator.enqueueJob(lowerLayerIf, removeWorker);
78 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
79 IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
80 if (ifL2vlanNew == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlanNew.getL2vlanMode()) {
84 ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
85 if (parentRefsNew == null) {
86 LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " +
87 "parent interface", interfaceNew);
91 String lowerLayerIf = parentRefsNew.getParentInterface();
92 if (lowerLayerIf.equals(interfaceNew.getName())) {
93 LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " +
94 "interface name.", interfaceNew);
98 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
99 RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
100 parentRefsNew, ifL2vlanNew);
101 coordinator.enqueueJob(lowerLayerIf, updateWorker);
105 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
106 IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
107 if (ifL2vlan == null || IfL2vlan.L2vlanMode.TrunkMember != ifL2vlan.getL2vlanMode()) {
111 ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
112 if (parentRefs == null) {
116 String lowerLayerIf = parentRefs.getParentInterface();
117 if (lowerLayerIf.equals(interfaceNew.getName())) {
118 LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", interfaceNew);
122 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
123 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifL2vlan);
124 coordinator.enqueueJob(lowerLayerIf, configWorker);
128 protected VlanMemberConfigListener getDataTreeChangeListener() {
129 return VlanMemberConfigListener.this;
132 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
133 InstanceIdentifier<Interface> key;
134 Interface interfaceNew;
136 ParentRefs parentRefs;
138 public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
139 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
141 this.interfaceNew = interfaceNew;
142 this.ifL2vlan = ifL2vlan;
143 this.parentRefs = parentRefs;
147 public List<ListenableFuture<Void>> call() throws Exception {
148 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
149 // to call the respective helpers.
150 return OvsVlanMemberConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew,
151 ifL2vlan, idManager);
155 private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
156 InstanceIdentifier<Interface> key;
157 Interface interfaceNew;
158 Interface interfaceOld;
159 IfL2vlan ifL2vlanNew;
160 ParentRefs parentRefsNew;
162 public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
163 Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
165 this.interfaceNew = interfaceNew;
166 this.interfaceOld = interfaceOld;
167 this.ifL2vlanNew = ifL2vlanNew;
168 this.parentRefsNew = parentRefsNew;
172 public List<ListenableFuture<Void>> call() throws Exception {
173 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
174 // to call the respective helpers.
175 return OvsVlanMemberConfigUpdateHelper.updateConfiguration(dataBroker, alivenessMonitorService,
176 parentRefsNew, interfaceOld, ifL2vlanNew, interfaceNew, idManager, mdsalApiManager);
180 private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
181 InstanceIdentifier<Interface> key;
182 Interface interfaceOld;
184 ParentRefs parentRefs;
186 public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
187 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
189 this.interfaceOld = interfaceOld;
190 this.ifL2vlan = ifL2vlan;
191 this.parentRefs = parentRefs;
195 public List<ListenableFuture<Void>> call() throws Exception {
196 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
197 // to call the respective helpers.
198 return OvsVlanMemberConfigRemoveHelper.removeConfiguration(dataBroker, parentRefs, interfaceOld,
199 ifL2vlan, idManager);