Skip to main content

Incremental Odoo module updater with checkpoint/resume support

Project description

strx-odoo-updater

PyPI version Python License: OPL-1

Wrapper de click-odoo-update con soporte de checkpoint y reanudación automática. Evita reprocesar módulos ya actualizados cuando la migración falla a mitad.


El problema

click-odoo-update ejecuta la actualización completa dentro de una sola transacción (Registry.new()). Si el proceso es interrumpido (OOM killer, error SQL, timeout), PostgreSQL hace rollback y todos los checksums almacenados se revierten — aunque 150 de los 200 módulos ya se hubieran actualizado correctamente.

La siguiente ejecución vuelve a procesar los 200 módulos desde cero.

La solución

strx-odoo-updater actualiza módulo por módulo. Cada módulo se ejecuta en un subproceso independiente (odoo-bin -u <module> --stop-after-init) que tiene su propia transacción y hace su propio commit. Tras cada módulo exitoso guarda el progreso en ir_config_parameter:

Clave en ir_config_parameter Contenido
strx.update_resume.checkpoint JSON: lista de módulos completados
strx.update_resume.failed JSON: lista de módulos fallidos
strx.update_resume.last_update ISO timestamp del último progreso

Al reiniciar tras un fallo, el script lee el checkpoint y salta automáticamente los módulos ya completados.


Instalación

# Desde PyPI (recomendado):
pip install strx-odoo-updater

# Dentro del venv de Odoo 16:
/opt/odoo16/venv16/bin/pip install strx-odoo-updater

# Modo editable (para desarrollo):
pip install -e /opt/odoo16/strx_tools/strx_odoo_updater

Dependencias

Paquete Requerido Notas
psycopg2 Conexión directa a PostgreSQL
click-odoo-contrib Opcional Para cálculo exacto de checksums
odoo-bin En PATH/env Ejecutable de Odoo (no pip)

Uso rápido

# Exportar PYTHONPATH si Odoo no está instalado como paquete pip:
export PYTHONPATH=/opt/odoo16/odoo-server:$PYTHONPATH

# Primera ejecución (o reanudación tras fallo):
strx-odoo-updater \
    -c /opt/odoo16/conf/odoo-server.conf \
    -d mi_base_de_datos \
    --i18n-overwrite \
    --skip-failed

# Ver qué módulos quedan pendientes (sin ejecutar nada):
strx-odoo-updater -c ... -d ... --list-only

# Limpiar checkpoint y empezar desde cero:
strx-odoo-updater -c ... -d ... --reset

# Sin pase final de click-odoo-update:
strx-odoo-updater -c ... -d ... --no-final-update

Referencia de opciones CLI

Opción Descripción
-c, --config PATH Archivo de configuración de Odoo (requerido)
-d, --database NAME Nombre de la base de datos (requerido)
--i18n-overwrite Sobreescribir traducciones existentes
--reset Elimina el checkpoint y sale
--list-only Lista módulos pendientes/completados sin actualizar
--skip-failed Continúa aunque un módulo falle (registra el fallo y sigue)
--no-final-update Omite el pase final de click-odoo-update

Variables de entorno

Permiten reusar el paquete en diferentes instalaciones de Odoo sin modificar el código:

Variable Default Descripción
ODOO_BIN /opt/odoo16/odoo-server/odoo-bin Ruta al ejecutable odoo-bin
CLICK_ODOO_UPDATE <venv>/bin/click-odoo-update Ruta a click-odoo-update
ODOO_SERVER_PATH /opt/odoo16/odoo-server Raíz del servidor para PYTHONPATH

Ejemplo para Odoo 17 en otro servidor

export ODOO_BIN=/opt/odoo17/odoo-bin
export ODOO_SERVER_PATH=/opt/odoo17
export CLICK_ODOO_UPDATE=/opt/odoo17/venv/bin/click-odoo-update
export PYTHONPATH=/opt/odoo17:$PYTHONPATH

strx-odoo-updater -c /opt/odoo17/conf/odoo.conf -d produccion --skip-failed

Flujo interno

strx-odoo-updater
│
├─ Conecta a PostgreSQL directo (lee configuración de odoo.conf)
├─ Detecta módulos con checksums distintos (igual que click-odoo-update)
│   └─ Fallback: módulos con state='to upgrade'
├─ Lee checkpoint de ir_config_parameter
├─ Calcula: pendientes = detectados - ya_completados
│
└─ Para cada módulo pendiente:
    ├─ odoo-bin -u <module> --stop-after-init --no-http (subprocess)
    ├─ returncode == 0?
    │   ├─ SÍ  → checkpoint += module, actualiza checksum, commit
    │   └─ NO  → failed += module
    │           └─ --skip-failed? continúa : detiene y guarda estado
