HwVTEP support for interfacemanager
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / listeners / TerminationPointStateListener.java
diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/TerminationPointStateListener.java
new file mode 100644 (file)
index 0000000..9d9debc
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016 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.listeners;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
+import org.opendaylight.vpnservice.datastoreutils.AsyncDataChangeListenerBase;
+import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceTopologyStateUpdateHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+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 TerminationPointStateListener extends AsyncDataChangeListenerBase<OvsdbTerminationPointAugmentation, TerminationPointStateListener> {
+    private static final Logger LOG = LoggerFactory.getLogger(TerminationPointStateListener.class);
+    private DataBroker dataBroker;
+
+    public TerminationPointStateListener(DataBroker dataBroker) {
+        super(OvsdbTerminationPointAugmentation.class, TerminationPointStateListener.class);
+        this.dataBroker = dataBroker;
+    }
+
+    @Override
+    protected InstanceIdentifier<OvsdbTerminationPointAugmentation> getWildCardPath() {
+        return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class)
+                .child(Node.class).child(TerminationPoint.class).augmentation(OvsdbTerminationPointAugmentation.class).build();
+    }
+
+    @Override
+    protected DataChangeListener getDataChangeListener() {
+        return TerminationPointStateListener.this;
+    }
+
+    @Override
+    protected AsyncDataBroker.DataChangeScope getDataChangeScope() {
+        return AsyncDataBroker.DataChangeScope.ONE;
+    }
+
+    @Override
+    protected void remove(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
+                          OvsdbTerminationPointAugmentation tpOld) {
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
+                          OvsdbTerminationPointAugmentation tpOld,
+                          OvsdbTerminationPointAugmentation tpNew) {
+        LOG.debug("Received Update DataChange Notification for ovsdb termination point identifier: {},  old: {}, new: {}.",
+                identifier, tpOld, tpNew);
+        if (tpNew.getInterfaceBfdStatus() != null &&
+                !tpNew.getInterfaceBfdStatus().equals(tpOld.getInterfaceBfdStatus())) {
+            DataStoreJobCoordinator jobCoordinator = DataStoreJobCoordinator.getInstance();
+            RendererStateUpdateWorker rendererStateAddWorker = new RendererStateUpdateWorker(identifier, tpNew, tpOld);
+            jobCoordinator.enqueueJob(tpNew.getName(), rendererStateAddWorker);
+        }
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
+                       OvsdbTerminationPointAugmentation tpNew) {
+
+    }
+
+    private class RendererStateUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
+        InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier;
+        OvsdbTerminationPointAugmentation terminationPointNew;
+        OvsdbTerminationPointAugmentation terminationPointOld;
+
+
+        public RendererStateUpdateWorker(InstanceIdentifier<OvsdbTerminationPointAugmentation> instanceIdentifier,
+                                         OvsdbTerminationPointAugmentation tpNew, OvsdbTerminationPointAugmentation tpOld) {
+            this.instanceIdentifier = instanceIdentifier;
+            this.terminationPointNew = tpNew;
+            this.terminationPointOld = tpOld;
+        }
+
+        @Override
+        public List<ListenableFuture<Void>> call() throws Exception {
+            // If another renderer(for eg : CSS) needs to be supported, check can be performed here
+            // to call the respective helpers.
+            return OvsInterfaceTopologyStateUpdateHelper.updateTunnelState(dataBroker,
+                    terminationPointNew, terminationPointOld);
+        }
+    }
+}
\ No newline at end of file