Skip to content

Commit

Permalink
Try to expose JSON paths (#173)
Browse files Browse the repository at this point in the history
* Try to expose JSON paths
* update validationErrors format in json output
* Add test to JSON output with validationError
  • Loading branch information
yannh committed Feb 26, 2023
1 parent 9860cde commit 563e1db
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 13 deletions.
31 changes: 22 additions & 9 deletions pkg/output/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ import (
)

type oresult struct {
Filename string `json:"filename"`
Kind string `json:"kind"`
Name string `json:"name"`
Version string `json:"version"`
Status string `json:"status"`
Msg string `json:"msg"`
Filename string `json:"filename"`
Kind string `json:"kind"`
Name string `json:"name"`
Version string `json:"version"`
Status string `json:"status"`
Msg string `json:"msg"`
ValidationErrors []validator.ValidationError `json:"validationErrors,omitempty"`
}

type jsono struct {
Expand Down Expand Up @@ -49,11 +50,15 @@ func (o *jsono) Write(result validator.Result) error {
o.nValid++
case validator.Invalid:
st = "statusInvalid"
msg = result.Err.Error()
if result.Err != nil {
msg = result.Err.Error()
}
o.nInvalid++
case validator.Error:
st = "statusError"
msg = result.Err.Error()
if result.Err != nil {
msg = result.Err.Error()
}
o.nErrors++
case validator.Skipped:
st = "statusSkipped"
Expand All @@ -63,7 +68,15 @@ func (o *jsono) Write(result validator.Result) error {

if o.verbose || (result.Status != validator.Valid && result.Status != validator.Skipped && result.Status != validator.Empty) {
sig, _ := result.Resource.Signature()
o.results = append(o.results, oresult{Filename: result.Resource.Path, Kind: sig.Kind, Name: sig.Name, Version: sig.Version, Status: st, Msg: msg})
o.results = append(o.results, oresult{
Filename: result.Resource.Path,
Kind: sig.Kind,
Name: sig.Name,
Version: sig.Version,
Status: st,
Msg: msg,
ValidationErrors: result.ValidationErrors,
})
}

return nil
Expand Down
54 changes: 54 additions & 0 deletions pkg/output/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,60 @@ metadata:
"skipped": 0
}
}
`,
},
{
"a single invalid deployment, verbose, with summary",
true,
false,
true,
[]validator.Result{
{
Resource: resource.Resource{
Path: "deployment.yml",
Bytes: []byte(`apiVersion: apps/v1
kind: Deployment
metadata:
name: "my-app"
`),
},
Status: validator.Invalid,
Err: &validator.ValidationError{
Path: "foo",
Msg: "bar",
},
ValidationErrors: []validator.ValidationError{
{
Path: "foo",
Msg: "bar",
},
},
},
},
`{
"resources": [
{
"filename": "deployment.yml",
"kind": "Deployment",
"name": "my-app",
"version": "apps/v1",
"status": "statusInvalid",
"msg": "bar",
"validationErrors": [
{
"path": "foo",
"msg": "bar"
}
]
}
],
"summary": {
"valid": 0,
"invalid": 1,
"errors": 0,
"skipped": 0
}
}
`,
},
} {
Expand Down
35 changes: 31 additions & 4 deletions pkg/validator/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package validator

import (
"context"
"errors"
"fmt"
"io"

Expand All @@ -26,11 +27,21 @@ const (
Empty // resource is empty. Note: is triggered for files starting with a --- separator.
)

type ValidationError struct {
Path string `json:"path"`
Msg string `json:"msg"`
}

func (ve *ValidationError) Error() string {
return ve.Msg
}

// Result contains the details of the result of a resource validation
type Result struct {
Resource resource.Resource
Err error
Status Status
Resource resource.Resource
Err error
Status Status
ValidationErrors []ValidationError
}

// Validator exposes multiple methods to validate your Kubernetes resources.
Expand Down Expand Up @@ -181,7 +192,23 @@ func (val *v) ValidateResource(res resource.Resource) Result {

err = schema.Validate(r)
if err != nil {
return Result{Resource: res, Status: Invalid, Err: fmt.Errorf("problem validating schema. Check JSON formatting: %s", err)}
validationErrors := []ValidationError{}
var e *jsonschema.ValidationError
if errors.As(err, &e) {
for _, ve := range e.Causes {
validationErrors = append(validationErrors, ValidationError{
Path: ve.KeywordLocation,
Msg: ve.Message,
})
}

}
return Result{
Resource: res,
Status: Invalid,
Err: fmt.Errorf("problem validating schema. Check JSON formatting: %s", err),
ValidationErrors: validationErrors,
}
}

return Result{Resource: res, Status: Valid}
Expand Down

0 comments on commit 563e1db

Please sign in to comment.