Skip to content

1.1 Step | PrepareOptRoot

Omisen edited this page Jul 27, 2026 · 5 revisions

Primo Step reale dell'installer: crea /opt/odoo (il valore ctx.odoo_home) se manca, in modo reversibile. Vive in src/steps/prepare_opt_root.rs. È la mutazione più semplice possibile — una directory — scelta apposta come modello di riferimento per gli step successivi (utente, apt, postgres…): tutti sono varianti più ricche dello stesso schema snapshot → run → undo.

Nasce dalla correzione C4: il mkdir che nel Bash era nascosto dentro check_disk diventa qui uno step con undo. Vedi 1. Checks e 0. Motore.


Ciclo di vita

Fase Comportamento
snapshot ctx.odoo_home esiste → PreState::Preexisting; altrimenti resta Untracked (il run non l'ha ancora creata)
run Preexisting → no-op (non è nostra: né owner né permessi); Untrackedmkdir + 0755, poi PreState::CreatedByUs. In dry_run logga soltanto
undo agisce solo se CreatedByUs: rimuove la dir solo se vuota (rmdir, mai rm -rf). Preexisting/Untracked → no-op

I tre PreState sono tutti gestiti e testati. Il PreState post-run viene serializzato (snapshot_value) e persistito, così il rollback sa se la directory è nostra. (Oggi lo stato persistito non è ancora riletto: vedi la nota sull'invariante 4 in 0. Motore.)


Dettagli che contano

Owned root, per ora

A questo punto l'utente odoo non esiste ancora (viene creato in Fase 3). Perciò la directory è creata owned root con permessi 0755; il chown odoo:odoo avverrà nello step di creazione utente — che è l'ordine corretto. La dipendenza è documentata nel codice.

mkdir, non mkdir -p

Si crea solo il livello mancante (create_dir, non create_dir_all). Il rollback deve ripristinare esattamente ciò che abbiamo aggiunto: se creassimo anche /opt non lo ri-rimuoveremmo, lasciando un residuo. Il parent (/opt) si assume esistente sul sistema.

undo best-effort, mai distruttivo

  • Idempotente: se la dir è già sparita → no-op.
  • Rimuove solo se vuota. Se contiene artefatti di step successivi, quegli step hanno i propri undo che girano prima (ordine inverso), quindi al momento dell'undo di PrepareOptRoot la dir dovrebbe essere vuota. Se non lo è → warning e non si forza. Mai rm -rf.
  • Una dir Preexisting non viene mai rimossa: non è nostra da distruggere.

Posto nel flusso

parse config
  └─▶ preflight checks (non mutanti)
       └─▶ Installer::execute([ PrepareOptRoot, … ])   ← prima mutazione, reversibile

Per ora PrepareOptRoot è l'unico step reale nella sequenza di produzione; le fasi 3–10 appenderanno gli altri dopo di esso, senza modificare il motore.


Note di design

  • Implementazione esemplare e volutamente minimale: se il pattern è pulito qui, gli step complessi lo copiano.
  • Nessun .unwrap()/.expect(): ogni fallimento è un Result.
  • Test del round-trip: CreatedByUs (crea→rimuove), Preexisting (sopravvive all'undo), dir non vuota (undo non forza), dry_run (non crea, undo no-op).

Clone this wiki locally