From 005854ebcda091cb31db8f778ce4fcad5dce9f54 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 13:46:09 +0000 Subject: [PATCH 1/8] Avoid re-creation of instance when cluster not yet ready and storage type is wrong --- .../terraform/services/bigtable/resource_bigtable_instance.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index 1b0b8d208c30..3a492d6174a6 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -418,6 +418,7 @@ func flattenBigtableCluster(c *bigtable.ClusterInfo) map[string]interface{} { "cluster_id": c.Name, "storage_type": storageType, "kms_key_name": c.KMSKeyName, + "state": c.State, } if c.AutoscalingConfig != nil { cluster["autoscaling_config"] = make([]map[string]interface{}, 1) @@ -652,8 +653,9 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch } } + currentState, _ := diff.GetChange(fmt.Sprintf("cluster.%d.state", i)) oST, nST := diff.GetChange(fmt.Sprintf("cluster.%d.storage_type", i)) - if oST != nST { + if oST != nST && currentState != "CREATING" { err := diff.ForceNew(fmt.Sprintf("cluster.%d.storage_type", i)) if err != nil { return fmt.Errorf("Error setting cluster diff: %s", err) From d731765dd09bf368ac7dc9df0b18205ff91bc34c Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 14:12:06 +0000 Subject: [PATCH 2/8] Fix casting issue --- .../terraform/services/bigtable/resource_bigtable_instance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index 3a492d6174a6..9b5eb5fb954f 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -655,7 +655,7 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch currentState, _ := diff.GetChange(fmt.Sprintf("cluster.%d.state", i)) oST, nST := diff.GetChange(fmt.Sprintf("cluster.%d.storage_type", i)) - if oST != nST && currentState != "CREATING" { + if oST != nST && currentState.(string) != "CREATING" { err := diff.ForceNew(fmt.Sprintf("cluster.%d.storage_type", i)) if err != nil { return fmt.Errorf("Error setting cluster diff: %s", err) From 51d5b9f1bc7988433372258c103da63b6b89afc5 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 16:08:45 +0000 Subject: [PATCH 3/8] First prototype using computed state --- .../services/bigtable/resource_bigtable_instance.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index 9b5eb5fb954f..48fa392040b6 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -63,6 +63,11 @@ func ResourceBigtableInstance() *schema.Resource { Description: `A block of cluster configuration options. This can be specified at least once.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "state": { + Type: schema.TypeString, + Computed: true, + Description: `Please don't tell anyone how I live`, + }, "cluster_id": { Type: schema.TypeString, Required: true, @@ -589,7 +594,9 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch for i := 0; i < newCount.(int); i++ { _, newId := diff.GetChange(fmt.Sprintf("cluster.%d.cluster_id", i)) _, c := diff.GetChange(fmt.Sprintf("cluster.%d", i)) - clusters[newId.(string)] = c + typedCluster, _ := c.(map[string]interface{}) + typedCluster["state"] = "READY" + clusters[newId.(string)] = typedCluster } // create a list of clusters using the old order when possible to minimise From 2bb7563e184118b530276d78a461e346a48d8cf5 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 16:59:22 +0000 Subject: [PATCH 4/8] Added tests --- .../bigtable/resource_bigtable_instance.go | 5 +- ...esource_bigtable_instance_internal_test.go | 68 ++++++++++++++++++- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index 48fa392040b6..a19cd1fa2624 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -64,9 +64,8 @@ func ResourceBigtableInstance() *schema.Resource { Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "state": { - Type: schema.TypeString, - Computed: true, - Description: `Please don't tell anyone how I live`, + Type: schema.TypeString, + Computed: true, }, "cluster_id": { Type: schema.TypeString, diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go index 6fcc7ab1f6c1..d90771540631 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func TestGetUnavailableClusterZones(t *testing.T) { +func TestUnitBigtable_getUnavailableClusterZones(t *testing.T) { cases := map[string]struct { clusterZones []string unavailableZones []string @@ -54,7 +54,7 @@ func TestGetUnavailableClusterZones(t *testing.T) { } } -func TestGetInstanceFromResponse(t *testing.T) { +func TestUnitBigtable_getInstanceFromResponse(t *testing.T) { instanceName := "test-instance" originalId := "original_value" cases := map[string]struct { @@ -130,3 +130,67 @@ func TestGetInstanceFromResponse(t *testing.T) { } } } + +func TestUnitBigtable_flattenBigtableCluster(t *testing.T) { + cases := map[string]struct { + clusterInfo *bigtable.ClusterInfo + want map[string]interface{} + }{ + "SSD auto scaling": { + clusterInfo: &bigtable.ClusterInfo{ + StorageType: bigtable.SSD, + Zone: "zone1", + ServeNodes: 5, + Name: "ssd-cluster", + KMSKeyName: "KMS", + State: "CREATING", + AutoscalingConfig: &bigtable.AutoscalingConfig{ + MinNodes: 3, + MaxNodes: 7, + CPUTargetPercent: 50, + StorageUtilizationPerNode: 60, + }, + }, + want: map[string]interface{}{ + "zone": "zone1", + "num_nodes": 5, + "cluster_id": "ssd-cluster", + "storage_type": "SSD", + "kms_key_name": "KMS", + "state": "CREATING", + "autoscaling_config": []map[string]interface{}{ + map[string]interface{}{ + "min_nodes": 3, + "max_nodes": 7, + "cpu_target": 50, + "storage_target": 60, + }, + }, + }, + }, + "HDD manual scaling": { + clusterInfo: &bigtable.ClusterInfo{ + StorageType: bigtable.HDD, + Zone: "zone2", + ServeNodes: 7, + Name: "hdd-cluster", + KMSKeyName: "KMS", + State: "READY", + }, + want: map[string]interface{}{ + "zone": "zone2", + "num_nodes": 7, + "cluster_id": "hdd-cluster", + "storage_type": "HDD", + "kms_key_name": "KMS", + "state": "READY", + }, + }, + } + + for tn, tc := range cases { + if got := flattenBigtableCluster(tc.clusterInfo); !reflect.DeepEqual(got, tc.want) { + t.Errorf("bad: %s, got %q, want %q", tn, got, tc.want) + } + } +} From 1001d439881b9a2701e50a433e3a9b45b6c8a90c Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 18:28:55 +0000 Subject: [PATCH 5/8] Add more tests --- .../bigtable/resource_bigtable_instance.go | 32 ++-- ...esource_bigtable_instance_internal_test.go | 171 ++++++++++++++++++ 2 files changed, 190 insertions(+), 13 deletions(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index a19cd1fa2624..27f074f260b8 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -564,19 +564,30 @@ func resourceBigtableInstanceUniqueClusterID(_ context.Context, diff *schema.Res // This doesn't use the standard unordered list utility (https://github.com/GoogleCloudPlatform/magic-modules/blob/main/templates/terraform/unordered_list_customize_diff.erb) // because some fields can't be modified using the API and we recreate the instance // when they're changed. -func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *schema.ResourceDiff, meta interface{}) error { +func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *schema.ResourceDiff, _ interface{}) error { + // separate func to allow unit testing + orderedClusters, err := resourceBigtableInstanceClusterReorderTypeListFunc(diff) + if err != nil { + return err + } + if err := diff.SetNew("cluster", orderedClusters); err != nil { + return fmt.Errorf("Error setting cluster diff: %s", err) + } + return nil +} +func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.TerraformResourceDiff) ([]interface{}, error) { oldCount, newCount := diff.GetChange("cluster.#") // Simulate Required:true, MinItems:1 for "cluster". This doesn't work // when the whole `cluster` field is removed on update. if newCount.(int) < 1 { - return fmt.Errorf("config is invalid: Too few cluster blocks: Should have at least 1 \"cluster\" block") + return nil, fmt.Errorf("config is invalid: Too few cluster blocks: Should have at least 1 \"cluster\" block") } // exit early if we're in create (name's old value is nil) n, _ := diff.GetChange("name") if n == nil || n == "" { - return nil + return nil, nil } oldIds := []string{} @@ -593,7 +604,7 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch for i := 0; i < newCount.(int); i++ { _, newId := diff.GetChange(fmt.Sprintf("cluster.%d.cluster_id", i)) _, c := diff.GetChange(fmt.Sprintf("cluster.%d", i)) - typedCluster, _ := c.(map[string]interface{}) + typedCluster := c.(map[string]interface{}) typedCluster["state"] = "READY" clusters[newId.(string)] = typedCluster } @@ -631,11 +642,6 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch } } - err := diff.SetNew("cluster", orderedClusters) - if err != nil { - return fmt.Errorf("Error setting cluster diff: %s", err) - } - // Clusters can't have their zone, storage_type or kms_key_name updated, // ForceNew if it's changed. This will show a diff with the old state on // the left side and the unmodified new state on the right and the ForceNew @@ -655,7 +661,7 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch if oZone != nZone { err := diff.ForceNew(fmt.Sprintf("cluster.%d.zone", i)) if err != nil { - return fmt.Errorf("Error setting cluster diff: %s", err) + return nil, fmt.Errorf("Error setting cluster diff: %s", err) } } @@ -664,7 +670,7 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch if oST != nST && currentState.(string) != "CREATING" { err := diff.ForceNew(fmt.Sprintf("cluster.%d.storage_type", i)) if err != nil { - return fmt.Errorf("Error setting cluster diff: %s", err) + return nil, fmt.Errorf("Error setting cluster diff: %s", err) } } @@ -672,12 +678,12 @@ func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *sch if oKey != nKey { err := diff.ForceNew(fmt.Sprintf("cluster.%d.kms_key_name", i)) if err != nil { - return fmt.Errorf("Error setting cluster diff: %s", err) + return nil, fmt.Errorf("Error setting cluster diff: %s", err) } } } - return nil + return orderedClusters, nil } func resourceBigtableInstanceImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go index d90771540631..9efec3f70b30 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go @@ -8,6 +8,7 @@ import ( "cloud.google.com/go/bigtable" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-provider-google/google/tpgresource" ) func TestUnitBigtable_getUnavailableClusterZones(t *testing.T) { @@ -194,3 +195,173 @@ func TestUnitBigtable_flattenBigtableCluster(t *testing.T) { } } } + +func TestUnitBigtable_resourceBigtableInstanceClusterReorderTypeListFunc_error(t *testing.T) { + d := &tpgresource.ResourceDiffMock{ + After: map[string]interface{}{ + "cluster.#": 0, + }, + } + if _, err := resourceBigtableInstanceClusterReorderTypeListFunc(d); err == nil { + t.Errorf("expected error, got success") + } +} + +func TestUnitBigtable_resourceBigtableInstanceClusterReorderTypeListFunc(t *testing.T) { + cases := map[string]struct { + before map[string]interface{} + after map[string]interface{} + wantClusterOrder []string + wantForceNew bool + }{ + "create": { + before: map[string]interface{}{ + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-a", + }, + }, + wantClusterOrder: []string{}, + wantForceNew: false, + }, + "no force new change": { + before: map[string]interface{}{ + "name": "some-name", + "cluster.#": 4, + "cluster.0.cluster_id": "some-id-a", + "cluster.1.cluster_id": "some-id-b", + "cluster.2.cluster_id": "some-id-c", + "cluster.3.cluster_id": "some-id-e", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 3, + "cluster.0.cluster_id": "some-id-c", + "cluster.1.cluster_id": "some-id-a", + "cluster.2.cluster_id": "some-id-d", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-c", + }, + "cluster.1": map[string]interface{}{ + "cluster_id": "some-id-a", + }, + "cluster.2": map[string]interface{}{ + "cluster_id": "some-id-d", + }, + }, + wantClusterOrder: []string{"some-id-a", "some-id-d", "some-id-c"}, + wantForceNew: false, + }, + "force new - zone change": { + before: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.zone": "zone-a", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.zone": "zone-b", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-a", + "zone": "zone-b", + }, + }, + wantClusterOrder: []string{"some-id-a"}, + wantForceNew: true, + }, + "force new - kms_key_name change": { + before: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.kms_key_name": "key-a", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.kms_key_name": "key-b", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-a", + "kms_key_name": "key-b", + }, + }, + wantClusterOrder: []string{"some-id-a"}, + wantForceNew: true, + }, + "force new - storage_type change": { + before: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.storage_type": "HDD", + "cluster.0.state": "READY", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.storage_type": "SSD", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-a", + "storage_type": "SSD", + }, + }, + wantClusterOrder: []string{"some-id-a"}, + wantForceNew: true, + }, + "skip force new - storage_type change for CREATING cluster": { + before: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.storage_type": "SSD", + "cluster.0.state": "CREATING", + }, + after: map[string]interface{}{ + "name": "some-name", + "cluster.#": 1, + "cluster.0.cluster_id": "some-id-a", + "cluster.0.storage_type": "HDD", + "cluster.0": map[string]interface{}{ + "cluster_id": "some-id-a", + "storage_type": "HDD", + }, + }, + wantClusterOrder: []string{"some-id-a"}, + wantForceNew: false, + }, + } + for tn, tc := range cases { + t.Run(tn, func(t *testing.T) { + d := &tpgresource.ResourceDiffMock{ + Before: tc.before, + After: tc.after, + } + clusters, err := resourceBigtableInstanceClusterReorderTypeListFunc(d) + if err != nil { + t.Fatalf("bad: %s, error: %v", tn, err) + } + if d.IsForceNew != tc.wantForceNew { + t.Errorf("bad: %s, got %v, want %v", tn, d.IsForceNew, tc.wantForceNew) + } + gotClusterOrder := []string{} + for _, cluster := range clusters { + clusterResource := cluster.(map[string]interface{}) + gotClusterOrder = append(gotClusterOrder, clusterResource["cluster_id"].(string)) + } + if !reflect.DeepEqual(gotClusterOrder, tc.wantClusterOrder) { + t.Errorf("bad: %s, got %q, want %q", tn, gotClusterOrder, tc.wantClusterOrder) + } + }) + } +} From 91795e56fb950372ec621a3e4b4ff1907af49ea5 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Wed, 20 Sep 2023 20:27:55 +0000 Subject: [PATCH 6/8] Fixed description and SetNew usage --- .../bigtable/resource_bigtable_instance.go | 39 ++++++++++--------- ...esource_bigtable_instance_internal_test.go | 8 +++- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go index 27f074f260b8..1bfe69bbfe85 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance.go @@ -63,10 +63,6 @@ func ResourceBigtableInstance() *schema.Resource { Description: `A block of cluster configuration options. This can be specified at least once.`, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "state": { - Type: schema.TypeString, - Computed: true, - }, "cluster_id": { Type: schema.TypeString, Required: true, @@ -131,6 +127,11 @@ func ResourceBigtableInstance() *schema.Resource { }, }, }, + "state": { + Type: schema.TypeString, + Computed: true, + Description: `The state of the cluster`, + }, }, }, }, @@ -566,28 +567,24 @@ func resourceBigtableInstanceUniqueClusterID(_ context.Context, diff *schema.Res // when they're changed. func resourceBigtableInstanceClusterReorderTypeList(_ context.Context, diff *schema.ResourceDiff, _ interface{}) error { // separate func to allow unit testing - orderedClusters, err := resourceBigtableInstanceClusterReorderTypeListFunc(diff) - if err != nil { - return err - } - if err := diff.SetNew("cluster", orderedClusters); err != nil { - return fmt.Errorf("Error setting cluster diff: %s", err) - } - return nil + return resourceBigtableInstanceClusterReorderTypeListFunc(diff, func(orderedClusters []interface{}) error { + return diff.SetNew("cluster", orderedClusters) + }) + } -func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.TerraformResourceDiff) ([]interface{}, error) { +func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.TerraformResourceDiff, setNew func([]interface{}) error) error { oldCount, newCount := diff.GetChange("cluster.#") // Simulate Required:true, MinItems:1 for "cluster". This doesn't work // when the whole `cluster` field is removed on update. if newCount.(int) < 1 { - return nil, fmt.Errorf("config is invalid: Too few cluster blocks: Should have at least 1 \"cluster\" block") + return fmt.Errorf("config is invalid: Too few cluster blocks: Should have at least 1 \"cluster\" block") } // exit early if we're in create (name's old value is nil) n, _ := diff.GetChange("name") if n == nil || n == "" { - return nil, nil + return nil } oldIds := []string{} @@ -642,6 +639,10 @@ func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.Terrafo } } + if err := setNew(orderedClusters); err != nil { + return err + } + // Clusters can't have their zone, storage_type or kms_key_name updated, // ForceNew if it's changed. This will show a diff with the old state on // the left side and the unmodified new state on the right and the ForceNew @@ -661,7 +662,7 @@ func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.Terrafo if oZone != nZone { err := diff.ForceNew(fmt.Sprintf("cluster.%d.zone", i)) if err != nil { - return nil, fmt.Errorf("Error setting cluster diff: %s", err) + return fmt.Errorf("Error setting cluster diff: %s", err) } } @@ -670,7 +671,7 @@ func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.Terrafo if oST != nST && currentState.(string) != "CREATING" { err := diff.ForceNew(fmt.Sprintf("cluster.%d.storage_type", i)) if err != nil { - return nil, fmt.Errorf("Error setting cluster diff: %s", err) + return fmt.Errorf("Error setting cluster diff: %s", err) } } @@ -678,12 +679,12 @@ func resourceBigtableInstanceClusterReorderTypeListFunc(diff tpgresource.Terrafo if oKey != nKey { err := diff.ForceNew(fmt.Sprintf("cluster.%d.kms_key_name", i)) if err != nil { - return nil, fmt.Errorf("Error setting cluster diff: %s", err) + return fmt.Errorf("Error setting cluster diff: %s", err) } } } - return orderedClusters, nil + return nil } func resourceBigtableInstanceImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { diff --git a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go index 9efec3f70b30..acc71d2397bb 100644 --- a/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go +++ b/mmv1/third_party/terraform/services/bigtable/resource_bigtable_instance_internal_test.go @@ -202,7 +202,7 @@ func TestUnitBigtable_resourceBigtableInstanceClusterReorderTypeListFunc_error(t "cluster.#": 0, }, } - if _, err := resourceBigtableInstanceClusterReorderTypeListFunc(d); err == nil { + if err := resourceBigtableInstanceClusterReorderTypeListFunc(d, nil); err == nil { t.Errorf("expected error, got success") } } @@ -347,7 +347,11 @@ func TestUnitBigtable_resourceBigtableInstanceClusterReorderTypeListFunc(t *test Before: tc.before, After: tc.after, } - clusters, err := resourceBigtableInstanceClusterReorderTypeListFunc(d) + var clusters []interface{} + err := resourceBigtableInstanceClusterReorderTypeListFunc(d, func(gotClusters []interface{}) error { + clusters = gotClusters + return nil + }) if err != nil { t.Fatalf("bad: %s, error: %v", tn, err) } From 2818066bf4b98493beb9bf4cece9f14b77f11e27 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Fri, 22 Sep 2023 18:41:59 +0000 Subject: [PATCH 7/8] Update website --- .../terraform/website/docs/r/bigtable_instance.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown b/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown index 1dbe10bfed87..e5a24f976b9f 100644 --- a/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown +++ b/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown @@ -142,6 +142,7 @@ If no value is set, Cloud Bigtable automatically allocates nodes based on your d In addition to the arguments listed above, the following computed attributes are exported: * `id` - an identifier for the resource with format `projects/{{project}}/instances/{{name}}` +* `state` - describes the current state of the cluster. ## Timeouts From 6785ac722aee9956ae04f28aa5bb03fa68534fe7 Mon Sep 17 00:00:00 2001 From: Ron Gal Date: Fri, 22 Sep 2023 18:43:05 +0000 Subject: [PATCH 8/8] Update website --- .../terraform/website/docs/r/bigtable_instance.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown b/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown index e5a24f976b9f..a6f1d14cb34f 100644 --- a/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown +++ b/mmv1/third_party/terraform/website/docs/r/bigtable_instance.html.markdown @@ -142,7 +142,7 @@ If no value is set, Cloud Bigtable automatically allocates nodes based on your d In addition to the arguments listed above, the following computed attributes are exported: * `id` - an identifier for the resource with format `projects/{{project}}/instances/{{name}}` -* `state` - describes the current state of the cluster. +* `cluster.0.state` - describes the current state of the cluster. ## Timeouts