blob: 4e7530163789004024415ab9eeab73c658402e58 [file] [log] [blame]
alshabib1d2bc402015-07-31 17:04:11 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.incubator.net.meter.impl;
17
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.apache.felix.scr.annotations.Service;
alshabibeadfc8e2015-08-18 15:40:46 -070024import org.onlab.util.TriConsumer;
alshabib10c810b2015-08-18 16:59:04 -070025import org.onosproject.net.meter.DefaultMeter;
26import org.onosproject.net.meter.Meter;
27import org.onosproject.net.meter.MeterEvent;
28import org.onosproject.net.meter.MeterFailReason;
29import org.onosproject.net.meter.MeterId;
30import org.onosproject.net.meter.MeterListener;
31import org.onosproject.net.meter.MeterOperation;
32import org.onosproject.net.meter.MeterProvider;
33import org.onosproject.net.meter.MeterProviderRegistry;
34import org.onosproject.net.meter.MeterProviderService;
35import org.onosproject.net.meter.MeterService;
36import org.onosproject.net.meter.MeterState;
37import org.onosproject.net.meter.MeterStore;
38import org.onosproject.net.meter.MeterStoreDelegate;
39import org.onosproject.net.meter.MeterStoreResult;
alshabib1d2bc402015-07-31 17:04:11 -070040import org.onosproject.net.DeviceId;
41import org.onosproject.net.provider.AbstractListenerProviderRegistry;
42import org.onosproject.net.provider.AbstractProviderService;
43import org.onosproject.store.service.AtomicCounter;
44import org.onosproject.store.service.StorageService;
45import org.slf4j.Logger;
46
47import java.util.Collection;
48
49import static org.slf4j.LoggerFactory.getLogger;
50
51
52/**
53 * Provides implementation of the meter service APIs.
54 */
alshabib58fe6dc2015-08-19 17:16:13 -070055@Component(immediate = true, enabled = true)
alshabib1d2bc402015-07-31 17:04:11 -070056@Service
57public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, MeterListener,
58 MeterProvider, MeterProviderService>
59 implements MeterService, MeterProviderRegistry {
60
61 private final String meterIdentifier = "meter-id-counter";
62 private final Logger log = getLogger(getClass());
63 private final MeterStoreDelegate delegate = new InternalMeterStoreDelegate();
64
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
66 protected StorageService storageService;
67
alshabib7bb05012015-08-05 10:15:09 -070068 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
alshabib58fe6dc2015-08-19 17:16:13 -070069 protected MeterStore store;
alshabib7bb05012015-08-05 10:15:09 -070070
alshabib1d2bc402015-07-31 17:04:11 -070071 private AtomicCounter meterIdCounter;
72
alshabibeadfc8e2015-08-18 15:40:46 -070073 private TriConsumer<MeterOperation, MeterStoreResult, Throwable> onComplete;
74
alshabib1d2bc402015-07-31 17:04:11 -070075 @Activate
76 public void activate() {
77 meterIdCounter = storageService.atomicCounterBuilder()
78 .withName(meterIdentifier)
79 .build();
alshabibeadfc8e2015-08-18 15:40:46 -070080
alshabib58fe6dc2015-08-19 17:16:13 -070081 store.setDelegate(delegate);
82
alshabibeadfc8e2015-08-18 15:40:46 -070083 onComplete = (op, result, error) ->
84 {
85 op.context().ifPresent(c -> {
86 if (error != null) {
87 c.onError(op.meter(), MeterFailReason.UNKNOWN);
88 } else {
89 if (result.reason().isPresent()) {
90 c.onError(op.meter(), result.reason().get());
91 } else {
92 c.onSuccess(op.meter());
93 }
94 }
95 });
96
97 };
alshabib1d2bc402015-07-31 17:04:11 -070098 log.info("Started");
99 }
100
101 @Deactivate
102 public void deactivate() {
alshabib58fe6dc2015-08-19 17:16:13 -0700103 store.unsetDelegate(delegate);
alshabib1d2bc402015-07-31 17:04:11 -0700104 log.info("Stopped");
105 }
106
107 @Override
108 protected MeterProviderService createProviderService(MeterProvider provider) {
109 return new InternalMeterProviderService(provider);
110 }
111
112 @Override
alshabibeadfc8e2015-08-18 15:40:46 -0700113 public void addMeter(MeterOperation op) {
114 DefaultMeter m = (DefaultMeter) op.meter();
alshabib7bb05012015-08-05 10:15:09 -0700115 m.setState(MeterState.PENDING_ADD);
alshabibeadfc8e2015-08-18 15:40:46 -0700116 store.storeMeter(m).whenComplete((result, error) ->
117 onComplete.accept(op, result, error));
alshabib1d2bc402015-07-31 17:04:11 -0700118 }
119
120 @Override
alshabibeadfc8e2015-08-18 15:40:46 -0700121 public void updateMeter(MeterOperation op) {
122 DefaultMeter m = (DefaultMeter) op.meter();
alshabib7bb05012015-08-05 10:15:09 -0700123 m.setState(MeterState.PENDING_ADD);
alshabibeadfc8e2015-08-18 15:40:46 -0700124 store.updateMeter(m).whenComplete((result, error) ->
125 onComplete.accept(op, result, error));
alshabib1d2bc402015-07-31 17:04:11 -0700126 }
127
128 @Override
alshabibeadfc8e2015-08-18 15:40:46 -0700129 public void removeMeter(MeterOperation op) {
130 DefaultMeter m = (DefaultMeter) op.meter();
alshabib7bb05012015-08-05 10:15:09 -0700131 m.setState(MeterState.PENDING_REMOVE);
alshabibeadfc8e2015-08-18 15:40:46 -0700132 store.deleteMeter(m).whenComplete((result, error) ->
133 onComplete.accept(op, result, error));
alshabib1d2bc402015-07-31 17:04:11 -0700134 }
135
136 @Override
137 public Meter getMeter(MeterId id) {
alshabib7bb05012015-08-05 10:15:09 -0700138 return store.getMeter(id);
alshabib1d2bc402015-07-31 17:04:11 -0700139 }
140
141 @Override
alshabib58fe6dc2015-08-19 17:16:13 -0700142 public Collection<Meter> getAllMeters() {
143 return store.getAllMeters();
144 }
145
146 @Override
alshabib1d2bc402015-07-31 17:04:11 -0700147 public MeterId allocateMeterId() {
148 // FIXME: This will break one day.
149 return MeterId.meterId((int) meterIdCounter.getAndIncrement());
150 }
151
152 private class InternalMeterProviderService
153 extends AbstractProviderService<MeterProvider>
154 implements MeterProviderService {
155
156 /**
157 * Creates a provider service on behalf of the specified provider.
158 *
159 * @param provider provider to which this service is being issued
160 */
161 protected InternalMeterProviderService(MeterProvider provider) {
162 super(provider);
163 }
164
165 @Override
alshabib7bb05012015-08-05 10:15:09 -0700166 public void meterOperationFailed(MeterOperation operation,
167 MeterFailReason reason) {
168 store.failedMeter(operation, reason);
alshabib1d2bc402015-07-31 17:04:11 -0700169 }
170
171 @Override
172 public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) {
alshabib7bb05012015-08-05 10:15:09 -0700173 meterEntries.forEach(m -> store.updateMeterState(m));
alshabib1d2bc402015-07-31 17:04:11 -0700174 }
175 }
176
177 private class InternalMeterStoreDelegate implements MeterStoreDelegate {
178
179 @Override
180 public void notify(MeterEvent event) {
alshabibeadfc8e2015-08-18 15:40:46 -0700181 DeviceId deviceId = event.subject().deviceId();
182 MeterProvider p = getProvider(event.subject().deviceId());
alshabib7bb05012015-08-05 10:15:09 -0700183 switch (event.type()) {
alshabibeadfc8e2015-08-18 15:40:46 -0700184 case METER_ADD_REQ:
185 p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
186 MeterOperation.Type.ADD,
187 null));
alshabib7bb05012015-08-05 10:15:09 -0700188 break;
alshabibeadfc8e2015-08-18 15:40:46 -0700189 case METER_REM_REQ:
190 p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
191 MeterOperation.Type.REMOVE,
192 null));
alshabib7bb05012015-08-05 10:15:09 -0700193 break;
194 default:
195 log.warn("Unknown meter event {}", event.type());
196 }
alshabib1d2bc402015-07-31 17:04:11 -0700197
198 }
199 }
200
201}