Bug 5265: Failed to deploy multiple instances of BMP monitoring station 76/34376/1
authorMilos Fabian <milfabia@cisco.com>
Mon, 8 Feb 2016 09:42:21 +0000 (10:42 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 10 Feb 2016 09:35:51 +0000 (09:35 +0000)
Avoid overriding of previously created instance.
Create common parent node using merge operation.

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

bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java
bgp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java

index 5582e9e9713ca9906c4dd27477fa53f9e4d6e561..17edcc66964e16ebce1996297037667f6b3bca83 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeConte
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -122,19 +123,22 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation {
         return new BmpMonitoringStationImpl(domDataBroker, yangMonitorId, channelFuture.sync().channel(), sessionManager, monitorId, dispatcher, mrs);
     }
 
+    private static void ensureParentExists(final DOMDataWriteTransaction wTx, final YangInstanceIdentifier path) {
+        final ContainerNode parentNode = Builders.containerBuilder().withNodeIdentifier(
+                new NodeIdentifier(BmpMonitor.QNAME)).addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME).build()).build();
+        wTx.merge(LogicalDatastoreType.OPERATIONAL, path, parentNode);
+    }
+
     private void createEmptyMonitor() {
         final DOMDataWriteTransaction wTx = this.domDataBroker.newWriteOnlyTransaction();
+        ensureParentExists(wTx, YangInstanceIdentifier.of(BmpMonitor.QNAME));
         wTx.put(LogicalDatastoreType.OPERATIONAL,
-                YangInstanceIdentifier.of(BmpMonitor.QNAME),
-                Builders.containerBuilder()
-                .withNodeIdentifier(
-                        new NodeIdentifier(BmpMonitor.QNAME))
-                        .addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME)
-                                .addChild(ImmutableNodes.mapEntryBuilder(Monitor.QNAME, MONITOR_ID_QNAME, this.monitorId.getValue())
-                                        .addChild(ImmutableNodes.leafNode(MONITOR_ID_QNAME, this.monitorId.getValue()))
-                                        .addChild(ImmutableNodes.mapNodeBuilder(Router.QNAME).build())
-                                        .build()).build())
-                        .build());
+                YangInstanceIdentifier.builder().node(BmpMonitor.QNAME).node(Monitor.QNAME)
+                    .nodeWithKey(Monitor.QNAME, MONITOR_ID_QNAME, this.monitorId.getValue()).build(),
+                ImmutableNodes.mapEntryBuilder(Monitor.QNAME, MONITOR_ID_QNAME, this.monitorId.getValue())
+                    .addChild(ImmutableNodes.leafNode(MONITOR_ID_QNAME, this.monitorId.getValue()))
+                    .addChild(ImmutableNodes.mapNodeBuilder(Router.QNAME).build())
+                    .build());
         try {
             wTx.submit().checkedGet();
         } catch (final TransactionCommitFailedException e) {
index 1d41ea749e2eaa184433c3dbbaf1bb038a9e5410..06216da7a3c157fa8c615f6a277da79580ca6945 100644 (file)
@@ -130,6 +130,7 @@ public class BmpMonitorImplTest extends AbstractDataBrokerTest {
     private MD5NioServerSocketChannelFactory scfServerMd5;
     private MD5NioSocketChannelFactory scfMd5;
     private List<MonitoredRouter> mrs;
+    private ModuleInfoBackedContext moduleInfoBackedContext;
 
     @Mock private KeyAccess mockKeyAccess;
     @Mock private KeyAccessFactory kaf;
@@ -139,16 +140,16 @@ public class BmpMonitorImplTest extends AbstractDataBrokerTest {
         MockitoAnnotations.initMocks(this);
         this.mappingService = new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
                 new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))));
-        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(InitiationMessage.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(CParameters1.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(BgpParameters.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(MultiprotocolCapability.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(DestinationIpv4Case.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(AdvertizedRoutes.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(SentOpen.class));
-        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(ReceivedOpen.class));
-        this.mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
+        this.moduleInfoBackedContext = ModuleInfoBackedContext.create();
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(InitiationMessage.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(CParameters1.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(BgpParameters.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(MultiprotocolCapability.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(DestinationIpv4Case.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(AdvertizedRoutes.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(SentOpen.class));
+        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(ReceivedOpen.class));
+        this.mappingService.onGlobalContextUpdated(this.moduleInfoBackedContext.tryToCreateSchemaContext().get());
 
         final KeyMapping keys = new KeyMapping();
         keys.put(InetAddresses.forString(LOCAL_ADDRESS), MD5_PASSWORD.getBytes(Charsets.US_ASCII));
@@ -321,6 +322,16 @@ public class BmpMonitorImplTest extends AbstractDataBrokerTest {
         }
     }
 
+    @Test
+    public void deploySecondInstance() throws Exception {
+        final BmpMonitoringStation monitoringStation2 = BmpMonitoringStationImpl.createBmpMonitorInstance(new SimpleRIBExtensionProviderContext(), this.dispatcher, getDomBroker(),
+                new MonitorId("monitor2"), new InetSocketAddress(InetAddresses.forString("127.0.0.11"), PORT), Optional.of(new KeyMapping()),
+                this.mappingService.getCodecFactory(), this.moduleInfoBackedContext.getSchemaContext(), this.mrs);
+        final BmpMonitor monitor = getBmpData(InstanceIdentifier.create(BmpMonitor.class)).get();
+        Assert.assertEquals(2, monitor.getMonitor().size());
+        monitoringStation2.close();
+    }
+
     private ChannelFuture connectTestClient(final BmpMessageRegistry msgRegistry) throws InterruptedException {
         final BmpHandlerFactory hf = new BmpHandlerFactory(msgRegistry);
         final Bootstrap b = new Bootstrap();