今天來介紹使用 Automation API 做整合測試。Automation API 主要是將 Pulumi CLI 所提供的功能都用程式介面供使用者可以開發自己的 Pulumi 自動化功能。
舉凡之前用過的 pulumi up
、pulumi stacak
、pulumi destroy
等功能,都可以透過 Automation API 做自動化。
以下接續昨日的範例,並改成使用 Automation API 撰寫。
開新專案後,必須安裝必要套件。本範例使用 TypeScript 程式語言撰寫 Pulumi 自動化程式,因此需要安裝 TypeScript 相關的套件與 @pulumi/pulumi
。
Automation API 就內建在每個程式語言的 pulumi 套件中!
$ npm install @pulumi/pulumi typescript @types/node ts-node
$ tsc --init
首先,先來將整個程式大致的輪廓寫出來,就是一個 main function,並執行。第二行的地方預先 import 了 Pulumi Automation API 的 LocalWorkspace
與 LocalProgramArgs
。
import * as path from 'path';
import {LocalProgramArgs, LocalWorkspace} from '@pulumi/pulumi/automation';
async function main() {
}
if (require.main === module) {
main()
.then(() => console.info('Done!'))
.catch(console.error);
}
Automation API 提供了很多種專案執行的選擇,可以執行同一台電腦的另一個資料夾中的專案 (LocalProgram)。這就與前一篇文章的 Golang integration test 的功能有點類似。
除了執行其他資料夾的程式外,還可以將自動化的功能放在原本 IaC 專案中,稱為 InlineProgam
。
另外還有提供 RemoteWorkspace 的功能,可以從 git 上將其他專案下載下來執行。
以下範例為使用 aws-vpc-ts
做為要執行的專案,並隨機產生一個 stackName。
const randomStackName = 'my-test-stack' + Math.random().toString(36).substring(7);
const args: LocalProgramArgs = {
stackName: randomStackName,
workDir: path.join(__dirname, '../aws-vpc-ts'),
};
這邊與 Golang 的 Integration Test 功能不同,除了可以設定新的 stack name 外,還可以用既有的 stack name。例如使用 stage
就可以做到自動化部屬 stage
環境的功能。
pulumi up
設定完專案的 stack 名稱與目錄後,就可以使用 LocalWorkspace.createOrSelectStack
產生一個 stack。
產生完 stack 後,使用 stack.setConfig
設定單一 config。或是使用stack.setAllConfig
一次設定所有 config。
設定完 stack 的 config 後,就可以使用 stack.up
方法,執行 pulumi up
,幫我們產生對應的 stack、config,並部署雲端資源了!
const stack = await LocalWorkspace.createOrSelectStack(args);
await stack.setAllConfig({
'aws:region': {value: 'ap-east-1'},
'aws:profile': {value: 'personal'},
'cidr': {value: '10.18.0.0/16'},
'numOfAzs': {value: '1'},
'numOfPublic': {value: '2'},
'numOfPrivate': {value: '1'},
});
await stack.up({onOutput: console.info});
與昨天的 ExtraRuntimeValidation
類似,可以透過 stack.exportStack
方法得到 Deployment 物件。
裡面就有所有的 resources 列表,這邊就不再列出驗證的程式碼了。
驗證的邏輯一樣可以拿出所有的 resources,並根據 type 做相對應的驗證。
const deployment = await stack.exportStack();
for (let resource of deployment.deployment.resources) {
}
最後,測試結束後,要移除所有部屬的雲端資源,也就是類似 pulumi destroy
的功能。
這邊使用 stack.destroy
方法移除所有資源。
await stack.destroy({onOutput: console.info});
最後就可以與執行一般 TypeScript 撰寫的 Node.js 程式一樣,使用 ts-node
執行撰寫好的自動化程式了!
不會再遇到需要使用 Pulumi CLI 才能運行 Pulumi IaC 專案的問題了。
$ npx ts-node index.js
Automation API 提供了完整的 CLI 功能,但用它來撰寫自動化程式就會稍微繁瑣一點,需要自己管理 stack、生命週期。不過這也讓 Automation API 提供了無限可能的功能。