* @author Moiz Raja
* @author Thomas Pantelis
*/
-public class CandidateListChangeListener implements DOMDataTreeChangeListener {
+class CandidateListChangeListener implements DOMDataTreeChangeListener {
private static final Logger LOG = LoggerFactory.getLogger(CandidateListChangeListener.class);
private final ActorRef shard;
private final Map<YangInstanceIdentifier, Collection<String>> currentCandidates = new HashMap<>();
- public CandidateListChangeListener(ActorRef shard, ShardDataTree shardDataTree) {
+ CandidateListChangeListener(ActorRef shard) {
this.shard = Preconditions.checkNotNull(shard, "shard should not be null");
+ }
+ void init(ShardDataTree shardDataTree) {
shardDataTree.registerTreeChangeListener(YangInstanceIdentifier.builder(ENTITY_OWNERS_PATH).
node(EntityType.QNAME).node(EntityType.QNAME).node(ENTITY_QNAME).node(ENTITY_QNAME).
node(Candidate.QNAME).node(Candidate.QNAME).build(), this);
class EntityOwnershipShard extends Shard {
private final String localMemberName;
private final EntityOwnershipShardCommitCoordinator commitCoordinator;
+ private final EntityOwnershipListenerSupport listenerSupport;
private static DatastoreContext noPersistenceDatastoreContext(DatastoreContext datastoreContext) {
return DatastoreContext.newBuilderFrom(datastoreContext).persistent(false).build();
super(name, peerAddresses, noPersistenceDatastoreContext(datastoreContext), schemaContext);
this.localMemberName = localMemberName;
this.commitCoordinator = new EntityOwnershipShardCommitCoordinator(localMemberName, LOG);
+ this.listenerSupport = new EntityOwnershipListenerSupport(getContext());
}
@Override
protected void onRecoveryComplete() {
super.onRecoveryComplete();
- new CandidateListChangeListener(getSelf(), getDataStore());
+ new CandidateListChangeListener(getSelf()).init(getDataStore());
+ new EntityOwnerChangeListener(localMemberName, listenerSupport).init(getDataStore());
}
@Override
private void onRegisterCandidateLocal(RegisterCandidateLocal registerCandidate) {
LOG.debug("onRegisterCandidateLocal: {}", registerCandidate);
- // TODO - add the listener locally.
+ listenerSupport.addEntityOwnershipListener(registerCandidate.getEntity(), registerCandidate.getCandidate());
NormalizedNode<?, ?> entityOwners = entityOwnersWithCandidate(registerCandidate.getEntity().getType(),
registerCandidate.getEntity().getId(), localMemberName);
public void testOnDataTreeChanged() throws Exception {
JavaTestKit kit = new JavaTestKit(getSystem());
- CandidateListChangeListener listener = new CandidateListChangeListener(kit.getRef(), shardDataTree);
+ new CandidateListChangeListener(kit.getRef()).init(shardDataTree);
String memberName1 = "member-1";
writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, memberName1));
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.ENTITY_OWNERS_PATH;
import akka.actor.ActorRef;
import akka.actor.Props;
verifyCommittedEntityCandidate(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
verifyOwner(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
+
+ verify(candidate, timeout(5000)).ownershipChanged(entity, false, true);
}
@Test
verifyCommittedEntityCandidate(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
verifyOwner(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
+
+ verify(candidate, timeout(5000)).ownershipChanged(entity, false, true);
}
@Test
verifyCommittedEntityCandidate(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
verifyOwner(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
+
+ verify(candidate, timeout(5000)).ownershipChanged(entity, false, true);
}
@Test
verifyCommittedEntityCandidate(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
verifyOwner(shard, ENTITY_TYPE, entityId, LOCAL_MEMBER_NAME);
+
+ verify(candidate, timeout(5000)).ownershipChanged(entity, false, true);
}
@Test