blob: 3d7b5bca9d24f873e68f1722f83624503d6bcab9 [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;
23import org.onlab.onos.net.provider.AbstractProviderService;
24import org.slf4j.Logger;
25
26import static com.google.common.base.Preconditions.checkNotNull;
27
28public class MastershipManager implements MastershipService,
29 MastershipAdminService {
30
31 private static final String NODE_ID_NULL = "Node ID cannot be null";
32 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
33 private static final String ROLE_NULL = "Mastership role cannot be null";
34
35 private final Logger log = getLogger(getClass());
36
37 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
38 listenerRegistry = new AbstractListenerRegistry<>();
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
41 protected MastershipStore store;
42
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
44 protected EventDeliveryService eventDispatcher;
45
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected ClusterManager clusterManager;
48
49 @Activate
50 public void activate() {
51 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
52 log.info("Started");
53 }
54
55 @Deactivate
56 public void deactivate() {
57 eventDispatcher.removeSink(MastershipEvent.class);
58 log.info("Stopped");
59 }
60
61
62 @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);
67 store.setRole(nodeId, deviceId, role);
68 }
69
70 @Override
71 public NodeId getMasterFor(DeviceId deviceId) {
72 checkNotNull(deviceId, DEVICE_ID_NULL);
73 return store.getMaster(deviceId);
74 }
75
76 @Override
77 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
78 checkNotNull(nodeId, NODE_ID_NULL);
79 return store.getDevices(nodeId);
80 }
81
82 @Override
83 public MastershipRole requestRoleFor(DeviceId deviceId) {
84 checkNotNull(deviceId, DEVICE_ID_NULL);
85 NodeId id = clusterManager.getLocalNode().id();
86 return store.getRole(id, deviceId);
87 }
88
89 @Override
90 public void addListener(MastershipListener listener) {
91 checkNotNull(listener);
92 listenerRegistry.addListener(listener);
93 }
94
95 @Override
96 public void removeListener(MastershipListener listener) {
97 checkNotNull(listener);
98 listenerRegistry.removeListener(listener);
99 }
100
101 private class InternalMastershipProviderService
102 extends AbstractProviderService<MastershipProvider>
103 implements MastershipProviderService {
104
105 protected InternalMastershipProviderService(MastershipProvider provider) {
106 super(provider);
107 }
108
109 @Override
110 public void roleChanged(DeviceId deviceId, MastershipRole role) {
111 // TODO Auto-generated method stub
112
113 }
114 }
115
116 // Posts the specified event to the local event dispatcher.
117 private void post(MastershipEvent event) {
118 if (event != null && eventDispatcher != null) {
119 eventDispatcher.post(event);
120 }
121 }
122}