Merge "Action redesign: nx_resubmit backwards compatibility"
[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 DataBroker dataBroker;
34     private IdManagerService idManager;
35     private AlivenessMonitorService alivenessMonitorService;
36     private IMdsalApiManager mdsalApiManager;
37
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;
46     }
47
48     @Override
49     protected InstanceIdentifier<Interface> getWildCardPath() {
50         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
51     }
52
53     @Override
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()) {
57             return;
58         }
59
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);
63             return;
64         }
65
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);
69             return;
70         }
71
72         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
73         RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs, ifL2vlan);
74         coordinator.enqueueJob(lowerLayerIf, removeWorker, IfmConstants.JOB_MAX_RETRIES);
75     }
76
77     @Override
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()) {
81             return;
82         }
83
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);
88             return;
89         }
90
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);
95             return;
96         }
97
98         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
99         RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
100                 parentRefsNew, ifL2vlanNew);
101         coordinator.enqueueJob(lowerLayerIf, updateWorker, IfmConstants.JOB_MAX_RETRIES);
102     }
103
104     @Override
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()) {
108             return;
109         }
110
111         ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
112         if (parentRefs == null) {
113             return;
114         }
115
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);
119             return;
120         }
121
122         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
123         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifL2vlan);
124         coordinator.enqueueJob(lowerLayerIf, configWorker, IfmConstants.JOB_MAX_RETRIES);
125     }
126
127     @Override
128     protected VlanMemberConfigListener getDataTreeChangeListener() {
129         return VlanMemberConfigListener.this;
130     }
131
132     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
133         InstanceIdentifier<Interface> key;
134         Interface interfaceNew;
135         IfL2vlan ifL2vlan;
136         ParentRefs parentRefs;
137
138         public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
139                                        ParentRefs parentRefs, IfL2vlan ifL2vlan) {
140             this.key = key;
141             this.interfaceNew = interfaceNew;
142             this.ifL2vlan = ifL2vlan;
143             this.parentRefs = parentRefs;
144         }
145
146         @Override
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);
152         }
153     }
154
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;
161
162         public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
163                                           Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
164             this.key = key;
165             this.interfaceNew = interfaceNew;
166             this.interfaceOld = interfaceOld;
167             this.ifL2vlanNew = ifL2vlanNew;
168             this.parentRefsNew = parentRefsNew;
169         }
170
171         @Override
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);
177         }
178     }
179
180     private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
181         InstanceIdentifier<Interface> key;
182         Interface interfaceOld;
183         IfL2vlan ifL2vlan;
184         ParentRefs parentRefs;
185
186         public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
187                                           ParentRefs parentRefs, IfL2vlan ifL2vlan) {
188             this.key = key;
189             this.interfaceOld = interfaceOld;
190             this.ifL2vlan = ifL2vlan;
191             this.parentRefs = parentRefs;
192         }
193
194         @Override
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);
200         }
201     }
202 }