Bug 5463 : dpID coming as null during ovsdbbridge add DCN
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / listeners / InterfaceConfigListener.java
1 /*
2  * Copyright (c) 2015 - 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
9 package org.opendaylight.vpnservice.interfacemgr.listeners;
10
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;
28
29 import java.util.List;
30 import java.util.concurrent.Callable;
31
32 /**
33  * This class listens for interface creation/removal/update in Configuration DS.
34  * This is used to handle interfaces for base of-ports.
35  */
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;
43
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;
52     }
53
54     @Override
55     protected InstanceIdentifier<Interface> getWildCardPath() {
56         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
57     }
58
59     @Override
60     protected InterfaceConfigListener getDataTreeChangeListener() {
61         return InterfaceConfigListener.this;
62     }
63
64     @Override
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);
72     }
73
74     @Override
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);
81     }
82
83     @Override
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());
90         }
91         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
92         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs, ifName);
93         coordinator.enqueueJob(ifName, configWorker, MAX_RETRIES);
94     }
95
96     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
97         InstanceIdentifier<Interface> key;
98         Interface interfaceNew;
99         String portName;
100         ParentRefs parentRefs;
101
102         public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
103                                        ParentRefs parentRefs, String portName) {
104             this.key = key;
105             this.interfaceNew = interfaceNew;
106             this.portName = portName;
107             this.parentRefs = parentRefs;
108         }
109
110         @Override
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);
116         }
117
118         @Override
119         public String toString() {
120             return "RendererConfigAddWorker{" +
121                     "key=" + key +
122                     ", interfaceNew=" + interfaceNew +
123                     ", portName='" + portName + '\'' +
124                     '}';
125         }
126     }
127
128     /**
129      *
130      */
131     private class RendererConfigUpdateWorker implements Callable {
132         InstanceIdentifier<Interface> key;
133         Interface interfaceOld;
134         Interface interfaceNew;
135         String portNameNew;
136
137         public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
138                                           Interface interfaceNew, String portNameNew) {
139             this.key = key;
140             this.interfaceOld = interfaceOld;
141             this.interfaceNew = interfaceNew;
142             this.portNameNew = portNameNew;
143         }
144
145         @Override
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);
151         }
152
153         @Override
154         public String toString() {
155             return "RendererConfigUpdateWorker{" +
156                     "key=" + key +
157                     ", interfaceOld=" + interfaceOld +
158                     ", interfaceNew=" + interfaceNew +
159                     ", portNameNew='" + portNameNew + '\'' +
160                     '}';
161         }
162     }
163
164     /**
165      *
166      */
167     private class RendererConfigRemoveWorker implements Callable {
168         InstanceIdentifier<Interface> key;
169         Interface interfaceOld;
170         String portName;
171         ParentRefs parentRefs;
172
173         public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld, String portName,
174                                           ParentRefs parentRefs) {
175             this.key = key;
176             this.interfaceOld = interfaceOld;
177             this.portName = portName;
178             this.parentRefs = parentRefs;
179         }
180
181         @Override
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);
187         }
188
189         @Override
190         public String toString() {
191             return "RendererConfigRemoveWorker{" +
192                     "key=" + key +
193                     ", interfaceOld=" + interfaceOld +
194                     ", portName='" + portName + '\'' +
195                     '}';
196         }
197     }
198 }