You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Add test workflow: matrix Python 3.11/3.12/3.13 on push and PR
- Bump version to 0.2.0 (sync pyproject.toml with __init__.py)
- Update Python requirement from >=3.9 to >=3.11
- Document lessons learned: manageBackupJob API, -D param format, disabled field
- Add JetBackup5 API quick reference table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
**Causa raíz:** El código buscaba `group["job_id"]` pero JetBackup5 almacena la referencia al job en `group["data"]["_id"]`
87
89
**Solución:** Cambiar a `group.get("data", {}).get("_id")` para el matching
88
90
**Regla derivada:** Las fixtures de test DEBEN reflejar la estructura real de la API. Usar respuestas capturadas de producción como base para fixtures.
91
+
92
+
### 2026-02-25 — editBackupJob no existe, usar manageBackupJob
**Problema:** Jobs con `disabled=1` nunca arrancaban. El orquestador enviaba `editBackupJob -D "enabled=1"` (luego corregido a `disabled=0`), JetBackup devolvía rc=0 pero el campo `disabled` no cambiaba. El job se triggeaba con `runBackupJobManually` pero nunca pasaba a `running=true`, causando startup timeout de 120s.
96
+
**Causa raíz:**`editBackupJob` no existe en la API de JetBackup5. La API la acepta silenciosamente (rc=0, 267 bytes) sin hacer nada. La función correcta es **`manageBackupJob`** con `action=modify`.
97
+
**Evidencia:** servidor20 funcionaba por casualidad (sus jobs ya tenían `disabled=0`). servidor30 fallaba (jobs con `disabled=1`). El `runBackupJobManually` devolvía 219 bytes (error silencioso) vs 3098 bytes cuando el job realmente arranca.
98
+
**Solución:** Cambiar a `manageBackupJob` con params `_id`, `action=modify`, `disabled=0/1`
99
+
**Regla derivada:** Listar funciones disponibles con `jetbackup5api -F ""` antes de asumir nombres. El patrón de la API es `manage*` para modificar estado (no `edit*`).
100
+
101
+
### 2026-02-25 — Formato de parámetros -D en jetbackup5api
**Problema:** Múltiples flags `-D "key=value"` funcionaban para algunas funciones pero no para `manageBackupJob` (ignoraba `action=modify` silenciosamente).
105
+
**Causa raíz:** El formato documentado de JetBackup5 es un solo `-D` con parámetros separados por `&`: `-D "key1=value1&key2=value2"`. El formato con múltiples `-D` es un comportamiento no documentado que funciona para funciones simples pero no para todas.
106
+
**Solución:** Cambiar ambos helpers (`_api_call` y `_api_call_no_json`) para usar `&`-separated params en un solo `-D`.
107
+
**Regla derivada:** Usar SIEMPRE el formato canónico `&`-separated. Nunca múltiples `-D`, aunque parezca funcionar.
108
+
109
+
### 2026-02-25 — JetBackup5 usa campo disabled (no enabled) para jobs
110
+
111
+
**Contexto:** jetbackup_api.py, fixtures de test
112
+
**Problema:** Las fixtures usaban `"enabled": true/false` pero la API real devuelve `"disabled": 0/1`.
113
+
**Causa raíz:** Se asumió la estructura del campo sin verificar con la API real.
114
+
**Solución:** Fixtures actualizadas a `"disabled": 0` / `"disabled": 1`. El campo `enabled` no existe en la respuesta de `getBackupJob`.
115
+
**Regla derivada:** Para destinos Y para jobs, el campo de estado es `disabled` (0/1 o true/false). Nunca `enabled`.
116
+
117
+
## Referencia rápida API JetBackup5
118
+
119
+
| Acción | Función API | Params clave |
120
+
|--------|-------------|--------------|
121
+
| Listar funciones |`jetbackup5api -F ""`| — |
122
+
| Estado destino |`manageDestinationState`|`_id`, `disabled=0/1`|
0 commit comments