From 8079367edbc4f313160a946498723dae7328de86 Mon Sep 17 00:00:00 2001 From: The Magician Date: Wed, 18 Jan 2023 14:46:23 -0800 Subject: [PATCH] Share settings for sole-tenant node groups. (#7059) (#1298) * Share settings for sole-tenant node groups. * Fixes after review. Co-authored-by: Igor Dyczko Signed-off-by: Modular Magician Signed-off-by: Modular Magician Co-authored-by: Igor Dyczko --- .../google/resources/compute_node_group.go | 67 +++++++++++++++++++ go.mod | 2 +- go.sum | 4 +- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/converters/google/resources/compute_node_group.go b/converters/google/resources/compute_node_group.go index c6b9da057..df677c414 100644 --- a/converters/google/resources/compute_node_group.go +++ b/converters/google/resources/compute_node_group.go @@ -17,6 +17,8 @@ package google import ( "fmt" "reflect" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) const ComputeNodeGroupAssetType string = "compute.googleapis.com/NodeGroup" @@ -93,6 +95,12 @@ func GetComputeNodeGroupApiObject(d TerraformResourceData, config *Config) (map[ } else if v, ok := d.GetOkExists("autoscaling_policy"); !isEmptyValue(reflect.ValueOf(autoscalingPolicyProp)) && (ok || !reflect.DeepEqual(v, autoscalingPolicyProp)) { obj["autoscalingPolicy"] = autoscalingPolicyProp } + shareSettingsProp, err := expandComputeNodeGroupShareSettings(d.Get("share_settings"), d, config) + if err != nil { + return nil, err + } else if v, ok := d.GetOkExists("share_settings"); !isEmptyValue(reflect.ValueOf(shareSettingsProp)) && (ok || !reflect.DeepEqual(v, shareSettingsProp)) { + obj["shareSettings"] = shareSettingsProp + } zoneProp, err := expandComputeNodeGroupZone(d.Get("zone"), d, config) if err != nil { return nil, err @@ -195,6 +203,65 @@ func expandComputeNodeGroupAutoscalingPolicyMaxNodes(v interface{}, d TerraformR return v, nil } +func expandComputeNodeGroupShareSettings(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil, nil + } + raw := l[0] + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedShareType, err := expandComputeNodeGroupShareSettingsShareType(original["share_type"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedShareType); val.IsValid() && !isEmptyValue(val) { + transformed["shareType"] = transformedShareType + } + + transformedProjectMap, err := expandComputeNodeGroupShareSettingsProjectMap(original["project_map"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedProjectMap); val.IsValid() && !isEmptyValue(val) { + transformed["projectMap"] = transformedProjectMap + } + + return transformed, nil +} + +func expandComputeNodeGroupShareSettingsShareType(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandComputeNodeGroupShareSettingsProjectMap(v interface{}, d TerraformResourceData, config *Config) (map[string]interface{}, error) { + if v == nil { + return map[string]interface{}{}, nil + } + m := make(map[string]interface{}) + for _, raw := range v.(*schema.Set).List() { + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedProjectId, err := expandComputeNodeGroupShareSettingsProjectMapProjectId(original["project_id"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedProjectId); val.IsValid() && !isEmptyValue(val) { + transformed["projectId"] = transformedProjectId + } + + transformedId, err := expandString(original["id"], d, config) + if err != nil { + return nil, err + } + m[transformedId] = transformed + } + return m, nil +} + +func expandComputeNodeGroupShareSettingsProjectMapProjectId(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + func expandComputeNodeGroupZone(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { f, err := parseGlobalFieldValue("zones", v.(string), "project", d, config, true) if err != nil { diff --git a/go.mod b/go.mod index 3fdb7fc6c..336d77bf2 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/terraform-json v0.14.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0 - github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118213923-9f3cbacf9ab7 + github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118224110-523f075a77ef github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.0 diff --git a/go.sum b/go.sum index c9db2c465..ae9e2db94 100644 --- a/go.sum +++ b/go.sum @@ -514,8 +514,8 @@ github.com/hashicorp/terraform-plugin-log v0.7.0 h1:SDxJUyT8TwN4l5b5/VkiTIaQgY6R github.com/hashicorp/terraform-plugin-log v0.7.0/go.mod h1:p4R1jWBXRTvL4odmEkFfDdhUjHf9zcs/BCoNHAc7IK4= github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0 h1:FtCLTiTcykdsURXPt/ku7fYXm3y19nbzbZcUxHx9RbI= github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0/go.mod h1:80wf5oad1tW+oLnbXS4UTYmDCrl7BuN1Q+IA91X1a4Y= -github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118213923-9f3cbacf9ab7 h1:CV0KQTYLgsFI3FGbPkOWhW9Mqr5W8MkrU44G+WITLbY= -github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118213923-9f3cbacf9ab7/go.mod h1:hO1IJNy6D0qbRLaGdfmGGERihNWUKSKKL5TU8hNOgRg= +github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118224110-523f075a77ef h1:by+rVUioZ2I0d+r6HN7TYkz05eIGcY0JFk6fkaxKBzE= +github.com/hashicorp/terraform-provider-google v1.20.1-0.20230118224110-523f075a77ef/go.mod h1:hO1IJNy6D0qbRLaGdfmGGERihNWUKSKKL5TU8hNOgRg= github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c h1:D8aRO6+mTqHfLsK/BC3j5OAoogv1WLRWzY1AaTo3rBg= github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c/go.mod h1:Wn3Na71knbXc1G8Lh+yu/dQWWJeFQEpDeJMtWMtlmNI= github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0=