blob: 5d02b5d03ddd4dacc9ce9ff56b0082a10f9ba573 [file] [log] [blame]
Madan Jampani620f70d2016-01-30 22:22:47 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Madan Jampani620f70d2016-01-30 22:22:47 -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 */
16package org.onosproject.cluster.impl;
17
Ray Milkey3bceb012018-09-07 13:42:46 -070018import com.google.common.base.Objects;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070019import com.google.common.collect.Maps;
Madan Jampani620f70d2016-01-30 22:22:47 -080020import org.onosproject.cluster.ClusterService;
Madan Jampani620f70d2016-01-30 22:22:47 -080021import org.onosproject.cluster.Leadership;
22import org.onosproject.cluster.LeadershipAdminService;
23import org.onosproject.cluster.LeadershipEvent;
24import org.onosproject.cluster.LeadershipEventListener;
25import org.onosproject.cluster.LeadershipService;
26import org.onosproject.cluster.LeadershipStore;
27import org.onosproject.cluster.LeadershipStoreDelegate;
28import org.onosproject.cluster.NodeId;
29import org.onosproject.event.AbstractListenerManager;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070030import org.osgi.service.component.annotations.Activate;
31import org.osgi.service.component.annotations.Component;
32import org.osgi.service.component.annotations.Deactivate;
33import org.osgi.service.component.annotations.Reference;
34import org.osgi.service.component.annotations.ReferenceCardinality;
Madan Jampani620f70d2016-01-30 22:22:47 -080035import org.slf4j.Logger;
36
Ray Milkeyd84f89b2018-08-17 14:54:17 -070037import java.util.Map;
38import java.util.Set;
39
40import static org.slf4j.LoggerFactory.getLogger;
Madan Jampani620f70d2016-01-30 22:22:47 -080041
42/**
43 * Implementation of {@link LeadershipService} and {@link LeadershipAdminService}.
44 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070045@Component(immediate = true, service = {LeadershipService.class, LeadershipAdminService.class})
Madan Jampani620f70d2016-01-30 22:22:47 -080046public class LeadershipManager
47 extends AbstractListenerManager<LeadershipEvent, LeadershipEventListener>
48 implements LeadershipService, LeadershipAdminService {
49
50 private final Logger log = getLogger(getClass());
51
52 private LeadershipStoreDelegate delegate = this::post;
53
Ray Milkeyd84f89b2018-08-17 14:54:17 -070054 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampani620f70d2016-01-30 22:22:47 -080055 protected ClusterService clusterService;
56
Ray Milkeyd84f89b2018-08-17 14:54:17 -070057 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampani620f70d2016-01-30 22:22:47 -080058 protected LeadershipStore store;
59
60 private NodeId localNodeId;
61
Madan Jampani620f70d2016-01-30 22:22:47 -080062 @Activate
63 public void activate() {
64 localNodeId = clusterService.getLocalNode().id();
65 store.setDelegate(delegate);
66 eventDispatcher.addSink(LeadershipEvent.class, listenerRegistry);
Madan Jampani620f70d2016-01-30 22:22:47 -080067 log.info("Started");
68 }
69
70 @Deactivate
71 public void deactivate() {
Madan Jampani620f70d2016-01-30 22:22:47 -080072 Maps.filterValues(store.getLeaderships(), v -> v.candidates().contains(localNodeId))
73 .keySet()
74 .forEach(this::withdraw);
75 store.unsetDelegate(delegate);
76 eventDispatcher.removeSink(LeadershipEvent.class);
77 log.info("Stopped");
78 }
79
80 @Override
81 public Leadership getLeadership(String topic) {
82 return store.getLeadership(topic);
83 }
84
85 @Override
Ray Milkey3bceb012018-09-07 13:42:46 -070086 public Set<String> ownedTopics(NodeId nodeId) {
87 return Maps.filterValues(store.getLeaderships(), v -> Objects.equal(nodeId, v.leaderNodeId())).keySet();
88 }
89
90 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -080091 public Leadership runForLeadership(String topic) {
92 return store.addRegistration(topic);
93 }
94
95 @Override
96 public void withdraw(String topic) {
97 store.removeRegistration(topic);
98 }
99
100 @Override
101 public Map<String, Leadership> getLeaderBoard() {
102 return store.getLeaderships();
103 }
104
105 @Override
106 public boolean transferLeadership(String topic, NodeId to) {
107 return store.moveLeadership(topic, to);
108 }
109
110 @Override
111 public void unregister(NodeId nodeId) {
112 store.removeRegistration(nodeId);
113 }
114
115 @Override
116 public boolean promoteToTopOfCandidateList(String topic, NodeId nodeId) {
117 return store.makeTopCandidate(topic, nodeId);
118 }
119}