Projet

Général

Profil

Development #69886

connecteur smsfactor fail cron update_credit_left (KeyError: 'credits')

Ajouté par Sentry Io il y a plus d'un an. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
04 octobre 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

https://sentry.entrouvert.org/entrouvert/gplexpert/issues/95762/

KeyError: 'credits'
  File "passerelle/base/management/commands/cron.py", line 59, in handle
    getattr(connector, frequency)()
  File "passerelle/apps/smsfactor/models.py", line 203, in hourly
    self.update_credit_left()
  File "passerelle/apps/smsfactor/models.py", line 173, in update_credit_left
    self.credit_left = result['credits']

connector "smsfactor.sms-via-sms-factor" error running hourly job

Fichiers

Révisions associées

Révision 78df755c (diff)
Ajouté par A. Berriot il y a plus d'un an

smsfactor: fixed crash when updating credit (#69886)

Historique

#1

Mis à jour par Lauréline Guérin il y a plus d'un an

  • Projet changé de Suivi des traces à Passerelle
  • Sujet changé de KeyError: 'credits' à connecteur smsfactor fail cron update_credit_left (KeyError: 'credits')
#2

Mis à jour par A. Berriot il y a plus d'un an

  • Assigné à mis à A. Berriot
#3

Mis à jour par A. Berriot il y a plus d'un an

#4

Mis à jour par A. Berriot il y a plus d'un an

  • Assigné à changé de A. Berriot à Benjamin Dauvergne

(le problème de fond ici est que le token est pas bon mais mon patch gère ce cas pour éviter un crash côté sentry)

#5

Mis à jour par Valentin Deniaud il y a plus d'un an

  • Statut changé de Solution proposée à Solution validée
  • Assigné à changé de Benjamin Dauvergne à A. Berriot
#6

Mis à jour par Thomas Noël il y a plus d'un an

Agate Berriot a écrit :

(le problème de fond ici est que le token est pas bon

Juste pour parler : ce n'est pas possible de détecter cela au niveau de self.request ?

#7

Mis à jour par A. Berriot il y a plus d'un an

#8

Mis à jour par A. Berriot il y a plus d'un an

Thomas Noël a écrit :

Agate Berriot a écrit :

(le problème de fond ici est que le token est pas bon

Juste pour parler : ce n'est pas possible de détecter cela au niveau de self.request ?

Si carrément, c'est même beaucoup mieux :D

mon second patch fait ça ;)

#11

Mis à jour par A. Berriot il y a plus d'un an

Bon en fait y'avait des erreurs dans les tests un peu moins triviales à gérer (notamment le multi destinataire). Avec un peu de chance ça passe sur jenkins et tout le monde est content.

#12

Mis à jour par Thomas Noël il y a plus d'un an

raise_on_response_error = kwargs.pop('raise_on_response_error', True)

Ajoutons plutôt un explicite raise_on_response_error=True dans la fonction.

Par ailleurs mon expérience avec nos amies les webservices me ferait ajouter une vérification que result est un dictionnaire, avant de faire le result.get('message').

#13

Mis à jour par Valentin Deniaud il y a plus d'un an

Perso je pense qu'il faut revenir en arrière, on a deux endpoints qui ne sont pas homogènes et n'ont pas la même manière d'indiquer une erreur, il ne faut pas chercher à mutualiser le code de gestion d'erreur dans self.request. Là ce code on se retrouve à l'utiliser pour un endpoint et le désactiver pour l'autre, sa place est donc directement dans self.update_credit_left (c'est revenir sur l'idée de Thomas, à voir ce qu'il en dit).

PS : ajouter un test pour couvrir le nouveau code c'est toujours mieux (j'aurais pu dire ça avant de valider tout à l'heure), bonus ça rendrait explicite à la lecture du patch l'erreur qu'on est en train de gérer (« le token est pas bon »).

#14

Mis à jour par Thomas Noël il y a plus d'un an

Valentin Deniaud a écrit :

Perso je pense qu'il faut revenir en arrière, on a deux endpoints qui ne sont pas homogènes et n'ont pas la même manière d'indiquer une erreur, il ne faut pas chercher à mutualiser le code de gestion d'erreur dans self.request. Là ce code on se retrouve à l'utiliser pour un endpoint et le désactiver pour l'autre, sa place est donc directement dans self.update_credit_left (c'est revenir sur l'idée de Thomas, à voir ce qu'il en dit).

Là, comme ça, rien. En fait je ne comprends finalement pas vraiment pourquoi il y a un "raise_on_response_error", dans ma tête self.request devrait toujours planter quand une erreur de token est détectée. Mais si c'est pas possible alors le faire uniquement pour self.update_credit_left oui, pourquoi pas. Mais c'est bizarre non ? (je dois rater un truc, as usual)

#15

Mis à jour par Valentin Deniaud il y a plus d'un an

Thomas Noël a écrit :

Là, comme ça, rien. En fait je ne comprends finalement pas vraiment pourquoi il y a un "raise_on_response_error", dans ma tête self.request devrait toujours planter quand une erreur de token est détectée.

On a 0 garantie que ce soit une erreur de token (message != 'OK' ça couvre toutes les erreurs).
Or il n'y a pas d'endpoint qui permette d'envoyer un SMS à plusieurs destinataires. Donc dans self.send_msg il y a une boucle qui self.request('/send/', un_numéro).
Au cas où une erreur soit retournée pour un numéro et pas pour les autres, le code essaye d'abord tous les numéros, puis remonte les erreurs. Si on ne met pas raise_on_response_error=False, alors on essaye plus tous les numéros, on plante à la première erreur.

(c'est juste un résumé de la situation, je ne sais pas comment bien gérer cette histoire qui peut aboutir à des envois partiels ingérables, mais c'est la faute de l'API et on sort du cadre de ce ticket)

le faire uniquement pour self.update_credit_left oui, pourquoi pas. Mais c'est bizarre non ?

C'est l'API qui est bizarre, j'insiste sur

on a deux endpoints qui ne sont pas homogènes et n'ont pas la même manière d'indiquer une erreur

Car d'un côté /send/ renvoie une clé status en plus de la clé message, de l'autre /credits/ renvoie juste message. (fun fact, quand il n'y a pas d'erreur status vaut 1, on a donc affaire à une API qualité platine)

#16

Mis à jour par Thomas Noël il y a plus d'un an

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

Valentin Deniaud a écrit :

Thomas Noël a écrit :

Là, comme ça, rien. En fait je ne comprends finalement pas vraiment pourquoi il y a un "raise_on_response_error", dans ma tête self.request devrait toujours planter quand une erreur de token est détectée.

On a 0 garantie que ce soit une erreur de token (message != 'OK' ça couvre toutes les erreurs).

J'avoue ici avoir parlé sans savoir, j'imaginais que l'erreur de token était identifiable par un moyen ou un autre (en fait leur API pourrait répondre une 403 mais apparemment c'est effectivement qualité platine).

Sans doute est-il utile donc de faire au plus bête et revenir au patch originel.

Je (re)valide donc ce ticket MAIS pour le patch de la note 3 (qui avait été validé par Valentin).

#17

Mis à jour par A. Berriot il y a plus d'un an

#18

Mis à jour par A. Berriot il y a plus d'un an

  • Statut changé de Solution proposée à Résolu (à déployer)
commit 78df755c131fbac8fc4e43b9181e27319f194976
Author: Agate Berriot <aberriot@entrouvert.com>
Date:   Thu Oct 6 14:47:14 2022 +0200

    smsfactor: fixed crash when updating credit (#69886)
#19

Mis à jour par Transition automatique il y a plus d'un an

  • Statut changé de Résolu (à déployer) à Solution déployée
#20

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF