BUG-5202: BGP Application Peer configuration failure. 45/33945/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Wed, 3 Feb 2016 12:33:28 +0000 (13:33 +0100)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Wed, 3 Feb 2016 12:39:51 +0000 (13:39 +0100)
Use ModuleKey from existing BGPApplicationPeer module,
set it to the modified module.

Change-Id: I4feb888f92194c578ca38513b16d24043ba9a15e
Signed-off-by: Milos Fabian <milfabia@cisco.com>
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPAppPeerProvider.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPConfigModuleProvider.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/DataBrokerFunction.java [new file with mode: 0644]
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPAppPeerProviderTest.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPConfigModuleProviderTest.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPPeerProviderTest.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPRibImplProviderTest.java

index 9967df1c430500c589363a6c1beaf3e71cf7ee8a..4743296484bf22174a832738e460b7bc8b98b8e0 100644 (file)
@@ -24,11 +24,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.RibInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpApplicationPeer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpApplicationPeerBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBrokerBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRib;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRibBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.rev131028.DomAsyncDataBroker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,6 +49,15 @@ final class BGPAppPeerProvider {
         }
     };
 
+    private static final Function<String, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.
+        module.configuration.bgp.application.peer.DataBroker> TO_DATABROKER_FUNCTION = new Function<String, org.opendaylight.yang.gen.v1.urn.opendaylight.
+        params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker>() {
+            @Override
+            public org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker apply(final String name) {
+                return new DataBrokerBuilder().setName(name).setType(DomAsyncDataBroker.class).build();
+            }
+        };
+
     private final BGPConfigHolder<Neighbor> neighborState;
     private final BGPConfigHolder<Bgp> globalState;
     private final BGPConfigModuleProvider configModuleOp;
@@ -97,8 +108,13 @@ final class BGPAppPeerProvider {
             final ModuleKey ribImplKey = globalState.getModuleKey(GlobalIdentifier.GLOBAL_IDENTIFIER);
             if (ribImplKey != null) {
                 try {
-                    final TargetRib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplKey.getName(), rTx);
-                    final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, rib);
+                    final String ribImplName = ribImplKey.getName();
+                    final TargetRib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplName, rTx);
+                    final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.
+                        configuration.bgp.application.peer.DataBroker moduleDataBroker = DataBrokerFunction.getRibInstance(this.configModuleOp,
+                        this.TO_DATABROKER_FUNCTION, ribImplName, rTx);
+
+                    final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, rib, moduleDataBroker);
                     configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
                     neighborState.addOrUpdate(peerConfigModule.getKey(), modifiedAppNeighbor.getKey(), modifiedAppNeighbor);
                 } catch (final Exception e) {
@@ -112,17 +128,21 @@ final class BGPAppPeerProvider {
     private static Module toPeerConfigModule(final Neighbor neighbor, final Module currentModule) {
         final BgpApplicationPeer appPeerConfig = (BgpApplicationPeer) currentModule.getConfiguration();
         final BgpApplicationPeerBuilder bgpPeerConfigBuilder = toBgpPeerConfig(neighbor, appPeerConfig.getTargetRib());
+        bgpPeerConfigBuilder.setDataBroker(appPeerConfig.getDataBroker());
         bgpPeerConfigBuilder.setApplicationRibId(appPeerConfig.getApplicationRibId());
-        final ModuleBuilder mBuilder = new ModuleBuilder();
+        final ModuleBuilder mBuilder = new ModuleBuilder(currentModule);
         mBuilder.setConfiguration(bgpPeerConfigBuilder.build());
         return mBuilder.build();
     }
 
-    private static Module toPeerConfigModule(final Neighbor neighbor, final TargetRib rib) {
+    private static Module toPeerConfigModule(final Neighbor neighbor, final TargetRib rib, final org.opendaylight.yang.gen.v1.urn.opendaylight.params.
+        xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker moduleDataBroker) {
         final ModuleBuilder mBuilder = new ModuleBuilder();
         mBuilder.setName(createAppPeerName(neighbor.getNeighborAddress().getIpv4Address()));
         mBuilder.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.BgpApplicationPeer.class);
-        mBuilder.setConfiguration(toBgpPeerConfig(neighbor, rib).build());
+        final BgpApplicationPeerBuilder bgpPeerConfigBuilder = toBgpPeerConfig(neighbor, rib);
+        bgpPeerConfigBuilder.setDataBroker(moduleDataBroker);
+        mBuilder.setConfiguration(bgpPeerConfigBuilder.build());
         mBuilder.setKey(new ModuleKey(mBuilder.getName(), mBuilder.getType()));
         return mBuilder.build();
     }
@@ -131,7 +151,8 @@ final class BGPAppPeerProvider {
         final BgpApplicationPeerBuilder bgpAppPeerBuilder = new BgpApplicationPeerBuilder();
         bgpAppPeerBuilder.setTargetRib(rib);
         final Ipv4Address address = neighbor.getNeighborAddress().getIpv4Address();
-        bgpAppPeerBuilder.setBgpPeerId(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getValue()));
+        bgpAppPeerBuilder.setBgpPeerId(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.
+            Ipv4Address(address.getValue()));
         bgpAppPeerBuilder.setApplicationRibId(new ApplicationRibId(createAppRibName(address)));
         return bgpAppPeerBuilder;
     }
index 52f571f51fd49e519298843c62f470a8f9d7f32d..3286166c96a664cc22c423063002f2e48cabaa17 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.protocol.bgp.openconfig.impl.moduleconfig;
 
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -32,22 +33,32 @@ final class BGPConfigModuleProvider {
     private static final InstanceIdentifier<Modules> MODULES_IID = InstanceIdentifier.builder(Modules.class).build();
 
     void putModuleConfiguration(final Module module, final WriteTransaction wTx) throws TransactionCommitFailedException {
+        final ModuleKey moduleKey = Preconditions.checkNotNull(module, "Supplied module may not be null").getKey();
         LOG.debug("Adding/Updating configuration module: {}", module);
-        wTx.put(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, module.getKey()), module);
+        checkModuleKey(moduleKey);
+        wTx.put(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey), module);
         wTx.submit().checkedGet();
     }
 
