+ @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().getActorContext().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().getActorContext(),
+ 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));
+ }
+