Day 27-如何测试 terraform 之二:自动化测试写起来辛苦,但跑起来就是一个爽

本章介绍如何使用 terratest 为 terraform 准备整合测试

课程内容与代码会放在 Github 上: https://github.com/chechiachang/terraform-30-days

赛後文章会整理放到个人的部落格上 http://chechia.net/

追踪粉专可以收到文章的主动推播

https://ithelp.ithome.com.tw/upload/images/20210901/20120327NvpHVr2QC0.jpg


Terratest

Terratest 是一个 infrastructure 的自动化测试 go library

  • 以 golang 为语言
  • 整合各家公有云的 API,以及开源服务如 Kubernetes API,helm
  • 已经整合 terraform,Packer 或是 Docker,可以直接测试各服务的程序码

Test terraform with terratest

Terratest 文件说明测试 terraform code 的基本流程

  • 使用 golang 内建的 package test,写出测试案例 _test.go
  • 在 golang 中使用 terratest 来呼叫需要测试的 terraform .tf 档案,实际去公有云产生测试用 infrastructure
  • 使用 terratest 提供的工具来验证产生出来的 infrastructure
  • 测试完成後,清除所有产生的 infrastructure

prerequisite

使用 terratest 测试为一个需求就是 golang

example

实际举例:这边有为 azure/_poc/foundation 写测试例

cd azure

tree -L 1
.
├── ...
├── _poc
└── test

实际到 azure/test/poc_foundation_test.go

// https://github.com/gruntwork-io/terratest/blob/master/test/azure/terraform_azure_resourcegroup_example_test.go
package test

import (
	"testing"

	"github.com/gruntwork-io/terratest/modules/azure"
	//"github.com/gruntwork-io/terratest/modules/random"
	"github.com/gruntwork-io/terratest/modules/terraform"
	"github.com/stretchr/testify/assert"
)

func TestTerraformAzureResourceGroupExample(t *testing.T) {
	t.Parallel()

	// subscriptionID is overridden by the environment variable "ARM_SUBSCRIPTION_ID"
	subscriptionID := ""
	//uniquePostfix := random.UniqueId()

	// website::tag::1:: Configure Terraform setting up a path to Terraform code.
	terraformOptions := &terraform.Options{
		// The path to where our Terraform code is located
		TerraformDir: "../_poc/foundation",
	}

	// website::tag::4:: At the end of the test, run `terraform destroy` to clean up any resources that were created
	defer terraform.Destroy(t, terraformOptions)

	// website::tag::2:: Run `terraform init` and `terraform apply`. Fail the test if there are any errors.
	terraform.InitAndApply(t, terraformOptions)

	// website::tag::3:: Run `terraform output` to get the values of output variables
	resourceGroupName := terraform.Output(t, terraformOptions, "resource_group_name")
	storageAccountName := terraform.Output(t, terraformOptions, "storage_account_name")
	storageContainerName := terraform.Output(t, terraformOptions, "storage_container_name")

	// website::tag::4:: Verify the resource group exists
	assert.True(t,
		azure.ResourceGroupExists(t, resourceGroupName, subscriptionID),
		"Resource group does not exist")
	assert.True(t,
		azure.StorageAccountExists(t, storageAccountName, resourceGroupName, subscriptionID),
		"Storage Account does not exist")
	assert.True(t,
		azure.StorageBlobContainerExists(t, storageContainerName, storageAccountName, resourceGroupName, subscriptionID),
		"Storage Container does not exist")
}

这个测试非常单纯

  • 设定 terraformOptions.TerraformDir 的 directory 位置为希望测试的 root module
  • 呼叫 terraform.InitAndApply(t, terraformOptions) 实际 apply
  • 取得 terraform.Output,从 terraform.Output 中检查产生的 output 内容是否符合预期
  • 在 assert.True 中,使用 azure API 检查 infrastructure 是否存在,例如以 azure.ResourceGroupExist 检查公有云上是否真的有指定名称的 resourcegroup
  • 可以透过 azure API 针对 infrastructure 细节做检查
  • 完成後 defer terraform.Destroy(t, terraformOptions) 清除所有产生的 infrastructure

Run test

