Testkirina Binesaziyê wekî Kodê bi Pulumi re. Beş 1

Roj baş hevalno. Li hêviya destpêkirina herikîna nû ya li rêjeya "Pêkanîn û amûrên DevOps" Em wergereke nû bi we re parve dikin. Ajotin.

Testkirina Binesaziyê wekî Kodê bi Pulumi re. Beş 1

Bikaranîna Pulumi û zimanên bernamesaziyê yên gelemperî ji bo koda binesaziyê (Binesaziya wekî Kod) gelek feydeyan peyda dike: hebûna jêhatîbûn û zanînê, rakirina boilerplate di kodê de bi riya abstractionê, amûrên ku ji tîmê we re nas dikin, wek IDE û linter. Hemî van amûrên endezyariya nermalavê ne tenê me hilberdartir dikin, lê di heman demê de kalîteya koda me jî baştir dikin. Ji ber vê yekê, tenê xwezayî ye ku karanîna zimanên bernamesaziyê yên gelemperî rê dide me ku em pratîkek din a pêşkeftina nermalava girîng destnîşan bikin - ceribandin.

Di vê gotarê de, em ê binihêrin ka Pulumi çawa ji me re dibe alîkar ku binesaziya xwe-wek-kodê biceribîne.

Testkirina Binesaziyê wekî Kodê bi Pulumi re. Beş 1

Çima binesaziya ceribandinê?

Berî ku hûn bi hûrgulî biçin, hêja ye ku meriv vê pirsê bipirse: "Çima binesaziya binesaziyê ceribandin?" Gelek sedemên vê yekê hene û li vir hinek ji wan hene:

  • Testkirina yekîneya fonksiyonên kesane an perçeyên mantiqa bernameya we
  • Li hember hin astengan rewşa xwestî ya binesaziyê rast dike.
  • Tespîtkirina xeletiyên hevpar, wek nebûna şîfrekirina kelek hilanînê an neparastin, vekirina ji Înternetê ji makîneyên virtual.
  • Kontrolkirina pêkanîna dabînkirina binesaziyê.
  • Pêkanîna ceribandina dema xebitandinê ya mantiqa serîlêdanê ya ku di hundurê binesaziya weya "bernamekirî" de tê xebitandin da ku fonksiyonê piştî peydakirinê kontrol bike.
  • Wekî ku em dibînin, cûrbecûr vebijarkên ceribandina binesaziyê hene. Polumi mekanîzmayên ceribandinê li her nuqteya vê spektrê heye. Ka em dest pê bikin û bibînin ka ew çawa dixebite.

Testkirina yekîneyê

Bernameyên Pulumi bi zimanên bernamesaziya gelemperî yên wekî JavaScript, Python, TypeScript an Go têne nivîsandin. Ji ber vê yekê, tevahiya hêza van zimanan, amûr û pirtûkxaneyên wan, di nav wan de çarçoveyên ceribandinê, ji wan re heye. Pulumi pir-ewr e, ku tê vê wateyê ku ew dikare ji bo ceribandina ji her pêşkêşkerek ewr were bikar anîn.

(Di vê gotarê de, tevî ku pirzimanî û pirzimanî ne, em JavaScript û Mocha bikar tînin û li ser AWS-ê disekinin. Hûn dikarin Python bikar bînin unittest, Herin çarçoveya testê, an çarçoveyek testê ya din a ku hûn dixwazin. Û, bê guman, Pulumi bi Azure, Google Cloud, Kubernetes re pir baş dixebite.)

Wekî ku me dît, gelek sedem hene ku hûn dixwazin koda binesaziya xwe biceribînin. Yek ji wan ceribandina yekîneya kevneşopî ye. Ji ber ku koda we dibe ku fonksiyonên xwe hebe - mînakî, ji bo hesabkirina CIDR-ê, bi dînamîk nav, nîşan, û hwd. - dibe ku hûn dixwazin wan biceribînin. Ev eynî wek nivîsandina testên yekîneya birêkûpêk ji bo serîlêdanên bi zimanê bernamenûsiya weya bijare ye.
Ji bo ku hûn hinekî tevlihevtir bibin, hûn dikarin kontrol bikin ka bernameya we çawa çavkaniyan vediqetîne. Ji bo ronîkirinê, em bifikirin ku em hewce ne ku serverek EC2 ya hêsan biafirînin û em dixwazin ji yên jêrîn piştrast bin:

  • Mînakan etîketek heye Name.
  • Divê mînak skrîpta hundurîn bikar neynin userData - Divê em AMI (wêne) bikar bînin.
  • Divê SSH ji Înternetê re nehêle.

Ev nimûne li ser bingehê ye mînaka min aws-js-webserver:

index.js:

"use strict";
 
let aws = require("@pulumi/aws");
 
