diff --git a/odoo_openupgrade_wizard/cli.py b/odoo_openupgrade_wizard/cli.py index b27b36d..5bf4b2d 100644 --- a/odoo_openupgrade_wizard/cli.py +++ b/odoo_openupgrade_wizard/cli.py @@ -14,6 +14,9 @@ from odoo_openupgrade_wizard.cli_execute_script_python import ( execute_script_python, ) from odoo_openupgrade_wizard.cli_execute_script_sql import execute_script_sql +from odoo_openupgrade_wizard.cli_generate_module_analysis import ( + generate_module_analysis, +) from odoo_openupgrade_wizard.cli_get_code import get_code from odoo_openupgrade_wizard.cli_init import init from odoo_openupgrade_wizard.cli_install_from_csv import install_from_csv @@ -110,11 +113,12 @@ def main(ctx, env_folder, filestore_folder, log_level): logger.debug("context %s: " % ctx.obj) -main.add_command(init) -main.add_command(get_code) main.add_command(docker_build) -main.add_command(run) -main.add_command(install_from_csv) -main.add_command(upgrade) main.add_command(execute_script_python) main.add_command(execute_script_sql) +main.add_command(generate_module_analysis) +main.add_command(get_code) +main.add_command(init) +main.add_command(install_from_csv) +main.add_command(run) +main.add_command(upgrade) diff --git a/odoo_openupgrade_wizard/cli_generate_module_analysis.py b/odoo_openupgrade_wizard/cli_generate_module_analysis.py new file mode 100644 index 0000000..811dcaa --- /dev/null +++ b/odoo_openupgrade_wizard/cli_generate_module_analysis.py @@ -0,0 +1,86 @@ +import click +from loguru import logger + +from odoo_openupgrade_wizard.cli_options import ( + database_option, + get_migration_steps_from_options, +) +from odoo_openupgrade_wizard.configuration_version_dependant import ( + generate_records, + get_upgrade_analysis_module, +) +from odoo_openupgrade_wizard.tools_odoo import kill_odoo, run_odoo +from odoo_openupgrade_wizard.tools_odoo_instance import OdooInstance + + +@click.command() +@click.option( + "--last-step", + required=True, + prompt=True, + type=int, + help="Last step in witch the analysis will be generated", +) +@click.option( + "--modules", + type=str, + help="Coma-separated list of modules to analysis." + " Let empty to analyse all the modules.", +) +@database_option +@click.pass_context +def generate_module_analysis(ctx, last_step, database, modules): + + migration_steps = get_migration_steps_from_options( + ctx, last_step - 1, last_step + ) + + initial_step = migration_steps[0].copy() + final_step = migration_steps[1].copy() + + if not database: + database = "%s__analysis__" % ( + ctx.obj["config"]["project_name"].replace("-", "_"), + ) + + initial_database = "%s_%s" % ( + database, + str(initial_step["release"]).replace(".", ""), + ) + final_database = "%s_%s" % ( + database, + str(final_step["release"]).replace(".", ""), + ) + + if not modules: + modules = "base" + + # Force to be in openupgrade mode + initial_step["action"] = final_step["action"] = "upgrade" + + try: + run_odoo( + ctx, + initial_step, + database=initial_database, + detached_container=False, + stop_after_init=True, + init=modules + "," + get_upgrade_analysis_module(initial_step), + ) + + run_odoo( + ctx, + initial_step, + database=initial_database, + detached_container=True, + ) + + initial_instance = OdooInstance(ctx, initial_database) + generate_records(initial_instance, initial_step) + + final_database = final_database + except (KeyboardInterrupt, SystemExit): + logger.info("Received Keyboard Interrupt or System Exiting...") + finally: + kill_odoo(ctx, initial_step) + kill_odoo(ctx, final_step) diff --git a/odoo_openupgrade_wizard/cli_options.py b/odoo_openupgrade_wizard/cli_options.py index a7b01fe..8af828e 100644 --- a/odoo_openupgrade_wizard/cli_options.py +++ b/odoo_openupgrade_wizard/cli_options.py @@ -18,7 +18,7 @@ def step_option(function): "--step", required=True, prompt=True, - type=str, + type=int, help="Migration step for which you want to perform the operation.", )(function) return function @@ -27,7 +27,7 @@ def step_option(function): def first_step_option(function): function = click.option( "--first-step", - type=str, + type=int, help="First step for which to perform the operation", )(function) return function @@ -36,7 +36,7 @@ def first_step_option(function): def last_step_option(function): function = click.option( "--last-step", - type=str, + type=int, help="Last step for which to perform the operation", )(function) return function diff --git a/odoo_openupgrade_wizard/configuration_version_dependant.py b/odoo_openupgrade_wizard/configuration_version_dependant.py index 0e8616e..84c94da 100644 --- a/odoo_openupgrade_wizard/configuration_version_dependant.py +++ b/odoo_openupgrade_wizard/configuration_version_dependant.py @@ -1,5 +1,7 @@ from pathlib import Path +from loguru import logger + _ODOO_VERSION_TEMPLATES = [ { "release": 8.0, @@ -126,3 +128,30 @@ def get_server_wide_modules_upgrade(migration_step: dict) -> str: ): return ["openupgrade_framework"] return [] + + +def get_upgrade_analysis_module(migration_step: dict) -> str: + """ return the upgrade_analysis module name""" + + if migration_step["release"] >= 14.0: + # (Module in OCA/server-tools) + return "upgrade_analysis" + + # (module in OCA/OpenUpgrade/odoo/addons/) + return "openupgrade_records" + + +def generate_records(odoo_instance, migration_step: dict): + logger.info( + "Generate Records in release %s ..." + " (It can take a while)" % (migration_step["release"]) + ) + if migration_step["release"] < 14.0: + wizard = odoo_instance.browse_by_create( + "openupgrade.generate.records.wizard", {} + ) + else: + wizard = odoo_instance.browse_by_create( + "upgrade.generate.record.wizard", {} + ) + wizard.generate() diff --git a/odoo_openupgrade_wizard/templates.py b/odoo_openupgrade_wizard/templates.py index d7d305c..ad143c1 100644 --- a/odoo_openupgrade_wizard/templates.py +++ b/odoo_openupgrade_wizard/templates.py @@ -71,6 +71,7 @@ PYTHON_REQUIREMENTS_TXT_TEMPLATE = """ {%- for python_librairy in python_libraries -%} {{ python_librairy }} {% endfor %} +odoorpc """ DEBIAN_REQUIREMENTS_TXT_TEMPLATE = """ diff --git a/odoo_openupgrade_wizard/tools_odoo.py b/odoo_openupgrade_wizard/tools_odoo.py index ecc96b0..e96bb56 100644 --- a/odoo_openupgrade_wizard/tools_odoo.py +++ b/odoo_openupgrade_wizard/tools_odoo.py @@ -148,13 +148,17 @@ def run_odoo( ): logger.info( "Launching Odoo Container (Release {release}) for {db_text}" - " in {action} mode. Demo Data is {demo_text}.".format( + " in {action} mode. Demo Data is {demo_text}." + " {stop_text}. (Init : {init} ; Update : {update}".format( release=migration_step["release"], db_text=database and "database '%s'" % database or "any databases", action=migration_step["action"] == "update" and "regular" or "OpenUpgrade", demo_text=demo and "enabled" or "disabled", + stop_text=stop_after_init and "(stop-after-init)" or "", + init=init, + update=update, ) ) odoo_version = get_odoo_version_from_migration_step(ctx, migration_step) diff --git a/odoo_openupgrade_wizard/tools_odoo_instance.py b/odoo_openupgrade_wizard/tools_odoo_instance.py index 3e569ed..e8cd972 100644 --- a/odoo_openupgrade_wizard/tools_odoo_instance.py +++ b/odoo_openupgrade_wizard/tools_odoo_instance.py @@ -9,7 +9,7 @@ def get_odoo_url(ctx) -> str: return "http://0.0.0.0:%d" % (ctx.obj["config"]["odoo_host_xmlrpc_port"]) -_ODOO_RPC_MAX_TRY = 10 +_ODOO_RPC_MAX_TRY = 60 _ODOO_RPC_TIMEOUT = 60 @@ -22,7 +22,11 @@ class OdooInstance: # # TODO, improve me waith for response on http://localhost:port # # with a time out # # the docker container take a little time to be up. - time.sleep(60) + # time.sleep(60) + port = ctx.obj["config"]["odoo_host_xmlrpc_port"] + logger.info( + "Connect to Odoo instance via odoorpc (Port %s)... " % port + ) for x in range(1, _ODOO_RPC_MAX_TRY + 1): # Connection @@ -30,14 +34,14 @@ class OdooInstance: rpc_connexion = odoorpc.ODOO( "0.0.0.0", "jsonrpc", - port=ctx.obj["config"]["odoo_host_xmlrpc_port"], + port=port, timeout=_ODOO_RPC_TIMEOUT, ) # connexion is OK break except (socket.gaierror, socket.error) as e: if x < _ODOO_RPC_MAX_TRY: - logger.info( + logger.debug( "%d/%d Unable to connect to the server." " Retrying in 1 second ..." % (x, _ODOO_RPC_MAX_TRY) )