Projet

Général

Profil

Development #15636

Commande pour détruire un tenant

Ajouté par Jean-Baptiste Jaillet il y a environ 7 ans. Mis à jour il y a plus de 5 ans.

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

À l'image de ce que fais la commande delete_tenant #15513


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 c3f6b060 (diff)
Ajouté par Jean-Baptiste Jaillet il y a presque 7 ans

general: add a command to delete a tenant (#15636)

Historique

#1

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

#2

Mis à jour par Frédéric Péters il y a environ 7 ans

Dans #15513 il y a renommage du schéma postgresql mais on ne peut pas avoir cette approche dans w.c.s. et on n'a pas la possibilité de s'auto-renommer. On pourrait faire un équivalent au "createdb-connection-params" (cf #15573) pour se connecter à la db postgres mais c'est un peu obscur; on peut aussi simplement passer sur toutes les tables et les renommer. (et pour le force-drop les supprimer). Ça demande cependant quand même aussi une modification à check_hobos.py pour qu'il considère également comme nouvelle base de données une base qui existerait mais n'aurait pas de table wcs_meta. Pour le renommage du répertoire du tenant, faire comme #15513 est ok.

#3

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

À tester mais il me semble que la base "postgres" est généralement présente et toujours accessible à un utilisateur authentifié, donc on peut se connecter avec l'utilisateur en cours mais à la base "postgres" et ça devrait marcher.

#4

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

En effet benj je viens de tester donc je peux renommer depuis postgres sur une base de wcs puisque wcs-au-quotidien a les droits suffisant.

#5

Mis à jour par Frédéric Péters il y a environ 7 ans

[...] puisque wcs-au-quotidien a les droits suffisant.

Il n'y a pas de garantie là-dessus; pour que ça soit le cas il faut que l'utilisateur soit superutilisateur ou puisse créer de nouvelles bases; avec #15573 on permet justement que cette permission ne soit pas donnée à l'utilisateur (en faisant le CREATE DB selon les paramètres de 'createdb-connection-params').

#6

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

wcs ne peut pas forcément créer de nouvelle base justement ? Je me souviens du paramétrage de l'utilisateur postgresql de wcs puisque quand on converti en sql wcs doit pouvoir créer une base.

#7

Mis à jour par Frédéric Péters il y a environ 7 ans

avec #15573 on permet justement que cette permission ne soit pas donnée à l'utilisateur

#8

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

Voilà, avec le patch

#9

Mis à jour par Frédéric Péters il y a environ 7 ans

Au-delà des mille commentaires sur la forme, s'il y a un createdb-connection-params il y a moyen de faire "CREATE DATABASE" et donc il y a aussi moyen d'en changer le nom. Si tu ne veux pas profiter de ça, tu peux juste ne pas regarder à createdb-connection-params.

#10

Mis à jour par Frédéric Péters il y a environ 7 ans

Pour reprendre et développer des commentaires posés sur le salon vendredi,

  • check_hobos.py
    • <soupir/> sur le code mal indenté dans check_hobos qui ne s'exécutera même pas; c'est détecté en exécutant les tests…
    • la recherche de la table wcs_meta, elle peut se faire directement dans l'SQL, table_name = 'wcs_meta'.
    • éviter les \ en fin de ligne c'est moche et souvent inutile.
    • les chaines avec de l'SQL dans le code, outre les \ à virer, il y a moyen de les rendre plus agréables à lire, espaces autour des =, alignement des mots, etc.
  • delete_tenant.py
    • plutôt avoir du code en petits morceaux dans sql.py, ça facilitera l'écriture de tests.
    • parce que oui, il en faut.
    • ça facilitera la chose d'ignorer createdb-connection-params pour le moment, ça m'irait. (alternativement il pourrait s'agir de modifier le get_connection pour qu'il puisse tirer des paramètres de connexion d'ailleurs)
    • plutôt que renommer toutes les tables me vient à l'idée maintenant qu'on pourrait simplement créer un schéma postgresql et les y déplacer.
    • pris comme ça, tout le code sous la ligne 45 serait dégagé et remplacé par quelque chose comme :
for object_class in [x.data_class() for x in FormDef.select()] + [pub.user_class, pub.tracking_code_class, sql.WcsMeta]:
    object_class.remove_table(force_drop=sub_options.force_drop)

if sub_options.force_drop:
    os.rmtree(...)
else:
    os.rename(...)
#11

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

Bon voilà le patch.

Ce n'est pas une faute d'attention pour la prise en compte de createdb-connection-params, j'avais commencé (après les remarques du salon) à intégrer la logique dans le code, et j'ai voulu faire la commande à fond, au moins c'est fait.

J'ai splité la commande en deux partie: une pour la récupération des arguments et création du publisher, et la méthode de destruction à proprement parlé. Par contre toute la logique du sql est dans la commande.

Et les tests recouvre tous les cas de la commande (--force-drop True et False avec et sans createdb-connections-params) jusque dans les effets qui doivent être observé dans la bdd.

#12

Mis à jour par Frédéric Péters il y a presque 7 ans

Le passage par les schémas postgresql c'était une mauvaise idée dans la mesure où les autres vérifications dans information_schema.tables ne précisent pas le schéma "public"; soit il faut modifier les autres select sur information_schema.tables, soit passer par l'ancien fonctionnement (renommer les tables).

Ajouter un commentaire comme quoi avoir un "createdb-connection-params" nous indique qu'on aura ainsi les droits pour faire un DROP DATABASE. (au-dessus de createdb_cfg = pub.cfg['postgresql'].get('createdb-connection-params', {})).

Toujours cette limite postgresql sur les identifiants, pas garanti que removed_/database name/_/date/ tienne. (ex: wcs_demarches_urville_nacqueville_hague_lahague_com), et le nom de la base se trouverait ainsi tronqué et ça ferait échouer une seconde suppression.

Concernant la longueur des identifiants, si l'option prise est de renommer toutes les tables, il faut créer des noms de table de bonne taille dès le début, en tronquant la partie centrale (= l'ancien nom de table, qui aura toujours l'identifiant au début pour repérer de manière nette l'origine).

Le try/except psycopg2.Error couvre bien trop de code (et le résultat c'est que dans le except: on fait du code sur une seule itération de l'ancienne boucle sur les tables).

#13

Mis à jour par Frédéric Péters il y a presque 7 ans

J'écrivais :

Concernant la longueur des identifiants, si l'option prise est de renommer toutes les tables, il faut créer des noms de table de bonne taille dès le début, en tronquant la partie centrale (= l'ancien nom de table, qui aura toujours l'identifiant au début pour repérer de manière nette l'origine).

