Yang changes for l3vpn
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / listeners / InterfaceInventoryStateListener.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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
12 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
13 import org.opendaylight.vpnservice.datastoreutils.AsyncDataChangeListenerBase;
14 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
15 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateAddHelper;
16 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper;
17 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateUpdateHelper;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import java.util.concurrent.Callable;
28
29 /**
30  *
31  * This Class is a Data Change Listener for FlowCapableNodeConnector updates.
32  * This creates an entry in the interface-state OperDS for every node-connector used.
33  *
34  * NOTE: This class just creates an ifstate entry whose interface-name will be the same as the node-connector portname.
35  * If PortName is not unique across DPNs, this implementation can have problems.
36  */
37
38 public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase<FlowCapableNodeConnector, InterfaceInventoryStateListener> implements AutoCloseable{
39     private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class);
40     private DataBroker dataBroker;
41
42     public InterfaceInventoryStateListener(final DataBroker dataBroker) {
43         super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class);
44         this.dataBroker = dataBroker;
45     }
46
47     @Override
48     protected InstanceIdentifier<FlowCapableNodeConnector> getWildCardPath() {
49         return InstanceIdentifier.create(Nodes.class).child(Node.class).child(NodeConnector.class)
50                 .augmentation(FlowCapableNodeConnector.class);
51     }
52
53     @Override
54     protected DataChangeListener getDataChangeListener() {
55         return InterfaceInventoryStateListener.this;
56     }
57
58     @Override
59     protected AsyncDataBroker.DataChangeScope getDataChangeScope() {
60         return AsyncDataBroker.DataChangeScope.BASE;
61     }
62
63     @Override
64     protected void remove(InstanceIdentifier<FlowCapableNodeConnector> key,
65                           FlowCapableNodeConnector flowCapableNodeConnectorOld) {
66         LOG.debug("Received NodeConnector Remove Event: {}, {}", key, flowCapableNodeConnectorOld);
67         String portName = flowCapableNodeConnectorOld.getName();
68         NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
69         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
70
71         InterfaceStateRemoveWorker interfaceStateRemoveWorker = new InterfaceStateRemoveWorker(key,
72                 flowCapableNodeConnectorOld, portName);
73         coordinator.enqueueJob(portName, interfaceStateRemoveWorker);
74     }
75
76     @Override
77     protected void update(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorOld,
78                           FlowCapableNodeConnector fcNodeConnectorNew) {
79         LOG.debug("Received NodeConnector Update Event: {}, {}, {}", key, fcNodeConnectorOld, fcNodeConnectorNew);
80         String portName = fcNodeConnectorNew.getName();
81         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
82
83         InterfaceStateUpdateWorker interfaceStateUpdateWorker = new InterfaceStateUpdateWorker(key, fcNodeConnectorOld,
84                 fcNodeConnectorNew, portName);
85         coordinator.enqueueJob(portName, interfaceStateUpdateWorker);
86     }
87
88     @Override
89     protected void add(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorNew) {
90         LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
91         String portName = fcNodeConnectorNew.getName();
92         NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
93
94         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
95         InterfaceStateAddWorker ifStateAddWorker = new InterfaceStateAddWorker(nodeConnectorId,
96                 fcNodeConnectorNew, portName);
97         coordinator.enqueueJob(portName, ifStateAddWorker);
98     }
99
100     private class InterfaceStateAddWorker implements Callable {
101         private final NodeConnectorId nodeConnectorId;
102         private final FlowCapableNodeConnector fcNodeConnectorNew;
103         private final String portName;
104
105         public InterfaceStateAddWorker(NodeConnectorId nodeConnectorId,
106                                        FlowCapableNodeConnector fcNodeConnectorNew,
107                                        String portName) {
108             this.nodeConnectorId = nodeConnectorId;
109             this.fcNodeConnectorNew = fcNodeConnectorNew;
110             this.portName = portName;
111         }
112
113         @Override
114         public Object call() throws Exception {
115             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
116             // to call the respective helpers.
117              return OvsInterfaceStateAddHelper.addState(dataBroker, nodeConnectorId,
118                      portName, fcNodeConnectorNew);
119         }
120
121         @Override
122         public String toString() {
123             return "InterfaceStateAddWorker{" +
124                     "nodeConnectorId=" + nodeConnectorId +
125                     ", fcNodeConnectorNew=" + fcNodeConnectorNew +
126                     ", portName='" + portName + '\'' +
127                     '}';
128         }
129     }
130
131     private class InterfaceStateUpdateWorker implements Callable {
132         private InstanceIdentifier<FlowCapableNodeConnector> key;
133         private final FlowCapableNodeConnector fcNodeConnectorOld;
134         private final FlowCapableNodeConnector fcNodeConnectorNew;
135         private String portName;
136
137
138         public InterfaceStateUpdateWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
139                                           FlowCapableNodeConnector fcNodeConnectorOld,
140                                           FlowCapableNodeConnector fcNodeConnectorNew,
141                                           String portName) {
142             this.key = key;
143             this.fcNodeConnectorOld = fcNodeConnectorOld;
144             this.fcNodeConnectorNew = fcNodeConnectorNew;
145             this.portName = portName;
146         }
147
148         @Override
149         public Object call() throws Exception {
150             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
151             // to call the respective helpers.
152             return OvsInterfaceStateUpdateHelper.updateState(key, dataBroker, portName,
153                     fcNodeConnectorNew, fcNodeConnectorOld);
154         }
155
156         @Override
157         public String toString() {
158             return "InterfaceStateUpdateWorker{" +
159                     "key=" + key +
160                     ", fcNodeConnectorOld=" + fcNodeConnectorOld +
161                     ", fcNodeConnectorNew=" + fcNodeConnectorNew +
162                     ", portName='" + portName + '\'' +
163                     '}';
164         }
165     }
166
167     private class InterfaceStateRemoveWorker implements Callable {
168         InstanceIdentifier<FlowCapableNodeConnector> key;
169         FlowCapableNodeConnector fcNodeConnectorOld;
170         private final String portName;
171
172         public InterfaceStateRemoveWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
173                                           FlowCapableNodeConnector fcNodeConnectorOld,
174                                           String portName) {
175             this.key = key;
176             this.fcNodeConnectorOld = fcNodeConnectorOld;
177             this.portName = portName;
178         }
179
180         @Override
181         public Object call() throws Exception {
182             // If another renderer(for eg : CSS) needs to be supported, check can be performed here
183             // to call the respective helpers.
184             return OvsInterfaceStateRemoveHelper.removeState(key, dataBroker, portName, fcNodeConnectorOld);
185         }
186
187         @Override
188         public String toString() {
189             return "InterfaceStateRemoveWorker{" +
190                     "key=" + key +
191                     ", fcNodeConnectorOld=" + fcNodeConnectorOld +
192                     ", portName='" + portName + '\'' +
193                     '}';
194         }
195     }
196 }