Derive MockRaftActorContext from RaftActorContextImpl
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / RaftActorContextImpl.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.cluster.raft;
10
11 import akka.actor.ActorContext;
12 import akka.actor.ActorRef;
13 import akka.actor.ActorSelection;
14 import akka.actor.ActorSystem;
15 import akka.actor.Props;
16
17 import com.google.common.annotations.VisibleForTesting;
18 import com.google.common.base.Supplier;
19 import java.util.Collection;
20 import java.util.HashMap;
21 import java.util.Map;
22 import org.opendaylight.controller.cluster.DataPersistenceProvider;
23 import org.opendaylight.controller.cluster.raft.policy.RaftPolicy;
24 import org.slf4j.Logger;
25
26 public class RaftActorContextImpl implements RaftActorContext {
27
28     private final ActorRef actor;
29
30     private final ActorContext context;
31
32     private final String id;
33
34     private final ElectionTerm termInformation;
35
36     private long commitIndex;
37
38     private long lastApplied;
39
40     private ReplicatedLog replicatedLog;
41
42     private final Map<String, PeerInfo> peerInfoMap = new HashMap<>();
43
44     private final Logger LOG;
45
46     private ConfigParams configParams;
47
48     @VisibleForTesting
49     private Supplier<Long> totalMemoryRetriever;
50
51     // Snapshot manager will need to be created on demand as it needs raft actor context which cannot
52     // be passed to it in the constructor
53     private SnapshotManager snapshotManager;
54
55     private final DataPersistenceProvider persistenceProvider;
56
57     private short payloadVersion;
58
59     public RaftActorContextImpl(ActorRef actor, ActorContext context, String id,
60             ElectionTerm termInformation, long commitIndex, long lastApplied, Map<String, String> peerAddresses,
61             ConfigParams configParams, DataPersistenceProvider persistenceProvider, Logger logger) {
62         this.actor = actor;
63         this.context = context;
64         this.id = id;
65         this.termInformation = termInformation;
66         this.commitIndex = commitIndex;
67         this.lastApplied = lastApplied;
68         this.configParams = configParams;
69         this.persistenceProvider = persistenceProvider;
70         this.LOG = logger;
71
72         for(Map.Entry<String, String> e: peerAddresses.entrySet()) {
73             peerInfoMap.put(e.getKey(), new PeerInfo(e.getKey(), e.getValue(), VotingState.VOTING));
74         }
75     }
76
77     public void setPayloadVersion(short payloadVersion) {
78         this.payloadVersion = payloadVersion;
79     }
80
81     @Override
82     public short getPayloadVersion() {
83         return payloadVersion;
84     }
85
86     public void setConfigParams(ConfigParams configParams) {
87         this.configParams = configParams;
88     }
89
90     @Override
91     public ActorRef actorOf(Props props){
92         return context.actorOf(props);
93     }
94
95     @Override
96     public ActorSelection actorSelection(String path){
97         return context.actorSelection(path);
98     }
99
100     @Override
101     public String getId() {
102         return id;
103     }
104
105     @Override
106     public ActorRef getActor() {
107         return actor;
108     }
109
110     @Override
111     public ElectionTerm getTermInformation() {
112         return termInformation;
113     }
114
115     @Override
116     public long getCommitIndex() {
117         return commitIndex;
118     }
119
120     @Override public void setCommitIndex(long commitIndex) {
121         this.commitIndex = commitIndex;
122     }
123
124     @Override
125     public long getLastApplied() {
126         return lastApplied;
127     }
128
129     @Override
130     public void setLastApplied(long lastApplied) {
131         this.lastApplied = lastApplied;
132     }
133
134     @Override
135     public void setReplicatedLog(ReplicatedLog replicatedLog) {
136         this.replicatedLog = replicatedLog;
137     }
138
139     @Override
140     public ReplicatedLog getReplicatedLog() {
141         return replicatedLog;
142     }
143
144     @Override public ActorSystem getActorSystem() {
145         return context.system();
146     }
147
148     @Override public Logger getLogger() {
149         return this.LOG;
150     }
151
152     @Override
153     public Collection<String> getPeerIds() {
154         return peerInfoMap.keySet();
155     }
156
157     @Override
158     public Collection<PeerInfo> getPeers() {
159         return peerInfoMap.values();
160     }
161
162     @Override
163     public PeerInfo getPeerInfo(String peerId) {
164         return peerInfoMap.get(peerId);
165     }
166
167     @Override
168     public String getPeerAddress(String peerId) {
169         String peerAddress = null;
170         PeerInfo peerInfo = peerInfoMap.get(peerId);
171         if(peerInfo != null) {
172             peerAddress = peerInfo.getAddress();
173             if(peerAddress == null) {
174                 peerAddress = configParams.getPeerAddressResolver().resolve(peerId);
175                 peerInfo.setAddress(peerAddress);
176             }
177         }
178
179         return peerAddress;
180     }
181
182     @Override public ConfigParams getConfigParams() {
183         return configParams;
184     }
185
186     @Override
187     public void addToPeers(String id, String address, VotingState votingState) {
188         peerInfoMap.put(id, new PeerInfo(id, address, votingState));
189     }
190
191     @Override public void removePeer(String name) {
192         peerInfoMap.remove(name);
193     }
194
195     @Override public ActorSelection getPeerActorSelection(String peerId) {
196         String peerAddress = getPeerAddress(peerId);
197         if(peerAddress != null){
198             return actorSelection(peerAddress);
199         }
200         return null;
201     }
202
203     @Override
204     public void setPeerAddress(String peerId, String peerAddress) {
205         PeerInfo peerInfo = peerInfoMap.get(peerId);
206         if(peerInfo != null) {
207             LOG.info("Peer address for peer {} set to {}", peerId, peerAddress);
208             peerInfo.setAddress(peerAddress);
209         }
210     }
211
212     @Override
213     public SnapshotManager getSnapshotManager() {
214         if(snapshotManager == null){
215             snapshotManager = new SnapshotManager(this, LOG);
216         }
217         return snapshotManager;
218     }
219
220     @Override
221     public long getTotalMemory() {
222         return totalMemoryRetriever != null ? totalMemoryRetriever.get() : Runtime.getRuntime().totalMemory();
223     }
224
225     @Override
226     public void setTotalMemoryRetriever(Supplier<Long> retriever) {
227         totalMemoryRetriever = retriever;
228     }
229
230     @Override
231     public boolean hasFollowers() {
232         return getPeerIds().size() > 0;
233     }
234
235     @Override
236     public DataPersistenceProvider getPersistenceProvider() {
237         return persistenceProvider;
238     }
239
240
241     @Override
242     public RaftPolicy getRaftPolicy() {
243         return configParams.getRaftPolicy();
244     }
245 }