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());
+   }
+}