Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajout validateur GBFS à la multi-validation #2554

Merged
merged 10 commits into from
Aug 23, 2022

Conversation

AntoineAugusti
Copy link
Member

@AntoineAugusti AntoineAugusti commented Jul 28, 2022

En lien avec #2390 #2555

Cette PR ajoute la validation GBFS au processus de multi-validation.

Elle comporte :

  • l'ajout du validateur dans transport
  • un job de dispatch pour toutes les ressources GBFS, et pour effectuer et enregistrer une multi-validation pour une ressource GBFS
  • une exécution automatique quotidienne
  • les tests associés

Ce qui manque :

  • brancher le web sur la multi-validation pour le GBFS
  • supprimer l'ancienne classe de validation
  • utiliser les métadonnées dans resource_metadata

Je découpe ainsi pour ne pas avoir trop de code et pour avoir un peu d'historique à disposition en base de données.

@AntoineAugusti AntoineAugusti marked this pull request as ready for review August 14, 2022 12:33
@AntoineAugusti AntoineAugusti requested a review from a team as a code owner August 14, 2022 12:33
Copy link
Contributor

@thbar thbar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai fait une première passe "ultra rapide" à l'instant.

Est-ce que tu sais si le validateur hébergé est effectivement proche de master (cf discussion sur MobilityData/gbfs-validator#77), car il y aurait un auto-deploy par exemple ?

Je suis toujours méfiant de stocker une info de ce type si elle n'est pas garantie, car ça peut faire perdre pas mal de temps derrière.

Cela étant dit j'irai reviewer plus en détail et faire tourner en local pour prendre la main sur le sujet, et je reviens vers toi ! (sauf si Francis l'a fait avant, vu que je vais être en congés par tranches).

Beau boulot par ailleurs et par avance, c'est cool de voir la multi-validation se déployer sur davantage de formats !

@AntoineAugusti
Copy link
Member Author

@thbar Je suis quasiment certain que gbfs-validator est déployé automatiquement sur master avec Netlify ! J'ai fait quelques PRs là-bas et ça passait en production en quelques minutes. C'était il y a quelques mois mais je ne pense pas que ceci ait changé. Je vais demander pour vérification.

@PierrickP
Copy link

Bonjour @AntoineAugusti @thbar , je vous confirme que gbfs-validator est déployé automatique au commit sur master (ca utilise Netlify)
On doit pouvoir rajouter le sha du commit git à la réponse d'API.

Pour que je comprenne bien, quelle serait l'usage pour vous de cette information ?

@thbar
Copy link
Contributor

thbar commented Aug 18, 2022

Hello @PierrickP! Merci pour pour la confirmation!

Pour que je comprenne bien, quelle serait l'usage pour vous de cette information ?

Cela permet de noter la version précise du validateur contre lequel un rapport de validation aura été calculé, dans le but par exemple de pouvoir reproduire localement un rapport avec la bonne version du validateur, quand on débuggue quelque chose.

Copy link
Contributor

@thbar thbar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai pu faire tourner le code en local comme suit:

[resource_id] = Transport.Jobs.GBFSMultiValidationDispatcherJob.relevant_resources()
|> Enum.drop(3)
|> Enum.take(1)

Transport.Jobs.GBFSMultiValidationJob.perform(%Oban.Job{args: %{"resource_id" => resource_id}})

J'ai eu des résultats au début négatifs, je partage mes copies d'écran:
CleanShot 2022-08-19 at 15 54 33@2x

CleanShot 2022-08-19 at 15 54 04@2x

CleanShot 2022-08-19 at 15 54 11@2x

Du coup je me suis demandé:

  1. pourquoi on a ces erreurs
  2. est-ce lié au statut "hébergé" du validateur
  3. comment les reproduire en local pour comprendre

J'ai vu passer les discussions suivantes:

Avec notamment:

The validator is currently hosted on my personnal Netlify (free plan, limited to 125k requests/month) account and we are in the way to transfer it to MobilityData.

J'ai pu reproduire au final les erreurs:

❯ node cli.js "https://gateway.prod.zoov.io/gbfs/2.2/bordeaux/en/station_information.json?key=NGFlMjU3MDUtNDk5My00MTM4LTk1ZjctNmNlNDM1MWQ0NjE1"
/Users/thbar/git/transport/gbfs-validator/gbfs-validator/gbfs.js:314
          this.autoDiscovery.data[key[0]].feeds.find(f => f.name === type)
                                                ^

