blob: a29318399e367cbcfc8045583f90121859412ef6 [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;
tom5f38b3a2014-08-27 23:50:54 -07006import org.apache.felix.scr.annotations.Reference;
7import org.apache.felix.scr.annotations.ReferenceCardinality;
tomd3097b02014-08-26 10:40:29 -07008import org.apache.felix.scr.annotations.Service;
tom32f66842014-08-27 19:27:47 -07009import org.onlab.onos.event.AbstractListenerManager;
10import org.onlab.onos.event.EventDispatchService;
11import org.onlab.onos.net.Device;
tomd3097b02014-08-26 10:40:29 -070012import org.onlab.onos.net.DeviceId;
13import org.onlab.onos.net.MastershipRole;
tom32f66842014-08-27 19:27:47 -070014import org.onlab.onos.net.Port;
15import org.onlab.onos.net.PortNumber;
tomd3097b02014-08-26 10:40:29 -070016import org.onlab.onos.net.device.DeviceDescription;
tom32f66842014-08-27 19:27:47 -070017import org.onlab.onos.net.device.DeviceEvent;
18import org.onlab.onos.net.device.DeviceListener;
tomd3097b02014-08-26 10:40:29 -070019import org.onlab.onos.net.device.DeviceProvider;
20import org.onlab.onos.net.device.DeviceProviderBroker;
21import org.onlab.onos.net.device.DeviceProviderService;
tom32f66842014-08-27 19:27:47 -070022import org.onlab.onos.net.device.DeviceService;
tomd3097b02014-08-26 10:40:29 -070023import org.onlab.onos.net.device.PortDescription;
24import org.onlab.onos.net.provider.AbstractProviderBroker;
25import org.onlab.onos.net.provider.AbstractProviderService;
26import org.slf4j.Logger;
tomd3097b02014-08-26 10:40:29 -070027
28import java.util.List;
29
tom32f66842014-08-27 19:27:47 -070030import static com.google.common.base.Preconditions.checkNotNull;
tom5f38b3a2014-08-27 23:50:54 -070031import static org.slf4j.LoggerFactory.getLogger;
tom32f66842014-08-27 19:27:47 -070032
tomd3097b02014-08-26 10:40:29 -070033/**
tomb36046e2014-08-27 00:22:24 -070034 * Provides basic implementation of the device SB & NB APIs.
tomd3097b02014-08-26 10:40:29 -070035 */
36@Component(immediate = true)
37@Service
tom32f66842014-08-27 19:27:47 -070038public class SimpleDeviceManager
39 extends AbstractProviderBroker<DeviceProvider, DeviceProviderService>
40 implements DeviceService, DeviceProviderBroker {
41
42 public static final String DEVICE_ID_NULL = "Device ID cannot be null";
43 public static final String PORT_NUMBER_NULL = "Port number cannot be null";
44 public static final String DEVICE_DESCRIPTION_NULL = "Device description cannot be null";
45 public static final String PORT_DESCRIPTION_NULL = "Port description cannot be null";
tomd3097b02014-08-26 10:40:29 -070046
tom5f38b3a2014-08-27 23:50:54 -070047 private final Logger log = getLogger(getClass());
tomd3097b02014-08-26 10:40:29 -070048
tom32f66842014-08-27 19:27:47 -070049 private final AbstractListenerManager<DeviceEvent, DeviceListener>
50 listenerManager = new AbstractListenerManager<>();
51
tom32f66842014-08-27 19:27:47 -070052 private final DeviceStore store = new DeviceStore();
tomd3097b02014-08-26 10:40:29 -070053
tom5f38b3a2014-08-27 23:50:54 -070054 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
55 private EventDispatchService eventDispatcher;
56
tomd3097b02014-08-26 10:40:29 -070057 @Activate
58 public void activate() {
tom5f38b3a2014-08-27 23:50:54 -070059 eventDispatcher.addSink(DeviceEvent.class, listenerManager);
tomd3097b02014-08-26 10:40:29 -070060 log.info("Started");
61 }
62
63 @Deactivate
64 public void deactivate() {
tom5f38b3a2014-08-27 23:50:54 -070065 eventDispatcher.removeSink(DeviceEvent.class);
tomd3097b02014-08-26 10:40:29 -070066 log.info("Stopped");
67 }
68
69 @Override
tom32f66842014-08-27 19:27:47 -070070 public MastershipRole getRole(DeviceId deviceId) {
71 checkNotNull(deviceId, DEVICE_ID_NULL);
72 return null;
tomd3097b02014-08-26 10:40:29 -070073 }
74
75 @Override
tom32f66842014-08-27 19:27:47 -070076 public Iterable<Device> getDevices() {
77 return null;
tomd3097b02014-08-26 10:40:29 -070078 }
79
tom32f66842014-08-27 19:27:47 -070080 @Override
81 public Device getDevice(DeviceId deviceId) {
82 checkNotNull(deviceId, DEVICE_ID_NULL);
83 return null;
84 }
85
86 @Override
87 public List<Port> getPorts(DeviceId deviceId) {
88 checkNotNull(deviceId, DEVICE_ID_NULL);
89 return null;
90 }
91
92 @Override
93 public Port getPort(DeviceId deviceId, PortNumber portNumber) {
94 checkNotNull(deviceId, DEVICE_ID_NULL);
95 checkNotNull(portNumber, PORT_NUMBER_NULL);
96 return null;
97 }
98
99 @Override
100 public void addListener(DeviceListener listener) {
101 listenerManager.addListener(listener);
102 }
103
104 @Override
105 public void removeListener(DeviceListener listener) {
106 listenerManager.removeListener(listener);
107 }
108
109 @Override
110 protected DeviceProviderService createProviderService(DeviceProvider provider) {
111 return new InternalDeviceProviderService(provider);
tomd3097b02014-08-26 10:40:29 -0700112 }
113
114 // Personalized device provider service issued to the supplied provider.
115 private class InternalDeviceProviderService extends AbstractProviderService<DeviceProvider>
116 implements DeviceProviderService {
117
118 public InternalDeviceProviderService(DeviceProvider provider) {
119 super(provider);
120 }
121
122 @Override
123 public MastershipRole deviceConnected(DeviceId deviceId, DeviceDescription deviceDescription) {
tom32f66842014-08-27 19:27:47 -0700124 checkNotNull(deviceId, DEVICE_ID_NULL);
125 checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL);
tomd3097b02014-08-26 10:40:29 -0700126 log.info("Device {} connected: {}", deviceId, deviceDescription);
tom32f66842014-08-27 19:27:47 -0700127 DeviceEvent event = store.createOrUpdateDevice(deviceId, deviceDescription);
128 post(event);
tomd3097b02014-08-26 10:40:29 -0700129 return MastershipRole.MASTER;
130 }
131
132 @Override
133 public void deviceDisconnected(DeviceId deviceId) {
tom32f66842014-08-27 19:27:47 -0700134 checkNotNull(deviceId, DEVICE_ID_NULL);
tomd3097b02014-08-26 10:40:29 -0700135 log.info("Device {} disconnected", deviceId);
tom32f66842014-08-27 19:27:47 -0700136 DeviceEvent event = store.removeDevice(deviceId);
137 post(event);
tomd3097b02014-08-26 10:40:29 -0700138 }
139
140 @Override
tom32f66842014-08-27 19:27:47 -0700141 public void updatePorts(DeviceId deviceId, List<PortDescription> portDescriptions) {
142 checkNotNull(deviceId, DEVICE_ID_NULL);
143 checkNotNull(portDescriptions, "Port descriptions list cannot be null");
tomd3097b02014-08-26 10:40:29 -0700144 // FIXME: fix the interface to accept DeviceId separately
tom32f66842014-08-27 19:27:47 -0700145 log.info("Device {} ports updated: {}", portDescriptions);
146 List<DeviceEvent> events = store.updatePorts(deviceId, portDescriptions);
147 for (DeviceEvent event : events) {
148 post(event);
149 }
tomd3097b02014-08-26 10:40:29 -0700150 }
151
152 @Override
tom32f66842014-08-27 19:27:47 -0700153 public void portStatusChanged(DeviceId deviceId, PortDescription portDescription) {
154 checkNotNull(deviceId, DEVICE_ID_NULL);
155 checkNotNull(portDescription, PORT_DESCRIPTION_NULL);
156 log.info("Device {} port status changed: {}", deviceId, portDescription);
157 DeviceEvent event = store.updatePortStatus(deviceId, portDescription);
158 post(event);
tomd3097b02014-08-26 10:40:29 -0700159 }
160 }
tom32f66842014-08-27 19:27:47 -0700161
162 // Posts the specified event to a local event dispatcher
163 private void post(DeviceEvent event) {
164 if (event != null && eventDispatcher != null) {
165 eventDispatcher.post(event);
166 }
167 }
168
tomd3097b02014-08-26 10:40:29 -0700169}