2 * Copyright (c) 2017 Pantheon Technologies 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
9 package org.opendaylight.openflowplugin.impl.services.sal;
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.FutureCallback;
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.SettableFuture;
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.experimenter.message.service.rev151020.SalExperimenterMessageService;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.experimenter.message.service.rev151020.SendExperimenterInputBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.AddBundleMessagesInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.ControlBundleInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.SalBundleService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.add.bundle.messages.input.messages.Message;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSalBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleControlSalBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.add.message.sal.SalAddMessageDataBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.bundle.control.sal.SalControlDataBuilder;
30 import org.opendaylight.yangtools.yang.common.RpcError;
31 import org.opendaylight.yangtools.yang.common.RpcResult;
32 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
35 * Simple bundle extension service.
37 public class SalBundleServiceImpl implements SalBundleService {
39 private final SalExperimenterMessageService experimenterMessageService;
41 public SalBundleServiceImpl(final SalExperimenterMessageService experimenterMessageService) {
42 this.experimenterMessageService = Preconditions.checkNotNull(experimenterMessageService,
43 "SalExperimenterMessageService can not be null!");
47 public Future<RpcResult<Void>> controlBundle(ControlBundleInput input) {
48 final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
49 experimenterInputBuilder.setNode(input.getNode());
50 experimenterInputBuilder.setExperimenterMessageOfChoice(
51 new BundleControlSalBuilder()
53 new SalControlDataBuilder(input).build()
57 return experimenterMessageService.sendExperimenter(experimenterInputBuilder.build());
61 public Future<RpcResult<Void>> addBundleMessages(AddBundleMessagesInput input) {
62 final List<ListenableFuture<RpcResult<Void>>> partialResults = new ArrayList<>();
63 final SendExperimenterInputBuilder experimenterInputBuilder = new SendExperimenterInputBuilder();
64 final BundleAddMessageSalBuilder bundleAddMessageBuilder = new BundleAddMessageSalBuilder();
65 final SalAddMessageDataBuilder dataBuilder = new SalAddMessageDataBuilder();
66 experimenterInputBuilder.setNode(input.getNode());
67 dataBuilder.setNode(input.getNode());
68 dataBuilder.setBundleId(input.getBundleId());
69 dataBuilder.setFlags(input.getFlags());
70 dataBuilder.setBundleProperty(input.getBundleProperty());
71 for (Message message : input.getMessages().getMessage()) {
72 dataBuilder.setBundleInnerMessage(message.getBundleInnerMessage());
73 experimenterInputBuilder.setExperimenterMessageOfChoice(bundleAddMessageBuilder
74 .setSalAddMessageData(dataBuilder.build()).build());
75 ListenableFuture<RpcResult<Void>> res = JdkFutureAdapters.listenInPoolThread(
76 experimenterMessageService.sendExperimenter(experimenterInputBuilder.build()));
77 partialResults.add(res);
79 return processResults(partialResults);
82 private static Future<RpcResult<Void>> processResults(final List<ListenableFuture<RpcResult<Void>>> partialResults) {
83 final SettableFuture<RpcResult<Void>> result = SettableFuture.create();
84 Futures.addCallback(Futures.successfulAsList(partialResults), new FutureCallback<List<RpcResult<Void>>>() {
86 public void onSuccess(List<RpcResult<Void>> results) {
87 final ArrayList<RpcError> errors = new ArrayList<>();
88 final RpcResultBuilder<Void> rpcResultBuilder;
89 for (RpcResult<Void> res : results) {
91 errors.add(RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION, "BundleExtensionService",
92 "RpcResult is null."));
93 } else if (!res.isSuccessful()) {
94 errors.addAll(res.getErrors());
97 if (errors.isEmpty()) {
98 rpcResultBuilder = RpcResultBuilder.success();
100 rpcResultBuilder = RpcResultBuilder.<Void>failed().withRpcErrors(errors);
102 result.set(rpcResultBuilder.build());
105 public void onFailure(Throwable t) {
106 RpcResultBuilder<Void> rpcResultBuilder = RpcResultBuilder.failed();
107 result.set(rpcResultBuilder.build());