blob: 94daed0acefaac43166e242a75ceecc8c7a0d269 [file] [log] [blame]
Brian O'Connor6de2e202015-05-21 14:30:41 -07001package org.onosproject.incubator.net.resource.label.impl;
jccde3e92e2015-03-28 01:40:44 -07002
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.Collection;
6import java.util.Set;
7
8import org.apache.felix.scr.annotations.Activate;
9import org.apache.felix.scr.annotations.Component;
10import org.apache.felix.scr.annotations.Deactivate;
11import org.apache.felix.scr.annotations.Reference;
12import org.apache.felix.scr.annotations.ReferenceCardinality;
13import org.apache.felix.scr.annotations.Service;
jccde3e92e2015-03-28 01:40:44 -070014import org.onosproject.event.EventDeliveryService;
Brian O'Connorba1c7fb2015-05-14 15:47:59 -070015import org.onosproject.event.ListenerRegistry;
jccde3e92e2015-03-28 01:40:44 -070016import org.onosproject.net.Device;
17import org.onosproject.net.DeviceId;
18import org.onosproject.net.device.DeviceEvent;
19import org.onosproject.net.device.DeviceEvent.Type;
20import org.onosproject.net.device.DeviceListener;
21import org.onosproject.net.device.DeviceService;
22import org.onosproject.net.provider.AbstractProviderRegistry;
23import org.onosproject.net.provider.AbstractProviderService;
Brian O'Connor6de2e202015-05-21 14:30:41 -070024import org.onosproject.incubator.net.resource.label.LabelResource;
25import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
26import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
27import org.onosproject.incubator.net.resource.label.LabelResourceEvent;
28import org.onosproject.incubator.net.resource.label.LabelResourceId;
29import org.onosproject.incubator.net.resource.label.LabelResourceListener;
30import org.onosproject.incubator.net.resource.label.LabelResourcePool;
31import org.onosproject.incubator.net.resource.label.LabelResourceProvider;
32import org.onosproject.incubator.net.resource.label.LabelResourceProviderRegistry;
33import org.onosproject.incubator.net.resource.label.LabelResourceProviderService;
34import org.onosproject.incubator.net.resource.label.LabelResourceService;
35import org.onosproject.incubator.net.resource.label.LabelResourceStore;
jccde3e92e2015-03-28 01:40:44 -070036import org.slf4j.Logger;
37import static com.google.common.base.Preconditions.checkNotNull;
38import static com.google.common.base.Preconditions.checkArgument;
39
40import com.google.common.collect.Multimap;
41
42/**
43 * provides implementation of the label resource NB & SB APIs.
44 *
45 */
46@Component(immediate = true)
47@Service
48public class LabelResourceManager
49 extends
50 AbstractProviderRegistry<LabelResourceProvider, LabelResourceProviderService>
51 implements LabelResourceService, LabelResourceAdminService,
52 LabelResourceProviderRegistry {
53 private final Logger log = getLogger(getClass());
54 private final LabelResourceDelegate delegate = new InternalLabelResourceDelegate();
55
Brian O'Connorba1c7fb2015-05-14 15:47:59 -070056 private final ListenerRegistry<LabelResourceEvent, LabelResourceListener> listenerRegistry
57 = new ListenerRegistry<>();
jccde3e92e2015-03-28 01:40:44 -070058
59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
60 protected LabelResourceStore store;
61
62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
63 protected EventDeliveryService eventDispatcher;
64
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 protected DeviceService deviceService;
67
68 private DeviceListener deviceListener = new InternalDeviceListener();
69
70 @Activate
71 public void activate() {
72 store.setDelegate(delegate);
73 eventDispatcher.addSink(LabelResourceEvent.class, listenerRegistry);
74 deviceService.addListener(deviceListener);
75 log.info("Started");
76
77 }
78
79 @Deactivate
80 public void deactivate() {
81 deviceService.removeListener(deviceListener);
82 store.unsetDelegate(delegate);
83 eventDispatcher.removeSink(LabelResourceEvent.class);
84 log.info("Stopped");
85 }
86
87 @Override
88 public boolean createDevicePool(DeviceId deviceId,
89 LabelResourceId beginLabel,
90 LabelResourceId endLabel) {
91 checkNotNull(deviceId, "deviceId is not null");
92 checkNotNull(beginLabel, "beginLabel is not null");
93 checkNotNull(endLabel, "beginLabel is not null");
94 checkArgument(beginLabel.labelId() < 0 || endLabel.labelId() < 0,
95 "The value of beginLabel and the value of endLabel must be both positive number.");
96 checkArgument(beginLabel.labelId() > endLabel.labelId(),
97 "The value of endLabel must be greater than the value of endLabel.");
98 return store.createDevicePool(deviceId, beginLabel, endLabel);
99 }
100
101 @Override
102 public boolean createGlobalPool(LabelResourceId beginLabel,
103 LabelResourceId endLabel) {
104 checkNotNull(beginLabel, "beginLabel is not null");
105 checkNotNull(endLabel, "beginLabel is not null");
106 checkArgument(beginLabel.labelId() < 0 || endLabel.labelId() < 0,
107 "The value of beginLabel and the value of endLabel must be both positive number.");
108 checkArgument(beginLabel.labelId() > endLabel.labelId(),
109 "The value of endLabel must be greater than the value of endLabel.");
110 return store.createGlobalPool(beginLabel, endLabel);
111 }
112
113 @Override
114 public boolean destroyDevicePool(DeviceId deviceId) {
115 checkNotNull(deviceId, "deviceId is not null");
116 return store.destroyDevicePool(deviceId);
117 }
118
119 @Override
120 public boolean destroyGlobalPool() {
121 return store.destroyGlobalPool();
122 }
123
124 @Override
125 public Collection<LabelResource> applyFromDevicePool(DeviceId deviceId,
126 long applyNum) {
127 checkNotNull(deviceId, "deviceId is not null");
128 checkNotNull(applyNum, "applyNum is not null");
129 return store.applyFromDevicePool(deviceId, applyNum);
130 }
131
132 @Override
133 public Collection<LabelResource> applyFromGlobalPool(long applyNum) {
134 checkNotNull(applyNum, "applyNum is not null");
135 return store.applyFromGlobalPool(applyNum);
136 }
137
138 @Override
139 public boolean releaseToDevicePool(Multimap<DeviceId, LabelResource> release) {
140 checkNotNull(release, "release is not null");
141 return store.releaseToDevicePool(release);
142 }
143
144 @Override
145 public boolean releaseToGlobalPool(Set<LabelResourceId> release) {
146 checkNotNull(release, "release is not null");
147 return store.releaseToGlobalPool(release);
148 }
149
150 @Override
151 public boolean isDevicePoolFull(DeviceId deviceId) {
152 checkNotNull(deviceId, "deviceId is not null");
153 return store.isDevicePoolFull(deviceId);
154 }
155
156 @Override
157 public boolean isGlobalPoolFull() {
158 return store.isGlobalPoolFull();
159 }
160
161 @Override
162 public long getFreeNumOfDevicePool(DeviceId deviceId) {
163 checkNotNull(deviceId, "deviceId is not null");
164 return store.getFreeNumOfDevicePool(deviceId);
165 }
166
167 @Override
168 public long getFreeNumOfGlobalPool() {
169 return store.getFreeNumOfGlobalPool();
170 }
171
172 @Override
173 public LabelResourcePool getDeviceLabelResourcePool(DeviceId deviceId) {
174 checkNotNull(deviceId, "deviceId is not null");
175 return store.getDeviceLabelResourcePool(deviceId);
176 }
177
178 @Override
179 public LabelResourcePool getGlobalLabelResourcePool() {
180 return store.getGlobalLabelResourcePool();
181 }
182
183 @Override
184 public void addListener(LabelResourceListener listener) {
185 listenerRegistry.addListener(listener);
186 }
187
188 @Override
189 public void removeListener(LabelResourceListener listener) {
190 listenerRegistry.removeListener(listener);
191
192 }
193
194 private void post(LabelResourceEvent event) {
195 if (event != null) {
196 eventDispatcher.post(event);
197 }
198 }
199
200 private class InternalLabelResourceDelegate
201 implements LabelResourceDelegate {
202
203 @Override
204 public void notify(LabelResourceEvent event) {
205 post(event);
206 }
207
208 }
209
210 private class InternalDeviceListener implements DeviceListener {
211
212 @Override
213 public void event(DeviceEvent event) {
214 Device device = event.subject();
215 if (Type.DEVICE_REMOVED.equals(event.type())) {
216 destroyDevicePool(device.id());
217 }
218 }
219 }
220
221 private class InternalLabelResourceProviderService
222 extends AbstractProviderService<LabelResourceProvider>
223 implements LabelResourceProviderService {
224
225 protected InternalLabelResourceProviderService(LabelResourceProvider provider) {
226 super(provider);
227 }
228
229 @Override
230 public void deviceLabelResourcePoolDetected(DeviceId deviceId,
231 LabelResourceId beginLabel,
232 LabelResourceId endLabel) {
233 checkNotNull(deviceId, "deviceId is not null");
234 checkNotNull(beginLabel, "beginLabel is not null");
235 checkNotNull(endLabel, "endLabel is not null");
236 createDevicePool(deviceId, beginLabel, endLabel);
237 }
238
239 @Override
240 public void deviceLabelResourcePoolDestroyed(DeviceId deviceId) {
241 checkNotNull(deviceId, "deviceId is not null");
242 destroyDevicePool(deviceId);
243 }
244
245 }
246
247 @Override
248 protected LabelResourceProviderService createProviderService(LabelResourceProvider provider) {
249 return new InternalLabelResourceProviderService(provider);
250 }
251}