56167c48d13d43a3783203ea1b61ee0d68a7eb9a
[onosfw.git] /
1 package org.onosproject.incubator.net.resource.label.impl;
2
3 import com.google.common.collect.Multimap;
4 import org.apache.felix.scr.annotations.Activate;
5 import org.apache.felix.scr.annotations.Component;
6 import org.apache.felix.scr.annotations.Deactivate;
7 import org.apache.felix.scr.annotations.Reference;
8 import org.apache.felix.scr.annotations.ReferenceCardinality;
9 import org.apache.felix.scr.annotations.Service;
10 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
11 import org.onosproject.incubator.net.resource.label.LabelResource;
12 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
13 import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
14 import org.onosproject.incubator.net.resource.label.LabelResourceEvent;
15 import org.onosproject.incubator.net.resource.label.LabelResourceId;
16 import org.onosproject.incubator.net.resource.label.LabelResourceListener;
17 import org.onosproject.incubator.net.resource.label.LabelResourcePool;
18 import org.onosproject.incubator.net.resource.label.LabelResourceProvider;
19 import org.onosproject.incubator.net.resource.label.LabelResourceProviderRegistry;
20 import org.onosproject.incubator.net.resource.label.LabelResourceProviderService;
21 import org.onosproject.incubator.net.resource.label.LabelResourceService;
22 import org.onosproject.incubator.net.resource.label.LabelResourceStore;
23 import org.onosproject.net.Device;
24 import org.onosproject.net.DeviceId;
25 import org.onosproject.net.device.DeviceEvent;
26 import org.onosproject.net.device.DeviceEvent.Type;
27 import org.onosproject.net.device.DeviceListener;
28 import org.onosproject.net.device.DeviceService;
29 import org.onosproject.net.provider.AbstractProviderService;
30 import org.slf4j.Logger;
31
32 import java.util.Collection;
33 import java.util.Set;
34
35 import static com.google.common.base.Preconditions.checkArgument;
36 import static com.google.common.base.Preconditions.checkNotNull;
37 import static org.slf4j.LoggerFactory.getLogger;
38
39 /**
40  * provides implementation of the label resource NB & SB APIs.
41  *
42  */
43 @Component(immediate = true)
44 @Service
45 public class LabelResourceManager
46         extends AbstractListenerProviderRegistry<LabelResourceEvent, LabelResourceListener,
47                                                  LabelResourceProvider, LabelResourceProviderService>
48         implements LabelResourceService, LabelResourceAdminService, LabelResourceProviderRegistry {
49     private final Logger log = getLogger(getClass());
50     private final LabelResourceDelegate delegate = new InternalLabelResourceDelegate();
51
52     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
53     protected LabelResourceStore store;
54
55     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56     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, "endLabel is not null");
84         checkArgument(beginLabel.labelId() >= 0 || endLabel.labelId() >= 0,
85                       "The value of beginLabel and the value of endLabel must be both positive number.");
86         checkArgument(beginLabel.labelId() < endLabel.labelId(),
87                       "The value of endLabel must be greater than the value of beginLabel.");
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, "endLabel is not null");
96         checkArgument(beginLabel.labelId() >= 0 && endLabel.labelId() >= 0,
97                       "The value of beginLabel and the value of endLabel must be both positive number.");
98         checkArgument(beginLabel.labelId() < endLabel.labelId(),
99                       "The value of endLabel must be greater than the value of beginLabel.");
100         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
173     private class InternalLabelResourceDelegate implements LabelResourceDelegate {
174         @Override
175         public void notify(LabelResourceEvent event) {
176             post(event);
177         }
178
179     }
180
181     private class InternalDeviceListener implements DeviceListener {
182         @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 }