Testen Sie Ihre Infrastruktur als Code mit Pulumi. Teil 2

Hallo an alle. Heute teilen wir Ihnen den letzten Teil des Artikels „Testen der Infrastruktur als Code mit Pulumi“ mit , dessen Übersetzung speziell für Studenten des Kurses „DevOps Practices and Tools“ erstellt wurde .



Bereitstellungstests


Der getestete Teststil ist ein leistungsstarker Ansatz, mit dem wir eine weiße Box testen können, um die Innenseiten unseres Infrastrukturcodes zu überprüfen. Es schränkt jedoch etwas ein, was wir überprüfen können. Tests werden auf der Grundlage eines von Pulumi vor der direkten Bereitstellung erstellten In-Memory-Bereitstellungsplans durchgeführt. Daher kann die Bereitstellung selbst nicht getestet werden. Für solche Fälle verfügt Pulumi über ein Integrationstest-Framework. Und diese beiden Ansätze arbeiten hervorragend zusammen!

Das Pulumi-Integrationstest-Framework ist in Go geschrieben und mit seiner Hilfe testen wir den größten Teil unseres internen Codes. Wenn der zuvor diskutierte Unit-Test-Ansatz eher dem White-Box-Test ähnelte, ist der Integrationstest eine Black-Box. (Es gibt auch Optionen für gründliche interne Tests.) Dieses Framework wurde erstellt, um das gesamte Pulumi-Programm zu übernehmen und verschiedene Lebenszyklusvorgänge auszuführen, z. B. das Bereitstellen eines neuen Stacks von Grund auf, das Aktualisieren mit Variationen und das Löschen, möglicherweise mehrmals. Wir führen sie regelmäßig (zum Beispiel nachts) und als Stresstest durch.

(Wir arbeiten daran, sicherzustellen, dass ähnliche Integrationstestfunktionen im SDK der Muttersprache verfügbar sind. Sie können das Go-Integrationstest-Framework unabhängig von der Sprache verwenden, in der Ihr Pulumi-Programm geschrieben ist.)

Wenn Sie das Programm mit diesem Framework ausführen, können Sie Folgendes überprüfen:

  • Ihr Projektcode ist syntaktisch korrekt und funktioniert fehlerfrei.
  • Die Konfigurationseinstellungen für Stapel und Geheimnisse funktionieren und werden korrekt interpretiert.
  • Ihr Projekt kann erfolgreich bei Ihrem ausgewählten Cloud-Anbieter bereitgestellt werden.
  • Ihr Projekt kann erfolgreich vom Ausgangszustand auf N andere Zustände aktualisiert werden.
  • Ihr Projekt kann erfolgreich zerstört und von Ihrem Cloud-Anbieter gelöscht werden.

Wie wir bald sehen werden, kann dieses Framework auch zur Durchführung der Laufzeitvalidierung verwendet werden.

Einfacher Integrationstest


Um dies in Aktion zu sehen, werden wir uns das pulumi/examples Repository pulumi/examples , da unser Team und die Pulumi-Community es verwenden, um ihren eigenen Pool von Anfragen, Commits und nächtlichen Builds zu testen.

Im Folgenden finden Sie einen vereinfachten Test unseres Beispiels, in dem der S3-Bucket und einige andere Objekte bereitgestellt werden :

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, }, }) } 

Dieser Test durchläuft den grundlegenden Lebenszyklus des Erstellens, aws-js-s3-folder und Zerstörens des Stapels für den aws-js-s3-folder . Es dauert ungefähr eine Minute, um den bestandenen Test zu melden:

 $ go test . PASS ok ... 43.993s 

Es gibt viele Möglichkeiten, das Verhalten dieser Tests anzupassen. Eine vollständige Liste der Optionen finden Sie in der ProgramTestOptions Struktur . Sie können beispielsweise den Jaeger-Endpunkt für die Ablaufverfolgung (Ablaufverfolgung) konfigurieren, angeben, dass der Test während eines negativen Tests ExpectFailure ( ExpectFailure ), eine Reihe von „Änderungen“ auf das Programm für aufeinanderfolgende EditDirs ( EditDirs ) EditDirs und vieles mehr. Lassen Sie uns sehen, wie Sie sie zum Überprüfen der Anwendungsbereitstellung verwenden.

Überprüfen der Ressourceneigenschaften


Die oben erwähnte Integration stellt sicher, dass unser Programm "funktioniert" - es stürzt nicht ab. Was aber, wenn wir die Eigenschaften des resultierenden Stapels überprüfen möchten? Zum Beispiel, dass bestimmte Arten von Ressourcen vorbereitet wurden (oder nicht) und dass sie bestimmte Attribute haben.

Mit ExtraRuntimeValidation Parameter ExtraRuntimeValidation für ProgramTestOptions können wir den von Pulumi nach der Bereitstellung aufgezeichneten Status (Status nach der Bereitstellung) anzeigen, um zusätzliche Überprüfungen durchführen zu können. Dies umfasst eine vollständige Momentaufnahme des Status des resultierenden Stapels, einschließlich Konfiguration, exportierter Ausgabewerte, aller Ressourcen und ihrer Eigenschaftswerte sowie aller Abhängigkeiten zwischen Ressourcen.

Um ein grundlegendes Beispiel dafür zu sehen, überprüfen wir, ob unser Programm einen S3-Bucket erstellt :

  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") }, }) 