接下来我们实际执行测试

  • 注意 azure/_poc/foundation 的内容,是没有 terragrunt 的 terraform
  • 注意 azure/_poc/foudnation 的执行身份不是 service principal,而是刚开课时使用的 user az login credential
cd azure

az login

export ARM_SUBSCRIPTION_ID=""
go test ./test

go test -v ./test
=== RUN   TestTerraformAzureResourceGroupExample
=== PAUSE TestTerraformAzureResourceGroupExample
=== CONT  TestTerraformAzureResourceGroupExample
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:02+08:00 retry.go:91: terraform [init -upgrade=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:02+08:00 logger.go:66: Running command terraform with args [init -upgrade=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:02+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:02+08:00 logger.go:66: Initializing the backend...
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:03+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:03+08:00 logger.go:66: Initializing provider plugins...
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:03+08:00 logger.go:66: - Reusing previous version of hashicorp/azurerm from the dependency lock file
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:03+08:00 logger.go:66: - Reusing previous version of hashicorp/random from the dependency lock file
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: - Using previously-installed hashicorp/azurerm v2.65.0
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: - Using previously-installed hashicorp/random v3.1.0
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: Terraform has been successfully initialized!
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: You may now begin working with Terraform. Try running "terraform plan" to see
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: any changes that are required for your infrastructure. All Terraform commands
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: should now work.
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: If you ever set or change modules or backend configuration for Terraform,
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: rerun this command to reinitialize your working directory. If you forget, other
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: commands will detect it and remind you to do so if necessary.
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 retry.go:91: terraform [apply -input=false -auto-approve -lock=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:04+08:00 logger.go:66: Running command terraform with args [apply -input=false -auto-approve -lock=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66: Terraform used the selected providers to generate the following execution
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66: plan. Resource actions are indicated with the following symbols:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + create
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66: Terraform will perform the following actions:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   # azurerm_resource_group.rg will be created
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + resource "azurerm_resource_group" "rg" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + id       = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + location = "southeastasia"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + name     = "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   # azurerm_storage_account.main will be created
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + resource "azurerm_storage_account" "main" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + access_tier                      = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + account_kind                     = "StorageV2"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + account_replication_type         = "LRS"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + account_tier                     = "Standard"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + allow_blob_public_access         = false
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + enable_https_traffic_only        = true
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + id                               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + is_hns_enabled                   = false
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + large_file_share_enabled         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + location                         = "southeastasia"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + min_tls_version                  = "TLS1_2"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + name                             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + nfsv3_enabled                    = false
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_access_key               = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_blob_connection_string   = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_blob_endpoint            = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_blob_host                = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_connection_string        = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_dfs_endpoint             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_dfs_host                 = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_file_endpoint            = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_file_host                = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_location                 = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_queue_endpoint           = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_queue_host               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_table_endpoint           = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_table_host               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_web_endpoint             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + primary_web_host                 = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + resource_group_name              = "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_access_key             = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_blob_connection_string = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_blob_endpoint          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_blob_host              = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_connection_string      = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_dfs_endpoint           = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_dfs_host               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_file_endpoint          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_file_host              = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_location               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_queue_endpoint         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_queue_host             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_table_endpoint         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_table_host             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_web_endpoint           = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + secondary_web_host               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + tags                             = {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + "environment" = "foundation"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + blob_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + change_feed_enabled      = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + default_service_version  = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + last_access_time_enabled = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + versioning_enabled       = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + container_delete_retention_policy {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + cors_rule {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_methods    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_origins    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + exposed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + max_age_in_seconds = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + delete_retention_policy {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + identity {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + identity_ids = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + principal_id = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + tenant_id    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + type         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + network_rules {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + bypass                     = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + default_action             = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + ip_rules                   = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + virtual_network_subnet_ids = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + private_link_access {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + endpoint_resource_id = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + endpoint_tenant_id   = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + queue_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + cors_rule {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_methods    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_origins    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + exposed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + max_age_in_seconds = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + hour_metrics {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + enabled               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + include_apis          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + retention_policy_days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + version               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + logging {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + delete                = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + read                  = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + retention_policy_days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + version               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + write                 = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + minute_metrics {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + enabled               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + include_apis          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + retention_policy_days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + version               = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + routing {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + choice                      = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + publish_internet_endpoints  = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + publish_microsoft_endpoints = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + share_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + cors_rule {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_methods    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + allowed_origins    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + exposed_headers    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + max_age_in_seconds = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + retention_policy {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + days = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:           + smb {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + authentication_types            = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + channel_encryption_type         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + kerberos_ticket_encryption_type = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:               + versions                        = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   # azurerm_storage_container.main will be created
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + resource "azurerm_storage_container" "main" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + container_access_type   = "private"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + has_immutability_policy = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + has_legal_hold          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + id                      = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + metadata                = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + name                    = "tfstate"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + resource_manager_id     = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + storage_account_name    = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   # random_id.storage_account_name will be created
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + resource "random_id" "storage_account_name" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + b64_std     = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + b64_url     = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + byte_length = 8
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + dec         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + hex         = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:       + id          = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66: Plan: 4 to add, 0 to change, 0 to destroy.
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66: Changes to Outputs:
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + resource_group_name    = "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + storage_account_name   = (known after apply)
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:18+08:00 logger.go:66:   + storage_container_name = "tfstate"
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:19+08:00 logger.go:66: random_id.storage_account_name: Creating...
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:19+08:00 logger.go:66: random_id.storage_account_name: Creation complete after 0s [id=oVkUl07PTk8]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:29+08:00 logger.go:66: azurerm_resource_group.rg: Creating...
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:30+08:00 logger.go:66: azurerm_resource_group.rg: Creation complete after 1s [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:30+08:00 logger.go:66: azurerm_storage_account.main: Creating...
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:40+08:00 logger.go:66: azurerm_storage_account.main: Still creating... [10s elapsed]
TestTerraformAzureResourceGroupExample 2021-09-27T22:51:50+08:00 logger.go:66: azurerm_storage_account.main: Still creating... [20s elapsed]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:00+08:00 logger.go:66: azurerm_storage_account.main: Still creating... [30s elapsed]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: azurerm_storage_account.main: Creation complete after 31s [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc/providers/Microsoft.Storage/storageAccounts/tfstatea15914974ecf4e4f]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: azurerm_storage_container.main: Creating...
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: azurerm_storage_container.main: Creation complete after 0s [id=https://tfstatea15914974ecf4e4f.blob.core.windows.net/tfstate]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: Outputs:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: resource_group_name = "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: storage_account_name = "tfstatea15914974ecf4e4f"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: storage_container_name = "tfstate"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 retry.go:91: terraform [output -no-color -json resource_group_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:02+08:00 logger.go:66: Running command terraform with args [output -no-color -json resource_group_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:03+08:00 logger.go:66: "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:03+08:00 retry.go:91: terraform [output -no-color -json storage_account_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:03+08:00 logger.go:66: Running command terraform with args [output -no-color -json storage_account_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:04+08:00 logger.go:66: "tfstatea15914974ecf4e4f"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:04+08:00 retry.go:91: terraform [output -no-color -json storage_container_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:04+08:00 logger.go:66: Running command terraform with args [output -no-color -json storage_container_name]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:05+08:00 logger.go:66: "tfstate"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:09+08:00 retry.go:91: terraform [destroy -auto-approve -input=false -lock=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:09+08:00 logger.go:66: Running command terraform with args [destroy -auto-approve -input=false -lock=false]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:11+08:00 logger.go:66: random_id.storage_account_name: Refreshing state... [id=oVkUl07PTk8]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:21+08:00 logger.go:66: azurerm_resource_group.rg: Refreshing state... [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:22+08:00 logger.go:66: azurerm_storage_account.main: Refreshing state... [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc/providers/Microsoft.Storage/storageAccounts/tfstatea15914974ecf4e4f]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: azurerm_storage_container.main: Refreshing state... [id=https://tfstatea15914974ecf4e4f.blob.core.windows.net/tfstate]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Note: Objects have changed outside of Terraform
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Terraform detected the following changes made outside of Terraform since the
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: last "terraform apply":
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   # azurerm_resource_group.rg has been changed
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   ~ resource "azurerm_resource_group" "rg" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         id       = "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         name     = "terraform-30-days-poc"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       + tags     = {}
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         # (1 unchanged attribute hidden)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Unless you have made equivalent changes to your configuration, or ignored the
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: relevant attributes using ignore_changes, the following plan may include
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: actions to undo or respond to these changes.
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: ─────────────────────────────────────────────────────────────────────────────
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Terraform used the selected providers to generate the following execution
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: plan. Resource actions are indicated with the following symbols:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - destroy
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Terraform will perform the following actions:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   # azurerm_resource_group.rg will be destroyed
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - resource "azurerm_resource_group" "rg" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - id       = "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - location = "southeastasia" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - name     = "terraform-30-days-poc" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - tags     = {} -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   # azurerm_storage_account.main will be destroyed
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - resource "azurerm_storage_account" "main" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - access_tier                    = "Hot" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - account_kind                   = "StorageV2" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - account_replication_type       = "LRS" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - account_tier                   = "Standard" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - allow_blob_public_access       = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - enable_https_traffic_only      = true -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - id                             = "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc/providers/Microsoft.Storage/storageAccounts/tfstatea15914974ecf4e4f" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - is_hns_enabled                 = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - location                       = "southeastasia" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - min_tls_version                = "TLS1_2" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - name                           = "tfstatea15914974ecf4e4f" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - nfsv3_enabled                  = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_access_key             = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_blob_connection_string = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_blob_endpoint          = "https://tfstatea15914974ecf4e4f.blob.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_blob_host              = "tfstatea15914974ecf4e4f.blob.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_connection_string      = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_dfs_endpoint           = "https://tfstatea15914974ecf4e4f.dfs.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_dfs_host               = "tfstatea15914974ecf4e4f.dfs.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_file_endpoint          = "https://tfstatea15914974ecf4e4f.file.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_file_host              = "tfstatea15914974ecf4e4f.file.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_location               = "southeastasia" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_queue_endpoint         = "https://tfstatea15914974ecf4e4f.queue.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_queue_host             = "tfstatea15914974ecf4e4f.queue.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_table_endpoint         = "https://tfstatea15914974ecf4e4f.table.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_table_host             = "tfstatea15914974ecf4e4f.table.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_web_endpoint           = "https://tfstatea15914974ecf4e4f.z23.web.core.windows.net/" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - primary_web_host               = "tfstatea15914974ecf4e4f.z23.web.core.windows.net" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - resource_group_name            = "terraform-30-days-poc" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - secondary_access_key           = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - secondary_connection_string    = (sensitive value)
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - tags                           = {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - "environment" = "foundation"
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         } -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - blob_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - change_feed_enabled      = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - last_access_time_enabled = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - versioning_enabled       = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - network_rules {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - bypass                     = [
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - "AzureServices",
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:             ] -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - default_action             = "Allow" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - ip_rules                   = [] -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - virtual_network_subnet_ids = [] -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - queue_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - hour_metrics {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - enabled               = true -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - include_apis          = true -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - retention_policy_days = 7 -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - version               = "1.0" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - logging {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - delete                = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - read                  = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - retention_policy_days = 0 -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - version               = "1.0" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - write                 = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - minute_metrics {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - enabled               = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - include_apis          = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - retention_policy_days = 0 -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - version               = "1.0" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - share_properties {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:           - retention_policy {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:               - days = 7 -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:             }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:         }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   # azurerm_storage_container.main will be destroyed
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - resource "azurerm_storage_container" "main" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - container_access_type   = "private" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - has_immutability_policy = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - has_legal_hold          = false -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - id                      = "https://tfstatea15914974ecf4e4f.blob.core.windows.net/tfstate" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - metadata                = {} -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - name                    = "tfstate" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - resource_manager_id     = "/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc/providers/Microsoft.Storage/storageAccounts/tfstatea15914974ecf4e4f/blobServices/default/containers/tfstate" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - storage_account_name    = "tfstatea15914974ecf4e4f" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   # random_id.storage_account_name will be destroyed
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - resource "random_id" "storage_account_name" {
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - b64_std     = "oVkUl07PTk8=" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - b64_url     = "oVkUl07PTk8" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - byte_length = 8 -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - dec         = "11626346553128472143" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - hex         = "a15914974ecf4e4f" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:       - id          = "oVkUl07PTk8" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:     }
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Plan: 0 to add, 0 to change, 4 to destroy.
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66: Changes to Outputs:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - resource_group_name    = "terraform-30-days-poc" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - storage_account_name   = "tfstatea15914974ecf4e4f" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:25+08:00 logger.go:66:   - storage_container_name = "tfstate" -> null
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:37+08:00 logger.go:66: azurerm_storage_container.main: Destroying... [id=https://tfstatea15914974ecf4e4f.blob.core.windows.net/tfstate]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:38+08:00 logger.go:66: azurerm_storage_container.main: Destruction complete after 2s
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:38+08:00 logger.go:66: azurerm_storage_account.main: Destroying... [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc/providers/Microsoft.Storage/storageAccounts/tfstatea15914974ecf4e4f]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:42+08:00 logger.go:66: azurerm_storage_account.main: Destruction complete after 3s
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:42+08:00 logger.go:66: azurerm_resource_group.rg: Destroying... [id=/subscriptions/6fce7237-7e8e-4053-8e7d-ecf8a7c392ce/resourceGroups/terraform-30-days-poc]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:42+08:00 logger.go:66: random_id.storage_account_name: Destroying... [id=oVkUl07PTk8]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:42+08:00 logger.go:66: random_id.storage_account_name: Destruction complete after 0s
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:52+08:00 logger.go:66: azurerm_resource_group.rg: Still destroying... [id=/subscriptions/6fce7237-7e8e-4053-8e7d-...e/resourceGroups/terraform-30-days-poc, 10s elapsed]
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:59+08:00 logger.go:66: azurerm_resource_group.rg: Destruction complete after 17s
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:59+08:00 logger.go:66:
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:59+08:00 logger.go:66: Destroy complete! Resources: 4 destroyed.
TestTerraformAzureResourceGroupExample 2021-09-27T22:52:59+08:00 logger.go:66:
--- PASS: TestTerraformAzureResourceGroupExample (117.23s)
PASS
ok  	github.com/chechiachang/terraform-30-days/azure/test	117.471s

使用 go test --verbose 查看完整的内容

  • golang test 中,透过 terratest,会实际 init & plan & apply 内容
  • 过程中透过 azure api 检查产生内容
  • 结束後 defer 清除测试用 infrastructure

write test

如何写出 *_test.go

  • 如果对於 golang 十分熟系的人,可以直接写测试案例
  • 不熟悉的人可以直接参考 terratest 提供的 example 做修改
  • 或是复制本 repository 的部分内容
├── azure
│   ├── _poc
│   └── test
├── go.mod
└── go.sum

test or not test

团队是否要写 terratest?

  • 自动化测试需要花时间写
  • 自动化测试随着开发,会需要额外维护成本

承接上篇内容,请先完成成本比较低的测试

  • 自动化 validate / format
  • variable custom validation
  • auto plan & auto apply

在与 app 的 end-to-end 做整合,作为 infrastructure functional test 的一部分

最後再考虑写 terratest 的整合测试

  • 如果发现使用的 module 非常复杂,可以考虑为这个 module 写测试
  • 如果发现花在 manual test 的时间成本越来越多,可以考虑将手动测试转成自动化测试

<<:  用 Line LIFF APP 实现信箱验证绑定功能(4) - 表单验证电子邮件地址

>>:  [DAY 14] _最小系统板规划

Day1 参赛前言

紧张紧张,刺激刺激,从去年下半年才参加UI/UX设计班的菜逼八,今年居然就自不量力的参加传说中的铁人...

【Day 07】tuple 介绍!

前言 今天要来继续接着介绍 tuple 的使用方法,包含了 Unpack(拆包),还有取出 tupl...

如何下载安装 WordPress 站台,设定资料库连线,建立全新部落格 (适用 IIS 架站)

全球有超过 42% 的网站使用 WordPress 架设,WordPress 适合架设部落格、小型企...

能够滑起来的UICollectionView Day9

今天恢复了点元气,终於能好好做事了。 萤幕录制 2021-09-13 下午7.44.19.mov 目...

Intro

屯马开通真的很兴奋 早阵子(2021 年 6 月 27 日)港铁屯马綫全綫通车,当日有电视台访问了一...