etalab / admin_api_entreprise

Site vitrine / backoffice de API Entreprise
https://entreprise.api.gouv.fr
MIT License
9 stars 5 forks source link

Harden `Seeds#flushdb` #956

Closed Samuelfaure closed 1 year ago

Samuelfaure commented 1 year ago

On a un soucis avec le déploiement staging: la méthode flushdb peut facilement échouer

En effet on load tous les modèles et on les delete_all successivement, cela raise dans le cas où il y a des constraints relationnelles:

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  update or delete on table "tokens" violates foreign key constraint "fk_rails_75d8d0c9bf" on table "magic_links"

Pourquoi on s'embête avec cette méthode plutôt que d'utiliser un truc déjà existant comme db:seed:replant qui vide la DB avant de replant les seeds?

skelz0r commented 1 year ago

Pourquoi on s'embête avec cette méthode plutôt que d'utiliser un truc déjà existant comme db:seed:replant qui vide la DB avant de replant les seeds?

Je ne suis pas sûr que cela fonctionne sur un environnement simili-prod. Je t'invite à tester et à modifier en conséquence si cela fonctionne.

Sinon je ne vois pas le lien entre flushdb (erreur redis) et ton erreur (qui est une erreur PG).

Samuelfaure commented 1 year ago

Je parle de cette méthode:

https://github.com/etalab/admin_api_entreprise/blob/b9398bb22e947033353ff71b159d9bd70687ec4f/app/lib/seeds.rb#L11-L19

Ça query bien PG?

Samuelfaure commented 1 year ago

En relisant la méthode on dirait qu'elle existe uniquement pour ne pas supprimer les access_logs de staging/sandbox

skelz0r commented 1 year ago

mybad, flushdb c'est aussi en redis d'où ma confusion

En relisant la méthode on dirait qu'elle existe uniquement pour ne pas supprimer les access_logs de staging/sandbox

En effet je pense que c'est voulu ici. Une potentielle solution (si on a bien foutu nos associations) et de faire un destroy_all pour trigger les dependent.

Sinon on peut aussi delete dans cet ordre:

Après je pense que c'est safe de faire le reste en mode delete.

Samuelfaure commented 1 year ago

J'ai déjà test destroy_all ça a pas marché, je vais tenter autrement

skelz0r commented 1 year ago

J'ai déjà test destroy_all ça a pas marché, je vais tenter autrement

Alors ça c'est très étrange, pour moi on a un souci d'association sur nos modèles ...

Sinon, on flip la foreign key (en vrai, c'est de la boue les foreign keys..)