blob: 4e1f9051f3914cdb5945502550acf3294e245635 [file] [log] [blame]
Ayaka Koshibe406d0102014-09-24 16:08:12 -07001package org.onlab.onos.cluster.impl;
2
3import java.util.Set;
4
5import org.junit.After;
6import org.junit.Before;
7import org.junit.Test;
8import org.onlab.onos.cluster.ClusterEventListener;
9import org.onlab.onos.cluster.ClusterService;
10import org.onlab.onos.cluster.ControllerNode;
11import org.onlab.onos.cluster.ControllerNode.State;
12import org.onlab.onos.cluster.DefaultControllerNode;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070013import org.onlab.onos.cluster.NodeId;
14import org.onlab.onos.event.impl.TestEventDispatcher;
Yuta HIGUCHI80912e62014-10-12 00:15:47 -070015import org.onlab.onos.mastership.MastershipService;
16import org.onlab.onos.mastership.MastershipTermService;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070017import org.onlab.onos.net.DeviceId;
tomea961ff2014-10-01 12:45:15 -070018import org.onlab.onos.store.trivial.impl.SimpleMastershipStore;
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070019import org.onlab.packet.IpAddress;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070020
Ayaka Koshibeea5b4ce2014-10-11 14:17:17 -070021import com.google.common.collect.Sets;
22
Ayaka Koshibe406d0102014-09-24 16:08:12 -070023import static org.junit.Assert.assertEquals;
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070024import static org.junit.Assert.assertNull;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070025import static org.onlab.onos.net.MastershipRole.*;
26
27/**
28 * Test codifying the mastership service contracts.
29 */
30public class MastershipManagerTest {
31
32 private static final NodeId NID_LOCAL = new NodeId("local");
33 private static final NodeId NID_OTHER = new NodeId("foo");
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070034 private static final IpAddress LOCALHOST = IpAddress.valueOf("127.0.0.1");
Ayaka Koshibe406d0102014-09-24 16:08:12 -070035 private static final DeviceId DEV_MASTER = DeviceId.deviceId("of:1");
36 private static final DeviceId DEV_OTHER = DeviceId.deviceId("of:2");
37
38 private MastershipManager mgr;
39 protected MastershipService service;
40
41 @Before
42 public void setUp() {
43 mgr = new MastershipManager();
44 service = mgr;
45 mgr.store = new SimpleMastershipStore();
46 mgr.eventDispatcher = new TestEventDispatcher();
47 mgr.clusterService = new TestClusterService();
48 mgr.activate();
49 }
50
51 @After
52 public void tearDown() {
53 mgr.deactivate();
54 mgr.clusterService = null;
55 mgr.eventDispatcher = null;
56 mgr.store = null;
57 }
58
59 @Test
60 public void setRole() {
61 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
62 assertEquals("wrong local role:", STANDBY, mgr.getLocalRole(DEV_MASTER));
63
64 //set to master
65 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
66 assertEquals("wrong local role:", MASTER, mgr.getLocalRole(DEV_MASTER));
67 }
68
69 @Test
70 public void relinquishMastership() {
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070071 //no backups - should just turn to NONE for device.
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070072 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
73 assertEquals("wrong role:", MASTER, mgr.getLocalRole(DEV_MASTER));
74 mgr.relinquishMastership(DEV_MASTER);
75 assertNull("wrong master:", mgr.getMasterFor(DEV_OTHER));
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070076 assertEquals("wrong role:", NONE, mgr.getLocalRole(DEV_MASTER));
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070077
78 //not master, nothing should happen
Ayaka Koshibeb62aab52014-10-24 13:15:25 -070079 mgr.setRole(NID_LOCAL, DEV_OTHER, NONE);
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070080 mgr.relinquishMastership(DEV_OTHER);
81 assertNull("wrong role:", mgr.getMasterFor(DEV_OTHER));
82
83 //provide NID_OTHER as backup and relinquish
84 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
85 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
86 mgr.setRole(NID_OTHER, DEV_MASTER, STANDBY);
87 mgr.relinquishMastership(DEV_MASTER);
88 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_MASTER));
Ayaka Koshibe406d0102014-09-24 16:08:12 -070089 }
90
91 @Test
92 public void requestRoleFor() {
93 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
94 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
95
96 //local should be master for one but standby for other
97 assertEquals("wrong role:", MASTER, mgr.requestRoleFor(DEV_MASTER));
98 assertEquals("wrong role:", STANDBY, mgr.requestRoleFor(DEV_OTHER));
99 }
100
101 @Test
102 public void getMasterFor() {
103 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
104 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
105 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
106 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_OTHER));
107
108 //have NID_OTHER hand over DEV_OTHER to NID_LOCAL
109 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
110 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_OTHER));
111 }
112
113 @Test
114 public void getDevicesOf() {
115 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
116 mgr.setRole(NID_LOCAL, DEV_OTHER, STANDBY);
117 assertEquals("should be one device:", 1, mgr.getDevicesOf(NID_LOCAL).size());
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700118 //hand both devices to NID_LOCAL
119 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
120 assertEquals("should be two devices:", 2, mgr.getDevicesOf(NID_LOCAL).size());
121 }
122
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700123 @Test
124 public void termService() {
125 MastershipTermService ts = mgr.requestTermService();
126
127 //term = 0 for both
128 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
129 assertEquals("inconsistent term: ", 0, ts.getMastershipTerm(DEV_MASTER).termNumber());
130
131 //hand devices to NID_LOCAL and back: term = 2
132 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
133 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
134 assertEquals("inconsistent terms: ", 2, ts.getMastershipTerm(DEV_MASTER).termNumber());
135 }
136
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700137 private final class TestClusterService implements ClusterService {
138
139 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
140
141 @Override
142 public ControllerNode getLocalNode() {
143 return local;
144 }
145
146 @Override
147 public Set<ControllerNode> getNodes() {
Ayaka Koshibeea5b4ce2014-10-11 14:17:17 -0700148 return Sets.newHashSet();
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700149 }
150
151 @Override
152 public ControllerNode getNode(NodeId nodeId) {
153 return null;
154 }
155
156 @Override
157 public State getState(NodeId nodeId) {
158 return null;
159 }
160
161 @Override
162 public void addListener(ClusterEventListener listener) {
163 }
164
165 @Override
166 public void removeListener(ClusterEventListener listener) {
167 }
168
169 }
170}