From 12098eeeefa1f31632fd34cae2b966e477ba4ab4 Mon Sep 17 00:00:00 2001 From: Andrew Peabody Date: Fri, 9 Feb 2024 19:14:38 +0000 Subject: [PATCH] fix: mutex for tft init --- .../examples/simple_krm_blueprint/pod.yaml | 1 - infra/blueprint-test/pkg/tft/terraform.go | 14 ++++++++++++++ .../test/krm_simple_blueprint_test.go | 4 +++- infra/blueprint-test/test/setup/main.tf | 4 ++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/infra/blueprint-test/examples/simple_krm_blueprint/pod.yaml b/infra/blueprint-test/examples/simple_krm_blueprint/pod.yaml index de78753e8ca8..690853cc2ab2 100644 --- a/infra/blueprint-test/examples/simple_krm_blueprint/pod.yaml +++ b/infra/blueprint-test/examples/simple_krm_blueprint/pod.yaml @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - apiVersion: v1 kind: Pod metadata: diff --git a/infra/blueprint-test/pkg/tft/terraform.go b/infra/blueprint-test/pkg/tft/terraform.go index 24647d70aa80..6b0b61fdeb71 100644 --- a/infra/blueprint-test/pkg/tft/terraform.go +++ b/infra/blueprint-test/pkg/tft/terraform.go @@ -24,6 +24,7 @@ import ( "path" "path/filepath" "strings" + "sync" gotest "testing" "time" @@ -73,6 +74,7 @@ type TFBlueprintTest struct { verify func(*assert.Assertions) // verify function teardown func(*assert.Assertions) // teardown function setupOutputOverrides map[string]interface{} // override outputs from the Setup phase + tftCacheMutex sync.RWMutex // Mutex to protect Terraform plugin cache } type tftOption func(*TFBlueprintTest) @@ -481,21 +483,33 @@ func (b *TFBlueprintTest) DefaultApply(assert *assert.Assertions) { // Init runs the default or custom init function for the blueprint. func (b *TFBlueprintTest) Init(assert *assert.Assertions) { + // allow only single write Terraform plugin cache isn't concurrent safe + b.tftCacheMutex.Lock() + defer b.tftCacheMutex.Unlock() b.init(assert) } // Apply runs the default or custom apply function for the blueprint. func (b *TFBlueprintTest) Apply(assert *assert.Assertions) { + // allow only parallel reads as Terraform plugin cache isn't concurrent safe + b.tftCacheMutex.RLock() + defer b.tftCacheMutex.RUnlock() b.apply(assert) } // Verify runs the default or custom verify function for the blueprint. func (b *TFBlueprintTest) Verify(assert *assert.Assertions) { + // allow only parallel reads as Terraform plugin cache isn't concurrent safe + b.tftCacheMutex.RLock() + defer b.tftCacheMutex.RUnlock() b.verify(assert) } // Teardown runs the default or custom teardown function for the blueprint. func (b *TFBlueprintTest) Teardown(assert *assert.Assertions) { + // allow only parallel reads as Terraform plugin cache isn't concurrent safe + b.tftCacheMutex.RLock() + defer b.tftCacheMutex.RUnlock() b.teardown(assert) } diff --git a/infra/blueprint-test/test/krm_simple_blueprint_test.go b/infra/blueprint-test/test/krm_simple_blueprint_test.go index f1098dfd80b5..38da3aa0ddaa 100644 --- a/infra/blueprint-test/test/krm_simple_blueprint_test.go +++ b/infra/blueprint-test/test/krm_simple_blueprint_test.go @@ -1,6 +1,7 @@ package test import ( + "strings" "testing" "github.com/GoogleCloudPlatform/cloud-foundation-toolkit/infra/blueprint-test/pkg/gcloud" @@ -26,7 +27,8 @@ func TestKRMSimpleBlueprint(t *testing.T) { k8sOpts := k8s.KubectlOptions{} op, err := k8s.RunKubectlAndGetOutputE(t, &k8sOpts, "get", "pod", "simple-krm-blueprint", "--no-headers", "-o", "custom-columns=:metadata.name") assert.NoError(err) - assert.Equal("simple-krm-blueprint", op) + result := strings.Split(op, "\n") + assert.Equal("simple-krm-blueprint", result[len(result)-1]) }) networkBlueprint.Test() } diff --git a/infra/blueprint-test/test/setup/main.tf b/infra/blueprint-test/test/setup/main.tf index 0f46477fab44..ebeccc0eba60 100644 --- a/infra/blueprint-test/test/setup/main.tf +++ b/infra/blueprint-test/test/setup/main.tf @@ -1,5 +1,5 @@ /** - * Copyright 2021-2023 Google LLC + * Copyright 2021-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,6 +64,6 @@ resource "google_service_account_key" "key" { module "kubernetes-engine_example_simple_autopilot_public" { source = "terraform-google-modules/kubernetes-engine/google//examples/simple_autopilot_public" - version = "~> 26.0" + version = "~> 30.0" project_id = module.project.project_id }