Imported vpnservice as a subtree
[netvirt.git] / vpnservice / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / servicebindings / flowbased / listeners / FlowBasedServicesInterfaceStateListener.java
1 /*
2  * Copyright (c) 2015 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.servicebindings.flowbased.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.servicebindings.flowbased.statehelpers.FlowBasedServicesStateBindHelper;
15 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.statehelpers.FlowBasedServicesStateUnbindHelper;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 import java.util.List;
23 import java.util.concurrent.Callable;
24
25 public class FlowBasedServicesInterfaceStateListener extends AsyncDataTreeChangeListenerBase<Interface, FlowBasedServicesInterfaceStateListener> {
26     private static final Logger LOG = LoggerFactory.getLogger(FlowBasedServicesInterfaceStateListener.class);
27     private DataBroker dataBroker;
28
29     public FlowBasedServicesInterfaceStateListener(final DataBroker dataBroker) {
30         super(Interface.class, FlowBasedServicesInterfaceStateListener.class);
31         this.dataBroker = dataBroker;
32     }
33
34     @Override
35     protected InstanceIdentifier<Interface> getWildCardPath() {
36         return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
37     }
38
39     @Override
40     protected void remove(InstanceIdentifier<Interface> key, Interface interfaceStateOld) {
41         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
42         RendererStateInterfaceUnbindWorker stateUnbindWorker =
43                 new RendererStateInterfaceUnbindWorker(interfaceStateOld);
44         coordinator.enqueueJob(interfaceStateOld.getName(), stateUnbindWorker);
45     }
46
47     @Override
48     protected void update(InstanceIdentifier<Interface> key, Interface interfaceStateOld, Interface interfaceStateNew) {
49         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
50         if (interfaceStateNew.getOperStatus() == Interface.OperStatus.Down) {
51             RendererStateInterfaceUnbindWorker stateUnbindWorker =
52                     new RendererStateInterfaceUnbindWorker(interfaceStateNew);
53             coordinator.enqueueJob(interfaceStateNew.getName(), stateUnbindWorker);
54             return;
55         }
56
57         RendererStateInterfaceBindWorker stateBindWorker = new RendererStateInterfaceBindWorker(interfaceStateNew);
58         coordinator.enqueueJob(interfaceStateNew.getName(), stateBindWorker);
59     }
60
61     @Override
62     protected void add(InstanceIdentifier<Interface> key, Interface interfaceStateNew) {
63         if (interfaceStateNew.getOperStatus() == Interface.OperStatus.Down) {
64             LOG.info("Interface: {} operstate is down when adding. Not Binding services", interfaceStateNew.getName());
65             return;
66         }
67
68         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
69         RendererStateInterfaceBindWorker stateBindWorker = new RendererStateInterfaceBindWorker(interfaceStateNew);
70         coordinator.enqueueJob(interfaceStateNew.getName(), stateBindWorker);
71     }
72
73     @Override
74     protected FlowBasedServicesInterfaceStateListener getDataTreeChangeListener() {
75         return FlowBasedServicesInterfaceStateListener.this;
76     }
77
78     private class RendererStateInterfaceBindWorker implements Callable<List<ListenableFuture<Void>>> {
79         Interface iface;
80
81         public RendererStateInterfaceBindWorker(Interface iface) {
82             this.iface = iface;
83         }
84
85         @Override
86         public List<ListenableFuture<Void>> call() throws Exception {
87             return FlowBasedServicesStateBindHelper.bindServicesOnInterface(iface, dataBroker);
88         }
89     }
90
91     private class RendererStateInterfaceUnbindWorker implements Callable<List<ListenableFuture<Void>>> {
92         Interface iface;
93
94         public RendererStateInterfaceUnbindWorker(Interface iface) {
95             this.iface = iface;
96         }
97
98         @Override
99         public List<ListenableFuture<Void>> call() throws Exception {
100             return FlowBasedServicesStateUnbindHelper.unbindServicesFromInterface(iface, dataBroker);
101         }
102     }
103 }