|
|
@ -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" |
|
|
|