BUG-5903: do not rely on primary info on failure
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / MemberNode.java
index e966c95298a0a36fc1e0f031b4da762e40f966da..de751beeb9d91a16dd3f013de2bfdb067d112a27 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.cluster.datastore;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 import akka.actor.ActorRef;
 import akka.actor.ActorSystem;
@@ -17,6 +17,7 @@ import akka.cluster.Cluster;
 import akka.cluster.ClusterEvent.CurrentClusterState;
 import akka.cluster.Member;
 import akka.cluster.MemberStatus;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.Sets;
@@ -25,6 +26,7 @@ import com.typesafe.config.ConfigFactory;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import org.opendaylight.controller.cluster.access.concepts.MemberName;
 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
 import org.opendaylight.controller.cluster.datastore.utils.ActorContext;
 import org.opendaylight.controller.cluster.raft.client.messages.GetOnDemandRaftState;
@@ -82,13 +84,21 @@ public class MemberNode {
     }
 
     public void waitForMembersUp(String... otherMembers) {
-        Set<String> otherMembersSet = Sets.newHashSet(otherMembers);
+        kit.waitForMembersUp(otherMembers);
+    }
+
+    public void waitForMemberDown(String member) {
         Stopwatch sw = Stopwatch.createStarted();
         while(sw.elapsed(TimeUnit.SECONDS) <= 10) {
             CurrentClusterState state = Cluster.get(kit.getSystem()).state();
+            for(Member m: state.getUnreachable()) {
+                if(member.equals(m.getRoles().iterator().next())) {
+                    return;
+                }
+            }
+
             for(Member m: state.getMembers()) {
-                if(m.status() == MemberStatus.up() && otherMembersSet.remove(m.getRoles().iterator().next()) &&
-                        otherMembersSet.isEmpty()) {
+                if(m.status() != MemberStatus.up() && member.equals(m.getRoles().iterator().next())) {
                     return;
                 }
             }
@@ -96,15 +106,20 @@ public class MemberNode {
             Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
         }
 
-        fail("Member(s) " + otherMembersSet + " are not Up");
+        fail("Member " + member + " is now down");
     }
 
     public void cleanup() {
         if(!cleanedUp) {
             cleanedUp = true;
-            kit.cleanup(configDataStore);
-            kit.cleanup(operDataStore);
-            kit.shutdownActorSystem(kit.getSystem(), Boolean.TRUE);
+            if (configDataStore != null) {
+                configDataStore.close();
+            }
+            if (operDataStore != null) {
+                operDataStore.close();
+            }
+
+            IntegrationTestKit.shutdownActorSystem(kit.getSystem(), Boolean.TRUE);
         }
     }
 
@@ -137,18 +152,26 @@ public class MemberNode {
             String... peerMemberNames) throws Exception {
         final Set<String> peerIds = Sets.newHashSet();
         for(String p: peerMemberNames) {
-            peerIds.add(ShardIdentifier.builder().memberName(p).shardName(shardName).
-                type(datastore.getActorContext().getDataStoreType()).build().toString());
+            peerIds.add(ShardIdentifier.create(shardName, MemberName.forName(p),
+                datastore.getActorContext().getDataStoreName()).toString());
         }
 
-        verifyRaftState(datastore, shardName, new RaftStateVerifier() {
-            @Override
-            public void verify(OnDemandRaftState raftState) {
-                assertTrue(String.format("Peer(s) %s not found for shard %s. Actual: %s", peerIds, shardName,
-                        raftState.getPeerAddresses().keySet()),
-                        raftState.getPeerAddresses().keySet().containsAll(peerIds));
+        verifyRaftState(datastore, shardName, raftState -> assertEquals("Peers for shard " + shardName, peerIds,
+            raftState.getPeerAddresses().keySet()));
+    }
+
+    public static void verifyNoShardPresent(DistributedDataStore datastore, String shardName) {
+        Stopwatch sw = Stopwatch.createStarted();
+        while(sw.elapsed(TimeUnit.SECONDS) <= 5) {
+            Optional<ActorRef> shardReply = datastore.getActorContext().findLocalShard(shardName);
+            if(!shardReply.isPresent()) {
+                return;
             }
-        });
+
+            Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS);
+        }
+
+        fail("Shard " + shardName + " is present");
     }
 
     public static class Builder {
@@ -253,7 +276,7 @@ public class MemberNode {
 
             node.kit = new IntegrationTestKit(system, datastoreContextBuilder);
 
-            String memberName = new ClusterWrapperImpl(system).getCurrentMemberName();
+            String memberName = new ClusterWrapperImpl(system).getCurrentMemberName().getName();
             node.kit.getDatastoreContextBuilder().shardManagerPersistenceId("shard-manager-config-" + memberName);
             node.configDataStore = node.kit.setupDistributedDataStore("config_" + testName, moduleShardsConfig,
                     true, schemaContext, waitForshardLeader);