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.vpnservice.interfacemgr.listeners;
10 import com.google.common.util.concurrent.ListenableFuture;
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
13 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
14 import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.confighelpers.HwVTEPConfigRemoveHelper;
15 import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.confighelpers.HwVTEPInterfaceConfigAddHelper;
16 import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.confighelpers.HwVTEPInterfaceConfigUpdateHelper;
17 import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.SouthboundUtils;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.interfaces._interface.NodeIdentifier;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import java.util.List;
32 import java.util.concurrent.Callable;
34 public class HwVTEPConfigListener extends AsyncDataTreeChangeListenerBase<Interface, HwVTEPConfigListener> {
35 private static final Logger LOG = LoggerFactory.getLogger(HwVTEPConfigListener.class);
36 private DataBroker dataBroker;
38 public HwVTEPConfigListener(final DataBroker dataBroker) {
39 super(Interface.class, HwVTEPConfigListener.class);
40 this.dataBroker = dataBroker;
44 protected InstanceIdentifier<Interface> getWildCardPath() {
45 return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
49 protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
50 // HwVTEPs support only vxlan
51 IfTunnel ifTunnel = interfaceOld.getAugmentation(IfTunnel.class);
52 if (ifTunnel != null && ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
53 ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
54 if (parentRefs != null && parentRefs.getNodeIdentifier() != null) {
55 for(NodeIdentifier nodeIdentifier : parentRefs.getNodeIdentifier()) {
56 if(SouthboundUtils.HWVTEP_TOPOLOGY.equals(nodeIdentifier.getTopologyId())) {
57 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
58 RendererConfigRemoveWorker configWorker = new RendererConfigRemoveWorker(key, interfaceOld,
59 SouthboundUtils.createPhysicalSwitchInstanceIdentifier(nodeIdentifier.getNodeId()),
60 SouthboundUtils.createGlobalNodeInstanceIdentifier(dataBroker, nodeIdentifier.getNodeId()));
61 coordinator.enqueueJob(interfaceOld.getName(), configWorker);
69 protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
70 // HwVTEPs support only vxlan
71 IfTunnel ifTunnel = interfaceNew.getAugmentation(IfTunnel.class);
72 if (ifTunnel != null && ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
73 ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
74 if (parentRefs != null && parentRefs.getNodeIdentifier() != null) {
75 for(NodeIdentifier nodeIdentifier : parentRefs.getNodeIdentifier()) {
76 if(SouthboundUtils.HWVTEP_TOPOLOGY.equals(nodeIdentifier.getTopologyId())) {
77 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
78 RendererConfigUpdateWorker configWorker = new RendererConfigUpdateWorker(key, interfaceNew,
79 SouthboundUtils.createPhysicalSwitchInstanceIdentifier(nodeIdentifier.getNodeId()),
80 SouthboundUtils.createGlobalNodeInstanceIdentifier(dataBroker, nodeIdentifier.getNodeId()), ifTunnel);
81 coordinator.enqueueJob(interfaceNew.getName(), configWorker, 3);
89 protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
90 // HwVTEPs support only vxlan
91 IfTunnel ifTunnel = interfaceNew.getAugmentation(IfTunnel.class);
92 if (ifTunnel != null && ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
93 ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
94 if (parentRefs != null && parentRefs.getNodeIdentifier() != null) {
95 for(NodeIdentifier nodeIdentifier : parentRefs.getNodeIdentifier()) {
96 if(SouthboundUtils.HWVTEP_TOPOLOGY.equals(nodeIdentifier.getTopologyId())) {
97 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
98 RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew,
99 SouthboundUtils.createPhysicalSwitchInstanceIdentifier(nodeIdentifier.getNodeId()),
100 SouthboundUtils.createGlobalNodeInstanceIdentifier(dataBroker, nodeIdentifier.getNodeId()), ifTunnel);
101 coordinator.enqueueJob(interfaceNew.getName(), configWorker, 3);
109 protected HwVTEPConfigListener getDataTreeChangeListener() {
110 return HwVTEPConfigListener.this;
113 private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
114 InstanceIdentifier<Interface> key;
115 Interface interfaceNew;
116 InstanceIdentifier<Node> physicalSwitchNodeId;
117 InstanceIdentifier<Node> globalNodeId;
120 public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
121 InstanceIdentifier<Node> physicalSwitchNodeId, InstanceIdentifier<Node> globalNodeId, IfTunnel ifTunnel) {
123 this.interfaceNew = interfaceNew;
124 this.physicalSwitchNodeId = physicalSwitchNodeId;
125 this.globalNodeId = globalNodeId;
126 this.ifTunnel = ifTunnel;
130 public List<ListenableFuture<Void>> call() throws Exception {
131 return HwVTEPInterfaceConfigAddHelper.addConfiguration(dataBroker,
132 physicalSwitchNodeId, globalNodeId, interfaceNew, ifTunnel);
136 private class RendererConfigUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
137 InstanceIdentifier<Interface> key;
138 Interface interfaceNew;
139 InstanceIdentifier<Node> globalNodeId;
140 InstanceIdentifier<Node> physicalSwitchNodeId;
143 public RendererConfigUpdateWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
144 InstanceIdentifier<Node> physicalSwitchNodeId, InstanceIdentifier<Node> globalNodeId, IfTunnel ifTunnel) {
146 this.interfaceNew = interfaceNew;
147 this.physicalSwitchNodeId = physicalSwitchNodeId;
148 this.ifTunnel = ifTunnel;
149 this.globalNodeId = globalNodeId;
153 public List<ListenableFuture<Void>> call() throws Exception {
154 return HwVTEPInterfaceConfigUpdateHelper.updateConfiguration(dataBroker,
155 physicalSwitchNodeId, globalNodeId, interfaceNew, ifTunnel);
159 private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
160 InstanceIdentifier<Interface> key;
161 Interface interfaceOld;
162 InstanceIdentifier<Node> physicalSwitchNodeId;
163 InstanceIdentifier<Node> globalNodeId;
165 public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
166 InstanceIdentifier<Node> physicalSwitchNodeId, InstanceIdentifier<Node> globalNodeId) {
168 this.interfaceOld = interfaceOld;
169 this.physicalSwitchNodeId = physicalSwitchNodeId;
170 this.globalNodeId = globalNodeId;
174 public List<ListenableFuture<Void>> call() throws Exception {
175 return HwVTEPConfigRemoveHelper.removeConfiguration(dataBroker,
176 interfaceOld, globalNodeId, physicalSwitchNodeId);