98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
from pathlib import Path
|
|
|
|
import docker
|
|
from loguru import logger
|
|
|
|
|
|
def get_odoo_env_path(ctx, odoo_version: dict) -> Path:
|
|
folder_name = "env_%s" % str(odoo_version["release"]).rjust(4, "0")
|
|
return ctx.obj["src_folder_path"] / folder_name
|
|
|
|
|
|
def get_docker_image_tag(ctx, odoo_version: dict) -> str:
|
|
"""Return a docker image tag, based on project name and odoo release"""
|
|
return "odoo-openupgrade-wizard-image-%s-%s" % (
|
|
ctx.obj["config"]["project_name"],
|
|
str(odoo_version["release"]).rjust(4, "0"),
|
|
)
|
|
|
|
|
|
def get_docker_container_name(ctx, migration_step: dict) -> str:
|
|
"""Return a docker container name, based on project name,
|
|
odoo release and migration step"""
|
|
return "odoo-openupgrade-wizard-container-%s-%s-step-%s" % (
|
|
ctx.obj["config"]["project_name"],
|
|
str(migration_step["release"]).rjust(4, "0"),
|
|
str(migration_step["name"]).rjust(2, "0"),
|
|
)
|
|
|
|
|
|
def get_odoo_version_from_migration_step(ctx, migration_step: dict) -> dict:
|
|
for odoo_version in ctx.obj["config"]["odoo_versions"]:
|
|
if odoo_version["release"] == migration_step["release"]:
|
|
return odoo_version
|
|
# TODO, improve exception
|
|
raise Exception
|
|
|
|
|
|
def generate_odoo_command(
|
|
ctx, migration_step: dict, database: str = False, update_all: bool = False
|
|
) -> str:
|
|
# TODO, make it dynamic
|
|
addons_path = (
|
|
"/container_env/src/odoo/addons," "/container_env/src/odoo/odoo/addons"
|
|
)
|
|
database_cmd = database and "--database %s" % database or ""
|
|
update_all_cmd = update_all and "--update_all" or ""
|
|
return (
|
|
f"/container_env/src/odoo/odoo-bin"
|
|
f" --db_host db"
|
|
f" --db_port 5432"
|
|
f" --db_user odoo"
|
|
f" --db_password odoo"
|
|
f" --addons-path {addons_path}"
|
|
f" {database_cmd}"
|
|
f" {update_all_cmd}"
|
|
)
|
|
|
|
|
|
def run_odoo(ctx, migration_step: dict, database: str = False):
|
|
client = docker.from_env()
|
|
odoo_version = get_odoo_version_from_migration_step(ctx, migration_step)
|
|
folder_path = get_odoo_env_path(ctx, odoo_version)
|
|
|
|
command = generate_odoo_command(ctx, migration_step, database=database)
|
|
|
|
image_name = get_docker_image_tag(ctx, odoo_version)
|
|
container_name = get_docker_container_name(ctx, migration_step)
|
|
logger.info(
|
|
"Launching Odoo Docker container named %s based on image '%s'."
|
|
% (container_name, image_name)
|
|
)
|
|
container = client.containers.run(
|
|
image_name,
|
|
name=container_name,
|
|
command=command,
|
|
ports={"8069": 8069, "5432": 5432},
|
|
volumes=["%s:/container_env/" % (folder_path)],
|
|
links={"db": "db"},
|
|
detach=True,
|
|
auto_remove=True,
|
|
)
|
|
logger.info("Container Launched. Command executed : %s" % command)
|
|
return container
|
|
|
|
|
|
def kill_odoo(ctx, migration_step: dict):
|
|
client = docker.from_env()
|
|
containers = client.containers.list(
|
|
all=True,
|
|
filters={"name": get_docker_container_name(ctx, migration_step)},
|
|
)
|
|
for container in containers:
|
|
logger.info(
|
|
"Stop container %s, based on image '%s'."
|
|
% (container.name, ",".join(container.image.tags))
|
|
)
|
|
container.stop()
|