2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.impl.services.sal;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import java.util.stream.Collectors;
16 import org.opendaylight.openflowplugin.impl.util.BarrierUtil;
17 import org.opendaylight.openflowplugin.impl.util.MeterUtil;
18 import org.opendaylight.openflowplugin.impl.util.PathUtil;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.SendBarrier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeter;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.OriginalMeterBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterInputUpdateGrouping;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatch;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 public final class UpdateMetersBatchImpl implements UpdateMetersBatch {
38 private static final Logger LOG = LoggerFactory.getLogger(UpdateMetersBatchImpl.class);
40 private final UpdateMeter updateMeter;
41 private final SendBarrier sendBarrier;
43 public UpdateMetersBatchImpl(final UpdateMeter updateMeter, final SendBarrier sendBarrier) {
44 this.updateMeter = requireNonNull(updateMeter);
45 this.sendBarrier = requireNonNull(sendBarrier);
49 public ListenableFuture<RpcResult<UpdateMetersBatchOutput>> invoke(final UpdateMetersBatchInput input) {
50 final var batchUpdateMeters = input.nonnullBatchUpdateMeters();
51 if (LOG.isTraceEnabled()) {
52 LOG.trace("Updating meters @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateMeters.size());
55 final var resultsLot = batchUpdateMeters.stream()
56 .map(batchMeter -> updateMeter.invoke(new UpdateMeterInputBuilder(input)
57 .setOriginalMeter(new OriginalMeterBuilder(batchMeter.getOriginalBatchedMeter()).build())
58 .setUpdatedMeter(new UpdatedMeterBuilder(batchMeter.getUpdatedBatchedMeter()).build())
59 .setMeterRef(createMeterRef(input.getNode(), batchMeter))
60 .setNode(input.getNode())
62 .collect(Collectors.toList());
64 final var meters = batchUpdateMeters.stream()
65 .map(BatchMeterInputUpdateGrouping::getUpdatedBatchedMeter)
66 .collect(Collectors.toList());
68 final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
69 MeterUtil.createCumulativeFunction(meters, batchUpdateMeters.size()), MoreExecutors.directExecutor());
71 final var updateMetersBulkFuture = Futures.transform(commonResult, MeterUtil.METER_UPDATE_TRANSFORM,
72 MoreExecutors.directExecutor());
74 return input.getBarrierAfter()
75 ? BarrierUtil.chainBarrier(updateMetersBulkFuture, input.getNode(), sendBarrier,
76 MeterUtil.METER_UPDATE_COMPOSING_TRANSFORM)
77 : updateMetersBulkFuture;
80 private static MeterRef createMeterRef(final NodeRef nodeRef, final BatchUpdateMeters batchMeter) {
81 return MeterUtil.buildMeterPath((InstanceIdentifier<Node>) nodeRef.getValue(),
82 batchMeter.getUpdatedBatchedMeter().getMeterId());