blob: cf3c043de5be058f87f46cc2802beed0f5463254 [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() {
Brian O'Connor7a71d5d2014-12-02 00:12:27 -080062 //FIXME
Jonathan Hart949c2842014-11-28 23:44:09 -080063 throw new UnsupportedOperationException("I don't know what to do." +
64 " I wish you luck.");
65 }
66
67 @Override
68 public void addListener(LeadershipEventListener listener) {
69 listeners.add(listener);
70 }
71
72 @Override
73 public void removeListener(LeadershipEventListener listener) {
74 listeners.remove(listener);
75 }
76
77}