BUG-8858: remove sleeps from test driver
[controller.git] / opendaylight / md-sal / samples / clustering-test-app / provider / src / main / java / org / opendaylight / controller / clustering / it / provider / impl / PrefixLeaderHandler.java
index f62ca36d94b3221714298b2389165313964000b3..0d8391a7ca3882b49d61c58b7916d87d10a5c277 100644 (file)
@@ -12,13 +12,18 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Collections;
 import java.util.concurrent.CompletionStage;
+import org.opendaylight.controller.cluster.datastore.exceptions.TimeoutException;
 import org.opendaylight.controller.cluster.dom.api.CDSDataTreeProducer;
 import org.opendaylight.controller.cluster.dom.api.CDSShardAccess;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
 import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderInput;
+import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderOutput;
+import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.BecomePrefixLeaderOutputBuilder;
+import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -38,23 +43,31 @@ public class PrefixLeaderHandler {
         this.serializer = serializer;
     }
 
-    public ListenableFuture<RpcResult<Void>> makeLeaderLocal(final BecomePrefixLeaderInput input) {
+    public ListenableFuture<RpcResult<BecomePrefixLeaderOutput>> makeLeaderLocal(final BecomePrefixLeaderInput input) {
 
         final YangInstanceIdentifier yid = serializer.toYangInstanceIdentifier(input.getPrefix());
         final DOMDataTreeIdentifier prefix = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, yid);
 
-        final CDSDataTreeProducer producer =
-                (CDSDataTreeProducer) domDataTreeService.createProducer(Collections.singleton(prefix));
+        try (CDSDataTreeProducer producer =
+                     (CDSDataTreeProducer) domDataTreeService.createProducer(Collections.singleton(prefix))) {
 
-        final CDSShardAccess shardAccess = producer.getShardAccess(prefix);
+            final CDSShardAccess shardAccess = producer.getShardAccess(prefix);
 
-        final CompletionStage<Void> completionStage = shardAccess.makeLeaderLocal();
+            final CompletionStage<Void> completionStage = shardAccess.makeLeaderLocal();
 
-        completionStage.exceptionally(throwable -> {
-            LOG.error("Leader movement failed.", throwable);
-            return null;
-        });
+            completionStage.exceptionally(throwable -> {
+                LOG.error("Leader movement failed.", throwable);
+                return null;
+            });
+        } catch (final DOMDataTreeProducerException e) {
+            LOG.warn("Error while closing producer", e);
+        } catch (final TimeoutException e) {
+            LOG.warn("Timeout while on producer operation", e);
+            Futures.immediateFuture(RpcResultBuilder.failed().withError(RpcError.ErrorType.RPC,
+                    "resource-denied-transport", "Timeout while opening producer please retry.", "clustering-it",
+                    "clustering-it", e));
+        }
 
-        return Futures.immediateFuture(RpcResultBuilder.<Void>success().build());
+        return Futures.immediateFuture(RpcResultBuilder.success(new BecomePrefixLeaderOutputBuilder().build()).build());
     }
 }