Bug 5048 - Unable to deploy multiple RIB instances 40/33240/1
authorMilos Fabian <milfabia@cisco.com>
Thu, 21 Jan 2016 14:56:27 +0000 (15:56 +0100)
committerMilos Fabian <milfabia@cisco.com>
Thu, 21 Jan 2016 18:52:48 +0000 (18:52 +0000)
When creating a new RIB instances do not override
top-level parent node common for all instances.
To make sure the node exists, merge an empty structure
of parent node.

Change-Id: Ide9c9a726e078deca4ec5ad6fd06d4d3868f9706
Signed-off-by: Milos Fabian <milfabia@cisco.com>
(cherry picked from commit c9bd8c30bc308e44e5252f041927fd7c45a1c55a)

bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java

index cf022e717518cc6896c8e18caa8b65163965cf97..2c69709e3ab53cdce3a3295b30da7986db5552b2 100644 (file)
@@ -124,30 +124,31 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
         this.extensions = Preconditions.checkNotNull(extensions);
         this.codecsRegistry = CodecsRegistryImpl.create(codecFactory, classStrategy);
         this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, this.codecsRegistry);
-        this.yangRibId = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME).nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build();
+        final InstanceIdentifierBuilder yangRibIdBuilder = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME);
+        this.yangRibId = yangRibIdBuilder.nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build();
         this.configModuleTracker = moduleTracker;
         this.openConfigProvider = openConfigProvider;
 
         LOG.debug("Instantiating RIB table {} at {}", ribId, this.yangRibId);
 
-        final ContainerNode rib = Builders.containerBuilder()
+        final ContainerNode bgpRib = Builders.containerBuilder()
             .withNodeIdentifier(new NodeIdentifier(BgpRib.QNAME))
-            .addChild(ImmutableNodes.mapNodeBuilder(Rib.QNAME)
-                .addChild(ImmutableNodes.mapEntryBuilder(Rib.QNAME, RIB_ID_QNAME, ribId.getValue())
+                .addChild(ImmutableNodes.mapNodeBuilder(Rib.QNAME).build()).build();
+
+        final MapEntryNode ribInstance = Builders.mapEntryBuilder().withNodeIdentifier(
+                new NodeIdentifierWithPredicates(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()))
                     .addChild(ImmutableNodes.leafNode(RIB_ID_QNAME, ribId.getValue()))
                     .addChild(ImmutableNodes.mapNodeBuilder(Peer.QNAME).build())
                     .addChild(Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(LocRib.QNAME))
-                        .addChild(ImmutableNodes.mapNodeBuilder(Tables.QNAME).build())
-                        .build())
-                    .build())
-                    .build())
-            .build();
+                    .addChild(ImmutableNodes.mapNodeBuilder(Tables.QNAME).build())
+                    .build()).build();
 
 
         final DOMDataWriteTransaction trans = this.domChain.newWriteOnlyTransaction();
 
-        // put empty BgpRib if not exists
-        trans.put(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.builder().node(BgpRib.QNAME).build(), rib);
+        // merge empty BgpRib + Rib, to make sure the top-level parent structure is present
+        trans.merge(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.builder().node(BgpRib.QNAME).build(), bgpRib);
+        trans.put(LogicalDatastoreType.OPERATIONAL, yangRibIdBuilder.build(), ribInstance);
 
         try {
             trans.submit().checkedGet();