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
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.idmanager.IdManager;
14 import org.opendaylight.vpnservice.datastoreutils.AsyncDataChangeListenerBase;
15 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
16 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateAddHelper;
17 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper;
18 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper;
19 import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateUpdateHelper;
20 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 import java.util.concurrent.Callable;
36 * This Class is a Data Change Listener for FlowCapableNodeConnector updates.
37 * This creates an entry in the interface-state OperDS for every node-connector used.
39 * NOTE: This class just creates an ifstate entry whose interface-name will be the same as the node-connector portname.
40 * If PortName is not unique across DPNs, this implementation can have problems.
43 public class InterfaceInventoryStateListener extends AsyncDataChangeListenerBase<FlowCapableNodeConnector, InterfaceInventoryStateListener> implements AutoCloseable{
44 private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class);
45 private DataBroker dataBroker;
46 private IdManagerService idManager;
47 private IMdsalApiManager mdsalApiManager;
48 private AlivenessMonitorService alivenessMonitorService;
50 public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManager,
51 final IMdsalApiManager mdsalApiManager, final AlivenessMonitorService alivenessMonitorService) {
52 super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class);
53 this.dataBroker = dataBroker;
54 this.idManager = idManager;
55 this.mdsalApiManager = mdsalApiManager;
56 this.alivenessMonitorService = alivenessMonitorService;
60 protected InstanceIdentifier<FlowCapableNodeConnector> getWildCardPath() {
61 return InstanceIdentifier.create(Nodes.class).child(Node.class).child(NodeConnector.class)
62 .augmentation(FlowCapableNodeConnector.class);
66 protected DataChangeListener getDataChangeListener() {
67 return InterfaceInventoryStateListener.this;
71 protected AsyncDataBroker.DataChangeScope getDataChangeScope() {
72 return AsyncDataBroker.DataChangeScope.ONE;
76 protected void remove(InstanceIdentifier<FlowCapableNodeConnector> key,
77 FlowCapableNodeConnector flowCapableNodeConnectorOld) {
78 LOG.debug("Received NodeConnector Remove Event: {}, {}", key, flowCapableNodeConnectorOld);
79 String portName = flowCapableNodeConnectorOld.getName();
80 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
82 InterfaceStateRemoveWorker interfaceStateRemoveWorker = new InterfaceStateRemoveWorker(idManager,
83 key, flowCapableNodeConnectorOld, portName);
84 coordinator.enqueueJob(portName, interfaceStateRemoveWorker);
88 protected void update(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorOld,
89 FlowCapableNodeConnector fcNodeConnectorNew) {
90 LOG.debug("Received NodeConnector Update Event: {}, {}, {}", key, fcNodeConnectorOld, fcNodeConnectorNew);
91 String portName = fcNodeConnectorNew.getName();
92 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
94 InterfaceStateUpdateWorker interfaceStateUpdateWorker = new InterfaceStateUpdateWorker(key, fcNodeConnectorOld,
95 fcNodeConnectorNew, portName);
96 coordinator.enqueueJob(portName, interfaceStateUpdateWorker);
100 protected void add(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorNew) {
101 LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
102 String portName = fcNodeConnectorNew.getName();
103 NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
105 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
106 InterfaceStateAddWorker ifStateAddWorker = new InterfaceStateAddWorker(idManager, nodeConnectorId,
107 fcNodeConnectorNew, portName);
108 coordinator.enqueueJob(portName, ifStateAddWorker);
111 private class InterfaceStateAddWorker implements Callable {
112 private final NodeConnectorId nodeConnectorId;
113 private final FlowCapableNodeConnector fcNodeConnectorNew;
114 private final String portName;
115 private final IdManagerService idManager;
117 public InterfaceStateAddWorker(IdManagerService idManager, NodeConnectorId nodeConnectorId,
118 FlowCapableNodeConnector fcNodeConnectorNew,
120 this.nodeConnectorId = nodeConnectorId;
121 this.fcNodeConnectorNew = fcNodeConnectorNew;
122 this.portName = portName;
123 this.idManager = idManager;
127 public Object call() throws Exception {
128 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
129 // to call the respective helpers.
130 return OvsInterfaceStateAddHelper.addState(dataBroker, idManager, mdsalApiManager, alivenessMonitorService, nodeConnectorId,
131 portName, fcNodeConnectorNew);
135 public String toString() {
136 return "InterfaceStateAddWorker{" +
137 "nodeConnectorId=" + nodeConnectorId +
138 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
139 ", portName='" + portName + '\'' +
144 private class InterfaceStateUpdateWorker implements Callable {
145 private InstanceIdentifier<FlowCapableNodeConnector> key;
146 private final FlowCapableNodeConnector fcNodeConnectorOld;
147 private final FlowCapableNodeConnector fcNodeConnectorNew;
148 private String portName;
151 public InterfaceStateUpdateWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
152 FlowCapableNodeConnector fcNodeConnectorOld,
153 FlowCapableNodeConnector fcNodeConnectorNew,
156 this.fcNodeConnectorOld = fcNodeConnectorOld;
157 this.fcNodeConnectorNew = fcNodeConnectorNew;
158 this.portName = portName;
162 public Object call() throws Exception {
163 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
164 // to call the respective helpers.
165 return OvsInterfaceStateUpdateHelper.updateState(key, alivenessMonitorService, dataBroker, portName,
166 fcNodeConnectorNew, fcNodeConnectorOld);
170 public String toString() {
171 return "InterfaceStateUpdateWorker{" +
173 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
174 ", fcNodeConnectorNew=" + fcNodeConnectorNew +
175 ", portName='" + portName + '\'' +
180 private class InterfaceStateRemoveWorker implements Callable {
181 InstanceIdentifier<FlowCapableNodeConnector> key;
182 FlowCapableNodeConnector fcNodeConnectorOld;
183 private final String portName;
184 private final IdManagerService idManager;
186 public InterfaceStateRemoveWorker(IdManagerService idManager,
187 InstanceIdentifier<FlowCapableNodeConnector> key,
188 FlowCapableNodeConnector fcNodeConnectorOld,
191 this.fcNodeConnectorOld = fcNodeConnectorOld;
192 this.portName = portName;
193 this.idManager = idManager;
197 public Object call() throws Exception {
198 // If another renderer(for eg : CSS) needs to be supported, check can be performed here
199 // to call the respective helpers.
200 return OvsInterfaceStateRemoveHelper.removeState(idManager, mdsalApiManager, alivenessMonitorService,
201 key, dataBroker, portName, fcNodeConnectorOld);
205 public String toString() {
206 return "InterfaceStateRemoveWorker{" +
208 ", fcNodeConnectorOld=" + fcNodeConnectorOld +
209 ", portName='" + portName + '\'' +