Allow programmatic module sharding configuration
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / config / ConfigurationImplTest.java
1 /*
2  * Copyright (c) 2014, 2015 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 package org.opendaylight.controller.cluster.datastore.config;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13
14 import com.google.common.collect.ImmutableSortedSet;
15 import com.google.common.collect.Sets;
16 import java.net.URI;
17 import java.util.Collection;
18 import java.util.Set;
19 import org.junit.Assert;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.controller.cluster.access.concepts.MemberName;
23 import org.opendaylight.controller.cluster.datastore.shardstrategy.ModuleShardStrategy;
24 import org.opendaylight.controller.cluster.datastore.shardstrategy.ShardStrategy;
25
26 public class ConfigurationImplTest {
27     private static final MemberName MEMBER_1 = MemberName.forName("member-1");
28     private static final MemberName MEMBER_2 = MemberName.forName("member-2");
29     private static final MemberName MEMBER_3 = MemberName.forName("member-3");
30     private static final MemberName MEMBER_4 = MemberName.forName("member-4");
31     private static final MemberName MEMBER_5 = MemberName.forName("member-5");
32     private static final MemberName MEMBER_100 = MemberName.forName("member-100");
33
34     private ConfigurationImpl configuration;
35
36     @Before
37     public void setup() {
38         configuration = new ConfigurationImpl("module-shards.conf", "modules.conf");
39     }
40
41     @Test
42     public void testConstructor() {
43         Assert.assertNotNull(configuration);
44     }
45
46     @Test
47     public void testGetMemberShardNames() {
48         Collection<String> memberShardNames = configuration.getMemberShardNames(MEMBER_1);
49         assertEquals("getMemberShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default"),
50                 ImmutableSortedSet.copyOf(memberShardNames));
51
52         memberShardNames = configuration.getMemberShardNames(MEMBER_2);
53         assertEquals("getMemberShardNames", ImmutableSortedSet.of("default"),
54                 ImmutableSortedSet.copyOf(memberShardNames));
55
56         memberShardNames = configuration.getMemberShardNames(MEMBER_100);
57         assertEquals("getMemberShardNames size", 0, memberShardNames.size());
58     }
59
60     @Test
61     public void testGetMembersFromShardName() {
62         Collection<MemberName> members = configuration.getMembersFromShardName("default");
63         assertEquals("getMembersFromShardName", ImmutableSortedSet.of(MEMBER_1, MEMBER_2, MEMBER_3),
64                 ImmutableSortedSet.copyOf(members));
65
66         members = configuration.getMembersFromShardName("cars-1");
67         assertEquals("getMembersFromShardName", ImmutableSortedSet.of(MEMBER_1),
68                 ImmutableSortedSet.copyOf(members));
69
70         // Try to find a shard which is not present
71
72         members = configuration.getMembersFromShardName("foobar");
73         assertEquals("getMembersFromShardName size", 0, members.size());
74     }
75
76     @Test
77     public void testGetAllShardNames() {
78         Set<String> allShardNames = configuration.getAllShardNames();
79         assertEquals("getAllShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default"),
80                 ImmutableSortedSet.copyOf(allShardNames));
81     }
82
83     @Test
84     public void testGetModuleNameFromNameSpace() {
85         String moduleName = configuration.getModuleNameFromNameSpace(
86                 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test:cars");
87         assertEquals("getModuleNameFromNameSpace", "cars", moduleName);
88
89         moduleName = configuration.getModuleNameFromNameSpace(
90                 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test");
91         assertEquals("getModuleNameFromNameSpace", "test", moduleName);
92
93         moduleName = configuration.getModuleNameFromNameSpace("non-existent");
94         assertNull("getModuleNameFromNameSpace - expected null", moduleName);
95     }
96
97     @Test
98     public void testGetStrategyForModule() {
99         ShardStrategy strategy = configuration.getStrategyForModule("cars");
100         assertNotNull("getStrategyForModule null", strategy);
101         assertEquals("getStrategyForModule type", ModuleShardStrategy.class, strategy.getClass());
102
103         strategy = configuration.getStrategyForModule("people");
104         assertNotNull("getStrategyForModule null", strategy);
105         assertEquals("getStrategyForModule type", ModuleShardStrategy.class, strategy.getClass());
106
107         strategy = configuration.getStrategyForModule("default");
108         assertNull("getStrategyForModule - expected null", strategy);
109
110         strategy = configuration.getStrategyForModule("non-existent");
111         assertNull("getStrategyForModule - expected null", strategy);
112     }
113
114     @Test
115     public void testGetShardNameForModule() {
116         String shardName = configuration.getShardNameForModule("cars");
117         assertEquals("getShardNameForModule", "cars-1", shardName);
118
119         shardName = configuration.getShardNameForModule("people");
120         assertEquals("getShardNameForModule", "people-1", shardName);
121
122         shardName = configuration.getShardNameForModule("non-existent");
123         assertNull("getShardNameForModule - expected null", shardName);
124     }
125
126     @Test
127     public void testAddModuleShardConfiguration() throws Exception {
128         URI namespace = new URI("urn:opendaylight:test:oven");
129         String moduleName = "oven";
130         String shardName = "oven-shard";
131         String shardStrategyName = ModuleShardStrategy.NAME;
132         Collection<MemberName> shardMemberNames = ImmutableSortedSet.of(MEMBER_1, MEMBER_4, MEMBER_5);
133
134         configuration.addModuleShardConfiguration(new ModuleShardConfiguration(namespace, moduleName, shardName,
135                 shardStrategyName, shardMemberNames));
136
137         assertEquals("getMemberShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default", shardName),
138                 ImmutableSortedSet.copyOf(configuration.getMemberShardNames(MEMBER_1)));
139         assertEquals("getMemberShardNames", ImmutableSortedSet.of(shardName),
140                 ImmutableSortedSet.copyOf(configuration.getMemberShardNames(MEMBER_4)));
141         assertEquals("getMemberShardNames", ImmutableSortedSet.of(shardName),
142                 ImmutableSortedSet.copyOf(configuration.getMemberShardNames(MEMBER_5)));
143         assertEquals("getMembersFromShardName", shardMemberNames,
144                 ImmutableSortedSet.copyOf(configuration.getMembersFromShardName(shardName)));
145         assertEquals("getShardNameForModule", shardName, configuration.getShardNameForModule(moduleName));
146         assertEquals("getModuleNameFromNameSpace", moduleName,
147                 configuration.getModuleNameFromNameSpace(namespace.toASCIIString()));
148         assertEquals("getAllShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default", shardName),
149                 ImmutableSortedSet.copyOf(configuration.getAllShardNames()));
150
151         ShardStrategy strategy = configuration.getStrategyForModule("cars");
152         assertNotNull("getStrategyForModule null", strategy);
153         assertEquals("getStrategyForModule type", ModuleShardStrategy.class, strategy.getClass());
154     }
155
156     @Test
157     public void testGetUniqueMemberNamesForAllShards() {
158         assertEquals("getUniqueMemberNamesForAllShards", Sets.newHashSet(MEMBER_1, MEMBER_2, MEMBER_3),
159                 configuration.getUniqueMemberNamesForAllShards());
160     }
161
162     @Test
163     public void testAddMemberReplicaForShard() {
164         configuration.addMemberReplicaForShard("people-1", MEMBER_2);
165         String shardName = configuration.getShardNameForModule("people");
166         assertEquals("ModuleShardName", "people-1", shardName);
167         ShardStrategy shardStrategy = configuration.getStrategyForModule("people");
168         assertEquals("ModuleStrategy", ModuleShardStrategy.class, shardStrategy.getClass());
169         Collection<MemberName> members = configuration.getMembersFromShardName("people-1");
170         assertEquals("Members", ImmutableSortedSet.of(MEMBER_1, MEMBER_2),
171             ImmutableSortedSet.copyOf(members));
172
173         configuration.addMemberReplicaForShard("non-existent", MEMBER_2);
174         Set<String> shardNames = configuration.getAllShardNames();
175         assertEquals("ShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default"),
176             ImmutableSortedSet.copyOf(shardNames));
177     }
178
179     @Test
180     public void testRemoveMemberReplicaForShard() {
181         configuration.removeMemberReplicaForShard("default", MEMBER_2);
182         String shardName = configuration.getShardNameForModule("default");
183         assertEquals("ModuleShardName", "default", shardName);
184         ShardStrategy shardStrategy = configuration.getStrategyForModule("default");
185         assertNull("ModuleStrategy", shardStrategy);
186         Collection<MemberName> members = configuration.getMembersFromShardName("default");
187         assertEquals("Members", ImmutableSortedSet.of(MEMBER_1, MEMBER_3),
188             ImmutableSortedSet.copyOf(members));
189
190         configuration.removeMemberReplicaForShard("non-existent", MEMBER_2);
191         Set<String> shardNames = configuration.getAllShardNames();
192         assertEquals("ShardNames", ImmutableSortedSet.of("people-1", "cars-1", "test-1", "default"),
193             ImmutableSortedSet.copyOf(shardNames));
194     }
195 }