2 * Copyright (c) 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
8 package org.opendaylight.genius.interfacemanager.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.genius.datastoreutils.AsyncDataChangeListenerBase;
14 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
15 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceStateAddHelper;
16 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper;
17 import org.opendaylight.genius.interfacemanager.renderer.ovs.statehelpers.OvsInterfaceStateUpdateHelper;
18 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 import java.util.concurrent.Callable;
34 * This Class is a Data Change Listener for FlowCapableNodeConnector updates.
35 * This creates an entry in the interface-state OperDS for every node-connector used.
37 * NOTE: This class just creates an ifstate entry whose interface-name will be the same as the node-connector portname.
38 * If PortName is not unique across DPNs, this implementation can have problems.
41 public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase<FlowCapableNodeConnector, InterfaceInventoryStateListener> implements AutoCloseable {
42 private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class);
43 private DataBroker dataBroker;
44 private IdManagerService idManager;
45 private IMdsalApiManager mdsalApiManager;
46 private AlivenessMonitorService alivenessMonitorService;
48 public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManager,
49 final IMdsalApiManager mdsalApiManager, final AlivenessMonitorService alivenessMonitorService) {
50 super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class);
51 this.dataBroker = dataBroker;
52 this.idManager = idManager;
53 this.mdsalApiManager = mdsalApiManager;
54 this.alivenessMonitorService = alivenessMonitorService;
58 protected InstanceIdentifier<FlowCapableNodeConnector> getWildCardPath() {
59 return InstanceIdentifier.create(Nodes.class).child(Node.class).child(NodeConnector.class)
60 .augmentation(FlowCapableNodeConnector.class);
64 protected DataChangeListener getDataChangeListener() {
65 return InterfaceInventoryStateListener.this;
69 protected AsyncDataBroker.DataChangeScope getDataChangeScope() {
70 return AsyncDataBroker.DataChangeScope.BASE;
74 protected void remove(InstanceIdentifier<FlowCapableNodeConnector> key,
75 FlowCapableNodeConnector flowCapableNodeConnectorOld) {
76 LOG.debug("Received NodeConnector Remove Event: {}, {}", key, flowCapableNodeConnectorOld);
77 String portName = flowCapableNodeConnectorOld.getName();
78 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
80 InterfaceStateRemoveWorker interfaceStateRemoveWorker = new InterfaceStateRemoveWorker(idManager,
81 key, flowCapableNodeConnectorOld, portName);
82 coordinator.enqueueJob(portName, interfaceStateRemoveWorker);
86 protected void update(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorOld,
87 FlowCapableNodeConnector fcNodeConnectorNew) {
88 LOG.debug("Received NodeConnector Update Event: {}, {}, {}", key, fcNodeConnectorOld, fcNodeConnectorNew);
89 String portName = fcNodeConnectorNew.getName();
90 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
92 InterfaceStateUpdateWorker interfaceStateUpdateWorker = new InterfaceStateUpdateWorker(key, fcNodeConnectorOld,
93 fcNodeConnectorNew, portName);
94 coordinator.enqueueJob(portName, interfaceStateUpdateWorker);
98 protected void add(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorNew) {
99 LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
100 String portName = fcNodeConnectorNew.getName();
101 NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
103 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
104 InterfaceStateAddWorker ifStateAddWorker = new InterfaceStateAddWorker(idManager, nodeConnectorId,
105 fcNodeConnectorNew, portName);
106 coordinator.enqueueJob(portName, ifStateAddWorker);
109 private class InterfaceStateAddWorker implements Callable {
110 private final NodeConnectorId nodeConnectorId;
111 private final FlowCapableNodeConnector fcNodeConnectorNew;
112 private final String portName;
113 private final IdManagerService idManager;
115 public InterfaceStateAddWorker(IdManagerService idManager, NodeConnectorId nodeConnectorId,
116 FlowCapableNodeConnector fcNodeConnectorNew,
118 this.nodeConnectorId = nodeConnectorId;
119 this.fcNodeConnectorNew = fcNodeConnectorNew;
120 this.portName = portName;
121 this.idManager = idManager;
125 public Object call() throws Exception {
126 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
127 // to call the respective helpers.
128 return OvsInterfaceStateAddHelper.addState(dataBroker, idManager, mdsalApiManager, alivenessMonitorService, nodeConnectorId,
129 portName, fcNodeConnectorNew);
133 public String toString() {
134 return "InterfaceStateAddWorker{" +
135 "nodeConnectorId=" + nodeConnectorId +
136 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
137 ", portName='" + portName + '\'' +
142 private class InterfaceStateUpdateWorker implements Callable {
143 private InstanceIdentifier<FlowCapableNodeConnector> key;
144 private final FlowCapableNodeConnector fcNodeConnectorOld;
145 private final FlowCapableNodeConnector fcNodeConnectorNew;
146 private String portName;
149 public InterfaceStateUpdateWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
150 FlowCapableNodeConnector fcNodeConnectorOld,
151 FlowCapableNodeConnector fcNodeConnectorNew,
154 this.fcNodeConnectorOld = fcNodeConnectorOld;
155 this.fcNodeConnectorNew = fcNodeConnectorNew;
156 this.portName = portName;
160 public Object call() throws Exception {
161 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
162 // to call the respective helpers.
163 return OvsInterfaceStateUpdateHelper.updateState(key, alivenessMonitorService, dataBroker, portName,
164 fcNodeConnectorNew, fcNodeConnectorOld);
168 public String toString() {
169 return "InterfaceStateUpdateWorker{" +
171 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
172 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
173 ", portName='" + portName + '\'' +
178 private class InterfaceStateRemoveWorker implements Callable {
179 InstanceIdentifier<FlowCapableNodeConnector> key;
180 FlowCapableNodeConnector fcNodeConnectorOld;
181 private final String portName;
182 private final IdManagerService idManager;
184 public InterfaceStateRemoveWorker(IdManagerService idManager,
185 InstanceIdentifier<FlowCapableNodeConnector> key,
186 FlowCapableNodeConnector fcNodeConnectorOld,
189 this.fcNodeConnectorOld = fcNodeConnectorOld;
190 this.portName = portName;
191 this.idManager = idManager;
195 public Object call() throws Exception {
196 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
197 // to call the respective helpers.
198 return OvsInterfaceStateRemoveHelper.removeState(idManager, mdsalApiManager, alivenessMonitorService,
199 key, dataBroker, portName, fcNodeConnectorOld);
203 public String toString() {
204 return "InterfaceStateRemoveWorker{" +
206 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
207 ", portName='" + portName + '\'' +