Skip to content

Commit

Permalink
chore: do not validate contract on reading (chainloop-dev#1552)
Browse files Browse the repository at this point in the history
Signed-off-by: Miguel Martinez <[email protected]>
  • Loading branch information
migmartri authored Nov 20, 2024
1 parent 5371cc3 commit 03f0dcc
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 11 deletions.
2 changes: 1 addition & 1 deletion app/controlplane/pkg/biz/workflowcontract.go
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ func (uc *WorkflowContractUseCase) findProvider(providerName string) (*policies.
// UnmarshalAndValidateRawContract Takes the raw contract + format and will unmarshal the contract and validate it
func UnmarshalAndValidateRawContract(raw []byte, format unmarshal.RawFormat) (*Contract, error) {
contract := &schemav1.CraftingSchema{}
err := unmarshal.UnmarshalFromRaw(raw, format, contract)
err := unmarshal.FromRaw(raw, format, contract, true)
if err != nil {
return nil, NewErrValidation(err)
}
Expand Down
5 changes: 4 additions & 1 deletion app/controlplane/pkg/data/workflowcontract.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflow"
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflowcontract"
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/data/ent/workflowcontractversion"
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/unmarshal"
"github.com/go-kratos/kratos/v2/log"
"github.com/google/uuid"
"google.golang.org/protobuf/proto"
Expand Down Expand Up @@ -311,10 +312,12 @@ func entContractVersionToBizContractVersion(w *ent.WorkflowContractVersion) (*bi
// Scenario 2: contracts that have been updated after the introduction of the raw_body field will have the raw_body field populated
// but we also want to keep the Body field populated for backward compatibility
} else if len(w.Body) == 0 {
contract, err = biz.UnmarshalAndValidateRawContract(w.RawBody, w.RawBodyFormat)
schema := &schemav1.CraftingSchema{}
err := unmarshal.FromRaw(w.RawBody, w.RawBodyFormat, schema, false)
if err != nil {
return nil, fmt.Errorf("failed to unmarshal raw body: %w", err)
}
contract.Schema = schema
}

return &biz.WorkflowContractVersion{
Expand Down
2 changes: 1 addition & 1 deletion app/controlplane/pkg/policies/policyprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func unmarshalFromRaw(raw *RawMessage, out proto.Message) error {
return fmt.Errorf("unsupported format: %s", raw.Format)
}

err := unmarshal.UnmarshalFromRaw(raw.Body, format, out)
err := unmarshal.FromRaw(raw.Body, format, out, false)
if err != nil {
return fmt.Errorf("error unmarshalling policy response: %w", err)
}
Expand Down
28 changes: 20 additions & 8 deletions app/controlplane/pkg/unmarshal/unmarshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,15 @@ func (RawFormat) Values() (kinds []string) {
return
}

func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error {
validator, err := protovalidate.New()
if err != nil {
return fmt.Errorf("could not create validator: %w", err)
func FromRaw(body []byte, format RawFormat, out proto.Message, doValidate bool) error {
var validator *protovalidate.Validator
var err error

if doValidate {
validator, err = protovalidate.New()
if err != nil {
return fmt.Errorf("could not create validator: %w", err)
}
}

switch format {
Expand All @@ -58,7 +63,11 @@ func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error {
}
case RawFormatYAML:
// protoyaml allows validating the contract while unmarshalling
yamlOpts := protoyaml.UnmarshalOptions{Validator: validator}
yamlOpts := protoyaml.UnmarshalOptions{}
if doValidate {
yamlOpts.Validator = validator
}

if err := yamlOpts.Unmarshal(body, out); err != nil {
return fmt.Errorf("error unmarshalling raw message: %w", err)
}
Expand All @@ -77,10 +86,13 @@ func UnmarshalFromRaw(body []byte, format RawFormat, out proto.Message) error {
return fmt.Errorf("unsupported format: %s", format)
}

err = validator.Validate(out)
if err != nil {
return fmt.Errorf("error validating raw message: %w", err)
if validator != nil {
err = validator.Validate(out)
if err != nil {
return fmt.Errorf("error validating raw message: %w", err)
}
}

return nil
}

Expand Down

0 comments on commit 03f0dcc

Please sign in to comment.