+ @Test
+ public void testAddRemovePrefixShardReplica() throws Exception {
+ String name = "testAddPrefixShardReplica";
+ String moduleShardsConfig = "module-shards-default.conf";
+
+ final MemberNode member1 = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+ final MemberNode replicaNode2 = MemberNode.builder(memberNodes).akkaConfig("Member2").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+ final MemberNode replicaNode3 = MemberNode.builder(memberNodes).akkaConfig("Member3").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+
+ member1.waitForMembersUp("member-2", "member-3");
+ replicaNode2.kit().waitForMembersUp("member-1", "member-3");
+ replicaNode3.kit().waitForMembersUp("member-1", "member-2");
+
+ final ActorRef shardManager1 = member1.configDataStore().getActorUtils().getShardManager();
+
+ shardManager1.tell(new PrefixShardCreated(new PrefixShardConfiguration(
+ new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, CarsModel.BASE_PATH),
+ "prefix", Collections.singleton(MEMBER_1))),
+ ActorRef.noSender());
+
+ member1.kit().waitUntilLeader(member1.configDataStore().getActorUtils(),
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH));
+
+ final InstanceIdentifier<Cars> identifier = InstanceIdentifier.create(Cars.class);
+ final BindingNormalizedNodeSerializer serializer = Mockito.mock(BindingNormalizedNodeSerializer.class);
+ Mockito.doReturn(CarsModel.BASE_PATH).when(serializer).toYangInstanceIdentifier(identifier);
+
+ addPrefixShardReplica(replicaNode2, identifier, serializer,
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH), "member-1");
+
+ addPrefixShardReplica(replicaNode3, identifier, serializer,
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH), "member-1", "member-2");
+
+ verifyRaftPeersPresent(member1.configDataStore(), ClusterUtils.getCleanShardName(CarsModel.BASE_PATH),
+ "member-2", "member-3");
+
+ removePrefixShardReplica(member1, identifier, "member-3", serializer,
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH), "member-2");
+
+ verifyNoShardPresent(replicaNode3.configDataStore(), ClusterUtils.getCleanShardName(CarsModel.BASE_PATH));
+ verifyRaftPeersPresent(replicaNode2.configDataStore(), ClusterUtils.getCleanShardName(CarsModel.BASE_PATH),
+ "member-1");
+
+ removePrefixShardReplica(member1, identifier, "member-2", serializer,
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH));
+
+ verifyNoShardPresent(replicaNode2.configDataStore(), ClusterUtils.getCleanShardName(CarsModel.BASE_PATH));
+ }
+
+ @Test
+ public void testGetShardRole() throws Exception {
+ String name = "testGetShardRole";
+ String moduleShardsConfig = "module-shards-default-member-1.conf";
+
+ final MemberNode member1 = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+
+ member1.kit().waitUntilLeader(member1.configDataStore().getActorUtils(), "default");
+
+ final RpcResult<GetShardRoleOutput> successResult =
+ getShardRole(member1, Mockito.mock(BindingNormalizedNodeSerializer.class), "default");
+ verifySuccessfulRpcResult(successResult);
+ assertEquals("Leader", successResult.getResult().getRole());
+
+ final RpcResult<GetShardRoleOutput> failedResult =
+ getShardRole(member1, Mockito.mock(BindingNormalizedNodeSerializer.class), "cars");
+
+ verifyFailedRpcResult(failedResult);
+
+ final ActorRef shardManager1 = member1.configDataStore().getActorUtils().getShardManager();
+
+ shardManager1.tell(new PrefixShardCreated(new PrefixShardConfiguration(
+ new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, CarsModel.BASE_PATH),
+ "prefix", Collections.singleton(MEMBER_1))),
+ ActorRef.noSender());
+
+ member1.kit().waitUntilLeader(member1.configDataStore().getActorUtils(),
+ ClusterUtils.getCleanShardName(CarsModel.BASE_PATH));
+
+ final InstanceIdentifier<Cars> identifier = InstanceIdentifier.create(Cars.class);
+ final BindingNormalizedNodeSerializer serializer = Mockito.mock(BindingNormalizedNodeSerializer.class);
+ Mockito.doReturn(CarsModel.BASE_PATH).when(serializer).toYangInstanceIdentifier(identifier);
+
+ final RpcResult<GetPrefixShardRoleOutput> prefixSuccessResult =
+ getPrefixShardRole(member1, identifier, serializer);
+
+ verifySuccessfulRpcResult(prefixSuccessResult);
+ assertEquals("Leader", prefixSuccessResult.getResult().getRole());
+
+ final InstanceIdentifier<People> peopleId = InstanceIdentifier.create(People.class);
+ Mockito.doReturn(PeopleModel.BASE_PATH).when(serializer).toYangInstanceIdentifier(peopleId);
+
+ final RpcResult<GetPrefixShardRoleOutput> prefixFail =
+ getPrefixShardRole(member1, peopleId, serializer);
+
+ verifyFailedRpcResult(prefixFail);
+ }
+
+ @Test
+ public void testGetPrefixShardRole() throws Exception {
+ String name = "testGetPrefixShardRole";
+ String moduleShardsConfig = "module-shards-default-member-1.conf";
+
+ final MemberNode member1 = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+
+ member1.kit().waitUntilLeader(member1.configDataStore().getActorUtils(), "default");
+
+
+ }
+
+ @Test
+ public void testModuleShardLeaderMovement() throws Exception {
+ String name = "testModuleShardLeaderMovement";
+ String moduleShardsConfig = "module-shards-member1.conf";
+
+ final MemberNode member1 = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name)
+ .waitForShardLeader("cars").moduleShardsConfig(moduleShardsConfig).build();
+ final MemberNode replicaNode2 = MemberNode.builder(memberNodes).akkaConfig("Member2").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+ final MemberNode replicaNode3 = MemberNode.builder(memberNodes).akkaConfig("Member3").testName(name)
+ .moduleShardsConfig(moduleShardsConfig).build();
+
+ member1.waitForMembersUp("member-2", "member-3");
+ replicaNode2.waitForMembersUp("member-1");
+ replicaNode3.waitForMembersUp("member-1", "member-2");
+
+ doAddShardReplica(replicaNode2, "cars", "member-1");
+ doAddShardReplica(replicaNode3, "cars", "member-1", "member-2");
+
+ verifyRaftPeersPresent(member1.configDataStore(), "cars", "member-2", "member-3");
+
+ verifyRaftPeersPresent(replicaNode2.configDataStore(), "cars", "member-1", "member-3");
+
+ verifyRaftPeersPresent(replicaNode3.configDataStore(), "cars", "member-1", "member-2");
+
+ doMakeShardLeaderLocal(member1, "cars", "member-1");
+ verifyRaftState(replicaNode2.configDataStore(), "cars",
+ raftState -> assertThat(raftState.getLeader(),containsString("member-1")));
+ verifyRaftState(replicaNode3.configDataStore(), "cars",
+ raftState -> assertThat(raftState.getLeader(),containsString("member-1")));
+
+ doMakeShardLeaderLocal(replicaNode2, "cars", "member-2");
+ verifyRaftState(member1.configDataStore(), "cars",
+ raftState -> assertThat(raftState.getLeader(),containsString("member-2")));
+ verifyRaftState(replicaNode3.configDataStore(), "cars",
+ raftState -> assertThat(raftState.getLeader(),containsString("member-2")));
+
+ replicaNode2.waitForMembersUp("member-3");
+ doMakeShardLeaderLocal(replicaNode3, "cars", "member-3");
+ }
+