diff options
Diffstat (limited to 'framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl')
3 files changed, 0 insertions, 340 deletions
diff --git a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java deleted file mode 100644 index 62a94675..00000000 --- a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 2015 Open Networking Laboratory - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.onosproject.incubator.store.meter.impl; - -import com.google.common.collect.Collections2; -import com.google.common.collect.Maps; -import org.apache.felix.scr.annotations.Activate; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Deactivate; -import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.ReferenceCardinality; -import org.apache.felix.scr.annotations.Service; -import org.onosproject.cluster.ClusterService; -import org.onosproject.cluster.NodeId; -import org.onosproject.mastership.MastershipService; -import org.onosproject.net.meter.Band; -import org.onosproject.net.meter.DefaultBand; -import org.onosproject.net.meter.DefaultMeter; -import org.onosproject.net.meter.Meter; -import org.onosproject.net.meter.MeterEvent; -import org.onosproject.net.meter.MeterFailReason; -import org.onosproject.net.meter.MeterId; -import org.onosproject.net.meter.MeterKey; -import org.onosproject.net.meter.MeterOperation; -import org.onosproject.net.meter.MeterState; -import org.onosproject.net.meter.MeterStore; -import org.onosproject.net.meter.MeterStoreDelegate; -import org.onosproject.net.meter.MeterStoreResult; -import org.onosproject.store.AbstractStore; -import org.onosproject.store.serializers.KryoNamespaces; -import org.onosproject.store.service.ConsistentMap; -import org.onosproject.store.service.MapEvent; -import org.onosproject.store.service.MapEventListener; -import org.onosproject.store.service.Serializer; -import org.onosproject.store.service.StorageException; -import org.onosproject.store.service.StorageService; -import org.onosproject.store.service.Versioned; -import org.slf4j.Logger; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -import static org.slf4j.LoggerFactory.getLogger; - -/** - * A distributed meter store implementation. Meters are stored consistently - * across the cluster. - */ -@Component(immediate = true) -@Service -public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreDelegate> - implements MeterStore { - - private Logger log = getLogger(getClass()); - - private static final String METERSTORE = "onos-meter-store"; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - private StorageService storageService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - private MastershipService mastershipService; - - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - private ClusterService clusterService; - - private ConsistentMap<MeterKey, MeterData> meters; - private NodeId local; - - private MapEventListener<MeterKey, MeterData> mapListener = new InternalMapEventListener(); - - private Map<MeterKey, CompletableFuture<MeterStoreResult>> futures = - Maps.newConcurrentMap(); - - @Activate - public void activate() { - - local = clusterService.getLocalNode().id(); - - - meters = storageService.<MeterKey, MeterData>consistentMapBuilder() - .withName(METERSTORE) - .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API), - MeterKey.class, - MeterData.class, - DefaultMeter.class, - DefaultBand.class, - Band.Type.class, - MeterState.class, - Meter.Unit.class, - MeterFailReason.class, - MeterId.class)).build(); - - meters.addListener(mapListener); - - log.info("Started"); - } - - @Deactivate - public void deactivate() { - - meters.removeListener(mapListener); - log.info("Stopped"); - } - - - @Override - public CompletableFuture<MeterStoreResult> storeMeter(Meter meter) { - CompletableFuture<MeterStoreResult> future = new CompletableFuture<>(); - MeterKey key = MeterKey.key(meter.deviceId(), meter.id()); - futures.put(key, future); - MeterData data = new MeterData(meter, null, local); - - try { - meters.put(key, data); - } catch (StorageException e) { - future.completeExceptionally(e); - } - - return future; - - } - - @Override - public CompletableFuture<MeterStoreResult> deleteMeter(Meter meter) { - CompletableFuture<MeterStoreResult> future = new CompletableFuture<>(); - MeterKey key = MeterKey.key(meter.deviceId(), meter.id()); - futures.put(key, future); - - MeterData data = new MeterData(meter, null, local); - - // update the state of the meter. It will be pruned by observing - // that it has been removed from the dataplane. - try { - if (meters.computeIfPresent(key, (k, v) -> data) == null) { - future.complete(MeterStoreResult.success()); - } - } catch (StorageException e) { - future.completeExceptionally(e); - } - - - return future; - } - - @Override - public CompletableFuture<MeterStoreResult> updateMeter(Meter meter) { - CompletableFuture<MeterStoreResult> future = new CompletableFuture<>(); - MeterKey key = MeterKey.key(meter.deviceId(), meter.id()); - futures.put(key, future); - - MeterData data = new MeterData(meter, null, local); - try { - if (meters.computeIfPresent(key, (k, v) -> data) == null) { - future.complete(MeterStoreResult.fail(MeterFailReason.INVALID_METER)); - } - } catch (StorageException e) { - future.completeExceptionally(e); - } - return future; - } - - @Override - public void updateMeterState(Meter meter) { - MeterKey key = MeterKey.key(meter.deviceId(), meter.id()); - meters.computeIfPresent(key, (k, v) -> { - DefaultMeter m = (DefaultMeter) v.meter(); - m.setState(meter.state()); - m.setProcessedPackets(meter.packetsSeen()); - m.setProcessedBytes(meter.bytesSeen()); - m.setLife(meter.life()); - // TODO: Prune if drops to zero. - m.setReferenceCount(meter.referenceCount()); - return new MeterData(m, null, v.origin()); - }); - } - - @Override - public Meter getMeter(MeterKey key) { - MeterData data = Versioned.valueOrElse(meters.get(key), null); - return data == null ? null : data.meter(); - } - - @Override - public Collection<Meter> getAllMeters() { - return Collections2.transform(meters.asJavaMap().values(), - MeterData::meter); - } - - @Override - public void failedMeter(MeterOperation op, MeterFailReason reason) { - MeterKey key = MeterKey.key(op.meter().deviceId(), op.meter().id()); - meters.computeIfPresent(key, (k, v) -> - new MeterData(v.meter(), reason, v.origin())); - } - - @Override - public void deleteMeterNow(Meter m) { - MeterKey key = MeterKey.key(m.deviceId(), m.id()); - futures.remove(key); - meters.remove(key); - } - - private class InternalMapEventListener implements MapEventListener<MeterKey, MeterData> { - @Override - public void event(MapEvent<MeterKey, MeterData> event) { - MeterKey key = event.key(); - MeterData data = event.value().value(); - NodeId master = mastershipService.getMasterFor(data.meter().deviceId()); - switch (event.type()) { - case INSERT: - case UPDATE: - switch (data.meter().state()) { - case PENDING_ADD: - case PENDING_REMOVE: - if (!data.reason().isPresent() && local.equals(master)) { - notifyDelegate( - new MeterEvent(data.meter().state() == MeterState.PENDING_ADD ? - MeterEvent.Type.METER_ADD_REQ : MeterEvent.Type.METER_REM_REQ, - data.meter())); - } else if (data.reason().isPresent() && local.equals(data.origin())) { - MeterStoreResult msr = MeterStoreResult.fail(data.reason().get()); - //TODO: No future -> no friend - futures.get(key).complete(msr); - } - break; - case ADDED: - if (local.equals(data.origin()) && data.meter().state() == MeterState.PENDING_ADD) { - futures.remove(key).complete(MeterStoreResult.success()); - } - break; - case REMOVED: - if (local.equals(data.origin()) && data.meter().state() == MeterState.PENDING_REMOVE) { - futures.remove(key).complete(MeterStoreResult.success()); - } - break; - default: - log.warn("Unknown meter state type {}", data.meter().state()); - } - break; - case REMOVE: - //Only happens at origin so we do not need to care. - break; - default: - log.warn("Unknown Map event type {}", event.type()); - } - - } - } - - -} diff --git a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java b/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java deleted file mode 100644 index c72bc2e3..00000000 --- a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/MeterData.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2015 Open Networking Laboratory - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.onosproject.incubator.store.meter.impl; - -import org.onosproject.cluster.NodeId; -import org.onosproject.net.meter.Meter; -import org.onosproject.net.meter.MeterFailReason; - -import java.util.Optional; - -/** - * A class representing the meter information stored in the meter store. - */ -public class MeterData { - - private final Meter meter; - private final Optional<MeterFailReason> reason; - private final NodeId origin; - - public MeterData(Meter meter, MeterFailReason reason, NodeId origin) { - this.meter = meter; - this.reason = Optional.ofNullable(reason); - this.origin = origin; - } - - public Meter meter() { - return meter; - } - - public Optional<MeterFailReason> reason() { - return this.reason; - } - - public NodeId origin() { - return this.origin; - } - - -} diff --git a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/package-info.java b/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/package-info.java deleted file mode 100644 index c1992f07..00000000 --- a/framework/src/onos/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/package-info.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2015 Open Networking Laboratory - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * A distributed meter store implementation that stores meter data consistently - * across the cluster. - */ -package org.onosproject.incubator.store.meter.impl; |