blob: d9399d1bd20cddb3ca3d25dab9de949ff5abd2ee [file] [log] [blame]
alshabibab984662014-12-04 18:56:18 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present 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
Madan Jampani620f70d2016-01-30 22:22:47 -080020import java.util.Arrays;
Ayaka Koshibec19b8b82015-04-08 15:18:24 -070021import java.util.List;
Jonathan Hart949c2842014-11-28 23:44:09 -080022import java.util.Map;
Madan Jampani59610512015-02-25 15:25:43 -080023import java.util.Map.Entry;
Jonathan Hart949c2842014-11-28 23:44:09 -080024import java.util.Set;
25import 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
Madan Jampani620f70d2016-01-30 22:22:47 -080029import org.apache.felix.scr.annotations.Activate;
Jonathan Hart949c2842014-11-28 23:44:09 -080030import org.apache.felix.scr.annotations.Component;
31import org.apache.felix.scr.annotations.Reference;
32import org.apache.felix.scr.annotations.ReferenceCardinality;
33import org.apache.felix.scr.annotations.Service;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.cluster.ClusterService;
Madan Jampani620f70d2016-01-30 22:22:47 -080035import org.onosproject.cluster.Leader;
Brian O'Connorabafb502014-12-02 22:26:20 -080036import org.onosproject.cluster.Leadership;
37import org.onosproject.cluster.LeadershipEvent;
38import org.onosproject.cluster.LeadershipEvent.Type;
39import org.onosproject.cluster.LeadershipEventListener;
40import org.onosproject.cluster.LeadershipService;
41import org.onosproject.cluster.NodeId;
Jonathan Hart949c2842014-11-28 23:44:09 -080042
43/**
44 * A trivial implementation of the leadership service.
alshabiba9819bf2014-11-30 18:15:52 -080045 * <p>
Jonathan Hart949c2842014-11-28 23:44:09 -080046 * The service is not distributed, so it can assume there's a single leadership
47 * contender. This contender is always granted leadership whenever it asks.
48 */
49@Component(immediate = true)
50@Service
51public class SimpleLeadershipManager implements LeadershipService {
52
53 private Set<LeadershipEventListener> listeners = new CopyOnWriteArraySet<>();
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 private ClusterService clusterService;
57
Madan Jampani620f70d2016-01-30 22:22:47 -080058 private NodeId localNodeId;
59
Jonathan Hart949c2842014-11-28 23:44:09 -080060 private Map<String, Boolean> elections = new ConcurrentHashMap<>();
61
Madan Jampani620f70d2016-01-30 22:22:47 -080062 @Activate
63 public void activate() {
64 localNodeId = clusterService.getLocalNode().id();
65 }
66
Jonathan Hart949c2842014-11-28 23:44:09 -080067 @Override
Madan Jampani8d21c792014-12-01 16:31:07 -080068 public NodeId getLeader(String path) {
69 return elections.get(path) ? clusterService.getLocalNode().id() : null;
Jonathan Hart949c2842014-11-28 23:44:09 -080070 }
71
72 @Override
Madan Jampani59610512015-02-25 15:25:43 -080073 public Leadership getLeadership(String path) {
74 checkArgument(path != null);
Madan Jampani620f70d2016-01-30 22:22:47 -080075 return elections.get(path) ?
76 new Leadership(path, new Leader(localNodeId, 0, 0), Arrays.asList(localNodeId)) : null;
Madan Jampani59610512015-02-25 15:25:43 -080077 }
78
79 @Override
80 public Set<String> ownedTopics(NodeId nodeId) {
81 checkArgument(nodeId != null);
82 return elections.entrySet()
83 .stream()
84 .filter(Entry::getValue)
85 .map(Entry::getKey)
86 .collect(Collectors.toSet());
87 }
88
89 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -080090 public Leadership runForLeadership(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -080091 elections.put(path, true);
Madan Jampani620f70d2016-01-30 22:22:47 -080092 Leadership leadership = new Leadership(path, new Leader(localNodeId, 0, 0), Arrays.asList(localNodeId));
Jonathan Hart949c2842014-11-28 23:44:09 -080093 for (LeadershipEventListener listener : listeners) {
Madan Jampani620f70d2016-01-30 22:22:47 -080094 listener.event(new LeadershipEvent(Type.LEADER_AND_CANDIDATES_CHANGED, leadership));
Jonathan Hart949c2842014-11-28 23:44:09 -080095 }
Madan Jampani620f70d2016-01-30 22:22:47 -080096 return leadership;
Jonathan Hart949c2842014-11-28 23:44:09 -080097 }
98
99 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -0800100 public void withdraw(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -0800101 elections.remove(path);
102 for (LeadershipEventListener listener : listeners) {
Madan Jampani620f70d2016-01-30 22:22:47 -0800103 listener.event(new LeadershipEvent(Type.LEADER_AND_CANDIDATES_CHANGED,
104 new Leadership(path, null, Arrays.asList())));
Jonathan Hart949c2842014-11-28 23:44:09 -0800105 }
106 }
107
108 @Override
109 public Map<String, Leadership> getLeaderBoard() {
Brian O'Connor7a71d5d2014-12-02 00:12:27 -0800110 //FIXME
Jonathan Hart949c2842014-11-28 23:44:09 -0800111 throw new UnsupportedOperationException("I don't know what to do." +
112 " I wish you luck.");
113 }
114
115 @Override
116 public void addListener(LeadershipEventListener listener) {
117 listeners.add(listener);
118 }
119
120 @Override
121 public void removeListener(LeadershipEventListener listener) {
122 listeners.remove(listener);
123 }
Ayaka Koshibec19b8b82015-04-08 15:18:24 -0700124
125 @Override
Madan Jampanifd45d5e2015-04-20 13:33:21 -0700126 public Map<String, List<NodeId>> getCandidates() {
Ayaka Koshibec19b8b82015-04-08 15:18:24 -0700127 return null;
128 }
129
130 @Override
131 public List<NodeId> getCandidates(String path) {
132 return null;
133 }
Jonathan Hart949c2842014-11-28 23:44:09 -0800134}