blob: 194ffec1a1696c94a2cc317a231027095faa2d63 [file] [log] [blame]
alshabibab984662014-12-04 18:56:18 -08001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
alshabibab984662014-12-04 18:56:18 -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 */
Thomas Vachuskac97aa612015-06-23 16:00:18 -070016package org.onosproject.store.trivial;
Jonathan Hart949c2842014-11-28 23:44:09 -080017
Madan Jampani59610512015-02-25 15:25:43 -080018import static com.google.common.base.Preconditions.checkArgument;
19
Ayaka Koshibec19b8b82015-04-08 15:18:24 -070020import java.util.List;
Jonathan Hart949c2842014-11-28 23:44:09 -080021import java.util.Map;
Madan Jampani59610512015-02-25 15:25:43 -080022import java.util.Map.Entry;
Jonathan Hart949c2842014-11-28 23:44:09 -080023import java.util.Set;
Madan Jampanide003d92015-05-11 17:14:20 -070024import java.util.concurrent.CompletableFuture;
Jonathan Hart949c2842014-11-28 23:44:09 -080025import java.util.concurrent.ConcurrentHashMap;
26import java.util.concurrent.CopyOnWriteArraySet;
Madan Jampani59610512015-02-25 15:25:43 -080027import java.util.stream.Collectors;
Jonathan Hart949c2842014-11-28 23:44:09 -080028
29import org.apache.felix.scr.annotations.Component;
30import org.apache.felix.scr.annotations.Reference;
31import org.apache.felix.scr.annotations.ReferenceCardinality;
32import org.apache.felix.scr.annotations.Service;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.cluster.ClusterService;
34import org.onosproject.cluster.Leadership;
35import org.onosproject.cluster.LeadershipEvent;
36import org.onosproject.cluster.LeadershipEvent.Type;
37import org.onosproject.cluster.LeadershipEventListener;
38import org.onosproject.cluster.LeadershipService;
39import org.onosproject.cluster.NodeId;
Jonathan Hart949c2842014-11-28 23:44:09 -080040
41/**
42 * A trivial implementation of the leadership service.
alshabiba9819bf2014-11-30 18:15:52 -080043 * <p>
Jonathan Hart949c2842014-11-28 23:44:09 -080044 * The service is not distributed, so it can assume there's a single leadership
45 * contender. This contender is always granted leadership whenever it asks.
46 */
47@Component(immediate = true)
48@Service
49public class SimpleLeadershipManager implements LeadershipService {
50
51 private Set<LeadershipEventListener> listeners = new CopyOnWriteArraySet<>();
52
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 private ClusterService clusterService;
55
56 private Map<String, Boolean> elections = new ConcurrentHashMap<>();
57
58 @Override
Madan Jampani8d21c792014-12-01 16:31:07 -080059 public NodeId getLeader(String path) {
60 return elections.get(path) ? clusterService.getLocalNode().id() : null;
Jonathan Hart949c2842014-11-28 23:44:09 -080061 }
62
63 @Override
Madan Jampani59610512015-02-25 15:25:43 -080064 public Leadership getLeadership(String path) {
65 checkArgument(path != null);
Madan Jampani30a57f82015-03-02 12:19:41 -080066 return elections.get(path) ? new Leadership(path, clusterService.getLocalNode().id(), 0, 0) : null;
Madan Jampani59610512015-02-25 15:25:43 -080067 }
68
69 @Override
70 public Set<String> ownedTopics(NodeId nodeId) {
71 checkArgument(nodeId != null);
72 return elections.entrySet()
73 .stream()
74 .filter(Entry::getValue)
75 .map(Entry::getKey)
76 .collect(Collectors.toSet());
77 }
78
79 @Override
Madan Jampanide003d92015-05-11 17:14:20 -070080 public CompletableFuture<Leadership> runForLeadership(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -080081 elections.put(path, true);
82 for (LeadershipEventListener listener : listeners) {
83 listener.event(new LeadershipEvent(Type.LEADER_ELECTED,
Madan Jampani30a57f82015-03-02 12:19:41 -080084 new Leadership(path, clusterService.getLocalNode().id(), 0, 0)));
Jonathan Hart949c2842014-11-28 23:44:09 -080085 }
Madan Jampanide003d92015-05-11 17:14:20 -070086 return CompletableFuture.completedFuture(new Leadership(path, clusterService.getLocalNode().id(), 0, 0));
Jonathan Hart949c2842014-11-28 23:44:09 -080087 }
88
89 @Override
Madan Jampanide003d92015-05-11 17:14:20 -070090 public CompletableFuture<Void> withdraw(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -080091 elections.remove(path);
92 for (LeadershipEventListener listener : listeners) {
93 listener.event(new LeadershipEvent(Type.LEADER_BOOTED,
Madan Jampani30a57f82015-03-02 12:19:41 -080094 new Leadership(path, clusterService.getLocalNode().id(), 0, 0)));
Jonathan Hart949c2842014-11-28 23:44:09 -080095 }
Madan Jampanide003d92015-05-11 17:14:20 -070096 return CompletableFuture.completedFuture(null);
Jonathan Hart949c2842014-11-28 23:44:09 -080097 }
98
99 @Override
100 public Map<String, Leadership> getLeaderBoard() {
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800101 //FIXME
Jonathan Hart949c2842014-11-28 23:44:09 -0800102 throw new UnsupportedOperationException("I don't know what to do." +
103 " I wish you luck.");
104 }
105
106 @Override
107 public void addListener(LeadershipEventListener listener) {
108 listeners.add(listener);
109 }
110
111 @Override
112 public void removeListener(LeadershipEventListener listener) {
113 listeners.remove(listener);
114 }
Ayaka Koshibec19b8b82015-04-08 15:18:24 -0700115
116 @Override
Madan Jampanifd45d5e2015-04-20 13:33:21 -0700117 public Map<String, List<NodeId>> getCandidates() {
Ayaka Koshibec19b8b82015-04-08 15:18:24 -0700118 return null;
119 }
120
121 @Override
122 public List<NodeId> getCandidates(String path) {
123 return null;
124 }
Madan Jampani1af8e132015-04-30 16:41:18 -0700125
126 @Override
127 public boolean stepdown(String path) {
128 throw new UnsupportedOperationException();
129 }
130
131 @Override
132 public boolean makeTopCandidate(String path, NodeId nodeId) {
133 throw new UnsupportedOperationException();
134 }
Jonathan Hart949c2842014-11-28 23:44:09 -0800135}