Тестване на инфраструктурата като код с помощта на Pulumi. Част 2

Здравейте на всички. Днес споделяме с вас последната част от статията «Тестиране на инфраструктурата като код с помощта на Pulumi», преводът на която е подготвен специално за студентите от курса „DevOps практики и инструменти“.

Тестване на инфраструктурата като код с помощта на Pulumi. Част 2

Тестиране на разгръщането

Разглежданият стил на тестване е мощен подход, който ни позволява да извършваме тестване на бял ящик, за да проверим функционирането на нашия инфраструктурен код. Въпреки това, той малко ограничава това, което можем да проверим. Тестовете се изпълняват на базата на in-memory план за разгръщане, създаден от Pulumi преди действителното разгръщане и затова самото разгръщане не може да бъде тествано. За такива случаи в Pulumi съществува рамка за интегративни тестове. И двата подхода работят отлично заедно!

Интеграционният тестов фреймворк Pulumi е написан на Go и именно с негова помощ тестваме голяма част от нашия вътрешен код. Докато предходният подход за модулно тестване беше по-близък до тестването на белия ящик, интеграционното тестване е черен ящик. (Има и варианти за внимателно вътрешно тестване.) Този фреймворк е създаден, за да вземе цялостната Pulumi програма и да изпълни различни операции от жизнения цикъл, като разгръщане на нов стек от нулата, обновяване с вариации и премахване, потенциално няколко пъти. Ние ги стартираме редовно (например през нощта) и в качеството на стрес тестове.

(Ние работим по това, за да подобни възможности за интеграционно тестване да съществуват и в родния SDK на езиците. Можете да използвате интеграционния тестов фреймворк Go независимо от езика, на който е написана вашата Pulumi програма).

След като стартирате програмата с помощта на този фреймворк, можете да проверите следното:

  • Кодът на вашия проект е синтактично правилен и работи без грешки.
  • Настройките за конфигурация на стека и секретите работят и се интерпретират правилно.
  • Вашият проект може да бъде успешно разположен в избрания от вас облачен доставчик.
  • Вашият проект може да бъде успешно обновен от начално състояние до N други състояния.
  • Вашият проект може да бъде успешно унищожен и премахнат от вашия облачен доставчик.

Както ще видим скоро, този фреймворк може да се използва и за извършване на валидация по време на работа.

Простой интеграционен тест

За да видим това в действие, ще разгледаме репозитория pulumi/examples, тъй като нашият екип и общността на Pulumi го използват за тестване на техните собствени пул реквестове, комити и нощни сборки.

По-долу е представен опростен тест на нашия пример, който конфигурира S3 bucket и някои други обекти.:

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

Тестът преминава през основния жизнен цикъл на създаване, модификация и унищожаване на стек за папка aws-js-s3-folder. Ще отнеме около минута, за да съобщи за преминалия тест:

$ go test .
PASS
ok      ... 43.993s

Има много параметри за конфигуриране на поведението на тези тестове. Пълният списък с опции е показан в структурата ProgramTestOptions. Например, можете да настроите Jaeger endpoint за трасировка (Tracing), да зададете какво очаквате, че тестът ще се провали при негативно тестване (ExpectFailure), да приложите серия от “поправки” на програмата за последователен преход на състояния (EditDirs) и много други. Нека видим как да ги използваме за проверка на разгръщането на приложението.

Проверка на свойствата на ресурсите

Интеграцията, за която споменахме по-горе, гарантира, че нашата програма „работи“ — не се проваля. Но какво да правим, ако искаме да проверим свойствата на получения стек? Например, дали определени видове ресурси са били (или не са били) подготвени и дали те имат определени атрибути.

Параметър ExtraRuntimeValidation за ProgramTestOptions позволява да видим състоянието, регистрирано от Pulumi след разполагането (post-deployment state), за да можем да направим допълнителни проверки. Това включва пълен снимка на състоянието на резултатния стек, вкл. конфигурацията, експортираните изходни стойности, всички ресурси и техните свойства, както и всички зависимости между ресурсите.

За да видим основен пример за това, нека проверим, че нашата програма създава един S3 Bucket:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // както преди...
        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, "Очакваше се да намерим един AWS S3 Bucket")
        },
    })

