More southbound migration for netvirt
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / OvsdbDataChangeListener.java
index ff71536daf2d5b78a9ca76e8aa34145f19a3c1a4..9ba81ff4863652df52190dde386e8d8f11006141 100644 (file)
@@ -1,19 +1,25 @@
 package org.opendaylight.ovsdb.openstack.netvirt.impl;
 
+import java.net.UnknownHostException;
 import java.util.Map;
 import java.util.Set;
 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.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.ovsdb.lib.OvsdbClient;
 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryListener;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
+import org.opendaylight.ovsdb.southbound.SouthboundMapper;
+import org.opendaylight.ovsdb.southbound.ovsdb.transact.TransactUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
 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.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -26,14 +32,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Integration tests for southbound-impl
+ * MDSAL dataChangeListener for the OVSDB Southbound
  *
  * @author Sam Hague (shague@redhat.com)
  */
 public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(OvsdbDataChangeListener.class);
     private DataBroker dataBroker = null;
-    private static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
     private ListenerRegistration<DataChangeListener> registration;
 
     public OvsdbDataChangeListener (DataBroker dataBroker) {
@@ -45,7 +50,7 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl
                 .child(Node.class);
         registration =
                 dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, path, this,
-                        AsyncDataBroker.DataChangeScope.SUBTREE);
+                        DataChangeScope.SUBTREE);
     }
 
     @Override
@@ -55,9 +60,30 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl
 
     @Override
     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> created : changes.getCreatedData().entrySet()) {
-            if (created.getValue() instanceof Node) {
+        LOG.trace("onDataChanged: {}", changes);
+
+        updateConnections(changes);
+    }
+
+    private Node getOvsdbNode(ConnectionInfo connectionInfo) {
+        Node node = MdsalUtils.read(LogicalDatastoreType.OPERATIONAL,
+                SouthboundMapper.createInstanceIdentifier(connectionInfo));
+        return node;
+    }
+
+    public static <T extends DataObject> Map<InstanceIdentifier<T>,T> extractCreated(
+            AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,Class<T> klazz) {
+        return TransactUtils.extractCreated(changes, klazz);
+    }
 
+    private void updateConnections(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
+        for (Map.Entry<InstanceIdentifier<?>, DataObject> created : changes.getCreatedData().entrySet()) {
+            // TODO validate we have the correct kind of InstanceIdentifier
+            if (created.getValue() instanceof OvsdbNodeAugmentation) {
+                Map<InstanceIdentifier<Node>,Node> nodeMap = TransactUtils.extractCreated(changes, Node.class);
+                for (Map.Entry<InstanceIdentifier<Node>, Node> ovsdbNode: nodeMap.entrySet()) {
+                    notifyNodeAdded(ovsdbNode.getValue());
+                }
             }
         }
     }