Test: values section in Test YAML not applied to context.values during template generation #19
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Description
La section
values:d'un fichierTest(kind: Test) n'est pas appliquée àcontext.values.*(ni àvalues.*dans les templates Handlebars) lors de l'exécution des tests déclaratifs. Le moteur utilise systématiquement les valeurs par défaut définies danspackage.yaml, quelle que soit la surcharge déclarée dans le fichier de test.Reproduction minimale
Package (
package.yaml)Template (
others/ConfigMap_envs.yaml.hbs)Script Rhai (
scripts/context_extra.rhai)Test (
tests/full.yaml)Résultat observé
La valeur générée est
""(le défaut depackage.yaml), pas"repos,issues,pull_requests".Même comportement via
context.values.*dans Rhai :context.values.github_urlretourne"https://github.example.com"(défaut du package), pas la valeur surchargée dans le test.Résultat attendu
Le test doit générer le template avec les valeurs déclarées dans
values:, de la même façon qu'une instance déployée avec ces options.Environnement
vynil-agent:0.7.5(imagedocker.io/sebt3/vynil-agent:0.7.5)make <pkg> template,make <pkg> test,make <pkg> lintImpact
Les fichiers
Testavec plusieurs scénarios (default.yaml,full.yaml,ha-*.yaml,sso-*.yaml) ne peuvent pas tester le comportement du package avec des options différentes des défauts. Seules les valeurs par défaut sont couvertes, quelle que soit la surcharge dans le test. Cela rend les scénarios de testfull/ha/ssopeu utiles pour valider les options spécifiques à ces scénarios.Analyse et plan de correction
Cause racine
Le bug est double — une clé YAML inexistante + un bug dans le script Rhai.
1. Le YAML de test utilise
values:au niveau racine — clé inexistanteLe struct
VynilTest(agent/src/testing/vyniltest.rs) ne déclare pas de champvalues:au niveau racine. Serde ignore silencieusement les clés inconnues : la sectionvalues:du fichier de test est donc jetée à la désérialisation.La clé correcte est
instance.options:, qui existe déjà dansVynilTestInstance:Le YAML du test devrait être :
Pourquoi
instance.options:fonctionne déjà pourmake testLa chaîne complète est câblée :
get_templated_test()(handler.rs ~381) littest.instance.optionset l'injecte dansspec.optionsdu mock K8s (TenantInstance/SystemInstance/ServiceInstance).get_tenant_instance(ns, name)→ retrouve ce mock avecspec.optionsrenseigné.ctx::run(instance, args)→build_context.rhai::run()→get_values(instance.spec.options, defaults)→ les valeurs surchargées sont utilisées. ✓2.
build_context.rhai::template()ignoreinstance.spec.options— bug réel pourmake templateLa fonction
template()(utilisée parmake <pkg> template) passe une map vide ligne 288 :Alors que la fonction
run()(chemin de test) fait correctement :Ce bug affecte
make templateetmake lintmais pasmake test(qui passe parrun()).Plan de correction
Étape 1 — Documenter
instance.options:(priorité haute)Mettre à jour
docs/tooling/test.mdavec un exemple complet montrantinstance.options:et son effet surcontext.values/ les templates :Préciser que :
instance.options:équivaut àspec.optionsd'une instance K8s réelle.package.yamlviaget_values().context.values.toolsetsdans les scripts Rhai et{{values.toolsets}}dans les templates reflètent bien les valeurs surchargées.Étape 2 — Corriger
build_context.rhai::template()(TDD)Écrire d'abord un test qui échoue :
make <pkg> templateavecinstance.options:→ la sortie doit contenir la valeur surchargée.Puis corriger ligne 288 :
Étape 3 — Supprimer le code mort dans
run_test_inner()Les lignes 554-568 de
handler.rsconstruisent uninstance_jsonqui n'est jamais transmis à Rhai (lerhai.set_dynamicest commenté ligne 569). Ce bloc peut être supprimé.Fichiers impactés
docs/tooling/test.mdinstance.options:et explication du mapping verscontext.valuesagent/scripts/lib/build_context.rhaitemplate(): passerinstance.spec.optionsau lieu de#{}agent/src/testing/handler.rsinstance_jsonmort (lignes 554-568) + tests unitairesClarification — commandes exactes de reproduction
Ce que fait
make <pkg> templatemake templateest un alias pourtemplateGen, qui exécute en réalitépackage testavecTEMPLATE_OUTPUT_FILENAMEen plus :La seule différence est la présence de
TEMPLATE_OUTPUT_FILENAME, qui déclenche la génération du fichier YAML de sortie et le code pathtemplate()au lieu derun()dansbuild_context.rhai.Précision sur la section
values:au niveau racinevalues:au niveau racine n'est pas la bonne clé — ce n'est pas un bug du tester, c'est une erreur d'utilisation. La clé correcte estinstance.options:, qui est correctement injectée dansspec.optionsdu mock K8s et donc danscontext.values.*.Une fois les fichiers de test corrigés avec
instance.options:,make testfonctionne correctement et les valeurs surchargées sont bien appliquées.Le seul vrai bug —
TEMPLATE_OUTPUT_FILENAMEforcetemplate()qui ignoreinstance.spec.optionsmake template/make lint/make lintkydah/make kubelinterpassent tous partemplateGen(doncTEMPLATE_OUTPUT_FILENAME), et génèrent toujours le YAML avec les valeurs par défaut, quelles que soient lesinstance.options:du test.Complément — correction sur le chemin
template()vsrun()Correction du commentaire #7445
Le commentaire précédent affirme que
TEMPLATE_OUTPUT_FILENAMEdéclenche le code pathtemplate()dansbuild_context.rhai. Ce n'est pas ce que fait le code.Dans
agent/src/package/test.rs(lignes 137-141),TEMPLATE_OUTPUT_FILENAMEcause uniquement la sérialisation des objets déjà créés vers un fichier YAML — après l'exécution du test. Il ne change pas le code Rhai exécuté :run_test_inner()appelle toujoursctx::run(instance, args), queTEMPLATE_OUTPUT_FILENAMEsoit présent ou non.Qui appelle vraiment
ctx::template()?tenant/context.rhai::template()(qui appellebuild::template()avec#{}) est invoqué par les commandes de déploiement réel de l'opérateur :agent/src/template/tenant.rs→ctx::template(instance, args)agent/src/template/system.rs→ctx::template(instance, args)agent/src/template/service.rs→ctx::template(instance, args)Ces commandes s'exécutent dans le cluster lors du cycle de vie d'une instance (réconciliation par l'opérateur). Elles ne sont pas appelées par
make testnimake template.Chaîne réelle pour
make testetmake templateLes deux passent par
package test→run_test_inner():Conséquences sur le plan de correction
make test/make templateavecinstance.options:bien renseignémake testavecvalues:au niveau racine (YAML de l'issue)build::template()passe#{}àget_values(), les options de l'instance sont ignoréesLa priorité est donc :
instance.options:+ documenter (pas de changement de code).build_context.rhai::template()ligne 288 :get_values(#{}, defaults)→get_values(instance.spec.options, defaults). Ce bug affecte le rendu réel des templates en production.instance_jsonmort dansrun_test_inner()(lignes 554-568, jamais transmis à Rhai car la lignerhai.set_dynamicest commentée).Correction — contexte sur les fonctions
template()dans les context.rhaiPrécision importante qui change le plan : les fonctions
template()danstenant/context.rhai,system/context.rhaietservice/context.rhaisont l'héritage d'une première implémentation prototype des tests. L'objectif actuel est d'utiliser exclusivement le générateur via le chemin de test (run()).Cela invalide le point "bug opérateur" mentionné dans le commentaire précédent. Le bug dans
build_context.rhai::template()(qui passe#{}àget_values()) n'est pas à corriger — c'est du code hérité qui n'est plus le chemin cible.Plan de correction révisé (simplifié)
Il ne reste que deux actions :
1. Corriger les fichiers de test — utiliser
instance.options:(pas de changement de code)Le chemin
run_test_inner()→ctx::run()→build::run()→get_values(instance.spec.options, defaults)est déjà câblé et fonctionnel.2. Documenter
instance.options:dansdocs/tooling/test.mdAjouter un exemple complet avec
instance.options:et préciser :spec.optionsd'une instance K8s réelle ;{{values.<clé>}}et dans les scripts Rhai viacontext.values.<clé>.3. (Bonus — nettoyage) Supprimer le bloc
instance_jsonmort dansrun_test_inner()(handler.rslignes 554-568) dont lerhai.set_dynamicest commenté.