[IMP] add structured logging functions

Add logging functions to lib/common.sh for consistent output formatting:
- log_info(): Standard informational messages with [INFO] prefix
- log_warn(): Warning messages to stderr with [WARN] prefix
- log_error(): Error messages to stderr with [ERROR] prefix
- log_step(): Section headers with visual separators

Update upgrade.sh to use these functions throughout, replacing ad-hoc
echo statements. This provides:
- Consistent visual formatting across all scripts
- Clear distinction between info, warnings and errors
- Errors properly sent to stderr
- Easier log parsing and filtering

Also removed redundant '|| exit 1' statements since set -e handles
command failures automatically.
This commit is contained in:
Stéphan Sainléger
2026-02-02 17:58:42 +01:00
parent 914ae34f12
commit d3f0998036
2 changed files with 50 additions and 92 deletions

View File

@@ -9,6 +9,11 @@ set -euo pipefail
readonly DATASTORE_PATH="/srv/datastore/data" readonly DATASTORE_PATH="/srv/datastore/data"
readonly FILESTORE_SUBPATH="var/lib/odoo/filestore" readonly FILESTORE_SUBPATH="var/lib/odoo/filestore"
log_info() { printf "[INFO] %s\n" "$*"; }
log_warn() { printf "[WARN] %s\n" "$*" >&2; }
log_error() { printf "[ERROR] %s\n" "$*" >&2; }
log_step() { printf "\n===== %s =====\n" "$*"; }
query_postgres_container() { query_postgres_container() {
local query="$1" local query="$1"
local db_name="$2" local db_name="$2"
@@ -58,4 +63,5 @@ exec_python_script_in_odoo_shell() {
} }
export DATASTORE_PATH FILESTORE_SUBPATH export DATASTORE_PATH FILESTORE_SUBPATH
export -f log_info log_warn log_error log_step
export -f query_postgres_container copy_database copy_filestore exec_python_script_in_odoo_shell export -f query_postgres_container copy_database copy_filestore exec_python_script_in_odoo_shell

View File

@@ -25,7 +25,7 @@ EOF
} }
if [[ $# -lt 4 ]]; then if [[ $# -lt 4 ]]; then
echo "ERROR: Missing arguments. Expected 4, got $#." >&2 log_error "Missing arguments. Expected 4, got $#."
usage usage
fi fi
@@ -51,151 +51,103 @@ POSTGRES_CONTAINERS=$(docker ps --format '{{.Names}}' | grep postgres)
POSTGRES_COUNT=$(echo "$POSTGRES_CONTAINERS" | grep -c .) POSTGRES_COUNT=$(echo "$POSTGRES_CONTAINERS" | grep -c .)
if [[ "$POSTGRES_COUNT" -eq 0 ]]; then if [[ "$POSTGRES_COUNT" -eq 0 ]]; then
echo "ERROR: No running PostgreSQL container found. Please start a PostgreSQL container and try again." >&2 log_error "No running PostgreSQL container found. Please start a PostgreSQL container and try again."
exit 1 exit 1
elif [[ "$POSTGRES_COUNT" -gt 1 ]]; then elif [[ "$POSTGRES_COUNT" -gt 1 ]]; then
echo "ERROR: Multiple PostgreSQL containers found:" >&2 log_error "Multiple PostgreSQL containers found:"
echo "$POSTGRES_CONTAINERS" >&2 echo "$POSTGRES_CONTAINERS" >&2
echo "Please ensure only one PostgreSQL container is running." >&2 log_error "Please ensure only one PostgreSQL container is running."
exit 1 exit 1
fi fi
export POSTGRES_SERVICE_NAME="$POSTGRES_CONTAINERS" export POSTGRES_SERVICE_NAME="$POSTGRES_CONTAINERS"
############################################# log_step "INPUT PARAMETERS"
# DISPLAYS ALL INPUTS PARAMETERS log_info "Origin version .......... $ORIGIN_VERSION"
############################################# log_info "Final version ........... $FINAL_VERSION"
log_info "Origin DB name ........... $ORIGIN_DB_NAME"
log_info "Origin service name ..... $ORIGIN_SERVICE_NAME"
echo "===== INPUT PARAMETERS =====" log_step "COMPUTED GLOBAL VARIABLES"
echo "Origin version .......... $ORIGIN_VERSION" log_info "Copy DB name ............. $COPY_DB_NAME"
echo "Final version ........... $FINAL_VERSION" log_info "Finale DB name ........... $FINALE_DB_NAME"
echo "Origin DB name ........... $ORIGIN_DB_NAME" log_info "Finale service name ...... $FINALE_SERVICE_NAME"
echo "Origin service name ..... $ORIGIN_SERVICE_NAME" log_info "Postgres service name .... $POSTGRES_SERVICE_NAME"
echo "
===== COMPUTED GLOBALE VARIABLES ====="
echo "Copy DB name ............. $COPY_DB_NAME"
echo "Finale DB name ........... $FINALE_DB_NAME"
echo "Finale service name ...... $FINALE_SERVICE_NAME"
echo "Postgres service name .... $POSTGRES_SERVICE_NAME"
############################################## log_step "CHECKS ALL NEEDED COMPONENTS ARE AVAILABLE"
# CHECKS ALL NEEDED COMPONENTS ARE AVAILABLE #
##############################################
echo "
==== CHECKS ALL NEEDED COMPONENTS ARE AVAILABLE ===="
# Check origin database is in the local postgres
DB_EXISTS=$(docker exec -it -u 70 "$POSTGRES_SERVICE_NAME" psql -tc "SELECT 1 FROM pg_database WHERE datname = '$ORIGIN_DB_NAME'" | tr -d '[:space:]') DB_EXISTS=$(docker exec -it -u 70 "$POSTGRES_SERVICE_NAME" psql -tc "SELECT 1 FROM pg_database WHERE datname = '$ORIGIN_DB_NAME'" | tr -d '[:space:]')
if [[ "$DB_EXISTS" ]]; then if [[ "$DB_EXISTS" ]]; then
echo "UPGRADE: Database '$ORIGIN_DB_NAME' found." log_info "Database '$ORIGIN_DB_NAME' found."
else else
echo "ERROR: Database '$ORIGIN_DB_NAME' not found in the local postgress service. Please add it and restart the upgrade process." log_error "Database '$ORIGIN_DB_NAME' not found in the local postgres service. Please add it and restart the upgrade process."
exit 1 exit 1
fi fi
# Check that the origin filestore exist REPERTOIRE="${DATASTORE_PATH}/${ORIGIN_SERVICE_NAME}/${FILESTORE_SUBPATH}/${ORIGIN_DB_NAME}"
REPERTOIRE="/srv/datastore/data/${ORIGIN_SERVICE_NAME}/var/lib/odoo/filestore/${ORIGIN_DB_NAME}"
if [[ -d "$REPERTOIRE" ]]; then if [[ -d "$REPERTOIRE" ]]; then
echo "UPGRADE: '$REPERTOIRE' filestore found." log_info "Filestore '$REPERTOIRE' found."
else else
echo "ERROR: '$REPERTOIRE' filestore not found, please add it and restart the upgrade process." log_error "Filestore '$REPERTOIRE' not found, please add it and restart the upgrade process."
exit 1 exit 1
fi fi
####################################### log_step "LAUNCH VIRGIN ODOO IN FINAL VERSION"
# LAUNCH VIRGIN ODOO IN FINAL VERSION #
#######################################
# Remove finale database and datastore if already exists (we need a virgin Odoo)
if docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm ls | grep -q "$FINALE_SERVICE_NAME"; then if docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm ls | grep -q "$FINALE_SERVICE_NAME"; then
log_info "Removing existing finale database and filestore..."
docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm rm -f "$FINALE_SERVICE_NAME" docker exec -u 70 "$POSTGRES_SERVICE_NAME" pgm rm -f "$FINALE_SERVICE_NAME"
sudo rm -rf /srv/datastore/data/"$FINALE_SERVICE_NAME"/var/lib/odoo/filestore/"$FINALE_SERVICE_NAME" sudo rm -rf "${DATASTORE_PATH}/${FINALE_SERVICE_NAME}/${FILESTORE_SUBPATH}/${FINALE_SERVICE_NAME}"
fi fi
compose --debug run "$FINALE_SERVICE_NAME" -i base --stop-after-init --no-http compose --debug run "$FINALE_SERVICE_NAME" -i base --stop-after-init --no-http
echo "Model database in final Odoo version created." log_info "Model database in final Odoo version created."
############################ log_step "COPY ORIGINAL COMPONENTS"
# COPY ORIGINAL COMPONENTS #
############################
echo " copy_database "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME"
==== COPY ORIGINAL COMPONENTS ====" log_info "Original database copied to ${COPY_DB_NAME}@${COPY_DB_NAME}."
echo "UPGRADE: Start copy"
# Copy database copy_filestore "$ORIGIN_SERVICE_NAME" "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME"
copy_database "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME" || exit 1 log_info "Original filestore copied."
echo "UPGRADE: original database copied in ${COPY_DB_NAME}@${COPY_DB_NAME}."
# Copy filestore
copy_filestore "$ORIGIN_SERVICE_NAME" "$ORIGIN_DB_NAME" "$COPY_DB_NAME" "$COPY_DB_NAME" || exit 1
echo "UPGRADE: original filestore copied."
##################### log_step "PATH OF MIGRATION"
# PATH OF MIGRATION #
####################
echo "
==== PATH OF MIGRATION ===="
# List all the versions to migrate through
declare -a versions declare -a versions
nb_migrations=$((FINAL_VERSION - ORIGIN_VERSION)) nb_migrations=$((FINAL_VERSION - ORIGIN_VERSION))
# Build the migration path
for ((i = 0; i < nb_migrations; i++)); do for ((i = 0; i < nb_migrations; i++)); do
versions[i]=$((ORIGIN_VERSION + 1 + i)) versions[i]=$((ORIGIN_VERSION + 1 + i))
done done
echo "UPGRADE: Migration path is ${versions[@]}" log_info "Migration path is ${versions[*]}"
######################## log_step "DATABASE PREPARATION"
# DATABASE PREPARATION #
########################
echo " ./prepare_db.sh "$COPY_DB_NAME" "$COPY_DB_NAME" "$FINALE_DB_MODEL_NAME" "$FINALE_SERVICE_NAME"
==== DATABASE PREPARATION ===="
./prepare_db.sh "$COPY_DB_NAME" "$COPY_DB_NAME" "$FINALE_DB_MODEL_NAME" "$FINALE_SERVICE_NAME" || exit 1
################### log_step "UPGRADE PROCESS"
# UPGRADE PROCESS #
###################
for version in "${versions[@]}" for version in "${versions[@]}"; do
do log_info "START UPGRADE TO ${version}.0"
echo "START UPGRADE TO ${version}.0"
start_version=$((version-1))
end_version="$version"
### Go to the repository holding the upgrate scripts cd "${version}.0"
cd "${end_version}.0"
### Execute pre_upgrade scripts ./pre_upgrade.sh
./pre_upgrade.sh || exit 1 ./upgrade.sh
./post_upgrade.sh
### Start upgrade
./upgrade.sh || exit 1
### Execute post-upgrade scripts
./post_upgrade.sh || exit 1
### Return to parent repository for the following steps
cd .. cd ..
echo "END UPGRADE TO ${version}.0" log_info "END UPGRADE TO ${version}.0"
done done
## END UPGRADE LOOP
########################## log_step "POST-UPGRADE PROCESSES"
# POST-UPGRADE PROCESSES #
##########################
./finalize_db.sh "$FINALE_DB_NAME" "$FINALE_SERVICE_NAME" || exit 1
./finalize_db.sh "$FINALE_DB_NAME" "$FINALE_SERVICE_NAME"
echo "UPGRADE PROCESS ENDED WITH SUCCESS" log_step "UPGRADE PROCESS ENDED WITH SUCCESS"