diff --git a/odoo_openupgrade_wizard/cli.py b/odoo_openupgrade_wizard/cli.py index ad027c2..c5063e8 100644 --- a/odoo_openupgrade_wizard/cli.py +++ b/odoo_openupgrade_wizard/cli.py @@ -10,6 +10,7 @@ from odoo_openupgrade_wizard.cli_docker_build import docker_build from odoo_openupgrade_wizard.cli_get_code import get_code from odoo_openupgrade_wizard.cli_init import init from odoo_openupgrade_wizard.cli_run import run +from odoo_openupgrade_wizard.cli_upgrade import upgrade from odoo_openupgrade_wizard.tools_system import ensure_folder_exists @@ -94,3 +95,4 @@ main.add_command(init) main.add_command(get_code) main.add_command(docker_build) main.add_command(run) +main.add_command(upgrade) diff --git a/odoo_openupgrade_wizard/cli_docker_build.py b/odoo_openupgrade_wizard/cli_docker_build.py index eb91d90..912710e 100644 --- a/odoo_openupgrade_wizard/cli_docker_build.py +++ b/odoo_openupgrade_wizard/cli_docker_build.py @@ -5,7 +5,7 @@ from odoo_openupgrade_wizard.cli_options import ( get_odoo_versions_from_options, releases_options, ) -from odoo_openupgrade_wizard.tools_docker import get_docker_client +from odoo_openupgrade_wizard.tools_docker import build_image from odoo_openupgrade_wizard.tools_odoo import ( get_docker_image_tag, get_odoo_env_path, @@ -18,15 +18,13 @@ from odoo_openupgrade_wizard.tools_odoo import ( def docker_build(ctx, releases): """Build Odoo Docker Images. (One image per release)""" - docker_client = get_docker_client() - for odoo_version in get_odoo_versions_from_options(ctx, releases): logger.info( "Building Odoo docker image for release '%s'. " "This can take a while..." % (odoo_version["release"]) ) - image = docker_client.images.build( - path=str(get_odoo_env_path(ctx, odoo_version)), - tag=get_docker_image_tag(ctx, odoo_version), + image = build_image( + str(get_odoo_env_path(ctx, odoo_version)), + get_docker_image_tag(ctx, odoo_version), ) logger.info("Docker Image build. '%s'" % image[0].tags[0]) diff --git a/odoo_openupgrade_wizard/cli_options.py b/odoo_openupgrade_wizard/cli_options.py index 52c3222..aa32637 100644 --- a/odoo_openupgrade_wizard/cli_options.py +++ b/odoo_openupgrade_wizard/cli_options.py @@ -13,6 +13,7 @@ def releases_options(function): def step_option(function): function = click.option( + "-s", "--step", required=True, prompt=True, @@ -22,8 +23,27 @@ def step_option(function): return function +def first_step_option(function): + function = click.option( + "--first-step", + type=str, + help="First step for which to perform the operation", + )(function) + return function + + +def last_step_option(function): + function = click.option( + "--last-step", + type=str, + help="Last step for which to perform the operation", + )(function) + return function + + def database_option(function): function = click.option( + "-d", "--database", type=str, help="Odoo Database for which you want to perform the operation.", @@ -31,6 +51,18 @@ def database_option(function): return function +def database_option_required(function): + function = click.option( + "-d", + "--database", + required=True, + prompt=True, + type=str, + help="Odoo Database for which you want to perform the operation.", + )(function) + return function + + def get_odoo_versions_from_options(ctx, releases_arg): if not releases_arg: @@ -51,3 +83,22 @@ def get_migration_step_from_options(ctx, step_arg): return migration_step # TODO, improve exception raise Exception + + +def get_migration_steps_from_options(ctx, first_step_arg, last_step_arg): + result = [] + if first_step_arg: + first_step = float(first_step_arg) + else: + first_step = ctx.obj["config"]["migration_steps"][0]["name"] + if last_step_arg: + last_step = float(last_step_arg) + else: + last_step = ctx.obj["config"]["migration_steps"][-1]["name"] + for migration_step in ctx.obj["config"]["migration_steps"]: + if migration_step["name"] in list(range(first_step, last_step + 1)): + result.append(migration_step.copy()) + if not result: + # TODO, improve exception + raise Exception + return result diff --git a/odoo_openupgrade_wizard/cli_upgrade.py b/odoo_openupgrade_wizard/cli_upgrade.py new file mode 100644 index 0000000..4936fcc --- /dev/null +++ b/odoo_openupgrade_wizard/cli_upgrade.py @@ -0,0 +1,36 @@ +import click +from loguru import logger + +from odoo_openupgrade_wizard.cli_options import ( + database_option_required, + first_step_option, + get_migration_steps_from_options, + last_step_option, +) +from odoo_openupgrade_wizard.tools_odoo import kill_odoo, run_odoo + + +@click.command() +@first_step_option +@last_step_option +@database_option_required +@click.pass_context +def upgrade(ctx, first_step, last_step, database): + + migration_steps = get_migration_steps_from_options( + ctx, first_step, last_step + ) + try: + for migration_step in migration_steps: + run_odoo( + ctx, + migration_step, + database=database, + detached_container=False, + update="all", + stop_after_init=True, + ) + except (KeyboardInterrupt, SystemExit): + logger.info("Received Keyboard Interrupt or System Exiting...") + finally: + kill_odoo(ctx, migration_step) diff --git a/odoo_openupgrade_wizard/tools_docker.py b/odoo_openupgrade_wizard/tools_docker.py index eb60859..cced6f6 100644 --- a/odoo_openupgrade_wizard/tools_docker.py +++ b/odoo_openupgrade_wizard/tools_docker.py @@ -6,6 +6,16 @@ def get_docker_client(): return docker.from_env() +def build_image(path, tag): + logger.info("Building image named %s with file %s..." % (tag, path)) + + docker_client = get_docker_client() + return docker_client.images.build( + path=path, + tag=tag, + ) + + def run_container( image_name, container_name, diff --git a/odoo_openupgrade_wizard/tools_odoo.py b/odoo_openupgrade_wizard/tools_odoo.py index 1718015..cd560a5 100644 --- a/odoo_openupgrade_wizard/tools_odoo.py +++ b/odoo_openupgrade_wizard/tools_odoo.py @@ -82,7 +82,7 @@ def generate_odoo_command( # TODO, make it dynamic addons_path = get_odoo_addons_path(ctx, Path("/odoo_env"), migration_step) database_cmd = database and "--database %s" % database or "" - update_cmd = update and "--update_%s" % update or "" + update_cmd = update and "--update %s" % update or "" init_cmd = init and "--init %s" % init or "" stop_after_init_cmd = stop_after_init and "--stop-after-init" or "" shell_cmd = shell and "shell" or ""