Implementare test Terratest end-to-end nei progetti Terraform

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

I test end-to-end (E2E) vengono usati per convalidare il funzionamento di un programma prima di distribuirlo nell'ambiente di produzione. Uno scenario di esempio potrebbe essere un modulo di Terraform che distribuisce due macchine virtuali in una rete virtuale. Si vuole impedire l'esecuzione del ping tra le due macchine virtuali. In questo esempio è possibile definire un test per verificare il risultato previsto prima della distribuzione.

I test end-to-end sono in genere costituiti da un processo in tre passaggi.

  1. Una configurazione viene applicata a un ambiente di test.
  2. Il codice viene eseguito per verificare i risultati.
  3. L'ambiente di test viene reinizializzato o disattivato, ad esempio deallocazione di una macchina virtuale.

In questo articolo vengono illustrate le operazioni seguenti:

  • Informazioni sulle nozioni di base dei test end-to-end con Terratest
  • Informazioni su come scrivere test end-to-end con Golang
  • Informazioni su come usare Azure DevOps per attivare automaticamente test end-to-end quando viene eseguito il commit del codice nel repository

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Linguaggio di programmazione Go: installare Go.

  • Codice e risorse di esempio: usando lo strumento DownGit, scaricare da GitHub il progetto end-to-end-testing e decomprimere in una nuova directory per contenere il codice di esempio. Questa directory viene definita directory di esempio.

2. Comprendere i test end-to-end

I test end-to-end verificano che un sistema funzioni come un insieme collettivo. Questo tipo di test è il contrario del test di moduli specifici. Per i progetti Terraform, il test end-to-end consente di verificare gli elementi che sono stati distribuiti. Questo tipo di test è diverso da molti altri tipi che testano gli scenari di pre-distribuzione. I test end-to-end sono fondamentali per il test di sistemi complessi che includono più moduli e operano su più risorse. In questi scenari il test end-to-end è l'unico modo per determinare se i vari moduli interagiscono correttamente.

Questo articolo illustra l'uso di Terratest per implementare il test end-to-end. Terratest fornisce tutta l'infrastruttura necessaria per eseguire le attività seguenti:

  • Distribuire una configurazione Terraform
  • Consente di scrivere un test usando il linguaggio Go per verificare che cosa è stato distribuito
  • Orchestrare i test in fasi
  • Disinstallare l'infrastruttura distribuita

3. Comprendere l'esempio di test

Per questo articolo viene usato un esempio disponibile nel repository di esempio Azure/terraform.

Questo esempio definisce una configurazione Terraform che distribuisce due macchine virtuali Linux nella stessa rete virtuale. Una macchina virtuale denominata vm-linux-1 ha un indirizzo IP pubblico. È aperta solo la porta 22 per consentire le connessioni SSH. La seconda macchina virtuale, vm-linux-2, non ha un indirizzo IP pubblico definito.

Il test convalida gli scenari seguenti:

  • L'infrastruttura è stata distribuita correttamente
  • Usando la porta 22, è possibile aprire una sessione SSH per vm-linux-1
  • Usando la sessione SSH in vm-linux-1, è possibile effettuare il ping di vm-linux-2

Sample end-to-end test scenario

Se è stato scaricato l'esempio, la configurazione Terraform per questo scenario si trova nel file src/main.tf. Il main.tf file contiene tutti gli elementi necessari per distribuire l'infrastruttura di Azure rappresentata nella figura precedente.

Se non si ha familiarità con la creazione di una macchina virtuale, vedere Creare una macchina virtuale Linux con l'infrastruttura in Azure usando Terraform.

Attenzione

Lo scenario di esempio presentato in questo articolo è esclusivamente a scopo illustrativo. Si tratta di uno scenario estremamente semplice, al fine di mantenere la concentrazione sui passaggi del test end-to-end. Non è consigliabile usare macchine virtuali di produzione che espongono le porte SSH tramite un indirizzo IP pubblico.

4. Esaminare l'esempio di test

Il test end-to-end è scritto nel linguaggio Go e usa il framework Terratest. Se è stato scaricato l'esempio, il test viene definito nel src/test/end2end_test.go file .

Il codice sorgente seguente mostra la struttura standard di un test Golang usando Terratest:

package test

import (
    "testing"

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

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

    fixtureFolder := "../"

    // Use Terratest to deploy the infrastructure
    test_structure.RunTestStage(t, "setup", func() {
        terraformOptions := &terraform.Options{
            // Indicate the directory that contains the Terraform configuration to deploy
            TerraformDir: fixtureFolder,
        }

        // Save options for later test stages
        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)

        // Triggers the terraform init and terraform apply command
        terraform.InitAndApply(t, terraformOptions)
    })

    test_structure.RunTestStage(t, "validate", func() {
        // run validation checks here
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
		    publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
    })

    // When the test is completed, teardown the infrastructure by calling terraform destroy
    test_structure.RunTestStage(t, "teardown", func() {
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
        terraform.Destroy(t, terraformOptions)
    })
}

Come si può notare nel frammento di codice precedente, il test è composto da tre fasi:

  • setup: esegue Terraform per distribuire la configurazione
  • validate': esegue i controlli di convalida e le asserzioni
  • teardown: pulisce l'infrastruttura dopo l'esecuzione del test

Nell'elenco seguente vengono illustrate alcune delle funzioni principali fornite dal framework Terratest:

  • terraform. InitAndApply: abilita l'esecuzione terraform init e terraform apply dal codice Go
  • terraform. Output: recupera il valore della variabile di output della distribuzione.
  • terraform. Eliminazione definitiva: esegue il terraform destroy comando dal codice Go.
  • test_structure. LoadTerraformOptions: carica le opzioni terraform, ad esempio la configurazione e le variabili, dallo stato
  • test_structure. SaveTerraformOptions: salva le opzioni di Terraform, ad esempio la configurazione e le variabili, nello stato

5. Eseguire l'esempio di test

I passaggi seguenti eseguono il test sulla configurazione e sulla distribuzione di esempio.

  1. Aprire una finestra Bash o del terminale.

  2. Accedere all'account Azure.

  3. Per eseguire questo test di esempio, è necessario un nome di coppia di chiavi privata/pubblica SSH id_rsa e id_rsa.pub nella directory principale. Sostituire <your_user_name> con il nome della directory principale.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. All'interno della directory di esempio passare alla src/test directory .

  5. Eseguire il test.

    go test -v ./ -timeout 10m
    

6. Verificare i risultati

Dopo aver eseguito go testcorrettamente , vengono visualizzati risultati simili all'output seguente:

--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok      test    391.052s

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Passaggi successivi