diff --git a/pkg/platform/runtime/buildexpression/buildexpression.go b/pkg/platform/runtime/buildexpression/buildexpression.go index 64a2e88886..c6c16e5720 100644 --- a/pkg/platform/runtime/buildexpression/buildexpression.go +++ b/pkg/platform/runtime/buildexpression/buildexpression.go @@ -84,6 +84,10 @@ type In struct { Name *string } +type Fail struct { + Message string +} + // New creates a BuildExpression from a JSON byte array. // The JSON must be a valid BuildExpression in the following format: // @@ -143,6 +147,12 @@ func New(data []byte) (*BuildExpression, error) { } expr.Let = let + } else if key == "fail" { + fail, err := newFail(path, v) + if err != nil { + return nil, errs.Wrap(err, "Could not parse 'fail' key") + } + return nil, locale.NewError("err_build_expression_fail", "", fail.Message) } else if isAp(path, v) { ap, err := newAp(path, v) if err != nil { @@ -453,6 +463,28 @@ func newIn(path []string, inValue interface{}) (*In, error) { return in, nil } +func newFail(path []string, m map[string]interface{}) (*Fail, error) { + path = append(path, "fail") + defer func() { + _, _, err := sliceutils.Pop(path) + if err != nil { + multilog.Error("Could not pop context: %v", err) + } + }() + + message, ok := m["message"] + if !ok { + return nil, errs.New("Build expression's 'fail' object has no 'message' key") + } + + messageStr, ok := message.(string) + if !ok { + return nil, errs.New("'message' key's value is not a string") + } + + return &Fail{Message: messageStr}, nil +} + // validateRequirements ensures that the requirements in the BuildExpression contain // both the name and namespace fields. These fileds are used for requirement operations. func (e *BuildExpression) validateRequirements() error { diff --git a/pkg/platform/runtime/buildexpression/buildexpression_test.go b/pkg/platform/runtime/buildexpression/buildexpression_test.go index 08d965e1ef..84d9229920 100644 --- a/pkg/platform/runtime/buildexpression/buildexpression_test.go +++ b/pkg/platform/runtime/buildexpression/buildexpression_test.go @@ -70,6 +70,13 @@ func TestNew(t *testing.T) { }, wantErr: false, }, + { + name: "fail", + args: args{ + filename: "buildexpression-fail.json", + }, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/platform/runtime/buildexpression/testdata/buildexpression-fail.json b/pkg/platform/runtime/buildexpression/testdata/buildexpression-fail.json new file mode 100644 index 0000000000..1d300f3ed6 --- /dev/null +++ b/pkg/platform/runtime/buildexpression/testdata/buildexpression-fail.json @@ -0,0 +1,5 @@ +{ + "fail": { + "message": "invalid order" + } +} \ No newline at end of file