BUG-5098: NPE when reconfiguring openconfig 55/33555/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Tue, 26 Jan 2016 13:30:19 +0000 (14:30 +0100)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Wed, 27 Jan 2016 10:01:38 +0000 (11:01 +0100)
When configuring more than one BGPPeer through Netconf
consecutive withouth give time to reconfiguration
to finish will cause an NPE.
Fix by doin blocking reconfiguration.

Change-Id: I000fe3a146f40713fb918c07442396bd8eaa7598
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/BGPPeerProvider.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/BGPRibImplProvider.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/RibInstanceFunction.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/moduleconfig/TableTypesFunction.java
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 9b44b19fc5788ec2377ba8ea21ad935a856f1199..9967df1c430500c589363a6c1beaf3e71cf7ee8a 100644 (file)
@@ -11,7 +11,6 @@ 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.util.concurrent.ListenableFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@@ -65,7 +64,7 @@ final class BGPAppPeerProvider {
         if (moduleKey != null) {
             try {
                 final ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-                final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rwTx).get();
+                final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rwTx);
                 if (maybeModule.isPresent() && neighborState.remove(moduleKey, removedNeighbor)) {
                     configModuleOp.removeModuleConfiguration(moduleKey, rwTx);
                 }
@@ -83,7 +82,7 @@ final class BGPAppPeerProvider {
             //update an existing peer configuration
             try {
                 if (neighborState.addOrUpdate(moduleKey, modifiedAppNeighbor.getKey(), modifiedAppNeighbor)) {
-                    final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rTx).get();
+                    final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rTx);
                     if (maybeModule.isPresent()) {
                         final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, maybeModule.get());
                         configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
@@ -98,8 +97,8 @@ final class BGPAppPeerProvider {
             final ModuleKey ribImplKey = globalState.getModuleKey(GlobalIdentifier.GLOBAL_IDENTIFIER);
             if (ribImplKey != null) {
                 try {
-                    final ListenableFuture<TargetRib> ribFuture = new RibInstanceFunction<>(rTx, configModuleOp, TO_RIB_FUNCTION).apply(ribImplKey.getName());
-                    final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, ribFuture.get());
+                    final TargetRib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplKey.getName(), rTx);
+                    final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, rib);
                     configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
                     neighborState.addOrUpdate(peerConfigModule.getKey(), modifiedAppNeighbor.getKey(), modifiedAppNeighbor);
                 } catch (final Exception e) {
index 74a02746f04a0e68c3aff7d390758a714a480622..52f571f51fd49e519298843c62f470a8f9d7f32d 100644 (file)
@@ -9,10 +9,10 @@
 package org.opendaylight.protocol.bgp.openconfig.impl.moduleconfig;
 
 import com.google.common.base.Optional;
-import com.google.common.util.concurrent.ListenableFuture;
 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;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.Modules;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.Services;
@@ -43,12 +43,12 @@ final class BGPConfigModuleProvider {
         wTx.submit().checkedGet();
     }
 
-    ListenableFuture<Optional<Module>> readModuleConfiguration(final ModuleKey moduleKey, final ReadTransaction rTx) {
-        return rTx.read(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey));
+    Optional<Module> readModuleConfiguration(final ModuleKey moduleKey, final ReadTransaction rTx) throws ReadFailedException {
+        return rTx.read(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey)).checkedGet();
     }
 
-    ListenableFuture<Optional<Service>> readConfigService(final ServiceKey serviceKey, final ReadTransaction rTx) {
-        return rTx.read(LogicalDatastoreType.CONFIGURATION, SERVICES_IID.child(Service.class, serviceKey));
+    Optional<Service> readConfigService(final ServiceKey serviceKey, final ReadTransaction rTx) throws ReadFailedException {
+        return rTx.read(LogicalDatastoreType.CONFIGURATION, SERVICES_IID.child(Service.class, serviceKey)).checkedGet();
     }
 
 }
index 26f27644c2374ae353f55d9dee6e17b22a750788..2fc4cb5ba6a80a6108dbea836a77fe8caf237cae 100644 (file)
@@ -11,12 +11,11 @@ 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.util.concurrent.ListenableFuture;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.protocol.bgp.openconfig.impl.spi.BGPConfigHolder;
 import org.opendaylight.protocol.bgp.openconfig.impl.spi.BGPConfigStateStore;
@@ -81,11 +80,11 @@ final class BGPPeerProvider {
         if (moduleKey != null) {
             try {
                 final ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-                final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rwTx).get();
+                final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rwTx);
                 if (maybeModule.isPresent() && neighborState.remove(moduleKey, removedNeighbor)) {
                     configModuleOp.removeModuleConfiguration(moduleKey, rwTx);
                 }
-            } catch (InterruptedException | ExecutionException | TransactionCommitFailedException e) {
+            } catch (ReadFailedException | TransactionCommitFailedException e) {
                 LOG.error("Failed to remove a configuration module: {}", moduleKey, e);
                 throw new IllegalStateException(e);
             }
@@ -95,36 +94,60 @@ final class BGPPeerProvider {
     public void onNeighborModified(final Neighbor modifiedNeighbor) {
         final ModuleKey moduleKey = neighborState.getModuleKey(modifiedNeighbor.getKey());
         final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
-        final ListenableFuture<List<AdvertizedTable>> advertizedTablesFuture = new TableTypesFunction<AdvertizedTable>(rTx,
-                configModuleOp, ADVERTIZED_TABLE_FUNCTION).apply(modifiedNeighbor.getAfiSafis().getAfiSafi());
+        final List<AdvertizedTable> advertizedTables = getAdvertizedTables(modifiedNeighbor, rTx);
         if (moduleKey != null) {
-            //update an existing peer configuration
+            updateExistingPeerConfiguration(moduleKey, modifiedNeighbor, advertizedTables, rTx);
+        } else {
+            createNewPeerConfiguration(moduleKey, modifiedNeighbor, advertizedTables, rTx);
+        }
+    }
+
+    private List<AdvertizedTable> getAdvertizedTables(final Neighbor modifiedNeighbor, final ReadOnlyTransaction rTx) {
+        return TableTypesFunction.getLocalTables(rTx, this.configModuleOp, this.ADVERTIZED_TABLE_FUNCTION, modifiedNeighbor.getAfiSafis().getAfiSafi());
+    }
+
+    private void updateExistingPeerConfiguration(final ModuleKey moduleKey, final Neighbor modifiedNeighbor, final List<AdvertizedTable>
+        advertizedTables, final ReadOnlyTransaction rTx) {
+        if (neighborState.addOrUpdate(moduleKey, modifiedNeighbor.getKey(), modifiedNeighbor)) {
+            final Optional<Module> maybeModule = getOldModuleConfiguration(moduleKey, rTx);
+            if (maybeModule.isPresent()) {
+                final Module peerConfigModule = toPeerConfigModule(modifiedNeighbor, maybeModule.get(), advertizedTables);
+                putOldModuleConfigurationIntoNewModule(peerConfigModule);
+            }
+        }
+    }
+
+    private Optional<Module> getOldModuleConfiguration(final ModuleKey moduleKey, final ReadOnlyTransaction rTx) {
+        try {
+            return configModuleOp.readModuleConfiguration(moduleKey, rTx);
+        } catch (final Exception e) {
+            LOG.error("Failed to read module configuration: {}", moduleKey, e);
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private void putOldModuleConfigurationIntoNewModule(final Module peerConfigModule) {
+        try {
+            configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
+        } catch (TransactionCommitFailedException e) {
+            LOG.error("Failed to update a configuration module: {}", peerConfigModule, e);
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private void createNewPeerConfiguration(final ModuleKey moduleKey, final Neighbor modifiedNeighbor, final List<AdvertizedTable>
+        advertizedTables, final ReadOnlyTransaction rTx) {
+        final ModuleKey ribImplKey = globalState.getModuleKey(GlobalIdentifier.GLOBAL_IDENTIFIER);
+        if (ribImplKey != null) {
             try {
-                if (neighborState.addOrUpdate(moduleKey, modifiedNeighbor.getKey(), modifiedNeighbor)) {
-                    final Optional<Module> maybeModule = configModuleOp.readModuleConfiguration(moduleKey, rTx).get();
-                    if (maybeModule.isPresent()) {
-                        final Module peerConfigModule = toPeerConfigModule(modifiedNeighbor, maybeModule.get(), advertizedTablesFuture.get());
-                        configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
-                    }
-                }
+                final Rib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplKey.getName(), rTx);
+                final Module peerConfigModule = toPeerConfigModule(modifiedNeighbor, advertizedTables, rib);
+                configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
+                neighborState.addOrUpdate(peerConfigModule.getKey(), modifiedNeighbor.getKey(), modifiedNeighbor);
             } catch (final Exception e) {
-                LOG.error("Failed to update a configuration module: {}", moduleKey, e);
+                LOG.error("Failed to create a configuration module: {}", moduleKey, e);
                 throw new IllegalStateException(e);
             }
-        } else {
-            //create new peer configuration
-            final ModuleKey ribImplKey = globalState.getModuleKey(GlobalIdentifier.GLOBAL_IDENTIFIER);
-            if (ribImplKey != null) {
-                try {
-                    final ListenableFuture<Rib> ribFuture = new RibInstanceFunction<>(rTx, configModuleOp, TO_RIB_FUNCTION).apply(ribImplKey.getName());
-                    final Module peerConfigModule = toPeerConfigModule(modifiedNeighbor, advertizedTablesFuture.get(), ribFuture.get());
-                    configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
-                    neighborState.addOrUpdate(peerConfigModule.getKey(), modifiedNeighbor.getKey(), modifiedNeighbor);
-                } catch (final Exception e) {
-                    LOG.error("Failed to create a configuration module: {}", moduleKey, e);
-                    throw new IllegalStateException(e);
-                }
-            }
         }
     }
 
index d7251bb5bdee6d6a87bc79e40652395250571be6..a8e6db91dedb8bbd73734e0f2b7b33e7c81d37a6 100644 (file)
@@ -11,7 +11,6 @@ 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.util.concurrent.ListenableFuture;
 import java.util.List;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
@@ -60,7 +59,7 @@ final class BGPRibImplProvider {
         if (moduleKey != null) {
             try {
                 final ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();
-                final Optional<Module> maybeModule = this.configModuleWriter.readModuleConfiguration(moduleKey, rwTx).get();
+                final Optional<Module> maybeModule = this.configModuleWriter.readModuleConfiguration(moduleKey, rwTx);
                 if (maybeModule.isPresent() && globalState.remove(moduleKey, new BgpBuilder().setGlobal(removedGlobal).build())) {
                     this.configModuleWriter.removeModuleConfiguration(moduleKey, rwTx);
                 }
@@ -76,10 +75,10 @@ final class BGPRibImplProvider {
         if (moduleKey != null && this.globalState.addOrUpdate(moduleKey, GlobalIdentifier.GLOBAL_IDENTIFIER, new BgpBuilder().setGlobal(modifiedGlobal).build())) {
             final ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
             try {
-                final Optional<Module> maybeModule = this.configModuleWriter.readModuleConfiguration(moduleKey, rTx).get();
+                final Optional<Module> maybeModule = this.configModuleWriter.readModuleConfiguration(moduleKey, rTx);
                 if (maybeModule.isPresent()) {
-                    final ListenableFuture<List<LocalTable>> localTablesFuture = new TableTypesFunction<LocalTable>(rTx, this.configModuleWriter, LOCAL_TABLE_FUNCTION).apply(modifiedGlobal.getAfiSafis().getAfiSafi());
-                    final Module newModule = toRibImplConfigModule(modifiedGlobal, maybeModule.get(), localTablesFuture.get());
+                    final List<LocalTable> localTables = getAdvertizedTables(modifiedGlobal, rTx);
+                    final Module newModule = toRibImplConfigModule(modifiedGlobal, maybeModule.get(), localTables);
                     this.configModuleWriter.putModuleConfiguration(newModule, dataBroker.newWriteOnlyTransaction());
                 }
             } catch (final Exception e) {
@@ -89,6 +88,10 @@ final class BGPRibImplProvider {
         }
     }
 
+    private List<LocalTable> getAdvertizedTables(final Global modifiedGlobal, final ReadOnlyTransaction rTx) {
+        return TableTypesFunction.getLocalTables(rTx, this.configModuleWriter, this.LOCAL_TABLE_FUNCTION, modifiedGlobal.getAfiSafis().getAfiSafi());
+    }
+
     private static Module toRibImplConfigModule(final Global globalConfig, final Module module, final List<LocalTable> tableTypes) {
         final RibImpl ribImpl = (RibImpl) module.getConfiguration();
         final RibImplBuilder ribImplBuilder = new RibImplBuilder();
index ec8e7a5ca5dc8e50c54ebc630e7d85061e512a95..4052c6177a4c1be25f691097bd69b1be5a92fcdb 100644 (file)
@@ -1,11 +1,10 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * 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;
@@ -13,10 +12,8 @@ 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 com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
+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.bgp.rib.impl.rev130409.RibInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.ServiceRef;
@@ -26,42 +23,34 @@ 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.config.rev130405.services.service.Instance;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 
-final class RibInstanceFunction<T extends ServiceRef & ChildOf<Module>> implements AsyncFunction<String, T> {
-
-    private final ReadTransaction rTx;
-    private final BGPConfigModuleProvider configModuleOp;
-    private final Function<String, T> function;
-
-    public RibInstanceFunction(final ReadTransaction rTx, final BGPConfigModuleProvider configModuleOp, final Function<String, T> function) {
-        this.rTx = Preconditions.checkNotNull(rTx);
-        this.configModuleOp = Preconditions.checkNotNull(configModuleOp);
-        this.function = Preconditions.checkNotNull(function);
+final class RibInstanceFunction {
+    private RibInstanceFunction() {
+        throw new UnsupportedOperationException();
     }
 
-    @Override
-    public ListenableFuture<T> apply(final String instanceName) {
-        final ListenableFuture<Optional<Service>> readFuture = configModuleOp.readConfigService(new ServiceKey(RibInstance.class), rTx);
-        return Futures.transform(readFuture, new Function<Optional<Service>, T>() {
-            @Override
-            public T apply(final Optional<Service> maybeService) {
-                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;
+    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(RibInstance.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;
                         }
-                    });
-                    if (maybeInstance.isPresent()) {
-                        return function.apply(maybeInstance.get().getName());
+                        return false;
                     }
+                });
+                if (maybeInstance.isPresent()) {
+                    return function.apply(maybeInstance.get().getName());
                 }
-                return null;
             }
-
-        });
+            return null;
+        } catch (ReadFailedException e) {
+            throw new IllegalStateException("Failed to read service.", e);
+        }
     }
 }
index 734cd09aab7f59c58487dbd6c868de4a612aacef..a5f5f6911dd71548c91ea1e0dad5127ad732d7ca 100644 (file)
@@ -10,18 +10,15 @@ 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.FluentIterable;
 import com.google.common.collect.ImmutableList;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
+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.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
@@ -35,55 +32,28 @@ 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.config.rev130405.services.service.Instance;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 
-final class TableTypesFunction<T extends ServiceRef & ChildOf<Module>> implements AsyncFunction<List<AfiSafi>, List<T>> {
-
-    private final ReadTransaction rTx;
-    private final BGPConfigModuleProvider configModuleWriter;
-    private final Function<String, T> function;
-
-    public TableTypesFunction(final ReadTransaction rTx, final BGPConfigModuleProvider configModuleWriter, final Function<String, T> function) {
-        this.rTx = Preconditions.checkNotNull(rTx);
-        this.configModuleWriter = Preconditions.checkNotNull(configModuleWriter);
-        this.function = Preconditions.checkNotNull(function);
+final class TableTypesFunction {
+    private TableTypesFunction() {
+        throw new UnsupportedOperationException();
     }
 
-    @Override
-    public ListenableFuture<List<T>> apply(final List<AfiSafi> afiSafis) {
-        final ListenableFuture<Optional<Service>> readFuture = configModuleWriter.readConfigService(new ServiceKey(BgpTableType.class), rTx);
-        return Futures.transform(readFuture, new AsyncFunction<Optional<Service>, List<T>>() {
-
-            @Override
-            public ListenableFuture<List<T>> apply(final Optional<Service> maybeService) {
-                if (maybeService.isPresent()) {
-                    final Service service = maybeService.get();
-                    final List<ListenableFuture<Optional<Module>>> modulesFuture = new ArrayList<>();
-                    final Map<String, String> moduleNameToService = new HashMap<>();
-                    for (final Instance instance : service.getInstance()) {
-                        final String moduleName = OpenConfigUtil.getModuleName(instance.getProvider());
-                        modulesFuture.add(configModuleWriter.readModuleConfiguration(new ModuleKey(moduleName, BgpTableTypeImpl.class), rTx));
-                        moduleNameToService.put(moduleName, instance.getName());
-                    }
-                    return Futures.transform(Futures.successfulAsList(modulesFuture), new ModulesToLocalTablesFunction(afiSafis, moduleNameToService));
+    public static <T extends ServiceRef & ChildOf<Module>> List<T> getLocalTables(final ReadOnlyTransaction rTx, final BGPConfigModuleProvider
+        configModuleWriter, final Function<String, T> function, final List<AfiSafi> afiSafis) {
+        try {
+            final Optional<Service> maybeService = configModuleWriter.readConfigService(new ServiceKey(BgpTableType.class), rTx);
+            if (maybeService.isPresent()) {
+                final Service service = maybeService.get();
+                final List<Optional<Module>> maybeModules = new ArrayList<>();
+                final Map<String, String> moduleNameToService = new HashMap<>();
+                for (final Instance instance : service.getInstance()) {
+                    final String moduleName = OpenConfigUtil.getModuleName(instance.getProvider());
+                    final ModuleKey moduleKey = new ModuleKey(moduleName, BgpTableTypeImpl.class);
+                    final Optional<Module> moduleConfig = configModuleWriter.readModuleConfiguration(moduleKey, rTx);
+                    maybeModules.add(moduleConfig);
+                    moduleNameToService.put(moduleName, instance.getName());
                 }
-                return Futures.immediateFailedFuture(new IllegalStateException("No BgpTableType service present in configuration."));
-            }
-
-        });
-    }
-
-    private final class ModulesToLocalTablesFunction implements Function<List<Optional<Module>>, List<T>> {
-
-        private final List<AfiSafi> afiSafis;
-        private final Map<String, String> moduleNameToService;
 
-        public ModulesToLocalTablesFunction(final List<AfiSafi> afiSafis, final Map<String, String> moduleNameToService) {
-            this.afiSafis = afiSafis;
-            this.moduleNameToService = moduleNameToService;
-        }
-
-        @Override
-        public List<T> apply(final List<Optional<Module>> maybeModules) {
-            final ImmutableList<Module> modules = FluentIterable.from(maybeModules)
+                final ImmutableList<Module> modules = FluentIterable.from(maybeModules)
                     .filter(new Predicate<Optional<Module>>() {
                         @Override
                         public boolean apply(final Optional<Module> input) {
@@ -96,32 +66,36 @@ final class TableTypesFunction<T extends ServiceRef & ChildOf<Module>> implement
                         }
                     }).toList();
 
-            return toTableTypes(afiSafiToModuleName(modules));
+                return toTableTypes(function, afiSafis, afiSafiToModuleName(afiSafis, modules), moduleNameToService);
+            }
+            throw new IllegalStateException("No BgpTableType service present in configuration.");
+        } catch (ReadFailedException e) {
+            throw new IllegalStateException("Failed to read service.", e);
         }
+    }
 
-        private Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName(final List<Module> modules) {
-            final Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName = new HashMap<>(afiSafis.size());
-            for (final Module module : modules) {
-                final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpTableTypeImpl config =
-                        ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpTableTypeImpl) module.getConfiguration());
-                final Optional<AfiSafi> afiSafi = OpenConfigUtil.toAfiSafi(new org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl(config.getAfi(), config.getSafi()));
-                if (afiSafi.isPresent()) {
-                    afiSafiToModuleName.put(afiSafi.get().getAfiSafiName(), module.getName());
-                }
+    private static Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName(final List<AfiSafi> afiSafis, final List<Module> modules) {
+        final Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName = new HashMap<>(afiSafis.size());
+        for (final Module module : modules) {
+            final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpTableTypeImpl config =
+                ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpTableTypeImpl) module.getConfiguration());
+            final Optional<AfiSafi> afiSafi = OpenConfigUtil.toAfiSafi(new org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl(config.getAfi(), config.getSafi()));
+            if (afiSafi.isPresent()) {
+                afiSafiToModuleName.put(afiSafi.get().getAfiSafiName(), module.getName());
             }
-            return afiSafiToModuleName;
         }
+        return afiSafiToModuleName;
+    }
 
-        private List<T> toTableTypes(final Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName) {
-            final List<T> tableTypes = new ArrayList<>(afiSafis.size());
-            for (final AfiSafi afiSafi : afiSafis) {
-                final String moduleName = afiSafiToModuleName.get(afiSafi.getAfiSafiName());
-                if (moduleName != null) {
-                    tableTypes.add(function.apply(moduleNameToService.get(moduleName)));
-                }
+    private static <T extends ServiceRef & ChildOf<Module>> List<T> toTableTypes(final Function<String, T> function, final List<AfiSafi> afiSafis,
+        final Map<Class<? extends AfiSafiType>, String> afiSafiToModuleName, final Map<String, String> moduleNameToService) {
+        final List<T> tableTypes = new ArrayList<>(afiSafis.size());
+        for (final AfiSafi afiSafi : afiSafis) {
+            final String moduleName = afiSafiToModuleName.get(afiSafi.getAfiSafiName());
+            if (moduleName != null) {
+                tableTypes.add(function.apply(moduleNameToService.get(moduleName)));
             }
-            return tableTypes;
         }
-
+        return tableTypes;
     }
 }
index e705a6c066e6f207111d815e131b4e0e0a18b65c..af620b8da1f9b18f8289026a39aecff14b811b9e 100644 (file)
@@ -73,8 +73,7 @@ public class BGPAppPeerProviderTest {
         Mockito.doReturn(future).when(this.wTx).submit();
         Mockito.doReturn(future).when(this.rwTx).submit();
         Mockito.doNothing().when(this.wTx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(InstanceIdentifier.class), Mockito.any(Module.class));
-        Mockito.doReturn(moduleOpt).when(future).get();
-        Mockito.doReturn(null).when(future).checkedGet();
+        Mockito.doReturn(moduleOpt).when(future).checkedGet();
         Mockito.doNothing().when(future).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
         Mockito.doReturn(Boolean.TRUE).when(moduleOpt).isPresent();
         final Module module = Mockito.mock(Module.class);
index 7cba979a78f85c6185f12324932eb71ac4a1c4c9..929c4dc2216f6c0faec1204338e9ccea937652c8 100644 (file)
@@ -15,6 +15,7 @@ import org.mockito.Mockito;
 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;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 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;
@@ -55,7 +56,7 @@ public class BGPConfigModuleProviderTest {
     }
 
     @Test
-    public void testReadTransactions() throws InterruptedException, ExecutionException {
+    public void testReadTransactions() throws InterruptedException, ExecutionException, ReadFailedException {
         PROVIDER.readModuleConfiguration(this.key, this.rtx);
         final ServiceKey sKey = Mockito.mock(ServiceKey.class);
         PROVIDER.readConfigService(sKey, this.rtx);
index 6cc499ed906e2a1973393cc8e4f1828201d741bd..e14968d43d8a0620aee682b697dc2a9b7871a5f1 100644 (file)
@@ -63,8 +63,7 @@ public class BGPPeerProviderTest {
         final Optional<Module> moduleOpt = Mockito.mock(Optional.class);
         Mockito.doReturn(this.rwTx).when(this.dataBroker).newReadWriteTransaction();
         Mockito.doReturn(future).when(this.rwTx).read(Mockito.any(LogicalDatastoreType.class), Mockito.any(InstanceIdentifier.class));
-        Mockito.doReturn(moduleOpt).when(future).get();
-        Mockito.doReturn(null).when(future).checkedGet();
+        Mockito.doReturn(moduleOpt).when(future).checkedGet();
         Mockito.doReturn(Boolean.TRUE).when(moduleOpt).isPresent();
         final Module module = Mockito.mock(Module.class);
         Mockito.doReturn(module).when(moduleOpt).get();
index 8e53ff63064f91600511efac2f4c9a11bef809ca..fcc584baf9f965a80353a629d1ed9090714b0342 100644 (file)
@@ -78,8 +78,8 @@ public class BGPRibImplProviderTest {
 
         final Optional<Module> moduleOpt = Mockito.mock(Optional.class);
         final Optional<Module> moduleOpt2 = Mockito.mock(Optional.class);
-        Mockito.doReturn(moduleOpt).when(future).get();
-        Mockito.doReturn(moduleOpt2).when(future2).get();
+        Mockito.doReturn(moduleOpt).when(future).checkedGet();
+        Mockito.doReturn(moduleOpt2).when(future2).checkedGet();
         Mockito.doReturn(Boolean.TRUE).when(moduleOpt).isPresent();
         Mockito.doReturn(Boolean.FALSE).when(moduleOpt2).isPresent();
         final Module module = Mockito.mock(Module.class);