Development #15513
Commande pour supprimer un tenant
0%
Description
Ajouter un delete_tenant à l'application hobo.multitenant
qui fait simplement un Tenant.delete()
dans un premier temps (à terme ce serait bien de dumper le schéma et de joindre ça au répertoire des données dans un tarball/zip).
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
- Fichier 0001-add-a-delete_tenant-command.patch 0001-add-a-delete_tenant-command.patch ajouté
- Patch proposed changé de Non à Oui
Travail mâché, yapuka tester (poser simplement la commande dans /usr/lib/python2.7/dist-packages/hobo/multitenant/management/commands/, faire des tests avec create_tenant tout bêtement avant de passer à une utilisation via la commande ozwillo).
Mis à jour par Thomas Noël il y a environ 7 ans
Pas sûr que ça marche au niveau de la suppression du schema (tenant.auto_drop_schema est à False, et delete a un force_drop=False par défaut)
Cf http://git.entrouvert.org/hobo.git/tree/hobo/multitenant/models.py#n58
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command.patch 0001-multitenant-add-delete_tenant-command.patch ajouté
j'ai modifié la commande pour pouvoir détruire les schéma (ajout de l'option --force-drop pour pouvoir appeler la méthode delete() de Tenant avec force_drop).
Ça fonctionne (je viens de voir que thomas avait commenté, j'ai vu en effet le souci et j'ai ajouté ça)
Mis à jour par Thomas Noël il y a environ 7 ans
Quand on va oublier --force-drop ça risque de nous jouer des tours le lendemain, parce que le schema sera toujours là, et quand on va vouloir recréer le tenant, boummm.
Lorsque force_drop est faux, je serais pour renommer le schema en « removed_20170320162810_<nom_du_schema> »
De même plutôt renommer le répertoire « removed_20170320162810_<nom_du_schema>.invalid »
(tout ça dans le Tenant.delete(), avec usage d'un datetime.now().strftime('%Y%m%d%H%M%S%f') )
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command.patch 0001-multitenant-add-delete_tenant-command.patch ajouté
ok j'ai fait les changements et j'ai ajouté la suppression du dossier dans le cas où on veut supprimer le schéma.
Plus simple pour la suppression totale => on appelle la commande (ou le méthode) et ça dégage tout (je sens que je vais avoir des retours là dessus mais bon, je trouve ça plus logique que de laisser un .invalid sans schéma ni objet tenant).
Mis à jour par Thomas Noël il y a environ 7 ans
Jean-Baptiste Jaillet a écrit :
ok j'ai fait les changements et j'ai ajouté la suppression du dossier dans le cas où on veut supprimer le schéma.
Plus simple pour la suppression totale => on appelle la commande (ou le méthode) et ça dégage tout (je sens que je vais avoir des retours là dessus mais bon, je trouve ça plus logique que de laisser un .invalid sans schéma ni objet tenant).
'%Y_%m_%d_%H_%M' ne suffit pas si on a deux drop dans la même minute, boum. T'avais juste à copier coller mon %Y%m%d%H%M%S%f :)
Ok pour me rmtree mais dans un "if force_drop:" isolé. Et dans le else, le os.rename.
A propos du rename : « self.get_directory() + 'removed_%s_%s.invalid' % (self.schema_name, delete_date) » : rajouter un "." devant le "removed". Retirer le "self.schema_name" qui est déjà dans get_directory. → « self.get_directory() + '.removed_%s.invalid' % delete_date »
Et pour finir, un petit coup de pip8 : self.schema_name,delete_date manque un espace.
Mis à jour par Frédéric Péters il y a environ 7 ans
cursor.execute('ALTER SCHEMA %s RENAME removed_%s_%s' % (self.schema_name,delete_date, self.schema_name))
La syntaxe mentionnée dans https://www.postgresql.org/docs/current/static/sql-alterschema.html est ALTER SCHEMA name RENAME TO newname
; ça a été testé ?
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command-15513.patch 0001-multitenant-add-delete_tenant-command-15513.patch ajouté
- Statut changé de Nouveau à En cours
@Fred oui c'est bien ça que j'ai regardé j'avais omis le TO dans le code.
@Thomas c'est modifié (je te laisse le choix dans la date).
Mis à jour par Frédéric Péters il y a environ 7 ans
Le %Y%m%d%H%M%S%f est quand même bien peu lisible, %Y%m%d_%H%M%S_%f ? (et nommer la variable deletion_date, et la définir dans la branche où elle est utilisée)
Si force_drop
est passé, le schéma n'est plus supprimé.
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command-15513.patch 0001-multitenant-add-delete_tenant-command-15513.patch ajouté
remarques prises en compte.
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
Attention à la taille limite des identifiants dans postgresql, 63 caractères:
http://stackoverflow.com/questions/8213127/maximum-characters-in-labels-table-names-columns-etc
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
Rest à faire un test dans tests_multitenant/ ? Le fixture tenants
fournit un environnement avec deux tenants tenant1.example.net
et tenant2.example.net
.
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
Pour les caractères je tronque la chaîne, au risque de perdre un bout de l'info?
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
En général c'est le minimum qu'on peut faire oui, normalement rien que la date te garantira l'unicité.
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
je crois que gardé le nom c'était plus à titre 'd'archives', sinon je vois pas l'intérêt de garder un schéma si on ne sait plus de quoi ça parle.
Mais si on s'en fiche du nom, mettre uniquement la date me va (je ne connais pas la raison de vouloir garder le schéma et les dossiers si on supprime le tenants).
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
Jean-Baptiste Jaillet a écrit :
je crois que gardé le nom c'était plus à titre 'd'archives', sinon je vois pas l'intérêt de garder un schéma si on ne sait plus de quoi ça parle.
Mais si on s'en fiche du nom, mettre uniquement la date me va (je ne connais pas la raison de vouloir garder le schéma et les dossiers si on supprime le tenants).
Et si on s'est trompé ?
Je préfère qu'on garde aussi une partie du nom autant que possible, ça facilite le boulot de retrouver tout ça en cas d'erreur.
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Lié à Development #14935: Création d'une app ozwillo dans hobo/contrib ajouté
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command-15513.patch 0001-multitenant-add-delete_tenant-command-15513.patch ajouté
Voilà avec les tests et en respectant le nombre de caractères max pour le nom de schéma dans postgres
Mis à jour par Benjamin Dauvergne il y a environ 7 ans
Tu pourrais ajouter aux test de vérifier qu'un schéma removed_* et un répertoire removed_* est apparu (test avant et après le delete_tenant).
def get_schemas(): from django.db import connection cursor = connection.cursor() cursor.execute('select schema_name from information_schema.schemata') schemas = [x[0] for x in cursor.fetchall()]
Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans
- Fichier 0001-multitenant-add-delete_tenant-command-15513.patch 0001-multitenant-add-delete_tenant-command-15513.patch ajouté
Avec les tests approfondis.
Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans
- Statut changé de En cours à Résolu (à déployer)
Poussé
Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans
- Statut changé de Résolu (à déployer) à Fermé
multitenant: add delete_tenant command (#15513)