blob: 1a0c408ce5911260c990a8aae99deec7954c6a66 [file] [log] [blame]
Ayaka Koshibe16609692014-09-23 12:46:15 -07001package org.onlab.onos.cluster.impl;
2
alshabib339a3d92014-09-26 17:54:32 -07003import static com.google.common.base.Preconditions.checkNotNull;
4import static org.slf4j.LoggerFactory.getLogger;
5
6import java.util.Set;
7
Ayaka Koshibe16609692014-09-23 12:46:15 -07008import org.apache.felix.scr.annotations.Activate;
tom4a5d1712014-09-23 17:49:39 -07009import org.apache.felix.scr.annotations.Component;
Ayaka Koshibe16609692014-09-23 12:46:15 -070010import org.apache.felix.scr.annotations.Deactivate;
11import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
tom4a5d1712014-09-23 17:49:39 -070013import org.apache.felix.scr.annotations.Service;
14import org.onlab.onos.cluster.ClusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070015import org.onlab.onos.cluster.MastershipAdminService;
16import org.onlab.onos.cluster.MastershipEvent;
17import org.onlab.onos.cluster.MastershipListener;
Ayaka Koshibe16609692014-09-23 12:46:15 -070018import org.onlab.onos.cluster.MastershipService;
19import org.onlab.onos.cluster.MastershipStore;
alshabib339a3d92014-09-26 17:54:32 -070020import org.onlab.onos.cluster.MastershipStoreDelegate;
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -070021import org.onlab.onos.cluster.MastershipTerm;
22import org.onlab.onos.cluster.MastershipTermService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070023import org.onlab.onos.cluster.NodeId;
24import org.onlab.onos.event.AbstractListenerRegistry;
25import org.onlab.onos.event.EventDeliveryService;
26import org.onlab.onos.net.DeviceId;
27import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe16609692014-09-23 12:46:15 -070028import org.slf4j.Logger;
29
tom4a5d1712014-09-23 17:49:39 -070030@Component(immediate = true)
31@Service
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070032public class MastershipManager
alshabib339a3d92014-09-26 17:54:32 -070033implements MastershipService, MastershipAdminService {
Ayaka Koshibe16609692014-09-23 12:46:15 -070034
35 private static final String NODE_ID_NULL = "Node ID cannot be null";
36 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
37 private static final String ROLE_NULL = "Mastership role cannot be null";
38
39 private final Logger log = getLogger(getClass());
40
41 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
alshabib339a3d92014-09-26 17:54:32 -070042 listenerRegistry = new AbstractListenerRegistry<>();
43
44 private final MastershipStoreDelegate delegate = new InternalDelegate();
Ayaka Koshibe16609692014-09-23 12:46:15 -070045
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected MastershipStore store;
48
49 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
50 protected EventDeliveryService eventDispatcher;
51
52 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4a5d1712014-09-23 17:49:39 -070053 protected ClusterService clusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070054
55 @Activate
56 public void activate() {
57 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
alshabib339a3d92014-09-26 17:54:32 -070058 store.setDelegate(delegate);
Ayaka Koshibe16609692014-09-23 12:46:15 -070059 log.info("Started");
60 }
61
62 @Deactivate
63 public void deactivate() {
64 eventDispatcher.removeSink(MastershipEvent.class);
alshabib339a3d92014-09-26 17:54:32 -070065 store.unsetDelegate(delegate);
Ayaka Koshibe16609692014-09-23 12:46:15 -070066 log.info("Stopped");
67 }
68
Ayaka Koshibe16609692014-09-23 12:46:15 -070069 @Override
70 public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
71 checkNotNull(nodeId, NODE_ID_NULL);
72 checkNotNull(deviceId, DEVICE_ID_NULL);
73 checkNotNull(role, ROLE_NULL);
Ayaka Koshibe406d0102014-09-24 16:08:12 -070074 //TODO figure out appropriate action for non-MASTER roles, if we even set those
75 if (role.equals(MastershipRole.MASTER)) {
76 MastershipEvent event = store.setMaster(nodeId, deviceId);
77 if (event != null) {
78 post(event);
79 }
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070080 }
Ayaka Koshibe16609692014-09-23 12:46:15 -070081 }
82
83 @Override
tomb41d1ac2014-09-24 01:51:24 -070084 public MastershipRole getLocalRole(DeviceId deviceId) {
85 checkNotNull(deviceId, DEVICE_ID_NULL);
86 return store.getRole(clusterService.getLocalNode().id(), deviceId);
87 }
88
89 @Override
90 public void relinquishMastership(DeviceId deviceId) {
91 checkNotNull(deviceId, DEVICE_ID_NULL);
92 // FIXME: add method to store to give up mastership and trigger new master selection process
93 }
94
95 @Override
96 public MastershipRole requestRoleFor(DeviceId deviceId) {
97 checkNotNull(deviceId, DEVICE_ID_NULL);
98 return store.requestRole(deviceId);
99 }
100
101 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -0700102 public NodeId getMasterFor(DeviceId deviceId) {
103 checkNotNull(deviceId, DEVICE_ID_NULL);
104 return store.getMaster(deviceId);
105 }
106
107 @Override
108 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
109 checkNotNull(nodeId, NODE_ID_NULL);
110 return store.getDevices(nodeId);
111 }
112
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -0700113
114 @Override
115 public MastershipTermService requestTermService() {
116 return new InternalMastershipTermService();
117 }
118
Ayaka Koshibe16609692014-09-23 12:46:15 -0700119 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -0700120 public void addListener(MastershipListener listener) {
121 checkNotNull(listener);
122 listenerRegistry.addListener(listener);
123 }
124
125 @Override
126 public void removeListener(MastershipListener listener) {
127 checkNotNull(listener);
128 listenerRegistry.removeListener(listener);
129 }
130
tomb41d1ac2014-09-24 01:51:24 -0700131 // FIXME: provide wiring to allow events to be triggered by changes within the store
Ayaka Koshibe16609692014-09-23 12:46:15 -0700132
133 // Posts the specified event to the local event dispatcher.
134 private void post(MastershipEvent event) {
135 if (event != null && eventDispatcher != null) {
136 eventDispatcher.post(event);
137 }
138 }
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700139
Ayaka Koshibeb70d34b2014-09-25 15:43:01 -0700140 private class InternalMastershipTermService implements MastershipTermService {
141
142 @Override
143 public MastershipTerm getMastershipTerm(DeviceId deviceId) {
144 return store.getTermFor(deviceId);
145 }
146
147 }
148
alshabib339a3d92014-09-26 17:54:32 -0700149 public class InternalDelegate implements MastershipStoreDelegate {
150
151 @Override
152 public void notify(MastershipEvent event) {
153 log.info("dispatching mastership event {}", event);
154 eventDispatcher.post(event);
155 }
156
157 }
158
Ayaka Koshibe16609692014-09-23 12:46:15 -0700159}