Skip to content

Commit a134f9e

Browse files
committed
KUBE-997: refactor
1 parent 7f646db commit a134f9e

2 files changed

Lines changed: 128 additions & 54 deletions

File tree

castai/data_source_gke.go

Lines changed: 56 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,37 @@ import (
88

99
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1010
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1112
)
1213

1314
const (
1415
// GKEPoliciesResourceName is the name of the resource
1516
GKEPoliciesResourceName = "policy"
16-
// GKELoadBalancersNetworkEndpointGroupPoliciesResourceName is the name of the resource
17-
GKELoadBalancersNetworkEndpointGroupPoliciesResourceName = "castai_gke_load_balancers_network_endpoint_group_policies"
18-
// GKELoadBalancersTargetBackendPoolsPoliciesResourceName is the name of the resource
19-
GKELoadBalancersTargetBackendPoolsPoliciesResourceName = "castai_gke_load_balancers_target_backend_pools_policies"
20-
// GKELoadBalancersUnmanagedInstanceGroupsPoliciesResourceName is the name of the resource
21-
GKELoadBalancersUnmanagedInstanceGroupsPoliciesResourceName = "castai_gke_load_balancers_unmanaged_instance_groups_policies"
17+
// GKEFeaturesResourceName is the name of the policies per feature
18+
GKEFeaturesResourceName = "features"
19+
GKELoadBalancersNetworkEndpointGroupFeature = "load_balancers_network_endpoint_group"
20+
GKELoadBalancersTargetBackendPoolsFeature = "load_balancers_target_backend_pools"
21+
GKELoadBalancersUnmanagedInstanceGroupsFeature = "load_balancers_unmanaged_instance_groups"
2222
)
2323

