#!/usr/bin/env bash # Copyright 2014 The Kubernetes Authors. # # Licensed 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 kube::util::sourced_variable { # Call this function to tell shellcheck that a variable is supposed to # be used from other calling context. This helps quiet an "unused # variable" warning from shellcheck and also document your code. true } kube::util::sortable_date() { date "+%Y%m%d-%H%M%S" } # arguments: target, item1, item2, item3, ... # returns 0 if target is in the given items, 1 otherwise. kube::util::array_contains() { local search="$1" local element shift for element; do if [[ "${element}" == "${search}" ]]; then return 0 fi done return 1 } # Example: kube::util::trap_add 'echo "in trap DEBUG"' DEBUG # See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal kube::util::trap_add() { local trap_add_cmd trap_add_cmd=$1 shift for trap_add_name in "$@"; do local existing_cmd local new_cmd # Grab the currently defined trap commands for this trap existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}') if [[ -z "${existing_cmd}" ]]; then new_cmd="${trap_add_cmd}" else new_cmd="${trap_add_cmd};${existing_cmd}" fi # Assign the test. Disable the shellcheck warning telling that trap # commands should be single quoted to avoid evaluating them at this # point instead evaluating them at run time. The logic of adding new # commands to a single trap requires them to be evaluated right away. # shellcheck disable=SC2064 trap "${new_cmd}" "${trap_add_name}" done } kube::util::download_file() { local -r url=$1 local -r destination_file=$2 rm "${destination_file}" 2&> /dev/null || true for i in $(seq 5) do if ! curl -fsSL --retry 3 --keepalive-time 2 "${url}" -o "${destination_file}"; then echo "Downloading ${url} failed. $((5-i)) retries left." sleep 1 else echo "Downloading ${url} succeed" return 0 fi done return 1 } # Wait for background jobs to finish. Return with # an error status if any of the jobs failed. kube::util::wait-for-jobs() { local fail=0 local job for job in $(jobs -p); do wait "${job}" || fail=$((fail + 1)) done return ${fail} } # kube::util::join # Concatenates the list elements with the delimiter passed as first parameter # # Ex: kube::util::join , a b c # -> a,b,c function kube::util::join { local IFS="$1" shift echo "$*" } # kube::util::check-file-in-alphabetical-order # Check that the file is in alphabetical order # function kube::util::check-file-in-alphabetical-order { local failure_file="$1" if ! diff -u "${failure_file}" <(LC_ALL=C sort "${failure_file}"); then { echo echo "${failure_file} is not in alphabetical order. Please sort it:" echo echo " LC_ALL=C sort -o ${failure_file} ${failure_file}" echo } >&2 false fi } # Some useful colors. if [[ -z "${color_start-}" ]]; then declare -r color_start="\033[" declare -r color_red="${color_start}0;31m" declare -r color_yellow="${color_start}0;33m" declare -r color_green="${color_start}0;32m" declare -r color_blue="${color_start}1;34m" declare -r color_cyan="${color_start}1;36m" declare -r color_norm="${color_start}0m" kube::util::sourced_variable "${color_start}" kube::util::sourced_variable "${color_red}" kube::util::sourced_variable "${color_yellow}" kube::util::sourced_variable "${color_green}" kube::util::sourced_variable "${color_blue}" kube::util::sourced_variable "${color_cyan}" kube::util::sourced_variable "${color_norm}" fi # ex: ts=2 sw=2 et filetype=sh