blob: b0726d621f1a7bf6e9576b24d6f75c0ee50f5956 [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;
alshabib7bb05012015-08-05 10:15:09 -070024import org.onosproject.incubator.net.meter.DefaultMeter;
alshabib1d2bc402015-07-31 17:04:11 -070025import org.onosproject.incubator.net.meter.Meter;
26import org.onosproject.incubator.net.meter.MeterEvent;
27import org.onosproject.incubator.net.meter.MeterFailReason;
28import org.onosproject.incubator.net.meter.MeterId;
29import org.onosproject.incubator.net.meter.MeterListener;
30import org.onosproject.incubator.net.meter.MeterOperation;
31import org.onosproject.incubator.net.meter.MeterProvider;
32import org.onosproject.incubator.net.meter.MeterProviderRegistry;
33import org.onosproject.incubator.net.meter.MeterProviderService;
34import org.onosproject.incubator.net.meter.MeterService;
alshabib7bb05012015-08-05 10:15:09 -070035import org.onosproject.incubator.net.meter.MeterState;
36import org.onosproject.incubator.net.meter.MeterStore;
alshabib1d2bc402015-07-31 17:04:11 -070037import org.onosproject.incubator.net.meter.MeterStoreDelegate;
38import org.onosproject.net.DeviceId;
39import org.onosproject.net.provider.AbstractListenerProviderRegistry;
40import org.onosproject.net.provider.AbstractProviderService;
41import org.onosproject.store.service.AtomicCounter;
42import org.onosproject.store.service.StorageService;
43import org.slf4j.Logger;
44
45import java.util.Collection;
46
alshabib7bb05012015-08-05 10:15:09 -070047import static com.google.common.base.Preconditions.checkNotNull;
alshabib1d2bc402015-07-31 17:04:11 -070048import static org.slf4j.LoggerFactory.getLogger;
49
50
51/**
52 * Provides implementation of the meter service APIs.
53 */
54@Component(immediate = true)
55@Service
56public class MeterManager extends AbstractListenerProviderRegistry<MeterEvent, MeterListener,
57 MeterProvider, MeterProviderService>
58 implements MeterService, MeterProviderRegistry {
59
60 private final String meterIdentifier = "meter-id-counter";
61 private final Logger log = getLogger(getClass());
62 private final MeterStoreDelegate delegate = new InternalMeterStoreDelegate();
63
64 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected StorageService storageService;
66
alshabib7bb05012015-08-05 10:15:09 -070067 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 MeterStore store;
69
alshabib1d2bc402015-07-31 17:04:11 -070070 private AtomicCounter meterIdCounter;
71
72 @Activate
73 public void activate() {
74 meterIdCounter = storageService.atomicCounterBuilder()
75 .withName(meterIdentifier)
76 .build();
77 log.info("Started");
78 }
79
80 @Deactivate
81 public void deactivate() {
82 log.info("Stopped");
83 }
84
85 @Override
86 protected MeterProviderService createProviderService(MeterProvider provider) {
87 return new InternalMeterProviderService(provider);
88 }
89
90 @Override
91 public void addMeter(Meter meter) {
alshabib7bb05012015-08-05 10:15:09 -070092 DefaultMeter m = (DefaultMeter) meter;
93 m.setState(MeterState.PENDING_ADD);
94 store.storeMeter(m);
alshabib1d2bc402015-07-31 17:04:11 -070095 }
96
97 @Override
98 public void updateMeter(Meter meter) {
alshabib7bb05012015-08-05 10:15:09 -070099 DefaultMeter m = (DefaultMeter) meter;
100 m.setState(MeterState.PENDING_ADD);
101 store.updateMeter(m);
alshabib1d2bc402015-07-31 17:04:11 -0700102 }
103
104 @Override
105 public void removeMeter(Meter meter) {
alshabib7bb05012015-08-05 10:15:09 -0700106 DefaultMeter m = (DefaultMeter) meter;
107 m.setState(MeterState.PENDING_REMOVE);
108 store.deleteMeter(m);
alshabib1d2bc402015-07-31 17:04:11 -0700109 }
110
111 @Override
112 public void removeMeter(MeterId id) {
alshabib7bb05012015-08-05 10:15:09 -0700113 DefaultMeter meter = (DefaultMeter) store.getMeter(id);
114 checkNotNull(meter, "No such meter {}", id);
115 removeMeter(meter);
alshabib1d2bc402015-07-31 17:04:11 -0700116 }
117
118 @Override
119 public Meter getMeter(MeterId id) {
alshabib7bb05012015-08-05 10:15:09 -0700120 return store.getMeter(id);
alshabib1d2bc402015-07-31 17:04:11 -0700121 }
122
123 @Override
124 public MeterId allocateMeterId() {
125 // FIXME: This will break one day.
126 return MeterId.meterId((int) meterIdCounter.getAndIncrement());
127 }
128
129 private class InternalMeterProviderService
130 extends AbstractProviderService<MeterProvider>
131 implements MeterProviderService {
132
133 /**
134 * Creates a provider service on behalf of the specified provider.
135 *
136 * @param provider provider to which this service is being issued
137 */
138 protected InternalMeterProviderService(MeterProvider provider) {
139 super(provider);
140 }
141
142 @Override
alshabib7bb05012015-08-05 10:15:09 -0700143 public void meterOperationFailed(MeterOperation operation,
144 MeterFailReason reason) {
145 store.failedMeter(operation, reason);
alshabib1d2bc402015-07-31 17:04:11 -0700146 }
147
148 @Override
149 public void pushMeterMetrics(DeviceId deviceId, Collection<Meter> meterEntries) {
alshabib7bb05012015-08-05 10:15:09 -0700150 meterEntries.forEach(m -> store.updateMeterState(m));
alshabib1d2bc402015-07-31 17:04:11 -0700151 }
152 }
153
154 private class InternalMeterStoreDelegate implements MeterStoreDelegate {
155
156 @Override
157 public void notify(MeterEvent event) {
alshabib7bb05012015-08-05 10:15:09 -0700158 DeviceId deviceId = event.subject().meter().deviceId();
159 MeterProvider p = getProvider(event.subject().meter().deviceId());
160 switch (event.type()) {
161 case METER_UPDATED:
162 break;
163 case METER_OP_FAILED:
164 event.subject().meter().context().ifPresent(c ->
165 c.onError(event.subject(), event.reason()));
166 break;
167 case METER_OP_REQ:
168 p.performMeterOperation(deviceId, event.subject());
169 break;
170 default:
171 log.warn("Unknown meter event {}", event.type());
172 }
alshabib1d2bc402015-07-31 17:04:11 -0700173
174 }
175 }
176
177}