2 * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.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;
37 public final class UpdateGroupsBatchImpl implements UpdateGroupsBatch {
38 private static final Logger LOG = LoggerFactory.getLogger(UpdateGroupsBatchImpl.class);
40 private final UpdateGroup updateGroup;
41 private final SendBarrier sendBarrier;
43 public UpdateGroupsBatchImpl(final UpdateGroup updateGroup, final SendBarrier sendBarrier) {
44 this.updateGroup = requireNonNull(updateGroup);
45 this.sendBarrier = requireNonNull(sendBarrier);
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());
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())
62 .collect(Collectors.toList());
64 final var groups = batchUpdateGroups.stream()
65 .map(BatchGroupInputUpdateGrouping::getUpdatedBatchedGroup)
66 .collect(Collectors.toList());
68 final var commonResult = Futures.transform(Futures.allAsList(resultsLot),
69 GroupUtil.createCumulatingFunction(groups, batchUpdateGroups.size()),
70 MoreExecutors.directExecutor());
72 final var updateGroupsBulkFuture = Futures.transform(commonResult, GroupUtil.GROUP_UPDATE_TRANSFORM,
73 MoreExecutors.directExecutor());
75 return input.getBarrierAfter()
76 ? BarrierUtil.chainBarrier(updateGroupsBulkFuture, input.getNode(), sendBarrier,
77 GroupUtil.GROUP_UPDATE_COMPOSING_TRANSFORM)
78 : updateGroupsBulkFuture;
81 private static GroupRef createGroupRef(final NodeRef nodeRef, final BatchUpdateGroups batchGroup) {
82 return GroupUtil.buildGroupPath((InstanceIdentifier<Node>) nodeRef.getValue(),
83 batchGroup.getUpdatedBatchedGroup().getGroupId());