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.0.tar.gz (11.5 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.0-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: strx_odoo_updater-1.0.0.tar.gz
  • Upload date:
  • Size: 11.5 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.0.tar.gz
Algorithm Hash digest
SHA256 9a2a089caefd04c26c4a2250fdd9dcbf6e40f348173625480760eae5dbef2cfa
MD5 a923dbedde22140cea5566f1f07c0d22
BLAKE2b-256 70617a589e64561d7d4328cd7469646ba1a0c48bc9c768b9d438cbce3b52399b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for strx_odoo_updater-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9fd10c4aed286a48948dbad6905acb99cffffa34289daa91b837920e42d2f16c
MD5 1f4ccdb54b92c27ed2ec8838bbacb88b
BLAKE2b-256 5526df56ceb345f2e686383b1fe50e97b0ecc6fc85bb00ad145bd978d0eff00e

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