+    private void checkModuleKey(final ModuleKey moduleKey) {
+        Preconditions.checkNotNull(moduleKey.getName(), "Supplied moduleKey Name may not be null");
+        Preconditions.checkNotNull(moduleKey.getType(), "Supplied moduleKey Type may not be null");
+    }
+
     void removeModuleConfiguration(final ModuleKey moduleKey, final WriteTransaction wTx) throws TransactionCommitFailedException {
         LOG.debug("Removing configuration module with key: {}", moduleKey);
+        checkModuleKey(moduleKey);
         wTx.delete(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey));
         wTx.submit().checkedGet();
     }
 
     Optional<Module> readModuleConfiguration(final ModuleKey moduleKey, final ReadTransaction rTx) throws ReadFailedException {
+        checkModuleKey(moduleKey);
         return rTx.read(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey)).checkedGet();
     }
 
     Optional<Service> readConfigService(final ServiceKey serviceKey, final ReadTransaction rTx) throws ReadFailedException {
+        Preconditions.checkNotNull(serviceKey.getType(), "Supplied serviceKey Type may not be null");
         return rTx.read(LogicalDatastoreType.CONFIGURATION, SERVICES_IID.child(Service.class, serviceKey)).checkedGet();
     }
 
diff --git a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/DataBrokerFunction.java b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/DataBrokerFunction.java
new file mode 100644 (file)
index 0000000..7352c28
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. 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.protocol.bgp.openconfig.impl.moduleconfig;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.ServiceRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.Service;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.ServiceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.service.Instance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.rev131028.DomAsyncDataBroker;
+import org.opendaylight.yangtools.yang.binding.ChildOf;
+
+final public class DataBrokerFunction {
+    private DataBrokerFunction() {
+        throw new UnsupportedOperationException();
+    }
+
+    public static <T extends ServiceRef & ChildOf<Module>> T getRibInstance(final BGPConfigModuleProvider configModuleOp, final Function<String, T>
+        function, final String instanceName, final ReadOnlyTransaction rTx) {
+        Preconditions.checkNotNull(rTx);
+        try {
+            final Optional<Service> maybeService = configModuleOp.readConfigService(new ServiceKey(DomAsyncDataBroker.class), rTx);
+            if (maybeService.isPresent()) {
+                final Optional<Instance> maybeInstance = Iterables.tryFind(maybeService.get().getInstance(), new Predicate<Instance>() {
+                    @Override
+                    public boolean apply(final Instance instance) {
+                        final String moduleName = OpenConfigUtil.getModuleName(instance.getProvider());
+                        if (moduleName.equals(instanceName)) {
+                            return true;
+                        }
+                        return false;
+                    }
+                });
+                if (maybeInstance.isPresent()) {
+                    return function.apply(maybeInstance.get().getName());
+                }
+            }
+            return null;
+        } catch (ReadFailedException e) {
+            throw new IllegalStateException("Failed to read service.", e);
+        }
+    }
+}
index af620b8da1f9b18f8289026a39aecff14b811b9e..d4a9465a64d010662bfb9f8aab2ee885f796f224 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controll
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRib;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.module.State;
 import org.opendaylight.yangtools.concepts.Identifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
