Decompose RPC implementation classes
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / services / sal / UpdateGroupsBatchImpl.java
1 /*
2  * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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 package org.opendaylight.openflowplugin.impl.services.sal;
9
10 import static java.util.Objects.requireNonNull;
11
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.GroupUtil;
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.group.service.rev130918.UpdateGroup;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupRef;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.BatchGroupInputUpdateGrouping;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatch;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.UpdateGroupsBatchOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groups.service.rev160315.update.groups.batch.input.BatchUpdateGroups;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
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;
36
37 public final class UpdateGroupsBatchImpl implements UpdateGroupsBatch {
38     private static final Logger LOG = LoggerFactory.getLogger(UpdateGroupsBatchImpl.class);
39
40     private final UpdateGroup updateGroup;
41     private final SendBarrier sendBarrier;
42
43     public UpdateGroupsBatchImpl(final UpdateGroup updateGroup, final SendBarrier sendBarrier) {
44         this.updateGroup = requireNonNull(updateGroup);
45         this.sendBarrier = requireNonNull(sendBarrier);
46     }
47
48     @Override
49     public ListenableFuture<RpcResult<UpdateGroupsBatchOutput>> invoke(final UpdateGroupsBatchInput input) {
50         final var batchUpdateGroups = input.nonnullBatchUpdateGroups();
51         if (LOG.isTraceEnabled()) {
52             LOG.trace("Updating groups @ {} : {}", PathUtil.extractNodeId(input.getNode()), batchUpdateGroups.size());
53         }
54
55         final var resultsLot = batchUpdateGroups.stream()
56             .map(batchGroup -> updateGroup.invoke(new UpdateGroupInputBuilder(input)
57                 .setOriginalGroup(new OriginalGroupBuilder(batchGroup.getOriginalBatchedGroup()).build())
58                 .setUpdatedGroup(new UpdatedGroupBuilder(batchGroup.getUpdatedBatchedGroup()).build())
59                 .setGroupRef(createGroupRef(input.getNode(), batchGroup))
60                 .setNode(input.getNode())
61                 .build()))
62             .collect(Collectors.toList());
63
64         final var groups = batchUpdateGroups.stream()
65                 .map(BatchGroupInputUpdateGrouping::getUpdatedBatchedGroup)
66                 .collect(Collectors.toList());
67
68         final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
69             GroupUtil.createCumulatingFunction(groups, batchUpdateGroups.size()),
70             MoreExecutors.directExecutor());
71
72         final var updateGroupsBulkFuture = Futures.transform(commonResult, GroupUtil.GROUP_UPDATE_TRANSFORM,
73             MoreExecutors.directExecutor());
74
75         return input.getBarrierAfter()
76             ? BarrierUtil.chainBarrier(updateGroupsBulkFuture, input.getNode(), sendBarrier,
77                 GroupUtil.GROUP_UPDATE_COMPOSING_TRANSFORM)
78             : updateGroupsBulkFuture;
79     }
80
81     private static GroupRef createGroupRef(final NodeRef nodeRef, final BatchUpdateGroups batchGroup) {
82         return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(),
83             batchGroup.getUpdatedBatchedGroup().getGroupId());
84     }
85 }