Wait to process datastore until providers are ready
authorSam Hague <shague@redhat.com>
Tue, 26 May 2015 16:49:15 +0000 (12:49 -0400)
committerSam Hague <shague@redhat.com>
Tue, 26 May 2015 18:10:15 +0000 (14:10 -0400)
Change-Id: I51d54ee77cd1b9b130edffba6b62829e33f7bf6d
Signed-off-by: Sam Hague <shague@redhat.com>
openstack/net-virt-it/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/it/NetvirtIT.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/MdsalHelper.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/MdsalUtils.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/SouthboundHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbInventoryListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/api/OvsdbInventoryService.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbDataChangeListener.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/OvsdbInventoryServiceImpl.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/ProviderNetworkManagerImpl.java

index c5973775b268d0cefdff1145e50150c680228392..4faf64bc9ac6f6feae3b3a6e7fee2df7af41767d 100644 (file)
@@ -584,4 +584,13 @@ public class NetvirtIT extends AbstractMdsalTestBase {
     public void testNetVirt2() throws InterruptedException {
         Thread.sleep(60000);
     }
+
+    @Test
+    public void testReadOvsdbTopologyNodes() throws InterruptedException {
+        Thread.sleep(10000);
+        List<Node> ovsdbNodes = org.opendaylight.ovsdb.openstack.netvirt.MdsalUtils.readOvsdbTopologyNodes();
+        for (Node node : ovsdbNodes) {
+            LOG.info(">>>>> node: {}", node);
+        }
+    }
 }
index d6a3ac7e3b981e612d3cdd94b9cc0c7be5811449..0d391862c5617e8166f5b1d047602ca1dbd62a5d 100644 (file)
@@ -108,6 +108,13 @@ public class MdsalHelper {
         return createManagedNodeId(key.getRemoteIp(), key.getRemotePort(), bridgeName);
     }
 
+    public static InstanceIdentifier<Topology> createInstanceIdentifier() {
+        InstanceIdentifier<Topology> path = InstanceIdentifier
+                .create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID));
+        return path;
+    }
+
     public static InstanceIdentifier<Node> createInstanceIdentifier(NodeId nodeId) {
         InstanceIdentifier<Node> nodePath = InstanceIdentifier
                 .create(NetworkTopology.class)
index 40bbc73a0e13e1755c308da05bdeea8ea135018f..f5221e50a36c4cbabe8376f137a80f7137348211 100644 (file)
@@ -22,7 +22,6 @@ import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbTables;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 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.OvsdbBridgeAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
@@ -211,6 +210,21 @@ public class MdsalUtils {
         return ovsdbNodeId;
     }
 
+    public static List<Node> readOvsdbTopologyNodes() {
+        List<Node> ovsdbNodes = new ArrayList<>();
+        InstanceIdentifier<Topology> topologyInstanceIdentifier = MdsalHelper.createInstanceIdentifier();
+        Topology topology = read(LogicalDatastoreType.OPERATIONAL, topologyInstanceIdentifier);
+        if (topology != null && topology.getNode() != null) {
+            for (Node node : topology.getNode()) {
+                OvsdbNodeAugmentation ovsdbNodeAugmentation = node.getAugmentation(OvsdbNodeAugmentation.class);
+                if (ovsdbNodeAugmentation != null) {
+                    ovsdbNodes.add(node);
+                }
+            }
+        }
+        return ovsdbNodes;
+    }
+
     public static OvsdbNodeAugmentation readOvsdbNode(Node bridgeNode) {
         OvsdbNodeAugmentation nodeAugmentation = null;
         OvsdbBridgeAugmentation bridgeAugmentation = extractBridgeAugmentation(bridgeNode);
@@ -334,11 +348,11 @@ public class MdsalUtils {
         return bridgeNode;
     }
 
-    public static Uuid getBridgeUuid(Node node, String name) {
-        Uuid uuid = null;
+    public static String getBridgeUuid(Node node, String name) {
+        String uuid = null;
         OvsdbBridgeAugmentation ovsdbBridgeAugmentation = readBridge(node, name);
         if (ovsdbBridgeAugmentation != null) {
-            uuid = ovsdbBridgeAugmentation.getBridgeUuid();
+            uuid = ovsdbBridgeAugmentation.getBridgeUuid().getValue();
         }
         return uuid;
     }
index 0d8e3092923e92bf65dead0765eabbd3de35b995..3a7cbe964ed81b04027f6f2a290aab94ad760628 100644 (file)
@@ -44,14 +44,6 @@ public class SouthboundHandler extends AbstractHandler
     private volatile EventDispatcher eventDispatcher;
     private volatile OvsdbInventoryService ovsdbInventoryService;
 
-    void start() {
-        this.triggerUpdates();
-    }
-
-    /*void init() {
-        logger.info(">>>>>> init {}", this.getClass());
-    }*/
-
     private SouthboundEvent.Type ovsdbTypeToSouthboundEventType(OvsdbType ovsdbType) {
         SouthboundEvent.Type type = SouthboundEvent.Type.NODE;
 
@@ -123,22 +115,13 @@ public class SouthboundHandler extends AbstractHandler
         }
     }
 
-    private void triggerUpdates() {
-        List<Node> nodes = null; // nodeCacheManager.getBridgeNodes();
-        if (nodes == null) return;
-        for (Node node : nodes) {
-            OvsdbBridgeAugmentation bridge = node.getAugmentation(OvsdbBridgeAugmentation.class);
-            if (bridge != null) {
-                processBridgeUpdate(node, bridge);
-            }
-
-            List<TerminationPoint> tps = MdsalUtils.extractTerminationPoints(node);
-            for (TerminationPoint tp : tps) {
-                OvsdbTerminationPointAugmentation port = tp.getAugmentation(OvsdbTerminationPointAugmentation.class);
-                if (port != null) {
-                    processPortUpdate(node, port);
-                }
-            }
+    @Override
+    public void triggerUpdates() {
+        logger.info("triggerUpdates");
+        List<Node> ovsdbNodes = MdsalUtils.readOvsdbTopologyNodes();
+        for (Node node : ovsdbNodes) {
+            ovsdbUpdate(node, node.getAugmentation(OvsdbNodeAugmentation.class),
+                    OvsdbInventoryListener.OvsdbType.NODE, Action.ADD);
         }
     }
 
index cf7f842ed787694eab9f7c8e6118dad8ad046bb3..65ec353e47d1f309ac69c92b43d3381d7ef9ab2b 100644 (file)
@@ -13,5 +13,5 @@ public interface OvsdbInventoryListener {
         PORT
     }
     public void ovsdbUpdate(Node node, DataObject augmentationDataChanges, OvsdbType type, Action action);
-
+    public void triggerUpdates();
 }
index 2a21edc6a3337949faf5eefc21a595c1912bf0e8..c4309cdb5c428427c84994bfca58b604bcb98436 100644 (file)
@@ -15,4 +15,5 @@ package org.opendaylight.ovsdb.openstack.netvirt.api;
 public interface OvsdbInventoryService {
     public void listenerAdded(OvsdbInventoryListener listener);
     public void listenerRemoved(OvsdbInventoryListener listener);
+    public void providersReady();
 }
index 1f698a89ccb629aa7d8fa1ee46679b3614ad2dad..536e70c1ca8a00b713f44951fc966ab616d0b524 100644 (file)
@@ -47,6 +47,9 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl
 
     public OvsdbDataChangeListener (DataBroker dataBroker) {
         this.dataBroker = dataBroker;
+    }
+
+    public void start() {
         InstanceIdentifier<Node> path = InstanceIdentifier
                 .create(NetworkTopology.class)
                 .child(Topology.class, new TopologyKey(MdsalHelper.OVSDB_TOPOLOGY_ID))
@@ -55,6 +58,7 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl
                 DataChangeScope.SUBTREE);
         LOG.info("netvirt OvsdbDataChangeListener: dataBroker= {}, registration= {}",
                 dataBroker, registration);
+        triggerUpdates();
     }
 
     @Override
@@ -329,4 +333,11 @@ public class OvsdbDataChangeListener implements DataChangeListener, AutoCloseabl
             mdsalConsumerListener.ovsdbUpdate(node, resourceAugmentationDataChanges, ovsdbType, action);
         }
     }
