blob: 1bd06a1f1e6d5a2f343a8e02fc60aaebdc2d9c12 [file] [log] [blame]
Madan Jampani5e5b3d62016-02-01 16:03:33 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani5e5b3d62016-02-01 16:03:33 -08003 *
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 */
16package org.onosproject.store.primitives.resources.impl;
17
18import java.util.Map;
19import java.util.Set;
20
21import org.onosproject.cluster.Leadership;
22import org.onosproject.cluster.NodeId;
23
Madan Jampanifc981772016-02-16 09:46:42 -080024
Madan Jampani5e5b3d62016-02-01 16:03:33 -080025import com.google.common.base.MoreObjects;
26import com.google.common.base.Strings;
27
28import io.atomix.catalyst.buffer.BufferInput;
29import io.atomix.catalyst.buffer.BufferOutput;
30import io.atomix.catalyst.serializer.CatalystSerializable;
Madan Jampanifc981772016-02-16 09:46:42 -080031import io.atomix.catalyst.serializer.SerializableTypeResolver;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080032import io.atomix.catalyst.serializer.Serializer;
Madan Jampanifc981772016-02-16 09:46:42 -080033import io.atomix.catalyst.serializer.SerializerRegistry;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080034import io.atomix.catalyst.util.Assert;
Madan Jampani3a9911c2016-02-21 11:25:45 -080035import io.atomix.copycat.Command;
36import io.atomix.copycat.Query;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080037
38/**
39 * {@link AtomixLeaderElector} resource state machine operations.
40 */
41public final class AtomixLeaderElectorCommands {
42
43 private AtomixLeaderElectorCommands() {
44 }
45
46 /**
47 * Abstract election query.
48 */
49 @SuppressWarnings("serial")
50 public abstract static class ElectionQuery<V> implements Query<V>, CatalystSerializable {
51
52 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -080053 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
54 }
55
56 @Override
57 public void readObject(BufferInput<?> buffer, Serializer serializer) {
58 }
59 }
60
61 /**
62 * Abstract election topic query.
63 */
64 @SuppressWarnings("serial")
65 public abstract static class TopicQuery<V> extends ElectionQuery<V> implements CatalystSerializable {
66 String topic;
67
68 public TopicQuery() {
69 }
70
71 public TopicQuery(String topic) {
72 this.topic = Assert.notNull(topic, "topic");
73 }
74
75 /**
76 * Returns the topic.
77 * @return topic
78 */
79 public String topic() {
80 return topic;
81 }
82
83 @Override
84 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
85 serializer.writeObject(topic, buffer);
86 }
87
88 @Override
89 public void readObject(BufferInput<?> buffer, Serializer serializer) {
90 topic = serializer.readObject(buffer);
91 }
92 }
93
94 /**
95 * Abstract election command.
96 */
97 @SuppressWarnings("serial")
98 public abstract static class ElectionCommand<V> implements Command<V>, CatalystSerializable {
99
100 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800101 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
102 }
103
104 @Override
105 public void readObject(BufferInput<?> buffer, Serializer serializer) {
106 }
107 }
108
109 /**
110 * Listen command.
111 */
112 @SuppressWarnings("serial")
113 public static class Listen extends ElectionCommand<Void> {
114 }
115
116 /**
117 * Unlisten command.
118 */
119 @SuppressWarnings("serial")
120 public static class Unlisten extends ElectionCommand<Void> {
121
122 @Override
123 public CompactionMode compaction() {
124 return CompactionMode.QUORUM;
125 }
126 }
127
128 /**
129 * GetLeader query.
130 */
131 @SuppressWarnings("serial")
132 public static class GetLeadership extends TopicQuery<Leadership> {
133
134 public GetLeadership() {
135 }
136
137 public GetLeadership(String topic) {
138 super(topic);
139 }
140
141 @Override
142 public String toString() {
143 return MoreObjects.toStringHelper(getClass())
144 .add("topic", topic)
145 .toString();
146 }
147 }
148
149 /**
150 * GetAllLeaders query.
151 */
152 @SuppressWarnings("serial")
153 public static class GetAllLeaderships extends ElectionQuery<Map<String, Leadership>> {
154 }
155
156 /**
157 * GetElectedTopics query.
158 */
159 @SuppressWarnings("serial")
160 public static class GetElectedTopics extends ElectionQuery<Set<String>> {
161 private NodeId nodeId;
162
163 public GetElectedTopics() {
164 }
165
166 public GetElectedTopics(NodeId nodeId) {
167 this.nodeId = Assert.argNot(nodeId, nodeId == null, "nodeId cannot be null");
168 }
169
170 /**
171 * Returns the nodeId to check.
172 *
173 * @return The nodeId to check.
174 */
175 public NodeId nodeId() {
176 return nodeId;
177 }
178
179 @Override
180 public String toString() {
181 return MoreObjects.toStringHelper(getClass())
182 .add("nodeId", nodeId)
183 .toString();
184 }
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700185
186 @Override
187 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
188 super.writeObject(buffer, serializer);
189 serializer.writeObject(nodeId, buffer);
190 }
191
192 @Override
193 public void readObject(BufferInput<?> buffer, Serializer serializer) {
194 super.readObject(buffer, serializer);
195 nodeId = serializer.readObject(buffer);
196 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800197 }
198
199 /**
200 * Enter and run for leadership.
201 */
202 @SuppressWarnings("serial")
203 public static class Run extends ElectionCommand<Leadership> {
204 private String topic;
205 private NodeId nodeId;
206
207 public Run() {
208 }
209
210 public Run(String topic, NodeId nodeId) {
211 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
212 this.nodeId = Assert.argNot(nodeId, nodeId == null, "nodeId cannot be null");
213 }
214
215 /**
216 * Returns the topic.
217 *
218 * @return topic
219 */
220 public String topic() {
221 return topic;
222 }
223
224 /**
225 * Returns the nodeId.
226 *
227 * @return the nodeId
228 */
229 public NodeId nodeId() {
230 return nodeId;
231 }
232
233 @Override
234 public String toString() {
235 return MoreObjects.toStringHelper(getClass())
236 .add("topic", topic)
237 .add("nodeId", nodeId)
238 .toString();
239 }
Madan Jampanifc981772016-02-16 09:46:42 -0800240
241 @Override
242 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
243 buffer.writeString(topic);
244 buffer.writeString(nodeId.toString());
245 }
246
247 @Override
248 public void readObject(BufferInput<?> buffer, Serializer serializer) {
249 topic = buffer.readString();
250 nodeId = new NodeId(buffer.readString());
251 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800252 }
253
254 /**
255 * Withdraw from a leadership contest.
256 */
257 @SuppressWarnings("serial")
258 public static class Withdraw extends ElectionCommand<Void> {
259 private String topic;
260
261 public Withdraw() {
262 }
263
264 public Withdraw(String topic) {
265 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
266 }
267
268 /**
269 * Returns the topic.
270 *
271 * @return The topic
272 */
273 public String topic() {
274 return topic;
275 }
276
277 @Override
278 public String toString() {
279 return MoreObjects.toStringHelper(getClass())
280 .add("topic", topic)
281 .toString();
282 }
Madan Jampanifc981772016-02-16 09:46:42 -0800283
284 @Override
285 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
286 buffer.writeString(topic);
287 }
288
289 @Override
290 public void readObject(BufferInput<?> buffer, Serializer serializer) {
291 topic = buffer.readString();
292 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800293 }
294
295 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800296 * Command for administratively changing the leadership state for a node.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800297 */
298 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800299 public abstract static class ElectionChangeCommand<V> extends ElectionCommand<V> {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800300 private String topic;
301 private NodeId nodeId;
302
Madan Jampanic94b4852016-02-23 18:18:37 -0800303 ElectionChangeCommand() {
304 topic = null;
305 nodeId = null;
306 }
307
Madan Jampanidb2afd32016-02-23 16:26:45 -0800308 public ElectionChangeCommand(String topic, NodeId nodeId) {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800309 this.topic = topic;
310 this.nodeId = nodeId;
311 }
312
313 /**
314 * Returns the topic.
315 *
316 * @return The topic
317 */
318 public String topic() {
319 return topic;
320 }
321
322 /**
323 * Returns the nodeId to make leader.
324 *
325 * @return The nodeId
326 */
327 public NodeId nodeId() {
328 return nodeId;
329 }
330
331 @Override
332 public String toString() {
333 return MoreObjects.toStringHelper(getClass())
334 .add("topic", topic)
335 .add("nodeId", nodeId)
336 .toString();
337 }
Madan Jampanifc981772016-02-16 09:46:42 -0800338
339 @Override
340 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
341 buffer.writeString(topic);
342 buffer.writeString(nodeId.toString());
343 }
344
345 @Override
346 public void readObject(BufferInput<?> buffer, Serializer serializer) {
347 topic = buffer.readString();
348 nodeId = new NodeId(buffer.readString());
349 }
350 }
351
352 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800353 * Command for administratively anoint a node as leader.
354 */
355 @SuppressWarnings("serial")
356 public static class Anoint extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800357
358 private Anoint() {
359 }
360
Madan Jampanidb2afd32016-02-23 16:26:45 -0800361 public Anoint(String topic, NodeId nodeId) {
362 super(topic, nodeId);
363 }
364 }
365
366 /**
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800367 * Command for administratively promote a node as top candidate.
368 */
369 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800370 public static class Promote extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800371
372 private Promote() {
373 }
374
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800375 public Promote(String topic, NodeId nodeId) {
Madan Jampanidb2afd32016-02-23 16:26:45 -0800376 super(topic, nodeId);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800377 }
378 }
379
380 /**
381 * Command for administratively evicting a node from all leadership topics.
382 */
383 @SuppressWarnings("serial")
384 public static class Evict extends ElectionCommand<Void> {
385 private NodeId nodeId;
386
387 public Evict() {
388 }
389
390 public Evict(NodeId nodeId) {
391 this.nodeId = nodeId;
392 }
393
394 /**
395 * Returns the node identifier.
396 *
397 * @return The nodeId
398 */
399 public NodeId nodeId() {
400 return nodeId;
401 }
402
403 @Override
404 public String toString() {
405 return MoreObjects.toStringHelper(getClass())
406 .add("nodeId", nodeId)
407 .toString();
408 }
409
410 @Override
411 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
412 buffer.writeString(nodeId.toString());
413 }
414
415 @Override
416 public void readObject(BufferInput<?> buffer, Serializer serializer) {
417 nodeId = new NodeId(buffer.readString());
418 }
419 }
420
421 /**
Madan Jampanifc981772016-02-16 09:46:42 -0800422 * Map command type resolver.
423 */
424 public static class TypeResolver implements SerializableTypeResolver {
425 @Override
426 public void resolve(SerializerRegistry registry) {
427 registry.register(Run.class, -861);
428 registry.register(Withdraw.class, -862);
429 registry.register(Anoint.class, -863);
430 registry.register(GetAllLeaderships.class, -864);
431 registry.register(GetElectedTopics.class, -865);
432 registry.register(GetLeadership.class, -866);
433 registry.register(Listen.class, -867);
434 registry.register(Unlisten.class, -868);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800435 registry.register(Promote.class, -869);
436 registry.register(Evict.class, -870);
Madan Jampanifc981772016-02-16 09:46:42 -0800437 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800438 }
439}