Prova d'infraestructura com a codi amb Pulumi. Part 2

Hola a tots. Avui compartim amb vosaltres la part final de l'article. "Prova de la infraestructura com a codi amb Pulumi", la traducció del qual s'ha elaborat específicament per als estudiants del curs "Pràctiques i eines de DevOps".

Prova d'infraestructura com a codi amb Pulumi. Part 2

Proves de desplegament

Aquest estil de prova és un enfocament potent i ens permet realitzar proves de caixa blanca per provar el funcionament intern del nostre codi d'infraestructura. Tanmateix, limita una mica el que podem provar. Les proves es realitzen en funció del pla de desplegament en memòria creat per Pulumi abans del desplegament real i, per tant, el desplegament en si no es pot provar. Per a aquests casos, Pulumi té un marc de prova d'integració. I aquests dos enfocaments funcionen molt bé junts!

El marc de proves d'integració de Pulumi està escrit a Go, que és com provem la major part del nostre codi intern. Tot i que l'enfocament de les proves unitàries comentat anteriorment s'assemblava més a les proves de caixa blanca, les proves d'integració són una caixa negra. (També hi ha opcions per a proves internes rigoroses.) Aquest marc es va crear per prendre un programa Pulumi complet i realitzar-hi diverses operacions de cicle de vida, com ara desplegar una nova pila des de zero, actualitzar-la amb variacions i suprimir-la, possiblement diverses vegades. . Les fem amb regularitat (per exemple, a la nit) i com a proves d'esforç.

(Nosaltres hi estem treballant, de manera que les capacitats de prova d'integració similars estiguin disponibles a l'SDK natiu dels idiomes. Podeu utilitzar el marc de proves d'integració de Go independentment de l'idioma en què estigui escrit el vostre programa Pulumi).

En executar el programa amb aquest marc, podeu comprovar el següent:

  • El codi del vostre projecte és sintàcticament correcte i s'executa sense errors.
  • La configuració de la pila i els secrets funcionen i s'interpreten correctament.
  • El vostre projecte es pot implementar amb èxit al proveïdor de núvol que escolliu.
  • El vostre projecte es pot actualitzar amb èxit des de l'estat inicial a N altres estats.
  • El vostre projecte es pot destruir i eliminar amb èxit del vostre proveïdor de núvol.

Com veurem aviat, aquest marc també es pot utilitzar per realitzar la validació en temps d'execució.

Prova d'integració senzilla

Per veure això en acció, mirarem el repositori pulumi/examples, ja que el nostre equip i la comunitat Pulumi l'utilitzen per provar les nostres pròpies sol·licituds d'extracció, commits i compilacions nocturnes.

A continuació es mostra una prova simplificada de la nostra exemple que proporciona el cub S3 i alguns altres objectes:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

Aquesta prova passa pel cicle de vida bàsic de crear, modificar i destruir una pila per a una carpeta aws-js-s3-folder. Trigarà aproximadament un minut a informar d'una prova aprovada:

$ go test .
PASS
ok      ... 43.993s

Hi ha moltes opcions per personalitzar el comportament d'aquestes proves. Consulteu la llista completa d'opcions. en l'estructura ProgramTestOptions. Per exemple, podeu configurar el punt final de Jaeger per rastrejar (Tracing), indiqueu que espereu que la prova falli si la prova és negativa (ExpectFailure), apliqueu una sèrie d'"edicions" al programa per a una transició seqüencial d'estats (EditDirs) i molt més. Vegem com utilitzar-los per provar el desplegament de la vostra aplicació.

Comprovació de les propietats dels recursos

La integració comentada anteriorment garanteix que el nostre programa "funciona"; no es bloqueja. Però, què passa si volem comprovar les propietats de la pila resultant? Per exemple, que determinats tipus de recursos s'han subministrat (o no) i que tenen determinats atributs.

Paràmetre ExtraRuntimeValidation per ProgramTestOptions ens permet veure l'estat posterior al desplegament registrat per Pulumi perquè puguem fer comprovacions addicionals. Això inclou una instantània completa de l'estat de la pila resultant, inclosa la configuració, els valors de sortida exportats, tots els recursos i els seus valors de propietat i totes les dependències entre recursos.

Per veure un exemple bàsic d'això, comprovem que el nostre programa en crea un Cubell S3:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
        },
    })

Ara, quan executem la prova de go, no només passarà per una bateria de proves de cicle de vida, sinó que també, després de desplegar la pila amb èxit, realitzarà una comprovació addicional de l'estat resultant.

Proves d'execució

