Skip to content

Commit

Permalink
Evaluator: recognize and process rich errors (#319)
Browse files Browse the repository at this point in the history
* Evaluator: recognize and process rich errors

* Evaluator: return processed config even when parsing succeeded
  • Loading branch information
edigaryev authored Mar 5, 2021
1 parent bbf64fc commit 599e047
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 4 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/antihax/optional v1.0.0
github.com/avast/retry-go v3.0.0+incompatible
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054
github.com/cirruslabs/cirrus-ci-agent v1.31.2
github.com/cirruslabs/cirrus-ci-agent v1.32.0
github.com/cirruslabs/echelon v1.4.1
github.com/cirruslabs/go-java-glob v0.1.0
github.com/cirruslabs/podmanapi v0.1.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
github.com/cilium/ebpf v0.0.0-20200507155900-a9f01edf17e3/go.mod h1:XT+cAw5wfvsodedcijoh1l9cf7v1x9FlFB/3VmF/O8s=
github.com/cirruslabs/cirrus-ci-agent v1.31.2 h1:ywdR9WlYIvGr0jjA6N5KKBqaGRQE/C7VIwkgPq+bP6Q=
github.com/cirruslabs/cirrus-ci-agent v1.31.2/go.mod h1:T3amh8kB54wkmpWrQ/VXVl9osHXdt3ILS0cH5ZaYGF4=
github.com/cirruslabs/cirrus-ci-agent v1.32.0 h1:WOCyP/Oe2GY3NpArHHFk3m1WU4OAe+1eLXTB9VTcsas=
github.com/cirruslabs/cirrus-ci-agent v1.32.0/go.mod h1:T3amh8kB54wkmpWrQ/VXVl9osHXdt3ILS0cH5ZaYGF4=
github.com/cirruslabs/cirrus-ci-annotations v0.1.0/go.mod h1:xrmxzL58Pf4cSSQCmQEOPGQ3poeARxJdHneurUrqjZk=
github.com/cirruslabs/echelon v1.4.1 h1:7ij7cANbL1feOyds5sRtYLPBJwycFi3nvLKJI4vCOPs=
github.com/cirruslabs/echelon v1.4.1/go.mod h1:1jFBACMy3tzodXyTtNNLN9bw6UUU7Xpq9tYMRydehtY=
Expand Down
17 changes: 16 additions & 1 deletion internal/evaluator/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/cirruslabs/cirrus-cli/pkg/larker/fs/dummy"
"github.com/cirruslabs/cirrus-cli/pkg/larker/fs/github"
"github.com/cirruslabs/cirrus-cli/pkg/parser"
"github.com/cirruslabs/cirrus-cli/pkg/parser/parsererror"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
Expand Down Expand Up @@ -117,14 +118,28 @@ func (r *ConfigurationEvaluatorServiceServer) EvaluateConfig(
parser.WithAdditionalTaskProperties(request.AdditionalTaskProperties),
)

result, err := p.Parse(ctx, strings.Join(yamlConfigs, "\n"))
processedConfig := strings.Join(yamlConfigs, "\n")

result, err := p.Parse(ctx, processedConfig)
if err != nil {
if re, ok := err.(*parsererror.Rich); ok {
return &api.EvaluateConfigResponse{
Error: &api.RichError{
Message: re.Message(),
ProcessedConfig: re.Config(),
Line: uint64(re.Line()),
Column: uint64(re.Column()),
},
}, nil
}

return nil, status.Error(codes.InvalidArgument, err.Error())
}

return &api.EvaluateConfigResponse{
Tasks: result.Tasks,
TasksCountBeforeFiltering: result.TasksCountBeforeFiltering,
ProcessedConfig: processedConfig,
}, nil
}

Expand Down
19 changes: 19 additions & 0 deletions internal/evaluator/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,25 @@ task:
require.Len(t, response.Tasks, 1)
}

func TestRichErrors(t *testing.T) {
yamlConfig := `container:
image:
should_be: a_string
task:
script: true
`

response, err := evaluateConfigHelper(t, &api.EvaluateConfigRequest{YamlConfig: yamlConfig})
require.NoError(t, err)
require.NotNil(t, response.Error)

assert.EqualValues(t, response.Error.Message, "not a scalar value")
assert.NotEmpty(t, response.Error.ProcessedConfig)
assert.EqualValues(t, response.Error.Line, 3)
assert.EqualValues(t, response.Error.Column, 5)
}

func TestHook(t *testing.T) {
config := `def on_build_failure(ctx):
print("I'm alive!")
Expand Down

0 comments on commit 599e047

Please sign in to comment.