Сега, когато стартираме go test, той не само че ще премине през серия тестове на жизнения цикъл, но също така, след успешно разполагане на стека, ще извърши допълнителна проверка на резултатното състояние.

Runtime-тестове

Досега всички тестове бяха изключително свързани с поведението при разгръщане и модела на ресурсите на Pulumi. Какво да правим, ако искате да проверите дали подготвената инфраструктура наистина работи? Например, дали виртуалната машина функционира, дали S3 кофа съдържа очакваното от нас съдържание и т.н.

Вероятно вече сте се досетили как да постигнете това: опцията ExtraRuntimeValidation за ProgramTestOptions е отлична възможност за това. На този етап стартирате произволен тест на Go с достъп до пълното състояние на ресурсите на вашата програма. Това състояние включва информация като IP адресите на виртуалните машини, URL адресите и всичко друго, необходимо за реална интеракция с облачните приложения и инфраструктурата.

Например, нашата тестова програма експортира свойството webEndpoint на кофата, наречена websiteUrl, което представлява пълния URL адрес, по който можем да достъпим конфигурирания index document. Въпреки че можехме да се задълбочим в файла със състоянието, за да намерим bucket и да прочетем това свойство директно, в много случаи нашите стеки експортират полезни свойства, като това, които удобно можем да използваме за проверки:

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

Както нашите предишни проверки в реално време, тази проверка ще се извърши веднага след разгръщането на стека и всичко това в отговор на прост повик. go test. И това е само върха на айсберга — налични са всички тестови възможности на Go, които можете да напишете в кода.

Непрекъсната интеграция на инфраструктурaта

Добре е да имате възможност да стартирате тестове на лаптопа, когато се правят много промени в инфраструктурата, за да ги проверите преди да бъдат изпратени за преглед на кода. Но и много от нашите клиенти тестват инфраструктурата на различни етапи от жизнения цикъл на разработката:

  • Във всеки отворен пул реквест за тест преди сливането.
  • В отговор на всеки комит, за да се провери отново, че сливането е извършено правилно.
  • Периодично, например, през нощта или веднъж седмично за допълнително тестване.
  • По време на производствени тестове или стрес тестове, които обикновено се извършват през дълъг период от време и стартират тестове паралелно и/или разгръщат една и съща програма няколко пъти.

За всяка от тях Pulumi поддържа интеграция с любимата ви система за интеграция на непрекъснато развитие. При непрекъсната интеграция, това ви осигурява същото покритие на тестовете за ваше инфраструктура, както и за приложен софтуер.

Pulumi поддържа популярни CI системи. Ето някои от тях:

За повече информация, моля, обърнете се към документацията за Continuous Delivery.

Ефимерни среди

Много мощна възможност, която се отваря — е възможността да разгръщате ефимерни среди изключително за целите на приемното тестване. Концепцията на проекти и стекове Pulumi е проектирана да улеснява разгръщането и разгръщането на напълно изолирани и независими среди, всичко с няколко прости команди от CLI или с помощта на рамка за интеграционно тестване.

Ако използвате GitHub, Pulumi предлага GitHub App, което ще ви помогне да свържете приемочното тестване с пул реквестите във вашия CI пайплайн. Просто инсталирайте приложението в репозитория на GitHub, а Pulumi във вашия CI и в пул реквестите ще се добавя информация за предварителен преглед на инфраструктурата, актуализации и резултати от тестването:

Тестване на инфраструктурата като код с помощта на Pulumi. Част 2

Използвайки Pulumi за вашите основни приемъчни тестове, ще имате нови възможности за автоматизация, които ще подобрят производителността на екипа и ще ви дадат уверност в качеството на промените.

Резюме

В тази статия видяхме, че при използването на езиците за програмиране с общо предназначение, ни стават достъпни множество методи за разработка на софтуер, които бяха полезни при разработката на нашите приложения. Те включват модулно тестване, интеграционно тестване, а също и тяхното взаимодействие за провеждането на обширно тестиране по време на изпълнение. Тестовете лесно се стартират при поискване или в вашата CI система.

Pulumi — софтуер с отворен код, той е безплатен за използване и работи с вашите любими езици за програмиране и облаци — опитайте го днес!

Първа част

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster