blob: d4cabba2f30b8debf7e6a3f6120971521377e4d5 [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;
15import org.onlab.onos.net.DeviceId;
Madan Jampani58819b42014-10-09 13:48:51 -070016import org.onlab.onos.net.device.DeviceMastershipService;
17import org.onlab.onos.net.device.DeviceMastershipTermService;
tomea961ff2014-10-01 12:45:15 -070018import org.onlab.onos.store.trivial.impl.SimpleMastershipStore;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070019import org.onlab.packet.IpPrefix;
20
21import static org.junit.Assert.assertEquals;
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070022import static org.junit.Assert.assertNull;
Madan Jampani195af6e2014-10-09 15:01:17 -070023import static org.onlab.onos.net.device.DeviceMastershipRole.*;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070024
25/**
26 * Test codifying the mastership service contracts.
27 */
28public class MastershipManagerTest {
29
30 private static final NodeId NID_LOCAL = new NodeId("local");
31 private static final NodeId NID_OTHER = new NodeId("foo");
32 private static final IpPrefix LOCALHOST = IpPrefix.valueOf("127.0.0.1");
33 private static final DeviceId DEV_MASTER = DeviceId.deviceId("of:1");
34 private static final DeviceId DEV_OTHER = DeviceId.deviceId("of:2");
35
36 private MastershipManager mgr;
Madan Jampani58819b42014-10-09 13:48:51 -070037 protected DeviceMastershipService service;
Ayaka Koshibe406d0102014-09-24 16:08:12 -070038
39 @Before
40 public void setUp() {
41 mgr = new MastershipManager();
42 service = mgr;
43 mgr.store = new SimpleMastershipStore();
44 mgr.eventDispatcher = new TestEventDispatcher();
45 mgr.clusterService = new TestClusterService();
46 mgr.activate();
47 }
48
49 @After
50 public void tearDown() {
51 mgr.deactivate();
52 mgr.clusterService = null;
53 mgr.eventDispatcher = null;
54 mgr.store = null;
55 }
56
57 @Test
58 public void setRole() {
59 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
60 assertEquals("wrong local role:", STANDBY, mgr.getLocalRole(DEV_MASTER));
61
62 //set to master
63 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
64 assertEquals("wrong local role:", MASTER, mgr.getLocalRole(DEV_MASTER));
65 }
66
67 @Test
68 public void relinquishMastership() {
Ayaka Koshibed9f693e2014-09-29 18:04:54 -070069 //no backups - should turn to standby and no master for device
70 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
71 assertEquals("wrong role:", MASTER, mgr.getLocalRole(DEV_MASTER));
72 mgr.relinquishMastership(DEV_MASTER);
73 assertNull("wrong master:", mgr.getMasterFor(DEV_OTHER));
74 assertEquals("wrong role:", STANDBY, mgr.getLocalRole(DEV_MASTER));
75
76 //not master, nothing should happen
77 mgr.setRole(NID_LOCAL, DEV_OTHER, STANDBY);
78 mgr.relinquishMastership(DEV_OTHER);
79 assertNull("wrong role:", mgr.getMasterFor(DEV_OTHER));
80
81 //provide NID_OTHER as backup and relinquish
82 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
83 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
84 mgr.setRole(NID_OTHER, DEV_MASTER, STANDBY);
85 mgr.relinquishMastership(DEV_MASTER);
86 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_MASTER));
Ayaka Koshibe406d0102014-09-24 16:08:12 -070087 }
88
89 @Test
90 public void requestRoleFor() {
91 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
92 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
93
94 //local should be master for one but standby for other
95 assertEquals("wrong role:", MASTER, mgr.requestRoleFor(DEV_MASTER));
96 assertEquals("wrong role:", STANDBY, mgr.requestRoleFor(DEV_OTHER));
97 }
98
99 @Test
100 public void getMasterFor() {
101 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
102 mgr.setRole(NID_OTHER, DEV_OTHER, MASTER);
103 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_MASTER));
104 assertEquals("wrong master:", NID_OTHER, mgr.getMasterFor(DEV_OTHER));
105
106 //have NID_OTHER hand over DEV_OTHER to NID_LOCAL
107 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
108 assertEquals("wrong master:", NID_LOCAL, mgr.getMasterFor(DEV_OTHER));
109 }
110
111 @Test
112 public void getDevicesOf() {
113 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
114 mgr.setRole(NID_LOCAL, DEV_OTHER, STANDBY);
115 assertEquals("should be one device:", 1, mgr.getDevicesOf(NID_LOCAL).size());
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700116 //hand both devices to NID_LOCAL
117 mgr.setRole(NID_LOCAL, DEV_OTHER, MASTER);
118 assertEquals("should be two devices:", 2, mgr.getDevicesOf(NID_LOCAL).size());
119 }
120
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700121 @Test
122 public void termService() {
Madan Jampani58819b42014-10-09 13:48:51 -0700123 DeviceMastershipTermService ts = mgr.requestTermService();
Ayaka Koshibe48239b02014-09-25 17:12:31 -0700124
125 //term = 0 for both
126 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
127 assertEquals("inconsistent term: ", 0, ts.getMastershipTerm(DEV_MASTER).termNumber());
128
129 //hand devices to NID_LOCAL and back: term = 2
130 mgr.setRole(NID_OTHER, DEV_MASTER, MASTER);
131 mgr.setRole(NID_LOCAL, DEV_MASTER, MASTER);
132 assertEquals("inconsistent terms: ", 2, ts.getMastershipTerm(DEV_MASTER).termNumber());
133 }
134
Ayaka Koshibe406d0102014-09-24 16:08:12 -0700135 private final class TestClusterService implements ClusterService {
136
137 ControllerNode local = new DefaultControllerNode(NID_LOCAL, LOCALHOST);
138
139 @Override
140 public ControllerNode getLocalNode() {
141 return local;
142 }
143
144 @Override
145 public Set<ControllerNode> getNodes() {
146 return null;
147 }
148
149 @Override
150 public ControllerNode getNode(NodeId nodeId) {
151 return null;
152 }
153
154 @Override
155 public State getState(NodeId nodeId) {
156 return null;
157 }
158
159 @Override
160 public void addListener(ClusterEventListener listener) {
161 }
162
163 @Override
164 public void removeListener(ClusterEventListener listener) {
165 }
166
167 }
168}