#!/usr/bin/env bash set -euo pipefail COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.decommission.yml}" SERVICE_NAME="${SERVICE_NAME:-rustfs-decommission-latest}" MC_ALIAS_NAME="${MC_ALIAS_NAME:-rustfs-decom}" S3_ENDPOINT="${S3_ENDPOINT:-http://127.0.0.1:9100}" ACCESS_KEY="${ACCESS_KEY:-rustfsadmin}" SECRET_KEY="${SECRET_KEY:-rustfsadmin}" DOCKERFILE_PATH="${DOCKERFILE_PATH:-Dockerfile.decommission-local}" DOCKER_IMAGE_NAME="${DOCKER_IMAGE_NAME:-rustfs-local:decommission-latest}" POOL0_CMDLINE="${POOL0_CMDLINE:-/data/pool0/disk{1...4}}" POOL1_CMDLINE="${POOL1_CMDLINE:-/data/pool1/disk{1...4}}" HEALTH_TIMEOUT_SECONDS="${HEALTH_TIMEOUT_SECONDS:-1200}" usage() { cat </dev/null 2>&1; then echo "missing required binary: $1" >&2 exit 1 fi } compose() { docker compose -f "${COMPOSE_FILE}" "$@" } wait_healthy() { local elapsed=0 local container_id container_id="$(compose ps -q "${SERVICE_NAME}")" if [[ -z "${container_id}" ]]; then echo "container not found for service ${SERVICE_NAME}" >&2 exit 1 fi while (( elapsed < HEALTH_TIMEOUT_SECONDS )); do local status status="$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "${container_id}")" if [[ "${status}" == "healthy" || "${status}" == "running" ]]; then echo "container is ${status}" return fi sleep 5 elapsed=$((elapsed + 5)) done echo "container did not become healthy within ${HEALTH_TIMEOUT_SECONDS}s" >&2 compose logs --tail=200 "${SERVICE_NAME}" || true exit 1 } configure_alias() { require_bin mc mc alias set "${MC_ALIAS_NAME}" "${S3_ENDPOINT}" "${ACCESS_KEY}" "${SECRET_KEY}" >/dev/null echo "mc alias configured: ${MC_ALIAS_NAME} -> ${S3_ENDPOINT}" } up() { require_bin docker require_bin mc mkdir -p deploy/data/decommission deploy/logs/decommission compose up -d wait_healthy configure_alias info } build_image() { require_bin docker docker build -f "${DOCKERFILE_PATH}" -t "${DOCKER_IMAGE_NAME}" . } down() { require_bin docker compose down } reset() { require_bin docker compose down -v --remove-orphans || true rm -rf deploy/data/decommission deploy/logs/decommission .tmp/decommission-validation echo "local decommission docker environment reset" } info() { cat <