blob: 7ee481c87ef22b68d60f7cc80efa4faa8f6bae32 [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 }
185 }
186
187 /**
188 * Enter and run for leadership.
189 */
190 @SuppressWarnings("serial")
191 public static class Run extends ElectionCommand<Leadership> {
192 private String topic;
193 private NodeId nodeId;
194
195 public Run() {
196 }
197
198 public Run(String topic, NodeId nodeId) {
199 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
200 this.nodeId = Assert.argNot(nodeId, nodeId == null, "nodeId cannot be null");
201 }
202
203 /**
204 * Returns the topic.
205 *
206 * @return topic
207 */
208 public String topic() {
209 return topic;
210 }
211
212 /**
213 * Returns the nodeId.
214 *
215 * @return the nodeId
216 */
217 public NodeId nodeId() {
218 return nodeId;
219 }
220
221 @Override
222 public String toString() {
223 return MoreObjects.toStringHelper(getClass())
224 .add("topic", topic)
225 .add("nodeId", nodeId)
226 .toString();
227 }
Madan Jampanifc981772016-02-16 09:46:42 -0800228
229 @Override
230 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
231 buffer.writeString(topic);
232 buffer.writeString(nodeId.toString());
233 }
234
235 @Override
236 public void readObject(BufferInput<?> buffer, Serializer serializer) {
237 topic = buffer.readString();
238 nodeId = new NodeId(buffer.readString());
239 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800240 }
241
242 /**
243 * Withdraw from a leadership contest.
244 */
245 @SuppressWarnings("serial")
246 public static class Withdraw extends ElectionCommand<Void> {
247 private String topic;
248
249 public Withdraw() {
250 }
251
252 public Withdraw(String topic) {
253 this.topic = Assert.argNot(topic, Strings.isNullOrEmpty(topic), "topic cannot be null or empty");
254 }
255
256 /**
257 * Returns the topic.
258 *
259 * @return The topic
260 */
261 public String topic() {
262 return topic;
263 }
264
265 @Override
266 public String toString() {
267 return MoreObjects.toStringHelper(getClass())
268 .add("topic", topic)
269 .toString();
270 }
Madan Jampanifc981772016-02-16 09:46:42 -0800271
272 @Override
273 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
274 buffer.writeString(topic);
275 }
276
277 @Override
278 public void readObject(BufferInput<?> buffer, Serializer serializer) {
279 topic = buffer.readString();
280 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800281 }
282
283 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800284 * Command for administratively changing the leadership state for a node.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800285 */
286 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800287 public abstract static class ElectionChangeCommand<V> extends ElectionCommand<V> {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800288 private String topic;
289 private NodeId nodeId;
290
Madan Jampanic94b4852016-02-23 18:18:37 -0800291 ElectionChangeCommand() {
292 topic = null;
293 nodeId = null;
294 }
295
Madan Jampanidb2afd32016-02-23 16:26:45 -0800296 public ElectionChangeCommand(String topic, NodeId nodeId) {
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800297 this.topic = topic;
298 this.nodeId = nodeId;
299 }
300
301 /**
302 * Returns the topic.
303 *
304 * @return The topic
305 */
306 public String topic() {
307 return topic;
308 }
309
310 /**
311 * Returns the nodeId to make leader.
312 *
313 * @return The nodeId
314 */
315 public NodeId nodeId() {
316 return nodeId;
317 }
318
319 @Override
320 public String toString() {
321 return MoreObjects.toStringHelper(getClass())
322 .add("topic", topic)
323 .add("nodeId", nodeId)
324 .toString();
325 }
Madan Jampanifc981772016-02-16 09:46:42 -0800326
327 @Override
328 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
329 buffer.writeString(topic);
330 buffer.writeString(nodeId.toString());
331 }
332
333 @Override
334 public void readObject(BufferInput<?> buffer, Serializer serializer) {
335 topic = buffer.readString();
336 nodeId = new NodeId(buffer.readString());
337 }
338 }
339
340 /**
Madan Jampanidb2afd32016-02-23 16:26:45 -0800341 * Command for administratively anoint a node as leader.
342 */
343 @SuppressWarnings("serial")
344 public static class Anoint extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800345
346 private Anoint() {
347 }
348
Madan Jampanidb2afd32016-02-23 16:26:45 -0800349 public Anoint(String topic, NodeId nodeId) {
350 super(topic, nodeId);
351 }
352 }
353
354 /**
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800355 * Command for administratively promote a node as top candidate.
356 */
357 @SuppressWarnings("serial")
Madan Jampanidb2afd32016-02-23 16:26:45 -0800358 public static class Promote extends ElectionChangeCommand<Boolean> {
Madan Jampanic94b4852016-02-23 18:18:37 -0800359
360 private Promote() {
361 }
362
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800363 public Promote(String topic, NodeId nodeId) {
Madan Jampanidb2afd32016-02-23 16:26:45 -0800364 super(topic, nodeId);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800365 }
366 }
367
368 /**
369 * Command for administratively evicting a node from all leadership topics.
370 */
371 @SuppressWarnings("serial")
372 public static class Evict extends ElectionCommand<Void> {
373 private NodeId nodeId;
374
375 public Evict() {
376 }
377
378 public Evict(NodeId nodeId) {
379 this.nodeId = nodeId;
380 }
381
382 /**
383 * Returns the node identifier.
384 *
385 * @return The nodeId
386 */
387 public NodeId nodeId() {
388 return nodeId;
389 }
390
391 @Override
392 public String toString() {
393 return MoreObjects.toStringHelper(getClass())
394 .add("nodeId", nodeId)
395 .toString();
396 }
397
398 @Override
399 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
400 buffer.writeString(nodeId.toString());
401 }
402
403 @Override
404 public void readObject(BufferInput<?> buffer, Serializer serializer) {
405 nodeId = new NodeId(buffer.readString());
406 }
407 }
408
409 /**
Madan Jampanifc981772016-02-16 09:46:42 -0800410 * Map command type resolver.
411 */
412 public static class TypeResolver implements SerializableTypeResolver {
413 @Override
414 public void resolve(SerializerRegistry registry) {
415 registry.register(Run.class, -861);
416 registry.register(Withdraw.class, -862);
417 registry.register(Anoint.class, -863);
418 registry.register(GetAllLeaderships.class, -864);
419 registry.register(GetElectedTopics.class, -865);
420 registry.register(GetLeadership.class, -866);
421 registry.register(Listen.class, -867);
422 registry.register(Unlisten.class, -868);
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800423 registry.register(Promote.class, -869);
424 registry.register(Evict.class, -870);
Madan Jampanifc981772016-02-16 09:46:42 -0800425 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800426 }
427}