Projet

Général

Profil

Development #15513

Commande pour supprimer un tenant

Ajouté par Benjamin Dauvergne il y a environ 7 ans. Mis à jour il y a presque 7 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Jean-Baptiste Jaillet
Catégorie:
-
Version cible:
-
Début:
20 mars 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

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

Lié à Hobo - Development #14935: Création d'une app ozwillo dans hobo/contribFermé09 février 2017

Actions

Révisions associées

Révision 1e1ee079 (diff)
Ajouté par Jean-Baptiste Jaillet il y a presque 7 ans

multitenant: add delete_tenant command (#15513)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

  • Tracker changé de Bug à Development
#2

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

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).

#3

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

#4

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

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)

#5

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') )

#6

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

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).

#7

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.

#8

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é ?

#9

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

@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).

#10

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é.

#11

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

remarques prises en compte.

#12

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

#13

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.

#14

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?

#15

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é.

#16

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).

#17

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.

#18

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

#19

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

Voilà avec les tests et en respectant le nombre de caractères max pour le nom de schéma dans postgres

#20

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()]
#21

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

Avec les tests approfondis.

#22

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

Ack.

#23

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Statut changé de En cours à Résolu (à déployer)

Poussé

#24

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF