Skip to content

Commit 3a6d497

Browse files
committed
Follow-ups from testing
1 parent fe46992 commit 3a6d497

File tree

2 files changed

+116
-16
lines changed

2 files changed

+116
-16
lines changed

internal/provider/scorecard_resource.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import (
66
"github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault"
77

88
"github.com/cortexapps/terraform-provider-cortex/internal/cortex"
9+
"github.com/hashicorp/terraform-plugin-framework-validators/setvalidator"
910
"github.com/hashicorp/terraform-plugin-framework/path"
1011
"github.com/hashicorp/terraform-plugin-framework/resource"
1112
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
1213
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
1314
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
15+
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1416
"github.com/hashicorp/terraform-plugin-framework/types"
1517
)
1618

@@ -144,14 +146,20 @@ func (r *ScorecardResource) Schema(ctx context.Context, req resource.SchemaReque
144146
Optional: true,
145147
Attributes: map[string]schema.Attribute{
146148
"include": schema.SetAttribute{
147-
MarkdownDescription: "Entity types to include in the scorecard evaluation.",
149+
MarkdownDescription: "Entity types to include in the scorecard evaluation. Cannot be used with exclude.",
148150
ElementType: types.StringType,
149151
Optional: true,
152+
Validators: []validator.Set{
153+
setvalidator.ConflictsWith(path.MatchRelative().AtParent().AtName("exclude")),
154+
},
150155
},
151156
"exclude": schema.SetAttribute{
152-
MarkdownDescription: "Entity types to exclude from the scorecard evaluation.",
157+
MarkdownDescription: "Entity types to exclude from the scorecard evaluation. Cannot be used with include.",
153158
ElementType: types.StringType,
154159
Optional: true,
160+
Validators: []validator.Set{
161+
setvalidator.ConflictsWith(path.MatchRelative().AtParent().AtName("include")),
162+
},
155163
},
156164
},
157165
},

internal/provider/scorecard_resource_test.go

Lines changed: 106 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package provider_test
22

