blob: 2160799ecadefa61fc599b2f54793f8dd1d890cd [file] [log] [blame]
Madan Jampani620f70d2016-01-30 22:22:47 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
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;
Madan Jampani620f70d2016-01-30 22:22:47 -080021
22import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
27import org.apache.felix.scr.annotations.Service;
Madan Jampani620f70d2016-01-30 22:22:47 -080028import org.onosproject.cluster.ClusterService;
Madan Jampani620f70d2016-01-30 22:22:47 -080029import org.onosproject.cluster.Leadership;
30import org.onosproject.cluster.LeadershipAdminService;
31import org.onosproject.cluster.LeadershipEvent;
32import org.onosproject.cluster.LeadershipEventListener;
33import org.onosproject.cluster.LeadershipService;
34import org.onosproject.cluster.LeadershipStore;
35import org.onosproject.cluster.LeadershipStoreDelegate;
36import org.onosproject.cluster.NodeId;
37import org.onosproject.event.AbstractListenerManager;
38import org.slf4j.Logger;
39
40import com.google.common.collect.Maps;
41
42/**
43 * Implementation of {@link LeadershipService} and {@link LeadershipAdminService}.
44 */
45@Component(immediate = true)
46@Service
47public class LeadershipManager
48 extends AbstractListenerManager<LeadershipEvent, LeadershipEventListener>
49 implements LeadershipService, LeadershipAdminService {
50
51 private final Logger log = getLogger(getClass());
52
53 private LeadershipStoreDelegate delegate = this::post;
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected ClusterService clusterService;
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected LeadershipStore store;
60
61 private NodeId localNodeId;
62
Madan Jampani620f70d2016-01-30 22:22:47 -080063 @Activate
64 public void activate() {
65 localNodeId = clusterService.getLocalNode().id();
66 store.setDelegate(delegate);
67 eventDispatcher.addSink(LeadershipEvent.class, listenerRegistry);
Madan Jampani620f70d2016-01-30 22:22:47 -080068 log.info("Started");
69 }
70
71 @Deactivate
72 public void deactivate() {
Madan Jampani620f70d2016-01-30 22:22:47 -080073 Maps.filterValues(store.getLeaderships(), v -> v.candidates().contains(localNodeId))
74 .keySet()
75 .forEach(this::withdraw);
76 store.unsetDelegate(delegate);
77 eventDispatcher.removeSink(LeadershipEvent.class);
78 log.info("Stopped");
79 }
80
81 @Override
82 public Leadership getLeadership(String topic) {
83 return store.getLeadership(topic);
84 }
85
86 @Override
87 public Leadership runForLeadership(String topic) {
88 return store.addRegistration(topic);
89 }
90
91 @Override
92 public void withdraw(String topic) {
93 store.removeRegistration(topic);
94 }
95
96 @Override
97 public Map<String, Leadership> getLeaderBoard() {
98 return store.getLeaderships();
99 }
100
101 @Override
102 public boolean transferLeadership(String topic, NodeId to) {
103 return store.moveLeadership(topic, to);
104 }
105
106 @Override
107 public void unregister(NodeId nodeId) {
108 store.removeRegistration(nodeId);
109 }
110
111 @Override
112 public boolean promoteToTopOfCandidateList(String topic, NodeId nodeId) {
113 return store.makeTopCandidate(topic, nodeId);
114 }
115}