Wenn wir jetzt den Go-Test ausführen, werden nicht nur die zahlreichen Lebenszyklus-Tests durchlaufen, sondern nach erfolgreicher Bereitstellung des Stacks wird auch eine zusätzliche Überprüfung des resultierenden Status durchgeführt.

Laufzeit-Tests


Bisher befassten sich alle Tests ausschließlich mit dem Bereitstellungsverhalten und dem Pulumi-Ressourcenmodell. Was ist, wenn Sie überprüfen möchten, ob Ihre vorbereitete Infrastruktur wirklich funktioniert? Wenn beispielsweise die virtuelle Maschine ausgeführt wird, enthält der S3-Bucket das, was wir erwarten, und so weiter.

Möglicherweise haben Sie bereits herausgefunden, wie das geht: Die Option ProgramTestOptions für ProgramTestOptions ist hierfür eine großartige Gelegenheit. Zu diesem Zeitpunkt führen Sie einen beliebigen Go-Test mit Zugriff auf den vollständigen Status der Ressourcen Ihres Programms durch. Dieser Status enthält Informationen wie IP-Adressen von virtuellen Maschinen, URLs und alles, was für die reale Interaktion mit den empfangenen Cloud-Anwendungen und der empfangenen Infrastruktur erforderlich ist.

Unser Testprogramm exportiert beispielsweise eine webEndpoint Bucket-Eigenschaft namens websiteUrl . websiteUrl ist die vollständige URL, unter der wir das angepasste webEndpoint websiteUrl können. Obwohl wir in die Statusdatei eintauchen könnten, um den bucket zu finden und diese Eigenschaft direkt zu lesen, exportieren unsere Stapel in vielen Fällen nützliche Eigenschaften wie diese, die wir bequem überprüfen können:

 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!") }, }) 

Wie bei unseren vorherigen Laufzeitprüfungen wird diese Prüfung unmittelbar nach dem Anheben des Stapels durchgeführt, und dies alles als Reaktion auf einen einfachen Aufruf zum go test . Und dies ist nur die Spitze des Eisbergs - alle Go-Testfunktionen, die Sie in Code schreiben können, sind verfügbar.

Kontinuierliche Infrastrukturintegration


Es ist gut, Tests auf einem Laptop ausführen zu können, wenn viele Änderungen an der Infrastruktur vorgenommen werden, um sie zu testen, bevor sie an Codeüberprüfungen gesendet werden. Wir und viele unserer Kunden testen die Infrastruktur jedoch in verschiedenen Phasen des Entwicklungslebenszyklus:

  • In jedem offenen Pool die Anforderung für den Test vor der Fusion.
  • Überprüfen Sie als Antwort auf jedes Commit, ob die Zusammenführung korrekt durchgeführt wurde.
  • In regelmäßigen Abständen, zum Beispiel nachts oder wöchentlich für zusätzliche Tests.
  • Im Rahmen von Leistungstests oder Stresstests, die normalerweise über einen langen Zeitraum durchgeführt werden und Tests parallel ausführen und / oder dasselbe Programm mehrmals bereitstellen.

Für jeden von ihnen unterstützt Pulumi die Integration in Ihr bevorzugtes kontinuierliches Integrationssystem. Durch die kontinuierliche Integration erhalten Sie für Ihre Infrastruktur dieselbe Testabdeckung wie für Anwendungssoftware.

Pulumi unterstützt gängige CI-Systeme. Hier sind einige davon:


Weitere Informationen finden Sie in der Dokumentation zur kontinuierlichen Lieferung .

Vergängliche Umgebungen


Eine sehr leistungsstarke Funktion, die sich öffnet, ist die Möglichkeit, kurzlebige Umgebungen ausschließlich zum Zweck von Abnahmetests bereitzustellen. Das Pulumi- Projekt- und Stack- Konzept ist so konzipiert, dass vollständig isolierte und unabhängige Umgebungen in wenigen einfachen CLI-Befehlen oder über ein Integrationstest-Framework problemlos bereitgestellt und zerstört werden können.

Wenn Sie GitHub verwenden, bietet Pulumi die GitHub-App an , mit der Sie Akzeptanztests mit dem Anforderungspool in Ihrer CI-Pipeline verbinden können. Installieren Sie einfach die Anwendung im GitHub-Repository, und Pulumi fügt Ihrem CI und dem Pool von Anforderungen Informationen zur Infrastrukturvorschau, zu Aktualisierungen und Testergebnissen hinzu:



Wenn Sie Pulumi für Ihre grundlegenden Abnahmetests verwenden, verfügen Sie über neue Automatisierungsfunktionen, die die Teamleistung verbessern und Vertrauen in die Qualität der Änderungen geben.

Zusammenfassung


In diesem Artikel haben wir gesehen, dass uns bei der Verwendung allgemeiner Programmiersprachen viele Softwareentwicklungsmethoden zur Verfügung stehen, die bei der Entwicklung unserer Anwendungen hilfreich waren. Dazu gehören Unit-Tests, Integrationstests und deren Interaktion zur Durchführung umfangreicher Laufzeit-Tests. Tests können einfach bei Bedarf oder in Ihrem CI-System ausgeführt werden.

Pulumi ist Open Source Software, kostenlos zu verwenden und funktioniert mit Ihren bevorzugten Programmiersprachen und Clouds - probieren Sie es noch heute aus !

Der erste Teil

Source: https://habr.com/ru/post/de463637/


All Articles