blob: 87e6bcc15e1ba0ab254da48fce229188b7dd4c8b [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 {
Madan Jampani5e5b3d62016-02-01 16:03:33 -080051 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -080052 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
53 }
54
55 @Override
56 public void readObject(BufferInput<?> buffer, Serializer serializer) {
57 }
58 }
59
60 /**
61 * Abstract election topic query.
62 */
63 @SuppressWarnings("serial")
64 public abstract static class TopicQuery<V> extends ElectionQuery<V> implements CatalystSerializable {
65 String topic;
66
67 public TopicQuery() {
68 }
69
70 public TopicQuery(String topic) {
71 this.topic = Assert.notNull(topic, "topic");
72 }
73
74 /**
75 * Returns the topic.
76 * @return topic
77 */
78 public String topic() {
79 return topic;
80 }
81
82 @Override
83 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
84 serializer.writeObject(topic, buffer);
85 }
86
87 @Override
88 public void readObject(BufferInput<?> buffer, Serializer serializer) {
89 topic = serializer.readObject(buffer);
90 }
91 }
92
93 /**
94 * Abstract election command.
95 */
96 @SuppressWarnings("serial")
97 public abstract static class ElectionCommand<V> implements Command<V>, CatalystSerializable {
98
99 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800100 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
101 }
102
103 @Override
104 public void readObject(BufferInput<?> buffer, Serializer serializer) {
105 }
106 }
107
108 /**
109 * Listen command.
110 */
111 @SuppressWarnings("serial")
112 public static class Listen extends ElectionCommand<Void> {
Jordan Halterman9a710b22017-02-23 01:21:00 -0800113 @Override
114 public CompactionMode compaction() {
115 return CompactionMode.QUORUM;
116 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800117 }
118
119 /**
120 * Unlisten command.
121 */
122 @SuppressWarnings("serial")
123 public static class Unlisten extends ElectionCommand<Void> {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800124 @Override
125 public CompactionMode compaction() {
Jordan Halterman9a710b22017-02-23 01:21:00 -0800126 return CompactionMode.TOMBSTONE;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800127 }
128 }
129
130 /**
131 * GetLeader query.
132 */
133 @SuppressWarnings("serial")
134 public static class GetLeadership extends TopicQuery<Leadership> {
135
136 public GetLeadership() {
137 }
138
139 public GetLeadership(String topic) {
140 super(topic);
141 }
142
143 @Override
144 public String toString() {
145 return MoreObjects.toStringHelper(getClass())
146 .add("topic", topic)
147 .toString();
148 }
149 }
150
151 /**
152 * GetAllLeaders query.
153 */
154 @SuppressWarnings("serial")
155 public static class GetAllLeaderships extends ElectionQuery<Map<String, Leadership>> {
156 }
157
158 /**
159 * GetElectedTopics query.
160 */
161 @SuppressWarnings("serial")
162 public static class GetElectedTopics extends ElectionQuery<Set<String>> {
163 private NodeId nodeId;
164
165 public GetElectedTopics() {
166 }
167
168 public GetElectedTopics(NodeId nodeId) {
169 this.nodeId = Assert.argNot(nodeId, nodeId == null, "nodeId cannot be null");
170 }
171
172 /**
173 * Returns the nodeId to check.
174 *
175 * @return The nodeId to check.
176 */
177 public NodeId nodeId() {
178 return nodeId;
179 }
180
181 @Override
182 public String toString() {
183 return MoreObjects.toStringHelper(getClass())
184 .add("nodeId", nodeId)
185 .toString();
186 }
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700187
188 @Override
189 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
190 super.writeObject(buffer, serializer);
191 serializer.writeObject(nodeId, buffer);
192 }
193
194 @Override
195 public void readObject(BufferInput<?> buffer, Serializer serializer) {
196 super.readObject(buffer, serializer);
197 nodeId = serializer.readObject(buffer);
198 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800199 }
200
201 /**
202 * Enter and run for leadership.
203 */
204 @SuppressWarnings("serial")
205 public static class Run extends ElectionCommand<Leadership> {
206 private String topic;
207 private NodeId nodeId;
208
209 public Run() {
210 }
211
212 public Run(String topic, NodeId nodeId) {
213 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
214 this.nodeId = Assert.argNot(nodeId, nodeId == null, "nodeId cannot be null");
215 }
216
217 /**
218 * Returns the topic.
219 *
220 * @return topic
221 */
222 public String topic() {
223 return topic;
224 }
225
226 /**
227 * Returns the nodeId.
228 *
229 * @return the nodeId
230 */
231 public NodeId nodeId() {
232 return nodeId;
233 }
234
235 @Override
Jordan Halterman9a710b22017-02-23 01:21:00 -0800236 public CompactionMode compaction() {
237 return CompactionMode.SNAPSHOT;
238 }
239
240 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800241 public String toString() {
242 return MoreObjects.toStringHelper(getClass())
243 .add("topic", topic)
244 .add("nodeId", nodeId)
245 .toString();
246 }
Madan Jampanifc981772016-02-16 09:46:42 -0800247
248 @Override
249 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
250 buffer.writeString(topic);
251 buffer.writeString(nodeId.toString());
252 }
253
254 @Override
255 public void readObject(BufferInput<?> buffer, Serializer serializer) {
256 topic = buffer.readString();
257 nodeId = new NodeId(buffer.readString());
258 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800259 }
260
261 /**
262 * Withdraw from a leadership contest.
263 */
264 @SuppressWarnings("serial")
265 public static class Withdraw extends ElectionCommand<Void> {
266 private String topic;
267
268 public Withdraw() {
269 }
270
271 public Withdraw(String topic) {
272 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
273 }
274
275 /**
276 * Returns the topic.
277 *
278 * @return The topic
279 */
280 public String topic() {
281 return topic;
282 }
283
284 @Override
Jordan Halterman9a710b22017-02-23 01:21:00 -0800285 public CompactionMode compaction() {
286 return CompactionMode.SNAPSHOT;
287 }
288
289 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800290 public String toString() {
291 return MoreObjects.toStringHelper(getClass())
292 .add("topic", topic)
293 .toString();
294 }
Madan Jampanifc981772016-02-16 09:46:42 -0800295
296 @Override
297 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
298 buffer.writeString(topic);
299 }
300
301 @Override
302 public void readObject(BufferInput<?> buffer, Serializer serializer) {
303 topic = buffer.readString();
304 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800305 }
306
307 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800308 * Command for administratively changing the leadership state for a node.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800309 */
310 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800311 public abstract static class ElectionChangeCommand<V> extends ElectionCommand<V> {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800312 private String topic;
313 private NodeId nodeId;
314
Madan Jampanic94b4852016-02-23 18:18:37 -0800315 ElectionChangeCommand() {
316 topic = null;
317 nodeId = null;
318 }
319
Madan Jampanidb2afd32016-02-23 16:26:45 -0800320 public ElectionChangeCommand(String topic, NodeId nodeId) {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800321 this.topic = topic;
322 this.nodeId = nodeId;
323 }
324
325 /**
326 * Returns the topic.
327 *
328 * @return The topic
329 */
330 public String topic() {
331 return topic;
332 }
333
334 /**
335 * Returns the nodeId to make leader.
336 *
337 * @return The nodeId
338 */
339 public NodeId nodeId() {
340 return nodeId;
341 }
342
343 @Override
Jordan Halterman9a710b22017-02-23 01:21:00 -0800344 public CompactionMode compaction() {
345 return CompactionMode.SNAPSHOT;
346 }
347
348 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800349 public String toString() {
350 return MoreObjects.toStringHelper(getClass())
351 .add("topic", topic)
352 .add("nodeId", nodeId)
353 .toString();
354 }
Madan Jampanifc981772016-02-16 09:46:42 -0800355
356 @Override
357 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
358 buffer.writeString(topic);
359 buffer.writeString(nodeId.toString());
360 }
361
362 @Override
363 public void readObject(BufferInput<?> buffer, Serializer serializer) {
364 topic = buffer.readString();
365 nodeId = new NodeId(buffer.readString());
366 }
367 }
368
369 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800370 * Command for administratively anoint a node as leader.
371 */
372 @SuppressWarnings("serial")
373 public static class Anoint extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800374
375 private Anoint() {
376 }
377
Madan Jampanidb2afd32016-02-23 16:26:45 -0800378 public Anoint(String topic, NodeId nodeId) {
379 super(topic, nodeId);
380 }
381 }
382
383 /**
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800384 * Command for administratively promote a node as top candidate.
385 */
386 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800387 public static class Promote extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800388
389 private Promote() {
390 }
391
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800392 public Promote(String topic, NodeId nodeId) {
Madan Jampanidb2afd32016-02-23 16:26:45 -0800393 super(topic, nodeId);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800394 }
395 }
396
397 /**
398 * Command for administratively evicting a node from all leadership topics.
399 */
400 @SuppressWarnings("serial")
401 public static class Evict extends ElectionCommand<Void> {
402 private NodeId nodeId;
403
404 public Evict() {
405 }
406
407 public Evict(NodeId nodeId) {
408 this.nodeId = nodeId;
409 }
410
411 /**
412 * Returns the node identifier.
413 *
414 * @return The nodeId
415 */
416 public NodeId nodeId() {
417 return nodeId;
418 }
419
420 @Override
Jordan Halterman9a710b22017-02-23 01:21:00 -0800421 public CompactionMode compaction() {
422 return CompactionMode.SNAPSHOT;
423 }
424
425 @Override
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800426 public String toString() {
427 return MoreObjects.toStringHelper(getClass())
428 .add("nodeId", nodeId)
429 .toString();
430 }
431
432 @Override
433 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
434 buffer.writeString(nodeId.toString());
435 }
436
437 @Override
438 public void readObject(BufferInput<?> buffer, Serializer serializer) {
439 nodeId = new NodeId(buffer.readString());
440 }
441 }
442
443 /**
Madan Jampanifc981772016-02-16 09:46:42 -0800444 * Map command type resolver.
445 */
446 public static class TypeResolver implements SerializableTypeResolver {
447 @Override
448 public void resolve(SerializerRegistry registry) {
449 registry.register(Run.class, -861);
450 registry.register(Withdraw.class, -862);
451 registry.register(Anoint.class, -863);
452 registry.register(GetAllLeaderships.class, -864);
453 registry.register(GetElectedTopics.class, -865);
454 registry.register(GetLeadership.class, -866);
455 registry.register(Listen.class, -867);
456 registry.register(Unlisten.class, -868);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800457 registry.register(Promote.class, -869);
458 registry.register(Evict.class, -870);
Madan Jampanifc981772016-02-16 09:46:42 -0800459 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800460 }
461}