Bug #52156
Recette: échec de la migration des Rôles en SQL
0%
Description
cf https://dev.entrouvert.org/issues/51772#note-6
Toulouse, toodego, table bien créée mais pas de migration des données
En réparation vite fait:
root@wcs:~# cat /tmp/migrate_roles.py from quixote import get_publisher from wcs import sql pub = get_publisher() if pub.is_using_postgresql(): if pub.role_class.count() == 0: print(pub.app_dir, 'run migrate') sql.migrate_legacy_roles() root@wcs:~# sudo -u wcs wcs-manage runscript --all-tenants /tmp/migrate_roles.py
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Lauréline Guérin il y a environ 3 ans
- Lié à Development #51772: Migrer les Rôles en SQL ajouté
Mis à jour par Frédéric Péters il y a environ 3 ans
version finale, que j'ai copié/collée/exécutée partout :
cat > /tmp/migrate_roles.py << _EOF_ from quixote import get_publisher from wcs import sql pub = get_publisher() if pub.is_using_postgresql(): if pub.role_class.count() == 0: print(pub.app_dir, 'run migrate') sql.migrate_legacy_roles() _EOF_ cd /tmp/ && sudo -u wcs wcs-manage runscript --all-tenants /tmp/migrate_roles.py
Mis à jour par Frédéric Péters il y a environ 3 ans
(sur le SaaS de dev ça m'a l'air correct et je n'y ai pas touché, ce que je m'explique peu).
Mis à jour par Frédéric Péters il y a environ 3 ans
Pour info aux agents : il faut se reconnecter pour que les rôles soient pris en compte.
Mis à jour par Lauréline Guérin il y a environ 3 ans
est-ce que ça pourrait être un coup de hobo_notify ?
# All roles have been sent if full and action == 'provision': for role in get_publisher().role_class.select(ignore_errors=True): if role and role.uuid not in uuids: role.remove_self()
Cette partie est testée mais je suis peut-être passée à côté de quelque chose ?
Mis à jour par Frédéric Péters il y a environ 3 ans
Bien vu je viens de lancer authentic... tenant_command hobo_provision --roles -d ... en local et ça m'a vidé les rôles.
Mis à jour par Frédéric Péters il y a environ 3 ans
139 if full and action == 'provision': 140 import pdb; pdb.set_trace() 141 -> for role in get_publisher().role_class.select(ignore_errors=True): 142 if role and role.uuid not in uuids: 143 role.remove_self() 144 145 @classmethod 146 def check_valid_user(cls, o): (Pdb) n > /home/fred/src/eo/wcs/wcs/ctl/hobo_notify.py(142)provision_role() -> if role and role.uuid not in uuids: (Pdb) p role <Role 'Entreprise PLOP' id:7b6ea6a0c41d46c0a5bb8dd08c77b36d> (Pdb) p role.uuid '7b6ea6a0-c41d-46c0-a5bb-8dd08c77b36d' (Pdb) p uuids {'c29fb4f81a734891917f97582f99e95d', 'd29d0c84b6d24c2ab8b572065a900e38', '6b0200c4f12e4360a53e5fbd59d50dcf', 'd8e4cbd3620f4836aecb2b895019e719', '86f2a1469a304f3e879257738ff9b18c', '22e0026188404693be9de2067cc5718a', '88b1db758dba4a5ea2bbffa1956532e5', 'f5bfd9a7a52e4aa7bbf84fb1983b06c1', 'd4b59e1ffb204dfd99fd3760f4952999', '80eb519eec074344a9409aa7dc07a503', 'a8676afa42854d7986ff2678c4ac2fa4', '061e5de7023946c79a2f7f1273afc5a2', 'e90f05e504044696aeb412bebc590736', 'f27535fb794041938451ff937c215439', 'd58df878004c462b9870ca10e527a5c0', '0e3fa684d91c48119cae6b5d5481fc08', '46e908a2e8c34338b0bcf2f5199f6f76', 'e78cdc6cdd7e4607870568f40b88c54c', '085e3cc43a604df095bee6e6e68d3f91', '8201764fc2c24b92bd691fd231a4cf76', 'b3c7084c7f874d098243a55bafe4b40a', '514f0404ffb545429e0e0e10a7ea3552', 'd454656faedd428582b6fc8a25de93e6', '2968fefac5204083ad5ec206863a2a14', 'd4cac97ec92f4486b502c4f4096fb5e2', 'c4672c9a44734b598bba50b660715d3c', '07d7ffbba54445fdb0f825718b85319a'}
Mis à jour par Frédéric Péters il y a environ 3 ans
La colonne UUID fait qu'il y a des tirets dedans.
Mis à jour par Frédéric Péters il y a environ 3 ans
Je réfléchissais au meilleur plan, je dirais que ça va être galère de trainer une colonne UUID avec des comportements pas attendus, ça va être un peu moche mais je vais faire la migration pour passer en varchar.
Mis à jour par Frédéric Péters il y a environ 3 ans
- Fichier 0001-sql-switch-role-uuid-column-to-varchar-52156.patch 0001-sql-switch-role-uuid-column-to-varchar-52156.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Voilà ce que je pense le plus simple; c'est un peu abusé d'appeler migrate_legacy_roles() qui va rejouer la migration depuis les pickle mais c'est facile et derrière le provisionning recadrera le tout, cette fois sans tout effacer.
Mis à jour par Lauréline Guérin il y a environ 3 ans
diff --git a/wcs/ctl/hobo_notify.py b/wcs/ctl/hobo_notify.py index d3b584dd..d621e339 100644 --- a/wcs/ctl/hobo_notify.py +++ b/wcs/ctl/hobo_notify.py @@ -17,6 +17,7 @@ import os import sys import json +import uuid from quixote import get_publisher from ..qommon.ctl import Command @@ -102,8 +103,8 @@ class CmdHoboNotify(Command): for o in data: if 'uuid' not in o: raise KeyError('role without uuid') - uuid = force_str(o['uuid']) - uuids.add(uuid) + role_uuid = force_str(o['uuid']) + uuids.add(role_uuid) slug = None name = None if action == 'provision': @@ -115,15 +116,15 @@ class CmdHoboNotify(Command): emails = [force_str(email) for email in o['emails']] emails_to_members = o['emails_to_members'] # Find existing role - role = get_publisher().role_class.resolve(uuid, slug, name) + role = get_publisher().role_class.resolve(role_uuid, slug, name) if not role: if action != 'provision': continue - role = get_publisher().role_class(id=uuid) + role = get_publisher().role_class(id=role_uuid) if action == 'provision': # Provision/rename role.name = name - role.uuid = uuid + role.uuid = role_uuid role.slug = slug role.emails = emails role.details = details @@ -138,7 +139,12 @@ class CmdHoboNotify(Command): # All roles have been sent if full and action == 'provision': for role in get_publisher().role_class.select(ignore_errors=True): - if role and role.uuid not in uuids: + try: + role_uuid = uuid.UUID(role.uuid) + except ValueError: + role.remove_self() + continue + if role and role_uuid.hex not in uuids: role.remove_self() @classmethod
quelque chose comme ça suffirait pas ?
Mis à jour par Lauréline Guérin il y a environ 3 ans
(si option varchar, changer aussi dans _table_static_fields non ?)
Mis à jour par Frédéric Péters il y a environ 3 ans
- Fichier 0001-sql-switch-role-uuid-column-to-varchar-52156.patch 0001-sql-switch-role-uuid-column-to-varchar-52156.patch ajouté
En effet. (et je penche vraiment pour ça, frileux sur les modifs à l'hobo notify).
Mis à jour par Lauréline Guérin il y a environ 3 ans
- Statut changé de Solution proposée à Solution validée
alors go
Mis à jour par Frédéric Péters il y a environ 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
Voilà c'est en route,
commit 2d0ffd609f9f0d57f5e37be7e25e7f406ea81e87 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Thu Mar 18 10:03:06 2021 +0100 sql: switch role uuid column to varchar (#52156)
Mis à jour par Frédéric Péters il y a environ 3 ans
Alors que j'étais à écrire qu'on pouvait quand même imaginer le switch vers le type uuid plus tard, parce que quand même plus propre; une trace avec n'importe quoi qui me fait penser qu'il y aura à être assez attentif si on veut ça :
Exception: type = '<class 'psycopg2.DataError'>', value = 'invalid input syntax for type uuid: "_a2-hobo-superuser" LINE 3: WHERE uuid = '_a2-hobo-superuser... ^
Mis à jour par Frédéric Péters il y a environ 3 ans
Voilà déployé en recette. (j'ai juste fait un tour rapide et à l'instant ça semble ok).
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
Frédéric Péters a écrit :
Alors que j'étais à écrire qu'on pouvait quand même imaginer le switch vers le type uuid plus tard, parce que quand même plus propre; une trace avec n'importe quoi qui me fait penser qu'il y aura à être assez attentif si on veut ça :
[...]
J'écrivais n'importe quoi, ça vient du code SAML2 et d'une mauvaise utilisation de Role.resolve suite à un mimmac dans l'attribut role-slug transmis par authentic qui a pu contenir un uuid avant mais visiblement contient maintenant un slug.
Encore une bêtise, visiblement hobo configure bien a2 pour envoyer les uuids; donc ça vient plutôt d'une erreur d'import de rôles dans a2. Possible qu'on ait copié le slug dans Role.uuid à un moment vu que la colonne n'est pas typée UUID.
Mis à jour par Frédéric Péters il y a environ 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
sql: switch role uuid column to varchar (#52156)