Refactor InterfaceManagerCommonUtils to non-static
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / listeners / VlanMemberConfigListener.java
1 /*
2  * Copyright (c) 2016, 2017 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 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;
34
35 @Singleton
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;
42
43     @Inject
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);
56     }
57
58     @Override
59     protected InstanceIdentifier<Interface> getWildCardPath() {
60         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
61     }
62
63     @Override
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()) {
67             return;
68         }
69         removeVlanMember(key, interfaceOld);
70     }
71
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);
76             return;
77         }
78
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);
82             return;
83         }
84
85         RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(deleted, parentRefs);
86         coordinator.enqueueJob(lowerLayerIf, removeWorker, IfmConstants.JOB_MAX_RETRIES);
87     }
88
89     @Override
90     protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
91         IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
92         if (ifL2vlanNew == null) {
93             return;
94         }
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);
100             return;
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()) {
106             return;
107         }
108
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",
112                     interfaceNew);
113             return;
114         }
115
116         String lowerLayerIf = parentRefsNew.getParentInterface();
117         if (lowerLayerIf.equals(interfaceNew.getName())) {
118             LOG.error(
119                     "Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " + "interface name.",
120                     interfaceNew);
121             return;
122         }
123
124         RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(interfaceNew, interfaceOld,
125                 parentRefsNew, ifL2vlanNew);
126         coordinator.enqueueJob(lowerLayerIf, updateWorker, IfmConstants.JOB_MAX_RETRIES);
127     }
128
129     @Override
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()) {
133             return;
134         }
135         addVlanMember(key, interfaceNew);
136     }
137
138     private void addVlanMember(InstanceIdentifier<Interface> key, Interface added) {
139         ParentRefs parentRefs = added.getAugmentation(ParentRefs.class);
140         if (parentRefs == null) {
141             return;
142         }
143
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);
147             return;
148         }
149
150         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(added, parentRefs);
151         coordinator.enqueueJob(lowerLayerIf, configWorker, IfmConstants.JOB_MAX_RETRIES);
152     }
153
154     @Override
155     protected VlanMemberConfigListener getDataTreeChangeListener() {
156         return VlanMemberConfigListener.this;
157     }
158
159     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
160         Interface interfaceNew;
161         ParentRefs parentRefs;
162
163         RendererConfigAddWorker(Interface interfaceNew, ParentRefs parentRefs) {
164             this.interfaceNew = interfaceNew;
165             this.parentRefs = parentRefs;
166         }
167
168         @Override
169         public List<ListenableFuture<Void>> call() {
170             return ovsVlanMemberConfigAddHelper.addConfiguration(parentRefs, interfaceNew);
171         }
172     }
173
174     private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
175         Interface interfaceNew;
176         Interface interfaceOld;
177         IfL2vlan ifL2vlanNew;
178         ParentRefs parentRefsNew;
179
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;
186         }
187
188         @Override
189         public List<ListenableFuture<Void>> call() {
190             return ovsVlanMemberConfigUpdateHelper.updateConfiguration(parentRefsNew, interfaceOld, ifL2vlanNew,
191                     interfaceNew);
192         }
193     }
194
195     private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
196         Interface interfaceOld;
197         ParentRefs parentRefs;
198
199         RendererConfigRemoveWorker(Interface interfaceOld, ParentRefs parentRefs) {
200             this.interfaceOld = interfaceOld;
201             this.parentRefs = parentRefs;
202         }
203
204         @Override
205         public List<ListenableFuture<Void>> call() {
206             return ovsVlanMemberConfigRemoveHelper.removeConfiguration(parentRefs, interfaceOld);
207         }
208     }
209 }