Yang changes for l3vpn
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / listeners / VlanMemberConfigListener.java
1 /*
2  * Copyright (c) 2015 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.vpnservice.interfacemgr.listeners;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.idmanager.IdManager;
13 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
14 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
15 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsVlanMemberConfigAddHelper;
16 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsVlanMemberConfigRemoveHelper;
17 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsVlanMemberConfigUpdateHelper;
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.vpnservice.interfacemgr.rev150331.IfL2vlan;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import java.util.List;
27 import java.util.concurrent.Callable;
28
29 public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<Interface, VlanMemberConfigListener> {
30     private static final Logger LOG = LoggerFactory.getLogger(VlanMemberConfigListener.class);
31     private DataBroker dataBroker;
32     private IdManager idManager;
33
34     public VlanMemberConfigListener(final DataBroker dataBroker, final IdManager idManager) {
35         super(Interface.class, VlanMemberConfigListener.class);
36         this.dataBroker = dataBroker;
37         this.idManager = idManager;
38     }
39
40     @Override
41     protected InstanceIdentifier<Interface> getWildCardPath() {
42         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
43     }
44
45     @Override
46     protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
47         IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
48         if (ifL2vlan == null) {
49             return;
50         }
51
52         if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
53             return;
54         }
55
56         ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
57         if (parentRefs == null) {
58             LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", interfaceOld);
59             return;
60         }
61
62         String lowerLayerIf = parentRefs.getParentInterface();
63         if (lowerLayerIf.equals(interfaceOld.getName())) {
64             LOG.error("Attempt to remove Vlan Trunk-Member {} with same parent interface name.", interfaceOld);
65             return;
66         }
67
68         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
69         RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs, ifL2vlan);
70         coordinator.enqueueJob(lowerLayerIf, removeWorker);
71     }
72
73     @Override
74     protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
75         IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
76         if (ifL2vlanNew == null) {
77             return;
78         }
79         if (ifL2vlanNew.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
80             LOG.error("Configuration Error. Attempt to modify Vlan Mode of interface: {} " +
81                     "to interface: {}", interfaceOld, interfaceNew);
82             return;
83         }
84
85         ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
86         if (parentRefsNew == null) {
87             LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} without a " +
88                     "parent interface", interfaceNew);
89             return;
90         }
91
92         String lowerLayerIf = parentRefsNew.getParentInterface();
93         if (lowerLayerIf.equals(interfaceNew.getName())) {
94             LOG.error("Configuration Error. Attempt to update Vlan Trunk-Member {} with same parent " +
95                     "interface name.", interfaceNew);
96             return;
97         }
98
99         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
100         RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
101                 parentRefsNew, ifL2vlanNew);
102         coordinator.enqueueJob(lowerLayerIf, updateWorker);
103     }
104
105     @Override
106     protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
107         IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
108         if (ifL2vlan == null) {
109             return;
110         }
111
112         if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
113             return;
114         }
115
116         ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
117         if (parentRefs == null) {
118             LOG.error("Attempt to add Vlan Trunk-Member {} without a parent interface", interfaceNew);
119             return;
120         }
121
122         String lowerLayerIf = parentRefs.getParentInterface();
123         if (lowerLayerIf.equals(interfaceNew.getName())) {
124             LOG.error("Attempt to add Vlan Trunk-Member {} with same parent interface name.", interfaceNew);
125             return;
126         }
127
128         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
129         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifL2vlan);
130         coordinator.enqueueJob(lowerLayerIf, configWorker);
131     }
132
133     @Override
134     protected VlanMemberConfigListener getDataTreeChangeListener() {
135         return VlanMemberConfigListener.this;
136     }
137
138     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
139         InstanceIdentifier<Interface> key;
140         Interface interfaceNew;
141         IfL2vlan ifL2vlan;
142         ParentRefs parentRefs;
143
144         public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
145                                        ParentRefs parentRefs, IfL2vlan ifL2vlan) {
146             this.key = key;
147             this.interfaceNew = interfaceNew;
148             this.ifL2vlan = ifL2vlan;
149             this.parentRefs = parentRefs;
150         }
151
152         @Override
153         public List<ListenableFuture<Void>> call() throws Exception {
154             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
155             // to call the respective helpers.
156             return OvsVlanMemberConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew,
157                     ifL2vlan, idManager);
158         }
159     }
160
161     private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
162         InstanceIdentifier<Interface> key;
163         Interface interfaceNew;
164         Interface interfaceOld;
165         IfL2vlan ifL2vlanNew;
166         ParentRefs parentRefsNew;
167
168         public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
169                                        Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
170             this.key = key;
171             this.interfaceNew = interfaceNew;
172             this.interfaceOld = interfaceOld;
173             this.ifL2vlanNew = ifL2vlanNew;
174             this.parentRefsNew = parentRefsNew;
175         }
176
177         @Override
178         public List<ListenableFuture<Void>> call() throws Exception {
179             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
180             // to call the respective helpers.
181             return OvsVlanMemberConfigUpdateHelper.updateConfiguration(dataBroker, parentRefsNew, interfaceOld,
182                     ifL2vlanNew, interfaceNew, idManager);
183         }
184     }
185
186     private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
187         InstanceIdentifier<Interface> key;
188         Interface interfaceOld;
189         IfL2vlan ifL2vlan;
190         ParentRefs parentRefs;
191
192         public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
193                                           ParentRefs parentRefs, IfL2vlan ifL2vlan) {
194             this.key = key;
195             this.interfaceOld = interfaceOld;
196             this.ifL2vlan = ifL2vlan;
197             this.parentRefs = parentRefs;
198         }
199
200         @Override
201         public List<ListenableFuture<Void>> call() throws Exception {
202             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
203             // to call the respective helpers.
204             return OvsVlanMemberConfigRemoveHelper.removeConfiguration(dataBroker, parentRefs, interfaceOld,
205                     ifL2vlan, idManager);
206         }
207     }
208 }