Skip to content

Commit db34179

Browse files
authored
Fix cluster role aggregation rules selectors (#1697)
1 parent 8b6cab3 commit db34179

File tree

3 files changed

+225
-4
lines changed

3 files changed

+225
-4
lines changed

kubernetes/resource_kubernetes_cluster_role_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,46 @@ func TestAccKubernetesClusterRole_aggregationRuleBasic(t *testing.T) {
182182
})
183183
}
184184

185+
func TestAccKubernetesClusterRole_aggregationRuleMultiple(t *testing.T) {
186+
var conf api.ClusterRole
187+
resourceName := "kubernetes_cluster_role.test"
188+
name := acctest.RandomWithPrefix("tf-acc-test")
189+
resource.Test(t, resource.TestCase{
190+
PreCheck: func() { testAccPreCheck(t) },
191+
IDRefreshName: resourceName,
192+
ProviderFactories: testAccProviderFactories,
193+
CheckDestroy: testAccCheckKubernetesClusterRoleDestroy,
194+
Steps: []resource.TestStep{
195+
{
196+
Config: testAccKubernetesClusterRoleConfig_aggRuleMultiple(name),
197+
Check: resource.ComposeAggregateTestCheckFunc(
198+
testAccCheckKubernetesClusterRoleExists(resourceName, &conf),
199+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.#", "1"),
200+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.#", "2"),
201+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.0.match_labels.foo", "bar"),
202+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.1.match_labels.bar", "foo"),
203+
),
204+
},
205+
{
206+
ResourceName: resourceName,
207+
ImportState: true,
208+
ImportStateVerify: true,
209+
ImportStateVerifyIgnore: []string{"metadata.0.resource_version"},
210+
},
211+
{
212+
Config: testAccKubernetesClusterRoleConfig_aggRuleMultipleModified(name),
213+
Check: resource.ComposeAggregateTestCheckFunc(
214+
testAccCheckKubernetesClusterRoleExists(resourceName, &conf),
215+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.#", "1"),
216+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.#", "2"),
217+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.0.match_labels.bar", "foo"),
218+
resource.TestCheckResourceAttr(resourceName, "aggregation_rule.0.cluster_role_selectors.1.match_labels.foo", "bar"),
219+
),
220+
},
221+
},
222+
})
223+
}
224+
185225
func TestAccKubernetesClusterRole_aggregationRuleRuleAggregation(t *testing.T) {
186226
var conf api.ClusterRole
187227
resourceName := "kubernetes_cluster_role.test"
@@ -447,6 +487,50 @@ func testAccKubernetesClusterRoleConfig_aggRuleModified(name string) string {
447487
`, name)
448488
}
449489

490+
func testAccKubernetesClusterRoleConfig_aggRuleMultiple(name string) string {
491+
return fmt.Sprintf(`resource "kubernetes_cluster_role" "test" {
492+
metadata {
493+
name = "%s"
494+
}
495+
496+
aggregation_rule {
497+
cluster_role_selectors {
498+
match_labels = {
499+
foo = "bar"
500+
}
501+
}
502+
cluster_role_selectors {
503+
match_labels = {
504+
bar = "foo"
505+
}
506+
}
507+
}
508+
}
509+
`, name)
510+
}
511+
512+
func testAccKubernetesClusterRoleConfig_aggRuleMultipleModified(name string) string {
513+
return fmt.Sprintf(`resource "kubernetes_cluster_role" "test" {
514+
metadata {
515+
name = "%s"
516+
}
517+
518+
aggregation_rule {
519+
cluster_role_selectors {
520+
match_labels = {
521+
bar = "foo"
522+
}
523+
}
524+
cluster_role_selectors {
525+
match_labels = {
526+
foo = "bar"
527+
}
528+
}
529+
}
530+
}
531+
`, name)
532+
}
533+
450534
func testAccKubernetesClusterRoleConfig_aggRule2(name string) string {
451535
return fmt.Sprintf(`resource "kubernetes_cluster_role" "test" {
452536
metadata {

kubernetes/structures_rbac.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ func expandClusterRoleAggregationRule(in []interface{}) *api.AggregationRule {
8888
m := in[0].(map[string]interface{})
8989

9090
if v, ok := m["cluster_role_selectors"].([]interface{}); ok && len(v) > 0 {
91-
crs := make([]metav1.LabelSelector, 0)
92-
crs = append(crs, *expandLabelSelector(v))
91+
crs := make([]metav1.LabelSelector, len(v))
92+
for i, w := range v {
93+
crs[i] = *expandLabelSelector([]interface{}{w})
94+
}
9395
ref.ClusterRoleSelectors = crs
9496
}
9597

@@ -142,9 +144,11 @@ func flattenClusterRoleAggregationRule(in *api.AggregationRule) []interface{} {
142144
att := make(map[string]interface{})
143145

144146
if len(in.ClusterRoleSelectors) > 0 {
145-
for _, crs := range in.ClusterRoleSelectors {
146-
att["cluster_role_selectors"] = flattenLabelSelector(&crs)
147+
crs := make([]interface{}, 0)
148+
for _, v := range in.ClusterRoleSelectors {
149+
crs = append(crs, flattenLabelSelector(&v)...)
147150
}
151+
att["cluster_role_selectors"] = crs
148152
}
149153

150154
return []interface{}{att}

kubernetes/structures_rbac_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package kubernetes
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
7+
api "k8s.io/api/rbac/v1"
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
)
10+
11+
func TestExpandClusterRoleAggregationRule(t *testing.T) {
12+
cases := []struct {
13+
Input []interface{}
14+
ExpectedOutput *api.AggregationRule
15+
}{
16+
{
17+
[]interface{}{},
18+
&api.AggregationRule{},
19+
},
20+
{
21+
[]interface{}{
22+
map[string]interface{}{
23+
"cluster_role_selectors": []interface{}{
24+
map[string]interface{}{
25+
"match_labels": map[string]interface{}{"key": "value"},
26+
},
27+
},
28+
},
29+
},
30+
&api.AggregationRule{
31+
ClusterRoleSelectors: []metav1.LabelSelector{
32+
{
33+
MatchLabels: map[string]string{"key": "value"},
34+
},
35+
},
36+
},
37+
},
38+
{
39+
[]interface{}{
40+
map[string]interface{}{
41+
"cluster_role_selectors": []interface{}{
42+
map[string]interface{}{
43+
"match_labels": map[string]interface{}{"key": "value"},
44+
},
45+
map[string]interface{}{
46+
"match_labels": map[string]interface{}{"foo": "bar"},
47+
},
48+
},
49+
},
50+
},
51+
&api.AggregationRule{
52+
ClusterRoleSelectors: []metav1.LabelSelector{
53+
{
54+
MatchLabels: map[string]string{"key": "value"},
55+
},
56+
{
57+
MatchLabels: map[string]string{"foo": "bar"},
58+
},
59+
},
60+
},
61+
},
62+
}
63+
64+
for _, tc := range cases {
65+
output := expandClusterRoleAggregationRule(tc.Input)
66+
if !reflect.DeepEqual(output, tc.ExpectedOutput) {
67+
t.Fatalf("Unexpected output from expander.\nExpected: %#v\nGiven: %#v",
68+
tc.ExpectedOutput, output)
69+
}
70+
}
71+
}
72+
73+
func TestFlattenClusterRoleAggregationRule(t *testing.T) {
74+
cases := []struct {
75+
Input *api.AggregationRule
76+
ExpectedOutput []interface{}
77+
}{
78+
{
79+
&api.AggregationRule{},
80+
[]interface{}{map[string]interface{}{}},
81+
},
82+
{
83+
&api.AggregationRule{
84+
ClusterRoleSelectors: []metav1.LabelSelector{
85+
{
86+
MatchLabels: map[string]string{"key": "value"},
87+
},
88+
},
89+
},
90+
[]interface{}{
91+
map[string]interface{}{
92+
"cluster_role_selectors": []interface{}{
93+
map[string]interface{}{
94+
"match_labels": map[string]string{"key": "value"},
95+
},
96+
},
97+
},
98+
},
99+
},
100+
{
101+
&api.AggregationRule{
102+
ClusterRoleSelectors: []metav1.LabelSelector{
103+
{
104+
MatchLabels: map[string]string{"key": "value"},
105+
},
106+
{
107+
MatchLabels: map[string]string{"foo": "bar"},
108+
},
109+
},
110+
},
111+
[]interface{}{
112+
map[string]interface{}{
113+
"cluster_role_selectors": []interface{}{
114+
map[string]interface{}{
115+
"match_labels": map[string]string{"key": "value"},
116+
},
117+
map[string]interface{}{
118+
"match_labels": map[string]string{"foo": "bar"},
119+
},
120+
},
121+
},
122+
},
123+
},
124+
}
125+
126+
for _, tc := range cases {
127+
output := flattenClusterRoleAggregationRule(tc.Input)
128+
if !reflect.DeepEqual(output, tc.ExpectedOutput) {
129+
t.Fatalf("Unexpected output from flattener.\nExpected: %#v\nGiven: %#v",
130+
tc.ExpectedOutput, output)
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)