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 2016/07/07 14:10:42 UTC

jclouds git commit: Add a statement to wait for APT

Repository: jclouds
Updated Branches:
  refs/heads/lockfile [created] 7295d318b


Add a statement to wait for APT

Some providers perform package manager actions just after booting, and
that can conflict with the scripts jclouds runs. This statement can be
used to monitor the presence of apt or other lock files, and be able to
wait until those locks are gone.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/7295d318
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/7295d318
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/7295d318

Branch: refs/heads/lockfile
Commit: 7295d318bc2402f2d10991d1fbbd011a1e571414
Parents: 6bff97b
Author: Ignasi Barrera <na...@apache.org>
Authored: Wed Jun 15 23:15:59 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Jul 7 16:10:30 2016 +0200

----------------------------------------------------------------------
 .../jclouds/scriptbuilder/ScriptBuilder.java    |  4 +++
 .../scriptbuilder/domain/Statements.java        | 10 +++++++
 .../src/main/resources/functions/waitForApt.sh  | 28 ++++++++++++++++++++
 .../scriptbuilder/ScriptBuilderTest.java        | 10 +++++++
 .../src/test/resources/test_wait_for_apt.sh     | 24 +++++++++++++++++
 5 files changed, 76 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/7295d318/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/ScriptBuilder.java
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/ScriptBuilder.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/ScriptBuilder.java
index 8f4552d..b3864fb 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/ScriptBuilder.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/ScriptBuilder.java
@@ -89,6 +89,10 @@ public class ScriptBuilder implements Statement, AcceptsStatementVisitor {
       return new ExitInsteadOfReturn(Statements.findPid(pid));
    }
 
+   public static Statement waitForApt(int timeoutSeconds) {
+      return new ExitInsteadOfReturn(Statements.waitForApt(timeoutSeconds));
+   }
+
    public static Statement call(String fn, String... args) {
       return new ExitInsteadOfReturn(Statements.call(fn, args));
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7295d318/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/Statements.java
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/Statements.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/Statements.java
index aa64d1b..56aad05 100644
--- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/Statements.java
+++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/Statements.java
@@ -125,6 +125,16 @@ public class Statements {
    }
 
    /**
+    * Waits until the APT is ready (no other processes are using it) or the
+    * timeout is reached.
+    * 
+    * @param timeoutSeconds The timeout in seconds (defaults to 10).
+    */
+   public static Statement waitForApt(int timeoutSeconds) {
+      return new Call("waitForApt", String.valueOf(timeoutSeconds));
+   }
+
+   /**
     * Kills the pid and subprocesses related to the variable {@code FOUND_PID}
     * if set.
     * 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7295d318/scriptbuilder/src/main/resources/functions/waitForApt.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/main/resources/functions/waitForApt.sh b/scriptbuilder/src/main/resources/functions/waitForApt.sh
new file mode 100644
index 0000000..b0a4222
--- /dev/null
+++ b/scriptbuilder/src/main/resources/functions/waitForApt.sh
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+function waitForApt {
+    local wait_seconds="${2:-10}" # 10 seconds as default timeout
+    echo "Wait for apt to be ready..."
+    while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
+        if [ $((wait_seconds--)) -eq 0 ]; then
+            echo "Wait timeout exceeded. Giving up."
+            return 1
+        fi
+        sleep 1
+    done
+    return 0
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7295d318/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
index fc154af..f75d9f4 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
@@ -18,6 +18,7 @@ package org.jclouds.scriptbuilder;
 
 import static org.jclouds.scriptbuilder.ScriptBuilder.call;
 import static org.jclouds.scriptbuilder.ScriptBuilder.findPid;
+import static org.jclouds.scriptbuilder.ScriptBuilder.waitForApt;
 import static org.jclouds.scriptbuilder.domain.Statements.appendFile;
 import static org.jclouds.scriptbuilder.domain.Statements.interpret;
 import static org.jclouds.scriptbuilder.domain.Statements.kill;
@@ -93,6 +94,15 @@ public class ScriptBuilderTest {
             Resources.toString(Resources.getResource("test_find_pid." + ShellToken.SH.to(OsFamily.UNIX)), Charsets.UTF_8));
    }
 
+   ScriptBuilder waitForAptBuilder = new ScriptBuilder().addStatement(waitForApt(10));
+
+   @Test
+   public void testWaitForApt() throws MalformedURLException, IOException {
+      assertEquals(
+            waitForAptBuilder.render(OsFamily.UNIX),
+            Resources.toString(Resources.getResource("test_wait_for_apt." + ShellToken.SH.to(OsFamily.UNIX)), Charsets.UTF_8));
+   }
+
    ScriptBuilder seekAndDestroyBuilder = new ScriptBuilder().addStatement(findPid("{args}")).addStatement(kill());
 
    @Test

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7295d318/scriptbuilder/src/test/resources/test_wait_for_apt.sh
----------------------------------------------------------------------
diff --git a/scriptbuilder/src/test/resources/test_wait_for_apt.sh b/scriptbuilder/src/test/resources/test_wait_for_apt.sh
new file mode 100644
index 0000000..1d7934c
--- /dev/null
+++ b/scriptbuilder/src/test/resources/test_wait_for_apt.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+set +u
+shopt -s xpg_echo
+shopt -s expand_aliases
+unset PATH JAVA_HOME LD_LIBRARY_PATH
+function abort {
+   echo "aborting: $@" 1>&2
+   exit 1
+}
+function waitForApt {
+    local wait_seconds="${2:-10}" # 10 seconds as default timeout
+    echo "Wait for apt to be ready..."
+    while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
+        if [ $((wait_seconds--)) -eq 0 ]; then
+            echo "Wait timeout exceeded. Giving up."
+            return 1
+        fi
+        sleep 1
+    done
+    return 0
+}
+export PATH=/usr/ucb/bin:/bin:/sbin:/usr/bin:/usr/sbin
+waitForApt 10 || exit 1
+exit $?