Salut, salut,
Ceci est un long mail pour parler un peu de la nouvelle API qui va
prochainement arriver dans Re2o et des changements qui viennent avec. Je
vous préviens il y a plein d'infos et de détails donc je vous conseille
de vous posez avant de lire ce mail. Bonne lecture !
Commencons par parler de l'API côté server Re2o.
Tout d'abord pour ceux qui ne passent pas leur vie sur #re2o (askip, ça
existe mais je suis pas sûr), je vais décrire où en est actuellement la
situation et les problèmes liés à l'API actuelle:
1) Actuellement,*les endpoints de l'API ont été fait un peu l'arrache*
aux moments et aux endroits où on en avait besoin. Par exemple les
premiers endpoints commencent par "/machines/rest/..." parce que les
premières données nécessaires étaient des infos dans l'app "machines"
puis des endpoints en "/users/rest/..." sont apparus parce qu'on
utilisait des infos dans l'app "users". Bref vous l'aurez compris, les
endpoints ne sont pas a des endroits logiques et un peu difficile à
trouver donc à utiliser (et puis c'est pas parce qu'on avait écrit rest
dans l'url que l'API était REST ...)
2) *Les infos exposées sont celles dont on avait besoin uniquement et
dans un format qui nous arrangeait* donc autant dire que c'est pas
vraiment utilisable pour autre chose. Ce qui fait que si quelqu'un
voudrait dev un script utilisant les infos de Re2o via l'api, bah il
faut commencer par ajouter les endpoints dans Re2o ce qui est sacrément
décourageant.
3) On utilise django-rest-framework pour gérer l'api, sérialiser les
infos, ... (c'est probablement le package le plus courant pour gérer une
api avec Django). Sauf que *les quelques endpoints utilisent vraiment
les trucs les plus basiques et assez salement* parce que ça suffisait et
que personne n'avait fait l'effort d'apprendre comment fonctionnait
django-rest-framework (qui a une courbe d'apprentissage assez violente
il faut le dire).
Bref autant dire que le peu d'api qui existait n'était pas vraiment
utilisable. Je me suis donc lancé dans le projet de refaire l'api et je
vous annonce donc qu'il va bientôt avoir une nouvelle app "api" dans
re2o qui exposera tous les modèles de Re2o de façon REST, systèmatique
et uniforme (ex : des urls en "/api/<model>/<id>" ou encore des
opérations basés sur les méthodes HTTP "GET", "POST", ...). Pour plus de
détails, je vous invite a aller voir la documentation à partir de
https://gitlab.federez.net/federez/re2o/wikis/API/Raw-Usage (puis vous
balader dans la section API du wiki pour plus d'infos). Et oui on a
commencé à écrire de la doc ;).
Pour les détails de l'implémentation, la MR est encore en phase de
review : https://gitlab.federez.net/federez/re2o/merge_requests/172
<https://gitlab.federez.net/federez/re2o/merge_requests/172>
Pour ceux qui craignent de voir leur prod cassée à cause d'un changement
d'API, sachez qu'on essaye de le faire le plus en douceur possible:
1) on ajoute les endpoints dans Re2o (ça c'est la MR et ce que j'ai
décrit au-dessus) SANS supprimer les anciens endpoints.
2) Pendant que les gens pull Re2o avec la nouvelle API, on dev les
script utilisant la nouvelle API
3) Les gens pullent ces scripts utilisant la nouvelle API (génération de
DNS, DHCP, ...)
4) Quand on a la confirmation que plus personne utilise l'ancienne API
(il y a suffisament peu d'instance en prod pour qu'on puisse se
permettre de faire comme ça), on vire l'ancienne API.
Passons maintenant au second sujet, un peu plus récent: le client API.
En effet qui dit "nouvelle API" dit "re2o-tools doit utiliser cette API"
et donc dit aussi "refaire pas mal de choses dans re2o-tools" qui
commencait à présenter plusieurs soucis. Selon moi, il y a en particulier:
1) *Tous les services sont dans le même projet*, ce qui veut dire que si
tu veux ajouter un service qui n'est utilisé que dans ton asso, bah tu
te retrouves à l'ajouter partout (dans ton dns, dans ton dhcp, chez les
autres assos, ...) ce qui a aussi pour conséquence que tu te retrouves
avec des dépendances qui ne font pas de sens. Par exemple actuellement
il faut python3-mongodb pour faire tourner re2o-tools (parce qu'un des
services l'utilise) et honnêtement c'est un peu dommage quand tu veux
juste générer des fichiers de zone DNS.
2) *Le manager est devenu trop complexe*. C'est un truc qui marche bien
mais son code est assez violent pour un projet dont le but c'est de
récupérer quelques infos depuis l'API et de faire trois actions basiques
avec ces infos. Une des idées primaire de ce manager était justement de
pouvoir gérer plusieurs services en même temps (lequels regen, forcer la
regen de certains, ...) mais bon soyons hônnetes, en pratique tout le
monde n'utilise qu'un seul service à la fois. Personne ne fait tourner
en prod un DNS, un DHCP, un server mail et un contrôleur de bornes Wi-Fi
sur la même machine ... En quand bien même quelqu'un voudrait le faire,
ce serait plus simple et plus propre d'avoir plusieurs fois re2o-tools
dans des dossiers séparés. En termes de perf, c'est pareil et tu évites
de mélanger les fichiers et les conf tout en t'assurant que si la
génération d'un service plante, ça ne plante pas les autres. Bref,
virez-moi ce manager overkill.
3) *Le code est parfois dégueulasse*. Faut dire ce qui est, le code
marche mais c'est loin d'être le plus beau. Je parles d'expérience
puisque je vais prendre un example que j'ai écrit. Dans le code pour
générer les fichiers de DNS, il y a une partie pour générer les fichiers
de reverse que j'ai écrite. Bon si on oublie le fait que j'ai appris
plein de trucs en python depuis (notament à moins réinventer la roue),
je reste impressioné de voir que l'algo que j'ai pondu marche nickel
mais je dois bien être le seul puisqu'à chaque fois il me faut 5-10
minutes pour recomprendre les 30 lignes de codes en question. Donc ça
s'appelle un code moche et pas maintenanable quand seul l'auteur le
comprend (et pas sans efforts en plus).
Bref une nouvelle API était l'occasion de revoir en profondeur tous ces
problèmes. Et j'ai donc commencer à faire un POC de ce que ça pouvait
donner. Bien que le résultat ne soit pas terminé, ça marche assez bien.
Les résultats sont dispo à https://gitlab.federez.net/re2o.
By the way vous verrez que cette URL mène à un nouveau groupe que j'ai
commencé sur le gitlab de FedeRez dédié à Re2o (d'où le nom du groupe
^^) parce que je ne trouvais pas normal que je soit "owner" du groupe
FedeRez (dans lequel est Re2o actuellement) sous prétexte que je dev
Re2o. Bon rassurez vous, si je voulais faire une connerie je l'aurais
déjà faite mais bon sur le principe, je trouve pas ça super. Alors
autant profiter de faire des projets from scratch pour commencer ce
nouveau groupe. (j'avais prévenu qu'il y avait plein de nouveauté dans
ce mail).
Pour ce qui est du nouveau fonctionnement des services j'ai écrit un
bout de doc là
(https://gitlab.federez.net/federez/re2o/wikis/API/API-Client) (désolé
pour la piètre qualité du schéma). Le principe est d'abord d'avoir un
client API qui facilite grandement l'utilisation de l'API (gestion de
l'authentification, des URLs, du formats des réponses, ...). Bref
simplifier tout ça. Et surtout proposer un truc que tout le monde peut
utiliser de façon indépendante des autre projets. C'est de là qu'est
venue l'idée d'utiliser une "API en couche". L'idée est d'avoir une
couche facile à utiliser (= le client API dont on parle) mais qui cache
plein de choses (et donc ne permet pas une utilisation ultra pécise) et
si nécessaire, il est toujours possible "d'enlever une couche" et
d'utiliser directement la lib requests de python ou encore l'API REST
avec un autre language que python mais à vous de réimplémenter les trucs
compliqués.
Sur le groupe Re2o, il y a un projet "Re2o API client" qui est donc ce
client API en question. Ce code là est quasi complet, il y a sans doute
des ajustements à faire mais dans l'ensemble il ne bougera pas trop je
pense. Les autres projets sont justement les POC pour remplacer
re2o-tools (DHCP, DNS et ML pour l'instant) en utilisant le client API
comme submodule git (à terme avoir un package python serait encore mieux
mais chaque chose en son temps). Tout d'abord, vous verrez qu'ils sont
dans des projets séparés, ce qui était (toujours selon moi) un problème
de re2o-tools. Vous verrez que les codes de ces projets sont bien plus
simples que ceux de re2o-tools (mais pas commenté, oui je sais). Bien
qu'il n'y ait pas encore tout le sucre qui consiste à vérifier les
fichiers générés sont corrects, la base du script fonctionne et génère
les fichiers. Ils pourraient presque être déjà utilisés en prod. \o/
En résumé, (parce qu'il faut bien un résumé à la fin de ce roman) les
nouveautés sont :
1) Une nouvelle API RESTful qui permet d'accéder à l'ensemble des
données de Re2o
2) Un nouveau client API qui a pour but de simplifier grandement
l'utilisation de la nouvelle API et faire en sorte de ne pas se prendre
la tête pour dev un nouveau service
3) Un nouveau groupe dédié à Re2o sur le gitlab (je suis encore le seul
membre mais il est publique est je propose d'y transférer les gens si
l'idée de ce groupe convient à tout le monde)
4) Je sais pas faire des infos concises et des mails courts (mais ça
c'est pas nouveau) ;)
N'hésitez pas à me faire part de vos avis si ces changements sont bien
ou pas. Perso je suis assez content de la tournure que ça prend et je
trouve la base plus saine mais bon j'ai pas un avis très neutre.
Et enfin pour ceux qui ont lus jusque là, sachez que la version 2.7 se
rapproche à grand pas et ne devrait plus trop tarder à être annoncée.
Voilà merci de votre attention,
Bon baisers de Russie d'Allemagne
Maël "MoaMoaK" Kervella