blob: 07d841901da8dcfee0a7111500f264ef919a2929 [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
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.util.Map;
Ray Milkey3bceb012018-09-07 13:42:46 -070021import java.util.Set;
Madan Jampani620f70d2016-01-30 22:22:47 -080022
Ray Milkey3bceb012018-09-07 13:42:46 -070023import com.google.common.base.Objects;
Madan Jampani620f70d2016-01-30 22:22:47 -080024import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
Madan Jampani620f70d2016-01-30 22:22:47 -080030import org.onosproject.cluster.ClusterService;
Madan Jampani620f70d2016-01-30 22:22:47 -080031import org.onosproject.cluster.Leadership;
32import org.onosproject.cluster.LeadershipAdminService;
33import org.onosproject.cluster.LeadershipEvent;
34import org.onosproject.cluster.LeadershipEventListener;
35import org.onosproject.cluster.LeadershipService;
36import org.onosproject.cluster.LeadershipStore;
37import org.onosproject.cluster.LeadershipStoreDelegate;
38import org.onosproject.cluster.NodeId;
39import org.onosproject.event.AbstractListenerManager;
40import org.slf4j.Logger;
41
42import com.google.common.collect.Maps;
43
44/**
45 * Implementation of {@link LeadershipService} and {@link LeadershipAdminService}.
46 */
47@Component(immediate = true)
48@Service
49public class LeadershipManager
50 extends AbstractListenerManager<LeadershipEvent, LeadershipEventListener>
51 implements LeadershipService, LeadershipAdminService {
52
53 private final Logger log = getLogger(getClass());
54
55 private LeadershipStoreDelegate delegate = this::post;
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected ClusterService clusterService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected LeadershipStore store;
62
63 private NodeId localNodeId;
64
Madan Jampani620f70d2016-01-30 22:22:47 -080065 @Activate
66 public void activate() {
67 localNodeId = clusterService.getLocalNode().id();
68 store.setDelegate(delegate);
69 eventDispatcher.addSink(LeadershipEvent.class, listenerRegistry);
Madan Jampani620f70d2016-01-30 22:22:47 -080070 log.info("Started");
71 }
72
73 @Deactivate
74 public void deactivate() {
Madan Jampani620f70d2016-01-30 22:22:47 -080075 Maps.filterValues(store.getLeaderships(), v -> v.candidates().contains(localNodeId))
76 .keySet()
77 .forEach(this::withdraw);
78 store.unsetDelegate(delegate);
79 eventDispatcher.removeSink(LeadershipEvent.class);
80 log.info("Stopped");
81 }
82
83 @Override
84 public Leadership getLeadership(String topic) {
85 return store.getLeadership(topic);
86 }
87
88 @Override
Ray Milkey3bceb012018-09-07 13:42:46 -070089 public Set<String> ownedTopics(NodeId nodeId) {
90 return Maps.filterValues(store.getLeaderships(), v -> Objects.equal(nodeId, v.leaderNodeId())).keySet();
91 }
92
93 @Override
Madan Jampani620f70d2016-01-30 22:22:47 -080094 public Leadership runForLeadership(String topic) {
95 return store.addRegistration(topic);
96 }
97
98 @Override
99 public void withdraw(String topic) {
100 store.removeRegistration(topic);
101 }
102
103 @Override
104 public Map<String, Leadership> getLeaderBoard() {
105 return store.getLeaderships();
106 }
107
108 @Override
109 public boolean transferLeadership(String topic, NodeId to) {
110 return store.moveLeadership(topic, to);
111 }
112
113 @Override
114 public void unregister(NodeId nodeId) {
115 store.removeRegistration(nodeId);
116 }
117
118 @Override
119 public boolean promoteToTopOfCandidateList(String topic, NodeId nodeId) {
120 return store.makeTopCandidate(topic, nodeId);
121 }
122}