Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / services / batch / FlatBatchMeterAdapters.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.impl.services.batch;
10
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.ListenableFuture;
15 import com.google.common.util.concurrent.MoreExecutors;
16 import java.util.ArrayList;
17 import java.util.List;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.ProcessFlatBatchOutputBuilder;
20 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;
21 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;
22 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;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailure;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.BatchFailureBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flat.batch.service.rev160321.process.flat.batch.output.batch.failure.batch.item.id.choice.FlatBatchFailureMeterIdCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.AddMetersBatchInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.BatchMeterOutputListGrouping;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.RemoveMetersBatchInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.UpdateMetersBatchInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMeters;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.add.meters.batch.input.BatchAddMetersBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.batch.meter.output.list.grouping.BatchFailedMetersOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMeters;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.remove.meters.batch.input.BatchRemoveMetersBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMeters;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meters.service.rev160316.update.meters.batch.input.BatchUpdateMetersBuilder;
41 import org.opendaylight.yangtools.yang.common.RpcResult;
42 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
43
44 /**
45  * Transform between FlatBatch API and meter batch API.
46  */
47 public final class FlatBatchMeterAdapters {
48
49     private FlatBatchMeterAdapters() {
50     }
51
52     /**
53      * Adapt flat batch add meter.
54      * @param planStep batch step containing changes of the same type
55      * @param node     pointer for RPC routing
56      * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
57      * .opendaylight.meters.service.rev160316.SalMetersBatchService#addMetersBatch(AddMetersBatchInput)}
58      */
59     public static AddMetersBatchInput adaptFlatBatchAddMeter(final BatchPlanStep planStep, final NodeRef node) {
60         final List<BatchAddMeters> batchMeters = new ArrayList<>();
61         for (FlatBatchAddMeter batchAddMeter : planStep.<FlatBatchAddMeter>getTaskBag()) {
62             final BatchAddMeters addMeters = new BatchAddMetersBuilder(batchAddMeter)
63                     .setMeterId(batchAddMeter.getMeterId())
64                     .build();
65             batchMeters.add(addMeters);
66         }
67
68         return new AddMetersBatchInputBuilder()
69                 .setBarrierAfter(planStep.isBarrierAfter())
70                 .setNode(node)
71                 .setBatchAddMeters(batchMeters)
72                 .build();
73     }
74
75     /**
76      * Adapt flat batch remove meter.
77      * @param planStep batch step containing changes of the same type
78      * @param node     pointer for RPC routing
79      * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
80      * .opendaylight.meters.service.rev160316.SalMetersBatchService#removeMetersBatch(RemoveMetersBatchInput)}
81      */
82     public static RemoveMetersBatchInput adaptFlatBatchRemoveMeter(final BatchPlanStep planStep, final NodeRef node) {
83         final List<BatchRemoveMeters> batchMeters = new ArrayList<>();
84         for (FlatBatchRemoveMeter batchRemoveMeter : planStep.<FlatBatchRemoveMeter>getTaskBag()) {
85             final BatchRemoveMeters removeMeters = new BatchRemoveMetersBuilder(batchRemoveMeter)
86                     .setMeterId(batchRemoveMeter.getMeterId())
87                     .build();
88             batchMeters.add(removeMeters);
89         }
90
91         return new RemoveMetersBatchInputBuilder()
92                 .setBarrierAfter(planStep.isBarrierAfter())
93                 .setNode(node)
94                 .setBatchRemoveMeters(batchMeters)
95                 .build();
96     }
97
98     /**
99      * Adapt flat batch update meter.
100      * @param planStep batch step containing changes of the same type
101      * @param node     pointer for RPC routing
102      * @return input suitable for {@link org.opendaylight.yang.gen.v1.urn
103      * .opendaylight.meters.service.rev160316.SalMetersBatchService#updateMetersBatch(UpdateMetersBatchInput)}
104      */
105     public static UpdateMetersBatchInput adaptFlatBatchUpdateMeter(final BatchPlanStep planStep, final NodeRef node) {
106         final List<BatchUpdateMeters> batchMeters = new ArrayList<>();
107         for (FlatBatchUpdateMeter batchUpdateMeter : planStep.<FlatBatchUpdateMeter>getTaskBag()) {
108             final BatchUpdateMeters updateMeters = new BatchUpdateMetersBuilder(batchUpdateMeter)
109                     .build();
110             batchMeters.add(updateMeters);
111         }
112
113         return new UpdateMetersBatchInputBuilder()
114                 .setBarrierAfter(planStep.isBarrierAfter())
115                 .setNode(node)
116                 .setBatchUpdateMeters(batchMeters)
117                 .build();
118     }
119
120     /**
121      * Convert meter batch result.
122      * @param stepOffset offset of current batch plan step
123      * @return converted {@link ProcessFlatBatchOutput} RPC result
124      */
125     @VisibleForTesting
126     static <T extends BatchMeterOutputListGrouping> Function<RpcResult<T>, RpcResult<ProcessFlatBatchOutput>>
127         convertBatchMeterResult(final int stepOffset) {
128         return input -> {
129             List<BatchFailure> batchFailures = wrapBatchMeterFailuresForFlat(input, stepOffset);
130             ProcessFlatBatchOutputBuilder outputBuilder =
131                     new ProcessFlatBatchOutputBuilder().setBatchFailure(batchFailures);
132             return RpcResultBuilder.<ProcessFlatBatchOutput>status(input.isSuccessful())
133                     .withRpcErrors(input.getErrors())
134                     .withResult(outputBuilder.build())
135                     .build();
136         };
137     }
138
139     private static <T extends BatchMeterOutputListGrouping> List<BatchFailure> wrapBatchMeterFailuresForFlat(
140             final RpcResult<T> input, final int stepOffset) {
141         final List<BatchFailure> batchFailures = new ArrayList<>();
142         if (input.getResult().getBatchFailedMetersOutput() != null) {
143             for (BatchFailedMetersOutput stepOutput : input.getResult().nonnullBatchFailedMetersOutput().values()) {
144                 final BatchFailure batchFailure = new BatchFailureBuilder()
145                         .setBatchOrder(stepOffset + stepOutput.getBatchOrder().toJava())
146                         .setBatchItemIdChoice(new FlatBatchFailureMeterIdCaseBuilder()
147                                 .setMeterId(stepOutput.getMeterId())
148                                 .build())
149                         .build();
150                 batchFailures.add(batchFailure);
151             }
152         }
153         return batchFailures;
154     }
155
156     /**
157      * Shortcut for {@link #convertBatchMeterResult(int)} with conversion {@link ListenableFuture}.
158      *
159      * @param <T>                     exact type of batch flow output
160      * @param resultUpdateMeterFuture batch group rpc-result (add/remove/update)
161      * @param currentOffset           offset of current batch plan step with respect to entire chain of steps
162      * @return ListenableFuture with converted result {@link ProcessFlatBatchOutput}
163      */
164     public static <T extends BatchMeterOutputListGrouping> ListenableFuture<RpcResult<ProcessFlatBatchOutput>>
165         convertMeterBatchFutureForChain(final ListenableFuture<RpcResult<T>> resultUpdateMeterFuture,
166                                     final int currentOffset) {
167         return Futures.transform(resultUpdateMeterFuture,
168                 FlatBatchMeterAdapters.convertBatchMeterResult(currentOffset),
169                 MoreExecutors.directExecutor());
170     }
171 }