blob: 371a2572bfcde0a84dff08bc051db5a99d94159e [file] [log] [blame]
Ayaka Koshibea7f044e2014-09-23 16:56:20 -07001package org.onlab.onos.net.trivial.impl;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.Collections;
6import java.util.Set;
7import java.util.concurrent.ConcurrentHashMap;
8import java.util.concurrent.ConcurrentMap;
9
10import org.apache.felix.scr.annotations.Activate;
11import org.apache.felix.scr.annotations.Component;
12import org.apache.felix.scr.annotations.Deactivate;
13import org.apache.felix.scr.annotations.Service;
14import org.onlab.onos.cluster.ControllerNode;
15import org.onlab.onos.cluster.DefaultControllerNode;
16import org.onlab.onos.cluster.MastershipEvent;
17import org.onlab.onos.cluster.MastershipStore;
18import org.onlab.onos.cluster.NodeId;
19import org.onlab.onos.net.DeviceId;
20import org.onlab.onos.net.MastershipRole;
21import org.onlab.packet.IpPrefix;
22import org.slf4j.Logger;
23
24import static org.onlab.onos.cluster.MastershipEvent.Type.*;
25
26/**
27 * Manages inventory of controller mastership over devices using
28 * trivial in-memory structures implementation.
29 */
30@Component(immediate = true)
31@Service
32public class SimpleMastershipStore implements MastershipStore {
33
34 public static final IpPrefix LOCALHOST = IpPrefix.valueOf("127.0.0.1");
35
36 private final Logger log = getLogger(getClass());
37
38 private ControllerNode instance;
39
40 protected final ConcurrentMap<DeviceId, MastershipRole> roleMap =
41 new ConcurrentHashMap<DeviceId, MastershipRole>();
42
43 @Activate
44 public void activate() {
45 instance = new DefaultControllerNode(new NodeId("local"), LOCALHOST);
46 log.info("Started");
47 }
48
49 @Deactivate
50 public void deactivate() {
51 log.info("Stopped");
52 }
53
54 @Override
55 public MastershipEvent setRole(NodeId nodeId, DeviceId deviceId,
56 MastershipRole role) {
57 if (roleMap.get(deviceId) == null) {
58 return null;
59 }
60 roleMap.put(deviceId, role);
61 return new MastershipEvent(MASTER_CHANGED, deviceId, nodeId);
62 }
63
64 @Override
65 public MastershipEvent addOrUpdateDevice(NodeId instance,
66 DeviceId deviceId, MastershipRole role) {
67 //TODO refine when we do listeners
68 roleMap.put(deviceId, role);
69 return null;
70 }
71
72 @Override
73 public NodeId getMaster(DeviceId deviceId) {
74 return instance.id();
75 }
76
77 @Override
78 public Set<DeviceId> getDevices(NodeId nodeId) {
79 return Collections.unmodifiableSet(roleMap.keySet());
80 }
81
82 @Override
83 public MastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
84 MastershipRole role = roleMap.get(deviceId);
85 if (role == null) {
86 //say MASTER. If clustered, we'd figure out if anyone's got dibs here.
87 role = MastershipRole.MASTER;
88 roleMap.put(deviceId, role);
89 }
90 return role;
91 }
92
93}