blob: 83686840a143952d98e8ed9c044ae0dcd36f1710 [file] [log] [blame]
tome4729872014-09-23 00:37:37 -07001package org.onlab.onos.cluster.impl;
2
3import org.apache.felix.scr.annotations.Activate;
4import org.apache.felix.scr.annotations.Component;
5import org.apache.felix.scr.annotations.Deactivate;
6import org.apache.felix.scr.annotations.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
8import org.apache.felix.scr.annotations.Service;
tomb41d1ac2014-09-24 01:51:24 -07009import org.onlab.onos.cluster.ClusterAdminService;
tome4729872014-09-23 00:37:37 -070010import org.onlab.onos.cluster.ClusterEvent;
11import org.onlab.onos.cluster.ClusterEventListener;
12import org.onlab.onos.cluster.ClusterService;
13import org.onlab.onos.cluster.ClusterStore;
tom0755a362014-09-24 11:54:43 -070014import org.onlab.onos.cluster.ClusterStoreDelegate;
tome4729872014-09-23 00:37:37 -070015import org.onlab.onos.cluster.ControllerNode;
16import org.onlab.onos.cluster.NodeId;
17import org.onlab.onos.event.AbstractListenerRegistry;
18import org.onlab.onos.event.EventDeliveryService;
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070019import org.onlab.packet.IpAddress;
tome4729872014-09-23 00:37:37 -070020import org.slf4j.Logger;
21
22import java.util.Set;
23
tomee49c372014-09-26 15:14:50 -070024import static com.google.common.base.Preconditions.checkArgument;
tome4729872014-09-23 00:37:37 -070025import static com.google.common.base.Preconditions.checkNotNull;
26import static org.slf4j.LoggerFactory.getLogger;
27
28/**
29 * Implementation of the cluster service.
30 */
31@Component(immediate = true)
32@Service
tomb41d1ac2014-09-24 01:51:24 -070033public class ClusterManager implements ClusterService, ClusterAdminService {
tome4729872014-09-23 00:37:37 -070034
35 public static final String INSTANCE_ID_NULL = "Instance ID cannot be null";
36 private final Logger log = getLogger(getClass());
37
tom0755a362014-09-24 11:54:43 -070038 private ClusterStoreDelegate delegate = new InternalStoreDelegate();
39
tome4729872014-09-23 00:37:37 -070040 protected final AbstractListenerRegistry<ClusterEvent, ClusterEventListener>
41 listenerRegistry = new AbstractListenerRegistry<>();
42
43 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
44 protected ClusterStore store;
45
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
47 protected EventDeliveryService eventDispatcher;
48
49 @Activate
50 public void activate() {
tom0755a362014-09-24 11:54:43 -070051 store.setDelegate(delegate);
tome4729872014-09-23 00:37:37 -070052 eventDispatcher.addSink(ClusterEvent.class, listenerRegistry);
53 log.info("Started");
54 }
55
56 @Deactivate
57 public void deactivate() {
tomf80c9722014-09-24 14:49:18 -070058 store.unsetDelegate(delegate);
tome4729872014-09-23 00:37:37 -070059 eventDispatcher.removeSink(ClusterEvent.class);
60 log.info("Stopped");
61 }
62
63 @Override
64 public ControllerNode getLocalNode() {
65 return store.getLocalNode();
66 }
67
68 @Override
69 public Set<ControllerNode> getNodes() {
70 return store.getNodes();
71 }
72
73 @Override
74 public ControllerNode getNode(NodeId nodeId) {
75 checkNotNull(nodeId, INSTANCE_ID_NULL);
76 return store.getNode(nodeId);
77 }
78
79 @Override
80 public ControllerNode.State getState(NodeId nodeId) {
81 checkNotNull(nodeId, INSTANCE_ID_NULL);
82 return store.getState(nodeId);
83 }
84
85 @Override
Pavlin Radoslavov444b5192014-10-28 10:45:19 -070086 public ControllerNode addNode(NodeId nodeId, IpAddress ip, int tcpPort) {
tomee49c372014-09-26 15:14:50 -070087 checkNotNull(nodeId, INSTANCE_ID_NULL);
88 checkNotNull(ip, "IP address cannot be null");
89 checkArgument(tcpPort > 5000, "TCP port must be > 5000");
90 return store.addNode(nodeId, ip, tcpPort);
91 }
92
93 @Override
tomb41d1ac2014-09-24 01:51:24 -070094 public void removeNode(NodeId nodeId) {
95 checkNotNull(nodeId, INSTANCE_ID_NULL);
96 store.removeNode(nodeId);
97 }
98
99 @Override
tome4729872014-09-23 00:37:37 -0700100 public void addListener(ClusterEventListener listener) {
101 listenerRegistry.addListener(listener);
102 }
103
104 @Override
105 public void removeListener(ClusterEventListener listener) {
106 listenerRegistry.removeListener(listener);
107 }
tom0755a362014-09-24 11:54:43 -0700108
109 // Store delegate to re-post events emitted from the store.
110 private class InternalStoreDelegate implements ClusterStoreDelegate {
111 @Override
112 public void notify(ClusterEvent event) {
113 checkNotNull(event, "Event cannot be null");
114 eventDispatcher.post(event);
115 }
116 }
tome4729872014-09-23 00:37:37 -0700117}