2 * Copyright (c) 2015 - 2016 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
9 package org.opendaylight.vpnservice.interfacemgr.listeners;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.idmanager.IdManager;
14 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
15 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
16 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper;
17 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper;
18 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigUpdateHelper;
19 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
29 import java.util.List;
30 import java.util.concurrent.Callable;
33 * This class listens for interface creation/removal/update in Configuration DS.
34 * This is used to handle interfaces for base of-ports.
36 public class InterfaceConfigListener extends AsyncDataTreeChangeListenerBase<Interface, InterfaceConfigListener> {
37 private static final Logger LOG = LoggerFactory.getLogger(InterfaceConfigListener.class);
38 private DataBroker dataBroker;
39 private IdManagerService idManager;
40 private AlivenessMonitorService alivenessMonitorService;
41 private IMdsalApiManager mdsalApiManager;
42 private static final int MAX_RETRIES = 3;
44 public InterfaceConfigListener(final DataBroker dataBroker, final IdManagerService idManager,
45 final AlivenessMonitorService alivenessMonitorService,
46 final IMdsalApiManager mdsalApiManager) {
47 super(Interface.class, InterfaceConfigListener.class);
48 this.dataBroker = dataBroker;
49 this.idManager = idManager;
50 this.alivenessMonitorService = alivenessMonitorService;
51 this.mdsalApiManager = mdsalApiManager;
55 protected InstanceIdentifier<Interface> getWildCardPath() {
56 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
60 protected InterfaceConfigListener getDataTreeChangeListener() {
61 return InterfaceConfigListener.this;
65 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
66 LOG.debug("Received Interface Remove Event: {}, {}", key, interfaceOld);
67 String ifName = interfaceOld.getName();
68 ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
69 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
70 RendererConfigRemoveWorker configWorker = new RendererConfigRemoveWorker(key, interfaceOld, ifName, parentRefs);
71 coordinator.enqueueJob(ifName, configWorker, MAX_RETRIES);
75 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
76 LOG.debug("Received Interface Update Event: {}, {}, {}", key, interfaceOld, interfaceNew);
77 String ifNameNew = interfaceNew.getName();
78 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
79 RendererConfigUpdateWorker worker = new RendererConfigUpdateWorker(key, interfaceOld, interfaceNew, ifNameNew);
80 coordinator.enqueueJob(ifNameNew, worker, MAX_RETRIES);
84 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
85 LOG.debug("Received Interface Add Event: {}, {}", key, interfaceNew);
86 String ifName = interfaceNew.getName();
87 ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
88 if (parentRefs == null) {
89 LOG.error("parent refs not specified for {}",interfaceNew.getName());
91 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
92 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifName);
93 coordinator.enqueueJob(ifName, configWorker, MAX_RETRIES);
96 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
97 InstanceIdentifier<Interface> key;
98 Interface interfaceNew;
100 ParentRefs parentRefs;
102 public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
103 ParentRefs parentRefs, String portName) {
105 this.interfaceNew = interfaceNew;
106 this.portName = portName;
107 this.parentRefs = parentRefs;
111 public List<ListenableFuture<Void>> call() throws Exception {
112 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
113 // to call the respective helpers.
114 return OvsInterfaceConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew,
115 idManager, alivenessMonitorService, mdsalApiManager);
119 public String toString() {
120 return "RendererConfigAddWorker{" +
122 ", interfaceNew=" + interfaceNew +
123 ", portName='" + portName + '\'' +
131 private class RendererConfigUpdateWorker implements Callable {
132 InstanceIdentifier<Interface> key;
133 Interface interfaceOld;
134 Interface interfaceNew;
137 public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
138 Interface interfaceNew, String portNameNew) {
140 this.interfaceOld = interfaceOld;
141 this.interfaceNew = interfaceNew;
142 this.portNameNew = portNameNew;
146 public List<ListenableFuture<Void>> call() throws Exception {
147 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
148 // to call the respective helpers.
149 return OvsInterfaceConfigUpdateHelper.updateConfiguration(dataBroker, alivenessMonitorService, idManager,
150 mdsalApiManager, interfaceNew, interfaceOld);
154 public String toString() {
155 return "RendererConfigUpdateWorker{" +
157 ", interfaceOld=" + interfaceOld +
158 ", interfaceNew=" + interfaceNew +
159 ", portNameNew='" + portNameNew + '\'' +
167 private class RendererConfigRemoveWorker implements Callable {
168 InstanceIdentifier<Interface> key;
169 Interface interfaceOld;
171 ParentRefs parentRefs;
173 public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld, String portName,
174 ParentRefs parentRefs) {
176 this.interfaceOld = interfaceOld;
177 this.portName = portName;
178 this.parentRefs = parentRefs;
182 public List<ListenableFuture<Void>> call() throws Exception {
183 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
184 // to call the respective helpers.
185 return OvsInterfaceConfigRemoveHelper.removeConfiguration(dataBroker, alivenessMonitorService,
186 interfaceOld, idManager, mdsalApiManager, parentRefs);
190 public String toString() {
191 return "RendererConfigRemoveWorker{" +
193 ", interfaceOld=" + interfaceOld +
194 ", portName='" + portName + '\'' +