Projet

Général

Profil

Bug #43968

IntegrityError: duplicate key value violates unique constraint "authentic2_service_slug_3649567ba6b14a41_uniq"

Ajouté par Sentry Io il y a presque 4 ans. Mis à jour il y a environ un an.

Statut:
Solution proposée
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
12 juin 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

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

Historique

#1

Mis à jour par Lauréline Guérin il y a presque 4 ans

  • Projet changé de Suivi des traces à Hobo
#3

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

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

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Lié à Support #57729: Migration d'instances de Publik : changement de nom de domaine ajouté
#5

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Ticket aussi utile pour les changements de nom de domaine.

#6

Mis à jour par Emmanuel Cazenave il y a plus de 2 ans

  • Assigné à mis à Emmanuel Cazenave

Quelqu'un pourrait vaguement m'expliquer comment reproduire ?

#7

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

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

Mis à jour par Emmanuel Cazenave il y a plus d'un an

  • Lié à Support #57729: Migration d'instances de Publik : changement de nom de domaine supprimé
#9

Mis à jour par Emmanuel Cazenave il y a plus d'un an

  • Assigné à Emmanuel Cazenave supprimé

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

Mis à jour par Benjamin Dauvergne il y a plus d'un an

  • Statut changé de Nouveau à 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

Mis à jour par Emmanuel Cazenave il y a plus d'un an

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

Mis à jour par Benjamin Dauvergne il y a plus d'un an

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

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de Information nécessaire à En cours
  • Assigné à mis à Benjamin Dauvergne

Benjamin Dauvergne (bdauvergne) a ouvert une pull request sur Gitea concernant cette demande :

#14

Mis à jour par Benjamin Dauvergne il y a environ un an

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

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de En cours à Solution proposée

Formats disponibles : Atom PDF