2424
func dataSourceGKEPolicies() *schema.Resource {
2525
return &schema.Resource{
2626
ReadContext: dataSourceGKEPoliciesRead,
2727
Schema: map[string]*schema.Schema{
28-
GKEPoliciesResourceName: {
29-
Type: schema.TypeList,
30-
Computed: true,
31-
Elem: &schema.Schema{Type: schema.TypeString},
32-
},
33-
GKELoadBalancersNetworkEndpointGroupPoliciesResourceName: {
34-
Type: schema.TypeList,
35-
Computed: true,
36-
Elem: &schema.Schema{Type: schema.TypeString},
37-
},
38-
GKELoadBalancersTargetBackendPoolsPoliciesResourceName: {
28+
GKEFeaturesResourceName: {
3929
Type: schema.TypeList,
4030
Computed: true,
41-
Elem: &schema.Schema{Type: schema.TypeString},
31+
Default: []string{},
32+
Elem: &schema.Schema{
33+
Type: schema.TypeString,
34+
ValidateFunc: validation.StringInSlice([]string{
35+
GKELoadBalancersNetworkEndpointGroupFeature,
36+
GKELoadBalancersTargetBackendPoolsFeature,
37+
GKELoadBalancersUnmanagedInstanceGroupsFeature,
38+
}, false),
39+
},
4240
},
43-
GKELoadBalancersUnmanagedInstanceGroupsPoliciesResourceName: {
41+
GKEPoliciesResourceName: {
4442
Type: schema.TypeList,
4543
Computed: true,
4644
Elem: &schema.Schema{Type: schema.TypeString},
@@ -49,52 +47,56 @@ func dataSourceGKEPolicies() *schema.Resource {
4947
}
5048
}
5149

52-
func dataSourceGKEPoliciesRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
53-
var diags diag.Diagnostics
54-
diags = append(diags, dataSourceGKEUserPoliciesRead(ctx, data, meta)...)
55-
diags = append(diags, dataSourceGKELoadBalancersNetworkEndpointGroupPoliciesRead(ctx, data, meta)...)
56-
diags = append(diags, dataSourceGKELoadBalancersTargetBackendPoolsPoliciesRead(ctx, data, meta)...)
57-
diags = append(diags, dataSourceGKELoadBalancersUnmanagedInstanceGroupsPoliciesRead(ctx, data, meta)...)
50+
func dataSourceGKEPoliciesRead(_ context.Context, data *schema.ResourceData, _ interface{}) diag.Diagnostics {
51+
// add policies per specified features
52+
features := data.Get(GKEFeaturesResourceName).([]interface{})
53+
policySet := make(map[string]struct{})
5854

59-
return diags
60-
}
55+
for _, feature := range features {
56+
var err error
57+
var policies []string
6158

62-
func dataSourceGKEUserPoliciesRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
63-
policies, _ := gke.GetUserPolicy()
64-
data.SetId("gke")
65-
if err := data.Set(GKEPoliciesResourceName, policies); err != nil {
66-
return diag.FromErr(fmt.Errorf("setting gke policy: %w", err))
67-
}
59+
switch feature {
60+
case GKELoadBalancersNetworkEndpointGroupFeature:
61+
policies, err = gke.GetLoadBalancersNetworkEndpointGroupPolicy()
62+
case GKELoadBalancersTargetBackendPoolsFeature:
63+
policies, err = gke.GetLoadBalancersTargetBackendPoolsPolicy()
64+
case GKELoadBalancersUnmanagedInstanceGroupsFeature:
65+
policies, err = gke.GetLoadBalancersUnmanagedInstanceGroupsPolicy()
66+
}
6867

69-
return nil
70-
}
68+
if err != nil {
69+
return diag.FromErr(fmt.Errorf("getting %s policy: %w", feature, err))
70+
}
7171

72-
func dataSourceGKELoadBalancersNetworkEndpointGroupPoliciesRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
73-
policies, _ := gke.GetLoadBalancersNetworkEndpointGroupPolicy()
74-
data.SetId("gke")
75-
if err := data.Set(GKELoadBalancersNetworkEndpointGroupPoliciesResourceName, policies); err != nil {
76-
return diag.FromErr(fmt.Errorf("setting gke policy: %w", err))
72+
policySet = appendArrayToMap(policies, policySet)
7773
}
7874

79-
return nil
80-
}
75+
// add base user policies
76+
userPolicy, err := gke.GetUserPolicy()
77+
if err != nil {
78+
return diag.FromErr(fmt.Errorf("getting user policy: %w", err))
79+
}
80+
policySet = appendArrayToMap(userPolicy, policySet)
8181

82-
func dataSourceGKELoadBalancersTargetBackendPoolsPoliciesRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
83-
policies, _ := gke.GetLoadBalancersTargetBackendPoolsPolicy()
84-
data.SetId("gke")
85-
if err := data.Set(GKELoadBalancersTargetBackendPoolsPoliciesResourceName, policies); err != nil {
86-
return diag.FromErr(fmt.Errorf("setting gke policy: %w", err))
82+
var allPolicies []string
83+
for policy := range policySet {
84+
allPolicies = append(allPolicies, policy)
85+
}
86+
87+
if err := data.Set(GKEPoliciesResourceName, allPolicies); err != nil {
88+
return diag.FromErr(fmt.Errorf("setting %s policy: %w", GKEPoliciesResourceName, err))
8789
}
8890

8991
return nil
9092
}
9193

92-
func dataSourceGKELoadBalancersUnmanagedInstanceGroupsPoliciesRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
93-
policies, _ := gke.GetLoadBalancersUnmanagedInstanceGroupsPolicy()
94-
data.SetId("gke")
95-
if err := data.Set(GKELoadBalancersUnmanagedInstanceGroupsPoliciesResourceName, policies); err != nil {
96-
return diag.FromErr(fmt.Errorf("setting gke policy: %w", err))
94+
func appendArrayToMap(arr []string, m map[string]struct{}) map[string]struct{} {
95+
if m == nil {
96+
m = make(map[string]struct{})
9797
}
98-
99-
return nil
98+
for _, v := range arr {
99+
m[v] = struct{}{}
100+
}
101+
return m
100102
}

castai/data_source_gke_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package castai
2+
3+
import (
4+
"context"
5+
"github.com/castai/terraform-provider-castai/castai/policies/gke"
6+
"github.com/castai/terraform-provider-castai/castai/sdk"
7+
mock_sdk "github.com/castai/terraform-provider-castai/castai/sdk/mock"
8+
"github.com/golang/mock/gomock"
9+
"github.com/hashicorp/go-cty/cty"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
11+
"github.com/stretchr/testify/require"
12+
"testing"
13+
)
14+
15+
func Test_dataSourceGKEPoliciesRead(t *testing.T) {
16+
up, _ := gke.GetUserPolicy()
17+
lbNeg, _ := gke.GetLoadBalancersNetworkEndpointGroupPolicy()
18+
lbTbp, _ := gke.GetLoadBalancersTargetBackendPoolsPolicy()
19+
lbUig, _ := gke.GetLoadBalancersUnmanagedInstanceGroupsPolicy()
20+
tests := []struct {
21+
name string
22+
features []interface{}
23+
expected int
24+
hasError bool
25+
}{
26+
{
27+
name: "all features",
28+
features: []interface{}{
29+
GKELoadBalancersNetworkEndpointGroupFeature,
30+
GKELoadBalancersTargetBackendPoolsFeature,
31+
GKELoadBalancersUnmanagedInstanceGroupsFeature,
32+
},
33+
expected: len(up) + len(lbNeg) + len(lbTbp) + len(lbUig) - 1, // -1 for the duplicate policy
34+
hasError: false,
35+
},
36+
{
37+
name: "empty features",
38+
expected: len(up),
39+
hasError: false,
40+
},
41+
}
42+
43+
for _, tt := range tests {
44+
t.Run(tt.name, func(t *testing.T) {
45+
r := require.New(t)
46+
mockClient := mock_sdk.NewMockClientInterface(gomock.NewController(t))
47+
48+
ctx := context.Background()
49+
provider := &ProviderConfig{
50+
api: &sdk.ClientWithResponses{
51+
ClientInterface: mockClient,
52+
},
53+
}
54+
55+
state := terraform.NewInstanceStateShimmedFromValue(cty.ObjectVal(map[string]cty.Value{}), 0)
56+
57+
resource := dataSourceGKEPolicies()
58+
data := resource.Data(state)
59+
r.NoError(data.Set(GKEFeaturesResourceName, tt.features))
60+
61+
result := resource.ReadContext(ctx, data, provider)
62+
if tt.hasError {
63+
r.True(result.HasError())
64+
} else {
65+
r.Nil(result)
66+
r.False(result.HasError())
67+
actualPolicies := data.Get(GKEPoliciesResourceName).([]interface{})
68+
r.Len(actualPolicies, tt.expected)
69+
}
70+
})
71+
}
72+
}

0 commit comments

Comments
 (0)