33
import (
44
"fmt"
5+
"regexp"
56
"testing"
67

78
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
@@ -36,7 +37,7 @@ resource %[1]q %[2]q {
3637
rules = [
3738
{
3839
title = "Has a Description"
39-
expression = "description != null"
40+
expression = "entity.description() != null"
4041
weight = 1
4142
level = "Bronze"
4243
failure_message = "The description is required"
@@ -70,7 +71,7 @@ resource %[1]q %[2]q {
7071
rules = [
7172
{
7273
title = "Has a Description"
73-
expression = "description != null"
74+
expression = "entity.description() != null"
7475
weight = 1
7576
level = "Bronze"
7677
failure_message = "The description is required"
@@ -105,7 +106,7 @@ resource %[1]q %[2]q {
105106
rules = [
106107
{
107108
title = "Has a Description"
108-
expression = "description != null"
109+
expression = "entity.description() != null"
109110
weight = 1
110111
level = "Bronze"
111112
failure_message = "The description is required"
@@ -148,7 +149,7 @@ resource %[1]q %[2]q {
148149
rules = [
149150
{
150151
title = "Has a Description"
151-
expression = "description != null"
152+
expression = "entity.description() != null"
152153
weight = 1
153154
level = "Bronze"
154155
failure_message = "The description is required"
@@ -167,7 +168,6 @@ resource %[1]q %[2]q {
167168
filter = {
168169
types = {
169170
include = ["service"]
170-
exclude = ["deprecated"]
171171
}
172172
groups = {
173173
include = ["team-a", "team-b"]
@@ -180,6 +180,44 @@ resource %[1]q %[2]q {
180180
}`, t.ResourceType(), t.Tag, t.Name, t.Description, t.Draft)
181181
}
182182

183+
func (t *testScorecardResource) ToTerraformWithFilterTypesExclude() string {
184+
return fmt.Sprintf(`
185+
resource %[1]q %[2]q {
186+
tag = %[2]q
187+
name = %[3]q
188+
description = %[4]q
189+
draft = %[5]t
190+
rules = [
191+
{
192+
title = "Has a Description"
193+
expression = "entity.description() != null"
194+
weight = 1
195+
level = "Bronze"
196+
failure_message = "The description is required"
197+
description = "The service has a description"
198+
}
199+
]
200+
ladder = {
201+
levels = [
202+
{
203+
name = "Bronze"
204+
rank = 1
205+
color = "#c38b5f"
206+
}
207+
]
208+
}
209+
filter = {
210+
types = {
211+
exclude = ["deprecated"]
212+
}
213+
query = "owners_is_set"
214+
}
215+
evaluation = {
216+
window = 24
217+
}
218+
}`, t.ResourceType(), t.Tag, t.Name, t.Description, t.Draft)
219+
}
220+
183221
/***********************************************************************************************************************
184222
* Tests
185223
**********************************************************************************************************************/
@@ -202,7 +240,7 @@ func TestAccScorecardResourceComplete(t *testing.T) {
202240
resource.TestCheckResourceAttr(stub.ResourceFullName(), "draft", fmt.Sprintf("%t", stub.Draft)),
203241

204242
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.title", "Has a Description"),
205-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "description != null"),
243+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "entity.description() != null"),
206244
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.weight", "1"),
207245
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.level", "Bronze"),
208246
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.failure_message", "The description is required"),
@@ -225,7 +263,7 @@ func TestAccScorecardResourceComplete(t *testing.T) {
225263
resource.TestCheckResourceAttr(stub.ResourceFullName(), "draft", fmt.Sprintf("%t", stub.Draft)),
226264

227265
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.title", "Has a Description"),
228-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "description != null"),
266+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "entity.description() != null"),
229267
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.weight", "1"),
230268
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.level", "Bronze"),
231269
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.failure_message", "The description is required"),
@@ -250,7 +288,7 @@ func TestAccScorecardResourceComplete(t *testing.T) {
250288
resource.TestCheckResourceAttr(stub.ResourceFullName(), "draft", "false"),
251289

252290
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.title", "Has a Description"),
253-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "description != null"),
291+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.expression", "entity.description() != null"),
254292
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.weight", "1"),
255293
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.level", "Bronze"),
256294
resource.TestCheckResourceAttr(stub.ResourceFullName(), "rules.0.failure_message", "The description is required"),
@@ -264,8 +302,8 @@ func TestAccScorecardResourceComplete(t *testing.T) {
264302
resource.TestCheckResourceAttr(stub.ResourceFullName(), "ladder.levels.1.rank", "2"),
265303
resource.TestCheckResourceAttr(stub.ResourceFullName(), "ladder.levels.1.color", "#c3c3c3"),
266304

267-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.types.include.0", "service"),
268-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.types.include.1", "app"),
305+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.types.include.*", "service"),
306+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.types.include.*", "app"),
269307
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.query", "owners_is_set"),
270308

271309
resource.TestCheckResourceAttr(stub.ResourceFullName(), "evaluation.window", "24"),
@@ -279,10 +317,21 @@ func TestAccScorecardResourceComplete(t *testing.T) {
279317
resource.TestCheckResourceAttr(stub.ResourceFullName(), "name", stub.Name),
280318
resource.TestCheckResourceAttr(stub.ResourceFullName(), "description", stub.Description),
281319

282-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.types.include.0", "service"),
283-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.types.exclude.0", "deprecated"),
284-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.groups.include.0", "team-a"),
285-
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.groups.include.1", "team-b"),
320+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.types.include.*", "service"),
321+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.groups.include.*", "team-a"),
322+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.groups.include.*", "team-b"),
323+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.query", "owners_is_set"),
324+
),
325+
},
326+
// Read testing with types exclude filter
327+
{
328+
Config: stub.ToTerraformWithFilterTypesExclude(),
329+
Check: resource.ComposeAggregateTestCheckFunc(
330+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "tag", stub.Tag),
331+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "name", stub.Name),
332+
resource.TestCheckResourceAttr(stub.ResourceFullName(), "description", stub.Description),
333+
334+
resource.TestCheckTypeSetElemAttr(stub.ResourceFullName(), "filter.types.exclude.*", "deprecated"),
286335
resource.TestCheckResourceAttr(stub.ResourceFullName(), "filter.query", "owners_is_set"),
287336
),
288337
},
@@ -306,3 +355,46 @@ func TestAccScorecardResourceComplete(t *testing.T) {
306355
},
307356
})
308357
}
358+
359+
func TestAccScorecardResourceFilterTypesValidation(t *testing.T) {
360+
resource.Test(t, resource.TestCase{
361+
PreCheck: func() { testAccPreCheck(t) },
362+
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
363+
Steps: []resource.TestStep{
364+
{
365+
Config: `
366+
resource "cortex_scorecard" "test" {
367+
tag = "test-validation"
368+
name = "Validation Test"
369+
370+
ladder = {
371+
levels = [
372+
{
373+
name = "Bronze"
374+
rank = 1
375+
color = "#c38b5f"
376+
}
377+
]
378+
}
379+
380+
rules = [
381+
{
382+
title = "Has Description"
383+
expression = "entity.description() != null"
384+
weight = 1
385+
level = "Bronze"
386+
}
387+
]
388+
389+
filter = {
390+
types = {
391+
include = ["service"]
392+
exclude = ["deprecated"]
393+
}
394+
}
395+
}`,
396+
ExpectError: regexp.MustCompile(`Attribute "filter\.types\.(include|exclude)" cannot be specified when`),
397+
},
398+
},
399+
})
400+
}

0 commit comments

Comments
 (0)