blob: b10ac607b4e553e2d6c2a6e98855a374c3b8ee9c [file] [log] [blame]
Jonathan Hart949c2842014-11-28 23:44:09 -08001package org.onlab.onos.store.trivial.impl;
2
3import java.util.Map;
4import java.util.Set;
5import java.util.concurrent.ConcurrentHashMap;
6import java.util.concurrent.CopyOnWriteArraySet;
7
8import org.apache.felix.scr.annotations.Component;
9import org.apache.felix.scr.annotations.Reference;
10import org.apache.felix.scr.annotations.ReferenceCardinality;
11import org.apache.felix.scr.annotations.Service;
12import org.onlab.onos.cluster.ClusterService;
Jonathan Hart949c2842014-11-28 23:44:09 -080013import org.onlab.onos.cluster.Leadership;
14import org.onlab.onos.cluster.LeadershipEvent;
15import org.onlab.onos.cluster.LeadershipEvent.Type;
16import org.onlab.onos.cluster.LeadershipEventListener;
17import org.onlab.onos.cluster.LeadershipService;
Madan Jampani8d21c792014-12-01 16:31:07 -080018import org.onlab.onos.cluster.NodeId;
Jonathan Hart949c2842014-11-28 23:44:09 -080019
20/**
21 * A trivial implementation of the leadership service.
alshabiba9819bf2014-11-30 18:15:52 -080022 * <p>
Jonathan Hart949c2842014-11-28 23:44:09 -080023 * The service is not distributed, so it can assume there's a single leadership
24 * contender. This contender is always granted leadership whenever it asks.
25 */
26@Component(immediate = true)
27@Service
28public class SimpleLeadershipManager implements LeadershipService {
29
30 private Set<LeadershipEventListener> listeners = new CopyOnWriteArraySet<>();
31
32 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
33 private ClusterService clusterService;
34
35 private Map<String, Boolean> elections = new ConcurrentHashMap<>();
36
37 @Override
Madan Jampani8d21c792014-12-01 16:31:07 -080038 public NodeId getLeader(String path) {
39 return elections.get(path) ? clusterService.getLocalNode().id() : null;
Jonathan Hart949c2842014-11-28 23:44:09 -080040 }
41
42 @Override
43 public void runForLeadership(String path) {
44 elections.put(path, true);
45 for (LeadershipEventListener listener : listeners) {
46 listener.event(new LeadershipEvent(Type.LEADER_ELECTED,
Madan Jampani8d21c792014-12-01 16:31:07 -080047 new Leadership(path, clusterService.getLocalNode().id(), 0)));
Jonathan Hart949c2842014-11-28 23:44:09 -080048 }
49 }
50
51 @Override
52 public void withdraw(String path) {
53 elections.remove(path);
54 for (LeadershipEventListener listener : listeners) {
55 listener.event(new LeadershipEvent(Type.LEADER_BOOTED,
Madan Jampani8d21c792014-12-01 16:31:07 -080056 new Leadership(path, clusterService.getLocalNode().id(), 0)));
Jonathan Hart949c2842014-11-28 23:44:09 -080057 }
58 }
59
60 @Override
61 public Map<String, Leadership> getLeaderBoard() {
62 throw new UnsupportedOperationException("I don't know what to do." +
63 " I wish you luck.");
64 }
65
66 @Override
67 public void addListener(LeadershipEventListener listener) {
68 listeners.add(listener);
69 }
70
71 @Override
72 public void removeListener(LeadershipEventListener listener) {
73 listeners.remove(listener);
74 }
75
76}