Fixup "Leader should always apply modifications as local" regression
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / shardmanager / TestShardManager.java
1 /*
2  * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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 package org.opendaylight.controller.cluster.datastore.shardmanager;
9
10 import akka.actor.ActorRef;
11 import akka.actor.Props;
12 import java.util.Map;
13 import org.opendaylight.controller.cluster.datastore.DatastoreContext;
14 import org.opendaylight.controller.cluster.datastore.TestShard;
15 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
16 import org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot;
17
18 public class TestShardManager extends ShardManager {
19     TestShardManager(AbstractShardManagerCreator<?> builder) {
20         super(builder);
21     }
22
23     @Override
24     public void handleCommand(Object message) throws Exception {
25         if (GetLocalShards.INSTANCE.equals(message)) {
26             sender().tell(new GetLocalShardsReply(localShards), null);
27         } else {
28             super.handleCommand(message);
29         }
30     }
31
32     /**
33      * Plug into shard actor creation to replace info with our testing one.
34      * @param info shard info.
35      * @return actor for replaced shard info.
36      */
37     @Override
38     protected ActorRef newShardActor(ShardInformation info) {
39         Map<String, String> peerAddresses = getPeerAddresses(info.getShardName());
40         ShardInformation newInfo = new ShardInformation(info.getShardName(),
41                 info.getShardId(), peerAddresses,
42                 info.getDatastoreContext(),
43                 TestShard.builder()
44                         .restoreFromSnapshot(info.getBuilder().getRestoreFromSnapshot()),
45                 peerAddressResolver);
46         newInfo.setSchemaContext(info.getSchemaContext());
47         newInfo.setActiveMember(info.isActiveMember());
48
49
50         localShards.put(info.getShardName(), info);
51         return getContext().actorOf(newInfo.newProps().withDispatcher(shardDispatcherPath),
52                 info.getShardId().toString());
53     }
54
55     @Override
56     ShardInformation createShardInfoFor(String shardName, ShardIdentifier shardId,
57                                         Map<String, String> peerAddresses,
58                                         DatastoreContext datastoreContext,
59                                         Map<String, DatastoreSnapshot.ShardSnapshot> shardSnapshots) {
60         return new ShardInformation(shardName, shardId, peerAddresses,
61                 datastoreContext, TestShard.builder().restoreFromSnapshot(shardSnapshots.get(shardName)),
62                 peerAddressResolver);
63     }
64
65     public static class TestShardManagerCreator extends AbstractShardManagerCreator<TestShardManagerCreator> {
66         @Override
67         public Props props() {
68             verify();
69             return Props.create(TestShardManager.class, this);
70         }
71     }
72
73     public static final class GetLocalShards {
74         public static final GetLocalShards INSTANCE = new GetLocalShards();
75
76         private GetLocalShards() {
77
78         }
79     }
80
81     public static class GetLocalShardsReply {
82
83         private final Map<String, ShardInformation> localShards;
84
85         public GetLocalShardsReply(Map<String, ShardInformation> localShards) {
86             this.localShards = localShards;
87         }
88
89         public Map<String, ShardInformation> getLocalShards() {
90             return localShards;
91         }
92     }
93 }