X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FMockRaftActorContext.java;h=a1088aa7f2b0bfe7be22cfc4b8ece4616fd58db3;hp=2e1464f38328af943fc9a90162d9f4839d37ebfa;hb=b17a51ecb983331f0e521e40f9dd2474f268de13;hpb=26cd54f2cbe0737db6e82aa96cd31671c6f6bf7e diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java index 2e1464f383..a1088aa7f2 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/MockRaftActorContext.java @@ -12,25 +12,80 @@ import akka.actor.ActorRef; import akka.actor.ActorSelection; import akka.actor.ActorSystem; import akka.actor.Props; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import com.google.common.base.Preconditions; +import com.google.protobuf.GeneratedMessage; +import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload; +import org.opendaylight.controller.protobuff.messages.cluster.raft.AppendEntriesMessages; +import org.opendaylight.controller.protobuff.messages.cluster.raft.test.MockPayloadMessages; -import java.util.concurrent.atomic.AtomicLong; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; public class MockRaftActorContext implements RaftActorContext { private String id; private ActorSystem system; private ActorRef actor; - private AtomicLong index = new AtomicLong(0); - private AtomicLong lastApplied = new AtomicLong(0); + private long index = 0; + private long lastApplied = 0; + private final ElectionTerm electionTerm; + private ReplicatedLog replicatedLog; + private Map peerAddresses = new HashMap<>(); + private ConfigParams configParams; public MockRaftActorContext(){ + electionTerm = null; + initReplicatedLog(); } public MockRaftActorContext(String id, ActorSystem system, ActorRef actor){ this.id = id; this.system = system; this.actor = actor; + + final String id1 = id; + electionTerm = new ElectionTerm() { + /** + * Identifier of the actor whose election term information this is + */ + private final String id = id1; + private long currentTerm = 0; + private String votedFor = ""; + + public long getCurrentTerm() { + return currentTerm; + } + + public String getVotedFor() { + return votedFor; + } + + public void update(long currentTerm, String votedFor){ + this.currentTerm = currentTerm; + this.votedFor = votedFor; + + // TODO : Write to some persistent state + } + + @Override public void updateAndPersist(long currentTerm, + String votedFor) { + update(currentTerm, votedFor); + } + }; + + configParams = new DefaultConfigParamsImpl(); + + initReplicatedLog(); + } + + + public void initReplicatedLog(){ + this.replicatedLog = new SimpleReplicatedLog(); + this.replicatedLog.append(new MockReplicatedLogEntry(1, 1, new MockPayload(""))); } @Override public ActorRef actorOf(Props props) { @@ -50,49 +105,174 @@ public class MockRaftActorContext implements RaftActorContext { } @Override public ElectionTerm getTermInformation() { - return new ElectionTermImpl(this.id); + return electionTerm; } - public void setIndex(AtomicLong index){ + public void setIndex(long index){ this.index = index; } - @Override public AtomicLong getCommitIndex() { + @Override public long getCommitIndex() { return index; } - public void setLastApplied(AtomicLong lastApplied){ + @Override public void setCommitIndex(long commitIndex) { + this.index = commitIndex; + } + + @Override public void setLastApplied(long lastApplied){ this.lastApplied = lastApplied; } - @Override public AtomicLong getLastApplied() { + @Override public long getLastApplied() { return lastApplied; } + public void setReplicatedLog(ReplicatedLog replicatedLog) { + this.replicatedLog = replicatedLog; + } + @Override public ReplicatedLog getReplicatedLog() { - return new ReplicatedLog(){ + return replicatedLog; + } - @Override public ReplicatedLogEntry getReplicatedLogEntry( - long index) { - throw new UnsupportedOperationException( - "getReplicatedLogEntry"); - } + @Override public ActorSystem getActorSystem() { + return this.system; + } + + @Override public LoggingAdapter getLogger() { + return Logging.getLogger(system, this); + } - @Override public ReplicatedLogEntry last() { - return new ReplicatedLogEntry() { - @Override public Object getData() { - return null; - } + @Override public Map getPeerAddresses() { + return peerAddresses; + } + + @Override public String getPeerAddress(String peerId) { + return peerAddresses.get(peerId); + } + + @Override public void addToPeers(String name, String address) { + peerAddresses.put(name, address); + } + + @Override public void removePeer(String name) { + peerAddresses.remove(name); + } - @Override public long getTerm() { - return 1; - } + @Override public ActorSelection getPeerActorSelection(String peerId) { + String peerAddress = getPeerAddress(peerId); + if(peerAddress != null){ + return actorSelection(peerAddress); + } + return null; + } - @Override public long getIndex() { - return 1; - } - }; + @Override public void setPeerAddress(String peerId, String peerAddress) { + Preconditions.checkState(peerAddresses.containsKey(peerId)); + peerAddresses.put(peerId, peerAddress); + } + + public void setPeerAddresses(Map peerAddresses) { + this.peerAddresses = peerAddresses; + } + + @Override + public ConfigParams getConfigParams() { + return configParams; + } + + public void setConfigParams(ConfigParams configParams) { + this.configParams = configParams; + } + + public static class SimpleReplicatedLog extends AbstractReplicatedLogImpl { + @Override public void appendAndPersist( + ReplicatedLogEntry replicatedLogEntry) { + append(replicatedLogEntry); + } + + @Override public void removeFromAndPersist(long index) { + removeFrom(index); + } + } + + public static class MockPayload extends Payload implements Serializable { + private String value = ""; + + public MockPayload(){ + + } + + public MockPayload(String s) { + this.value = s; + } + + @Override public Map encode() { + Map map = new HashMap(); + map.put(MockPayloadMessages.value, value); + return map; + } + + @Override public Payload decode( + AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload payloadProtoBuff) { + String value = payloadProtoBuff.getExtension(MockPayloadMessages.value); + this.value = value; + return this; + } + + @Override public String getClientPayloadClassName() { + return MockPayload.class.getName(); + } + + public String toString() { + return value; + } + } + + public static class MockReplicatedLogEntry implements ReplicatedLogEntry, Serializable { + + private final long term; + private final long index; + private final Payload data; + + public MockReplicatedLogEntry(long term, long index, Payload data){ + + this.term = term; + this.index = index; + this.data = data; + } + + @Override public Payload getData() { + return data; + } + + @Override public long getTerm() { + return term; + } + + @Override public long getIndex() { + return index; + } + } + + public static class MockReplicatedLogBuilder { + private ReplicatedLog mockLog = new SimpleReplicatedLog(); + + public MockReplicatedLogBuilder createEntries(int start, int end, int term) { + for (int i=start; i