TypeError: Cannot read properties of undefined (reading 'find')
    at /Users/thbar/git/transport/gbfs-validator/gbfs-validator/gbfs.js:314:49
    at Array.map (<anonymous>)
    at GBFS.getFile (/Users/thbar/git/transport/gbfs-validator/gbfs-validator/gbfs.js:311:60)
    at /Users/thbar/git/transport/gbfs-validator/gbfs-validator/gbfs.js:437:27
    at Array.map (<anonymous>)
    at GBFS.validation (/Users/thbar/git/transport/gbfs-validator/gbfs-validator/gbfs.js:437:13)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

Plus important: celle qui donne un timeout marche en local, qui est probablement lié à Netlify.

Conclusion: j'approuve en l'état, ça me semble bon ! Toutefois je recommande qu'on surveille ce qui se passe, et qu'on passe en CLI si on constate trop de soucis.

@PierrickP
Copy link

@thbar Pour Vélib, ils bloquent les ips de datacenter (avec cloudflare). Mis à part faire en local ou utiliser des proxies, pas de solution

Pour Zoov: (attention à la key, c'est peut-etre personnel ?), si l'on passe l'url du gbfs.json et non station_information.json, la validation est bonne.
Je vais faire une issue pour mieux detecter une url "invalide"

@AntoineAugusti
Copy link
Member Author

@PierrickP Faut qu'on regarde si un tel filtrage n'est pas contraire à la loi 😉

@AntoineAugusti
Copy link
Member Author

@PierrickP La clé est bien publique ici

@AntoineAugusti
Copy link
Member Author

@etalab/transport-tech Dans mon dernier commit 49f5551, j'ai remplacé le code utilisé pour avoir la version du validateur GBFS en utilisant l'API GitHub par du code lisant cette information dans le rapport d'erreur du validateur GBFS.

MobilityData/gbfs-validator#78 n'est pas encore passée en prod, il faut attendre un peu.

@fchabouis tu me diras si tu veux relire avant que je merge (ou pas !)

@behaviour Transport.Validators.Validator

@impl Transport.Validators.Validator
def validate_and_save(%DB.Resource{url: url, format: "gbfs", id: resource_id}) do
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prend une ressource en param et non une ResourceHistory car les ressources GBFS ne sont pas historisées (car c'est du temps réel).


@impl Transport.Validators.Validator
def validate_and_save(%DB.Resource{url: url, format: "gbfs", id: resource_id}) do
result = GBFSMetadata.compute_feed_metadata(url, "https://#{Application.fetch_env!(:transport, :domain_name)}")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça prend l'adresse du site web pour déterminer si le PAN est autorisé via CORS. À voir si c'est vraiment utile ou si en réalité on l'utilise pas, c'est dans la classe existante.

Comment on lines +28 to +29
Transport.Shared.GBFSMetadata.Mock
|> expect(:compute_feed_metadata, fn ^url, "https://transport.data.gouv.fr" ->
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On pourrait peut-être simplifier les tests, là c'est du copié collé dans le test du job par rapport au test du validateur.

Peut-être lors de la suppression de la classe de validation dans shared en mettant un behaviour ?

} = DB.MultiValidation |> DB.Repo.one!() |> DB.Repo.preload(:metadata)
end

defp setup_validator_version_mocks(default_branch \\ "master", sha \\ Ecto.UUID.generate()) do
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même remarque qu'avant, j'ai repris les tests du validateur.

@@ -98,6 +98,7 @@ oban_crontab_all_envs =
{"30 */6 * * *", Transport.Jobs.BNLCToGeoData},
{"15 10 * * *", Transport.Jobs.DatabaseBackupReplicationJob},
{"0 7 * * *", Transport.Jobs.GTFSRTMultiValidationDispatcherJob},
{"30 7 * * *", Transport.Jobs.GBFSMultiValidationDispatcherJob},
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

30mn plus tard que la validation GTFS-RT. Dites-moi ce que vous en pensez en terme de fréquence.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je pense qu'on va adapter par la suite si la cette fréquence pose problème.

@AntoineAugusti
Copy link
Member Author

gosh, j'avais pas posté tous mes commentaires en attente 😅 désolé @thbar

@AntoineAugusti
Copy link
Member Author

PR ajoutant la version du validateur mergée ! On peut passer ça en prod quand on veut.

@fchabouis
Copy link
Contributor

je vais essayer de relire dans l'aprem, on peut merger ce soir ?

@AntoineAugusti
Copy link
Member Author

Sans problème, j'attends :)

@fchabouis
Copy link
Contributor

tout bon pour moi !

@AntoineAugusti AntoineAugusti merged commit d952571 into master Aug 23, 2022
@AntoineAugusti AntoineAugusti deleted the transport_gbfs_validator branch August 23, 2022 07:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants