2 * Copyright (c) 2015 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.vpnservice.interfacemgr.listeners;
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;
26 import java.util.List;
27 import java.util.concurrent.Callable;
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;
34 public VlanMemberConfigListener(final DataBroker dataBroker, final IdManager idManager) {
35 super(Interface.class, VlanMemberConfigListener.class);
36 this.dataBroker = dataBroker;
37 this.idManager = idManager;
41 protected InstanceIdentifier<Interface> getWildCardPath() {
42 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
46 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
47 IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class);
48 if (ifL2vlan == null) {
52 if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
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);
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);
68 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
69 RendererConfigRemoveWorker removeWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs, ifL2vlan);
70 coordinator.enqueueJob(lowerLayerIf, removeWorker);
74 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
75 IfL2vlan ifL2vlanNew = interfaceNew.getAugmentation(IfL2vlan.class);
76 if (ifL2vlanNew == null) {
79 if (ifL2vlanNew.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
80 LOG.error("Configuration Error. Attempt to modify Vlan Mode of interface: {} " +
81 "to interface: {}", interfaceOld, interfaceNew);
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);
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);
99 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
100 RendererConfigUpdateWorker updateWorker = new RendererConfigUpdateWorker(key, interfaceNew, interfaceOld,
101 parentRefsNew, ifL2vlanNew);
102 coordinator.enqueueJob(lowerLayerIf, updateWorker);
106 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
107 IfL2vlan ifL2vlan = interfaceNew.getAugmentation(IfL2vlan.class);
108 if (ifL2vlan == null) {
112 if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
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);
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);
128 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
129 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifL2vlan);
130 coordinator.enqueueJob(lowerLayerIf, configWorker);
134 protected VlanMemberConfigListener getDataTreeChangeListener() {
135 return VlanMemberConfigListener.this;
138 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
139 InstanceIdentifier<Interface> key;
140 Interface interfaceNew;
142 ParentRefs parentRefs;
144 public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
145 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
147 this.interfaceNew = interfaceNew;
148 this.ifL2vlan = ifL2vlan;
149 this.parentRefs = parentRefs;
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);
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;
168 public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
169 Interface interfaceOld, ParentRefs parentRefsNew, IfL2vlan ifL2vlanNew) {
171 this.interfaceNew = interfaceNew;
172 this.interfaceOld = interfaceOld;
173 this.ifL2vlanNew = ifL2vlanNew;
174 this.parentRefsNew = parentRefsNew;
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);
186 private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
187 InstanceIdentifier<Interface> key;
188 Interface interfaceOld;
190 ParentRefs parentRefs;
192 public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
193 ParentRefs parentRefs, IfL2vlan ifL2vlan) {
195 this.interfaceOld = interfaceOld;
196 this.ifL2vlan = ifL2vlan;
197 this.parentRefs = parentRefs;
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);