│
└─ Al finalizar (sin fallos):
    ├─ click-odoo-update (pase final: detecta 0 diferencias)
    └─ Limpia checkpoint de ir_config_parameter

Uso como librería Python

from strx_odoo_updater.core import (
    _connect,
    _get_modules_to_update,
    _load_checkpoint,
    _save_checkpoint,
    _update_single_module,
    _sync_checksum,
)

conn = _connect("/etc/odoo/odoo.conf", "mi_bd")
pending = _get_modules_to_update(conn, "/etc/odoo/odoo.conf")
done = _load_checkpoint(conn)

for module in pending:
    if module in done:
        continue
    ok = _update_single_module("/etc/odoo/odoo.conf", "mi_bd", module)
    if ok:
        done.add(module)
        _save_checkpoint(conn, done)
        _sync_checksum(conn, module)

conn.close()

Casos de uso

Migración de base de datos (Odoo 12 → 16)

Durante migraciones largas (200+ módulos), es habitual encontrar errores SQL que detienen el proceso. Con strx-odoo-updater:

  1. Se ejecuta hasta el módulo problemático
  2. Se diagnostica y corrige el error en la BD
  3. Se vuelve a ejecutar — continúa desde donde quedó, no desde cero

Servidor con poca RAM (OOM killer)

Si el proceso es matado por el sistema operativo por falta de memoria:

# El módulo que causó el OOM queda registrado en .failed
# Los módulos anteriores están en el checkpoint

# Próxima ejecución: salta los ya completados, reintenta el fallido
strx-odoo-updater -c ... -d ... --skip-failed

Actualización nocturna desatendida

#!/bin/bash
# /etc/cron.d/odoo-update — ejecuta a las 2am
export PYTHONPATH=/opt/odoo16/odoo-server:$PYTHONPATH
/opt/odoo16/venv16/bin/strx-odoo-updater \
    -c /opt/odoo16/conf/odoo-server.conf \
    -d produccion \
    --i18n-overwrite \
    --skip-failed \
    >> /var/log/odoo/strx-updater.log 2>&1

Diagnóstico del checkpoint

-- Ver estado del checkpoint directamente en PostgreSQL:
SELECT key, 
       left(value, 120) as value_preview,
       write_date
FROM ir_config_parameter
WHERE key LIKE 'strx.update_resume.%'
ORDER BY key;

-- Limpiar checkpoint manualmente:
DELETE FROM ir_config_parameter WHERE key LIKE 'strx.update_resume.%';

Desarrollo

git clone <repo>
cd strx_tools/strx_odoo_updater
pip install -e ".[dev]"
pytest tests/

Estructura del proyecto

strx_odoo_updater/
├── pyproject.toml              ← Configuración del paquete pip
├── README.md                   ← Este archivo
└── strx_odoo_updater/
    ├── __init__.py             ← Versión del paquete
    ├── core.py                 ← Lógica principal (importable)
    └── cli.py                  ← Entry point del comando CLI

Publicar nueva versión a PyPI

# 1. Actualizar version en pyproject.toml y __init__.py
# 2. Construir y publicar:
cd strx_odoo_updater/
pip install build twine
python -m build
twine upload dist/*

Licencia

OPL-1 — © STRACONX S.A.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strx_odoo_updater-1.0.1.tar.gz (11.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strx_odoo_updater-1.0.1-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file strx_odoo_updater-1.0.1.tar.gz.

File metadata

  • Download URL: strx_odoo_updater-1.0.1.tar.gz
  • Upload date:
  • Size: 11.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for strx_odoo_updater-1.0.1.tar.gz
Algorithm Hash digest
SHA256 2cff70f3e6307983bae19325391087b8b99e1af6aa69c296e2a6a1e406cf1bd4
MD5 372ee38b7b3c5d9c98336cddeadca734
BLAKE2b-256 291e56039123bc601a8e1a8dae297665ca3a7594781a661b35ee5a857563f24f

See more details on using hashes here.

File details

Details for the file strx_odoo_updater-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for strx_odoo_updater-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f388a45393257c63194a99af229492ca7cf873200c5f603e2eae3c7c076562cd
MD5 ca2d923ef72653f24bf91be422dbc253
BLAKE2b-256 2c8e89a15b1532602d929601792de23cf9a355d47f7dd27bf3271ff92e8657f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page