Merge "Remove an unnecessary augmentation"
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / listeners / VlanMemberConfigListener.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.genius.interfacemanager.listeners;
9
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;
30
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;
37
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;
45     }
46
47     @Override
48     protected InstanceIdentifier<Interface> getWildCardPath() {
49         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
50     }
51
52     @Override
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()) {
56             return;
57         }
58         removeVlanMember(key, interfaceOld);
59     }
60
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);
66             return;
67         }
68
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);
72             return;
73         }
74
75         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
76         RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, deleted, parentRefs, ifL2vlan);
77         coordinator.enqueueJob(lowerLayerIf, removeWorker, IfmConstants.JOB_MAX_RETRIES);
78     }
79
80     @Override
81     protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
82         IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
83         if (ifL2vlanNew == null) {
84             return;
85         }
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);
91             return;
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()) {
97             return;
98         }
99
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);
104             return;
105         }
106
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);
111             return;
112         }
113
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);
118     }
119
120     @Override
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()) {
124             return;
125         }
126         addVlanMember(key, interfaceNew);
127     }
128
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) {
133             return;
134         }
135
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);
139             return;
140         }
141
142         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
143         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, added, parentRefs, ifL2vlan);
144         coordinator.enqueueJob(lowerLayerIf, configWorker, IfmConstants.JOB_MAX_RETRIES);
145     }
146
147     @Override
148     protected VlanMemberConfigListener getDataTreeChangeListener() {
149         return VlanMemberConfigListener.this;
150     }
151
152     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
153         InstanceIdentifier<Interface> key;
154         Interface interfaceNew;
155         IfL2vlan ifL2vlan;
156         ParentRefs parentRefs;
157
158         public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
159                                        ParentRefs parentRefs, IfL2vlan ifL2vlan) {
160             this.key = key;
161             this.interfaceNew = interfaceNew;
162             this.ifL2vlan = ifL2vlan;
163             this.parentRefs = parentRefs;
164         }
165
166         @Override
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);
172         }
173     }
174
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;
181
182         public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
183                                           Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
184             this.key = key;
185             this.interfaceNew = interfaceNew;
186             this.interfaceOld = interfaceOld;
187             this.ifL2vlanNew = ifL2vlanNew;
188             this.parentRefsNew = parentRefsNew;
189         }
190
191         @Override
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);
197         }
198     }
199
200     private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
201         InstanceIdentifier<Interface> key;
202         Interface interfaceOld;
203         IfL2vlan ifL2vlan;
204         ParentRefs parentRefs;
205
206         public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
207                                           ParentRefs parentRefs, IfL2vlan ifL2vlan) {
208             this.key = key;
209             this.interfaceOld = interfaceOld;
210             this.ifL2vlan = ifL2vlan;
211             this.parentRefs = parentRefs;
212         }
213
214         @Override
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);
220         }
221     }
222 }