From 076a7bb3eb7c642f7bbe581d0b6534d60a48c893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Mon, 25 Nov 2024 15:35:05 +0100 Subject: [PATCH] [NEW] add first version of 0k Odoo Upgrade scripts --- 13.0/post_upgrade.sh | 0 13.0/pre_upgrade.sh | 45 +++++++++++ 13.0/upgrade.sh | 3 + 14.0/post_upgrade.sh | 0 14.0/pre_upgrade.sh | 37 +++++++++ 14.0/upgrade.sh | 3 + 15.0/post_upgrade.sh | 0 15.0/pre_upgrade.sh | 43 ++++++++++ 15.0/upgrade.sh | 3 + 16.0/post_upgrade.sh | 0 16.0/pre_upgrade.sh | 51 ++++++++++++ 16.0/upgrade.sh | 3 + 404_addons | 8 ++ combined_addons | 32 ++++++++ compose.yml | 78 ++++++++++++++++++ finalize_db.sh | 38 +++++++++ force_uninstall_addons | 24 ++++++ prepare_db.sh | 174 +++++++++++++++++++++++++++++++++++++++++ upgrade.sh | 172 ++++++++++++++++++++++++++++++++++++++++ 19 files changed, 714 insertions(+) create mode 100644 13.0/post_upgrade.sh create mode 100644 13.0/pre_upgrade.sh create mode 100644 13.0/upgrade.sh create mode 100644 14.0/post_upgrade.sh create mode 100644 14.0/pre_upgrade.sh create mode 100644 14.0/upgrade.sh create mode 100644 15.0/post_upgrade.sh create mode 100644 15.0/pre_upgrade.sh create mode 100644 15.0/upgrade.sh create mode 100644 16.0/post_upgrade.sh create mode 100644 16.0/pre_upgrade.sh create mode 100644 16.0/upgrade.sh create mode 100644 404_addons create mode 100644 combined_addons create mode 100644 compose.yml create mode 100755 finalize_db.sh create mode 100644 force_uninstall_addons create mode 100755 prepare_db.sh create mode 100755 upgrade.sh diff --git a/13.0/post_upgrade.sh b/13.0/post_upgrade.sh new file mode 100644 index 0000000..e69de29 diff --git a/13.0/pre_upgrade.sh b/13.0/pre_upgrade.sh new file mode 100644 index 0000000..9115a68 --- /dev/null +++ b/13.0/pre_upgrade.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ -z "$query" ]; then + return 0 + fi + local result + if ! result=$(docker exec -u 70 "$DB_CONTAINER_NAME" psql -d ou13 -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) + echo "$result" +} + +echo "Prepare migration to 13.0..." + +# Copy database +docker exec -u 70 "$DB_CONTAINER_NAME" pgm cp -f ou12 ou13@ou13 + +# Execute SQL pre-migration commands +PRE_MIGRATE_SQL=$(cat <<'EOF' +/* Add analytic_policy column as openupgrade script is waiting for it whereas it doesn't existe since v12. */ +ALTER TABLE public.account_account_type ADD analytic_policy varchar NULL; + +/* The model in missing on some website_sale data */ +UPDATE ir_model_data SET model = 'ir.ui.view' WHERE module = 'website_sale' AND name = 'recommended_products'; +UPDATE ir_model_data SET model = 'ir.ui.view' WHERE module = 'website_sale' AND name = 'product_comment'; +EOF +) +query_postgres_container "$PRE_MIGRATE_SQL" + + +# Copy filestores +rm -rf /srv/datastore/data/ou13/var/lib/odoo/filestore/ou13/* || exit 1 +mkdir /srv/datastore/data/ou13/var/lib/odoo/filestore/ou13/* || exit 1 +cp -a /srv/datastore/data/ou12/var/lib/odoo/filestore/ou12/* /srv/datastore/data/ou13/var/lib/odoo/filestore/ou13/ || exit 1 + +echo "Ready for migration to 13.0!" diff --git a/13.0/upgrade.sh b/13.0/upgrade.sh new file mode 100644 index 0000000..2eed92f --- /dev/null +++ b/13.0/upgrade.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +compose -f ../compose.yml run -p 8013:8069 ou13 --config=/opt/odoo/auto/odoo.conf --stop-after-init -u all --workers 0 --log-level=warn --max-cron-threads=0 --limit-time-real=10000 --database=ou13 diff --git a/14.0/post_upgrade.sh b/14.0/post_upgrade.sh new file mode 100644 index 0000000..e69de29 diff --git a/14.0/pre_upgrade.sh b/14.0/pre_upgrade.sh new file mode 100644 index 0000000..fef1935 --- /dev/null +++ b/14.0/pre_upgrade.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ -z "$query" ]; then + return 0 + fi + local result + if ! result=$(docker exec -u 70 "$DB_CONTAINER_NAME" psql -d ou14 -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) + echo "$result" +} + +echo "Prepare migration to 14.0..." + +# Copy database +docker exec -u 70 "$DB_CONTAINER_NAME" pgm cp -f ou13 ou14@ou14 + +# Execute SQL pre-migration commands +PRE_MIGRATE_SQL="" +query_postgres_container "$PRE_MIGRATE_SQL" + + +# Copy filestores +rm -rf /srv/datastore/data/ou14/var/lib/odoo/filestore/ou14/* || exit 1 +mkdir /srv/datastore/data/ou14/var/lib/odoo/filestore/ou14/* || exit 1 +cp -a /srv/datastore/data/ou13/var/lib/odoo/filestore/ou13/* /srv/datastore/data/ou14/var/lib/odoo/filestore/ou14/ || exit 1 + +echo "Ready for migration to 14.0!" diff --git a/14.0/upgrade.sh b/14.0/upgrade.sh new file mode 100644 index 0000000..2ca66b2 --- /dev/null +++ b/14.0/upgrade.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +compose -f ../compose.yml run -p 8014:8069 ou14 --config=/opt/odoo/auto/odoo.conf --stop-after-init -u all --workers 0 --log-level=warn --max-cron-threads=0 --limit-time-real=10000 --database=ou14 --load=web,openupgrade_framework diff --git a/15.0/post_upgrade.sh b/15.0/post_upgrade.sh new file mode 100644 index 0000000..e69de29 diff --git a/15.0/pre_upgrade.sh b/15.0/pre_upgrade.sh new file mode 100644 index 0000000..f7a21d8 --- /dev/null +++ b/15.0/pre_upgrade.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ -z "$query" ]; then + return 0 + fi + local result + + if ! result=$(docker exec -u 70 "$DB_CONTAINER_NAME" psql -d ou15 -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) +} + +echo "Prepare migration to 15.0..." + +# Copy database +docker exec -u 70 "$DB_CONTAINER_NAME" pgm cp -f ou14 ou15@ou15 + +# Execute SQL pre-migration commands +PRE_MIGRATE_SQL=$(cat <<'EOF' +/* Delete add-on 'account_usability' as its name has changed and another 'account_usability' add-on is created */ +DELETE FROM ir_module_module WHERE name = 'account_usability'; +DELETE FROM ir_model_data WHERE module = 'base' AND name = 'module_account_usability'; +EOF +) +echo "SQL command = $PRE_MIGRATE_SQL" +query_postgres_container "$PRE_MIGRATE_SQL" >&1 + + +# Copy filestores +rm -rf /srv/datastore/data/ou15/var/lib/odoo/filestore/ou15/* || exit 1 +mkdir /srv/datastore/data/ou15/var/lib/odoo/filestore/ou15/* || exit 1 +cp -a /srv/datastore/data/ou14/var/lib/odoo/filestore/ou14/* /srv/datastore/data/ou15/var/lib/odoo/filestore/ou15/ || exit 1 + +echo "Ready for migration to 15.0!" diff --git a/15.0/upgrade.sh b/15.0/upgrade.sh new file mode 100644 index 0000000..1344971 --- /dev/null +++ b/15.0/upgrade.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +compose -f ../compose.yml run -p 8015:8069 ou15 --config=/opt/odoo/auto/odoo.conf --stop-after-init -u all --workers 0 --log-level=warn --max-cron-threads=0 --limit-time-real=10000 --database=ou15 --load=web,openupgrade_framework diff --git a/16.0/post_upgrade.sh b/16.0/post_upgrade.sh new file mode 100644 index 0000000..e69de29 diff --git a/16.0/pre_upgrade.sh b/16.0/pre_upgrade.sh new file mode 100644 index 0000000..2d745be --- /dev/null +++ b/16.0/pre_upgrade.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ -z "$query" ]; then + return 0 + fi + local result + if ! result=$(docker exec -u 70 "$DB_CONTAINER_NAME" psql -d ou16 -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) + echo "$result" +} + +echo "Prepare migration to 16.0..." + +# Copy database +docker exec -u 70 "$DB_CONTAINER_NAME" pgm cp -f ou15 ou16@ou16 + +# Execute SQL pre-migration commands +PRE_MIGRATE_SQL=$(cat <<'EOF' +/* Remove duplicate entries in model utm.source */ +DELETE FROM utm_source +WHERE id IN ( + SELECT id + FROM ( + SELECT id, + ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) as row_num + FROM utm_source + ) t + WHERE t.row_num > 1 +); +EOF + ) +echo "SQL command = $PRE_MIGRATE_SQL" +query_postgres_container "$PRE_MIGRATE_SQL" + + +# Copy filestores +rm -rf /srv/datastore/data/ou16/var/lib/odoo/filestore/ou16/* || exit 1 +mkdir /srv/datastore/data/ou16/var/lib/odoo/filestore/ou16/* || exit 1 +cp -a /srv/datastore/data/ou15/var/lib/odoo/filestore/ou15/* /srv/datastore/data/ou16/var/lib/odoo/filestore/ou16/ || exit 1 + +echo "Ready for migration to 16.0!" diff --git a/16.0/upgrade.sh b/16.0/upgrade.sh new file mode 100644 index 0000000..be99295 --- /dev/null +++ b/16.0/upgrade.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +compose -f ../compose.yml run -p 8016:8069 ou16 --config=/opt/odoo/auto/odoo.conf --stop-after-init -u all --workers 0 --log-level=warn --max-cron-threads=0 --limit-time-real=10000 --database=ou16 --load=web,openupgrade_framework diff --git a/404_addons b/404_addons new file mode 100644 index 0000000..20bebd5 --- /dev/null +++ b/404_addons @@ -0,0 +1,8 @@ +account_balance_line +account_menu +account_statement_import +account_statement_import_file_reconciliation_widget +project_mail_chatter +project_timeline_task_dependency +web_drop_target +web_ir_actions_act_view_reload diff --git a/combined_addons b/combined_addons new file mode 100644 index 0000000..ce08052 --- /dev/null +++ b/combined_addons @@ -0,0 +1,32 @@ +account_balance_line +account_menu +account_statement_import +account_statement_import_file_reconciliation_widget +project_mail_chatter +project_timeline_task_dependency +web_drop_target +web_ir_actions_act_view_reload +galicea_base +galicea_environment_checkup +mass_editing +mass_mailing_themes +muk_autovacuum +muk_fields_lobject +muk_fields_stream +muk_utils +muk_web_theme_mail +muk_web_utils +account_usability +kpi_dashboard +web_window_title +website_project_kanbanview +project_usability +project_tag +maintenance_server_monitoring_ping +maintenance_server_monitoring_ssh +maintenance_server_monitoring_memory +maintenance_server_monitoring_maintenance_equipment_status +maintenance_server_monitoring_disk +project_task_assignees_avatar +account_partner_reconcile +account_invoice_import_simple_pdf diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..631b5c2 --- /dev/null +++ b/compose.yml @@ -0,0 +1,78 @@ +ou12: + charm: odoo-tecnativa + docker-compose: + image: docker.0k.io/mirror/odoo:rc_12.0-MYC-INIT-3.7 + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + +ou13: + charm: odoo-tecnativa + docker-compose: + image: docker.0k.io/mirror/odoo:rc_13.0-MYC-INIT-OU + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + + +ou14: + charm: odoo-tecnativa + docker-compose: + image: docker.0k.io/mirror/odoo:rc_14.0-MYC-INIT + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + + +ou15: + charm: odoo-tecnativa + docker-compose: + #image: docker.0k.io/mirror/odoo:rc_15.0-MYC-INIT + image: docker.0k.io/mirror/odoo/rc_15.0-myc-init-20241007-092844-0f8b8b + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + +ou16: + charm: odoo-tecnativa + docker-compose: + image: docker.0k.io/mirror/odoo:rc_16.0-MYC-INIT + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + +ou17: + charm: odoo-tecnativa + docker-compose: + image: docker.0k.io/mirror/odoo:rc_17.0-MYC-INIT + ## Important to keep as a list: otherwise it'll overwrite charm's arguments. + command: + - "--log-level=debug" + - "--limit-time-cpu=1000000" + - "--limit-time-real=1000000" + options: + workers: 0 + +postgres: + docker-compose: + image: docker.0k.io/postgres:12.15.0-myc diff --git a/finalize_db.sh b/finalize_db.sh new file mode 100755 index 0000000..1a95daa --- /dev/null +++ b/finalize_db.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +DB_NAME="$1" +ODOO_SERVICE="$2" +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ "$query" ]; then + return 0 + fi + local result + if ! result=$(docker exec -u 70 "$DB_CONTAINER_NAME" psql -d "$DB_NAME" -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) + echo "$result" +} + +FINALE_SQL=$(cat <<'EOF' +/*Delte sequences that prevent Odoo to start*/ +drop sequence base_registry_signaling; +drop sequence base_cache_signaling; +EOF +) +query_postgres_container "$FINALE_SQL" + + +# Give back the right to user to access to the tables +# docker exec -u 70 "$DB_CONTAINER_NAME" pgm chown "$FINALE_SERVICE_NAME" "$DB_NAME" + + +# Launch Odoo with database in finale version to run all updates +compose --debug run "$ODOO_SERVICE" -u all --stop-after-init --no-http diff --git a/force_uninstall_addons b/force_uninstall_addons new file mode 100644 index 0000000..4512dcd --- /dev/null +++ b/force_uninstall_addons @@ -0,0 +1,24 @@ +galicea_base +galicea_environment_checkup +mass_editing +mass_mailing_themes +muk_autovacuum +muk_fields_lobject +muk_fields_stream +muk_utils +muk_web_theme_mail +muk_web_utils +account_usability +kpi_dashboard +web_window_title +website_project_kanbanview +project_usability +project_tag +maintenance_server_monitoring_ping +maintenance_server_monitoring_ssh +maintenance_server_monitoring_memory +maintenance_server_monitoring_maintenance_equipment_status +maintenance_server_monitoring_disk +project_task_assignees_avatar +account_partner_reconcile +account_invoice_import_simple_pdf diff --git a/prepare_db.sh b/prepare_db.sh new file mode 100755 index 0000000..ce20739 --- /dev/null +++ b/prepare_db.sh @@ -0,0 +1,174 @@ +#!/bin/bash + +# Global variables +ODOO_SERVICE="$1" +DB_NAME="$2" +DB_FINALE_MODEL="$3" +DB_FINALE_SERVICE="$4" +DB_CONTAINER_NAME="lokavaluto_postgres_1" + +# Function to launch an SQL request to the postgres container +query_postgres_container(){ + local query="$1" + if [ -z "$query" ]; then + return 0 + fi + local result + if ! result=$(docker exec -u 70 $DB_CONTAINER_NAME psql -d $DB_NAME -t -A -c "$query" 2>&1); then + printf "Failed to execute SQL query: %s\n" "$query" >&2 + printf "Error: %s\n" "$result" >&2 + exit 1 + fi + # Remove leading/trailing whitespace from result + result=$(echo "$result" | xargs) + echo "$result" +} + + +# Function to display the combined list of add-ons to uninstall +display_combined_list(){ + cat 404_addons force_uninstall_addons > combined_addons + echo "UPGRADE: Add-ons to uninstall (forced and not found in final Odoo version):" + cat combined_addons +} + +# Function to ask if the add-ons list to uninstall is OK +ask_confirmation() { + while true; do + echo " +Do you accept to uninstall all these add-ons? (Y/N/R)" + echo "Y - Yes, let's go on with the upgrade." + echo "N - No, stop the upgrade" + echo "R - I've edited the list, please Re-display it" + read -p "Your choice: " choice + case $choice in + [Yy]* ) return 0;; + [Nn]* ) return 1;; + [Rr]* ) display_combined_list; continue;; + * ) echo "Please answer by Y, N or R.";; + esac + done +} + +# Read names from file and create SQL commands +generate_sql_to_remove_commands() { + local name + local sql_commands="" + while IFS= read -r name; do + sql_commands+="UPDATE ir_module_module SET to_remove = TRUE WHERE name = '$name';" + done < combined_addons + echo "$sql_commands" +} + +# Main execution +echo "UPGRADE: Start database preparation" + +# Check POSTGRES container is running +if ! docker ps | grep -q "lokavaluto_postgres_1"; then + printf "Docker container %s is not running.\n" "lokavaluto_postgres_1" >&2 + return 1 +fi + +EXT_EXISTS=$(query_postgres_container "SELECT 1 FROM pg_extension WHERE extname = 'dblink'") +if [ "$EXT_EXISTS" != "1" ]; then + query_postgres_container "CREATE EXTENSION dblink;" +fi + +# Neutralize the database +SQL_NEUTRALIZE=$(cat <<'EOF' +/* Archive all the mail servers */ +UPDATE fetchmail_server SET active = false; +UPDATE ir_mail_server SET active = false; + +/* Archive all the cron */ +ALTER TABLE ir_cron ADD COLUMN IF NOT EXISTS active_bkp BOOLEAN; +UPDATE ir_cron SET active_bkp = active; +UPDATE ir_cron SET active = False; +EOF +) +query_postgres_container "$SQL_NEUTRALIZE" + +################################ +## Uninstall unwished add-ons ## +################################ + +# Add columns to_remove and dependencies +SQL_INIT=$(cat <<'EOF' +ALTER TABLE ir_module_module ADD COLUMN IF NOT EXISTS to_remove BOOLEAN; +ALTER TABLE ir_module_module ADD COLUMN IF NOT EXISTS dependencies VARCHAR; +UPDATE ir_module_module SET state = 'installed' WHERE state = 'to_remove'; +UPDATE ir_module_module SET to_remove = false; +UPDATE ir_module_module SET dependencies = ''; +EOF +) +query_postgres_container "$SQL_INIT" + + +# List add-ons not available on the final Odoo version +SQL_404_ADDONS_LIST=" + SELECT module_origin.name + FROM ir_module_module module_origin + LEFT JOIN ( + SELECT * + FROM dblink('dbname=$DB_FINALE_MODEL','SELECT name, shortdesc, author FROM ir_module_module') + AS tb2(name text, shortdesc text, author text) + ) AS module_dest ON module_dest.name = module_origin.name + + WHERE (module_dest.name IS NULL) AND (module_origin.state = 'installed') AND (module_origin.author NOT IN ('Odoo S.A.', 'Lokavaluto', 'Elabore')) + ORDER BY module_origin.name +; +" +query_postgres_container "$SQL_404_ADDONS_LIST" > 404_addons + + +# Ask confirmation to uninstall the selected add-ons +display_combined_list + + +if ask_confirmation; then + echo "Upgrade goes on..." +else + echo "Upgrade stopped." + exit 1 +fi + + + +# Tag the selected add-ons as "to remove" +echo "TAG the add-ons to remove..." +SQL_TAG_TO_REMOVE="" +while IFS= read -r name; do + SQL_TAG_TO_REMOVE+="UPDATE ir_module_module SET to_remove = TRUE WHERE name = '$name' AND state = 'installed';" +done < combined_addons +query_postgres_container "$SQL_TAG_TO_REMOVE" +echo "Add-ons to be removed TAGGED." + + +# Identify the add-ons which depend on the add-on to uninstall +echo "Detect and tag add-ons dependencies..." +SQL_DEPENDENCIES=" + UPDATE ir_module_module imm SET to_remove = true, dependencies = immd.name + FROM ir_module_module_dependency immd + WHERE immd.module_id = imm.id AND imm.state = 'installed' AND imm.to_remove = false + AND immd.name IN ( + SELECT name FROM ir_module_module WHERE to_remove = True + ); +" +updated="" +while [[ "$updated" != "UPDATE 0" ]]; do + updated=$(query_postgres_container "$SQL_DEPENDENCIES") +done; +echo "All dependencies to remove TAGGED" + + +# Change state of add-ons to remove +echo "Change state of all add-ons to remove..." +SQL_UPDATE_STATE="UPDATE ir_module_module SET state = 'to remove' WHERE to_remove = TRUE AND state = 'installed';" +query_postgres_container "$SQL_UPDATE_STATE" +echo "Add-ons to remove with state 'to_remove'" + + +# Launch Odooo container and launch the uninstall function +echo "Launch Odoo to uninstall add-ons..." +echo "print('START ADD-ONS UNINSTALL'); self.env['ir.module.module'].search([('state', '=', 'to remove')]).button_immediate_uninstall(); print('END ADD-ONS UNINSTALL')" | compose run $ODOO_SERVICE shell --database=$DB_NAME --no-http +echo "Add-ons uninstall successful." diff --git a/upgrade.sh b/upgrade.sh new file mode 100755 index 0000000..19587a2 --- /dev/null +++ b/upgrade.sh @@ -0,0 +1,172 @@ +#!/bin/bash + +#################### +# GLOBAL VARIABLES # +#################### + +ORIGIN_VERSION="$1" # "12" for version 12.0 +FINAL_VERSION="$2" # "16" for version 16.0 +# Path to the database to migrate. Must be a .zip file with the following syntax: {DATABASE_NAME}.zip +ORIGIN_DATABASE_PATH="$3" +ORIGIN_SERVICE_NAME="$4" +FINALE_DB_MODEL_NAME="$5" #To check the add-ons available in the finale version + + +# Get origin database name +ORIGIN_DB_NAME=$(basename "$ORIGIN_DATABASE_PATH" .zip) +COPY_DB_NAME="ou${ORIGIN_VERSION}" +# Define finale database name +FINALE_DB_NAME="ou${FINAL_VERSION}" +# Define finale odoo service name +FINALE_SERVICE_NAME="${FINALE_DB_NAME}" + +# Service postgres name +POSTGRES_SERVICE_NAME="lokavaluto_postgres_1" + +############################################# +# DISPLAYS ALL INPUTS PARAMETERS +############################################# + +echo "===== INPUT PARAMETERS =====" +echo "Origin version .......... $ORIGIN_VERSION" +echo "Final version ........... $FINAL_VERSION" +echo "Origin database path .... $ORIGIN_DATABASE_PATH" +echo "Origin service name ..... $ORIGIN_SERVICE_NAME" +echo "Finale DB model name .... $FINALE_DB_MODEL_NAME" + +echo " +===== COMPUTED GLOBALE VARIABLES =====" +echo "Origin DB name ........... $ORIGIN_DB_NAME" +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" + + +############################################## +# CHECKS ALL NEEDED COMPONANTS ARE AVAILABLE # +############################################## + +echo " +==== CHECKS ALL NEEDED COMPONANTS ARE AVAILABLE ====" + +# Check origin database is in the local postgres +DB_EXISTS=$(docker exec -it -u 70 lokavaluto_postgres_1 psql -tc "SELECT 1 FROM pg_database WHERE datname = '$ORIGIN_DB_NAME'" | tr -d '[:space:]') +if [ "$DB_EXISTS" ]; then + echo "UPGRADE: Database '$ORIGIN_DB_NAME' found." +else + echo "ERROR: Database '$ORIGIN_DB_NAME' not found in the local postgress service. Please add it and restart the upgrade process." + exit 1 +fi + +# Check final version database model is in the local postgres +DB_EXISTS=$(docker exec -it -u 70 lokavaluto_postgres_1 psql -tc "SELECT 1 FROM pg_database WHERE datname = '$FINALE_DB_MODEL_NAME'" | tr -d '[:space:]') +if [ "$DB_EXISTS" ]; then + echo "UPGRADE: Database '$FINALE_DB_MODEL_NAME' found." +else + echo "ERROR: Database '$FINALE_DB_MODEL_NAME' not found in the local postgress service. Please add it and restart the upgrade process." + exit 1 +fi + +# Check that the origin filestore exist +REPERTOIRE="/srv/datastore/data/${ORIGIN_SERVICE_NAME}/var/lib/odoo/filestore/${ORIGIN_DB_NAME}" +if [ -d $REPERTOIRE ]; then + echo "UPGRADE: '$REPERTOIRE' filestore found." +else + echo "ERROR: '$REPERTOIRE' filestore not found, please add it and restart the upgrade process." + exit 1 +fi + +# Check POSTGRES container is running +if ! docker ps | grep -q "lokavaluto_postgres_1"; then + printf "Docker container %s is not running.\n" "lokavaluto_postgres_1" >&2 + return 1 +else + echo "UPGRADE: container lokavaluto_postgres_1 running." +fi + +############################ +# COPY ORIGINAL COMPONANTS # +############################ + +echo " +==== COPY ORIGINAL COMPONANTS ====" +echo "UPGRADE: Start copy" + +# Copy database +docker exec -u 70 lokavaluto_postgres_1 pgm cp -f "$ORIGIN_DB_NAME" "${COPY_DB_NAME}@${COPY_DB_NAME}" || exit 1 +echo "UPGRADE: original database copied in ${COPY_DB_NAME}@${COPY_DB_NAME}." + +# Copy filestore +rm -rf /srv/datastore/data/${COPY_DB_NAME}/var/lib/odoo/filestore/${COPY_DB_NAME} || exit 1 + +mkdir /srv/datastore/data/${COPY_DB_NAME}/var/lib/odoo/filestore/${COPY_DB_NAME} || exit 1 + +cp -a /srv/datastore/data/$ORIGIN_SERVICE_NAME/var/lib/odoo/filestore/$ORIGIN_DB_NAME/* /srv/datastore/data/$COPY_DB_NAME/var/lib/odoo/filestore/$COPY_DB_NAME/. || exit 1 + +echo "UPGRADE: original filestore copied." + + +##################### +# PATH OF MIGRATION # +#################### + +echo " +==== PATH OF MIGRATION ====" +# List all the versions to migrate through +declare -a versions +nb_migrations=$(($FINAL_VERSION - $ORIGIN_VERSION)) + +# Build the migration path +for ((i = 0; i<$nb_migrations; i++)) +do + versions[$i]=$(($ORIGIN_VERSION + 1 + i)) +done +echo "UPGRADE: Migration path is ${versions[@]}" + + +######################## +# DATABASE PREPARATION # +######################## + +echo " +==== DATABASE PREPARATION ====" + +source prepare_db.sh "$COPY_DB_NAME" "$COPY_DB_NAME" "$FINALE_DB_MODEL_NAME" "$FINALE_SERVICE_NAME" + + +################### +# UPGRADE PROCESS # +################### + +for version in "${versions[@]}" +do + echo "START UPGRADE TO ${version}.0" + start_version=$((version-1)) + end_version="$version" + + ### Go to the repository holding the upgrate scripts + cd "${end_version}.0" + + ### Execute pre_upgrade scripts + source ./pre_upgrade.sh + + ### Start upgrade + source ./upgrade.sh + + ### Execute post-upgrade scripts + source ./post_upgrade.sh + + ### Return to parent repository for the following steps + cd .. + echo "END UPGRADE TO ${version}.0" +done +## END UPGRADE LOOP + +########################## +# POST-UPGRADE PROCESSES # +########################## +source finalize_db.sh "$FINALE_DB_NAME" "$FINALE_SERVICE_NAME" + + +echo "UPGRADE PROCESS ENDED WITH SUCCESS"