@@ -55,6 +56,8 @@ public class BGPAppPeerProviderTest {
         Mockito.doReturn(this.globalState).when(configHolders).getBGPConfigHolder(Bgp.class);
         Mockito.doReturn(this.neighborState).when(configHolders).getBGPConfigHolder(Neighbor.class);
         Mockito.doReturn(mKey).when(this.neighborState).getModuleKey(Mockito.any(NeighborKey.class));
+        Mockito.doReturn("mkey").when(mKey).getName();
+        Mockito.doReturn(ModuleKey.class).when(mKey).getType();
         Mockito.doReturn("mKey").when(mKey).toString();
         Mockito.doReturn(Boolean.TRUE).when(this.neighborState).remove(Mockito.any(ModuleKey.class), Mockito.any(Neighbor.class));
         Mockito.doReturn(Boolean.TRUE).when(this.neighborState).addOrUpdate(Mockito.any(ModuleKey.class), Mockito.any(Identifier.class), Mockito.any(Neighbor.class));
@@ -78,12 +81,20 @@ public class BGPAppPeerProviderTest {
         Mockito.doReturn(Boolean.TRUE).when(moduleOpt).isPresent();
         final Module module = Mockito.mock(Module.class);
         Mockito.doReturn(module).when(moduleOpt).get();
+        Mockito.doReturn("mkey").when(module).getName();
+        Mockito.doReturn(mKey).when(module).getKey();
+        State state = Mockito.mock(State.class);
+        Mockito.doReturn(state).when(module).getState();
         final BgpApplicationPeer appPeer = Mockito.mock(BgpApplicationPeer.class);
         Mockito.doReturn(appPeer).when(module).getConfiguration();
         final TargetRib rib = Mockito.mock(TargetRib.class);
         Mockito.doReturn(rib).when(appPeer).getTargetRib();
         final ApplicationRibId appRib = Mockito.mock(ApplicationRibId.class);
         Mockito.doReturn(appRib).when(appPeer).getApplicationRibId();
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.
+            application.peer.DataBroker dataBroker = Mockito.mock(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib
+            .impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker.class);
+        Mockito.doReturn(dataBroker).when(appPeer).getDataBroker();
         Mockito.doReturn("appRib").when(appRib).toString();
         Mockito.doReturn("targetRib").when(rib).toString();
     }
index 929c4dc2216f6c0faec1204338e9ccea937652c8..831c0a4d00d88c881f7161b01eb6ab46a2171bce 100644 (file)
@@ -36,6 +36,8 @@ public class BGPConfigModuleProviderTest {
     public void setUp() throws Exception {
         Mockito.doReturn(this.key).when(this.module).getKey();
         Mockito.doReturn("key").when(this.key).toString();
+        Mockito.doReturn("key").when(this.key).getName();
+        Mockito.doReturn(ModuleKey.class).when(this.key).getType();
         Mockito.doReturn("module").when(this.module).toString();
         Mockito.doNothing().when(this.wtx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(KeyedInstanceIdentifier.class), Mockito.any(Module.class));
         Mockito.doNothing().when(this.wtx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(KeyedInstanceIdentifier.class));
@@ -59,6 +61,8 @@ public class BGPConfigModuleProviderTest {
     public void testReadTransactions() throws InterruptedException, ExecutionException, ReadFailedException {
         PROVIDER.readModuleConfiguration(this.key, this.rtx);
         final ServiceKey sKey = Mockito.mock(ServiceKey.class);
+        Mockito.doReturn("key").when(this.key).getName();
+        Mockito.doReturn(ModuleKey.class).when(sKey).getType();
         PROVIDER.readConfigService(sKey, this.rtx);
         Mockito.verify(this.rtx, Mockito.times(2)).read(Mockito.any(LogicalDatastoreType.class), Mockito.any(InstanceIdentifier.class));
     }
index e14968d43d8a0620aee682b697dc2a9b7871a5f1..9745e46aa86063f5e5a37139fbc3697c7358d813 100644 (file)
@@ -56,6 +56,8 @@ public class BGPPeerProviderTest {
         final ModuleKey mKey = Mockito.mock(ModuleKey.class);
         Mockito.doReturn(mKey).when(this.neighborState).getModuleKey(this.neighbor.getKey());
         Mockito.doReturn("mKey").when(mKey).toString();
+        Mockito.doReturn("mKey").when(mKey).getName();
+        Mockito.doReturn(ModuleKey.class).when(mKey).getType();
         Mockito.doReturn(Boolean.TRUE).when(this.neighborState).remove(mKey, createNeighbor());
         this.peerProvider = new BGPPeerProvider(configHolders, moduleProvider, this.dataBroker);
 
index fcc584baf9f965a80353a629d1ed9090714b0342..fd27e87e5f4efcfd94114c0fed7ae356075a6fdc 100644 (file)
@@ -60,6 +60,8 @@ public class BGPRibImplProviderTest {
 
         Mockito.doReturn(this.moduleKey).when(globalState).getModuleKey(Mockito.any(GlobalIdentifier.class));
         Mockito.doReturn("module-key").when(this.moduleKey).toString();
+        Mockito.doReturn("module-key").when(this.moduleKey).getName();
+        Mockito.doReturn(ModuleKey.class).when(this.moduleKey).getType();
         Mockito.doReturn(Boolean.TRUE).when(globalState).remove(Mockito.any(ModuleKey.class), Mockito.any(Global.class));
         Mockito.doReturn(Boolean.FALSE).when(globalState).remove(this.moduleKey, null);
         Mockito.doReturn(Boolean.TRUE).when(globalState).addOrUpdate(Mockito.any(ModuleKey.class), Mockito.any(GlobalIdentifier.class), Mockito.any(Global.class));