blob: 7038284f5588d14653ecd1c948a9bdada20374a8 [file] [log] [blame]
tomb1260e42014-08-26 18:39:57 -07001package org.onlab.onos.net.trivial.impl;
tomd3097b02014-08-26 10:40:29 -07002
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.Service;
tom32f66842014-08-27 19:27:47 -07007import org.onlab.onos.event.AbstractListenerManager;
8import org.onlab.onos.event.EventDispatchService;
9import org.onlab.onos.net.Device;
tomd3097b02014-08-26 10:40:29 -070010import org.onlab.onos.net.DeviceId;
11import org.onlab.onos.net.MastershipRole;
tom32f66842014-08-27 19:27:47 -070012import org.onlab.onos.net.Port;
13import org.onlab.onos.net.PortNumber;
tomd3097b02014-08-26 10:40:29 -070014import org.onlab.onos.net.device.DeviceDescription;
tom32f66842014-08-27 19:27:47 -070015import org.onlab.onos.net.device.DeviceEvent;
16import org.onlab.onos.net.device.DeviceListener;
tomd3097b02014-08-26 10:40:29 -070017import org.onlab.onos.net.device.DeviceProvider;
18import org.onlab.onos.net.device.DeviceProviderBroker;
19import org.onlab.onos.net.device.DeviceProviderService;
tom32f66842014-08-27 19:27:47 -070020import org.onlab.onos.net.device.DeviceService;
tomd3097b02014-08-26 10:40:29 -070021import org.onlab.onos.net.device.PortDescription;
22import org.onlab.onos.net.provider.AbstractProviderBroker;
23import org.onlab.onos.net.provider.AbstractProviderService;
24import org.slf4j.Logger;
25import org.slf4j.LoggerFactory;
26
27import java.util.List;
28
tom32f66842014-08-27 19:27:47 -070029import static com.google.common.base.Preconditions.checkNotNull;
30
tomd3097b02014-08-26 10:40:29 -070031/**
tomb36046e2014-08-27 00:22:24 -070032 * Provides basic implementation of the device SB & NB APIs.
tomd3097b02014-08-26 10:40:29 -070033 */
34@Component(immediate = true)
35@Service
tom32f66842014-08-27 19:27:47 -070036public class SimpleDeviceManager
37 extends AbstractProviderBroker<DeviceProvider, DeviceProviderService>
38 implements DeviceService, DeviceProviderBroker {
39
40 public static final String DEVICE_ID_NULL = "Device ID cannot be null";
41 public static final String PORT_NUMBER_NULL = "Port number cannot be null";
42 public static final String DEVICE_DESCRIPTION_NULL = "Device description cannot be null";
43 public static final String PORT_DESCRIPTION_NULL = "Port description cannot be null";
tomd3097b02014-08-26 10:40:29 -070044
45 private Logger log = LoggerFactory.getLogger(SimpleDeviceManager.class);
46
tom32f66842014-08-27 19:27:47 -070047 private final AbstractListenerManager<DeviceEvent, DeviceListener>
48 listenerManager = new AbstractListenerManager<>();
49
50 private EventDispatchService eventDispatcher;
51
52 private final DeviceStore store = new DeviceStore();
tomd3097b02014-08-26 10:40:29 -070053
54 @Activate
55 public void activate() {
tom32f66842014-08-27 19:27:47 -070056// eventDispatcher.addSink(DeviceEvent.class, listenerManager);
tomd3097b02014-08-26 10:40:29 -070057 log.info("Started");
58 }
59
60 @Deactivate
61 public void deactivate() {
tom32f66842014-08-27 19:27:47 -070062// eventDispatcher.removeSink(DeviceEvent.class);
tomd3097b02014-08-26 10:40:29 -070063 log.info("Stopped");
64 }
65
66 @Override
tom32f66842014-08-27 19:27:47 -070067 public MastershipRole getRole(DeviceId deviceId) {
68 checkNotNull(deviceId, DEVICE_ID_NULL);
69 return null;
tomd3097b02014-08-26 10:40:29 -070070 }
71
72 @Override
tom32f66842014-08-27 19:27:47 -070073 public Iterable<Device> getDevices() {
74 return null;
tomd3097b02014-08-26 10:40:29 -070075 }
76
tom32f66842014-08-27 19:27:47 -070077 @Override
78 public Device getDevice(DeviceId deviceId) {
79 checkNotNull(deviceId, DEVICE_ID_NULL);
80 return null;
81 }
82
83 @Override
84 public List<Port> getPorts(DeviceId deviceId) {
85 checkNotNull(deviceId, DEVICE_ID_NULL);
86 return null;
87 }
88
89 @Override
90 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
91 checkNotNull(deviceId, DEVICE_ID_NULL);
92 checkNotNull(portNumber, PORT_NUMBER_NULL);
93 return null;
94 }
95
96 @Override
97 public void addListener(DeviceListener listener) {
98 listenerManager.addListener(listener);
99 }
100
101 @Override
102 public void removeListener(DeviceListener listener) {
103 listenerManager.removeListener(listener);
104 }
105
106 @Override
107 protected DeviceProviderService createProviderService(DeviceProvider provider) {
108 return new InternalDeviceProviderService(provider);
tomd3097b02014-08-26 10:40:29 -0700109 }
110
111 // Personalized device provider service issued to the supplied provider.
112 private class InternalDeviceProviderService extends AbstractProviderService<DeviceProvider>
113 implements DeviceProviderService {
114
115 public InternalDeviceProviderService(DeviceProvider provider) {
116 super(provider);
117 }
118
119 @Override
120 public MastershipRole deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) {
tom32f66842014-08-27 19:27:47 -0700121 checkNotNull(deviceId, DEVICE_ID_NULL);
122 checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL);
tomd3097b02014-08-26 10:40:29 -0700123 log.info("Device {} connected: {}", deviceId, deviceDescription);
tom32f66842014-08-27 19:27:47 -0700124 DeviceEvent event = store.createOrUpdateDevice(deviceId, deviceDescription);
125 post(event);
tomd3097b02014-08-26 10:40:29 -0700126 return MastershipRole.MASTER;
127 }
128
129 @Override
130 public void deviceDisconnected(DeviceId deviceId) {
tom32f66842014-08-27 19:27:47 -0700131 checkNotNull(deviceId, DEVICE_ID_NULL);
tomd3097b02014-08-26 10:40:29 -0700132 log.info("Device {} disconnected", deviceId);
tom32f66842014-08-27 19:27:47 -0700133 DeviceEvent event = store.removeDevice(deviceId);
134 post(event);
tomd3097b02014-08-26 10:40:29 -0700135 }
136
137 @Override
tom32f66842014-08-27 19:27:47 -0700138 public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) {
139 checkNotNull(deviceId, DEVICE_ID_NULL);
140 checkNotNull(portDescriptions, "Port descriptions list cannot be null");
tomd3097b02014-08-26 10:40:29 -0700141 // FIXME: fix the interface to accept DeviceId separately
tom32f66842014-08-27 19:27:47 -0700142 log.info("Device {} ports updated: {}", portDescriptions);
143 List<DeviceEvent> events = store.updatePorts(deviceId, portDescriptions);
144 for (DeviceEvent event : events) {
145 post(event);
146 }
tomd3097b02014-08-26 10:40:29 -0700147 }
148
149 @Override
tom32f66842014-08-27 19:27:47 -0700150 public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) {
151 checkNotNull(deviceId, DEVICE_ID_NULL);
152 checkNotNull(portDescription, PORT_DESCRIPTION_NULL);
153 log.info("Device {} port status changed: {}", deviceId, portDescription);
154 DeviceEvent event = store.updatePortStatus(deviceId, portDescription);
155 post(event);
tomd3097b02014-08-26 10:40:29 -0700156 }
157 }
tom32f66842014-08-27 19:27:47 -0700158
159 // Posts the specified event to a local event dispatcher
160 private void post(DeviceEvent event) {
161 if (event != null && eventDispatcher != null) {
162 eventDispatcher.post(event);
163 }
164 }
165
tomd3097b02014-08-26 10:40:29 -0700166}