+
+    private void triggerUpdates() {
+        Set<OvsdbInventoryListener> mdsalConsumerListeners = OvsdbInventoryServiceImpl.getMdsalConsumerListeners();
+        for (OvsdbInventoryListener mdsalConsumerListener : mdsalConsumerListeners) {
+            mdsalConsumerListener.triggerUpdates();
+        }
+    }
 }
index 4235af42c6f47b9e5b7d465d2e163abfc3e00aab..30fe2e9060801a00a02db1a49048e9ec730c012e 100644 (file)
@@ -86,6 +86,11 @@ public class OvsdbInventoryServiceImpl implements ConfigInterface, OvsdbInventor
         LOG.info("listenerRemoved: {}", listener);
     }
 
+    @Override
+    public void providersReady() {
+        ovsdbDataChangeListener.start();
+    }
+
     public static Set<OvsdbInventoryListener> getMdsalConsumerListeners() {
         return mdsalConsumerListeners;
     }
index 5f6eac6bdd20d8af0ac5c898822e7c7bea87455f..a1b081255ee17ce1db3c5a5598cacc5d4524a247 100644 (file)
@@ -16,6 +16,8 @@ import org.opendaylight.ovsdb.openstack.netvirt.ConfigInterface;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
+import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbInventoryService;
+import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -30,6 +32,7 @@ public class ProviderNetworkManagerImpl implements ConfigInterface, NetworkingPr
     static final Logger logger = LoggerFactory.getLogger(ProviderNetworkManagerImpl.class);
     private HashMap<Long, ProviderEntry> providers = Maps.newHashMap();
     private HashMap<Node, NetworkingProvider> nodeToProviderMapping = Maps.newHashMap();
+    private volatile OvsdbInventoryService ovsdbInventoryService;
 
     @Override
     public NetworkingProvider getProvider(Node node) {
@@ -69,6 +72,8 @@ public class ProviderNetworkManagerImpl implements ConfigInterface, NetworkingPr
         providers.put(pid, new ProviderEntry(provider, properties));
         logger.info("Neutron Networking Provider Registered: {}, with {} and pid={}",
                 provider.getClass().getName(), properties.toString(), pid);
+
+        ovsdbInventoryService.providersReady();
     }
 
     public void providerRemoved(final ServiceReference ref){
@@ -79,7 +84,8 @@ public class ProviderNetworkManagerImpl implements ConfigInterface, NetworkingPr
 
     @Override
     public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
-
+        ovsdbInventoryService =
+                (OvsdbInventoryService) ServiceHelper.getGlobalInstance(OvsdbInventoryService.class, this);
     }
 
     @Override