4cb1e224c267b15977db051bf46dbbf0a4fcdb6a
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / listeners / HwVTEPConfigListener.java
1 /*
2  * Copyright (c) 2016 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 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.interfaces._interface.NodeIdentifier;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import java.util.List;
28 import java.util.concurrent.Callable;
29
30 public class HwVTEPConfigListener extends AsyncDataTreeChangeListenerBase<Interface, HwVTEPConfigListener> {
31     private static final Logger LOG = LoggerFactory.getLogger(HwVTEPConfigListener.class);
32     private DataBroker dataBroker;
33
34     public HwVTEPConfigListener(final DataBroker dataBroker) {
35         super(Interface.class, HwVTEPConfigListener.class);
36         this.dataBroker = dataBroker;
37     }
38
39     @Override
40     protected InstanceIdentifier<Interface> getWildCardPath() {
41         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
42     }
43
44     @Override
45     protected void remove(InstanceIdentifier<Interface> key, Interface interfaceOld) {
46         // HwVTEPs support only vxlan
47         IfTunnel ifTunnel = interfaceOld.getAugmentation(IfTunnel.class);
48         if (ifTunnel != null && ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
49             ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
50             if (parentRefs != null) {
51                 for(NodeIdentifier nodeIdentifier : parentRefs.getNodeIdentifier()) {
52                     if(nodeIdentifier.getNodeId().equals("hwvtep:1")) {
53                         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
54                         RendererConfigRemoveWorker configWorker = new RendererConfigRemoveWorker(key, interfaceOld, parentRefs);
55                         coordinator.enqueueJob(interfaceOld.getName(), configWorker);
56                     }
57                 }
58             }
59         }
60     }
61
62     @Override
63     protected void update(InstanceIdentifier<Interface> key, Interface interfaceOld, Interface interfaceNew) {
64         // TODO
65     }
66
67     @Override
68     protected void add(InstanceIdentifier<Interface> key, Interface interfaceNew) {
69         // HwVTEPs support only vxlan
70         IfTunnel ifTunnel = interfaceNew.getAugmentation(IfTunnel.class);
71         if (ifTunnel != null && ifTunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeVxlan.class)) {
72             ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
73             if (parentRefs != null) {
74                 for(NodeIdentifier nodeIdentifier : parentRefs.getNodeIdentifier()) {
75                     if(nodeIdentifier.getNodeId().equals("hwvtep:1")) {
76                         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
77                         RendererConfigAddWorker configWorker = new RendererConfigAddWorker(key, interfaceNew, parentRefs);
78                         coordinator.enqueueJob(interfaceNew.getName(), configWorker);
79                     }
80                 }
81             }
82         }
83     }
84
85     @Override
86     protected HwVTEPConfigListener getDataTreeChangeListener() {
87         return HwVTEPConfigListener.this;
88     }
89
90     private class RendererConfigAddWorker implements Callable<List<ListenableFuture<Void>>> {
91         InstanceIdentifier<Interface> key;
92         Interface interfaceNew;
93         IfL2vlan ifL2vlan;
94         ParentRefs parentRefs;
95
96         public RendererConfigAddWorker(InstanceIdentifier<Interface> key, Interface interfaceNew,
97                                        ParentRefs parentRefs) {
98             this.key = key;
99             this.interfaceNew = interfaceNew;
100             this.ifL2vlan = ifL2vlan;
101             this.parentRefs = parentRefs;
102         }
103
104         @Override
105         public List<ListenableFuture<Void>> call() throws Exception {
106             return HwVTEPInterfaceConfigAddHelper.addConfiguration(dataBroker, parentRefs, interfaceNew);
107         }
108     }
109
110     private class RendererConfigRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
111         InstanceIdentifier<Interface> key;
112         Interface interfaceOld;
113         ParentRefs parentRefs;
114
115         public RendererConfigRemoveWorker(InstanceIdentifier<Interface> key, Interface interfaceOld,
116                                           ParentRefs parentRefs) {
117             this.key = key;
118             this.interfaceOld = interfaceOld;
119             this.parentRefs = parentRefs;
120         }
121
122         @Override
123         public List<ListenableFuture<Void>> call() throws Exception {
124             return HwVTEPConfigRemoveHelper.removeConfiguration(dataBroker, interfaceOld, parentRefs);
125         }
126     }
127 }