Working with OVS
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / servicebindings / flowbased / listeners / FlowBasedServicesInterfaceStateListener.java
diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/listeners/FlowBasedServicesInterfaceStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/servicebindings/flowbased/listeners/FlowBasedServicesInterfaceStateListener.java
new file mode 100644 (file)
index 0000000..9ec65bc
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.listeners;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.statehelpers.FlowBasedServicesStateBindHelper;
+import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.statehelpers.FlowBasedServicesStateUnbindHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class FlowBasedServicesInterfaceStateListener extends AsyncDataTreeChangeListenerBase<Interface, FlowBasedServicesInterfaceStateListener> {
+    private static final Logger LOG = LoggerFactory.getLogger(FlowBasedServicesInterfaceStateListener.class);
+    private DataBroker dataBroker;
+
+    public FlowBasedServicesInterfaceStateListener(final DataBroker dataBroker) {
+        super(Interface.class, FlowBasedServicesInterfaceStateListener.class);
+        this.dataBroker = dataBroker;
+    }
+
+    @Override
+    protected InstanceIdentifier<Interface> getWildCardPath() {
+        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
+    }
+
+    @Override
+    protected void remove(InstanceIdentifier<Interface> key, Interface interfaceStateOld) {
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+        RendererStateInterfaceUnbindWorker stateUnbindWorker =
+                new RendererStateInterfaceUnbindWorker(interfaceStateOld);
+        coordinator.enqueueJob(interfaceStateOld.getName(), stateUnbindWorker);
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<Interface> key, Interface interfaceStateOld, Interface interfaceStateNew) {
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+        if (interfaceStateNew.getOperStatus() == Interface.OperStatus.Down) {
+            RendererStateInterfaceUnbindWorker stateUnbindWorker =
+                    new RendererStateInterfaceUnbindWorker(interfaceStateNew);
+            coordinator.enqueueJob(interfaceStateNew.getName(), stateUnbindWorker);
+            return;
+        }
+
+        RendererStateInterfaceBindWorker stateBindWorker = new RendererStateInterfaceBindWorker(interfaceStateNew);
+        coordinator.enqueueJob(interfaceStateNew.getName(), stateBindWorker);
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<Interface> key, Interface interfaceStateNew) {
+        if (interfaceStateNew.getOperStatus() == Interface.OperStatus.Down) {
+            LOG.info("Interface: {} operstate is down when adding. Not Binding services", interfaceStateNew.getName());
+            return;
+        }
+
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+        RendererStateInterfaceBindWorker stateBindWorker = new RendererStateInterfaceBindWorker(interfaceStateNew);
+        coordinator.enqueueJob(interfaceStateNew.getName(), stateBindWorker);
+    }
+
+    @Override
+    protected FlowBasedServicesInterfaceStateListener getDataTreeChangeListener() {
+        return FlowBasedServicesInterfaceStateListener.this;
+    }
+
+    private class RendererStateInterfaceBindWorker implements Callable<List<ListenableFuture<Void>>> {
+        Interface iface;
+
+        public RendererStateInterfaceBindWorker(Interface iface) {
+            this.iface = iface;
+        }
+
+        @Override
+        public List<ListenableFuture<Void>> call() throws Exception {
+            return FlowBasedServicesStateBindHelper.bindServicesOnInterface(iface, dataBroker);
+        }
+    }
+
+    private class RendererStateInterfaceUnbindWorker implements Callable<List<ListenableFuture<Void>>> {
+        Interface iface;
+
+        public RendererStateInterfaceUnbindWorker(Interface iface) {
+            this.iface = iface;
+        }
+
+        @Override
+        public List<ListenableFuture<Void>> call() throws Exception {
+            return FlowBasedServicesStateUnbindHelper.unbindServicesFromInterface(iface, dataBroker);
+        }
+    }
+}
\ No newline at end of file