blob: 492f0d40aca7b6ea3eceacb3ecd9c4cae4186e63 [file] [log] [blame]
Ayaka Koshibe16609692014-09-23 12:46:15 -07001package org.onlab.onos.cluster.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.Set;
6
7import org.apache.felix.scr.annotations.Activate;
8import org.apache.felix.scr.annotations.Deactivate;
9import org.apache.felix.scr.annotations.Reference;
10import org.apache.felix.scr.annotations.ReferenceCardinality;
11import org.onlab.onos.cluster.MastershipAdminService;
12import org.onlab.onos.cluster.MastershipEvent;
13import org.onlab.onos.cluster.MastershipListener;
14import org.onlab.onos.cluster.MastershipProvider;
15import org.onlab.onos.cluster.MastershipProviderService;
16import org.onlab.onos.cluster.MastershipService;
17import org.onlab.onos.cluster.MastershipStore;
18import org.onlab.onos.cluster.NodeId;
19import org.onlab.onos.event.AbstractListenerRegistry;
20import org.onlab.onos.event.EventDeliveryService;
21import org.onlab.onos.net.DeviceId;
22import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070023import org.onlab.onos.net.provider.AbstractProviderRegistry;
Ayaka Koshibe16609692014-09-23 12:46:15 -070024import org.onlab.onos.net.provider.AbstractProviderService;
25import org.slf4j.Logger;
26
27import static com.google.common.base.Preconditions.checkNotNull;
28
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070029public class MastershipManager
30 extends AbstractProviderRegistry<MastershipProvider, MastershipProviderService>
31 implements MastershipService, MastershipAdminService {
Ayaka Koshibe16609692014-09-23 12:46:15 -070032
33 private static final String NODE_ID_NULL = "Node ID cannot be null";
34 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
35 private static final String ROLE_NULL = "Mastership role cannot be null";
36
37 private final Logger log = getLogger(getClass());
38
39 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
40 listenerRegistry = new AbstractListenerRegistry<>();
41
42 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
43 protected MastershipStore store;
44
45 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
46 protected EventDeliveryService eventDispatcher;
47
48 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
49 protected ClusterManager clusterManager;
50
51 @Activate
52 public void activate() {
53 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
54 log.info("Started");
55 }
56
57 @Deactivate
58 public void deactivate() {
59 eventDispatcher.removeSink(MastershipEvent.class);
60 log.info("Stopped");
61 }
62
Ayaka Koshibe16609692014-09-23 12:46:15 -070063 @Override
64 public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
65 checkNotNull(nodeId, NODE_ID_NULL);
66 checkNotNull(deviceId, DEVICE_ID_NULL);
67 checkNotNull(role, ROLE_NULL);
68 store.setRole(nodeId, deviceId, role);
69 }
70
71 @Override
72 public NodeId getMasterFor(DeviceId deviceId) {
73 checkNotNull(deviceId, DEVICE_ID_NULL);
74 return store.getMaster(deviceId);
75 }
76
77 @Override
78 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
79 checkNotNull(nodeId, NODE_ID_NULL);
80 return store.getDevices(nodeId);
81 }
82
83 @Override
84 public MastershipRole requestRoleFor(DeviceId deviceId) {
85 checkNotNull(deviceId, DEVICE_ID_NULL);
86 NodeId id = clusterManager.getLocalNode().id();
87 return store.getRole(id, deviceId);
88 }
89
90 @Override
91 public void addListener(MastershipListener listener) {
92 checkNotNull(listener);
93 listenerRegistry.addListener(listener);
94 }
95
96 @Override
97 public void removeListener(MastershipListener listener) {
98 checkNotNull(listener);
99 listenerRegistry.removeListener(listener);
100 }
101
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700102 @Override
103 protected MastershipProviderService createProviderService(
104 MastershipProvider provider) {
105 return new InternalMastershipProviderService(provider);
106 }
107
Ayaka Koshibe16609692014-09-23 12:46:15 -0700108 private class InternalMastershipProviderService
109 extends AbstractProviderService<MastershipProvider>
110 implements MastershipProviderService {
111
112 protected InternalMastershipProviderService(MastershipProvider provider) {
113 super(provider);
114 }
115
116 @Override
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700117 public void roleChanged(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
Ayaka Koshibe16609692014-09-23 12:46:15 -0700118 // TODO Auto-generated method stub
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700119 MastershipEvent event =
120 store.addOrUpdateDevice(nodeId, deviceId, role);
121 post(event);
Ayaka Koshibe16609692014-09-23 12:46:15 -0700122 }
123 }
124
125 // Posts the specified event to the local event dispatcher.
126 private void post(MastershipEvent event) {
127 if (event != null && eventDispatcher != null) {
128 eventDispatcher.post(event);
129 }
130 }
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700131
Ayaka Koshibe16609692014-09-23 12:46:15 -0700132}