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