Fins ara, totes les proves han estat només sobre el comportament de desplegament i el model de recursos Pulumi. Què passa si voleu verificar que la vostra infraestructura subministrada funciona realment? Per exemple, que la màquina virtual s'està executant, el cub S3 conté el que esperem, i així successivament.

Potser ja heu endevinat com fer-ho: opció ExtraRuntimeValidation per ProgramTestOptions - Aquesta és una gran oportunitat per a això. En aquest punt, executeu una prova Go personalitzada amb accés a l'estat complet dels recursos del vostre programa. Aquest estat inclou informació com ara les adreces IP de les màquines virtuals, els URL i tot el necessari per interactuar realment amb les aplicacions i la infraestructura del núvol resultants.

Per exemple, el nostre programa de prova exporta la propietat webEndpoint va trucar websiteUrl, que és l'URL complet on podem obtenir la configuració index document. Tot i que podríem investigar el fitxer d'estat per trobar-lo bucket i llegiu aquesta propietat directament, però en molts casos les nostres piles exporten propietats útils com aquesta que considerem convenient utilitzar per comprovar:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            url := "http://" + stack.Outputs["websiteUrl"].(string)
            resp, err := http.Get(url)
            if !assert.NoError(t, err) {
                return
            }
            if !assert.Equal(t, 200, resp.StatusCode) {
                return
            }
            defer resp.Body.Close()
            body, err := ioutil.ReadAll(resp.Body)
            if !assert.NoError(t, err) {
                return
            }
            assert.Contains(t, string(body), "Hello, Pulumi!")
        },
    })

Igual que les nostres comprovacions d'execució anteriors, aquesta comprovació s'executarà immediatament després d'aixecar la pila, tot en resposta a una simple trucada. go test. I aquesta és només la punta de l'iceberg: totes les funcions de prova Go que podeu escriure en codi estan disponibles.

Integració contínua d'infraestructures

És bo poder executar proves en un ordinador portàtil quan es fan molts canvis a la infraestructura per provar-los abans d'enviar-los per a la revisió del codi. Però nosaltres i molts dels nostres clients provem la infraestructura en diverses etapes del cicle de vida del desenvolupament:

  • En cada sol·licitud d'extracció oberta per provar abans de la fusió.
  • En resposta a cada commit, per comprovar que la combinació s'ha fet correctament.
  • Periòdicament, com ara a la nit o setmanalment per a proves addicionals.
  • Com a part de les proves de rendiment o d'estrès, que normalment s'executen durant un llarg període de temps i realitza proves en paral·lel i/o desplega el mateix programa diverses vegades.

Per a cadascun d'ells, Pulumi admet la integració amb el vostre sistema d'integració contínua favorit. Amb una integració contínua, això us ofereix la mateixa cobertura de proves per a la vostra infraestructura que per al vostre programari d'aplicació.

Pulumi té suport per a sistemes CI comuns. Aquests són alguns d'ells:

Per obtenir informació més detallada, consulteu la documentació de lliurament continu.

Entorns efímers

Una oportunitat molt potent que s'obre és la possibilitat de desplegar entorns efímers únicament amb finalitats de proves d'acceptació. Concepte projectes i piles Pulumi està dissenyat per desplegar i desmuntar fàcilment entorns completament aïllats i independents, tot en unes quantes ordres CLI senzilles o utilitzant un marc de proves d'integració.

Si utilitzeu GitHub, Pulumi ofereix Aplicació GitHub, que us ajudarà a connectar les proves d'acceptació per obtenir sol·licituds dins del vostre pipeline CI. Només cal que instal·leu l'aplicació al dipòsit de GitHub i Pulumi afegirà informació sobre visualitzacions prèvies d'infraestructura, actualitzacions i resultats de proves a les vostres sol·licituds de CI i de grup:

Prova d'infraestructura com a codi amb Pulumi. Part 2

Quan utilitzeu Pulumi per a les vostres proves d'acceptació bàsiques, obtindreu noves capacitats d'automatització que milloraran la productivitat de l'equip i us donaran confiança en la qualitat dels vostres canvis.

Total

En aquest article, hem vist que mitjançant l'ús de llenguatges de programació de propòsit general, tenim a la nostra disposició moltes tècniques de desenvolupament de programari que han estat útils per desenvolupar les nostres aplicacions. Inclouen proves d'unitat, proves d'integració i com funcionen junts per dur a terme proves exhaustives en temps d'execució. Les proves són fàcils d'executar sota demanda o al vostre sistema CI.

Pulumi - programari de codi obert, d'ús gratuït i que funciona amb els vostres llenguatges de programació i núvols preferits - prova-ho avui!

Primera part

Font: www.habr.com

Afegeix comentari