blob: a8d205287e0741b733bd8fa6803b4da049c2d603 [file] [log] [blame]
Ayaka Koshibe16609692014-09-23 12:46:15 -07001package org.onlab.onos.cluster.impl;
2
Ayaka Koshibe16609692014-09-23 12:46:15 -07003import org.apache.felix.scr.annotations.Activate;
tom4a5d1712014-09-23 17:49:39 -07004import org.apache.felix.scr.annotations.Component;
Ayaka Koshibe16609692014-09-23 12:46:15 -07005import org.apache.felix.scr.annotations.Deactivate;
6import org.apache.felix.scr.annotations.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
tom4a5d1712014-09-23 17:49:39 -07008import org.apache.felix.scr.annotations.Service;
9import org.onlab.onos.cluster.ClusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070010import org.onlab.onos.cluster.MastershipAdminService;
11import org.onlab.onos.cluster.MastershipEvent;
12import org.onlab.onos.cluster.MastershipListener;
Ayaka Koshibe16609692014-09-23 12:46:15 -070013import org.onlab.onos.cluster.MastershipService;
14import org.onlab.onos.cluster.MastershipStore;
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -070015import org.onlab.onos.cluster.MastershipTerm;
16import org.onlab.onos.cluster.MastershipTermService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070017import org.onlab.onos.cluster.NodeId;
18import org.onlab.onos.event.AbstractListenerRegistry;
19import org.onlab.onos.event.EventDeliveryService;
20import org.onlab.onos.net.DeviceId;
21import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe16609692014-09-23 12:46:15 -070022import org.slf4j.Logger;
23
tomb41d1ac2014-09-24 01:51:24 -070024import java.util.Set;
25
Ayaka Koshibe16609692014-09-23 12:46:15 -070026import static com.google.common.base.Preconditions.checkNotNull;
tomb41d1ac2014-09-24 01:51:24 -070027import static org.slf4j.LoggerFactory.getLogger;
Ayaka Koshibe16609692014-09-23 12:46:15 -070028
tom4a5d1712014-09-23 17:49:39 -070029@Component(immediate = true)
30@Service
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070031public class MastershipManager
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070032 implements MastershipService, MastershipAdminService {
Ayaka Koshibe16609692014-09-23 12:46:15 -070033
34 private static final String NODE_ID_NULL = "Node ID cannot be null";
35 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
36 private static final String ROLE_NULL = "Mastership role cannot be null";
37
38 private final Logger log = getLogger(getClass());
39
40 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
41 listenerRegistry = new AbstractListenerRegistry<>();
42
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
44 protected MastershipStore store;
45
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected EventDeliveryService eventDispatcher;
48
49 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4a5d1712014-09-23 17:49:39 -070050 protected ClusterService clusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070051
52 @Activate
53 public void activate() {
54 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
55 log.info("Started");
56 }
57
58 @Deactivate
59 public void deactivate() {
60 eventDispatcher.removeSink(MastershipEvent.class);
61 log.info("Stopped");
62 }
63
Ayaka Koshibe16609692014-09-23 12:46:15 -070064 @Override
65 public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
66 checkNotNull(nodeId, NODE_ID_NULL);
67 checkNotNull(deviceId, DEVICE_ID_NULL);
68 checkNotNull(role, ROLE_NULL);
Ayaka Koshibe406d0102014-09-24 16:08:12 -070069 //TODO figure out appropriate action for non-MASTER roles, if we even set those
70 if (role.equals(MastershipRole.MASTER)) {
71 MastershipEvent event = store.setMaster(nodeId, deviceId);
72 if (event != null) {
73 post(event);
74 }
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070075 }
Ayaka Koshibe16609692014-09-23 12:46:15 -070076 }
77
78 @Override
tomb41d1ac2014-09-24 01:51:24 -070079 public MastershipRole getLocalRole(DeviceId deviceId) {
80 checkNotNull(deviceId, DEVICE_ID_NULL);
81 return store.getRole(clusterService.getLocalNode().id(), deviceId);
82 }
83
84 @Override
85 public void relinquishMastership(DeviceId deviceId) {
86 checkNotNull(deviceId, DEVICE_ID_NULL);
87 // FIXME: add method to store to give up mastership and trigger new master selection process
88 }
89
90 @Override
91 public MastershipRole requestRoleFor(DeviceId deviceId) {
92 checkNotNull(deviceId, DEVICE_ID_NULL);
93 return store.requestRole(deviceId);
94 }
95
96 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -070097 public NodeId getMasterFor(DeviceId deviceId) {
98 checkNotNull(deviceId, DEVICE_ID_NULL);
99 return store.getMaster(deviceId);
100 }
101
102 @Override
103 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
104 checkNotNull(nodeId, NODE_ID_NULL);
105 return store.getDevices(nodeId);
106 }
107
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -0700108
109 @Override
110 public MastershipTermService requestTermService() {
111 return new InternalMastershipTermService();
112 }
113
Ayaka Koshibe16609692014-09-23 12:46:15 -0700114 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -0700115 public void addListener(MastershipListener listener) {
116 checkNotNull(listener);
117 listenerRegistry.addListener(listener);
118 }
119
120 @Override
121 public void removeListener(MastershipListener listener) {
122 checkNotNull(listener);
123 listenerRegistry.removeListener(listener);
124 }
125
tomb41d1ac2014-09-24 01:51:24 -0700126 // FIXME: provide wiring to allow events to be triggered by changes within the store
Ayaka Koshibe16609692014-09-23 12:46:15 -0700127
128 // Posts the specified event to the local event dispatcher.
129 private void post(MastershipEvent event) {
130 if (event != null && eventDispatcher != null) {
131 eventDispatcher.post(event);
132 }
133 }
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700134
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -0700135 private class InternalMastershipTermService implements MastershipTermService {
136
137 @Override
138 public MastershipTerm getMastershipTerm(DeviceId deviceId) {
139 return store.getTermFor(deviceId);
140 }
141
142 }
143
Ayaka Koshibe16609692014-09-23 12:46:15 -0700144}