You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2015/05/13 23:02:00 UTC
[1/3] jclouds git commit: Don't retry unsafe HTTP methods in case of
an IOException
Repository: jclouds
Updated Branches:
refs/heads/1.9.x ac8607fd2 -> 6c9915eab
Don't retry unsafe HTTP methods in case of an IOException
If an IOException is thrown during the execution of an HttpCommand retry only if the HTTP method is idempotent (i.e. GET, DELETE, PUT). Otherwise the retry could cause unwanted side effects (i.e. creating and leaking multiple new nodes).
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/41ff84bf
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/41ff84bf
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/41ff84bf
Branch: refs/heads/1.9.x
Commit: 41ff84bf780a7ac582fdb7c31824b003e21795d5
Parents: ac8607f
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed May 13 16:09:44 2015 +0300
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed May 13 22:44:14 2015 +0200
----------------------------------------------------------------------
.../BaseHttpCommandExecutorService.java | 20 +++++++-
.../BaseHttpCommandExecutorServiceTest.java | 51 ++++++++++++++++++++
2 files changed, 70 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/41ff84bf/core/src/main/java/org/jclouds/http/internal/BaseHttpCommandExecutorService.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/http/internal/BaseHttpCommandExecutorService.java b/core/src/main/java/org/jclouds/http/internal/BaseHttpCommandExecutorService.java
index e770658..dd2f03d 100644
--- a/core/src/main/java/org/jclouds/http/internal/BaseHttpCommandExecutorService.java
+++ b/core/src/main/java/org/jclouds/http/internal/BaseHttpCommandExecutorService.java
@@ -24,6 +24,7 @@ import static org.jclouds.http.HttpUtils.wirePayloadIfEnabled;
import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
import java.io.IOException;
+import java.util.Set;
import javax.annotation.Resource;
import javax.inject.Inject;
@@ -44,8 +45,11 @@ import org.jclouds.io.ContentMetadataCodec;
import org.jclouds.logging.Logger;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandExecutorService {
+ private static final Set<String> IDEMPOTENT_METHODS = ImmutableSet.of("GET", "HEAD", "OPTIONS", "PUT", "DELETE");
+
protected final HttpUtils utils;
protected final ContentMetadataCodec contentMetadataCodec;
@@ -107,7 +111,7 @@ public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandEx
}
} catch (Exception e) {
IOException ioe = getFirstThrowableOfType(e, IOException.class);
- if (ioe != null && ioRetryHandler.shouldRetryRequest(command, ioe)) {
+ if (ioe != null && shouldContinue(command, ioe)) {
continue;
}
command.setException(new HttpResponseException(e.getMessage() + " connecting to "
@@ -137,6 +141,20 @@ public abstract class BaseHttpCommandExecutorService<Q> implements HttpCommandEx
return shouldContinue;
}
+ boolean shouldContinue(HttpCommand command, IOException response) {
+ return isIdempotent(command) && ioRetryHandler.shouldRetryRequest(command, response);
+ }
+
+ private boolean isIdempotent(HttpCommand command) {
+ String method = command.getCurrentRequest().getMethod();
+ if (!IDEMPOTENT_METHODS.contains(method)) {
+ logger.error("Command not considered safe to retry because request method is %1$s: %2$s", method, command);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
protected abstract Q convert(HttpRequest request) throws IOException, InterruptedException;
protected abstract HttpResponse invoke(Q nativeRequest) throws IOException, InterruptedException;
http://git-wip-us.apache.org/repos/asf/jclouds/blob/41ff84bf/core/src/test/java/org/jclouds/http/internal/BaseHttpCommandExecutorServiceTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/http/internal/BaseHttpCommandExecutorServiceTest.java b/core/src/test/java/org/jclouds/http/internal/BaseHttpCommandExecutorServiceTest.java
index 8fa399e..ee951a5 100644
--- a/core/src/test/java/org/jclouds/http/internal/BaseHttpCommandExecutorServiceTest.java
+++ b/core/src/test/java/org/jclouds/http/internal/BaseHttpCommandExecutorServiceTest.java
@@ -27,6 +27,7 @@ import static org.jclouds.io.Payloads.newInputStreamPayload;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
import java.io.IOException;
import java.io.InputStream;
@@ -36,7 +37,9 @@ import javax.inject.Inject;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.jclouds.http.HttpCommand;
+import org.jclouds.http.HttpException;
import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.HttpUtils;
import org.jclouds.http.IOExceptionRetryHandler;
@@ -196,6 +199,41 @@ public class BaseHttpCommandExecutorServiceTest {
assertEquals(response.getPayload().openStream().read(), -1);
}
+ public void testDoNotRetryPostOnException() throws IOException {
+ helperRetryOnlyIdempotent("POST");
+ }
+
+ public void testRetryGetOnException() throws IOException {
+ helperRetryOnlyIdempotent("GET");
+ }
+
+ private void helperRetryOnlyIdempotent(String method) throws IOException {
+ final IOException error = new IOException("test exception");
+ HttpRequestFilter throwingFilter = new HttpRequestFilter() {
+ @Override
+ public HttpRequest filter(HttpRequest request) throws HttpException {
+ throw new HttpException(error);
+ }
+ };
+ HttpCommand command = new HttpCommand(HttpRequest.builder().endpoint("http://localhost").method(method).filter(throwingFilter).build());
+
+ IOExceptionRetryHandler ioRetryHandler = EasyMock.createMock(IOExceptionRetryHandler.class);
+
+ if ("GET".equals(method)) {
+ expect(ioRetryHandler.shouldRetryRequest(command, error)).andReturn(true);
+ expect(ioRetryHandler.shouldRetryRequest(command, error)).andReturn(false);
+ }
+ replay(ioRetryHandler);
+
+ BaseHttpCommandExecutorService<?> service = mockHttpCommandExecutorService(ioRetryHandler);
+ try {
+ service.invoke(command);
+ fail("Expected to fail due to throwing filter");
+ } catch (Exception e) {}
+
+ verify(ioRetryHandler);
+ }
+
private HttpCommand mockHttpCommand() {
return new HttpCommand(HttpRequest.builder().endpoint("http://localhost").method("mock").build());
}
@@ -215,6 +253,19 @@ public class BaseHttpCommandExecutorServiceTest {
return injector.getInstance(BaseHttpCommandExecutorService.class);
}
+ private BaseHttpCommandExecutorService<?> mockHttpCommandExecutorService(final IOExceptionRetryHandler ioRetryHandler) {
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ @Override
+ protected void configure() {
+ Names.bindProperties(binder(), BaseHttpApiMetadata.defaultProperties());
+ bind(IOExceptionRetryHandler.class).toInstance(ioRetryHandler);
+ bind(BaseHttpCommandExecutorService.class).to(MockHttpCommandExecutorService.class);
+ }
+ });
+
+ return injector.getInstance(BaseHttpCommandExecutorService.class);
+ }
+
private static class MockInputStream extends InputStream {
boolean isOpen = true;
int count;
[2/3] jclouds git commit: Make home folder globally accessible when
creating a user
Posted by na...@apache.org.
Make home folder globally accessible when creating a user
Certain hardened images will have "umask 0077" set for the root user, making the newly created /home/users folder inaccessible to non-root. This results in a failure when trying to ssh with the new account. Explicitly set permissions to be independent of default umask.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/caae63b9
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/caae63b9
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/caae63b9
Branch: refs/heads/1.9.x
Commit: caae63b93ee10d96800a74cfeb7dcfce5f25bfae
Parents: 41ff84b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Tue May 12 11:24:17 2015 +0300
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed May 13 22:44:18 2015 +0200
----------------------------------------------------------------------
.../callables/RunScriptOnNodeUsingSshTest.java | 4 +++-
.../src/test/resources/initscript_with_java.sh | 1 +
.../src/test/resources/initscript_with_jetty.sh | 1 +
.../src/test/resources/runscript_adminUpdate.sh | 1 +
.../scriptbuilder/statements/login/UserAdd.java | 5 ++++-
.../statements/login/UserAddTest.java | 20 ++++++++++----------
.../test/resources/test_adminaccess_flipped.sh | 1 +
.../test/resources/test_adminaccess_params.sh | 1 +
.../test_adminaccess_params_and_fullname.sh | 1 +
.../resources/test_adminaccess_plainuser.sh | 1 +
.../test/resources/test_adminaccess_standard.sh | 1 +
11 files changed, 25 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/compute/src/test/java/org/jclouds/compute/callables/RunScriptOnNodeUsingSshTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/callables/RunScriptOnNodeUsingSshTest.java b/compute/src/test/java/org/jclouds/compute/callables/RunScriptOnNodeUsingSshTest.java
index 671370a..701d277 100644
--- a/compute/src/test/java/org/jclouds/compute/callables/RunScriptOnNodeUsingSshTest.java
+++ b/compute/src/test/java/org/jclouds/compute/callables/RunScriptOnNodeUsingSshTest.java
@@ -121,7 +121,9 @@ public class RunScriptOnNodeUsingSshTest {
expect(sshClient.getUsername()).andReturn("tester");
expect(sshClient.getHostAddress()).andReturn("somewhere.example.com");
expect(
- sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n" + "mkdir -p /home/users\n"
+ sshClient.exec("sudo sh <<'RUN_SCRIPT_AS_ROOT_SSH'\n"
+ + "mkdir -p /home/users\n"
+ + "chmod 0755 /home/users\n"
+ "useradd -c testuser -s /bin/bash -m -d /home/users/testuser testuser\n"
+ "chown -R testuser /home/users/testuser\n" + "RUN_SCRIPT_AS_ROOT_SSH\n")).andReturn(
new ExecResponse("done", null, 0));
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/compute/src/test/resources/initscript_with_java.sh
----------------------------------------------------------------------
diff --git a/compute/src/test/resources/initscript_with_java.sh b/compute/src/test/resources/initscript_with_java.sh
index 6235861..f0b1480 100644
--- a/compute/src/test/resources/initscript_with_java.sh
+++ b/compute/src/test/resources/initscript_with_java.sh
@@ -209,6 +209,7 @@ END_OF_JCLOUDS_SCRIPT
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /home/users
+ chmod 0755 /home/users
groupadd -f wheel
useradd -c 'defaultAdminUsername' -s /bin/bash -g wheel -m -d /home/users/defaultAdminUsername -p 'crypt(randompassword)' defaultAdminUsername
mkdir -p /home/users/defaultAdminUsername/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/compute/src/test/resources/initscript_with_jetty.sh
----------------------------------------------------------------------
diff --git a/compute/src/test/resources/initscript_with_jetty.sh b/compute/src/test/resources/initscript_with_jetty.sh
index 469a446..ce5a6f4 100644
--- a/compute/src/test/resources/initscript_with_jetty.sh
+++ b/compute/src/test/resources/initscript_with_jetty.sh
@@ -209,6 +209,7 @@ END_OF_JCLOUDS_SCRIPT
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /home/users
+ chmod 0755 /home/users
groupadd -f wheel
useradd -c 'web' -s /bin/bash -g wheel -m -d /home/users/web -p 'crypt(randompassword)' web
mkdir -p /home/users/web/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/compute/src/test/resources/runscript_adminUpdate.sh
----------------------------------------------------------------------
diff --git a/compute/src/test/resources/runscript_adminUpdate.sh b/compute/src/test/resources/runscript_adminUpdate.sh
index f3aa82e..8c4d7c5 100644
--- a/compute/src/test/resources/runscript_adminUpdate.sh
+++ b/compute/src/test/resources/runscript_adminUpdate.sh
@@ -90,6 +90,7 @@ END_OF_JCLOUDS_SCRIPT
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /over/ridden
+ chmod 0755 /over/ridden
groupadd -f wheel
useradd -c 'foo' -s /bin/bash -g wheel -m -d /over/ridden/foo -p 'crypt(randompassword)' foo
mkdir -p /over/ridden/foo/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
index 2fac592..a134120 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/statements/login/UserAdd.java
@@ -186,9 +186,12 @@ public class UserAdd implements Statement {
if (family == OsFamily.WINDOWS)
throw new UnsupportedOperationException("windows not yet implemented");
String homeDir = (home != null) ? home : (defaultHome + '/' + login);
+ String usersDir = homeDir.substring(0, homeDir.lastIndexOf('/'));
ImmutableList.Builder<Statement> statements = ImmutableList.builder();
// useradd cannot create the default homedir
- statements.add(Statements.exec("{md} " + homeDir.substring(0, homeDir.lastIndexOf('/'))));
+ statements.add(Statements.exec("{md} " + usersDir));
+ // make sure the folder is globally accessible even with umask 0077
+ statements.add(Statements.exec("chmod 0755 " + usersDir));
ImmutableMap.Builder<String, String> userAddOptions = ImmutableMap.builder();
// Include the username as the full name for now.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
index fd53fcc..5322cca 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/statements/login/UserAddTest.java
@@ -29,29 +29,29 @@ public class UserAddTest {
public void testUNIX() {
assertEquals(UserAdd.builder().login("me").build().render(OsFamily.UNIX),
- "mkdir -p /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nchown -R me /home/users/me\n");
}
public void testWithFullNameUNIX() {
assertEquals(UserAdd.builder().login("me").fullName("JClouds Guy").build().render(OsFamily.UNIX),
- "mkdir -p /home/users\nuseradd -c 'JClouds Guy' -s /bin/bash -m -d /home/users/me me\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\nuseradd -c 'JClouds Guy' -s /bin/bash -m -d /home/users/me me\nchown -R me /home/users/me\n");
}
public void testWithBaseUNIX() {
assertEquals(UserAdd.builder().login("me").defaultHome("/export/home").build().render(OsFamily.UNIX),
- "mkdir -p /export/home\nuseradd -c me -s /bin/bash -m -d /export/home/me me\nchown -R me /export/home/me\n");
+ "mkdir -p /export/home\nchmod 0755 /export/home\nuseradd -c me -s /bin/bash -m -d /export/home/me me\nchown -R me /export/home/me\n");
}
public void testWithGroupUNIX() {
assertEquals(UserAdd.builder().login("me").group("wheel").build().render(OsFamily.UNIX),
- "mkdir -p /home/users\ngroupadd -f wheel\nuseradd -c me -s /bin/bash -g wheel -m -d /home/users/me me\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\ngroupadd -f wheel\nuseradd -c me -s /bin/bash -g wheel -m -d /home/users/me me\nchown -R me /home/users/me\n");
}
public void testWithGroupsUNIX() {
assertEquals(UserAdd.builder().login("me").groups(ImmutableList.of("wheel", "candy")).build().render(
OsFamily.UNIX),
- "mkdir -p /home/users\ngroupadd -f wheel\ngroupadd -f candy\nuseradd -c me -s /bin/bash -g wheel -G candy -m -d /home/users/me me\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\ngroupadd -f wheel\ngroupadd -f candy\nuseradd -c me -s /bin/bash -g wheel -G candy -m -d /home/users/me me\nchown -R me /home/users/me\n");
}
Function<String, String> crypt = new Function<String, String>() {
@@ -63,30 +63,30 @@ public class UserAddTest {
public void testWithPasswordUNIX() {
String userAdd = UserAdd.builder().cryptFunction(crypt).login("me").password("password").group("wheel").build().render(OsFamily.UNIX);
- assert userAdd.startsWith("mkdir -p /home/users\ngroupadd -f wheel\nuseradd -c me -s /bin/bash -g wheel -m -d /home/users/me -p 'CRYPT'") : userAdd;
+ assert userAdd.startsWith("mkdir -p /home/users\nchmod 0755 /home/users\ngroupadd -f wheel\nuseradd -c me -s /bin/bash -g wheel -m -d /home/users/me -p 'CRYPT'") : userAdd;
assert userAdd.endsWith("' me\nchown -R me /home/users/me\n") : userAdd;
}
public void testWithSshAuthorizedKeyUNIX() {
assertEquals(
UserAdd.builder().login("me").authorizeRSAPublicKey("rsapublickey").build().render(OsFamily.UNIX),
- "mkdir -p /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nmkdir -p /home/users/me/.ssh\ncat >> /home/users/me/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'\n\trsapublickey\nEND_OF_JCLOUDS_FILE\nchmod 600 /home/users/me/.ssh/authorized_keys\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nmkdir -p /home/users/me/.ssh\ncat >> /home/users/me/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'\n\trsapublickey\nEND_OF_JCLOUDS_FILE\nchmod 600 /home/users/me/.ssh/authorized_keys\nchown -R me /home/users/me\n");
}
public void testWithSshInstalledKeyUNIX() {
assertEquals(
UserAdd.builder().login("me").installRSAPrivateKey("rsaprivate").build().render(OsFamily.UNIX),
- "mkdir -p /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nmkdir -p /home/users/me/.ssh\nrm /home/users/me/.ssh/id_rsa\ncat >> /home/users/me/.ssh/id_rsa <<-'END_OF_JCLOUDS_FILE'\n\trsaprivate\nEND_OF_JCLOUDS_FILE\nchmod 600 /home/users/me/.ssh/id_rsa\nchown -R me /home/users/me\n");
+ "mkdir -p /home/users\nchmod 0755 /home/users\nuseradd -c me -s /bin/bash -m -d /home/users/me me\nmkdir -p /home/users/me/.ssh\nrm /home/users/me/.ssh/id_rsa\ncat >> /home/users/me/.ssh/id_rsa <<-'END_OF_JCLOUDS_FILE'\n\trsaprivate\nEND_OF_JCLOUDS_FILE\nchmod 600 /home/users/me/.ssh/id_rsa\nchown -R me /home/users/me\n");
}
public void testWithHomeUNIX() {
assertEquals(UserAdd.builder().login("me").home("/myhome/myme").build().render(
OsFamily.UNIX),
- "mkdir -p /myhome\nuseradd -c me -s /bin/bash -m -d /myhome/myme me\nchown -R me /myhome/myme\n");
+ "mkdir -p /myhome\nchmod 0755 /myhome\nuseradd -c me -s /bin/bash -m -d /myhome/myme me\nchown -R me /myhome/myme\n");
assertEquals(UserAdd.builder().login("me").home("/myhome/myme").defaultHome("/ignoreddefault").build().render(
OsFamily.UNIX),
- "mkdir -p /myhome\nuseradd -c me -s /bin/bash -m -d /myhome/myme me\nchown -R me /myhome/myme\n");
+ "mkdir -p /myhome\nchmod 0755 /myhome\nuseradd -c me -s /bin/bash -m -d /myhome/myme me\nchown -R me /myhome/myme\n");
}
@Test(expectedExceptions = UnsupportedOperationException.class)
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/resources/test_adminaccess_flipped.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_flipped.sh b/scriptbuilder/src/test/resources/test_adminaccess_flipped.sh
index b6fe4a9..7c7f9d8 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_flipped.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_flipped.sh
@@ -5,6 +5,7 @@ root ALL = (ALL) ALL
END_OF_FILE
chmod 0440 /etc/sudoers
mkdir -p /home/users
+chmod 0755 /home/users
groupadd -f wheel
useradd -c defaultAdminUsername -s /bin/bash -g wheel -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
mkdir -p /home/users/defaultAdminUsername/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/resources/test_adminaccess_params.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_params.sh b/scriptbuilder/src/test/resources/test_adminaccess_params.sh
index f867d1f..bdd99d1 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_params.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_params.sh
@@ -4,6 +4,7 @@ cat > /etc/sudoers <<-'END_OF_JCLOUDS_FILE'
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /over/ridden
+chmod 0755 /over/ridden
groupadd -f wheel
useradd -c 'foo' -s /bin/bash -g wheel -m -d /over/ridden/foo -p 'crypt(bar)' foo
mkdir -p /over/ridden/foo/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh b/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
index e01028f..aeec0ae 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_params_and_fullname.sh
@@ -4,6 +4,7 @@ cat > /etc/sudoers <<-'END_OF_JCLOUDS_FILE'
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /over/ridden
+chmod 0755 /over/ridden
groupadd -f wheel
useradd -c 'JClouds Foo' -s /bin/bash -g wheel -m -d /over/ridden/foo -p 'crypt(bar)' foo
mkdir -p /over/ridden/foo/.ssh
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh b/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
index 3939006..5583ab4 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_plainuser.sh
@@ -1,4 +1,5 @@
mkdir -p /home/users
+chmod 0755 /home/users
useradd -c 'defaultAdminUsername' -s /bin/bash -m -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
mkdir -p /home/users/defaultAdminUsername/.ssh
cat >> /home/users/defaultAdminUsername/.ssh/authorized_keys <<-'END_OF_JCLOUDS_FILE'
http://git-wip-us.apache.org/repos/asf/jclouds/blob/caae63b9/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_adminaccess_standard.sh b/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
index 34319c6..7f2e3c0 100644
--- a/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
+++ b/scriptbuilder/src/test/resources/test_adminaccess_standard.sh
@@ -4,6 +4,7 @@ cat > /etc/sudoers <<-'END_OF_JCLOUDS_FILE'
END_OF_JCLOUDS_FILE
chmod 0440 /etc/sudoers
mkdir -p /home/users
+chmod 0755 /home/users
groupadd -f wheel
useradd -c 'defaultAdminUsername' -s /bin/bash -g wheel -m -d /home/users/defaultAdminUsername -p 'crypt(0)' defaultAdminUsername
mkdir -p /home/users/defaultAdminUsername/.ssh
[3/3] jclouds git commit: Skip malformed image entries returned by
Softlayer
Posted by na...@apache.org.
Skip malformed image entries returned by Softlayer
Softlayer will occasionally return an incomplete object in the getCreateObjectOptions call, making it impossible to spin up machines - ignore the incomplete entries which are usually not even relevant.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/6c9915ea
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/6c9915ea
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/6c9915ea
Branch: refs/heads/1.9.x
Commit: 6c9915eab984d81cc6fc8d9cc51bbf2add0db8de
Parents: caae63b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Mon May 11 18:33:57 2015 +0300
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed May 13 22:44:24 2015 +0200
----------------------------------------------------------------------
.../ContainerVirtualGuestConfiguration.java | 20 ++++--
.../ContainerVirtualGuestConfigurationTest.java | 75 ++++++++++++++++++++
2 files changed, 88 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/6c9915ea/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfiguration.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfiguration.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfiguration.java
index 6834d31..09bb0de 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfiguration.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfiguration.java
@@ -19,6 +19,7 @@ package org.jclouds.softlayer.domain;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -202,16 +203,21 @@ public class ContainerVirtualGuestConfiguration {
}
public Set<OperatingSystem> getVirtualGuestOperatingSystems() {
- return Sets.newHashSet(Iterables.transform(operatingSystems,
- new Function<ContainerVirtualGuestConfigurationOption, OperatingSystem>() {
+ return Sets.newHashSet(FluentIterable.from(operatingSystems)
+ .transform(new Function<ContainerVirtualGuestConfigurationOption, OperatingSystem>() {
@Override
public OperatingSystem apply(ContainerVirtualGuestConfigurationOption input) {
- return OperatingSystem.builder()
- .id(input.getTemplate().getOperatingSystemReferenceCode())
- .operatingSystemReferenceCode(input.getTemplate().getOperatingSystemReferenceCode())
- .build();
+ String operatingSystemReferenceCode = input.getTemplate().getOperatingSystemReferenceCode();
+ if (operatingSystemReferenceCode == null) {
+ return null;
+ } else {
+ return OperatingSystem.builder()
+ .id(operatingSystemReferenceCode)
+ .operatingSystemReferenceCode(operatingSystemReferenceCode)
+ .build();
+ }
}
- }));
+ }).filter(Predicates.notNull()));
}
public Set<VirtualGuestBlockDevice> getVirtualGuestBlockDevices() {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/6c9915ea/providers/softlayer/src/test/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfigurationTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfigurationTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfigurationTest.java
new file mode 100644
index 0000000..5944465
--- /dev/null
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/domain/ContainerVirtualGuestConfigurationTest.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.softlayer.domain;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+@Test(groups = "unit")
+public class ContainerVirtualGuestConfigurationTest {
+ @Test
+ public void testGetVirtualGuestOperatingSystemsWithMissingReferenceCode() {
+ // Malformed response leading to failure:
+ // {
+ // "itemPrice": {
+ // "hourlyRecurringFee": ".131",
+ // "item": {
+ // "description": "Windows Server 2012 Datacenter Edition (64bit)"
+ // },
+ // "recurringFee": "90.63"
+ // },
+ // "template": {
+ // "id": null
+ // missing operatingSystemReferenceCode entry!
+ // }
+ // },
+
+ ContainerVirtualGuestConfigurationOption osValid = ContainerVirtualGuestConfigurationOption.builder()
+ .productItemPrice(ProductItemPrice.builder()
+ .hourlyRecurringFee(0)
+ .recurringFee("0")
+ .item(ProductItem.builder().description("CentOS - Latest").build())
+ .build())
+ .template(VirtualGuest.builder().operatingSystemReferenceCode("CENTOS_LATEST").build())
+ .build();
+ ContainerVirtualGuestConfigurationOption osInvalid = ContainerVirtualGuestConfigurationOption.builder()
+ .productItemPrice(ProductItemPrice.builder()
+ .hourlyRecurringFee(0.131f)
+ .recurringFee("90.63")
+ .item(ProductItem.builder().description("Windows Server 2012 Datacenter Edition (64bit)").build())
+ .build())
+ .template(VirtualGuest.builder().build())
+ .build();
+ ContainerVirtualGuestConfiguration conf = ContainerVirtualGuestConfiguration.builder()
+ .blockDevices(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of())
+ .datacenters(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of())
+ .memory(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of())
+ .networkComponents(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of())
+ .operatingSystems(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of(osValid, osInvalid))
+ .processors(ImmutableSet.<ContainerVirtualGuestConfigurationOption>of())
+ .build();
+ Set<OperatingSystem> virtualGuestOperatingSystems = conf.getVirtualGuestOperatingSystems();
+ OperatingSystem os = Iterables.getOnlyElement(virtualGuestOperatingSystems);
+ assertEquals(os.getOperatingSystemReferenceCode(), osValid.getTemplate().getOperatingSystemReferenceCode());
+ }
+}