From f0bc155c3b603c9cb076825a2de5b12b3c7e09cd Mon Sep 17 00:00:00 2001 From: Simon Maillard Date: Tue, 1 Oct 2024 12:20:21 +0200 Subject: [PATCH] [FIX] psycopg2 / pg versions auth conflict Downgrade auth method/encryption to md5 if initial odoo version is <=12 and postgres version >=14 --- .../tools/tools_postgres.py | 46 +++++++++++++++---- ...de_pg_auth_method_for_old_versions_test.py | 30 ++++++++++++ 2 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 tests/cli_40_downgrade_pg_auth_method_for_old_versions_test.py diff --git a/odoo_openupgrade_wizard/tools/tools_postgres.py b/odoo_openupgrade_wizard/tools/tools_postgres.py index c9e4854..b63adb8 100644 --- a/odoo_openupgrade_wizard/tools/tools_postgres.py +++ b/odoo_openupgrade_wizard/tools/tools_postgres.py @@ -47,24 +47,54 @@ def get_postgres_container(ctx): logger.info(f"Creating Postgres volume: {volume_name}") client.volumes.create(volume_name) - command = None + command = "postgres" postgres_extra_settings = ctx.obj["config"].get("postgres_extra_settings") if postgres_extra_settings: - command = "postgres" for key, value in postgres_extra_settings.items(): command += f" -c {key}={value}" logger.info(f"Launching Postgres Container. (Image {image_name})") + + # base environement variables + environments = { + "POSTGRES_USER": "odoo", + "POSTGRES_PASSWORD": "odoo", + "POSTGRES_DB": "postgres", + "PGDATA": "/var/lib/postgresql/data/pgdata", + } + + # if postgresql version is >= 14 and odoo <= 12 we need to use md5 for auth + # method and password encryption + try: + postgres_version = float(image_name.split(":")[1]) + except ValueError: + raise Exception( + "Unable to extract postgres version " + f"from image name {image_name}. " + "Define version in the image name is mandatory." + ) + + try: + odoo_start_version = float(ctx.obj["config"]["odoo_versions"][0]) + except ValueError: + raise Exception( + "Unable to extract start odoo version from odoo_versions " + f"{ctx.obj['config']['odoo_versions']}" + ) + + if odoo_start_version <= 12 and postgres_version >= 14: + environments |= { + "POSTGRES_HOST_AUTH_METHOD": "md5", + "POSTGRES_INITDB_ARGS": "--auth-host=md5", + } + + command += " -c password_encryption=md5" + container = run_container( image_name, container_name, command=command, - environments={ - "POSTGRES_USER": "odoo", - "POSTGRES_PASSWORD": "odoo", - "POSTGRES_DB": "postgres", - "PGDATA": "/var/lib/postgresql/data/pgdata", - }, + environments=environments, volumes={ # Data volume volume_name: "/var/lib/postgresql/data/pgdata/", diff --git a/tests/cli_40_downgrade_pg_auth_method_for_old_versions_test.py b/tests/cli_40_downgrade_pg_auth_method_for_old_versions_test.py new file mode 100644 index 0000000..c29af8e --- /dev/null +++ b/tests/cli_40_downgrade_pg_auth_method_for_old_versions_test.py @@ -0,0 +1,30 @@ +from . import cli_runner_invoke, move_to_test_folder + + +def test_cli_downgrade_pg_auth_method_for_old_versions(): + move_to_test_folder() + + cli_runner_invoke( + [ + "init", + "--project-name=test-cli-downgrade-auth-method", + "--initial-version=12.0", + "--final-version=13.0", + "--postgresql-version=14", + ], + ) + + move_to_test_folder() + cli_runner_invoke(["get-code"]) + cli_runner_invoke(["docker-build", "--versions=12.0"]) + + db_name = "database_test_cli-downgrade-auth-method__run" + cli_runner_invoke( + [ + "run", + "--step=1", + f"--database={db_name}", + "--init-modules=base", + "--stop-after-init", + ], + )