| #!/bin/bash |
| |
| XFSTESTS_FLAVOR=gce |
| RUN_ON_LTM= |
| RUN_ON_KCS= |
| GCE_IMAGE_PROJECT= |
| t=$(echo ${XFSTESTS_FLAVOR}_xfstests_dir | tr "[:lower:]" "[:upper:]") |
| eval DIR="\$$t" |
| if test -z "$DIR" |
| then |
| DIR="$(dirname "$(readlink -f "$0")")" |
| fi |
| if test ! -f "$DIR/util/get-config" |
| then |
| echo "$(basename "$0"): couldn't find $DIR/util/get-config" |
| exit 1 |
| fi |
| |
| . "$DIR/util/get-config" |
| . "$DIR/util/parse_opt_funcs" |
| . "$DIR/util/arch-funcs" |
| |
| if test -z "$GS_BUCKET" -o -z "$GCE_PROJECT" -o -z "$GCE_ZONE" |
| then |
| echo "You must configure GS_BUCKET, GCE_PROJECT, and GCE_ZONE in" |
| echo "your config file" |
| exit 1 |
| fi |
| |
| QUIET="quiet loglevel=0" |
| KERNEL="$GCE_KERNEL" |
| |
| get_local_hash() |
| { |
| LOCAL_HASH=$(gsutil hash "$1" 2> /dev/null | grep "Hash (md5)" \ |
| | awk '{print $3}') |
| } |
| |
| get_remote_hash() |
| { |
| REMOTE_HASH=$(gsutil stat "$1" 2> /dev/null | grep "Hash (md5)" \ |
| | awk '{print $3}') |
| } |
| |
| verify_single_uri() |
| { |
| if test -z "$URI" |
| then |
| echo "No results found with identifier: $1" |
| exit 1 |
| elif [[ "$URI" =~ [[:space:]] ]]; then |
| echo "Results identifier $1 is ambiguous." |
| echo "Please clarify from the following matches:" |
| echo "$URI" |
| exit 1 |
| fi |
| } |
| |
| do_get_results_uri() |
| { |
| case "$1" in |
| gs://*) |
| URI="$1" |
| ;; |
| */*) |
| # SUBDIR is everything before slash |
| SUBDIR=$(echo $1 | sed -e "s;/.*;;") |
| # RESULTS_NAME is everything after slash |
| RESULTS_NAME=$(echo $1 | sed -e "s;.*/;;") |
| URI=$(gsutil ls "gs://$GS_BUCKET/${SUBDIR:-results}/$RESULTS_NAME" \ |
| 2>/dev/null) |
| verify_single_uri $1 |
| ;; |
| results*) |
| # try in all subdirs |
| URI=$(gsutil ls "gs://$GS_BUCKET/**$1" 2>/dev/null) |
| verify_single_uri $1 |
| ;; |
| *) |
| # try in all subdirs |
| URI=$(gsutil ls "gs://$GS_BUCKET/**results.$1.*.tar.xz" \ |
| 2>/dev/null) |
| verify_single_uri $1 |
| ;; |
| esac |
| } |
| |
| do_get_results() |
| { |
| do_get_results_uri "$1" |
| TARBALL=/tmp/$(basename "$URI") |
| if test -n "$do_checksum" |
| then |
| get_local_hash "$TARBALL" |
| get_remote_hash "$URI" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| $NO_ACTION gsutil cp "$URI" "$TARBALL" 2> /dev/null |
| fi |
| else |
| if ! test -f "$TARBALL" |
| then |
| $NO_ACTION gsutil cp "$URI" "$TARBALL" 2> /dev/null |
| fi |
| fi |
| if test -n "$NO_ACTION" ; then |
| exit 0 |
| fi |
| if ! test -f "$TARBALL" |
| then |
| echo "Couldn't download $TARBALL from $URI" |
| return 1 |
| fi |
| if test -n "$do_unpack" |
| then |
| DIRNAME="$unpack_dir"/$(basename "$URI" | sed -e 's/\(results.[0-9A-Za-z-]*\).*/\1/' -e s'/\./-/') |
| /bin/rm -rf "$DIRNAME" 2> /dev/null |
| mkdir -p "$DIRNAME" |
| xzcat < "$TARBALL" | tar -C "$DIRNAME" -xf - |
| echo "Unpacked results at $DIRNAME" |
| elif test -n "$get_syslog" |
| then |
| xzcat < "$TARBALL" | tar -Oxf - ./syslog |
| elif test -n "$do_summary" |
| then |
| xzcat < "$TARBALL" | tar -Oxf - ./runtests.log | \ |
| "$DIR/get-results" "$do_summary" - |
| else |
| xzcat < "$TARBALL" | tar -Oxf - ./runtests.log |
| fi |
| if test -n "$do_nocache" -o -n "$do_unpack" |
| then |
| rm "$TARBALL" |
| fi |
| return 0 |
| } |
| |
| get_gce_zone() |
| { |
| local z |
| |
| case "$1" in |
| xfstests-ltm-*) |
| ;; |
| xfstests-*) |
| echo "$GCE_ZONE" |
| return |
| ;; |
| esac |
| z=$(run_gcloud_always compute instances list \ |
| --filter="name <= $1 AND name >= $1" --format="value(zone)") |
| if test -z "$z" ; then |
| z="$GCE_ZONE" |
| fi |
| echo "$z" |
| } |
| |
| get_gce_zone_disk() |
| { |
| local z |
| |
| case "$1" in |
| xfstests-ltm-*) |
| ;; |
| xfstests-*) |
| echo "$GCE_ZONE" |
| return |
| ;; |
| esac |
| z=$(run_gcloud_always compute disks list \ |
| --filter="name <= $1 AND name >= $1" --format="value(zone)") |
| if test -z "$z" ; then |
| z="$GCE_ZONE" |
| fi |
| echo "$z" |
| } |
| |
| function get_machtype_file() { |
| if [ ! -r $GCE_MACHTYPE_FILE ] || |
| [[ $(find "$GCE_MACHTYPE_FILE" -mtime +28 -print 2> /dev/null) ]]; then |
| local NEW_GCE_MACHTYPE_FILE=$GCE_CACHE_DIR/machtype_file.$$ |
| |
| run_gcloud_always compute machine-types list | sed -e 1d | \ |
| awk '{print $1, $2, $3, int(0.5 + ($4 * 1024))}' > \ |
| $NEW_GCE_MACHTYPE_FILE |
| else |
| return |
| fi |
| if [ ! -r $GCE_MACHTYPE_FILE ] || |
| [[ $(find "$GCE_MACHTYPE_FILE" -mtime +28 -print 2> /dev/null) ]]; then |
| mv $NEW_GCE_MACHTYPE_FILE $GCE_MACHTYPE_FILE |
| else |
| rm $NEW_GCE_MACHTYPE_FILE |
| fi |
| } |
| |
| if test "$1" = "--no-action" ; then |
| NO_ACTION="echo" |
| shift |
| fi |
| |
| unset TESTRUNID |
| case "$1" in |
| ls|ls-instances) |
| if test "$2" = "--gce" |
| then |
| run_gcloud compute instances list |
| exit 0 |
| fi |
| inst_info=$(mktemp) |
| run_gcloud_always compute instances list --format="value(name,zone)" | \ |
| while read -r i z |
| do |
| run_gcloud compute instances describe \ |
| --zone "$z" "$i" --format=json > "$inst_info" |
| kver=$(jq < "$inst_info" 2> /dev/null \ |
| '.metadata.items[] | select(.key == "kernel_version") | .value' | \ |
| sed -e 's/^"//' -e 's/"$//' \ |
| -e 's/^Linux xfstests-[0-9A-Za-z-]* //' -e 's/ .*//') |
| gce_status=$(jq < "$inst_info" .status | \ |
| sed -e 's/^"//' -e 's/"$//') |
| status=$(jq < "$inst_info" 2> /dev/null \ |
| '.metadata.items[] | select(.key == "status") | .value' | \ |
| sed -e 's/^"//' -e 's/"$//') |
| ip=$(jq < "$inst_info" 2> /dev/null \ |
| '.networkInterfaces[] | .accessConfigs[] | select(.name == "external-nat") | .natIP' | \ |
| sed -e 's/^"//' -e 's/"$//') |
| echo "$i $ip - $kver - $status - $gce_status" |
| done |
| rm "$inst_info" |
| exit 0 |
| ;; |
| rm|rm-instances|abort|abort-instances) |
| if test "$1" = "abort" |
| then |
| deldisks="--delete-disks all" |
| fi |
| shift |
| |
| bg="&" |
| if test "$1" = "--wait" |
| then |
| bg= |
| shift |
| fi |
| |
| for i in "$@" |
| do |
| if test -n "$deldisks" |
| then |
| reason="abort" |
| else |
| reason="manual stop" |
| fi |
| zone=$(get_gce_zone "$i") |
| run_gcloud compute -q instances add-metadata "$i" \ |
| --metadata "shutdown_reason=$reason" \ |
| --zone "$zone" > /dev/null |
| eval run_gcloud compute -q instances delete "$i" \ |
| --zone "$zone" $deldisks $bg |
| done |
| exit 0 |
| ;; |
| start|start-instance|start-instances) |
| shift |
| for i in "$@" |
| do |
| run_gcloud compute -q instances start "$i" \ |
| --zone $(get_gce_zone "$i") & |
| done |
| exit 0 |
| ;; |
| stop|stop-instance|stop-instances) |
| shift |
| for i in "$@" |
| do |
| run_gcloud compute -q instances stop "$i" \ |
| --zone $(get_gce_zone "$i") & |
| done |
| exit 0 |
| ;; |
| simulate-maintenance-event) |
| shift |
| for i in "$@" |
| do |
| run_gcloud compute -q instances simulate-maintenance-event "$i" \ |
| --zone $(get_gce_zone "$i") & |
| done |
| exit 0 |
| ;; |
| ls-disks|ls-disk) |
| run_gcloud compute disks list |
| exit $? |
| ;; |
| rm-disks|rm-disk) |
| shift |
| case "$1" in |
| --zone) shift |
| zone=$1 |
| shift ;; |
| esac |
| if test -n "$zone" ; then |
| GCE_ZONE="$zone" |
| else |
| GCE_ZONE=$(get_gce_zone_disk "$1") |
| fi |
| run_gcloud compute disks delete "$@" --zone $GCE_ZONE |
| exit $? |
| ;; |
| ls-images) |
| shift |
| case $1 in |
| --project | --image-project) shift |
| GCE_PROJECT=$1 |
| shift ;; |
| esac |
| run_gcloud compute images list --no-standard-images |
| exit $? |
| ;; |
| rm-images) |
| shift |
| case $1 in |
| --project) shift |
| GCE_PROJECT=$1 |
| shift ;; |
| esac |
| run_gcloud compute images delete "$@" |
| exit $? |
| ;; |
| ls-results|ls-gcs) |
| if test "$1" = "ls-gcs" |
| then |
| do_all=yes |
| fi |
| shift |
| case $1 in |
| --bucket-subdir) shift |
| BUCKET_SUBDIR=$1 |
| shift ;; |
| esac |
| for i in "$@" |
| do |
| case $i in |
| --all|-a) |
| do_all=yes |
| ;; |
| -*) |
| opt="$opt $i" |
| ;; |
| *) |
| arg="$arg gs://$GS_BUCKET/$i" |
| ;; |
| esac |
| done |
| if test -z "$arg" |
| then |
| if test -n "$do_all" |
| then |
| arg="gs://$GS_BUCKET/**results*" |
| else |
| arg="gs://$GS_BUCKET/results/results*" |
| fi |
| fi |
| $NO_ACTION gsutil ls $opt "$arg" |
| exit $? |
| ;; |
| rm-results|rm-gcs) |
| shift |
| case $1 in |
| --bucket-subdir) shift |
| BUCKET_SUBDIR=$1 |
| shift ;; |
| esac |
| for i in "$@" |
| do |
| do_get_results_uri "$i" |
| gsutil rm "$URI" |
| if test -n "$GCE_UPLOAD_SUMMARY" |
| then |
| URI=$(echo $URI | sed -e "s;results\.;summary.;" | \ |
| sed -e "s;\.tar\.xz;.txt;") |
| $NO_ACTION gsutil rm "$URI" 2> /dev/null |
| fi |
| done |
| exit 0 |
| ;; |
| get-bucket) |
| echo gs://"$GS_BUCKET" |
| exit 0 |
| ;; |
| get-kernel-arch) shift |
| get_kernel_file_info "$1" |
| echo $KERNEL_ARCH |
| exit 0 |
| ;; |
| get-kernel-version) shift |
| get_kernel_file_info "$1" |
| echo $KERNEL_VERSION |
| exit 0 |
| ;; |
| get-kernel-info) shift |
| get_kernel_file_info "$1" |
| echo KERNEL_ARCH="$KERNEL_ARCH" |
| echo KERNEL_VERSION="$KERNEL_VERSION" |
| exit 0 |
| ;; |
| get-results) |
| shift |
| ret=0 |
| while (( $# >= 1 )); do |
| case $1 in |
| --bucket-subdir) shift |
| BUCKET_SUBDIR=$1 |
| ;; |
| --checksum|-c) |
| do_checksum=yes |
| ;; |
| --syslog) |
| get_syslog=yes |
| ;; |
| --unpack) |
| unpack_dir="/tmp" |
| do_unpack=yes |
| ;; |
| --unpack-dir) shift |
| unpack_dir="$1" |
| do_unpack=yes |
| ;; |
| --summary|-s) |
| do_summary="-s" |
| ;; |
| --failures|-F) |
| do_summary="-F" |
| ;; |
| --no-cache) |
| do_nocache=yes |
| ;; |
| *) |
| if ! do_get_results "$1" |
| then |
| ret=1 |
| fi |
| esac |
| shift |
| done |
| exit $ret |
| ;; |
| setup) |
| shift |
| export GCE_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-do-setup" "$@" |
| exit $? |
| ;; |
| ssh) |
| # gce-xfstests ssh --user <user> <host> -- <cmd> |
| user=root |
| shift |
| while (( $# >= 1 )); do |
| case $1 in |
| --user|-u) shift |
| user="$1" |
| echo "user=$user" |
| ;; |
| --) shift |
| ssh_cmd="$@" |
| CMD="--command=" |
| break |
| ;; |
| -*) echo "Unknown option $1" |
| exit 1 |
| ;; |
| *) host="$1" |
| ;; |
| esac |
| shift |
| done |
| |
| # ssh_cmd must be quoted but passing "" when there is no command |
| # causes gcloud to complain (even if --command= lumped into ssh_cmd) |
| if test -n "$ssh_cmd"; then |
| run_gcloud compute -q ssh $user@"$host" \ |
| --zone $(get_gce_zone $host) $RUN_INTERNAL --command="$ssh_cmd" |
| exit $? |
| fi |
| |
| run_gcloud compute -q ssh $user@"$host" \ |
| --zone $(get_gce_zone $host) $RUN_INTERNAL |
| exit $? |
| ;; |
| scp) |
| SRC="$2" |
| DEST="$3" |
| |
| if [[ "$2" =~ "@" ]]; then |
| SCP_VM="$2" |
| elif [[ "$3" =~ "@" ]]; then |
| SCP_VM="$3" |
| else |
| echo "Could not find VM name" |
| exit 1 |
| fi |
| |
| # right now, SCP_VM will look something like root@xfstests:~/file |
| SCP_VM=$(echo "${SCP_VM##*@}") # remote username before '@' |
| SCP_VM=$(echo "${SCP_VM%%:*}") # remote file after ':' |
| |
| run_gcloud compute -q scp "$2" "$3" \ |
| --zone $(get_gce_zone "$SCP_VM") $RUN_INTERNAL |
| exit $? |
| ;; |
| console) |
| run_gcloud compute -q instances \ |
| get-serial-port-output "$2" --zone $(get_gce_zone "$2") |
| exit $? |
| ;; |
| enable-serial) |
| run_gcloud compute \ |
| instances add-metadata --zone $(get_gce_zone "$2") "$2" \ |
| --metadata serial-port-enable=true |
| exit $? |
| ;; |
| disable-serial) |
| run_gcloud compute \ |
| instances add-metadata --zone $(get_gce_zone "$2") "$2" \ |
| --metadata serial-port-enable=false |
| exit $? |
| ;; |
| describe-vm) |
| run_gcloud compute \ |
| instances describe --zone $(get_gce_zone "$2") "$2" |
| exit $? |
| ;; |
| describe-image) |
| if test -z "$2" ; then |
| if test "$IMAGE_FLAG" = "--image-family" ; then |
| run_gcloud compute images describe-from-family "$ROOT_FS" |
| else |
| run_gcloud compute images describe "$ROOT_FS" |
| fi |
| fi |
| run_gcloud compute images describe "$2" |
| exit $? |
| ;; |
| describe-disk) |
| run_gcloud compute \ |
| disks describe --zone $(get_gce_zone_disk "$2") "$2" |
| exit $? |
| ;; |
| serial) |
| case "$GCE_SERIAL_PORT_DEFAULT" in |
| [1234]) |
| PORT="--port $GCE_SERIAL_PORT_DEFAULT" |
| ;; |
| esac |
| if test "$2" == "--port" |
| then |
| shift |
| PORT="--port $2" |
| shift |
| fi |
| run_gcloud compute -q \ |
| connect-to-serial-port --zone $(get_gce_zone "$2") $PORT "$2" |
| exit $? |
| ;; |
| create-image) |
| shift |
| if test ! -x "$DIR/../test-appliance/gce-create-image" |
| then |
| echo "Image creation not supported in this installation" |
| exit 1 |
| fi |
| export GCE_PROJECT |
| export GCE_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/../test-appliance/gce-create-image" "$@" |
| exit $? |
| ;; |
| export-image) |
| shift |
| if test ! -x "$DIR/util/gce-export-image" |
| then |
| echo "Image export not supported in this installation" |
| exit 1 |
| fi |
| export GCE_PROJECT |
| export GCE_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-export-image" "$@" |
| exit $? |
| ;; |
| import-image) |
| shift |
| if test ! -x "$DIR/util/gce-import-image" |
| then |
| echo "Image import not supported in this installation" |
| exit 1 |
| fi |
| export GCE_PROJECT |
| export GCE_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-import-image" "$@" |
| exit $? |
| ;; |
| copy-image) |
| shift |
| if test ! -x "$DIR/util/gce-copy-image" |
| then |
| echo "Image copy not supported in this installation" |
| exit 1 |
| fi |
| export GCE_PROJECT |
| export GCE_XFSTESTS_DIR="$DIR" |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-copy-image" "$@" |
| exit $? |
| ;; |
| install-kconfig) |
| shift |
| if test ! -x "$KBUILD_DIR/install-kconfig" |
| then |
| echo "Kernel configuration not supported in this installation" |
| exit 1 |
| fi |
| "$KBUILD_DIR/install-kconfig" "$@" |
| exit $? |
| ;; |
| kbuild) |
| shift |
| if test ! -x "$KBUILD_DIR/kbuild" |
| then |
| echo "kbuild not supported in this installation" |
| exit 1 |
| fi |
| "$KBUILD_DIR/kbuild" "$@" |
| exit $? |
| ;; |
| upload-kernel) |
| shift |
| set_default_arch |
| while (( $# >= 1 )); do |
| case $1 in |
| --no-action) |
| NO_ACTION="echo " |
| ;; |
| --arch) |
| shift |
| ARCH="$1" |
| ;; |
| --arm64) |
| ARCH="arm64" |
| ;; |
| --i386) |
| ARCH="i386" |
| ;; |
| --kernel) shift |
| KERNEL="$1" |
| OVERRIDE_KERNEL="$KERNEL" |
| ;; |
| --gs-bucket) shift |
| GS_BUCKET="$1" |
| if ! gsutil ls -b "gs://$GS_BUCKET" > /dev/null ; then |
| echo -e "Invalid Cloud Storage Bucket: $GS_BUCKET\n" |
| exit 1 |
| fi |
| ;; |
| *) |
| break |
| ;; |
| esac |
| shift |
| done |
| set_canonicalized_arch "$ARCH" |
| find_kernel_to_use |
| if test -n "$1" ; then |
| case "$1" in |
| gs://*) |
| GS_KERNEL="$1" |
| ;; |
| *) |
| GS_KERNEL="gs://$GS_BUCKET/$1" |
| ;; |
| esac |
| else |
| if [[ $KERNEL == *.deb ]]; then |
| GS_KERNEL=gs://$GS_BUCKET/kernel.deb |
| else |
| GS_KERNEL=gs://$GS_BUCKET/bzImage |
| fi |
| fi |
| if ! test -f "$KERNEL" ; then |
| echo "Can't find kernel at $KERNEL" |
| exit 1 |
| fi |
| get_kernel_file_info "$KERNEL" |
| gs_meta= |
| if test -n "$KERNEL_ARCH" ; then |
| gs_meta="$gs_meta -h x-goog-meta-arch=$KERNEL_ARCH" |
| fi |
| if test -n "$KERNEL_VERSION" ; then |
| gs_meta="$gs_meta -h x-goog-meta-ver=$KERNEL_VERSION" |
| fi |
| echo "gsutil cp $KERNEL $GS_KERNEL" |
| if test -z "$NO_ACTION" ; then |
| gsutil -q $gs_meta cp $KERNEL $GS_KERNEL |
| fi |
| exit $? |
| ;; |
| launch-ltm) |
| shift |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-launch-ltm" "$@" |
| exit $? |
| ;; |
| launch-kcs) |
| shift |
| XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-launch-kcs" "$@" |
| exit $? |
| ;; |
| refresh-machtype-file) |
| rm -f $GCE_MACHTYPE_FILE |
| get_machtype_file |
| echo "Refreshed $GCE_MACHTYPE_FILE" |
| exit 0 |
| ;; |
| cache-machtype-file) |
| get_machtype_file |
| echo "$GCE_MACHTYPE_FILE is cached" |
| exit 0 |
| ;; |
| ltm) |
| shift |
| if [ ! -f "$DIR/.ltm_instance_$GCE_PROJECT" ]; then |
| echo "The .ltm_instance_$GCE_PROJECT file is not present! Please launch the LTM before" |
| echo "using this option." |
| exit 1 |
| fi |
| RUN_ON_LTM="yes" |
| GCE_USER="" |
| ;; |
| kcs) |
| shift |
| if [ ! -f "$DIR/.kcs_instance_$GCE_PROJECT" ]; then |
| echo "The .kcs_instance_$GCE_PROJECT file is not present! Please launch the compile server before" |
| echo "using this option." |
| exit 1 |
| fi |
| RUN_ON_KCS="yes" |
| GCE_USER="" |
| OVERRIDE_KERNEL="none" |
| ;; |
| ltm-info) |
| shift |
| if [ ! -f "$DIR/.ltm_instance_$GCE_PROJECT" ]; then |
| echo "The .ltm_instance_$GCE_PROJECT file is not present! Please launch the LTM before" |
| echo "using this option." |
| exit 1 |
| fi |
| RUN_ON_LTM="yes" |
| GCE_USER="ltm" |
| LTM_INFO="yes" |
| OVERRIDE_KERNEL="none" |
| ;; |
| ltm-batch) |
| shift |
| gsutil cp "$@" gs://$GS_BUCKET/ltm-batch/ |
| run_gcloud compute -q instances add-metadata xfstests-ltm \ |
| --metadata ltm_wait=$(date +%s) \ |
| --zone "$GCE_ZONE" > /dev/null |
| exit 0 |
| ;; |
| ltm-batch-cmd) |
| shift |
| if test -n "$NO_ACTION" ; then |
| set -vx |
| fi |
| batch_cmd="$@" |
| case "$batch_cmd" in |
| *--kernel*|*--commit*|*--watch*|*--bisect-bad*) : ;; |
| *) batch_cmd="--kernel gs://$GS_BUCKET/kernel.deb $batch_cmd" |
| echo "Kernel not specified; defaulting to gs://$GS_BUCKET/kernel.deb" |
| ;; |
| esac |
| echo "gce-xfstests ltm $batch_cmd" > /tmp/ltm-batch.$$ |
| if test -n "$NO_ACTION" ; then |
| cat /tmp/ltm-batch.$$ |
| echo "" |
| fi |
| $NO_ACTION gsutil cp /tmp/ltm-batch.$$ gs://$GS_BUCKET/ltm-batch/ltm-batch-cmd |
| /bin/rm -f /tmp/ltm-batch.$$ |
| run_gcloud compute -q instances add-metadata xfstests-ltm \ |
| --metadata ltm_wait=$(date +%s) \ |
| --zone "$GCE_ZONE" > /dev/null |
| exit 0 |
| ;; |
| launch-dashboard) |
| shift |
| $DIR/util/gce-launch-dashboard $@ |
| exit $? |
| ;; |
| stop-kcs) |
| $NO_ACTION gce-xfstests rm xfstests-kcs |
| exit $? |
| ;; |
| stop-ltm) |
| echo "poweroff -f" > /tmp/stop-ltm.$$ |
| $NO_ACTION gsutil cp /tmp/stop-ltm.$$ gs://$GS_BUCKET/ltm-batch/stop-ltm |
| /bin/rm -f /tmp/stop-ltm.$$ |
| run_gcloud compute -q instances add-metadata xfstests-ltm \ |
| --metadata ltm_wait=$(date +%s) \ |
| --zone "$GCE_ZONE" > /dev/null |
| $NO_ACTION gce-xfstests abort xfstests-ltm |
| exit $? |
| ;; |
| esac |
| |
| GS_CONFIG="gs://$GS_BUCKET/gce_xfstests.config" |
| |
| if ! gsutil -q stat "$GS_CONFIG" |
| then |
| export GCE_XFSTESTS_DIR="$DIR" |
| if ! XFSTESTS_FLAVOR=$XFSTESTS_FLAVOR "$DIR/util/gce-do-setup"; then |
| echo "GCE setup failed, exiting" |
| exit 1 |
| fi |
| fi |
| |
| # compare current config with config in bucket |
| TMP_CONFIG=$(mktemp /tmp/gce_xfstests.config.XXXXXXXX) |
| trap "rm -f $TMP_CONFIG" EXIT |
| SENDGRID_API_KEY="$GCE_SG_API" |
| { |
| declare -p GCE_REPORT_SENDER |
| declare -p GCE_REPORT_EMAIL |
| declare -p GCE_REPORT_FAIL_EMAIL |
| declare -p GCE_JUNIT_EMAIL |
| declare -p SENDGRID_API_KEY |
| declare -p GCE_UPLOAD_SUMMARY |
| declare -p PRIMARY_FSTYPE |
| declare -p GCE_PROJECT |
| declare -p GCE_IMAGE_PROJECT |
| declare -p ARCH |
| declare -p GCE_ZONE |
| declare -p GCE_ZONE2 |
| declare -p NR_CPU |
| declare -p MEM |
| declare -p GS_BUCKET |
| declare -p BUCKET_SUBDIR |
| declare -p GCE_MIN_SCR_SIZE |
| declare -p GCE_LTM_KEEP_DEAD_VM |
| declare -p GCE_NETWORK |
| declare -p GCE_SERIAL_PORT_ACCESS |
| declare -p TZ |
| declare -p GCE_LTM_MACHTYPE |
| declare -p GCE_KCS_MACHTYPE |
| declare -p GIT_REPOS |
| } 2>/dev/null > $TMP_CONFIG |
| |
| local_config="/tmp/.gce_xfststs.config.$USER-$GCE_PROJECT" |
| if test -z "$SKIP_GS_CONFIG_UPDATE" && \ |
| ! cmp -s "$TMP_CONFIG" "$local_config" |
| then |
| get_local_hash "$TMP_CONFIG" |
| get_remote_hash "$GS_CONFIG" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| echo "Updating config file at $GS_CONFIG" |
| gsutil cp "$TMP_CONFIG" "$GS_CONFIG" |
| mv "$TMP_CONFIG" "$local_config" |
| else |
| if ! test -f "$local_config" ; then |
| mv "$TMP_CONFIG" "$local_config" |
| fi |
| fi |
| fi |
| rm -f "$TMP_CONFIG" |
| trap - EXIT |
| |
| # Simulate how parse_cli handles --no-action if this option was specified |
| # as the first argument and we are running a test. |
| if test -n "$NO_ACTION" ; then |
| NO_ACTION="echo -e Would execute:\n\t" |
| SKIP_LOG=yes |
| fi |
| |
| . "$DIR/util/parse_cli" |
| _cleanup |
| trap - 0 |
| |
| if test -z "$EXPLICIT_ROOT_FS" ; then |
| ROOT_FS="xfstests-$ARCH" |
| IMAGE_FLAG="--image-family" |
| fi |
| |
| if test -n "$EXTRA_ARG" |
| then |
| ARG="$ARG kopt=$EXTRA_ARG" |
| fi |
| |
| SCOPES="https://www.googleapis.com/auth/cloud-platform" |
| |
| if [ -z ${TESTRUNID:+x} ]; then |
| TESTRUNID=$(date +%Y%m%d%H%M%S) |
| # if GCE_USER is non-empty or unset |
| # this avoids prepending the - if GCE_USER is set to empty string. |
| if [ -n "${GCE_USER-unset}" ]; then |
| # prepend GCE_USER, or the current $USER if GCE_USER is unset |
| TESTRUNID="${GCE_USER-$USER}-$TESTRUNID" |
| fi |
| fi |
| |
| INSTANCE="xfstests-$TESTRUNID" |
| |
| case "$ARG" in |
| cmd=pts*) |
| INSTANCE="pts" |
| ;; |
| cmd=maint*) |
| INSTANCE="xfstests" |
| ;; |
| esac |
| |
| if test -n "$INSTANCE_NAME" |
| then |
| INSTANCE="$INSTANCE_NAME" |
| fi |
| |
| case "$OVERRIDE_KERNEL" in |
| gs://*) |
| GS_KERNEL="$OVERRIDE_KERNEL" |
| GCE_KERNEL="" |
| ;; |
| //*) |
| GS_KERNEL=$(echo "$KERNEL" | sed -e "s;//;gs://$GS_BUCKET/;") |
| GCE_KERNEL="" |
| ;; |
| none) |
| GS_KERNEL="" |
| GCE_KERNEL="" |
| ;; |
| "") |
| GCE_KERNEL=$KERNEL |
| if [[ "$GCE_KERNEL" == *.deb ]]; then |
| GS_KERNEL=gs://$GS_BUCKET/kernel.deb |
| else |
| GS_KERNEL=gs://$GS_BUCKET/bzImage |
| fi |
| ;; |
| *) |
| GCE_KERNEL=$KERNEL |
| if [[ "$GCE_KERNEL" == *.deb ]]; then |
| KERNEL_TYPE="deb" |
| else |
| KERNEL_TYPE="bzImage" |
| fi |
| if test -n "$RUN_ON_LTM"; then |
| # every shard will have to download the image. changing the |
| # -onetime tag is necessary to not cause the first shard to attempt |
| # to delete the image. |
| GS_KERNEL="gs://$GS_BUCKET/$TESTRUNID-onerun.$KERNEL_TYPE" |
| else |
| GS_KERNEL="gs://$GS_BUCKET/$TESTRUNID-onetime.$KERNEL_TYPE" |
| fi |
| ;; |
| esac |
| |
| if [ -z "$NO_ACTION" -a -n "$GCE_KERNEL" ] || \ |
| [ -n "$RUN_ON_LTM" -a -n "$GCE_KERNEL" ] |
| then |
| if ! test -f "$GCE_KERNEL" |
| then |
| echo "Can't find kernel at $GCE_KERNEL" |
| exit 1 |
| fi |
| get_local_hash "$GCE_KERNEL" |
| get_remote_hash "$GS_KERNEL" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| gsutil cp "$GCE_KERNEL" "$GS_KERNEL" |
| fi |
| fi |
| |
| if test -n "$NO_ACTION" ; then |
| if test -n "$GCE_KERNEL" ; then |
| echo gsutil cp "$GCE_KERNEL" "$GS_KERNEL" |
| else |
| echo "Using kernel $GS_KERNEL" |
| fi |
| fi |
| |
| if test -z "$NO_ACTION" -a -n "$GCE_HOOKS" |
| then |
| if ! test -e "$GCE_HOOKS" |
| then |
| echo "Can't find hooks file to upload at $GCE_HOOKS" |
| exit 1 |
| fi |
| if test -d "$GCE_HOOKS" |
| then |
| tmpfile=$(mktemp) |
| tar -C "$GCE_HOOKS" -cf - . | gzip -9n > "$tmpfile" |
| GCE_HOOKS=$tmpfile |
| GS_HOOKS=gs://$GS_BUCKET/hooks.tar.gz |
| else |
| GS_HOOKS=gs://$GS_BUCKET/$(basename "$GCE_HOOKS") |
| fi |
| get_local_hash "$GCE_HOOKS" |
| get_remote_hash "$GS_HOOKS" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| gsutil cp "$GCE_HOOKS" "$GS_HOOKS" |
| fi |
| if test -n "$tmpfile" |
| then |
| /bin/rm -f "$tmpfile" |
| unset tmpfile |
| fi |
| ARG="$ARG hooks=$GS_HOOKS" |
| fi |
| |
| if test -z "$NO_ACTION" -a "$UPDATE_XFSTESTS" = "yes" |
| then |
| LOCAL_XFSTESTS="$DIR/../fstests-bld/xfstests.tar.gz" |
| GS_XFSTESTS="gs://$GS_BUCKET/xfstests.tar.gz" |
| get_local_hash "$LOCAL_XFSTESTS" |
| get_remote_hash "$GS_XFSTESTS" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| gsutil cp "$LOCAL_XFSTESTS" "$GS_XFSTESTS" |
| fi |
| ARG="$ARG tarxfstests=$GS_XFSTESTS" |
| fi |
| |
| if test -z "$NO_ACTION" -a "$UPDATE_FILES" = "yes" |
| then |
| LOCAL_FILES=$(mktemp /tmp/files.XXXXXXXX) |
| GS_FILES="gs://$GS_BUCKET/files.tar.gz" |
| if ! test -d "$DIR/../test-appliance" |
| then |
| echo "Can't find the test-appliance directory!" |
| exit 1 |
| fi |
| (cd "$DIR/../test-appliance"; \ |
| tar -X gce-exclude-files --exclude=etc -C files \ |
| --owner=root --group=root --mode=go+u-w -cf - . | \ |
| gzip -9n > $LOCAL_FILES) |
| get_local_hash "$LOCAL_FILES" |
| get_remote_hash "$GS_FILES" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| gsutil cp "$LOCAL_FILES" "$GS_FILES" |
| fi |
| ARG="$ARG tarfiles=$GS_FILES" |
| rm -f "$LOCAL_FILES" |
| fi |
| |
| case "$OVERRIDE_MODULES" in |
| gs://*) |
| GS_MODULES="$OVERRIDE_MODULES" |
| GCE_MODULES="" |
| ;; |
| "") |
| if test -n "$MODULES" ; then |
| GS_MODULES="gs://$GS_BUCKET/modules.tar.xz" |
| GCE_MODULES="$MODULES"; |
| fi |
| ;; |
| *) |
| GCE_MODULES="$OVERRIDE_MODULES" |
| if test -z "$OVERRIDE_MODULES" ; then |
| GS_MODULES="gs://$GS_BUCKET/modules.tar.xz" |
| elif test -n "$RUN_ON_LTM"; then |
| # every shard will have to download the image. changing the |
| # -onetime tag is necessary to not cause the first shard to attempt |
| # to delete the image. |
| GS_MODULES="gs://$GS_BUCKET/modules-$TESTRUNID-onerun" |
| else |
| GS_MODULES="gs://$GS_BUCKET/modules-$TESTRUNID-onetime" |
| fi |
| ;; |
| esac |
| |
| if [ -z "$NO_ACTION" -a -n "$GCE_MODULES" ] || \ |
| [ -n "$RUN_ON_LTM" -a -n "$GCE_MODULES" ] |
| then |
| if ! test -f "$GCE_MODULES" |
| then |
| echo "Can't find modules at $GCE_MODULES" |
| exit 1 |
| fi |
| get_local_hash "$GCE_MODULES" |
| get_remote_hash "$GS_MODULES" |
| if test "$LOCAL_HASH" != "$REMOTE_HASH" |
| then |
| gsutil cp "$GCE_MODULES" "$GS_MODULES" |
| fi |
| fi |
| |
| if test -n "$GS_MODULES" |
| then |
| ARG="$ARG tarmodules=$GS_MODULES" |
| fi |
| |
| if test -n "$GS_KERNEL" |
| then |
| ARG="$ARG kexec=$GS_KERNEL" |
| fi |
| |
| # MT_PRICE is in millidollars, as of 1/20/2025 in us-central1 (Iowa) |
| function get_machtype_stats() { |
| local mt=$1 |
| case "$mt" in |
| f1-micro) MT_PRICE=0008 ; MT_CPU=1 ; MT_RAM=614 ;; |
| e2-micro) MT_PRICE=0008 ; MT_CPU=1 ; MT_RAM=1024 ;; |
| e2-small) MT_PRICE=0017 ; MT_CPU=1 ; MT_RAM=2048 ;; |
| g1-micro) MT_PRICE=0026 ; MT_CPU=1 ; MT_RAM=1740 ;; |
| e2-medium) MT_PRICE=0034 ; MT_CPU=1 ; MT_RAM=4096 ;; |
| n1-standard-1) MT_PRICE=0047 ; MT_CPU=1 ; MT_RAM=3840 ;; |
| e2-highcpu-2) MT_PRICE=0049 ; MT_CPU=2 ; MT_RAM=2048 ;; |
| e2-standard-2) MT_PRICE=0067 ; MT_CPU=2 ; MT_RAM=8192 ;; |
| e2-highmem-2) MT_PRICE=0090 ; MT_CPU=2 ; MT_RAM=16384 ;; |
| n1-standard-2) MT_PRICE=0095 ; MT_CPU=2 ; MT_RAM=7680 ;; |
| e2-highcpu-4) MT_PRICE=0099 ; MT_CPU=4 ; MT_RAM=4096 ;; |
| n1-highcpu-2) MT_PRICE=0071 ; MT_CPU=2 ; MT_RAM=1843 ;; |
| n1-highmem-2) MT_PRICE=0118 ; MT_CPU=2 ; MT_RAM=13312 ;; |
| e2-standard-4) MT_PRICE=0134 ; MT_CPU=4 ; MT_RAM=16384 ;; |
| n1-highcpu-4) MT_PRICE=0142 ; MT_CPU=4 ; MT_RAM=3686 ;; |
| e2-highmem-4) MT_PRICE=0181 ; MT_CPU=4 ; MT_RAM=32768 ;; |
| n1-standard-4) MT_PRICE=0190 ; MT_CPU=4 ; MT_RAM=15360 ;; |
| e2-highcpu-8) MT_PRICE=0198 ; MT_CPU=8 ; MT_RAM=8192 ;; |
| n1-highmem-4) MT_PRICE=0237 ; MT_CPU=4 ; MT_RAM=26624 ;; |
| e2-standard-8) MT_PRICE=0268 ; MT_CPU=8 ; MT_RAM=32768 ;; |
| n1-highcpu-8) MT_PRICE=0284 ; MT_CPU=8 ; MT_RAM=7372 ;; |
| e2-highmem-8) MT_PRICE=0362 ; MT_CPU=8 ; MT_RAM=65536 ;; |
| n1-standard-8) MT_PRICE=0380 ; MT_CPU=8 ; MT_RAM=30720 ;; |
| e2-highcpu-16) MT_PRICE=0396 ; MT_CPU=16 ; MT_RAM=16384 ;; |
| n1-highmem-8) MT_PRICE=0473 ; MT_CPU=8 ; MT_RAM=53248 ;; |
| e2-standard-16) MT_PRICE=0536 ; MT_CPU=16 ; MT_RAM=65536 ;; |
| n1-highcpu-16) MT_PRICE=0567 ; MT_CPU=16 ; MT_RAM=14745 ;; |
| n1-standard-16) MT_PRICE=0760 ; MT_CPU=16 ; MT_RAM=61440 ;; |
| e2-highmem-16) MT_PRICE=0723 ; MT_CPU=16 ; MT_RAM=131072 ;; |
| e2-highcpu-32) MT_PRICE=0791 ; MT_CPU=32 ; MT_RAM=32768 ;; |
| n1-highmem-16) MT_PRICE=0946 ; MT_CPU=16 ; MT_RAM=106496 ;; |
| e2-standard-32) MT_PRICE=1072 ; MT_CPU=32 ; MT_RAM=131072 ;; |
| n1-highcpu-32) MT_PRICE=1134 ; MT_CPU=32 ; MT_RAM=29491 ;; |
| n1-standard-32) MT_PRICE=1520 ; MT_CPU=32 ; MT_RAM=122880 ;; |
| n1-highmem-32) MT_PRICE=1893 ; MT_CPU=32 ; MT_RAM=212992 ;; |
| n1-highcpu-64) MT_PRICE=2267 ; MT_CPU=64 ; MT_RAM=58982 ;; |
| n1-standard-64) MT_PRICE=3040 ; MT_CPU=64 ; MT_RAM=245760 ;; |
| n1-highcpu-96) MT_PRICE=3401 ; MT_CPU=96 ; MT_RAM=88474 ;; |
| n1-highmem-64) MT_PRICE=3789 ; MT_CPU=64 ; MT_RAM=425984 ;; |
| n1-standard-96) MT_PRICE=4560 ; MT_CPU=96 ; MT_RAM=368640 ;; |
| n1-highmem-96) MT_PRICE=5679 ; MT_CPU=96 ; MT_RAM=638976 ;; |
| t2a-standard-1) MT_PRICE=0039; MT_CPU=1 ; MT_RAM=4096 ;; |
| t2a-standard-2) MT_PRICE=0077; MT_CPU=2 ; MT_RAM=8192 ;; |
| t2a-standard-4) MT_PRICE=0154; MT_CPU=4 ; MT_RAM=16384 ;; |
| t2a-standard-8) MT_PRICE=0308; MT_CPU=8 ; MT_RAM=32768 ;; |
| t2a-standard-16) MT_PRICE=0616; MT_CPU=16 ; MT_RAM=65536 ;; |
| t2a-standard-32) MT_PRICE=1232; MT_CPU=32 ; MT_RAM=131072 ;; |
| t2a-standard-48) MT_PRICE=1848; MT_CPU=48 ; MT_RAM=196608 ;; |
| *) MT_PRICE=0 ; MT_CPU=0 ; MT_RAM=0 ;; |
| esac |
| } |
| |
| # Find what will the cheapest MACHTYPE that satisifies the requested |
| # number of CPU's and memory. |
| # |
| function fit_machtype_resources() { |
| local cur_price cur_machtype f_machtype f_zone f_cpus f_memory |
| |
| cur_price=99999 |
| get_machtype_file |
| while read f_machtype f_zone f_cpus f_memory |
| do |
| case "$ARCH" in |
| arm64) |
| case "$f_machtype" in |
| t2a-*) ;; |
| *) continue ;; |
| esac |
| ;; |
| amd64) |
| case "$f_machtype" in |
| n2-*|c2-*|t2a-*) continue ;; |
| e2-*) if test -n "$DO_LOCAL_SSD" ; then continue ; fi ;; |
| esac |
| ;; |
| esac |
| if test "$GCE_ZONE" != "$f_zone" ; then |
| continue |
| fi |
| if test "$NR_CPU" -gt "$f_cpus" -o "$MEM" -gt "$f_memory"; then |
| continue |
| fi |
| get_machtype_stats "$f_machtype" |
| if test "$MT_PRICE" -eq 0 ; then |
| continue |
| fi |
| if test "$cur_price" -gt "$MT_PRICE" ; then |
| cur_price="$MT_PRICE" |
| cur_machtype="$f_machtype" |
| # echo $cur_price $f_machtype $f_cpus $f_memory |
| fi |
| done < $GCE_MACHTYPE_FILE |
| GCE_MACHTYPE="$cur_machtype" |
| |
| if test -z "$GCE_MACHTYPE"; then |
| echo "Could not find a machine matching the provided criteria." |
| if test "$ARCH" = "arm64" ; then |
| echo "For arm64, make sure you are using a zone that has t2a machines." |
| fi |
| exit 1 |
| fi |
| |
| get_machtype_stats "$GCE_MACHTYPE" |
| } |
| |
| if test -n "$GCE_MACHTYPE" |
| then |
| get_machtype_stats "$GCE_MACHTYPE" |
| if test -z "$EXPLICIT_RAM" |
| then |
| MT_RAM=0 |
| else |
| if test $MEM -gt $MT_RAM |
| then |
| echo "Warning: requested $MEM MB ram but only $MT_RAM available" |
| fi |
| fi |
| if test -z "$EXPLICIT_CPU" |
| then |
| MT_CPU=0 |
| else |
| if test $NR_CPU -gt $MT_CPU |
| then |
| echo "Warning: requested $NR_CPU cpus but only $MT_CPU available" |
| fi |
| fi |
| else |
| fit_machtype_resources |
| if test $MEM -gt $MT_RAM |
| then |
| echo "Warning: requested $MEM MB ram but only $MT_RAM available" |
| fi |
| fi |
| |
| if test $MEM -lt $MT_RAM |
| then |
| ARG="$ARG mem=$MEM" |
| fi |
| |
| if test $NR_CPU -lt $MT_CPU |
| then |
| ARG="$ARG nr_cpus=$NR_CPU" |
| fi |
| |
| if test -n "$GCE_DISK_SPEC" |
| then |
| ARG="$ARG disk_spec=$GCE_DISK_SPEC" |
| fi |
| |
| ARG="$ARG gs_bucket=$GS_BUCKET serial-port-enable=$GCE_SERIAL_PORT_ACCESS" |
| |
| if test -n "$BUCKET_SUBDIR"; then |
| ARG="$ARG bucket_subdir=$BUCKET_SUBDIR" |
| fi |
| |
| if test -n "$GCE_REPORT_EMAIL" |
| then |
| ARG="$ARG report_email=$GCE_REPORT_EMAIL" |
| fi |
| |
| if test -n "$GCE_REPORT_FAIL_EMAIL" |
| then |
| ARG="$ARG report_fail_email=$GCE_REPORT_FAIL_EMAIL" |
| fi |
| |
| if test -n "$GCE_JUNIT_EMAIL" |
| then |
| ARG="$ARG junit_email=$GCE_JUNIT_EMAIL" |
| fi |
| |
| ARG="$ARG orig_cmdline=$ORIG_CMDLINE_B64" |
| |
| if test -n "$DO_LOCAL_SSD" |
| then |
| SSD_ARG="--local-ssd interface=$DO_LOCAL_SSD" |
| fi |
| |
| if test -n "$GCE_OSLOGIN" |
| then |
| ARG="$ARG enable-oslogin=$GCE_OSLOGIN" |
| fi |
| |
| if test -n "$GCE_OSLOGIN_2FA" |
| then |
| ARG="$ARG enable-oslogin-2fa=$GCE_OSLOGIN_2FA" |
| fi |
| |
| if test -n "$GCE_NO_VM_TIMEOUT" |
| then |
| ARG="$ARG no_vm_timeout=$GCE_NO_VM_TIMEOUT" |
| fi |
| |
| if test -n "$RUN_ON_LTM"; then |
| . "$DIR/util/gce-ltm-funcs" |
| if ! send_to_ltm $ORIG_CMDLINE_B64; then |
| exit 1 |
| fi |
| exit 0 |
| elif test -n "$RUN_ON_KCS"; then |
| if ! gsutil -q stat "gs://$GS_BUCKET/build_config" &> /dev/null |
| then |
| echo "Couldn't find build config in $GS_BUCKET" |
| echo "Using default build config for kernel build" |
| gsutil cp "$DIR/../kernel-build/kernel-configs/x86_64-config-5.4" "gs://$GS_BUCKET/build_config" |
| fi |
| . "$DIR/util/gce-kcs-funcs" |
| if ! send_to_kcs $ORIG_CMDLINE_B64; then |
| exit 1 |
| fi |
| exit 0 |
| fi |
| |
| cert_file="$DIR/.gce_xfstests_cert_$GCE_PROJECT.pem" |
| expire_seconds=$((60 * 60 * 24 * 7)) |
| if test -f "$cert_file" |
| ! openssl x509 -enddate -noout -in "$cert_file" \ |
| -checkend $expire_seconds >& /dev/null |
| then |
| "$DIR/util/gce-setup-cert" |
| fi |
| |
| function launch_vm () { |
| echo "Launching $INSTANCE using $GCE_MACHTYPE..." |
| |
| if test -n "$GCE_SPOT" |
| then |
| SPOT="--provisioning-model=SPOT" |
| else |
| SPOT= |
| fi |
| run_gcloud compute \ |
| instances create "$INSTANCE" --zone "$GCE_ZONE" \ |
| --machine-type "$GCE_MACHTYPE" --network "$GCE_NETWORK" \ |
| $SSD_ARG $SPOT \ |
| $SERVICE_ACCOUNT_OPT_VM \ |
| --scopes "$SCOPES" \ |
| --metadata "^ ^$ARG" \ |
| --tags http-server,https-server \ |
| --image-project "${GCE_IMAGE_PROJECT:-xfstests-cloud}" \ |
| "$IMAGE_FLAG" "$ROOT_FS" |
| err=$? |
| } |
| |
| ERRFILE=/tmp/gce-xfstests-err-$$ |
| RETRY_COUNTER=0 |
| while true |
| do |
| launch_vm 2> $ERRFILE |
| |
| if test "$err" -gt 0 ; then |
| cat $ERRFILE |
| if grep -q images/family/xfstests-amd64 $ERRFILE ; then |
| if grep -q "The project .* was not found" $ERRFILE; then |
| exit $err |
| fi |
| echo Retrying with the image family xfstests |
| ROOT_FS=xfstests |
| launch_vm |
| if test "$err" -gt 0 ; then |
| exit $err |
| fi |
| elif grep -iq resource $ERRFILE && grep -iq available $ERRFILE ; then |
| let RETRY_COUNTER++ |
| if test $RETRY_COUNTER -lt 3 |
| then |
| echo "Resources unavailable, retrying ($RETRY_COUNTER)..." |
| sleep 1 |
| else |
| if test -n "$GCE_SPOT" -a -n "$GCE_SPOT_FALLBACK" |
| then |
| echo "Unable to start spot VM, retrying with standard..." |
| GCE_SPOT= |
| RETRY_COUNTER=0 |
| else |
| echo "Unable to start VM" |
| exit $err |
| fi |
| fi |
| else |
| exit $err |
| fi |
| else |
| break |
| fi |
| done |
| rm -f $ERRFILE |
| |
| |
| case "$ARG" in |
| cmd=maint*) |
| if test -n "$NO_SSH" |
| then |
| exit 0 |
| fi |
| if test -z "$NO_ACTION" |
| then |
| sleep 1 |
| if test "$OVERRIDE_KERNEL" != none |
| then |
| # Need to give more time for the kexec |
| sleep 30 |
| fi |
| fi |
| run_gcloud compute ssh "root@$INSTANCE" |
| ;; |
| esac |