Projet

Général

Profil

Bug #52156

Recette: échec de la migration des Rôles en SQL

Ajouté par Lauréline Guérin il y a environ 3 ans. Mis à jour il y a environ 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
18 mars 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à w.c.s. - Development #51772: Migrer les Rôles en SQLFermé08 mars 2021

Actions

Révisions associées

Révision 2d0ffd60 (diff)
Ajouté par Frédéric Péters il y a environ 3 ans

sql: switch role uuid column to varchar (#52156)

Historique

#1

Mis à jour par Lauréline Guérin il y a environ 3 ans

#2

Mis à jour par Lauréline Guérin il y a environ 3 ans

  • Description mis à jour (diff)
#3

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
#4

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

#5

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.

#6

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 ?

#7

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.

#8

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'}
#9

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.

#10

Mis à jour par Lauréline Guérin il y a environ 3 ans

tu fais une correction ou je fais ?

#11

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.

#12

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

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.

#13

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 ?

#14

Mis à jour par Lauréline Guérin il y a environ 3 ans

(si option varchar, changer aussi dans _table_static_fields non ?)

#15

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

En effet. (et je penche vraiment pour ça, frileux sur les modifs à l'hobo notify).

#16

Mis à jour par Lauréline Guérin il y a environ 3 ans

  • Statut changé de Solution proposée à Solution validée

alors go

#17

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)
#18

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...
                                                 ^
#19

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

#20

Mis à jour par Lauréline Guérin il y a environ 3 ans

merci !

#21

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.

#22

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

Formats disponibles : Atom PDF