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.

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
Cliquer ici pour afficher le détail d'une proposition d'implémentation du module

README.md :

1
2
3
# Module tf-module-demo-terratest

TODO

main.tf :

1
# main.tf

variables.tf :

1
# variables.tf

outputs.tf :

1
# outputs.tf
Astuce
Le code produit à cette étape peut être retrouvé ici.

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 :

1
2
3
4
# examples/simple_example/main.tf
module "simple_example" {
  source = "../.."
}

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.

Astuce
Le code produit à cette étape peut être retrouvé ici.

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).

Contenu du fichier 'test/simple_example_test.go'

test/simple_example_test.go :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package test

import (
 "testing"

 "github.com/gruntwork-io/terratest/modules/terraform"
)

func TestSimpleExample(t *testing.T) {
 t.Parallel()

 terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
  TerraformDir: "../examples/simple_example",
 })

 defer terraform.Destroy(t, terraformOptions)

 terraform.InitAndApply(t, terraformOptions)
}

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 commande terraform init puis terraform apply.

Si nous résumons le code ci-dessus, Terratest va jouer les commandes suivantes dans le répertoire ../examples/simple_example :

  1. terraform init ;
  2. terraform apply ;
  3. terraform destroy (y compris si la commande terraform 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 :

1
2
3
4
5
cd test
# Initialisation d'un nouveau module Go
go mod init tf-module-demo-terratest
# Récupération des dépendances de notre module
go mod tidy

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 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
tf-module-demo-terratest
├── examples
│   └── simple_example
│       └── main.tf
├── footer.md
├── header.md
├── main.tf
├── outputs.tf
├── README.md
├── test
│   ├── go.mod
│   ├── go.sum
│   └── simple_example_test.go
└── variables.tf
Astuce
Le code produit à cette étape peut être retrouvé ici.

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 :

1
2
cd test
go test -v -timeout 30m

Le retour devrait alors être :

1
2
3
--- PASS: TestSimpleExample (0.13s)
PASS
ok      tf-module-demo-terratest        0.163s

Notre test Terratest est désormais fonctionnel 🎉.