diff --git a/bin/compose b/bin/compose index cbbb2ec..9346485 100755 --- a/bin/compose +++ b/bin/compose @@ -117,7 +117,6 @@ clean_cache() { } - usage="$exname SERVICE"' Deploy and manage a swarm of containers to provide services based on @@ -291,6 +290,7 @@ docker_has_image() { } export -f docker_has_image + cmd_on_base_image() { local service="$1" base_image shift @@ -299,6 +299,7 @@ cmd_on_base_image() { } export -f cmd_on_base_image + cached_cmd_on_base_image() { local service="$1" cache_file="$state_tmpdir/$FUNCNAME.cache.$(echo "$*" | md5_compat)" shift @@ -323,10 +324,12 @@ export -f image_exposed_ports_0 ## Generic ## + fn.exists() { declare -F "$1" >/dev/null } + str_pattern_matches() { local str="$1" shift @@ -355,6 +358,7 @@ gen_password() { } export -f gen_password + file_put() { local TARGET="$1" mkdir -p "$(dirname "$TARGET")" && @@ -370,6 +374,7 @@ file_put_0() { } export -f file_put_0 + fetch_file() { local src="$1" @@ -390,6 +395,7 @@ fetch_file() { } export -f fetch_file + ## receives stdin content to decompress on stdout ## stdout content should be tar format. uncompress_file() { @@ -412,6 +418,7 @@ uncompress_file() { } export -f uncompress_file + get_file() { local src="$1" @@ -437,6 +444,7 @@ _clean_docker() { } export -f _clean_docker + get_service_base_image_dir_uid_gid() { local service="$1" dir="$2" uid_gid uid_gid=$(cached_cmd_on_base_image "$service" "stat -c '%u %g' '$dir'") || { @@ -448,6 +456,7 @@ get_service_base_image_dir_uid_gid() { } export -f get_service_base_image_dir_uid_gid + are_files_locked_in_dir() { local dir="$1" device hdev ldev device=$(stat -c %d "$dir") || { @@ -472,6 +481,7 @@ are_files_locked_in_dir() { } export -f are_files_locked_in_dir + export _PID="$$" ensure_db_docker_running () { local _STATE_FILE @@ -580,6 +590,7 @@ ensure_db_docker_running () { } export -f ensure_db_docker_running + ## Require to set $db_docker_opts if needed, and $DB_PASSFILE ## _dcmd() { @@ -635,6 +646,7 @@ get_docker_ips() { } export -f get_docker_ips + get_docker_ip() { local name="$1" get_docker_ips "$name" @@ -863,6 +875,7 @@ _get_docker_compose_service_mixin() { } export -f _get_docker_compose_service_mixin + ## ## Get full `docker-compose.yml` format for all listed services (and ## their deps) @@ -970,6 +983,7 @@ _get_compose_service_def_cached () { } export -f _get_compose_service_def_cached + ## XXXvlab: a lot to be done to cache the results get_compose_service_def () { local service="$1" docker_compose cache_file="$state_tmpdir/$FUNCNAME.cache.$1" \ @@ -1005,6 +1019,7 @@ _get_service_charm_cached () { } export -f _get_service_charm_cached + get_service_charm () { local service="$1" if [ -z "$service" ]; then @@ -1017,6 +1032,7 @@ get_service_charm () { } export -f get_service_charm + ## built above the docker-compose abstraction, so it relies on the ## full docker-compose.yml to be already built. get_service_def () { @@ -1106,6 +1122,7 @@ get_charm_tech_dep_orientation_for_relation() { } export -f get_charm_tech_dep_orientation_for_relation + ## ## Use compose file to get deps, and relation definition in metadata.yml ## for tech-dep attribute. @@ -1200,6 +1217,7 @@ get_ordered_service_dependencies() { } export -f get_ordered_service_dependencies + run_service_hook () { local action="$1" service subservice subservices loaded shift @@ -1397,6 +1415,7 @@ _config_merge() { } export -f _config_merge + ## XXXvlab; this can be used only in relation, I'd like to use it in init. config-add() { local metadata="$1" @@ -1404,6 +1423,7 @@ config-add() { } export -f config-add + ## XXXvlab; this can be used only in relation, I'd like to use it in init. init-config-add() { local metadata="$1" @@ -1581,6 +1601,7 @@ _get_compose_relations_cached () { } export -f _get_compose_relations_cached + get_compose_relations () { local service="$1" cache_file="$state_tmpdir/$FUNCNAME.cache.$1" \ compose_def @@ -1933,6 +1954,7 @@ _get_master_service_for_service_cached () { } export -f _get_master_service_for_service_cached + get_master_service_for_service() { local service="$1" cache_file="$state_tmpdir/$FUNCNAME.cache.$1" \ charm metadata result @@ -2087,6 +2109,7 @@ _save() { } export -f _save + get_default_project_name() { if [ "$DEFAULT_PROJECT_NAME" ]; then echo "$DEFAULT_PROJECT_NAME" @@ -2167,6 +2190,7 @@ launch_docker_compose() { } export -f launch_docker_compose + get_compose_yml_location() { if ! [ -z ${COMPOSE_YML_FILE+x} ]; then ## if set, even if empty echo "$COMPOSE_YML_FILE" @@ -2198,6 +2222,7 @@ get_compose_yml_location() { } export -f get_compose_yml_location + get_compose_yml_content() { local cache_file="$state_tmpdir/$FUNCNAME.cache" if [ -e "$cache_file" ]; then @@ -2294,6 +2319,7 @@ get_docker_compose_help_msg() { tee "$cache_file" || return 1 } + get_docker_compose_usage() { local action="$1" cache_file="$CACHEDIR/$FUNCNAME.cache.$(echo "$1"; cat "$(which docker-compose)" | md5_compat)" \ docker_compose_help_msg @@ -2330,6 +2356,7 @@ get_docker_compose_opts_help() { tee "$cache_file" || return 1 } + get_docker_compose_commands_help() { local action="$1" cache_file="$CACHEDIR/$FUNCNAME.cache.$(echo "$1"; cat "$(which docker-compose)" | md5_compat)" \ docker_compose_help_msg @@ -2392,10 +2419,10 @@ remove_options_in_option_help_msg() { } - _MULTIOPTION_REGEX='^((-[a-zA-Z]|--[a-zA-Z0-9-]+)(, )?)+' _MULTIOPTION_REGEX_LINE_FILTER=$_MULTIOPTION_REGEX'(\s|=)' + multi_opts_filter() { egrep "$_MULTIOPTION_REGEX_LINE_FILTER" | sed -r "s/^($_MULTIOPTION_REGEX)(\s|=).*$/\1/g" | @@ -2415,6 +2442,7 @@ get_docker_compose_multi_opts_list() { echo "$opts_list" | multi_opts_filter } + get_docker_compose_single_opts_list() { local action="$1" opts_list opts_list=$(get_docker_compose_opts_list "$action") || return 1 @@ -2447,6 +2475,7 @@ display_help() { get_docker_compose_commands_help | sed -r "s/ ([a-z]+)(\s+)/ ${DARKCYAN}\1${NORMAL}\2/g" } + _graph_service() { local service="$1" base="$1" @@ -2557,12 +2586,14 @@ fi) EOF } + cla_contains () { local e for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done return 1 } + filter_docker_compose_help_message() { cat - | sed -r "s/docker-compose run/${DARKWHITE}compose${NORMAL} ${DARKCYAN}$action${NORMAL}/g; @@ -2573,6 +2604,7 @@ filter_docker_compose_help_message() { s/docker-compose/${DARKWHITE}compose${NORMAL}/g" } + graph() { local services=("$@") declare -A entries @@ -2603,6 +2635,7 @@ EOF echo "}" } + cached_wget() { local cache_file="$CACHEDIR/$FUNCNAME.cache.$(echo "$*" | md5_compat)" \ url="$1"