blob: fecba1128d22f5d1d0f58f10d203606454cdddc7 [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
Thomas Vachuska42e8cce2015-07-29 19:25:18 -07003import com.google.common.collect.Multimap;
jccde3e92e2015-03-28 01:40:44 -07004import org.apache.felix.scr.annotations.Activate;
5import org.apache.felix.scr.annotations.Component;
6import org.apache.felix.scr.annotations.Deactivate;
7import org.apache.felix.scr.annotations.Reference;
8import org.apache.felix.scr.annotations.ReferenceCardinality;
9import org.apache.felix.scr.annotations.Service;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070010import org.onosproject.net.provider.AbstractListenerProviderRegistry;
Brian O'Connor6de2e202015-05-21 14:30:41 -070011import org.onosproject.incubator.net.resource.label.LabelResource;
12import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
13import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
14import org.onosproject.incubator.net.resource.label.LabelResourceEvent;
15import org.onosproject.incubator.net.resource.label.LabelResourceId;
16import org.onosproject.incubator.net.resource.label.LabelResourceListener;
17import org.onosproject.incubator.net.resource.label.LabelResourcePool;
18import org.onosproject.incubator.net.resource.label.LabelResourceProvider;
19import org.onosproject.incubator.net.resource.label.LabelResourceProviderRegistry;
20import org.onosproject.incubator.net.resource.label.LabelResourceProviderService;
21import org.onosproject.incubator.net.resource.label.LabelResourceService;
22import org.onosproject.incubator.net.resource.label.LabelResourceStore;
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070023import org.onosproject.net.Device;
24import org.onosproject.net.DeviceId;
25import org.onosproject.net.device.DeviceEvent;
26import org.onosproject.net.device.DeviceEvent.Type;
27import org.onosproject.net.device.DeviceListener;
28import org.onosproject.net.device.DeviceService;
29import org.onosproject.net.provider.AbstractProviderService;
jccde3e92e2015-03-28 01:40:44 -070030import org.slf4j.Logger;
jccde3e92e2015-03-28 01:40:44 -070031
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070032import java.util.Collection;
33import java.util.Set;
34
35import static com.google.common.base.Preconditions.checkArgument;
36import static com.google.common.base.Preconditions.checkNotNull;
37import static org.slf4j.LoggerFactory.getLogger;
jccde3e92e2015-03-28 01:40:44 -070038
39/**
40 * provides implementation of the label resource NB & SB APIs.
41 *
42 */
43@Component(immediate = true)
44@Service
45public class LabelResourceManager
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070046 extends AbstractListenerProviderRegistry<LabelResourceEvent, LabelResourceListener,
47 LabelResourceProvider, LabelResourceProviderService>
48 implements LabelResourceService, LabelResourceAdminService, LabelResourceProviderRegistry {
jccde3e92e2015-03-28 01:40:44 -070049 private final Logger log = getLogger(getClass());
50 private final LabelResourceDelegate delegate = new InternalLabelResourceDelegate();
51
jccde3e92e2015-03-28 01:40:44 -070052 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
53 protected LabelResourceStore store;
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
jccde3e92e2015-03-28 01:40:44 -070056 protected DeviceService deviceService;
57
58 private DeviceListener deviceListener = new InternalDeviceListener();
59
60 @Activate
61 public void activate() {
62 store.setDelegate(delegate);
63 eventDispatcher.addSink(LabelResourceEvent.class, listenerRegistry);
64 deviceService.addListener(deviceListener);
65 log.info("Started");
66
67 }
68
69 @Deactivate
70 public void deactivate() {
71 deviceService.removeListener(deviceListener);
72 store.unsetDelegate(delegate);
73 eventDispatcher.removeSink(LabelResourceEvent.class);
74 log.info("Stopped");
75 }
76
77 @Override
78 public boolean createDevicePool(DeviceId deviceId,
79 LabelResourceId beginLabel,
80 LabelResourceId endLabel) {
81 checkNotNull(deviceId, "deviceId is not null");
82 checkNotNull(beginLabel, "beginLabel is not null");
83 checkNotNull(endLabel, "beginLabel is not null");
samuel7a5691a2015-05-23 00:36:32 +080084 checkArgument(beginLabel.labelId() >= 0 || endLabel.labelId() >= 0,
jccde3e92e2015-03-28 01:40:44 -070085 "The value of beginLabel and the value of endLabel must be both positive number.");
samuel7a5691a2015-05-23 00:36:32 +080086 checkArgument(beginLabel.labelId() <= endLabel.labelId(),
jccde3e92e2015-03-28 01:40:44 -070087 "The value of endLabel must be greater than the value of endLabel.");
88 return store.createDevicePool(deviceId, beginLabel, endLabel);
89 }
90
91 @Override
92 public boolean createGlobalPool(LabelResourceId beginLabel,
93 LabelResourceId endLabel) {
94 checkNotNull(beginLabel, "beginLabel is not null");
95 checkNotNull(endLabel, "beginLabel is not null");
samuel7a5691a2015-05-23 00:36:32 +080096 checkArgument(beginLabel.labelId() >= 0 && endLabel.labelId() >= 0,
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070097 "The value of beginLabel and the value of endLabel must be both positive number.");
samuel7a5691a2015-05-23 00:36:32 +080098 checkArgument(beginLabel.labelId() <= endLabel.labelId(),
Thomas Vachuska42e8cce2015-07-29 19:25:18 -070099 "The value of endLabel must be greater than the value of endLabel.");
jccde3e92e2015-03-28 01:40:44 -0700100 return store.createGlobalPool(beginLabel, endLabel);
101 }
102
103 @Override
104 public boolean destroyDevicePool(DeviceId deviceId) {
105 checkNotNull(deviceId, "deviceId is not null");
106 return store.destroyDevicePool(deviceId);
107 }
108
109 @Override
110 public boolean destroyGlobalPool() {
111 return store.destroyGlobalPool();
112 }
113
114 @Override
115 public Collection<LabelResource> applyFromDevicePool(DeviceId deviceId,
116 long applyNum) {
117 checkNotNull(deviceId, "deviceId is not null");
118 checkNotNull(applyNum, "applyNum is not null");
119 return store.applyFromDevicePool(deviceId, applyNum);
120 }
121
122 @Override
123 public Collection<LabelResource> applyFromGlobalPool(long applyNum) {
124 checkNotNull(applyNum, "applyNum is not null");
125 return store.applyFromGlobalPool(applyNum);
126 }
127
128 @Override
129 public boolean releaseToDevicePool(Multimap<DeviceId, LabelResource> release) {
130 checkNotNull(release, "release is not null");
131 return store.releaseToDevicePool(release);
132 }
133
134 @Override
135 public boolean releaseToGlobalPool(Set<LabelResourceId> release) {
136 checkNotNull(release, "release is not null");
137 return store.releaseToGlobalPool(release);
138 }
139
140 @Override
141 public boolean isDevicePoolFull(DeviceId deviceId) {
142 checkNotNull(deviceId, "deviceId is not null");
143 return store.isDevicePoolFull(deviceId);
144 }
145
146 @Override
147 public boolean isGlobalPoolFull() {
148 return store.isGlobalPoolFull();
149 }
150
151 @Override
152 public long getFreeNumOfDevicePool(DeviceId deviceId) {
153 checkNotNull(deviceId, "deviceId is not null");
154 return store.getFreeNumOfDevicePool(deviceId);
155 }
156
157 @Override
158 public long getFreeNumOfGlobalPool() {
159 return store.getFreeNumOfGlobalPool();
160 }
161
162 @Override
163 public LabelResourcePool getDeviceLabelResourcePool(DeviceId deviceId) {
164 checkNotNull(deviceId, "deviceId is not null");
165 return store.getDeviceLabelResourcePool(deviceId);
166 }
167
168 @Override
169 public LabelResourcePool getGlobalLabelResourcePool() {
170 return store.getGlobalLabelResourcePool();
171 }
172
Thomas Vachuska42e8cce2015-07-29 19:25:18 -0700173 private class InternalLabelResourceDelegate implements LabelResourceDelegate {
jccde3e92e2015-03-28 01:40:44 -0700174 @Override
175 public void notify(LabelResourceEvent event) {
176 post(event);
177 }
178
179 }
180
181 private class InternalDeviceListener implements DeviceListener {
jccde3e92e2015-03-28 01:40:44 -0700182 @Override
183 public void event(DeviceEvent event) {
184 Device device = event.subject();
185 if (Type.DEVICE_REMOVED.equals(event.type())) {
186 destroyDevicePool(device.id());
187 }
188 }
189 }
190
191 private class InternalLabelResourceProviderService
192 extends AbstractProviderService<LabelResourceProvider>
193 implements LabelResourceProviderService {
194
195 protected InternalLabelResourceProviderService(LabelResourceProvider provider) {
196 super(provider);
197 }
198
199 @Override
200 public void deviceLabelResourcePoolDetected(DeviceId deviceId,
201 LabelResourceId beginLabel,
202 LabelResourceId endLabel) {
203 checkNotNull(deviceId, "deviceId is not null");
204 checkNotNull(beginLabel, "beginLabel is not null");
205 checkNotNull(endLabel, "endLabel is not null");
206 createDevicePool(deviceId, beginLabel, endLabel);
207 }
208
209 @Override
210 public void deviceLabelResourcePoolDestroyed(DeviceId deviceId) {
211 checkNotNull(deviceId, "deviceId is not null");
212 destroyDevicePool(deviceId);
213 }
214
215 }
216
217 @Override
218 protected LabelResourceProviderService createProviderService(LabelResourceProvider provider) {
219 return new InternalLabelResourceProviderService(provider);
220 }
221}