blob: 8c3fd506d5f9a5c902197c45c35daa66fd228f50 [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;
tom4a5d1712014-09-23 17:49:39 -07008import org.apache.felix.scr.annotations.Component;
Ayaka Koshibe16609692014-09-23 12:46:15 -07009import org.apache.felix.scr.annotations.Deactivate;
10import org.apache.felix.scr.annotations.Reference;
11import org.apache.felix.scr.annotations.ReferenceCardinality;
tom4a5d1712014-09-23 17:49:39 -070012import org.apache.felix.scr.annotations.Service;
13import org.onlab.onos.cluster.ClusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070014import org.onlab.onos.cluster.MastershipAdminService;
15import org.onlab.onos.cluster.MastershipEvent;
16import org.onlab.onos.cluster.MastershipListener;
17import org.onlab.onos.cluster.MastershipProvider;
18import org.onlab.onos.cluster.MastershipProviderService;
19import org.onlab.onos.cluster.MastershipService;
20import org.onlab.onos.cluster.MastershipStore;
21import org.onlab.onos.cluster.NodeId;
22import org.onlab.onos.event.AbstractListenerRegistry;
23import org.onlab.onos.event.EventDeliveryService;
24import org.onlab.onos.net.DeviceId;
25import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070026import org.onlab.onos.net.provider.AbstractProviderRegistry;
Ayaka Koshibe16609692014-09-23 12:46:15 -070027import org.onlab.onos.net.provider.AbstractProviderService;
28import org.slf4j.Logger;
29
30import static com.google.common.base.Preconditions.checkNotNull;
31
tom4a5d1712014-09-23 17:49:39 -070032@Component(immediate = true)
33@Service
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -070034public class MastershipManager
35 extends AbstractProviderRegistry<MastershipProvider, MastershipProviderService>
36 implements MastershipService, MastershipAdminService {
Ayaka Koshibe16609692014-09-23 12:46:15 -070037
38 private static final String NODE_ID_NULL = "Node ID cannot be null";
39 private static final String DEVICE_ID_NULL = "Device ID cannot be null";
40 private static final String ROLE_NULL = "Mastership role cannot be null";
41
42 private final Logger log = getLogger(getClass());
43
44 protected final AbstractListenerRegistry<MastershipEvent, MastershipListener>
45 listenerRegistry = new AbstractListenerRegistry<>();
46
47 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
48 protected MastershipStore store;
49
50 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
51 protected EventDeliveryService eventDispatcher;
52
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
tom4a5d1712014-09-23 17:49:39 -070054 protected ClusterService clusterService;
Ayaka Koshibe16609692014-09-23 12:46:15 -070055
56 @Activate
57 public void activate() {
58 eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
59 log.info("Started");
60 }
61
62 @Deactivate
63 public void deactivate() {
64 eventDispatcher.removeSink(MastershipEvent.class);
65 log.info("Stopped");
66 }
67
Ayaka Koshibe16609692014-09-23 12:46:15 -070068 @Override
69 public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
70 checkNotNull(nodeId, NODE_ID_NULL);
71 checkNotNull(deviceId, DEVICE_ID_NULL);
72 checkNotNull(role, ROLE_NULL);
Ayaka Koshibea7f044e2014-09-23 16:56:20 -070073 MastershipEvent event = store.setRole(nodeId, deviceId, role);
74 if (event != null) {
75 post(event);
76 }
Ayaka Koshibe16609692014-09-23 12:46:15 -070077 }
78
79 @Override
80 public NodeId getMasterFor(DeviceId deviceId) {
81 checkNotNull(deviceId, DEVICE_ID_NULL);
82 return store.getMaster(deviceId);
83 }
84
85 @Override
86 public Set<DeviceId> getDevicesOf(NodeId nodeId) {
87 checkNotNull(nodeId, NODE_ID_NULL);
88 return store.getDevices(nodeId);
89 }
90
91 @Override
92 public MastershipRole requestRoleFor(DeviceId deviceId) {
93 checkNotNull(deviceId, DEVICE_ID_NULL);
tom4a5d1712014-09-23 17:49:39 -070094 NodeId id = clusterService.getLocalNode().id();
Ayaka Koshibe16609692014-09-23 12:46:15 -070095 return store.getRole(id, deviceId);
96 }
97
98 @Override
99 public void addListener(MastershipListener listener) {
100 checkNotNull(listener);
101 listenerRegistry.addListener(listener);
102 }
103
104 @Override
105 public void removeListener(MastershipListener listener) {
106 checkNotNull(listener);
107 listenerRegistry.removeListener(listener);
108 }
109
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700110 @Override
111 protected MastershipProviderService createProviderService(
112 MastershipProvider provider) {
113 return new InternalMastershipProviderService(provider);
114 }
115
Ayaka Koshibe16609692014-09-23 12:46:15 -0700116 private class InternalMastershipProviderService
117 extends AbstractProviderService<MastershipProvider>
118 implements MastershipProviderService {
119
120 protected InternalMastershipProviderService(MastershipProvider provider) {
121 super(provider);
122 }
123
124 @Override
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700125 public void roleChanged(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
Ayaka Koshibe16609692014-09-23 12:46:15 -0700126 // TODO Auto-generated method stub
Ayaka Koshibe3eed2b02014-09-23 13:28:05 -0700127 MastershipEvent event =
128 store.addOrUpdateDevice(nodeId, deviceId, role);
129 post(event);
Ayaka Koshibe16609692014-09-23 12:46:15 -0700130 }
131 }
132
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 Koshibe16609692014-09-23 12:46:15 -0700140}