Project

General

Profile

Bug #43968

IntegrityError: duplicate key value violates unique constraint "authentic2_service_slug_3649567ba6b14a41_uniq"

Added by Sentry Io almost 4 years ago. Updated about 1 year ago.

Status:
Solution proposée
Priority:
Normal
Category:
-
Target version:
-
Start date:
12 June 2020
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

#1

Updated by Lauréline Guérin almost 4 years ago

  • Project changed from Suivi des traces to Hobo
#3

Updated by Benjamin Dauvergne almost 4 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.

#4

Updated by Benjamin Dauvergne over 2 years ago

  • Related to Support #57729: Migration d'instances de Publik : changement de nom de domaine added
#5

Updated by Benjamin Dauvergne over 2 years ago

Ticket aussi utile pour les changements de nom de domaine.

#6

Updated by Emmanuel Cazenave over 2 years ago

  • Assignee set to Emmanuel Cazenave

Quelqu'un pourrait vaguement m'expliquer comment reproduire ?

#7

Updated by Benjamin Dauvergne over 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.

#8

Updated by Emmanuel Cazenave over 1 year ago

  • Related to deleted (Support #57729: Migration d'instances de Publik : changement de nom de domaine)
#9

Updated by Emmanuel Cazenave over 1 year 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.

#10

Updated by Benjamin Dauvergne over 1 year 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.

#11

Updated by Emmanuel Cazenave over 1 year 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.

#12

Updated by Benjamin Dauvergne over 1 year 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

#13

Updated by Robot Gitea about 1 year 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 :

#14

Updated by Benjamin Dauvergne about 1 year 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.

#15

Updated by Robot Gitea about 1 year ago

  • Status changed from En cours to Solution proposée

Also available in: Atom PDF