blob: 33961e41c4ccf8f6b2ad185a0e7306538b99f3fc [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Ayaka Koshibe406d0102014-09-24 16:08:12 -070016package org.onlab.onos.cluster.impl;
17
18import java.util.Set;
19
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.onos.cluster.ClusterEventListener;
24import org.onlab.onos.cluster.ClusterService;
25import org.onlab.onos.cluster.ControllerNode;
26import org.onlab.onos.cluster.ControllerNode.State;
27import org.onlab.onos.cluster.DefaultControllerNode;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070028import org.onlab.onos.cluster.NodeId;
29import org.onlab.onos.event.impl.TestEventDispatcher;
Yuta HIGUCHI80912e62014-10-12 00:15:47 -070030import org.onlab.onos.mastership.MastershipService;
Yuta HIGUCHI0c6e1842014-11-05 22:34:23 -080031import org.onlab.onos.mastership.MastershipStore;
Yuta HIGUCHI80912e62014-10-12 00:15:47 -070032import org.onlab.onos.mastership.MastershipTermService;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070033import org.onlab.onos.net.DeviceId;
tomea961ff2014-10-01 12:45:15 -070034import org.onlab.onos.store.trivial.impl.SimpleMastershipStore;
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070035import org.onlab.packet.IpAddress;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070036
Ayaka Koshibeea5b4ce2014-10-11 14:17:17 -070037import com.google.common.collect.Sets;
38
Ayaka Koshibe406d0102014-09-24 16:08:12 -070039import static org.junit.Assert.assertEquals;
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070040import static org.junit.Assert.assertNull;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070041import static org.onlab.onos.net.MastershipRole.*;
42
43/**
44 * Test codifying the mastership service contracts.
45 */
46public class MastershipManagerTest {
47
48 private static final NodeId NID_LOCAL = new NodeId("local");
49 private static final NodeId NID_OTHER = new NodeId("foo");
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070050 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
Ayaka Koshibe406d0102014-09-24 16:08:12 -070051 private static final DeviceId DEV_MASTER = DeviceId.deviceId("of:1");
52 private static final DeviceId DEV_OTHER = DeviceId.deviceId("of:2");
53
54 private MastershipManager mgr;
55 protected MastershipService service;
56
57 @Before
58 public void setUp() {
59 mgr = new MastershipManager();
60 service = mgr;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070061 mgr.eventDispatcher = new TestEventDispatcher();
62 mgr.clusterService = new TestClusterService();
Yuta HIGUCHI0c6e1842014-11-05 22:34:23 -080063 mgr.store = new TestSimpleMastershipStore(mgr.clusterService);
Ayaka Koshibe406d0102014-09-24 16:08:12 -070064 mgr.activate();
65 }
66
67 @After
68 public void tearDown() {
69 mgr.deactivate();
70 mgr.clusterService = null;
71 mgr.eventDispatcher = null;
72 mgr.store = null;
73 }
74
75 @Test
76 public void setRole() {
77 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
Yuta HIGUCHI0c6e1842014-11-05 22:34:23 -080078 assertEquals("wrong local role:", NONE, mgr.getLocalRole(DEV_MASTER));
79 assertEquals("wrong obtained role:", STANDBY, mgr.requestRoleFor(DEV_MASTER));
Ayaka Koshibe406d0102014-09-24 16:08:12 -070080
81 //set to master
82 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
83 assertEquals("wrong local role:", MASTER, mgr.getLocalRole(DEV_MASTER));
84 }
85
86 @Test
87 public void relinquishMastership() {
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070088 //no backups - should just turn to NONE for device.
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070089 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
90 assertEquals("wrong role:", MASTER, mgr.getLocalRole(DEV_MASTER));
91 mgr.relinquishMastership(DEV_MASTER);
92 assertNull("wrong master:", mgr.getMasterFor(DEV_OTHER));
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070093 assertEquals("wrong role:", NONE, mgr.getLocalRole(DEV_MASTER));
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070094
95 //not master, nothing should happen
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070096 mgr.setRole(NID_LOCAL, DEV_OTHER, NONE);
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070097 mgr.relinquishMastership(DEV_OTHER);
98 assertNull("wrong role:", mgr.getMasterFor(DEV_OTHER));
99
100 //provide NID_OTHER as backup and relinquish
101 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
102 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
103 mgr.setRole(NID_OTHER, DEV_MASTER, STANDBY);
104 mgr.relinquishMastership(DEV_MASTER);
105 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_MASTER));
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700106 }
107
108 @Test
109 public void requestRoleFor() {
110 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
111 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
112
113 //local should be master for one but standby for other
114 assertEquals("wrong role:", MASTER, mgr.requestRoleFor(DEV_MASTER));
115 assertEquals("wrong role:", STANDBY, mgr.requestRoleFor(DEV_OTHER));
116 }
117
118 @Test
119 public void getMasterFor() {
120 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
121 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
122 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
123 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_OTHER));
124
125 //have NID_OTHER hand over DEV_OTHER to NID_LOCAL
126 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
127 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_OTHER));
128 }
129
130 @Test
131 public void getDevicesOf() {
132 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
133 mgr.setRole(NID_LOCAL, DEV_OTHER, STANDBY);
134 assertEquals("should be one device:", 1, mgr.getDevicesOf(NID_LOCAL).size());
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700135 //hand both devices to NID_LOCAL
136 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
137 assertEquals("should be two devices:", 2, mgr.getDevicesOf(NID_LOCAL).size());
138 }
139
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700140 @Test
141 public void termService() {
142 MastershipTermService ts = mgr.requestTermService();
143
Yuta HIGUCHIdfe6e3b2014-10-30 11:31:51 -0700144 //term = 1 for both
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700145 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
Yuta HIGUCHIdfe6e3b2014-10-30 11:31:51 -0700146 assertEquals("inconsistent term: ", 1, ts.getMastershipTerm(DEV_MASTER).termNumber());
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700147
Yuta HIGUCHIdfe6e3b2014-10-30 11:31:51 -0700148 //hand devices to NID_LOCAL and back: term = 1 + 2
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700149 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
150 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
Yuta HIGUCHIdfe6e3b2014-10-30 11:31:51 -0700151 assertEquals("inconsistent terms: ", 3, ts.getMastershipTerm(DEV_MASTER).termNumber());
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700152 }
153
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700154 private final class TestClusterService implements ClusterService {
155
156 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
157
158 @Override
159 public ControllerNode getLocalNode() {
160 return local;
161 }
162
163 @Override
164 public Set<ControllerNode> getNodes() {
Ayaka Koshibeea5b4ce2014-10-11 14:17:17 -0700165 return Sets.newHashSet();
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700166 }
167
168 @Override
169 public ControllerNode getNode(NodeId nodeId) {
170 return null;
171 }
172
173 @Override
174 public State getState(NodeId nodeId) {
175 return null;
176 }
177
178 @Override
179 public void addListener(ClusterEventListener listener) {
180 }
181
182 @Override
183 public void removeListener(ClusterEventListener listener) {
184 }
185
186 }
Yuta HIGUCHI0c6e1842014-11-05 22:34:23 -0800187
188 private final class TestSimpleMastershipStore extends SimpleMastershipStore
189 implements MastershipStore {
190
191 public TestSimpleMastershipStore(ClusterService clusterService) {
192 super.clusterService = clusterService;
193 }
194 }
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700195}