BUG 2889 : migration of netconf-cli to NormalizedNode api's
[controller.git] / opendaylight / netconf / netconf-cli / src / main / java / org / opendaylight / controller / netconf / cli / commands / remote / RemoteCommand.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.controller.netconf.cli.commands.remote;
9
10 import com.google.common.util.concurrent.CheckedFuture;
11 import java.util.Collections;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.TimeUnit;
14 import java.util.concurrent.TimeoutException;
15 import org.opendaylight.controller.md.sal.dom.api.DOMRpcException;
16 import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
17 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
18 import org.opendaylight.controller.netconf.cli.commands.AbstractCommand;
19 import org.opendaylight.controller.netconf.cli.commands.Command;
20 import org.opendaylight.controller.netconf.cli.commands.CommandInvocationException;
21 import org.opendaylight.controller.netconf.cli.commands.input.Input;
22 import org.opendaylight.controller.netconf.cli.commands.input.InputDefinition;
23 import org.opendaylight.controller.netconf.cli.commands.output.Output;
24 import org.opendaylight.controller.netconf.cli.commands.output.OutputDefinition;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
27 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
28
29 /**
30  * Generic remote command implementation that sends the rpc xml to the remote device and waits for response
31  * Waiting is limited with TIMEOUT
32  */
33 public class RemoteCommand extends AbstractCommand {
34
35     // TODO make this configurable
36     private static final long DEFAULT_TIMEOUT = 10000;
37     private static final TimeUnit DEFAULT_TIMEOUT_UNIT = TimeUnit.MILLISECONDS;
38     private final DOMRpcService rpcService;
39
40     public RemoteCommand(final QName qName, final InputDefinition args, final OutputDefinition output, final String description, final DOMRpcService rpcService) {
41         super(qName, args, output, description);
42         this.rpcService = rpcService;
43     }
44
45     @Override
46     public Output invoke(final Input inputArgs) throws CommandInvocationException {
47         final CheckedFuture<DOMRpcResult, DOMRpcException> invokeRpc =
48                 rpcService.invokeRpc(SchemaPath.create(Collections.singletonList(getCommandId()), true), inputArgs.wrap(getCommandId()));
49
50         try {
51             return new Output(invokeRpc.get(DEFAULT_TIMEOUT, DEFAULT_TIMEOUT_UNIT).getResult());
52         } catch (final ExecutionException e) {
53             throw new CommandInvocationException(getCommandId(), e);
54         } catch (final TimeoutException e) {
55             // Request timed out, cancel request
56             invokeRpc.cancel(true);
57             throw new CommandInvocationException.CommandTimeoutException(getCommandId(), e);
58         } catch (final InterruptedException e) {
59             throw new RuntimeException(e);
60         }
61     }
62
63     public static Command fromRpc(final RpcDefinition rpcDefinition, final DOMRpcService rpcService) {
64         final InputDefinition args = getInputDefinition(rpcDefinition);
65         final OutputDefinition retVal = getOutputDefinition(rpcDefinition);
66
67         return new RemoteCommand(rpcDefinition.getQName(), args, retVal, rpcDefinition.getDescription(), rpcService);
68     }
69 }