Série Terraform-Terratest - Initialisation d'un module Terraform (2/4)
Initialisation d'un module vierge
Dans cet article, nous allons créer un template prêt à l’emploi pour un module Terraform avec Terratest.
L’objectif est que cette enveloppe soit réutilisable pour les autres modules en dehors de notre cas d’usage.
1 Initialisation d’un module Terraform vierge
Conformément aux spécifications définies dans l’article précédent, nous allons donc créer un projet tf-module-demo-terratest
.
Pour l’initialisation de ce projet, nous allons suivre la structure standard des modules Terraform et créer les fichiers suivants :
README.md
main.tf
variables.tf
outputs.tf
README.md
:
|
|
main.tf
:
|
|
variables.tf
:
|
|
outputs.tf
:
|
|
2 Création d’un premier sample
Maintenant que notre module Terraform est initialisé, nous allons procéder à la création de notre premier sample. C’est ce fichier d’exemple qui sera utilisé pour valider le bon fonctionnement de notre module.
Voici un exemple de fichier sample examples/simple_example/main.tf
:
|
|
L’utilisation d’une source locale (source = "../.."
) est importante ! En effet, rappelons que l’objectif ici est de préparer un cas de test qui permet de s’assurer que le code “courant” du module est fonctionnel et qu’il répond toujours aux mêmes spécifications et exigences.
Ainsi, lorsque je développerai une nouvelle fonctionnalité pour ce module, c’est le code sur lequel je travaille qui doit être testé. Si j’avais spécifié un tag ou une version, ce sont ces derniers qui auraient été testés et pas mon développement en cours.
3 Implémentation de notre module Go de test Terratest
Nous avons développé un module Terraform et ainsi qu’un fichier d’exemple pour l’instanciation de ce module. Nous allons donc maintenant procéder à la rédaction du module Terratest qui nous permettra de tester cet exemple.
Pour cela, nous allons créer le fichier test/simple_example_test.go
(à noter que l’utilisation du suffixe _test.go
est obligatoire pour la prise en compte par Terratest).
test/simple_example_test.go
:
|
|
Rentrons un peu dans le détail du code :
package test
: Nom du package Go.import ([...])
: Import de librairies nécessaires pour notre test.func TestSimpleExample(t *testing.T) {[...]}
: Définition de notre fonction de test (le nom de la fonction doit être unique au sein de votre module Terraform).t.Parallel()
: Permet l’exécution des tests en parallèle.terraformOptions := terraform.WithDefaultRetryableErrors [...]
: Construction des options Terraform avec une gestion des erreurs standards.TerraformDir: "../examples/simple_example",
: Chemin relatif vers notre sample.defer terraform.Destroy(t, terraformOptions)
: Permet la suppression des ressources à la fin du test.terraform.InitAndApply(t, terraformOptions)
: Exécution de la commandeterraform init
puisterraform apply
.
Si nous résumons le code ci-dessus, Terratest va jouer les commandes suivantes dans le répertoire ../examples/simple_example
:
terraform init
;terraform apply
;terraform destroy
(y compris si la commandeterraform apply
précédente échoue).
Pour finaliser l’implémentation de notre module Terratest, il est nécessaire de procéder à la génération de ces dépendances :
|
|
Ces lignes de commandes vont alors générer deux fichiers go.mod
et go.sum
. Le premier sert à définir les dépendances de notre module Terratest tandis que le second sert à figer les hashs des versions utilisées.
Nous avons maintenant un module Terraform disposant d’un test avec Terratest :
|
|
4 Validation de notre module avec Terratest
Nous allons pouvoir maintenant procéder à la validation de notre module Terraform, de notre module Terratest et de notre sample.
Pour cela, il suffit d’exécuter la commande suivante :
|
|
Le retour devrait alors être :
|
|
Notre test Terratest est désormais fonctionnel 🎉.