Merge branch 'dockerfile-pocalypse-2-use-custom-docker-file' into 'main'

[IMP] use LOCAL_USER_ID calling odoo-bedrock, so no need to create filestore...

See merge request odoo-openupgrade-wizard/odoo-openupgrade-wizard!16
This commit is contained in:
LE GAL SYLVAIN 2022-07-11 15:50:57 +00:00
commit ae9294f8b4
38 changed files with 712 additions and 390 deletions

View File

@ -10,7 +10,6 @@ to contribute to that project.
* poetry (https://python-poetry.org/)
* odoorpc (https://github.com/OCA/odoorpc)
* git-aggregator (https://github.com/acsone/git-aggregator)
* click-odoo (https://github.com/acsone/click-odoo)
# Extra Developper Requirements

View File

@ -50,3 +50,8 @@ in modules.csv.j2 :
# TODO, this value are usefull for test for analyse between 13 and 14.
# move that values in data/extra_script/modules.csv
# and let this template with only 'base' module.
TODO when launching container :
- install odoo : ``pip install -e /odoo/src/odoo``

View File

@ -15,7 +15,7 @@ It works with Openupgrade OCA tools. (https://github.com/oca/openupgrade)
this tool is useful for complex migrations:
- migrate several versions
- take advantage of the migration to install / uninstall modules
- execute sql requests or click-odoo scripts between each migration
- execute sql requests or odoo shell scripts between each migration
- analyse workload
It will create a migration environment (with all the code available)
@ -113,7 +113,7 @@ modules.csv
before beginning the step.
- ``post-migration.py`` can contains extra python command to execute
after the execution of the step.
Script will be executed with ``click-odoo`` command. All the ORM is available
Script will be executed with ``odoo shell`` command. All the ORM is available
via the ``env`` variable.
* ``src`` folder contains a folder per Odoo version. In each environment folder:

View File

@ -68,10 +68,6 @@ def main(ctx, env_folder, filestore_folder, log_level):
# Define all the folder required by the tools
env_folder_path = Path(env_folder)
src_folder_path = env_folder_path / Path("./src/")
# Note: postgres folder should be a subfolder, because
# the parent folder will contain a .gitignore file
# that the postgres docker image doesn't like
postgres_folder_path = env_folder_path / Path("./postgres_data/data")
script_folder_path = env_folder_path / Path("./scripts/")
log_folder_path = env_folder_path / Path("./log/")
if not filestore_folder:
@ -80,7 +76,7 @@ def main(ctx, env_folder, filestore_folder, log_level):
filestore_folder_path = Path(filestore_folder)
# ensure log folder exists
ensure_folder_exists(log_folder_path, mode="777", git_ignore_content=True)
ensure_folder_exists(log_folder_path, git_ignore_content=True)
# Create log file
log_prefix = "{}__{}".format(
@ -95,7 +91,6 @@ def main(ctx, env_folder, filestore_folder, log_level):
# Add all global values in the context
ctx.obj["env_folder_path"] = env_folder_path
ctx.obj["src_folder_path"] = src_folder_path
ctx.obj["postgres_folder_path"] = postgres_folder_path
ctx.obj["script_folder_path"] = script_folder_path
ctx.obj["log_folder_path"] = log_folder_path
ctx.obj["log_prefix"] = log_prefix

View File

@ -10,13 +10,14 @@ from odoo_openupgrade_wizard.tools.tools_odoo import (
get_docker_image_tag,
get_odoo_env_path,
)
from odoo_openupgrade_wizard.tools.tools_system import get_local_user_id
@click.command()
@versions_options
@click.pass_context
def docker_build(ctx, versions):
"""Build Odoo Docker Images. (One image per version)"""
"""Build Odoo Docker Images and pull Postgres image"""
# Pull DB image
pull_image(ctx.obj["config"]["postgres_image_name"])
@ -30,5 +31,6 @@ def docker_build(ctx, versions):
image = build_image(
get_odoo_env_path(ctx, odoo_version),
get_docker_image_tag(ctx, odoo_version),
{"LOCAL_USER_ID": str(get_local_user_id())},
)
logger.info("Docker Image build. '%s'" % image[0].tags[0])

View File

@ -4,8 +4,6 @@ import click
from odoo_openupgrade_wizard.configuration_version_dependant import (
get_odoo_versions,
get_python_libraries,
get_python_major_version,
get_version_options,
)
from odoo_openupgrade_wizard.tools.tools_odoo import get_odoo_env_path
@ -49,7 +47,7 @@ from odoo_openupgrade_wizard.tools.tools_system import (
def init(
ctx, project_name, initial_version, final_version, extra_repository_list
):
"""Initialize OpenUpgrade Wizard Environment based on the initial and
"""Initialize OOW Environment based on the initial and
the final version of Odoo you want to migrate.
"""
@ -69,19 +67,18 @@ def init(
float(initial_version), float(final_version)
)
# 2. Compute Migration Steps
# Compute Migration Steps
# Create initial first step
# Create initial Regular step
steps = [
{
"name": 1,
"execution_context": "regular",
"version": odoo_versions[0],
"complete_name": "step_01__update__%s" % (odoo_versions[0]),
"complete_name": "step_01__regular__%s" % (odoo_versions[0]),
}
]
# Add all upgrade steps
# Add all Openupgrade steps
step_nbr = 2
for odoo_version in odoo_versions[1:]:
steps.append(
@ -89,44 +86,33 @@ def init(
"name": step_nbr,
"execution_context": "openupgrade",
"version": odoo_version,
"complete_name": "step_%s__upgrade__%s"
"complete_name": "step_%s__openupgrade__%s"
% (str(step_nbr).rjust(2, "0"), odoo_version),
}
)
step_nbr += 1
# add final update step
# add final Regular step
if len(odoo_versions) > 1:
steps.append(
{
"name": step_nbr,
"execution_context": "regular",
"version": odoo_versions[-1],
"complete_name": "step_%s__update__%s"
"complete_name": "step_%s__regular__%s"
% (str(step_nbr).rjust(2, "0"), odoo_versions[-1]),
}
)
# 3. ensure src folder exists
# Ensure src folder exists
ensure_folder_exists(ctx.obj["src_folder_path"])
# 4. ensure filestore folder exists
# Ensure filestore folder exists
ensure_folder_exists(
ctx.obj["filestore_folder_path"], mode="777", git_ignore_content=True
ctx.obj["filestore_folder_path"], git_ignore_content=True
)
# 5. ensure postgres data folder exists
ensure_folder_exists(
ctx.obj["postgres_folder_path"].parent,
mode="777",
git_ignore_content=True,
)
ensure_folder_exists(
ctx.obj["postgres_folder_path"],
mode="777",
)
# 6. ensure main configuration file exists
# Znsure main configuration file exists
ensure_file_exists_from_template(
ctx.obj["config_file_path"],
"config.yml.j2",
@ -135,7 +121,7 @@ def init(
odoo_versions=odoo_versions,
)
# 7. Ensure module list file exists
# Ensure module list file exists
ensure_file_exists_from_template(
ctx.obj["module_file_path"],
"modules.csv.j2",
@ -144,7 +130,7 @@ def init(
odoo_versions=odoo_versions,
)
# 8. Create one folder per version and add files
# Create one folder per version and add files
for odoo_version in odoo_versions:
# Create main path for each version
path_version = get_odoo_env_path(ctx, odoo_version)
@ -152,15 +138,14 @@ def init(
# Create python requirements file
ensure_file_exists_from_template(
path_version / Path("python_requirements.txt"),
"odoo/python_requirements.txt.j2",
python_libraries=get_python_libraries(odoo_version),
path_version / Path("extra_python_requirements.txt"),
"odoo/extra_python_requirements.txt.j2",
)
# Create debian requirements file
ensure_file_exists_from_template(
path_version / Path("debian_requirements.txt"),
"odoo/debian_requirements.txt.j2",
path_version / Path("extra_debian_requirements.txt"),
"odoo/extra_debian_requirements.txt.j2",
)
# Create odoo config file
@ -180,9 +165,7 @@ def init(
# Create Dockerfile file
ensure_file_exists_from_template(
path_version / Path("Dockerfile"),
"odoo/Dockerfile.j2",
odoo_version=odoo_version,
python_major_version=get_python_major_version(odoo_version),
f"odoo/{odoo_version}/Dockerfile",
)
# Create 'src' folder that will contain all the odoo code
@ -190,7 +173,7 @@ def init(
path_version / Path("src"), git_ignore_content=True
)
# 9. Create one folder per step and add files
# Create one folder per step and add files
ensure_folder_exists(ctx.obj["script_folder_path"])
for step in steps:

View File

@ -5,72 +5,31 @@ from loguru import logger
_ODOO_VERSION_TEMPLATES = [
{
"version": 8.0,
"python_major_version": "python2",
"python_libraries": [],
},
{
"version": 9.0,
"python_major_version": "python2",
"python_libraries": ["openupgradelib==2.0.0"],
},
{
"version": 10.0,
"python_major_version": "python2",
"python_libraries": ["openupgradelib==2.0.0"],
},
{
"version": 11.0,
"python_major_version": "python3",
"python_libraries": ["openupgradelib==2.0.0"],
},
{
"version": 12.0,
"python_major_version": "python3",
"python_libraries": [
"git+https://github.com/grap/openupgradelib.git"
"@2.0.1#egg=openupgradelib"
],
},
{
"version": 13.0,
"python_major_version": "python3",
"python_libraries": ["openupgradelib"],
},
{
"version": 14.0,
"python_major_version": "python3",
"python_libraries": ["openupgradelib"],
},
{
"version": 15.0,
"python_major_version": "python3",
"python_libraries": ["openupgradelib"],
},
]
def get_version_template(version: float) -> dict:
"""return a version template dictionnary according to a version
provided"""
for version_template in _ODOO_VERSION_TEMPLATES:
if version_template["version"] == version:
return version_template
else:
raise ValueError
def get_python_libraries(version: float) -> list:
"""Return a list of python librairies that should be
installed in each docker container for a given version"""
return get_version_template(version)["python_libraries"]
def get_python_major_version(version: float) -> str:
"""Return the major python version (2.0, 3.0) of Odoo for
a given version"""
return get_version_template(version)["python_major_version"]
def get_version_options(mode: str) -> list:
"""Get options available for version click argument.
Arguments:
@ -151,11 +110,14 @@ def skip_addon_path(migration_step: dict, path: Path) -> bool:
) and migration_step["version"] < 14.0
def get_server_wide_modules_upgrade(migration_step: dict) -> list:
def get_server_wide_modules_upgrade(
migration_step: dict, execution_context: str = False
) -> list:
"""return a list of modules to load, depending on the migration step."""
if (
migration_step["version"] >= 14.0
and migration_step["execution_context"] == "openupgrade"
and execution_context != "regular"
):
return ["openupgrade_framework"]
return []

View File

@ -1,7 +1,8 @@
project_name: {{ project_name }}
postgres_image_name: postgres:13
postgres_container_name: {{project_name}}-db
postgres_container_name: {{project_name}}-container-postgres
postgres_volume_name: {{project_name}}-volume-postgres
odoo_host_xmlrpc_port: 9069
odoo_default_country_code: FR
@ -12,6 +13,14 @@ odoo_versions:
- {{ odoo_version }}
{%- endfor %}
odoo_version_settings:
{%- for odoo_version in odoo_versions %}
{{odoo_version}}:
repo_url: False
{%- endfor %}
migration_steps:
{%- for step in steps %}
- name: {{ step['name'] }}

View File

@ -0,0 +1,74 @@
# <OOW> : Copy of https://github.com/odoo/odoo/blob/12.0/setup/package.dfdebian
FROM debian:stretch
# 1. <OOW> Official Odoo Dockerfile.
# Removing: postgresql, locales, rsync
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && \
apt-get upgrade -qq -y && \
apt-get install -yq \
adduser \
dh-python \
packaging-dev \
postgresql-client \
python3 \
python3-babel \
python3-dateutil \
python3-decorator \
python3-docutils \
python3-gevent \
python3-html2text \
python3-pil \
python3-jinja2 \
python3-libsass \
python3-lxml \
python3-mako \
python3-mock \
python3-ofxparse \
python3-passlib \
python3-psutil \
python3-psycopg2 \
python3-pydot \
python3-pyparsing \
python3-pypdf2 \
python3-reportlab \
python3-requests \
python3-serial \
python3-suds \
python3-tz \
python3-usb \
python3-vatnumber \
python3-vobject \
python3-werkzeug \
python3-xlsxwriter \
&& rm -rf /var/lib/apt/lists/*
# 2. <OOW> Add 2 python dependency files and 1 debian dependency file
COPY ./src/odoo/requirements.txt /odoo_python_requirements.txt
COPY extra_python_requirements.txt /extra_python_requirements.txt
COPY extra_debian_requirements.txt /extra_debian_requirements.txt
# 3. <OOW> Install Debian packages
RUN apt-get update || true \
&& apt-get install -y\
# <OOW> To allow to run pip install
python3-pip\
# <OOW> For python-ldap
libldap2-dev ldap-utils libsasl2-dev\
&& xargs apt-get install -y --no-install-recommends <extra_debian_requirements.txt \
&& rm -rf /var/lib/apt/lists/*
# 4. <OOW> Install Python librairies
RUN python3 -m pip install --no-cache-dir -r /odoo_python_requirements.txt
RUN python3 -m pip install --no-cache-dir -r /extra_python_requirements.txt
# 5. <OOW> Get local user id and set it to the odoo user
ARG LOCAL_USER_ID
RUN useradd --uid $LOCAL_USER_ID odoo
USER odoo

View File

@ -0,0 +1,78 @@
# <OOW> : Copy of https://github.com/odoo/odoo/blob/13.0/setup/package.dfdebian
FROM debian:buster
# 1. <OOW> Official Odoo Dockerfile.
# Removing: postgresql, locales, rsync
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && \
apt-get upgrade -qq -y && \
apt-get install -qq -y\
adduser \
dh-python \
packaging-dev \
postgresql-client \
python3 \
python3-babel \
python3-dateutil \
python3-decorator \
python3-docutils \
python3-gevent \
python3-pil \
python3-jinja2 \
python3-libsass \
python3-lxml \
python3-mako \
python3-mock \
python3-ofxparse \
python3-passlib \
python3-polib \
python3-psutil \
python3-psycopg2 \
python3-pydot \
python3-pyparsing \
python3-pypdf2 \
python3-qrcode \
python3-renderpm \
python3-reportlab \
python3-requests \
python3-serial \
python3-tz \
python3-usb \
python3-vatnumber \
python3-vobject \
python3-werkzeug \
python3-xlsxwriter \
python3-zeep \
&& rm -rf /var/lib/apt/lists/*
# 2. <OOW> Add 2 python dependency files and 1 debian dependency file
COPY ./src/odoo/requirements.txt /odoo_python_requirements.txt
COPY extra_python_requirements.txt /extra_python_requirements.txt
COPY extra_debian_requirements.txt /extra_debian_requirements.txt
# 3. <OOW> Install Debian packages
RUN apt-get update || true \
&& apt-get install -y\
# <OOW> To allow to run pip install
python3-pip\
# <OOW> For python-ldap
libldap2-dev ldap-utils libsasl2-dev\
# <OOW> For cffi
build-essential libssl-dev libffi-dev python-dev\
&& xargs apt-get install -y --no-install-recommends <extra_debian_requirements.txt \
&& rm -rf /var/lib/apt/lists/*
# 4. <OOW> Install Python librairies
RUN python3 -m pip install --no-cache-dir -r /odoo_python_requirements.txt
RUN python3 -m pip install --no-cache-dir -r /extra_python_requirements.txt
# 5. <OOW> Get local user id and set it to the odoo user
ARG LOCAL_USER_ID
RUN useradd --uid $LOCAL_USER_ID odoo
USER odoo

View File

@ -0,0 +1,77 @@
# <OOW> : Copy of https://github.com/odoo/odoo/blob/14.0/setup/package.dfdebian
FROM debian:buster
# 1. <OOW> Official Odoo Dockerfile.
# Removing: postgresql, locales, rsync
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && \
apt-get upgrade -qq -y && \
apt-get install -qq -y\
adduser \
dh-python \
packaging-dev \
postgresql-client \
python3 \
python3-babel \
python3-dateutil \
python3-decorator \
python3-docutils \
python3-gevent \
python3-pil \
python3-jinja2 \
python3-libsass \
python3-lxml \
python3-mako \
python3-ofxparse \
python3-passlib \
python3-polib \
python3-psutil \
python3-psycopg2 \
python3-pydot \
python3-pypdf2 \
python3-qrcode \
python3-renderpm \
python3-reportlab \
python3-requests \
python3-serial \
python3-setuptools \
python3-stdnum \
python3-tz \
python3-usb \
python3-vobject \
python3-werkzeug \
python3-xlsxwriter \
python3-zeep \
&& rm -rf /var/lib/apt/lists/*
# 2. <OOW> Add 2 python dependency files and 1 debian dependency file
COPY ./src/odoo/requirements.txt /odoo_python_requirements.txt
COPY extra_python_requirements.txt /extra_python_requirements.txt
COPY extra_debian_requirements.txt /extra_debian_requirements.txt
# 3. <OOW> Install Debian packages
RUN apt-get update || true \
&& apt-get install -y\
# <OOW> To allow to run pip install
python3-pip\
# <OOW> For python-ldap
libldap2-dev ldap-utils libsasl2-dev\
# <OOW> For cffi
build-essential libssl-dev libffi-dev python-dev\
&& xargs apt-get install -y --no-install-recommends <extra_debian_requirements.txt \
&& rm -rf /var/lib/apt/lists/*
# 4. <OOW> Install Python librairies
RUN python3 -m pip install --no-cache-dir -r /odoo_python_requirements.txt
RUN python3 -m pip install --no-cache-dir -r /extra_python_requirements.txt
# 5. <OOW> Get local user id and set it to the odoo user
ARG LOCAL_USER_ID
RUN useradd --uid $LOCAL_USER_ID odoo
USER odoo

View File

@ -0,0 +1,75 @@
# <OOW> : Copy of https://github.com/odoo/odoo/blob/15.0/setup/package.dfdebian
FROM debian:bullseye
# 1. <OOW> Official Odoo Dockerfile.
# Removing: postgresql, locales, rsync
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && \
apt-get upgrade -qq -y && \
apt-get install -qq -y\
adduser \
dh-python \
packaging-dev \
postgresql-client \
python3 \
python3-babel \
python3-dateutil \
python3-decorator \
python3-docutils \
python3-gevent \
python3-pil \
python3-jinja2 \
python3-libsass \
python3-lxml \
python3-ofxparse \
python3-passlib \
python3-polib \
python3-psutil \
python3-psycopg2 \
python3-pydot \
python3-openssl \
python3-pypdf2 \
python3-qrcode \
python3-renderpm \
python3-reportlab \
python3-requests \
python3-serial \
python3-setuptools \
python3-stdnum \
python3-tz \
python3-usb \
python3-vobject \
python3-werkzeug \
python3-xlsxwriter \
python3-zeep \
&& rm -rf /var/lib/apt/lists/*
# 2. <OOW> Add 2 python dependency files and 1 debian dependency file
COPY ./src/odoo/requirements.txt /odoo_python_requirements.txt
COPY extra_python_requirements.txt /extra_python_requirements.txt
COPY extra_debian_requirements.txt /extra_debian_requirements.txt
# 3. <OOW> Install Debian packages
RUN apt-get update || true \
&& apt-get install -y\
# <OOW> To allow to run pip install
python3-pip\
# <OOW> For python-ldap
libldap2-dev ldap-utils libsasl2-dev\
&& xargs apt-get install -y --no-install-recommends <extra_debian_requirements.txt \
&& rm -rf /var/lib/apt/lists/*
# 4. <OOW> Install Python librairies
RUN python3 -m pip install --no-cache-dir -r /odoo_python_requirements.txt
RUN python3 -m pip install --no-cache-dir -r /extra_python_requirements.txt
# 5. <OOW> Get local user id and set it to the odoo user
ARG LOCAL_USER_ID
RUN useradd --uid $LOCAL_USER_ID odoo
USER odoo

View File

@ -1,22 +0,0 @@
FROM odoo:{{ odoo_version }}
MAINTAINER GRAP, Coop It Easy
# Set User root for installations
USER root
# 1. Make available files in the containers
COPY debian_requirements.txt /debian_requirements.txt
COPY python_requirements.txt /python_requirements.txt
# 2. Install extra debian packages
RUN apt-get update || true &&\
xargs apt-get install -y --no-install-recommends <debian_requirements.txt
# 3. Install extra Python librairies
RUN {{ python_major_version }}\
-m pip install -r python_requirements.txt
# Reset to odoo user to run the container
USER odoo

View File

@ -0,0 +1,7 @@
# Mandatory library used in all odoo-openupgrade-wizard
openupgradelib
# Library used to run generate-module-analysis command
# dependencies of the module OCA/server-tools 'upgrade_analysis'
odoorpc
mako

View File

@ -1,5 +0,0 @@
{%- for python_librairy in python_libraries -%}
{{ python_librairy }}
{% endfor %}
odoorpc
click-odoo

View File

@ -4,3 +4,7 @@ _logger = logging.getLogger(__name__)
_logger.info("Executing post-migration.py script ...")
env = env # noqa: F821
# Write custom script here
env.cr.commit()

View File

@ -11,17 +11,21 @@ def pull_image(image_name):
client.images.pull(image_name)
def build_image(path, tag):
def build_image(path, tag, buildargs={}):
logger.debug(
"Building image named based on %s/Dockerfile."
" This can take a big while ..." % (path)
)
debug_docker_command = "docker build %s --tag %s" % (path, tag)
logger.debug("DOCKER COMMAND:\n %s" % debug_docker_command)
for arg_name, arg_value in buildargs.items():
debug_docker_command += f"\\\n --build-arg {arg_name}={arg_value}"
logger.debug("DOCKER COMMAND:\n\n%s\n" % debug_docker_command)
docker_client = get_docker_client()
image = docker_client.images.build(
path=str(path),
tag=tag,
buildargs=buildargs,
)
logger.debug("Image build.")
return image
@ -66,7 +70,7 @@ def run_container(
debug_docker_command += " %s" % (image_name)
if command:
debug_docker_command += " \\\n%s" % (command)
logger.debug("DOCKER COMMAND:\n %s" % debug_docker_command)
logger.debug("DOCKER COMMAND:\n%s" % debug_docker_command)
container = client.containers.run(
image_name,
@ -87,6 +91,27 @@ def run_container(
return container
def exec_container(container, command):
debug_docker_command = "docker exec %s" % (container.name)
debug_docker_command += " \\\n%s" % (command)
logger.debug("DOCKER COMMAND:\n%s" % debug_docker_command)
docker_result = container.exec_run(command)
if docker_result.exit_code != 0:
raise Exception(
"The command failed in the container %s.\n"
"- Command : %s\n"
"- Exit Code : %d\n"
"- Output: %s"
% (
container.name,
command,
docker_result.exit_code,
docker_result.output,
)
)
return docker_result
def kill_container(container_name):
client = get_docker_client()
containers = client.containers.list(
@ -94,8 +119,14 @@ def kill_container(container_name):
filters={"name": container_name},
)
for container in containers:
logger.debug(
"Stop container %s, based on image '%s'."
% (container.name, ",".join(container.image.tags))
)
container.stop()
if container.status != "exited":
logger.debug(
"Stop container %s, based on image '%s'."
% (container.name, ",".join(container.image.tags))
)
container.stop()
# TODO, we should here filter by name
# but filters={"name": container_name}
# doesn't work...
client.containers.prune()

View File

@ -5,6 +5,7 @@ import sys
import traceback
from pathlib import Path
# import docker
import yaml
from loguru import logger
@ -81,13 +82,50 @@ def generate_odoo_command(
migration_step: dict,
execution_context: str,
database: str,
update: str,
init: str,
stop_after_init: bool,
shell: bool,
demo: bool,
demo: bool = False,
update: str = False,
init: str = False,
stop_after_init: bool = False,
shell: bool = False,
) -> str:
odoo_env_path = get_odoo_env_path(ctx, migration_step["version"])
# Compute 'server_wide_modules'
# For that purpose, read the custom odoo.cfg file
# to know if server_wide_modules is defined
custom_odoo_config_file = odoo_env_path / "odoo.cfg"
parser = configparser.RawConfigParser()
parser.read(custom_odoo_config_file)
server_wide_modules = parser.get(
"options", "server_wide_modules", fallback=[]
)
server_wide_modules += get_server_wide_modules_upgrade(
migration_step, execution_context
)
# compute 'addons_path'
addons_path = ",".join(
[
str(x)
for x in get_odoo_addons_path(
ctx, Path("/odoo_env"), migration_step, execution_context
)
]
)
# compute 'log_file'
log_file_name = "{}____{}.log".format(
ctx.obj["log_prefix"], migration_step["complete_name"]
)
log_file_docker_path = "/env/log/%s" % log_file_name
database_cmd = database and "--database %s" % database or ""
load_cmd = (
server_wide_modules
and "--load %s" % ",".join(server_wide_modules)
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 ""
@ -98,11 +136,21 @@ def generate_odoo_command(
/ Path(get_odoo_folder(migration_step, execution_context))
/ Path(get_odoo_run_command(migration_step))
)
result = (
f" {command}"
f" {shell_cmd}"
f" --config /odoo_env/_auto_generated_odoo.cfg"
# f" --config=/etc/odoo.cfg"
f" --data-dir=/env/filestore/"
f" --addons-path={addons_path}"
f" --logfile={log_file_docker_path}"
f" --db_host=db"
f" --db_port=5432"
f" --db_user=odoo"
f" --db_password=odoo"
f" --workers=0"
f" {demo_cmd}"
f" {load_cmd}"
f" {database_cmd}"
f" {update_cmd}"
f" {init_cmd}"
@ -111,60 +159,6 @@ def generate_odoo_command(
return result
def generate_odoo_config_file(
ctx, migration_step, log_file, execution_context
):
"""Create a config file name _auto_generated_odoo.cfg
in the according environment (defined by migration_step)
This configuration file is a merge of the odoo.cfg file that can
contain custom values, and the values required to run the docker container.
"""
odoo_env_path = get_odoo_env_path(ctx, migration_step["version"])
custom_odoo_config_file = odoo_env_path / "odoo.cfg"
auto_generated_odoo_config_file = (
odoo_env_path / "_auto_generated_odoo.cfg"
)
parser = configparser.RawConfigParser()
# Read custom file
parser.read(custom_odoo_config_file)
# compute addons_path
addons_path = ",".join(
[
str(x)
for x in get_odoo_addons_path(
ctx, Path("/odoo_env"), migration_step, execution_context
)
]
)
# compute server wides modules
server_wide_modules = parser.get(
"options", "server_wide_modules", fallback=[]
)
server_wide_modules += get_server_wide_modules_upgrade(migration_step)
# Add required keys
if "options" not in parser:
parser.add_section("options")
parser.set("options", "db_host", "db")
parser.set("options", "db_port", 5432)
parser.set("options", "db_user", "odoo")
parser.set("options", "db_password", "odoo")
parser.set("options", "workers", 0)
parser.set("options", "data_dir", "/env/filestore/")
parser.set("options", "logfile", log_file)
parser.set("options", "addons_path", addons_path)
if server_wide_modules:
parser.set(
"options", "server_wide_modules", ",".join(server_wide_modules)
)
parser.write(open(auto_generated_odoo_config_file, "w"))
def run_odoo(
ctx,
migration_step: dict,
@ -195,31 +189,53 @@ def run_odoo(
update_text=update and " (Update : %s)" % update or "",
)
)
env_path = ctx.obj["env_folder_path"]
odoo_env_path = get_odoo_env_path(ctx, migration_step["version"])
log_file = "/env/log/{}____{}.log".format(
ctx.obj["log_prefix"], migration_step["complete_name"]
)
generate_odoo_config_file(ctx, migration_step, log_file, execution_context)
command = generate_odoo_command(
ctx,
migration_step,
execution_context,
database=database,
database,
demo=demo,
update=update,
init=init,
stop_after_init=stop_after_init,
shell=shell,
demo=demo,
)
return run_container_odoo(
ctx,
migration_step,
command,
detached_container=detached_container,
database=database,
execution_context=execution_context,
alternative_xml_rpc_port=alternative_xml_rpc_port,
links=links,
)
def run_container_odoo(
ctx,
migration_step: dict,
command: str,
detached_container: bool = False,
database: str = False,
alternative_xml_rpc_port: int = False,
execution_context: str = False,
links: dict = {},
):
env_path = ctx.obj["env_folder_path"]
odoo_env_path = get_odoo_env_path(ctx, migration_step["version"])
host_xmlrpc_port = (
alternative_xml_rpc_port
and alternative_xml_rpc_port
or ctx.obj["config"]["odoo_host_xmlrpc_port"]
)
links.update({ctx.obj["config"]["postgres_container_name"]: "db"})
# try:
return run_container(
get_docker_image_tag(ctx, migration_step["version"]),
get_docker_container_name(ctx, migration_step),
@ -235,6 +251,18 @@ def run_odoo(
detach=detached_container,
auto_remove=True,
)
# except docker.errors.ContainerError as exception:
# host_log_file_path = ctx.obj["log_folder_path"] / log_file_name
# if host_log_file_path.exists():
# with open(host_log_file_path) as _log_file:
# logger.debug("*" * 50)
# logger.debug("*" * 50)
# logger.debug("*" * 50)
# logger.debug(_log_file.read())
# logger.debug("*" * 50)
# logger.debug("*" * 50)
# logger.debug("*" * 50)
# raise exception
def kill_odoo(ctx, migration_step: dict):
@ -260,27 +288,17 @@ def execute_click_odoo_python_files(
]
python_files = sorted(python_files)
# Prepare data information for docker
links = {ctx.obj["config"]["postgres_container_name"]: "db"}
env_path = ctx.obj["env_folder_path"]
odoo_env_path = get_odoo_env_path(ctx, migration_step["version"])
# Generate odoo config file
log_file = "/env/log/{}____{}__post_migration.log".format(
ctx.obj["log_prefix"], migration_step["complete_name"]
command = generate_odoo_command(
ctx,
migration_step,
execution_context,
database,
shell=True,
)
generate_odoo_config_file(ctx, migration_step, log_file, execution_context)
for python_file in python_files:
# TODO, check if we should set python2 for old version of Odoo
# or just 'python'
command = (
"click-odoo"
" --database {database}"
" --config /odoo_env/_auto_generated_odoo.cfg"
" /env/{python_file}"
).format(
database=database,
command = ("/bin/bash -c 'cat /env/{python_file} | {command}'").format(
command=command,
python_file=str(python_file),
)
try:
@ -288,19 +306,14 @@ def execute_click_odoo_python_files(
"Executing script %s / %s"
% (migration_step["complete_name"], python_file)
)
run_container(
get_docker_image_tag(ctx, migration_step["version"]),
get_docker_container_name(ctx, migration_step),
command=command,
ports={},
volumes={
env_path: "/env/",
odoo_env_path: "/odoo_env/",
},
links=links,
detach=False,
auto_remove=True,
return run_container_odoo(
ctx,
migration_step,
command,
detached_container=False,
database=database,
)
except Exception as e:
traceback.print_exc()
logger.error(

View File

@ -2,9 +2,11 @@ import os
import time
from pathlib import Path
import docker
from loguru import logger
from odoo_openupgrade_wizard.tools.tools_docker import (
exec_container,
get_docker_client,
run_container,
)
@ -15,9 +17,30 @@ def get_postgres_container(ctx):
client = get_docker_client()
image_name = ctx.obj["config"]["postgres_image_name"]
container_name = ctx.obj["config"]["postgres_container_name"]
containers = client.containers.list(filters={"name": container_name})
volume_name = ctx.obj["config"]["postgres_volume_name"]
# Check if container exists
containers = client.containers.list(
all=True, filters={"name": container_name}
)
if containers:
return containers[0]
container = containers[0]
if container.status == "exited":
logger.warning(
"Found container %s in a exited status. Removing it..."
% container_name
)
container.remove()
else:
return container
# Check if volume exists
try:
client.volumes.get(volume_name)
logger.debug("Recovering existing postgres volume: %s" % volume_name)
except docker.errors.NotFound:
logger.info("Creating Postgres volume: %s" % volume_name)
client.volumes.create(volume_name)
logger.info("Launching Postgres Container. (Image %s)" % image_name)
container = run_container(
@ -30,10 +53,8 @@ def get_postgres_container(ctx):
"PGDATA": "/var/lib/postgresql/data/pgdata",
},
volumes={
ctx.obj["env_folder_path"]: "/env/",
ctx.obj[
"postgres_folder_path"
]: "/var/lib/postgresql/data/pgdata/",
ctx.obj["env_folder_path"].absolute(): "/env/",
volume_name: "/var/lib/postgresql/data/pgdata/",
},
detach=True,
)
@ -62,24 +83,19 @@ def execute_sql_file(ctx, database, sql_file):
)
container_path = Path("/env/") / relative_path
docker_command = (
"psql" " --username=odoo" " --dbname={database}" " --file {file_path}"
command = (
"psql --username=odoo --dbname={database} --file {file_path}"
).format(database=database, file_path=container_path)
logger.info(
"Executing the script '%s' in postgres container"
" on database %s" % (relative_path, database)
)
docker_result = container.exec_run(docker_command)
if docker_result.exit_code != 0:
raise Exception(
"The script '%s' failed on database %s. Exit Code : %d"
% (relative_path, database, docker_result.exit_code)
)
exec_container(container, command)
def execute_sql_request(ctx, request, database="postgres"):
container = get_postgres_container(ctx)
docker_command = (
command = (
"psql"
" --username=odoo"
" --dbname={database}"
@ -90,12 +106,8 @@ def execute_sql_request(ctx, request, database="postgres"):
"Executing the following command in postgres container"
" on database %s \n %s" % (database, request)
)
docker_result = container.exec_run(docker_command)
if docker_result.exit_code != 0:
raise Exception(
"Request %s failed on database %s. Exit Code : %d"
% (request, database, docker_result.exit_code)
)
docker_result = exec_container(container, command)
lines = docker_result.output.decode("utf-8").split("\n")
result = []
for line in lines:

View File

@ -50,7 +50,16 @@ def ensure_file_exists_from_template(
template_folder = (
importlib_resources.files("odoo_openupgrade_wizard") / "templates"
)
text = (template_folder / template_name).read_text()
template_path = template_folder / template_name
if not template_path.exists():
logger.warning(
f"Unable to generate {file_path},"
f" the template {template_name} has not been found."
f" If it's a Dockerfile,"
f" you should maybe contribute to that project ;-)"
)
return
text = template_path.read_text()
template = Template(text)
output = template.render(args)
@ -91,3 +100,7 @@ def git_aggregate(folder_path: Path, config_path: Path, jobs: int):
% config_path
)
gitaggregate_cmd.run(args)
def get_local_user_id():
return os.getuid()

10
poetry.lock generated
View File

@ -312,7 +312,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
name = "importlib-resources"
version = "5.4.0"
description = "Read resources from Python packages"
category = "dev"
category = "main"
optional = false
python-versions = ">=3.6"
@ -797,7 +797,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "virtualenv"
version = "20.15.0"
version = "20.15.1"
description = "Virtual Python Environment builder"
category = "dev"
optional = false
@ -862,7 +862,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes
[metadata]
lock-version = "1.1"
python-versions = ">=3.6.3,<4.0.0"
content-hash = "83c796afe3bead38187a2cd46deab78c3b6311c416d583b20fb077014d01f139"
content-hash = "cb073f5cf2ea8d6df3c7e5320419a3bcdd60ac83bf4a308ddea0286de59700b5"
[metadata.files]
aiocontextvars = [
@ -1375,8 +1375,8 @@ urllib3 = [
{file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"},
]
virtualenv = [
{file = "virtualenv-20.15.0-py2.py3-none-any.whl", hash = "sha256:804cce4de5b8a322f099897e308eecc8f6e2951f1a8e7e2b3598dff865f01336"},
{file = "virtualenv-20.15.0.tar.gz", hash = "sha256:4c44b1d77ca81f8368e2d7414f9b20c428ad16b343ac6d226206c5b84e2b4fcc"},
{file = "virtualenv-20.15.1-py2.py3-none-any.whl", hash = "sha256:b30aefac647e86af6d82bfc944c556f8f1a9c90427b2fb4e3bfbf338cb82becf"},
{file = "virtualenv-20.15.1.tar.gz", hash = "sha256:288171134a2ff3bfb1a2f54f119e77cd1b81c29fc1265a2356f3e8d14c7d58c4"},
]
websocket-client = [
{file = "websocket-client-1.3.1.tar.gz", hash = "sha256:6278a75065395418283f887de7c3beafb3aa68dada5cacbe4b214e8d26da499b"},

View File

@ -32,6 +32,7 @@ python = ">=3.6.3,<4.0.0"
click = "^7.0"
click-loglevel = "^0.4"
docker = "^5.0"
importlib-resources = "^5.4"
git-aggregator = "^2.1"
GitPython = "^3.1"
jinja2 = "^3.0"

View File

@ -29,15 +29,32 @@ def move_to_test_folder():
def cli_runner_invoke(cmd):
result = CliRunner().invoke(
main,
cmd,
catch_exceptions=False,
)
if not result.exit_code == 0:
_logger.error("exit_code: %s" % result.exit_code)
_logger.error("output: %s" % result.output)
assert result.exit_code == 0
try:
result = CliRunner().invoke(
main,
cmd,
catch_exceptions=False,
)
if not result.exit_code == 0:
_logger.error("exit_code: %s" % result.exit_code)
_logger.error("output: %s" % result.output)
assert result.exit_code == 0
except Exception as exception:
if Path("log").exists():
log_files = [
Path("log") / Path(f)
for f in os.listdir(Path("log"))
if f[-4:] == ".log"
]
for log_file in log_files:
print("============================")
print(log_file)
print("============================")
_f = open(log_file)
print(_f.read())
_f.close()
print("============================")
raise exception
def build_ctx_from_config_file() -> dict:
@ -50,7 +67,9 @@ def build_ctx_from_config_file() -> dict:
setattr(ctx, "obj", {})
config_file_path = env_folder_path / "config.yml"
if not config_file_path.exists():
raise Exception("Configuration file not found %s" % config_file_path)
raise Exception(
"Configuration file not found %s" % config_file_path.absolute()
)
with open(config_file_path) as file:
config = yaml.safe_load(file)
ctx.obj["config"] = config
@ -58,7 +77,4 @@ def build_ctx_from_config_file() -> dict:
ctx.obj["env_folder_path"] = env_folder_path
ctx.obj["src_folder_path"] = env_folder_path / Path("src")
ctx.obj["postgres_folder_path"] = env_folder_path / Path(
"postgres_data/data"
)
return ctx

View File

@ -6,6 +6,7 @@ from . import cli_runner_invoke, move_to_test_folder
def test_cli_init():
move_to_test_folder()
expected_folder_path = Path("../output_expected").absolute()
cli_runner_invoke(
@ -13,11 +14,11 @@ def test_cli_init():
"--log-level=DEBUG",
"init",
"--project-name=test-cli",
"--initial-version=13.0",
"--final-version=14.0",
"--initial-version=14.0",
"--final-version=15.0",
"--extra-repository="
"OCA/web,OCA/server-tools,OCA/bank-statement-import",
]
],
)
assert filecmp.cmp(

View File

@ -5,21 +5,20 @@ from . import cli_runner_invoke, move_to_test_folder
def test_cli_get_code():
move_to_test_folder()
cli_runner_invoke(
[
"--log-level=DEBUG",
"get-code",
]
],
)
# Check V13
openupgrade_path = Path("./src/env_13.0/src/openupgrade")
assert openupgrade_path.exists()
# Check V14
web_path = Path("./src/env_14.0/src/OCA/web")
assert web_path.exists()
assert (openupgrade_path / Path("odoo")).exists()
# check V14
openupgrade_path = Path("./src/env_14.0/src/openupgrade")
# check V15
openupgrade_path = Path("./src/env_15.0/src/openupgrade")
assert openupgrade_path.exists()

View File

@ -1,24 +1,38 @@
from odoo_openupgrade_wizard.tools.tools_docker import get_docker_client
from odoo_openupgrade_wizard.tools.tools_docker import (
get_docker_client,
kill_container,
)
from . import cli_runner_invoke, move_to_test_folder
from . import (
build_ctx_from_config_file,
cli_runner_invoke,
move_to_test_folder,
)
def test_cli_docker_build():
move_to_test_folder()
ctx = build_ctx_from_config_file()
# Drop postgresql container if exist
# (we ensure that the postgres container is removed to
# be sure that the call (environment, etc...) is correct now.)
kill_container(ctx.obj["config"]["postgres_container_name"])
cli_runner_invoke(
[
"--log-level=DEBUG",
"docker-build",
"--versions=13.0,14.0",
]
"--versions=14.0,15.0",
],
)
docker_client = get_docker_client()
assert docker_client.images.get(
"odoo-openupgrade-wizard-image__test-cli__13.0"
"odoo-openupgrade-wizard-image__test-cli__14.0"
)
assert docker_client.images.get(
"odoo-openupgrade-wizard-image__test-cli__14.0"
"odoo-openupgrade-wizard-image__test-cli__15.0"
)

View File

@ -1,7 +1,10 @@
from pathlib import Path
from odoo_openupgrade_wizard.tools.tools_docker import get_docker_client
from odoo_openupgrade_wizard.tools.tools_postgres import execute_sql_request
from odoo_openupgrade_wizard.tools.tools_postgres import (
ensure_database,
execute_sql_request,
)
from . import (
build_ctx_from_config_file,
@ -12,7 +15,11 @@ from . import (
def test_cli_run():
move_to_test_folder()
ctx = build_ctx_from_config_file()
db_name = "database_test_cli___run"
ensure_database(ctx, db_name, state="absent")
cli_runner_invoke(
[
"--log-level=DEBUG",
@ -21,7 +28,7 @@ def test_cli_run():
"--database=%s" % db_name,
"--init-modules=base",
"--stop-after-init",
]
],
)
# Ensure that a subfolder filestore/DB_NAME has been created
@ -29,7 +36,6 @@ def test_cli_run():
assert db_filestore_path.exists()
# Ensure that 'base' module is installed
ctx = build_ctx_from_config_file()
request = (
"SELECT id"
" FROM ir_module_module"

View File

@ -2,7 +2,10 @@ from pathlib import Path
from plumbum.cmd import cp
from odoo_openupgrade_wizard.tools.tools_postgres import execute_sql_request
from odoo_openupgrade_wizard.tools.tools_postgres import (
ensure_database,
execute_sql_request,
)
from . import (
build_ctx_from_config_file,
@ -13,15 +16,20 @@ from . import (
def test_cli_execute_script_python():
move_to_test_folder()
extra_script_path = Path("../extra_script/click_odoo_test.py").absolute()
ctx = build_ctx_from_config_file()
extra_script_path = Path(
"../extra_script/post-migration-custom_test.py"
).absolute()
cp(
extra_script_path,
Path("click_odoo_test.py"),
Path("post-migration-custom_test.py"),
)
db_name = "database_test_cli___execute_script_python"
ensure_database(ctx, db_name, state="absent")
# Install Odoo on V13 with base installed
# Install Odoo on V14 with base installed
cli_runner_invoke(
[
"--log-level=DEBUG",
@ -30,12 +38,11 @@ def test_cli_execute_script_python():
"--database=%s" % db_name,
"--init-modules=base",
"--stop-after-init",
]
],
)
# Compute partners quantity
ctx = build_ctx_from_config_file()
request = "SELECT count(*)" " FROM res_partner;"
request = "SELECT count(*) FROM res_partner;"
partner_quantity_before = int(
execute_sql_request(ctx, request, database=db_name)[0][0]
)
@ -47,8 +54,8 @@ def test_cli_execute_script_python():
"execute-script-python",
"--step=1",
"--database=%s" % db_name,
"--script-file-path=click_odoo_test.py",
]
"--script-file-path=post-migration-custom_test.py",
],
)
partner_quantity_after = int(
execute_sql_request(ctx, request, database=db_name)[0][0]

View File

@ -16,14 +16,15 @@ from . import (
def test_cli_execute_script_sql():
move_to_test_folder()
ctx = build_ctx_from_config_file()
extra_script_path = Path(
"../extra_script/pre-migration-custom_test.sql"
).absolute()
# Deploy SQL Script
destination_path = Path("scripts/step_01__update__13.0")
destination_path = Path("scripts/step_01__regular__14.0")
cp([extra_script_path, destination_path])
ctx = build_ctx_from_config_file()
# Reset database
db_name = "database_test_cli___execute_script_sql"
@ -38,7 +39,7 @@ def test_cli_execute_script_sql():
"execute-script-sql",
"--step=1",
"--database=%s" % db_name,
]
],
)
# Ensure that the request has been done correctly

View File

@ -12,10 +12,10 @@ from . import (
def test_cli_upgrade():
move_to_test_folder()
ctx = build_ctx_from_config_file()
# Initialize database
db_name = "database_test_cli___upgrade"
ctx = build_ctx_from_config_file()
ensure_database(ctx, db_name, state="absent")
cli_runner_invoke(
@ -26,28 +26,7 @@ def test_cli_upgrade():
"--database=%s" % db_name,
"--init-modules=base",
"--stop-after-init",
]
)
# Ensure that 'base' module is installed at 13.0
request = (
"SELECT latest_version"
" FROM ir_module_module"
" WHERE state ='installed'"
" AND name='base';"
)
latest_version = execute_sql_request(ctx, request, database=db_name)
assert latest_version[0][0].startswith("13.")
cli_runner_invoke(
[
"--log-level=DEBUG",
"upgrade",
"--database=%s" % db_name,
"--first-step=1",
"--last-step=3",
]
],
)
# Ensure that 'base' module is installed at 14.0
@ -60,3 +39,24 @@ def test_cli_upgrade():
latest_version = execute_sql_request(ctx, request, database=db_name)
assert latest_version[0][0].startswith("14.")
cli_runner_invoke(
[
"--log-level=DEBUG",
"upgrade",
"--database=%s" % db_name,
"--first-step=1",
"--last-step=3",
],
)
# Ensure that 'base' module is installed at 15.0
request = (
"SELECT latest_version"
" FROM ir_module_module"
" WHERE state ='installed'"
" AND name='base';"
)
latest_version = execute_sql_request(ctx, request, database=db_name)
assert latest_version[0][0].startswith("15.")

View File

@ -14,16 +14,14 @@ class TestCliEstimateWorkload(unittest.TestCase):
"estimate-workload",
"--extra-modules="
# Done Module
"account"
"base"
# Deleted module (because merged)
",account_analytic_default"
# Deleted module (because renamed)
",account_facturx"
# Deleted module (because lost merge)
",base_gengo"
",account_edi_extended"
# Some modules that are not ported (for the time being)
",l10n_be_invoice_bba,l10n_ch_qriban,l10n_latam_base"
# OCA Portted Modules
# OCA Ported Modules
",web_responsive"
# OCA Unported modules
",web_boolean_button"
@ -34,7 +32,7 @@ class TestCliEstimateWorkload(unittest.TestCase):
",web_widget_one2many_tree_line_duplicate"
",web_widget_dropdown_dynamic_example"
",my_module_that_doesnt_exist",
]
],
)
# We check file has been created

View File

@ -23,7 +23,7 @@ def test_cli_install_from_csv():
"--log-level=DEBUG",
"install-from-csv",
"--database=%s" % db_name,
]
],
)
# Ensure that 'base' is installed

View File

@ -11,13 +11,14 @@ from . import (
def test_cli_generate_module_analysis():
move_to_test_folder()
ctx = build_ctx_from_config_file()
db_name = "database_test_cli___generate_module_analysis"
ctx = build_ctx_from_config_file()
# identify main analysis file of openupgrade
analysis_file_path = get_odoo_env_path(ctx, 14.0) / Path(
analysis_file_path = get_odoo_env_path(ctx, 15.0) / Path(
"src/openupgrade/openupgrade_scripts/scripts"
"/base/14.0.1.3/upgrade_general_log.txt"
"/base/15.0.1.3/upgrade_general_log.txt"
)
# We remove this file and run the analysis
@ -34,7 +35,7 @@ def test_cli_generate_module_analysis():
"--step=2",
"--database=%s" % db_name,
"--modules=base",
]
],
)
# The file should has been recreated by the analysis command

View File

@ -1,11 +0,0 @@
import logging
_logger = logging.getLogger(__name__)
_logger.info("click_odoo_test.py : Begin of script ...")
env = env # noqa: F821
for i in range(0, 10):
env["res.partner"].create({"name": "Partner #%d" % (i)})
_logger.info("click_odoo_test.py : End of script.")

View File

@ -1,46 +1,15 @@
# Unused for the time being
import logging
# def _check_orm_usage(self):
# # Classic ORM usage Checks
# partners = self.browse_by_search("res.partner")
_logger = logging.getLogger(__name__)
_logger.info("post-migration-custom_test.py : Begin of script ...")
# self.browse_by_create("res.partner", {"name": "New Partner"})
env = env # noqa: F821
# new_partners = self.browse_by_search("res.partner")
for i in range(0, 10):
partner_name = "Partner #%d" % (i)
_logger.info("Create Partner %s" % partner_name)
env["res.partner"].create({"name": partner_name})
# if len(partners) + 1 != len(new_partners):
# raise Exception("Creation of partner failed.")
_logger.info("post-migration-custom_test.py : End of script.")
# def _check_modules(self):
# if self.check_modules_installed("sale"):
# self.uninstall_modules("sale")
# self.install_modules("sale")
# if not self.check_modules_installed("sale"):
# raise Exception("'sale' module should be installed")
# self.uninstall_modules(["product"])
# if self.check_modules_installed("sale"):
# raise Exception(
# "'sale' module should not be installed"
# " after uninstallation of product"
# )
# def _check_models(self):
# if not self.check_models_present("res.partner"):
# raise Exception("'res.partner' model should be present.")
# if self.check_models_present("res.partner.unexisting.model"):
# raise Exception(
# "'res.partner.unexisting.model' model" " should not be present."
# )
# def main(self):
# _check_orm_usage(self)
# _check_modules(self)
# _check_models(self)
env.cr.commit()

View File

@ -1,31 +1,40 @@
project_name: test-cli
postgres_image_name: postgres:13
postgres_container_name: test-cli-db
postgres_container_name: test-cli-container-postgres
postgres_volume_name: test-cli-volume-postgres
odoo_host_xmlrpc_port: 9069
odoo_default_country_code: FR
odoo_versions:
- 13.0
- 14.0
- 15.0
odoo_version_settings:
14.0:
repo_url: False
15.0:
repo_url: False
migration_steps:
- name: 1
version: 13.0
version: 14.0
execution_context: regular
complete_name: step_01__update__13.0
complete_name: step_01__regular__14.0
- name: 2
version: 14.0
version: 15.0
execution_context: openupgrade
complete_name: step_02__upgrade__14.0
complete_name: step_02__openupgrade__15.0
- name: 3
version: 14.0
version: 15.0
execution_context: regular
complete_name: step_03__update__14.0
complete_name: step_03__regular__15.0
workload_settings: