CLOUDSTACK-9503: Increased the VR script timeout. Most of the changes are about converting int/long time values to joda Duration.

This commit is contained in:
Abhinandan Prateek 2016-09-20 13:00:46 +05:30
parent be89f64731
commit 83b5a8b2b2
14 changed files with 87 additions and 55 deletions

View File

@ -19,6 +19,8 @@
package com.cloud.agent.resource.virtualnetwork;
import org.joda.time.Duration;
public class VRScripts {
public final static String CONFIG_PERSIST_LOCATION = "/var/cache/cloud/";
public final static String IP_ASSOCIATION_CONFIG = "ip_associations.json";
@ -40,7 +42,8 @@ public class VRScripts {
public static final String LOAD_BALANCER_CONFIG = "load_balancer.json";
public final static String CONFIG_CACHE_LOCATION = "/var/cache/cloud/";
public final static int DEFAULT_EXECUTEINVR_TIMEOUT = 120; //Seconds
public final static Duration VR_SCRIPT_EXEC_TIMEOUT = Duration.standardMinutes(10);
public final static Duration CONNECTION_TIMEOUT = Duration.standardMinutes(1);
// New scripts for use with chef
public static final String UPDATE_CONFIG = "update_config.py";

View File

@ -19,13 +19,14 @@
package com.cloud.agent.resource.virtualnetwork;
import org.joda.time.Duration;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.utils.ExecutionResult;
public interface VirtualRouterDeployer {
ExecutionResult executeInVR(String routerIp, String script, String args);
/* timeout in seconds */
ExecutionResult executeInVR(String routerIp, String script, String args, int timeout);
ExecutionResult executeInVR(String routerIp, String script, String args, Duration timeout);
ExecutionResult createFileInVR(String routerIp, String path, String filename, String content);
ExecutionResult prepareCommand(NetworkElementCommand cmd);
ExecutionResult cleanupCommand(NetworkElementCommand cmd);

View File

@ -22,6 +22,7 @@ package com.cloud.agent.resource.virtualnetwork;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;
import org.joda.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -73,7 +74,7 @@ public class VirtualRoutingResource {
private int _sleep;
private int _retry;
private int _port;
private int _eachTimeout;
private Duration _eachTimeout;
private String _cfgVersion = "1.0";
@ -153,10 +154,10 @@ public class VirtualRoutingResource {
}
private ExecutionResult applyConfigToVR(String routerAccessIp, ConfigItem c) {
return applyConfigToVR(routerAccessIp, c, VRScripts.DEFAULT_EXECUTEINVR_TIMEOUT);
return applyConfigToVR(routerAccessIp, c, VRScripts.VR_SCRIPT_EXEC_TIMEOUT);
}
private ExecutionResult applyConfigToVR(String routerAccessIp, ConfigItem c, int timeout) {
private ExecutionResult applyConfigToVR(String routerAccessIp, ConfigItem c, Duration timeout) {
if (c instanceof FileConfigItem) {
FileConfigItem configItem = (FileConfigItem)c;
return _vrDeployer.createFileInVR(routerAccessIp, configItem.getFilePath(), configItem.getFileName(), configItem.getFileContents());
@ -271,7 +272,7 @@ public class VirtualRoutingResource {
_port = NumbersUtil.parseInt(value, 3922);
value = (String)params.get("router.aggregation.command.each.timeout");
_eachTimeout = NumbersUtil.parseInt(value, 3);
_eachTimeout = Duration.standardSeconds(NumbersUtil.parseInt(value, 10));
if (_vrDeployer == null) {
throw new ConfigurationException("Unable to find the resource for VirtualRouterDeployer!");
@ -374,9 +375,9 @@ public class VirtualRoutingResource {
FileConfigItem fileConfigItem = new FileConfigItem(VRScripts.CONFIG_CACHE_LOCATION, cfgFileName, sb.toString());
ScriptConfigItem scriptConfigItem = new ScriptConfigItem(VRScripts.VR_CFG, "-c " + VRScripts.CONFIG_CACHE_LOCATION + cfgFileName);
// 120s is the minimal timeout
int timeout = answerCounts * _eachTimeout;
if (timeout < 120) {
timeout = 120;
Duration timeout = _eachTimeout.withDurationAdded(_eachTimeout.getStandardSeconds(), answerCounts);
if (timeout.isShorterThan(VRScripts.VR_SCRIPT_EXEC_TIMEOUT)) {
timeout = VRScripts.VR_SCRIPT_EXEC_TIMEOUT;
}
ExecutionResult result = applyConfigToVR(cmd.getRouterAccessIp(), fileConfigItem);

View File

@ -31,6 +31,7 @@ import java.util.UUID;
import javax.naming.ConfigurationException;
import org.joda.time.Duration;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@ -97,11 +98,11 @@ public class VirtualRoutingResourceTest implements VirtualRouterDeployer {
@Override
public ExecutionResult executeInVR(final String routerIp, final String script, final String args) {
return executeInVR(routerIp, script, args, 60);
return executeInVR(routerIp, script, args, Duration.standardSeconds(60L));
}
@Override
public ExecutionResult executeInVR(final String routerIp, final String script, final String args, final int timeout) {
public ExecutionResult executeInVR(final String routerIp, final String script, final String args, final Duration timeout) {
assertEquals(routerIp, ROUTERIP);
verifyCommand(_currentCmd, script, args);
return new ExecutionResult(true, null);

View File

@ -32,6 +32,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import org.joda.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -622,11 +623,11 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
@Override
public ExecutionResult executeInVR(final String routerIP, final String script, final String args) {
return executeInVR(routerIP, script, args, 120);
return executeInVR(routerIP, script, args, Duration.standardSeconds(120L));
}
@Override
public ExecutionResult executeInVR(final String routerIP, final String script, final String args, final int timeout) {
public ExecutionResult executeInVR(final String routerIP, final String script, final String args, final Duration timeout) {
Pair<Boolean, String> result;
//TODO: Password should be masked, cannot output to log directly
@ -635,8 +636,8 @@ public class HypervDirectConnectResource extends ServerResourceBase implements S
}
try {
result = SshHelper.sshExecute(routerIP, DEFAULT_DOMR_SSHPORT, "root", getSystemVMKeyFile(), null, "/opt/cloud/bin/" + script + " " + args,
60000, 60000, timeout * 1000);
result = SshHelper.sshExecute(routerIP, DEFAULT_DOMR_SSHPORT, "root", getSystemVMKeyFile(), null, "/opt/cloud/bin/" + script + " " + args, VRScripts.CONNECTION_TIMEOUT,
VRScripts.CONNECTION_TIMEOUT, timeout);
} catch (final Exception e) {
final String msg = "Command failed due to " + e ;
s_logger.error(msg);

View File

@ -25,6 +25,7 @@ import java.io.Reader;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import org.joda.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@ -189,7 +190,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
private long _hvVersion;
private long _kernelVersion;
private int _timeout;
private Duration _timeout;
private static final int NUMMEMSTATS =2;
private KVMHAMonitor _monitor;
public static final String SSHKEYSPATH = "/root/.ssh";
@ -276,12 +278,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
@Override
public ExecutionResult executeInVR(final String routerIp, final String script, final String args) {
return executeInVR(routerIp, script, args, _timeout / 1000);
return executeInVR(routerIp, script, args, _timeout);
}
@Override
public ExecutionResult executeInVR(final String routerIp, final String script, final String args, final int timeout) {
final Script command = new Script(_routerProxyPath, timeout * 1000, s_logger);
public ExecutionResult executeInVR(final String routerIp, final String script, final String args, final Duration timeout) {
final Script command = new Script(_routerProxyPath, timeout, s_logger);
final AllLinesParser parser = new AllLinesParser();
command.add(script);
command.add(routerIp);
@ -383,7 +385,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
return _updateHostPasswdPath;
}
public int getTimeout() {
public Duration getTimeout() {
return _timeout;
}
@ -774,7 +776,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
value = (String)params.get("scripts.timeout");
_timeout = NumbersUtil.parseInt(value, 30 * 60) * 1000;
_timeout = Duration.standardSeconds(NumbersUtil.parseInt(value, 30 * 60));
value = (String)params.get("stop.script.timeout");
_stopTimeout = NumbersUtil.parseInt(value, 120) * 1000;

View File

@ -40,13 +40,10 @@ public final class LibvirtOvsCreateTunnelCommandWrapper extends CommandWrapper<O
try {
if (!libvirtComputingResource.findOrCreateTunnelNetwork(bridge)) {
s_logger.debug("Error during bridge setup");
return new OvsCreateTunnelAnswer(command, false,
"Cannot create network", bridge);
return new OvsCreateTunnelAnswer(command, false, "Cannot create network", bridge);
}
libvirtComputingResource.configureTunnelNetwork(command.getNetworkId(), command.getFrom(),
command.getNetworkName());
libvirtComputingResource.configureTunnelNetwork(command.getNetworkId(), command.getFrom(), command.getNetworkName());
final Script scriptCommand = new Script(libvirtComputingResource.getOvsTunnelPath(), libvirtComputingResource.getTimeout(), s_logger);
scriptCommand.add("create_tunnel");
scriptCommand.add("--bridge", bridge);
@ -57,8 +54,7 @@ public final class LibvirtOvsCreateTunnelCommandWrapper extends CommandWrapper<O
final String result = scriptCommand.execute();
if (result != null) {
return new OvsCreateTunnelAnswer(command, true, result, null,
bridge);
return new OvsCreateTunnelAnswer(command, true, result, null, bridge);
} else {
return new OvsCreateTunnelAnswer(command, false, result, bridge);
}

View File

@ -22,6 +22,7 @@ package com.cloud.hypervisor.kvm.resource.wrapper;
import java.util.List;
import org.apache.log4j.Logger;
import org.joda.time.Duration;
import org.libvirt.Connect;
import org.libvirt.LibvirtException;
@ -45,8 +46,8 @@ public final class LibvirtPvlanSetupCommandWrapper extends CommandWrapper<PvlanS
final String op = command.getOp();
final String dhcpName = command.getDhcpName();
final String dhcpMac = command.getDhcpMac();
final String dhcpIp = command.getDhcpIp();
final String vmMac = command.getVmMac();
final String dhcpIp = command.getDhcpIp();
boolean add = true;
String opr = "-A";
@ -58,7 +59,7 @@ public final class LibvirtPvlanSetupCommandWrapper extends CommandWrapper<PvlanS
String result = null;
try {
final String guestBridgeName = libvirtComputingResource.getGuestBridgeName();
final int timeout = libvirtComputingResource.getTimeout();
final Duration timeout = libvirtComputingResource.getTimeout();
if (command.getType() == PvlanSetupCommand.Type.DHCP) {
final String ovsPvlanDhcpHostPath = libvirtComputingResource.getOvsPvlanDhcpHostPath();

View File

@ -53,6 +53,7 @@ import org.apache.cloudstack.utils.linux.CPUStat;
import org.apache.cloudstack.utils.linux.MemStat;
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
import org.apache.commons.lang.SystemUtils;
import org.joda.time.Duration;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
@ -1621,7 +1622,7 @@ public class LibvirtComputingResourceTest {
when(libvirtUtilitiesHelper.retrieveSshPubKeyPath()).thenReturn("/path/pub/keys");
when(libvirtUtilitiesHelper.retrieveSshPrvKeyPath()).thenReturn("/path/pvt/keys");
when(libvirtComputingResource.getTimeout()).thenReturn(0);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
assertNotNull(wrapper);
@ -2177,7 +2178,7 @@ public class LibvirtComputingResourceTest {
final OvsVpcPhysicalTopologyConfigCommand command = new OvsVpcPhysicalTopologyConfigCommand(hosts, tiers, vms, cidr);
when(libvirtComputingResource.getOvsTunnelPath()).thenReturn("/path");
when(libvirtComputingResource.getTimeout()).thenReturn(0);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
@ -2221,7 +2222,7 @@ public class LibvirtComputingResourceTest {
final OvsVpcRoutingPolicyConfigCommand command = new OvsVpcRoutingPolicyConfigCommand(id, cidr, acls, tiers);
when(libvirtComputingResource.getOvsTunnelPath()).thenReturn("/path");
when(libvirtComputingResource.getTimeout()).thenReturn(0);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
@ -2697,6 +2698,7 @@ public class LibvirtComputingResourceTest {
when(libvirtComputingResource.findOrCreateTunnelNetwork(bridge)).thenReturn(true);
when(libvirtComputingResource.configureTunnelNetwork(command.getNetworkId(), command.getFrom(),
command.getNetworkName())).thenReturn(true);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
assertNotNull(wrapper);
@ -4271,8 +4273,7 @@ public class LibvirtComputingResourceTest {
final String guestBridgeName = "br0";
when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
final int timeout = 0;
when(libvirtComputingResource.getTimeout()).thenReturn(timeout);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final String ovsPvlanDhcpHostPath = "/pvlan";
when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
@ -4313,8 +4314,7 @@ public class LibvirtComputingResourceTest {
final String guestBridgeName = "br0";
when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
final int timeout = 0;
when(libvirtComputingResource.getTimeout()).thenReturn(timeout);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final String ovsPvlanVmPath = "/pvlan";
when(libvirtComputingResource.getOvsPvlanVmPath()).thenReturn(ovsPvlanVmPath);
@ -4343,8 +4343,7 @@ public class LibvirtComputingResourceTest {
final String guestBridgeName = "br0";
when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
final int timeout = 0;
when(libvirtComputingResource.getTimeout()).thenReturn(timeout);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final String ovsPvlanDhcpHostPath = "/pvlan";
when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
@ -4385,8 +4384,7 @@ public class LibvirtComputingResourceTest {
final String guestBridgeName = "br0";
when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
final int timeout = 0;
when(libvirtComputingResource.getTimeout()).thenReturn(timeout);
when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
final String ovsPvlanDhcpHostPath = "/pvlan";
when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);

View File

@ -17,6 +17,8 @@
package com.cloud.hypervisor.ovm3.resources;
import org.joda.time.Duration;
import javax.ejb.Local;
import org.apache.log4j.Logger;
@ -27,6 +29,7 @@ import com.cloud.agent.api.routing.IpAssocVpcCommand;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.routing.SetSourceNatCommand;
import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.resource.virtualnetwork.VRScripts;
import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
import com.cloud.hypervisor.ovm3.objects.CloudstackPlugin;
import com.cloud.hypervisor.ovm3.objects.Connection;
@ -38,7 +41,6 @@ public class Ovm3VirtualRoutingResource implements VirtualRouterDeployer {
private final Logger logger = Logger
.getLogger(Ovm3VirtualRoutingResource.class);
private String domRCloudPath = "/opt/cloud/bin/";
private int vrTimeout = 600;
private Connection c;
private String agentName;
public Ovm3VirtualRoutingResource() {
@ -53,12 +55,12 @@ public class Ovm3VirtualRoutingResource implements VirtualRouterDeployer {
@Override
public ExecutionResult executeInVR(String routerIp, String script,
String args) {
return executeInVR(routerIp, script, args, vrTimeout);
return executeInVR(routerIp, script, args, VRScripts.VR_SCRIPT_EXEC_TIMEOUT);
}
@Override
public ExecutionResult executeInVR(String routerIp, String script,
String args, int timeout) {
String args, Duration timeout) {
if (!script.contains(domRCloudPath)) {
script = domRCloudPath + "/" + script;
}

View File

@ -24,6 +24,7 @@ import java.net.InetSocketAddress;
import java.net.URI;
import java.nio.channels.SocketChannel;
import java.rmi.RemoteException;
import org.joda.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -210,6 +211,7 @@ import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.resource.virtualnetwork.VRScripts;
import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.dc.DataCenter.NetworkType;
@ -1197,11 +1199,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
@Override
public ExecutionResult executeInVR(String routerIP, String script, String args) {
return executeInVR(routerIP, script, args, 120);
return executeInVR(routerIP, script, args, VRScripts.VR_SCRIPT_EXEC_TIMEOUT);
}
@Override
public ExecutionResult executeInVR(String routerIP, String script, String args, int timeout) {
public ExecutionResult executeInVR(String routerIP, String script, String args, Duration timeout) {
Pair<Boolean, String> result;
//TODO: Password should be masked, cannot output to log directly
@ -1212,7 +1214,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
try {
VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
result = SshHelper.sshExecute(routerIP, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/opt/cloud/bin/" + script + " " + args,
60000, 60000, timeout * 1000);
VRScripts.CONNECTION_TIMEOUT, VRScripts.CONNECTION_TIMEOUT, timeout);
} catch (Exception e) {
String msg = "Command failed due to " + VmwareHelper.getExceptionMessage(e);
s_logger.error(msg);

View File

@ -29,6 +29,7 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import org.joda.time.Duration;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@ -97,6 +98,7 @@ import com.cloud.agent.api.to.IpAddressTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.agent.resource.virtualnetwork.VRScripts;
import com.cloud.agent.resource.virtualnetwork.VirtualRouterDeployer;
import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource;
import com.cloud.exception.InternalErrorException;
@ -1652,18 +1654,18 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public ExecutionResult executeInVR(final String routerIP, final String script, final String args) {
// Timeout is 120 seconds by default
return executeInVR(routerIP, script, args, 120);
return executeInVR(routerIP, script, args, VRScripts.VR_SCRIPT_EXEC_TIMEOUT);
}
@Override
public ExecutionResult executeInVR(final String routerIP, final String script, final String args, final int timeout) {
public ExecutionResult executeInVR(final String routerIP, final String script, final String args, final Duration timeout) {
Pair<Boolean, String> result;
String cmdline = "/opt/cloud/bin/router_proxy.sh " + script + " " + routerIP + " " + args;
// semicolon need to be escape for bash
cmdline = cmdline.replaceAll(";", "\\\\;");
try {
s_logger.debug("Executing command in VR: " + cmdline);
result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline, 60000, 60000, timeout * 1000);
result = SshHelper.sshExecute(_host.getIp(), 22, _username, null, _password.peek(), cmdline, VRScripts.CONNECTION_TIMEOUT, VRScripts.CONNECTION_TIMEOUT, timeout);
} catch (final Exception e) {
return new ExecutionResult(false, e.getMessage());
}

View File

@ -39,6 +39,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.joda.time.Duration;
import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.concurrency.NamedThreadFactory;
@ -68,6 +69,11 @@ public class Script implements Callable<String> {
return _process.exitValue();
}
public Script(String command, Duration timeout, Logger logger) {
this(command, timeout.getMillis(), logger);
}
@Deprecated
public Script(String command, long timeout, Logger logger) {
_command = new ArrayList<String>();
_command.add(command);
@ -80,6 +86,11 @@ public class Script implements Callable<String> {
_logger = logger != null ? logger : s_logger;
}
public Script(boolean runWithSudo, String command, Duration timeout, Logger logger) {
this(runWithSudo, command, timeout.getMillis(), logger);
}
@Deprecated
public Script(boolean runWithSudo, String command, long timeout, Logger logger) {
this(command, timeout, logger);
if (runWithSudo) {
@ -95,6 +106,11 @@ public class Script implements Callable<String> {
this(command, 0, s_logger);
}
public Script(String command, Duration timeout) {
this(command, timeout.getMillis(), s_logger);
}
@Deprecated
public Script(String command, long timeout) {
this(command, timeout, s_logger);
}

View File

@ -23,6 +23,7 @@ import java.io.File;
import java.io.InputStream;
import org.apache.log4j.Logger;
import org.joda.time.Duration;
import com.trilead.ssh2.ChannelCondition;
@ -122,8 +123,13 @@ public class SshHelper {
}
}
public static Pair<Boolean, String> sshExecute(String host, int port, String user, File pemKeyFile, String password, String command, int connectTimeoutInMs,
int kexTimeoutInMs, int waitResultTimeoutInMs) throws Exception {
public static Pair<Boolean, String> sshExecute(String host, int port, String user, File pemKeyFile, String password, String command, Duration connectTimeout,
Duration kexTimeout, Duration waitTime) throws Exception {
return sshExecute(host, port, user, pemKeyFile, password, command, (int)connectTimeout.getMillis(), (int)kexTimeout.getMillis(), (int)waitTime.getMillis());
}
public static Pair<Boolean, String> sshExecute(String host, int port, String user, File pemKeyFile, String password, String command, int connectTimeoutInMs, int kexTimeoutInMs,
int waitResultTimeoutInMs) throws Exception {
com.trilead.ssh2.Connection conn = null;
com.trilead.ssh2.Session sess = null;