|
|
@ -104,6 +104,8 @@ else |
|
|
|
fi |
|
|
|
export VARDIR CACHEDIR |
|
|
|
|
|
|
|
export SERVICE_STATE_PATH=${SERVICE_STATE_PATH:-/var/lib/compose/state} |
|
|
|
|
|
|
|
|
|
|
|
md5_compat() { md5sum | cut -c -32; } |
|
|
|
quick_cat_file() { quick_cat_stdin < "$1"; } |
|
|
@ -2672,6 +2674,26 @@ relation:get() { |
|
|
|
} |
|
|
|
export -f relation:get |
|
|
|
|
|
|
|
service:state() { |
|
|
|
local service="$1" states state |
|
|
|
project_name=$(get_default_project_name) || return 1 |
|
|
|
states=() |
|
|
|
for state in "$SERVICE_STATE_PATH"/"$project_name"/"$service"/*; do |
|
|
|
[ -e "$state" ] || continue |
|
|
|
state=${state##*/} |
|
|
|
states+=("$state") |
|
|
|
done |
|
|
|
|
|
|
|
if [[ " ${states[*]} " == *" deploying "* ]]; then |
|
|
|
echo "deploying" |
|
|
|
elif [[ " ${states[*]} " == *" up "* ]]; then |
|
|
|
echo "up" |
|
|
|
else |
|
|
|
echo "down" |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_get_charm_metadata_uses() { |
|
|
@ -5253,6 +5275,58 @@ case "$action" in |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
|
|
|
|
case "$action" in |
|
|
|
up) |
|
|
|
PROJECT_NAME=$(get_default_project_name) || exit 1 |
|
|
|
|
|
|
|
## Remove all intents (*ing states) |
|
|
|
rm -f "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/*ing || true |
|
|
|
|
|
|
|
## Notify that we have the intent to bring up all these |
|
|
|
## This will be use in inner or concurrent 'run' to include the |
|
|
|
## services that are supposed to be up. |
|
|
|
mkdir -p "$SERVICE_STATE_PATH/$PROJECT_NAME" || exit 1 |
|
|
|
services_args_deps=($(get_ordered_service_dependencies "${services_args[@]}")) || exit 1 |
|
|
|
for service in "${services_args_deps[@]}"; do |
|
|
|
mkdir -p "$SERVICE_STATE_PATH/$PROJECT_NAME"/"$service" || exit 1 |
|
|
|
[ -e "$SERVICE_STATE_PATH/$PROJECT_NAME"/"$service"/up ] || { |
|
|
|
touch "$SERVICE_STATE_PATH/$PROJECT_NAME"/"$service"/deploying || exit 1 |
|
|
|
} |
|
|
|
done |
|
|
|
## remove services not included in compose.yml anymore |
|
|
|
all_services_deps=($(get_ordered_service_dependencies "${all_services[@]}")) || exit 1 |
|
|
|
for service in "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/up; do |
|
|
|
[ -e "$service" ] || continue |
|
|
|
state=${service##*/} |
|
|
|
service=${service%/$state} |
|
|
|
service=${service##*/} |
|
|
|
|
|
|
|
if [[ " ${all_services_deps[*]} " != *" ${service} "* ]]; then |
|
|
|
touch "$SERVICE_STATE_PATH/$PROJECT_NAME"/"${service}"/orphaning || exit 1 |
|
|
|
fi |
|
|
|
done |
|
|
|
;; |
|
|
|
|
|
|
|
run) |
|
|
|
PROJECT_NAME=$(get_default_project_name) || return 1 |
|
|
|
if [ -d "$SERVICE_STATE_PATH/$PROJECT_NAME" ]; then |
|
|
|
## Notify that we have the intent to bring up all these |
|
|
|
## This will be use in inner or concurrent 'run' to include the |
|
|
|
## services that are supposed to be up. |
|
|
|
for service in "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/{up,deploying}; do |
|
|
|
[ -e "$service" ] || continue |
|
|
|
state=${service##*/} |
|
|
|
service=${service%/$state} |
|
|
|
service=${service##*/} |
|
|
|
## don't add if orphaning |
|
|
|
[ -e "$SERVICE_STATE_PATH/$PROJECT_NAME"/"${service}"/orphaning ] && continue |
|
|
|
|
|
|
|
done |
|
|
|
fi |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
if [ -n "$is_docker_compose_action_multi_service" ]; then |
|
|
|
if [ -n "$DEBUG" ]; then |
|
|
|
Elt "get relation subset" |
|
|
@ -5459,6 +5533,38 @@ if [ "$action" == "run" -a "${#services_args}" != 0 ]; then |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
case "$action" in |
|
|
|
up) |
|
|
|
## Notify that services in 'deploying' states have been deployed |
|
|
|
for service in "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/deploying; do |
|
|
|
[ -e "$service" ] || continue |
|
|
|
state=${service##*/} |
|
|
|
service=${service%/$state} |
|
|
|
service=${service##*/} |
|
|
|
|
|
|
|
mv "$SERVICE_STATE_PATH/$PROJECT_NAME"/"${service}"/{deploying,up} || exit 1 |
|
|
|
done |
|
|
|
## Notify that services in 'orphaning' states have been removed |
|
|
|
for service in "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/orphaning; do |
|
|
|
[ -e "$service" ] || continue |
|
|
|
state=${service##*/} |
|
|
|
service=${service%/$state} |
|
|
|
service=${service##*/} |
|
|
|
|
|
|
|
rm "$SERVICE_STATE_PATH/$PROJECT_NAME"/"${service}"/orphaning || exit 1 |
|
|
|
done |
|
|
|
;; |
|
|
|
down) |
|
|
|
PROJECT_NAME=$(get_default_project_name) || return 1 |
|
|
|
if [ -d "$SERVICE_STATE_PATH/$PROJECT_NAME" ]; then |
|
|
|
if ! dir_is_empty "$SERVICE_STATE_PATH/$PROJECT_NAME"; then |
|
|
|
rm -f "$SERVICE_STATE_PATH/$PROJECT_NAME"/*/* |
|
|
|
fi |
|
|
|
rmdir "$SERVICE_STATE_PATH/$PROJECT_NAME"/{*,} |
|
|
|
fi |
|
|
|
;; |
|
|
|
esac |
|
|
|
|
|
|
|
clean_unused_docker_compose || exit 1 |
|
|
|
|
|
|
|
exit "$errlvl" |