Skip to content

Commit

Permalink
Combine configurations into struct when using combine (#388)
Browse files Browse the repository at this point in the history
* Multidocument YAML

Signed-off-by: John Reese <john@reese.dev>

* Additional conflicts

Signed-off-by: John Reese <john@reese.dev>
  • Loading branch information
jpreese committed Sep 17, 2020
1 parent 9711356 commit cc794a6
Show file tree
Hide file tree
Showing 28 changed files with 454 additions and 490 deletions.
14 changes: 14 additions & 0 deletions acceptance.bats
Expand Up @@ -318,3 +318,17 @@
[ "$status" -eq 1 ]
[[ "$output" =~ "2 tests, 0 passed, 0 warnings, 2 failures" ]]
}

@test "Can combine yaml files" {
run ./conftest test -p examples/combine/policy examples/combine/team.yaml examples/combine/user1.yaml examples/combine/user2.yaml --combine

[ "$status" -eq 1 ]
[[ "$output" =~ "2 tests, 1 passed, 0 warnings, 1 failure" ]]
}

@test "Combining multi-document yaml file has same result" {
run ./conftest test -p examples/combine/policy examples/combine/team.yaml examples/combine/users.yaml --combine

[ "$status" -eq 1 ]
[[ "$output" =~ "2 tests, 1 passed, 0 warnings, 1 failure" ]]
}
21 changes: 12 additions & 9 deletions examples/combine/policy/duplicate.rego
Expand Up @@ -2,31 +2,34 @@ package main

# Check that no name attribute exists twice among all resources
deny[msg] {
name := input[_].metadata.name
occurrences := [name | input[i].metadata.name == name; name := input[i].metadata.name]
name := input[_].contents.metadata.name
occurrences := [name | input[i].contents.metadata.name == name; name := input[i].metadata.name]
count(occurrences) > 1
msg = sprintf("Error duplicate name : %s", [name])
}

deny[msg] {
kind = input[_].kind
name = input[_].metadata.name
kind = "team"
kind := input[_].contents.kind
name := input[_].contents.metadata.name
kind == "team"

# list all existing users
existing_users = { email | input[i].kind = "user" ; email := input[i].metadata.email }
existing_users = { email | input[i].contents.kind == "user" ; email := input[i].contents.metadata.email }

# gather all configured users in teams
configured_owner_users_array = [ user | input[i].kind = "team" ; user := input[i].spec.owner ]
configured_member_users_array = [ user | input[i].kind = "team" ; user := input[i].spec.member ]
configured_owner_users_array = [ user | input[i].contents.kind == "team" ; user := input[i].contents.spec.owner ]
configured_member_users_array = [ user | input[i].contents.kind == "team" ; user := input[i].contents.spec.member ]

configured_users_array = array.concat(configured_owner_users_array, configured_member_users_array)

# create a set to remove duplicates
configured_users = { team | team := configured_users_array[i][j] }

# sets can be substracted
missing_users := configured_users - existing_users

# missing users are the ones configured in teams but not in Github
count(missing_users) > 0

msg = sprintf("\nExisting users %s \nConfigured users %s \nMissing users %s", [sort(existing_users), sort(configured_users), sort(missing_users)])
msg = sprintf("Existing users %s | Configured users %s | Missing users %s", [sort(existing_users), sort(configured_users), sort(missing_users)])
}
11 changes: 11 additions & 0 deletions examples/combine/users.yaml
@@ -0,0 +1,11 @@
apiVersion: example.com/v1
kind: user
metadata:
name: john.doe
email: john.doe@example.com
---
apiVersion: example.com/v1
kind: user
metadata:
name: jane.doe
email: jan.doe@example.com
12 changes: 9 additions & 3 deletions examples/hcl1/policy/gke_combine.rego
@@ -1,5 +1,11 @@
package main.gke

deny[sprintf("file path index to key value does not exist: %v", [input])] {
not input["examples/hcl1/gke.tf"].provider[0].google[0].project == "instrumenta"
}
deny[msg] {
not instrumenta_project_exists

msg := "File path index to key value does not exist"
}

instrumenta_project_exists {
input[_].contents.provider[0].google[0].project == "instrumenta"
}
4 changes: 2 additions & 2 deletions internal/commands/parse.go
Expand Up @@ -53,9 +53,9 @@ func NewParseCommand(ctx context.Context) *cobra.Command {

var output string
if viper.GetBool("combine") {
output, err = parser.Format(configurations)
output, err = parser.FormatCombined(configurations)
} else {
output, err = parser.FormatAll(configurations)
output, err = parser.Format(configurations)
}
if err != nil {
return fmt.Errorf("format output: %w", err)
Expand Down
4 changes: 3 additions & 1 deletion internal/runner/test.go
Expand Up @@ -140,7 +140,9 @@ func getFilesFromDirectory(directory string, ignoreRegex string) ([]string, erro
}

for _, input := range parser.ValidInputs() {
if strings.HasSuffix(info.Name(), input) {
currentInput := strings.ToLower(input)

if strings.HasSuffix(info.Name(), currentInput) {
files = append(files, currentPath)
}
}
Expand Down
142 changes: 0 additions & 142 deletions parser/config.go

This file was deleted.

0 comments on commit cc794a6

Please sign in to comment.