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 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;
27 import java.util.concurrent.Callable;
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.
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.
38 public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase<FlowCapableNodeConnector, InterfaceInventoryStateListener> implements AutoCloseable{
39 private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class);
40 private DataBroker dataBroker;
42 public InterfaceInventoryStateListener(final DataBroker dataBroker) {
43 super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class);
44 this.dataBroker = dataBroker;
48 protected InstanceIdentifier<FlowCapableNodeConnector> getWildCardPath() {
49 return InstanceIdentifier.create(Nodes.class).child(Node.class).child(NodeConnector.class)
50 .augmentation(FlowCapableNodeConnector.class);
54 protected DataChangeListener getDataChangeListener() {
55 return InterfaceInventoryStateListener.this;
59 protected AsyncDataBroker.DataChangeScope getDataChangeScope() {
60 return AsyncDataBroker.DataChangeScope.BASE;
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();
71 InterfaceStateRemoveWorker interfaceStateRemoveWorker = new InterfaceStateRemoveWorker(key,
72 flowCapableNodeConnectorOld, portName);
73 coordinator.enqueueJob(portName, interfaceStateRemoveWorker);
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();
83 InterfaceStateUpdateWorker interfaceStateUpdateWorker = new InterfaceStateUpdateWorker(key, fcNodeConnectorOld,
84 fcNodeConnectorNew, portName);
85 coordinator.enqueueJob(portName, interfaceStateUpdateWorker);
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();
94 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
95 InterfaceStateAddWorker ifStateAddWorker = new InterfaceStateAddWorker(nodeConnectorId,
96 fcNodeConnectorNew, portName);
97 coordinator.enqueueJob(portName, ifStateAddWorker);
100 private class InterfaceStateAddWorker implements Callable {
101 private final NodeConnectorId nodeConnectorId;
102 private final FlowCapableNodeConnector fcNodeConnectorNew;
103 private final String portName;
105 public InterfaceStateAddWorker(NodeConnectorId nodeConnectorId,
106 FlowCapableNodeConnector fcNodeConnectorNew,
108 this.nodeConnectorId = nodeConnectorId;
109 this.fcNodeConnectorNew = fcNodeConnectorNew;
110 this.portName = portName;
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);
122 public String toString() {
123 return "InterfaceStateAddWorker{" +
124 "nodeConnectorId=" + nodeConnectorId +
125 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
126 ", portName='" + portName + '\'' +
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;
138 public InterfaceStateUpdateWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
139 FlowCapableNodeConnector fcNodeConnectorOld,
140 FlowCapableNodeConnector fcNodeConnectorNew,
143 this.fcNodeConnectorOld = fcNodeConnectorOld;
144 this.fcNodeConnectorNew = fcNodeConnectorNew;
145 this.portName = portName;
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);
157 public String toString() {
158 return "InterfaceStateUpdateWorker{" +
160 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
161 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
162 ", portName='" + portName + '\'' +
167 private class InterfaceStateRemoveWorker implements Callable {
168 InstanceIdentifier<FlowCapableNodeConnector> key;
169 FlowCapableNodeConnector fcNodeConnectorOld;
170 private final String portName;
172 public InterfaceStateRemoveWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
173 FlowCapableNodeConnector fcNodeConnectorOld,
176 this.fcNodeConnectorOld = fcNodeConnectorOld;
177 this.portName = portName;
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);
188 public String toString() {
189 return "InterfaceStateRemoveWorker{" +
191 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
192 ", portName='" + portName + '\'' +