Note qu'à dormir dessus je préférerais garder l'option du déplacement dans un schéma, en modifiant les autres SELECT sur information_schema.tables pour spécifier le schéma.

#14

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

Fred je reviens sur tes retours, avec quelques questions :

Toujours cette limite postgresql sur les identifiants, pas garanti que removed_/database name/_/date/ tienne. (ex: wcs_demarches_urville_nacqueville_hague_lahague_com), et le nom de la base se trouverait ainsi tronqué et ça ferait échouer une seconde suppression.

et :

je préférerais garder l'option du déplacement dans un schéma, en modifiant les autres SELECT sur information_schema.tables pour spécifier le schéma.

Cela semble vouloir dire que l'on peut relancer la commande de suppression, mais pour moi, quelque soit l'option choisie (force-drop ou pas, utilisateur exterieur ou pas), une fois déplacer, renommer ou supprimer, l'instance devient inutilisable. C'est juste qu'on met de côté les données en cas d'erreur et pour pouvoir dumper sur une nouvelle instance.

Si on doit pouvoir garder ça, il faudrait que je modifie le publisher de l'instance non ? Puisque quand j'ai fait mes tests, j'ai remarqué qu'en changeant / supprimant la base et le pub.app_dir, les valeurs ne sont pas mises à jour, donc de toute façon, en cas de relance de la commande sur l'instance, j'aurai une erreur. Ou quelque chose m'échappe?

#15

Mis à jour par Frédéric Péters il y a presque 7 ans

je préférerais garder l'option du déplacement dans un schéma, en modifiant les autres SELECT sur information_schema.tables pour spécifier le schéma.

Cela semble vouloir dire que l'on peut relancer la commande de suppression [...]

Ton patch, en l'état, déplace les tables dans un schéma particulier.

Si jamais une nouveau déploiement est fait et configuré pour utiliser la même base, ça va bizarrement foirer parce que les SELECT sur information_schema.tables vont mélanger des tables du schéma "public" en cours avec les tables archivées.

#16

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

