Bug #43968
IntegrityError: duplicate key value violates unique constraint "authentic2_service_slug_3649567ba6b14a41_uniq"
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/2708/
IntegrityError: duplicate key value violates unique constraint "authentic2_service_slug_3649567ba6b14a41_uniq" DETAIL: Key (slug, ou_id)=(agendas, 1) already exists. (13 additional frame(s) were not displayed) ... File "django/db/models/base.py", line 905, in _save_table forced_update) File "django/db/models/base.py", line 955, in _do_update return filtered._update(values) > 0 File "django/db/models/query.py", line 667, in _update return query.get_compiler(self.db).execute_sql(CURSOR) File "django/db/models/sql/compiler.py", line 1204, in execute_sql cursor = super(SQLUpdateCompiler, self).execute_sql(result_type) File "django/db/models/sql/compiler.py", line 899, in execute_sql raise original_exception
History
Updated by Benjamin Dauvergne over 3 years ago
Actuellement les services sont cherchés/créés sur la base de leur entity_id SAML (Well-known URL des métadonnées) :
provider, service_created = \ LibertyProvider.objects.get_or_create( entity_id=sp_url, protocol_conformance=lasso.PROTOCOL_SAML_2_0)
alors que la clé de l'objet service c'est le couple (slug, ou_id), ce serait peut-être une meilleure idée de changer cela pour :
provider, service_created = LibertyProvider.objects.get_or_create(ou=ou, slug=service['slug'])
on y gagne pas le deprovisionning des services qu'on ne gère toujours pas mais au moins sur un changement de domaine sans changement de slug (ou suppression recréation avec même slug) on n'aura plus de collision.
Pour le problème sur Fondettes ça semble déjà réglé manuellement.
Updated by Benjamin Dauvergne almost 2 years ago
- Related to Support #57729: Migration d'instances de Publik : changement de nom de domaine added
Updated by Benjamin Dauvergne almost 2 years ago
Ticket aussi utile pour les changements de nom de domaine.
Updated by Emmanuel Cazenave almost 2 years ago
- Assignee set to Emmanuel Cazenave
Quelqu'un pourrait vaguement m'expliquer comment reproduire ?
Updated by Benjamin Dauvergne almost 2 years ago
Alors oui, il suffit de simuler (il y a dés des tests comme ça, juste reprendre la fixture) un hobo.json de le déployer puis de modifier la ou les URLs des services (la clé saml-sp-metadata-url) et de relancer un déploiement. L'exception IntegrityError devrait être levée.
Updated by Emmanuel Cazenave 12 months ago
- Related to deleted (Support #57729: Migration d'instances de Publik : changement de nom de domaine)
Updated by Emmanuel Cazenave 12 months ago
- Assignee deleted (
Emmanuel Cazenave)
Je vire le lien avec #57729, parce qu'en suivant https://dev.entrouvert.org/projects/prod-eo/wiki/HowDoWeDoPublikDomainNameChangeSurLeSaas on ne tombe pas sur ce bug.
Ce ticket demande donc une procédure réaliste pour être reproduit, ou peut-être un rejet pur et simple.
Updated by Benjamin Dauvergne 12 months ago
- Status changed from Nouveau to Information nécessaire
La trace n'existe plus mais je vois bien le problème, mais ça semble corriger par le jeu avec legacy_urls qui n'existait pas je pense quand on a ouvert le ticket :
for legacy_urls in service.get('legacy_urls', []): try: provider = LibertyProvider.objects.get( entity_id=legacy_urls['saml-sp-metadata-url'], protocol_conformance=lasso.PROTOCOL_SAML_2_0, ) provider.entity_id = sp_url break except LibertyProvider.DoesNotExist: pass
Je ne trouve pas ça super propre mais ça semble marcher. On recherche d'abord le provider via les anciennes URLs de leurs métadonnées, donc on finit par tomber sur le bon au lieu de créer un doublon. Mais ça devrait être un get pas un get_or_create, et finalement un get_or_create avec l'URL finale, ça là fait un peu acrobate qui retombe finalement sur ses pieds.
Si on veut du propre je peux proposer quelque chose, sinon on peut rester sur ce code obscure pour 90% des gens.
Updated by Emmanuel Cazenave 12 months ago
Benjamin Dauvergne a écrit :
legacy_urls qui n'existait pas je pense quand on a ouvert le ticket
Oui legacy_urls arrivés après.
Si on veut du propre je peux proposer quelque chose
Non mais oh, il est propre mon code, lavé avec Mirlaine.
sinon on peut rester sur ce code obscure pour 90% des gens.
Je suis d'avis de pas toucher à un truc qui marche, je peux ajouter des commentaires si tu veux.
Updated by Benjamin Dauvergne 12 months ago
Emmanuel Cazenave a écrit :
sinon on peut rester sur ce code obscure pour 90% des gens.
Je suis d'avis de pas toucher à un truc qui marche, je peux ajouter des commentaires si tu veux.
Pourquoi pas un commentaire mais on pourrait tout de même simplifier sans trop s'éloigner du code actuel qui "marche" :
# lookup with current and old SAML EntityID
entity_ids = service.get('legacy_urls', []) + [sp_url]
provider, service_created = LibertyProvider.objects.filter(entity_id__in=entity_ids).get_or_create(protocol_conformance=lasso.PROTOCOLE_SAML_2_0, defaults={'entity_id': sp_url})
if provider.entity_id != sp_url:
# update entity_id if domain name is modified
provider.entity_id = sp_url
Updated by Robot Gitea 6 months ago
- Status changed from Information nécessaire to En cours
- Assignee set to Benjamin Dauvergne
Benjamin Dauvergne (bdauvergne) a ouvert une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/hobo/pulls/37
- Titre : WIP: wip/43968-IntegrityError-duplicate-key-val
- Modifications : https://git.entrouvert.org/entrouvert/hobo/pulls/37/files
Updated by Benjamin Dauvergne 6 months ago
Voilà j'ai changé assez peu le code dans sa forme, mais j'ai ajouté des logs et des commentaires pour le rendre un peu plus clair.