blob: 255830ca02cb2351765c38cae4f44b56512764bf [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;
15import org.onlab.onos.cluster.NodeId;
16import org.onlab.onos.event.AbstractListenerRegistry;
17import org.onlab.onos.event.EventDeliveryService;
18import org.onlab.onos.net.DeviceId;
19import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe16609692014-09-23 12:46:15 -070020import org.slf4j.Logger;
21
tomb41d1ac2014-09-24 01:51:24 -070022import java.util.Set;
23
Ayaka Koshibe16609692014-09-23 12:46:15 -070024import static com.google.common.base.Preconditions.checkNotNull;
tomb41d1ac2014-09-24 01:51:24 -070025import static org.slf4j.LoggerFactory.getLogger;
Ayaka Koshibe16609692014-09-23 12:46:15 -070026
tom4a5d1712014-09-23 17:49:39 -070027@Component(immediate = true)
28@Service
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070029public class MastershipManager
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070030 implements MastershipService, MastershipAdminService {
Ayaka Koshibe16609692014-09-23 12:46:15 -070031
32 private static final String NODE_ID_NULL = "Node ID cannot be null";
33 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
34 private static final String ROLE_NULL = "Mastership role cannot be null";
35
36 private final Logger log = getLogger(getClass());
37
38 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
39 listenerRegistry = new AbstractListenerRegistry<>();
40
41 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
42 protected MastershipStore store;
43
44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
45 protected EventDeliveryService eventDispatcher;
46
47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4a5d1712014-09-23 17:49:39 -070048 protected ClusterService clusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070049
50 @Activate
51 public void activate() {
52 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
53 log.info("Started");
54 }
55
56 @Deactivate
57 public void deactivate() {
58 eventDispatcher.removeSink(MastershipEvent.class);
59 log.info("Stopped");
60 }
61
Ayaka Koshibe16609692014-09-23 12:46:15 -070062 @Override
63 public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
64 checkNotNull(nodeId, NODE_ID_NULL);
65 checkNotNull(deviceId, DEVICE_ID_NULL);
66 checkNotNull(role, ROLE_NULL);
Ayaka Koshibe406d0102014-09-24 16:08:12 -070067 //TODO figure out appropriate action for non-MASTER roles, if we even set those
68 if (role.equals(MastershipRole.MASTER)) {
69 MastershipEvent event = store.setMaster(nodeId, deviceId);
70 if (event != null) {
71 post(event);
72 }
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070073 }
Ayaka Koshibe16609692014-09-23 12:46:15 -070074 }
75
76 @Override
tomb41d1ac2014-09-24 01:51:24 -070077 public MastershipRole getLocalRole(DeviceId deviceId) {
78 checkNotNull(deviceId, DEVICE_ID_NULL);
79 return store.getRole(clusterService.getLocalNode().id(), deviceId);
80 }
81
82 @Override
83 public void relinquishMastership(DeviceId deviceId) {
84 checkNotNull(deviceId, DEVICE_ID_NULL);
85 // FIXME: add method to store to give up mastership and trigger new master selection process
86 }
87
88 @Override
89 public MastershipRole requestRoleFor(DeviceId deviceId) {
90 checkNotNull(deviceId, DEVICE_ID_NULL);
91 return store.requestRole(deviceId);
92 }
93
94 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -070095 public NodeId getMasterFor(DeviceId deviceId) {
96 checkNotNull(deviceId, DEVICE_ID_NULL);
97 return store.getMaster(deviceId);
98 }
99
100 @Override
101 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
102 checkNotNull(nodeId, NODE_ID_NULL);
103 return store.getDevices(nodeId);
104 }
105
106 @Override
Ayaka Koshibe16609692014-09-23 12:46:15 -0700107 public void addListener(MastershipListener listener) {
108 checkNotNull(listener);
109 listenerRegistry.addListener(listener);
110 }
111
112 @Override
113 public void removeListener(MastershipListener listener) {
114 checkNotNull(listener);
115 listenerRegistry.removeListener(listener);
116 }
117
tomb41d1ac2014-09-24 01:51:24 -0700118 // FIXME: provide wiring to allow events to be triggered by changes within the store
Ayaka Koshibe16609692014-09-23 12:46:15 -0700119
120 // Posts the specified event to the local event dispatcher.
121 private void post(MastershipEvent event) {
122 if (event != null && eventDispatcher != null) {
123 eventDispatcher.post(event);
124 }
125 }
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700126
Ayaka Koshibe16609692014-09-23 12:46:15 -0700127}