diff --git a/docker.sh b/docker.sh index ccd396c5..4d2401e1 100755 --- a/docker.sh +++ b/docker.sh @@ -90,6 +90,57 @@ declare_if_inside_docker(){ fi } +docker_compose_path_version(){ + local path="$1" + local dir_base="$2" + if [ -z "${DOCKER_SERVICE:-}" ]; then + echo "Error: \$DOCKER_SERVICE has not been set in environment yet, was check_docker_available() called first?" + exit 1 + fi + set +e + local version="$(docker-compose exec "$DOCKER_SERVICE" ls "$path" -1 --color=no | + grep --color=no -- "$dir_base" | + tr -d '\r' | + tee /dev/stderr | + tail -n 1 | + sed "s/$dir_base//" + )" + set -e + if [ -z "$version" ]; then + echo "Error: failed to find docker compose path version from path $path for $dir_base!" + exit 1 + fi + echo "$version" +} + +docker_compose_version_test(){ + local name="${1:-}" + local version="${2:-}" + if [ -z "$name" ]; then + "ERROR: missing first arg for name to docker_compose_version_test()" + exit 1 + fi + if [ -z "$version" ]; then + "ERROR: missing second arg for version to docker_compose_version_test()" + exit 1 + fi + if [ "$version" = "latest" ]; then + echo "latest version, fetching latest version from DockerHub master branch" + local version="$(dockerhub_latest_version "$name")" + echo "expecting version '$version'" + fi + hr + found_version="$(docker_compose_path_version / "$name"-)" + echo "found $name version $found_version" + hr + if [[ "$found_version" =~ $version* ]]; then + echo "$name docker version matches expected (found '$found_version', expected '$version')" + else + echo "Docker container version does not match expected version! (found '$found_version', expected '$version')" + exit 1 + fi +} + docker_compose_port(){ local env_var="${1:-}" local name="${2:-}" @@ -140,7 +191,7 @@ dockerhub_latest_version(){ echo "Error: no repo passed to dockerhub_latest_version for first arg" fi set +e - local version="$(curl -s "https://raw.githubusercontent.com/HariSekhon/Dockerfiles/master/$repo/Dockerfile" | awk -F= '/^ARG[[:space:]]+[A-Za-z_]+_VERSION=/ {print $2; exit}')" + local version="$(curl -s "https://raw.githubusercontent.com/HariSekhon/Dockerfiles/master/$repo/Dockerfile" | awk -F= '/^ARG[[:space:]]+[A-Za-z0-9_]+_VERSION=/ {print $2; exit}')" set -e if [ -z "$version" ]; then version='.*' diff --git a/utils.sh b/utils.sh index ff26b875..47e268bf 100755 --- a/utils.sh +++ b/utils.sh @@ -244,7 +244,7 @@ print_debug_env(){ #eval echo "export ${name}_PORT=$`echo ${name}_PORT`" # instead of just name_PORT, find all PORTS in environment and print them # while read line to preserve CASSANDRA_PORTS=7199 9042 - env | egrep "^$name.*_" | grep -v -e 'DEFAULT$' -e 'VERSIONS$' | sort | while read env_var; do + env | egrep "^$name.*_" | grep -v -e 'DEFAULT=' -e 'VERSIONS=' | sort | while read env_var; do # sed here to quote export CASSANDRA_PORTS=7199 9042 => export CASSANDRA_PORTS="7199 9042" eval echo "'export $env_var'" | sed 's/=/="/;s/$/"/' done @@ -575,6 +575,11 @@ retry(){ else sleep_secs=1 fi + local negate="" + if [ "$1" == '!' ]; then + negate=1 + shift + fi local cmd="${@:-}" if [ -z "$cmd" ]; then echo "ERROR: no command passed to retry() for \$3" @@ -586,8 +591,13 @@ retry(){ while true; do let try_number+=1 echo -n "try $try_number: " - if $cmd; then - timestamp "Succeeded after $SECONDS secs" + if [ -n "$negate" ]; then + if ! $cmd; then + timestamp "Command failed after $SECONDS secs" + break + fi + elif $cmd; then + timestamp "Command succeeded after $SECONDS secs" break fi if [ $SECONDS -gt $max_secs ]; then