mirror of https://github.com/apache/jclouds.git
Issue 720: added live profile and logging to sshj
This commit is contained in:
parent
e8f5d39c2e
commit
bf4db76152
|
@ -44,6 +44,14 @@
|
|||
</repository>
|
||||
</repositories>
|
||||
|
||||
<properties>
|
||||
<test.ssh.host>localhost</test.ssh.host>
|
||||
<test.ssh.port>22</test.ssh.port>
|
||||
<test.ssh.username />
|
||||
<test.ssh.password />
|
||||
<test.ssh.keyfile />
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
|
@ -60,6 +68,12 @@
|
|||
<artifactId>jclouds-slf4j</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>0.9.30</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds.driver</groupId>
|
||||
<artifactId>jclouds-bouncycastle</artifactId>
|
||||
|
@ -99,4 +113,65 @@
|
|||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>live</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>integration</id>
|
||||
<phase>integration-test</phase>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<!-- note that the groups/excluded groups don't work due to some problem
|
||||
in surefire or testng. instead, we have to exclude via file path
|
||||
<groups>live,integration</groups>
|
||||
<excludedGroups>unit,performance</excludedGroups> -->
|
||||
<excludes>
|
||||
<exclude>none</exclude>
|
||||
</excludes>
|
||||
<includes>
|
||||
<include>**/*IntegrationTest.java</include>
|
||||
<include>**/*LiveTest.java</include>
|
||||
</includes>
|
||||
<systemProperties>
|
||||
<property>
|
||||
<name>file.encoding</name>
|
||||
<value>UTF-8</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.ssh.host</name>
|
||||
<value>${test.ssh.host}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.ssh.port</name>
|
||||
<value>${test.ssh.port}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.ssh.username</name>
|
||||
<value>${test.ssh.username}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.ssh.keyfile</name>
|
||||
<value>${test.ssh.keyfile}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.ssh.password</name>
|
||||
<value>${test.ssh.password}</value>
|
||||
</property>
|
||||
</systemProperties>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
|
|
|
@ -24,11 +24,13 @@ import java.io.File;
|
|||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
|
||||
import org.jclouds.compute.domain.ExecResponse;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.io.Payload;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
|
||||
import org.jclouds.net.IPSocket;
|
||||
import org.jclouds.ssh.SshClient;
|
||||
import org.jclouds.sshj.config.SshjSshClientModule;
|
||||
|
@ -44,7 +46,7 @@ import com.google.inject.Injector;
|
|||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live")
|
||||
@Test(groups = "live", testName = "SshjSshClientLiveTest")
|
||||
public class SshjSshClientLiveTest {
|
||||
protected static final String sshHost = System.getProperty("test.ssh.host", "localhost");
|
||||
protected static final String sshPort = System.getProperty("test.ssh.port", "22");
|
||||
|
@ -57,8 +59,8 @@ public class SshjSshClientLiveTest {
|
|||
public SshClient setupClient() throws NumberFormatException, FileNotFoundException, IOException {
|
||||
int port = Integer.parseInt(sshPort);
|
||||
if (sshUser == null
|
||||
|| ((sshPass == null || sshPass.trim().equals("")) && (sshKeyFile == null || sshKeyFile.trim().equals("")))
|
||||
|| sshUser.trim().equals("")) {
|
||||
|| ((sshPass == null || sshPass.trim().equals("")) && (sshKeyFile == null || sshKeyFile.trim()
|
||||
.equals(""))) || sshUser.trim().equals("")) {
|
||||
System.err.println("ssh credentials not present. Tests will be lame");
|
||||
return new SshClient() {
|
||||
|
||||
|
@ -106,12 +108,12 @@ public class SshjSshClientLiveTest {
|
|||
|
||||
};
|
||||
} else {
|
||||
Injector i = Guice.createInjector(new SshjSshClientModule());
|
||||
Injector i = Guice.createInjector(new SshjSshClientModule(), new SLF4JLoggingModule());
|
||||
SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
|
||||
SshClient connection;
|
||||
if (sshKeyFile != null && !sshKeyFile.trim().equals("")) {
|
||||
connection = factory.create(new IPSocket(sshHost, port),
|
||||
new Credentials(sshUser, Strings2.toStringAndClose(new FileInputStream(sshKeyFile))));
|
||||
connection = factory.create(new IPSocket(sshHost, port), new Credentials(sshUser, Strings2
|
||||
.toStringAndClose(new FileInputStream(sshKeyFile))));
|
||||
} else {
|
||||
connection = factory.create(new IPSocket(sshHost, port), new Credentials(sshUser, sshPass));
|
||||
}
|
||||
|
@ -139,7 +141,8 @@ public class SshjSshClientLiveTest {
|
|||
public void testExecHostname() throws IOException {
|
||||
ExecResponse response = setupClient().exec("hostname");
|
||||
assertEquals(response.getError(), "");
|
||||
assertEquals(response.getOutput().trim(), sshHost);
|
||||
assertEquals(response.getOutput().trim(), "localhost".equals(sshHost) ? InetAddress.getLocalHost().getHostName()
|
||||
: sshHost);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@
|
|||
*/
|
||||
package org.jclouds.sshj;
|
||||
|
||||
import static com.google.inject.name.Names.bindProperties;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.schmizz.sshj.common.SSHException;
|
||||
import net.schmizz.sshj.connection.ConnectionException;
|
||||
|
@ -27,6 +29,7 @@ import net.schmizz.sshj.transport.TransportException;
|
|||
import net.schmizz.sshj.userauth.UserAuthException;
|
||||
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
|
||||
import org.jclouds.net.IPSocket;
|
||||
import org.jclouds.rest.AuthorizationException;
|
||||
import org.jclouds.ssh.SshClient;
|
||||
|
@ -34,6 +37,7 @@ import org.jclouds.sshj.config.SshjSshClientModule;
|
|||
import org.testng.annotations.BeforeTest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
@ -48,15 +52,26 @@ public class SshjSshClientTest {
|
|||
protected SshjSshClient ssh;
|
||||
|
||||
@BeforeTest
|
||||
public void setupSsh() throws UnknownHostException {
|
||||
public void setupSsh() {
|
||||
ssh = createClient();
|
||||
}
|
||||
|
||||
protected SshjSshClient createClient() throws UnknownHostException {
|
||||
Injector i = Guice.createInjector(module());
|
||||
protected SshjSshClient createClient() {
|
||||
return createClient(new Properties());
|
||||
}
|
||||
|
||||
protected SshjSshClient createClient(final Properties props) {
|
||||
Injector i = Guice.createInjector(module(), new AbstractModule() {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
bindProperties(binder(), props);
|
||||
}
|
||||
|
||||
}, new SLF4JLoggingModule());
|
||||
SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
|
||||
SshjSshClient ssh = SshjSshClient.class.cast(factory.create(new IPSocket("localhost", 22), new Credentials(
|
||||
"username", "password")));
|
||||
"username", "password")));
|
||||
return ssh;
|
||||
}
|
||||
|
||||
|
@ -75,13 +90,20 @@ public class SshjSshClientTest {
|
|||
assert !ssh.shouldRetry(new IOException("channel %s is not open", new NullPointerException()));
|
||||
}
|
||||
|
||||
public void testOnlyRetryAuthWhenSet() throws UnknownHostException {
|
||||
public void testOnlyRetryAuthWhenSet() {
|
||||
SshjSshClient ssh1 = createClient();
|
||||
assert !ssh1.shouldRetry(new AuthorizationException("problem", null));
|
||||
ssh1.retryAuth = true;
|
||||
assert ssh1.shouldRetry(new AuthorizationException("problem", null));
|
||||
}
|
||||
|
||||
public void testOnlyRetryAuthWhenSetViaProperties() {
|
||||
Properties props = new Properties();
|
||||
props.setProperty("jclouds.ssh.retry-auth", "true");
|
||||
SshjSshClient ssh1 = createClient(props);
|
||||
assert ssh1.shouldRetry(new AuthorizationException("problem", null));
|
||||
}
|
||||
|
||||
public void testExceptionMessagesRetry() {
|
||||
assert !ssh.shouldRetry(new SSHException(""));
|
||||
assert !ssh.shouldRetry(new NullPointerException((String) null));
|
||||
|
@ -89,10 +111,11 @@ public class SshjSshClientTest {
|
|||
|
||||
public void testCausalChainHasMessageContaining() {
|
||||
assert ssh.causalChainHasMessageContaining(
|
||||
new SSHException("Session.connect: java.io.IOException: End of IO Stream Read")).apply(
|
||||
" End of IO Stream Read");
|
||||
new SSHException("Session.connect: java.io.IOException: End of IO Stream Read")).apply(
|
||||
" End of IO Stream Read");
|
||||
assert ssh.causalChainHasMessageContaining(
|
||||
new SSHException("Session.connect: java.net.SocketException: Connection reset")).apply("java.net.Socket");
|
||||
new SSHException("Session.connect: java.net.SocketException: Connection reset"))
|
||||
.apply("java.net.Socket");
|
||||
assert !ssh.causalChainHasMessageContaining(new NullPointerException()).apply(" End of IO Stream Read");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,9 +18,8 @@
|
|||
*/
|
||||
package org.jclouds.sshj.config;
|
||||
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
|
||||
import org.jclouds.net.IPSocket;
|
||||
import org.jclouds.ssh.SshClient;
|
||||
import org.jclouds.sshj.SshjSshClient;
|
||||
|
@ -37,9 +36,9 @@ import com.google.inject.Injector;
|
|||
@Test
|
||||
public class SshjSshClientModuleTest {
|
||||
|
||||
public void testConfigureBindsClient() throws UnknownHostException {
|
||||
public void testConfigureBindsClient() {
|
||||
|
||||
Injector i = Guice.createInjector(new SshjSshClientModule());
|
||||
Injector i = Guice.createInjector(new SshjSshClientModule(), new SLF4JLoggingModule());
|
||||
SshClient.Factory factory = i.getInstance(SshClient.Factory.class);
|
||||
SshClient connection = factory.create(new IPSocket("localhost", 22), new Credentials("username", "password"));
|
||||
assert connection instanceof SshjSshClient;
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
|
||||
<file>target/test-data/jclouds-ssh.log</file>
|
||||
<append>true</append>
|
||||
<encoder>
|
||||
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<logger name="jclouds.ssh" level="TRACE"/>
|
||||
<logger name="net.schmizz" level="INFO"/>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="FILE"/>
|
||||
</root>
|
||||
</configuration>
|
Loading…
Reference in New Issue