Skip to content

Commit c12e097

Browse files
committed
Initial Commit on fine-grained excludes
1 parent c0885da commit c12e097

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

examples/exceptions2/main.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
3+
4+
resource "null_resource" "exception-name" {}
5+
6+
resource "null_resource" "invalid-name" {}
7+
8+
resource "invalid_type" "valid_name" {}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
exceptions = {"exception-name"}
4+
5+
func_name_msg(name) = ret {
6+
ret := sprintf("Resource Name '%s' contains dashes", [name])
7+
}
8+
9+
deny_name[msg] {
10+
input.resource[_][name]
11+
contains(name, "-")
12+
msg := func_name_msg(name)
13+
}
14+
15+
deny_resource_type[msg] {
16+
input.resource[type]
17+
type == "invalid_type"
18+
msg := sprintf("Resource Type '%s' is invalid", [type])
19+
}
20+
21+
exclude_name[rules] {
22+
input.resource[_][name]
23+
exceptions[name]
24+
rules := [func_name_msg(name)]
25+
}
26+
27+
exception[rules] {
28+
rules := ["resource_type"]
29+
}

output/result.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ type CheckResult struct {
7777
Warnings []Result `json:"warnings,omitempty"`
7878
Failures []Result `json:"failures,omitempty"`
7979
Exceptions []Result `json:"exceptions,omitempty"`
80+
Excludes []Result `json:"excludes,omitempty"`
8081
Queries []QueryResult `json:"queries,omitempty"`
8182
}
8283

output/standard.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ func (s *Standard) Output(results []CheckResult) error {
8989
}
9090
}
9191

92+
for _, exclude := range result.Excludes {
93+
fmt.Fprintln(s.Writer, colorizer.Colorize("EXCL", aurora.BlueFg), indicator, namespace, exclude.Message)
94+
}
95+
9296
totalFailures += len(result.Failures)
9397
totalExceptions += len(result.Exceptions)
9498
totalWarnings += len(result.Warnings)

policy/engine.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ func (e *Engine) check(ctx context.Context, path string, config interface{}, nam
298298

299299
var failures []output.Result
300300
var warnings []output.Result
301+
var excludes []output.Result
301302
for _, ruleResult := range ruleQueryResult.Results {
302303

303304
// Exceptions have already been accounted for in the exception query so
@@ -311,6 +312,21 @@ func (e *Engine) check(ctx context.Context, path string, config interface{}, nam
311312
continue
312313
}
313314

315+
localExcludeQuery := fmt.Sprintf("data.%s.exclude_%s[_][_] = %q", namespace, removeRulePrefix(rule), ruleResult.Message)
316+
localExcludeQueryResult, err := e.query(ctx, config, localExcludeQuery)
317+
if err != nil {
318+
return output.CheckResult{}, fmt.Errorf("query exception: %w", err)
319+
}
320+
321+
// If the query was a failure, let's have a look & see if an exception was written for it.
322+
if len(localExcludeQueryResult.Results) > 0 {
323+
// append an exception & continue
324+
localExcludeResult := localExcludeQueryResult.Results[0]
325+
localExcludeResult.Message = localExcludeQuery
326+
excludes = append(excludes, localExcludeResult)
327+
continue
328+
}
329+
314330
if isFailure(rule) {
315331
failures = append(failures, ruleResult)
316332
} else {
@@ -321,6 +337,7 @@ func (e *Engine) check(ctx context.Context, path string, config interface{}, nam
321337
checkResult.Failures = append(checkResult.Failures, failures...)
322338
checkResult.Warnings = append(checkResult.Warnings, warnings...)
323339
checkResult.Exceptions = append(checkResult.Exceptions, exceptions...)
340+
checkResult.Excludes = append(checkResult.Excludes, excludes...)
324341

325342
checkResult.Queries = append(checkResult.Queries, exceptionQueryResult)
326343
checkResult.Queries = append(checkResult.Queries, ruleQueryResult)

0 commit comments

Comments
 (0)