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
9 package org.opendaylight.openflowplugin.impl.services.batch;
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Function;
13 import com.google.common.util.concurrent.Futures;
14 import com.google.common.util.concurrent.JdkFutureAdapters;
15 import com.google.common.util.concurrent.ListenableFuture;
16 import com.google.common.util.concurrent.MoreExecutors;
17 import java.util.ArrayList;
18 import java.util.List;
19 import java.util.concurrent.Future;
20 import javax.annotation.Nonnull;
21 import javax.annotation.Nullable;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.flat.batch.add.meter._case.FlatBatchAddMeter;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.flat.batch.remove.meter._case.FlatBatchRemoveMeter;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.input.batch.batch.choice.flat.batch.update.meter._case.FlatBatchUpdateMeter;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailure;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailureBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.batch.failure.batch.item.id.choice.FlatBatchFailureMeterIdCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterOutputListGrouping;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.output.list.grouping.BatchFailedMetersOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
45 import org.opendaylight.yangtools.yang.common.RpcResult;
46 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
49 * Transform between FlatBatch API and meter batch API.
51 public final class FlatBatchMeterAdapters {
53 private FlatBatchMeterAdapters() {
57 * Adapt flat batch add meter.
58 * @param planStep batch step containing changes of the same type
59 * @param node pointer for RPC routing
60 * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
61 * .opendaylight.meters.service.rev160316.SalMetersBatchService#addMetersBatch(AddMetersBatchInput)}
63 public static AddMetersBatchInput adaptFlatBatchAddMeter(final BatchPlanStep planStep, final NodeRef node) {
64 final List<BatchAddMeters> batchMeters = new ArrayList<>();
65 for (FlatBatchAddMeter batchAddMeter : planStep.<FlatBatchAddMeter>getTaskBag()) {
66 final BatchAddMeters addMeters = new BatchAddMetersBuilder(batchAddMeter)
67 .setMeterId(batchAddMeter.getMeterId())
69 batchMeters.add(addMeters);
72 return new AddMetersBatchInputBuilder()
73 .setBarrierAfter(planStep.isBarrierAfter())
75 .setBatchAddMeters(batchMeters)
80 * Adapt flat batch remove meter.
81 * @param planStep batch step containing changes of the same type
82 * @param node pointer for RPC routing
83 * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
84 * .opendaylight.meters.service.rev160316.SalMetersBatchService#removeMetersBatch(RemoveMetersBatchInput)}
86 public static RemoveMetersBatchInput adaptFlatBatchRemoveMeter(final BatchPlanStep planStep, final NodeRef node) {
87 final List<BatchRemoveMeters> batchMeters = new ArrayList<>();
88 for (FlatBatchRemoveMeter batchRemoveMeter : planStep.<FlatBatchRemoveMeter>getTaskBag()) {
89 final BatchRemoveMeters removeMeters = new BatchRemoveMetersBuilder(batchRemoveMeter)
90 .setMeterId(batchRemoveMeter.getMeterId())
92 batchMeters.add(removeMeters);
95 return new RemoveMetersBatchInputBuilder()
96 .setBarrierAfter(planStep.isBarrierAfter())
98 .setBatchRemoveMeters(batchMeters)
103 * Adapt flat batch update meter.
104 * @param planStep batch step containing changes of the same type
105 * @param node pointer for RPC routing
106 * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
107 * .opendaylight.meters.service.rev160316.SalMetersBatchService#updateMetersBatch(UpdateMetersBatchInput)}
109 public static UpdateMetersBatchInput adaptFlatBatchUpdateMeter(final BatchPlanStep planStep, final NodeRef node) {
110 final List<BatchUpdateMeters> batchMeters = new ArrayList<>();
111 for (FlatBatchUpdateMeter batchUpdateMeter : planStep.<FlatBatchUpdateMeter>getTaskBag()) {
112 final BatchUpdateMeters updateMeters = new BatchUpdateMetersBuilder(batchUpdateMeter)
114 batchMeters.add(updateMeters);
117 return new UpdateMetersBatchInputBuilder()
118 .setBarrierAfter(planStep.isBarrierAfter())
120 .setBatchUpdateMeters(batchMeters)
125 * Convert meter batch result.
126 * @param stepOffset offset of current batch plan step
127 * @return converted {@link ProcessFlatBatchOutput} RPC result
130 static <T extends BatchMeterOutputListGrouping> Function<RpcResult<T>, RpcResult<ProcessFlatBatchOutput>>
131 convertBatchMeterResult(final int stepOffset) {
132 return new Function<RpcResult<T>, RpcResult<ProcessFlatBatchOutput>>() {
135 public RpcResult<ProcessFlatBatchOutput> apply(@Nonnull final RpcResult<T> input) {
136 List<BatchFailure> batchFailures = wrapBatchMeterFailuresForFlat(input, stepOffset);
137 ProcessFlatBatchOutputBuilder outputBuilder =
138 new ProcessFlatBatchOutputBuilder().setBatchFailure(batchFailures);
139 return RpcResultBuilder.<ProcessFlatBatchOutput>status(input.isSuccessful())
140 .withRpcErrors(input.getErrors())
141 .withResult(outputBuilder.build())
147 private static <T extends BatchMeterOutputListGrouping> List<BatchFailure> wrapBatchMeterFailuresForFlat(
148 final RpcResult<T> input, final int stepOffset) {
149 final List<BatchFailure> batchFailures = new ArrayList<>();
150 if (input.getResult().getBatchFailedMetersOutput() != null) {
151 for (BatchFailedMetersOutput stepOutput : input.getResult().getBatchFailedMetersOutput()) {
152 final BatchFailure batchFailure = new BatchFailureBuilder()
153 .setBatchOrder(stepOffset + stepOutput.getBatchOrder())
154 .setBatchItemIdChoice(new FlatBatchFailureMeterIdCaseBuilder()
155 .setMeterId(stepOutput.getMeterId())
158 batchFailures.add(batchFailure);
161 return batchFailures;
165 * Shortcut for {@link #convertBatchMeterResult(int)} with conversion {@link ListenableFuture}.
167 * @param <T> exact type of batch flow output
168 * @param resultUpdateMeterFuture batch group rpc-result (add/remove/update)
169 * @param currentOffset offset of current batch plan step with respect to entire chain of steps
170 * @return ListenableFuture with converted result {@link ProcessFlatBatchOutput}
172 public static <T extends BatchMeterOutputListGrouping> ListenableFuture<RpcResult<ProcessFlatBatchOutput>>
173 convertMeterBatchFutureForChain(final Future<RpcResult<T>> resultUpdateMeterFuture,
174 final int currentOffset) {
175 return Futures.transform(JdkFutureAdapters.listenInPoolThread(resultUpdateMeterFuture),
176 FlatBatchMeterAdapters.convertBatchMeterResult(currentOffset),
177 MoreExecutors.directExecutor());