Discuté avec Thomas est-ce que la solution de remplacer les select sur les tables dans les requêtes (majoritairement dans sql.py) irait?

         cur.execute('''SELECT COUNT(*) FROM information_schema.tables
-                       WHERE table_name LIKE %s''', ('formdata\\_%s\\_%%' % new_id,))
+                       WHERE table_schema = 'public' AND
+                       table_name LIKE %s''', ('formdata\\_%s\\_%%' % new_id,))

#17

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

Jean-Baptiste Jaillet a écrit :

Discuté avec Thomas est-ce que la solution de remplacer les select sur les tables dans les requêtes (majoritairement dans sql.py) irait?
[...]

Il me semble que c'est exactement ce que demandait Fred:

Note qu'à dormir dessus je préférerais garder l'option du déplacement dans un schéma, en modifiant les autres SELECT sur information_schema.tables pour spécifier le schéma.

#18

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

Hop avec les modifs

#19

Mis à jour par Frédéric Péters il y a presque 7 ans

        # if there's a createdb-connection-params, we can do a DROP DATABASE with the
        # the option --force-drop, rename it if not

the the.

-                    WHERE table_name = %s''', (table_name,))
+                   WHERE table_schema = 'public' AND
+                   WHERE table_name = %s''', (table_name,))

Code jamais exécuté, alors même que les tests passent sur ce bout :

        cur.execute('''SELECT COUNT(*) FROM information_schema.tables
                       WHERE table_schema = 'public' AND
>                      WHERE table_name = %s''', (table_name,))
E       ProgrammingError: syntax error at or near "WHERE" 
E       LINE 3:                    WHERE table_name = 'users'
E                                  ^

git am et

warning: 9 erreurs d'espace ignorées
warning: 14 lignes ont ajouté des erreurs d'espace.

(...)

#21

Mis à jour par Frédéric Péters il y a presque 7 ans

+            print >> sys.stderr, 'failed to alter database %s : (%s)' % (createdb_cfg['database'],

Encore et toujours, pas d'espace devant les : en anglais.

Ça éclate si exécuté sur un wcs qui n'utilise pas postgresql :

  File ".../wcs/ctl/delete_tenant.py", line 50, in delete_tenant
    for k, v in pub.cfg['postgresql'].items():
KeyError: 'postgresql'
#22

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

Exact. Pris en compte, ajout de tests sans sql.

#23

Mis à jour par Frédéric Péters il y a presque 7 ans

if 'postgresql' in pub.cfg:

Plutôt utiliser la méthode de publisher qui existe et fait ça correctement :

    def is_using_postgresql(self):
        return bool(self.has_site_option('postgresql') and self.cfg.get('postgresql', {}))
#24

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

Ok, c'est fait.

#25

Mis à jour par Frédéric Péters il y a presque 7 ans

Application de  command: add a delete_tenant command (#15636)
.git/rebase-apply/patch:169: new blank line at EOF.
+
warning: 1 ligne a ajouté des erreurs d'espace.

Bim.

Vraiment, il faut [color] diff = true dans le .gitconfig, et utiliser git show.

#26

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

OK j'ai ajouté ça. Mon truc de PEP 8 me conseillait d'ajouter une ligne vide à la fin de fichiers python.
C'est noté.

#27

Mis à jour par Serghei Mihai il y a presque 7 ans

Jean-Baptiste Jaillet a écrit :

OK j'ai ajouté ça. Mon truc de PEP 8 me conseillait d'ajouter une ligne vide à la fin de fichiers python.

Mais dans wcs/sql.py tu vires un saut de ligne à la fin du fichier.

#28

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

oui puisque plus haut on me demande de l'enlever. Ou alors je n'ai pas compris :

.git/rebase-apply/patch:169: new blank line at EOF.
+
warning: 1 ligne a ajouté des erreurs d'espace.

#29

Mis à jour par Frédéric Péters il y a presque 7 ans

Grâce à un bug sans trop de rapport, je me rends compte que cette approche avec createdb-connection-params dépend de conserver cette info lors du déploiement, ce qui n'est pas le cas.

#30

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

je suis désolé j'ai pas bien saisi : c'est un problème du coup? on fait la commande sans la prise en compte du createdb-connection-params du coup? Ou il faut conserver les infos quelque part lors de la destruction?

#31

Mis à jour par Frédéric Péters il y a presque 7 ans

je suis désolé j'ai pas bien saisi : c'est un problème du coup? on fait la commande sans la prise en compte du createdb-connection-params du coup? Ou il faut conserver les infos quelque part lors de la destruction?

C'est un problème parce que du coup toute cette partie ne sera jamais appelée. Mais il y a un patch dans #16794.

#32

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

Ok donc c'est le dernier bémol pour le ack de ce patch?

#33

Mis à jour par Frédéric Péters il y a presque 7 ans

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

Légères modifications de style et poussé.

commit c3f6b06007eb53785c4620619fec8202f21bd580
Author: Jean-Baptiste Jaillet <jbjaillet@entrouvert.com>
Date:   Fri Apr 7 16:03:11 2017 +0200

    general: add a command to delete a tenant (#15636)
#34

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF