blob: 05bdbb29600fa511b65532c657ce6873a54bf201 [file] [log] [blame]
alshabibab984662014-12-04 18:56:18 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
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
Ray Milkeyd84f89b2018-08-17 14:54:17 -070018import org.onosproject.cluster.ClusterService;
19import org.onosproject.cluster.Leader;
20import org.onosproject.cluster.Leadership;
21import org.onosproject.cluster.LeadershipEvent;
22import org.onosproject.cluster.LeadershipEvent.Type;
23import org.onosproject.cluster.LeadershipEventListener;
24import org.onosproject.cluster.LeadershipService;
25import org.onosproject.cluster.NodeId;
26import org.osgi.service.component.annotations.Activate;
27import org.osgi.service.component.annotations.Component;
28import org.osgi.service.component.annotations.Reference;
29import org.osgi.service.component.annotations.ReferenceCardinality;
Madan Jampani59610512015-02-25 15:25:43 -080030
Madan Jampani620f70d2016-01-30 22:22:47 -080031import java.util.Arrays;
Ayaka Koshibec19b8b82015-04-08 15:18:24 -070032import java.util.List;
Jonathan Hart949c2842014-11-28 23:44:09 -080033import java.util.Map;
Madan Jampani59610512015-02-25 15:25:43 -080034import java.util.Map.Entry;
Jonathan Hart949c2842014-11-28 23:44:09 -080035import java.util.Set;
36import java.util.concurrent.ConcurrentHashMap;
37import java.util.concurrent.CopyOnWriteArraySet;
Madan Jampani59610512015-02-25 15:25:43 -080038import java.util.stream.Collectors;
Jonathan Hart949c2842014-11-28 23:44:09 -080039
Ray Milkeyd84f89b2018-08-17 14:54:17 -070040import static com.google.common.base.Preconditions.checkArgument;
Jonathan Hart949c2842014-11-28 23:44:09 -080041
42/**
43 * A trivial implementation of the leadership service.
alshabiba9819bf2014-11-30 18:15:52 -080044 * <p>
Jonathan Hart949c2842014-11-28 23:44:09 -080045 * The service is not distributed, so it can assume there's a single leadership
46 * contender. This contender is always granted leadership whenever it asks.
47 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070048@Component(immediate = true, service = LeadershipService.class)
Jonathan Hart949c2842014-11-28 23:44:09 -080049public class SimpleLeadershipManager implements LeadershipService {
50
51 private Set<LeadershipEventListener> listeners = new CopyOnWriteArraySet<>();
52
Ray Milkeyd84f89b2018-08-17 14:54:17 -070053 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jonathan Hart949c2842014-11-28 23:44:09 -080054 private ClusterService clusterService;
55
Madan Jampani620f70d2016-01-30 22:22:47 -080056 private NodeId localNodeId;
57
Jonathan Hart949c2842014-11-28 23:44:09 -080058 private Map<String, Boolean> elections = new ConcurrentHashMap<>();
59
Madan Jampani620f70d2016-01-30 22:22:47 -080060 @Activate
61 public void activate() {
62 localNodeId = clusterService.getLocalNode().id();
63 }
64
Jonathan Hart949c2842014-11-28 23:44:09 -080065 @Override
Madan Jampani8d21c792014-12-01 16:31:07 -080066 public NodeId getLeader(String path) {
67 return elections.get(path) ? clusterService.getLocalNode().id() : null;
Jonathan Hart949c2842014-11-28 23:44:09 -080068 }
69
70 @Override
Madan Jampani59610512015-02-25 15:25:43 -080071 public Leadership getLeadership(String path) {
72 checkArgument(path != null);
Madan Jampani620f70d2016-01-30 22:22:47 -080073 return elections.get(path) ?
74 new Leadership(path, new Leader(localNodeId, 0, 0), Arrays.asList(localNodeId)) : null;
Madan Jampani59610512015-02-25 15:25:43 -080075 }
76
77 @Override
78 public Set<String> ownedTopics(NodeId nodeId) {
79 checkArgument(nodeId != null);
80 return elections.entrySet()
81 .stream()
82 .filter(Entry::getValue)
83 .map(Entry::getKey)
84 .collect(Collectors.toSet());
85 }
86
87 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -080088 public Leadership runForLeadership(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -080089 elections.put(path, true);
Madan Jampani620f70d2016-01-30 22:22:47 -080090 Leadership leadership = new Leadership(path, new Leader(localNodeId, 0, 0), Arrays.asList(localNodeId));
Jonathan Hart949c2842014-11-28 23:44:09 -080091 for (LeadershipEventListener listener : listeners) {
Madan Jampani620f70d2016-01-30 22:22:47 -080092 listener.event(new LeadershipEvent(Type.LEADER_AND_CANDIDATES_CHANGED, leadership));
Jonathan Hart949c2842014-11-28 23:44:09 -080093 }
Madan Jampani620f70d2016-01-30 22:22:47 -080094 return leadership;
Jonathan Hart949c2842014-11-28 23:44:09 -080095 }
96
97 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -080098 public void withdraw(String path) {
Jonathan Hart949c2842014-11-28 23:44:09 -080099 elections.remove(path);
100 for (LeadershipEventListener listener : listeners) {
Madan Jampani620f70d2016-01-30 22:22:47 -0800101 listener.event(new LeadershipEvent(Type.LEADER_AND_CANDIDATES_CHANGED,
102 new Leadership(path, null, Arrays.asList())));
Jonathan Hart949c2842014-11-28 23:44:09 -0800103 }
104 }
105
106 @Override
Jonathan Hart949c2842014-11-28 23:44:09 -0800107 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
Ayaka Koshibec19b8b82015-04-08 15:18:24 -0700117 public List<NodeId> getCandidates(String path) {
118 return null;
119 }
Jonathan Hart949c2842014-11-28 23:44:09 -0800120}