/scripts/shipyard_cascade.sh

https://github.com/Azure/batch-shipyard · Shell · 204 lines · 175 code · 12 blank · 17 comment · 22 complexity · 5a5b435e46ca701f90a9ab1c0167e8ce MD5 · raw file

  1. #!/usr/bin/env bash
  2. log() {
  3. local level=$1
  4. shift
  5. echo "$(date -u -Ins) - $level - $*"
  6. }
  7. # globals
  8. block=
  9. cascadecontainer=0
  10. cascade_docker_image=
  11. cascade_singularity_image=
  12. concurrent_source_downloads=10
  13. envfile=
  14. is_start_task=0
  15. log_directory=
  16. prefix=
  17. singularity_basedir=
  18. # process command line options
  19. while getopts "h?b:c:de:i:j:l:p:s:t" opt; do
  20. case "$opt" in
  21. h|\?)
  22. echo "shipyard_cascade.sh parameters"
  23. echo ""
  24. echo "-b [images] block on images"
  25. echo "-c [concurrent source downloads] concurrent source downloads"
  26. echo "-d use docker container for cascade"
  27. echo "-e [envfile] environment file"
  28. echo "-i [cascade docker image] cascade docker image"
  29. echo "-j [cascade singularity image] cascade singularity image"
  30. echo "-l [log directory] log directory"
  31. echo "-p [prefix] storage container prefix"
  32. echo "-s [singularity basedir] singularity base directory"
  33. echo "-t run cascade as part of the start task"
  34. echo ""
  35. exit 1
  36. ;;
  37. b)
  38. block=$OPTARG
  39. ;;
  40. c)
  41. concurrent_source_downloads=$OPTARG
  42. ;;
  43. d)
  44. cascadecontainer=1
  45. ;;
  46. e)
  47. envfile=$OPTARG
  48. ;;
  49. i)
  50. cascade_docker_image=$OPTARG
  51. ;;
  52. j)
  53. cascade_singularity_image=$OPTARG
  54. ;;
  55. l)
  56. log_directory=$OPTARG
  57. ;;
  58. p)
  59. prefix=$OPTARG
  60. ;;
  61. s)
  62. singularity_basedir=$OPTARG
  63. ;;
  64. t)
  65. is_start_task=1
  66. ;;
  67. esac
  68. done
  69. shift $((OPTIND-1))
  70. [ "$1" = "--" ] && shift
  71. if [ $cascadecontainer -eq 1 ] && [ -z "$envfile" ]; then
  72. log ERROR "envfile not specified"
  73. exit 1
  74. fi
  75. if [ $cascadecontainer -eq 1 ] && [ -z "$cascade_docker_image" ]; then
  76. log ERROR "cascade docker image not specified"
  77. exit 1
  78. fi
  79. if [ $cascadecontainer -eq 1 ] && [ -n "$singularity_basedir" ] && [ -z "$cascade_singularity_image" ]; then
  80. log ERROR "cascade singularity image not specified"
  81. exit 1
  82. fi
  83. if [ -z "$log_directory" ]; then
  84. log ERROR "log directory not specified"
  85. exit 1
  86. fi
  87. if [ -z "$prefix" ]; then
  88. log ERROR "prefix not specified"
  89. exit 1
  90. fi
  91. spawn_cascade_process() {
  92. set +e
  93. local cascade_docker_pid
  94. local cascade_singularity_pid
  95. local detached
  96. if [ -z "$block" ]; then
  97. detached="-d"
  98. fi
  99. if [ $cascadecontainer -eq 1 ]; then
  100. tmp_envfile="$envfile.tmp"
  101. cp "$envfile" "$tmp_envfile"
  102. echo "log_directory=$log_directory" >> "$tmp_envfile"
  103. # run cascade for docker
  104. log DEBUG "Starting $cascade_docker_image"
  105. # shellcheck disable=SC2086
  106. docker run $detached --rm --runtime runc --env-file "$tmp_envfile" \
  107. -e "cascade_mode=docker" \
  108. -e "is_start_task=$is_start_task" \
  109. -v /var/run/docker.sock:/var/run/docker.sock \
  110. -v /etc/passwd:/etc/passwd:ro \
  111. -v /etc/group:/etc/group:ro \
  112. -v "$AZ_BATCH_NODE_ROOT_DIR":"$AZ_BATCH_NODE_ROOT_DIR" \
  113. -w "$AZ_BATCH_TASK_WORKING_DIR" \
  114. "$cascade_docker_image" &
  115. cascade_docker_pid=$!
  116. # run cascade for singularity
  117. if [ -n "$singularity_basedir" ]; then
  118. log DEBUG "Starting $cascade_singularity_image"
  119. local singularity_binds
  120. # set singularity options
  121. singularity_binds="\
  122. -v $singularity_basedir:$singularity_basedir \
  123. -v $singularity_basedir/mnt:/var/lib/singularity/mnt"
  124. # shellcheck disable=SC2086
  125. docker run $detached --rm --runtime runc --env-file $tmp_envfile \
  126. -e "cascade_mode=singularity" \
  127. -v /etc/passwd:/etc/passwd:ro \
  128. -v /etc/group:/etc/group:ro \
  129. ${singularity_binds} \
  130. -v "$AZ_BATCH_NODE_ROOT_DIR":"$AZ_BATCH_NODE_ROOT_DIR" \
  131. -w "$AZ_BATCH_TASK_WORKING_DIR" \
  132. "$cascade_singularity_image" &
  133. cascade_singularity_pid=$!
  134. fi
  135. else
  136. # add timings
  137. if [[ -n ${SHIPYARD_TIMING+x} ]]; then
  138. # mark start cascade
  139. # shellcheck disable=SC2086
  140. ./perf.py cascade start --prefix "$prefix"
  141. fi
  142. log DEBUG "Starting Cascade Docker mode"
  143. # shellcheck disable=SC2086
  144. PYTHONASYNCIODEBUG=1 ./cascade.py --mode docker \
  145. --concurrent "$concurrent_source_downloads" \
  146. --prefix "$prefix" \
  147. --log-directory "$log_directory" &
  148. cascade_docker_pid=$!
  149. # run cascade for singularity
  150. if [ -n "$singularity_basedir" ]; then
  151. log DEBUG "Starting Cascade Singularity mode"
  152. # shellcheck disable=SC2086
  153. PYTHONASYNCIODEBUG=1 ./cascade.py --mode singularity \
  154. --concurrent "$concurrent_source_downloads" \
  155. --prefix "$prefix" \
  156. --log-directory "$log_directory" &
  157. cascade_singularity_pid=$!
  158. fi
  159. fi
  160. # wait for cascade exit
  161. if [ -n "$block" ]; then
  162. local rc
  163. wait $cascade_docker_pid
  164. rc=$?
  165. if [ $rc -eq 0 ]; then
  166. log DEBUG "Cascade Docker exited successfully"
  167. else
  168. log ERROR "Cascade Docker exited with non-zero exit code: $rc"
  169. exit $rc
  170. fi
  171. if [ -n "$singularity_basedir" ]; then
  172. wait $cascade_singularity_pid
  173. rc=$?
  174. if [ $rc -eq 0 ]; then
  175. log DEBUG "Cascade Singularity exited successfully"
  176. else
  177. log ERROR "Cascade Singularity exited with non-zero exit code: $rc"
  178. exit $rc
  179. fi
  180. fi
  181. else
  182. log INFO "Not waiting for cascade due to non-blocking option"
  183. fi
  184. set -e
  185. }
  186. block_for_container_images() {
  187. # wait for images via cascade
  188. "${AZ_BATCH_NODE_STARTUP_DIR}"/wd/wait_for_images.sh "$block"
  189. }
  190. spawn_cascade_process
  191. # block for images if necessary
  192. block_for_container_images