let group = new aws.ec2.SecurityGroup("web-secgrp", {
    ingress: [
        { protocol: "tcp", fromPort: 22, toPort: 22, cidrBlocks: ["0.0.0.0/0"] },
        { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
    ],
});
 
let userData =
`#!/bin/bash
echo "Hello, World!" > index.html
nohup python -m SimpleHTTPServer 80 &`;
 
let server = new aws.ec2.Instance("web-server-www", {
    instanceType: "t2.micro",
    securityGroups: [ group.name ], // reference the group object above
    ami: "ami-c55673a0"             // AMI for us-east-2 (Ohio),
    userData: userData              // start a simple web server
});
 
exports.group = group;
exports.server = server;
exports.publicIp = server.publicIp;
exports.publicHostName = server.publicDns;

Ev bernameya bingehîn a Pulumi ye: ew bi tenê komek ewlehiya EC2 û mînakek veqetîne. Lêbelê, divê were zanîn ku li vir em her sê qaîdeyên ku li jor hatine destnîşan kirin dişkînin. Ka em testan binivîsin!

Testên nivîsandinê

Struktura giştî ya ceribandinên me dê mîna ceribandinên Mocha yên birêkûpêk xuya bike:

ec2tests.js

test.js:
let assert = require("assert");
let mocha = require("mocha");
let pulumi = require("@pulumi/pulumi");
let infra = require("./index");
 
describe("Infrastructure", function() {
    let server = infra.server;
    describe("#server", function() {
        // TODO(check 1): Должен быть тэг Name.
        // TODO(check 2): Не должно быть inline-скрипта userData.
    });
    let group = infra.group;
    describe("#group", function() {
        // TODO(check 3): Не должно быть SSH, открытого в Интернет.
    });
});

Naha em ceribandina xweya yekem binivîsin: Piştrast bikin ku mînakan tag heye Name. Ji bo ku em vê yekê kontrol bikin, em tenê tiştê mînaka EC2 digirin û taybetmendiya têkildar kontrol dikin tags:

 // check 1: Должен быть тэг Name.
        it("must have a name tag", function(done) {
            pulumi.all([server.urn, server.tags]).apply(([urn, tags]) => {
                if (!tags || !tags["Name"]) {
                    done(new Error(`Missing a name tag on server ${urn}`));
                } else {
                    done();
                }
            });
        });

Ew mîna ceribandinek birêkûpêk xuya dike, lê bi çend taybetmendiyên hêjayî balê ye:

  • Ji ber ku em li rewşa çavkaniyekê berî bicîhkirinê dipirsin, ceribandinên me her gav di moda "plan" (an "pêşdîtin") de têne meşandin. Ji ber vê yekê, gelek taybetmendî hene ku nirxên wan bi hêsanî nayên vegerandin an jî nayên destnîşankirin. Ev hemî taybetmendiyên derketinê yên ku ji hêla pêşkêşvanê weya cloudê ve têne hesibandin vedihewîne. Ev ji bo ceribandinên me normal e - em tenê daneyên têketinê kontrol dikin. Em ê paşê vegerin ser vê mijarê, dema ku ew tê ceribandinên entegrasyonê.
  • Ji ber ku hemî taybetmendiyên çavkaniya Pulumi derketin in, û gelek ji wan bi asynkronî têne nirxandin, pêdivî ye ku em rêbaza serîlêdanê bikar bînin da ku bigihîjin nirxan. Ev pir dişibe soz û fonksîyonê then .
  • Ji ber ku em gelek taybetmendiyan bikar tînin da ku URN-ya çavkaniyê di peyama xeletiyê de nîşan bidin, pêdivî ye ku em fonksiyonê bikar bînin pulumi.allku wan bi hev re bikin.
  • Di dawiyê de, ji ber ku ev nirx bi asynkronî têne hesibandin, pêdivî ye ku em taybetmendiya vegerê ya asynchron a Mocha bikar bînin. done an vegerandina sozekê.

Gava ku me her tiştî saz kir, em ê wekî nirxên JavaScript-ê yên hêsan bigihîjin têketinan. Mal tags nexşeyek e (arraja hevgirtî), ji ber vê yekê em ê piştrast bikin ku ew (1) ne derew e, û (2) ji bo mifteyek heye Name. Ew pir hêsan e û naha em dikarin her tiştî biceribînin!

Naha em kontrolê xwe yê duyemîn binivîsin. Ew hê hêsantir e:

 // check 2: Не должно быть inline-скрипта userData.
        it("must not use userData (use an AMI instead)", function(done) {
            pulumi.all([server.urn, server.userData]).apply(([urn, userData]) => {
                if (userData) {
                    done(new Error(`Illegal use of userData on server ${urn}`));
                } else {
                    done();
                }
            });
        });

Û di dawiyê de, em testa sêyemîn binivîsin. Ev ê hinekî tevlihevtir be ji ber ku em li qaîdeyên têketinê yên ku bi koma ewlehiyê ve girêdayî ne, yên ku dikarin gelek hebin, û rêzikên CIDR-ê di wan qaîdeyan de, yên ku dikarin gelek jî hebin, digerin. Lê me bi ser ket:

    // check 3: Не должно быть SSH, открытого в Интернет.
        it("must not open port 22 (SSH) to the Internet", function(done) {
            pulumi.all([ group.urn, group.ingress ]).apply(([ urn, ingress ]) => {
                if (ingress.find(rule =>
                        rule.fromPort == 22 && rule.cidrBlocks.find(block =>
                            block === "0.0.0.0/0"))) {
                    done(new Error(`Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group ${urn}`));
                } else {
                    done();
                }
            });
        });

Navê pêger. Naha em ceribandinan bimeşînin!

Testên xebitandinê

Di pir rewşan de, hûn dikarin ceribandinan bi awayê asayî, bi karanîna çarçoveya testê ya bijartina xwe bikar bînin. Lê taybetmendiyek Pulumi heye ku hêjayî balê ye.
Bi gelemperî, ji bo meşandina bernameyên Pulumi, pulimi CLI (navbera Rêza Fermandariyê) tê bikar anîn, ku dema xebitandina zimên mîheng dike, destpêkirina motora Pulumi-yê kontrol dike da ku operasyonên bi çavkaniyan re bêne tomarkirin û di plansaziyê de, hwd. Lêbelê, pirsgirêkek yek heye. Dema ku di bin kontrola çarçoveya ceribandina we de dixebite, dê di navbera CLI û motora Pulumi de pêwendiyek çênebe.

Ji bo ku em li dora vê pirsgirêkê bisekinin, em tenê hewce ne ku jêrîn diyar bikin:

  • Navê projeyê, ku di guherbara jîngehê de heye PULUMI_NODEJS_PROJECT (an jî, bi gelemperî, PULUMI__PROJECT для других языков).
    Navê stikê ku di guhêrbara jîngehê de tê diyar kirin PULUMI_NODEJS_STACK (an jî, bi gelemperî, PULUMI__ STACK).
    Guherbarên veavakirina stakê te. Ew dikarin bi karanîna guhêrbarek hawîrdorê werin wergirtin PULUMI_CONFIG û formata wan nexşeya JSON bi cotên key/nirx e.

    Bername dê hişyariyan bide ku destnîşan dikin ku pêwendiya bi CLI/motorê re di dema darvekirinê de peyda nabe. Ev girîng e ji ber ku bernameya we dê bi rastî tiştek bi cîh neke û dibe ku surprîz be ger ew ne ya ku we armanc dikir be! Ji bo ku ji Pulumi re bêjin ku ev tam ya ku hûn hewce ne, hûn dikarin saz bikin PULUMI_TEST_MODE в true.

    Bifikirin ku divê em navê projeyê tê de diyar bikin my-ws, navê stikê dev, û Herêma AWS us-west-2. Rêza fermanê ji bo ceribandinên Mocha dimeşîne dê bi vî rengî xuya bike:

    $ PULUMI_TEST_MODE=true 
        PULUMI_NODEJS_STACK="my-ws" 
        PULUMI_NODEJS_PROJECT="dev" 
        PULUMI_CONFIG='{ "aws:region": "us-west-2" }' 
        mocha tests.js

    Kirina vê yekê, wekî ku tê hêvî kirin, dê nîşanî me bide ku sê ceribandinên me hene!

    Infrastructure
        #server
          1) must have a name tag
     	 2) must not use userData (use an AMI instead)
        #group
          3) must not open port 22 (SSH) to the Internet
    
      0 passing (17ms)
      3 failing
     
     1) Infrastructure
           #server
             must have a name tag:
         Error: Missing a name tag on server
            urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www
    
     2) Infrastructure
           #server
             must not use userData (use an AMI instead):
         Error: Illegal use of userData on server
            urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www
    
     3) Infrastructure
           #group
             must not open port 22 (SSH) to the Internet:
         Error: Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group

    Ka em bernameya xwe rast bikin:

    "use strict";
     
    let aws = require("@pulumi/aws");
     
    let group = new aws.ec2.SecurityGroup("web-secgrp", {
        ingress: [
            { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
        ],
    });
     
    let server = new aws.ec2.Instance("web-server-www", {
        tags: { "Name": "web-server-www" },
        instanceType: "t2.micro",
        securityGroups: [ group.name ], // reference the group object above
        ami: "ami-c55673a0"             // AMI for us-east-2 (Ohio),
    });
     
    exports.group = group;
    exports.server = server;
    exports.publicIp = server.publicIp;
    exports.publicHostName = server.publicDns;
    

    Û dûv re dîsa ceribandinan bimeşînin:

    Infrastructure
        #server
          ✓ must have a name tag
          ✓ must not use userData (use an AMI instead)
        #group
          ✓ must not open port 22 (SSH) to the Internet
     
     
     3 passing (16ms)

    Her tişt baş bû... Hûr! ✓✓✓

    Ew ji bo îro hemî ye, lê em ê di beşa duyemîn a wergerê de li ser ceribandina bicîhkirinê biaxivin 😉

Source: www.habr.com

Add a comment