From e020277fc3b3be672ada5b79f0014b69f68be378 Mon Sep 17 00:00:00 2001 From: Sandor Trombitas Date: Thu, 13 Feb 2025 14:35:12 +0200 Subject: [PATCH 1/9] chore: update output rendering of error catalog errors --- cliv2/cmd/cliv2/errorhandling.go | 14 ++++-- cliv2/cmd/cliv2/errorhandling_test.go | 16 ++++--- cliv2/cmd/cliv2/logheaderfooter.go | 1 + cliv2/cmd/cliv2/main.go | 17 ++++---- cliv2/go.mod | 30 +++++++------ cliv2/go.sum | 61 +++++++++++++++------------ 6 files changed, 77 insertions(+), 62 deletions(-) diff --git a/cliv2/cmd/cliv2/errorhandling.go b/cliv2/cmd/cliv2/errorhandling.go index 43a5058e14..3096a5d900 100644 --- a/cliv2/cmd/cliv2/errorhandling.go +++ b/cliv2/cmd/cliv2/errorhandling.go @@ -2,16 +2,17 @@ package main import ( "errors" + "github.com/snyk/error-catalog-golang-public/cli" "os/exec" - "github.com/snyk/error-catalog-golang-public/cli" "github.com/snyk/error-catalog-golang-public/snyk_errors" + "github.com/snyk/go-application-framework/pkg/networking/middleware" cli_errors "github.com/snyk/cli/cliv2/internal/errors" ) // decorate generic errors that do not contain Error-Catalog Errors -func decorateError(err error) error { +func decorateError(err error, meta map[string]any) error { if err == nil { return nil } @@ -25,10 +26,15 @@ func decorateError(err error) error { } var errorCatalogError snyk_errors.Error - if !errors.As(err, &errorCatalogError) { + var errWithMeta error + if errors.As(err, &errorCatalogError) { + errWithMeta = middleware.AddMetaDataToErr(errorCatalogError, meta) + } else { genericError := cli.NewGeneralCLIFailureError(err.Error()) genericError.StatusCode = 0 - err = errors.Join(err, genericError) + errWithMeta = middleware.AddMetaDataToErr(genericError, meta) } + + err = errors.Join(err, errWithMeta) return err } diff --git a/cliv2/cmd/cliv2/errorhandling_test.go b/cliv2/cmd/cliv2/errorhandling_test.go index c5978e6573..40d7b559fb 100644 --- a/cliv2/cmd/cliv2/errorhandling_test.go +++ b/cliv2/cmd/cliv2/errorhandling_test.go @@ -14,34 +14,36 @@ import ( ) func Test_decorateError(t *testing.T) { + meta := map[string]any{} t.Run("is nil error", func(t *testing.T) { - assert.Nil(t, decorateError(nil)) + assert.Nil(t, decorateError(nil, meta)) }) t.Run("is ErrorWithExitCode", func(t *testing.T) { err := &cli_errors.ErrorWithExitCode{ ExitCode: 2, } - assert.Equal(t, err, decorateError(err)) + assert.Equal(t, err, decorateError(err, meta)) }) t.Run("is ExitError", func(t *testing.T) { err := &exec.ExitError{ ProcessState: &os.ProcessState{}, } - assert.Equal(t, err, decorateError(err)) + assert.Equal(t, err, decorateError(err, meta)) }) t.Run("is already error catalog error", func(t *testing.T) { err := cli.NewConnectionTimeoutError("") - assert.Equal(t, err, decorateError(err)) + actualErr := decorateError(err, meta) + assert.ErrorAs(t, actualErr, &err) }) t.Run("is a generic error", func(t *testing.T) { err := errors.New("generic error") - actualErrr := decorateError(err) + actualErr := decorateError(err, meta) expectedError := cli.NewGeneralCLIFailureError("") - assert.ErrorIs(t, actualErrr, err) - assert.ErrorAs(t, actualErrr, &expectedError) + assert.ErrorIs(t, actualErr, err) + assert.ErrorAs(t, actualErr, &expectedError) }) } diff --git a/cliv2/cmd/cliv2/logheaderfooter.go b/cliv2/cmd/cliv2/logheaderfooter.go index d86ed62efb..6da3ccf218 100644 --- a/cliv2/cmd/cliv2/logheaderfooter.go +++ b/cliv2/cmd/cliv2/logheaderfooter.go @@ -187,6 +187,7 @@ func writeLogFooter(exitCode int, errs []error) { } } } + tablePrint("Interaction", interactionId) tablePrint("Exit Code", strconv.Itoa(exitCode)) } diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index ba3e3d0a23..7a0492fb58 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -20,6 +20,8 @@ import ( "github.com/snyk/cli-extension-dep-graph/pkg/depgraph" "github.com/snyk/cli-extension-iac-rules/iacrules" "github.com/snyk/cli-extension-sbom/pkg/sbom" + "github.com/snyk/cli/cliv2/internal/cliv2" + "github.com/snyk/cli/cliv2/internal/constants" "github.com/snyk/container-cli/pkg/container" "github.com/snyk/go-application-framework/pkg/analytics" "github.com/snyk/go-application-framework/pkg/app" @@ -30,9 +32,6 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/snyk/cli/cliv2/internal/cliv2" - "github.com/snyk/cli/cliv2/internal/constants" - localworkflows "github.com/snyk/go-application-framework/pkg/local_workflows" "github.com/snyk/go-application-framework/pkg/local_workflows/content_type" "github.com/snyk/go-application-framework/pkg/local_workflows/json_schemas" @@ -57,7 +56,7 @@ var helpProvided bool var noopLogger zerolog.Logger = zerolog.New(io.Discard) var globalLogger *zerolog.Logger = &noopLogger -var interactionId = uuid.NewString() +var interactionId = instrumentation.AssembleUrnFromUUID(uuid.NewString()) const ( unknownCommandMessage string = "unknown command" @@ -471,10 +470,6 @@ func displayError(err error, userInterface ui.UserInterface, config configuratio jsonErrorBuffer, _ := json.MarshalIndent(jsonError, "", " ") userInterface.Output(string(jsonErrorBuffer)) } else { - if errors.Is(err, context.DeadlineExceeded) { - err = fmt.Errorf("command timed out") - } - uiError := userInterface.OutputError(err) if uiError != nil { globalLogger.Err(uiError).Msg("ui failed to show error") @@ -597,7 +592,11 @@ func MainWithErrorCode() (int, []error) { } if err != nil { - err = decorateError(err) + // add any meta fields to the err + meta := map[string]any{ + "interactionId": interactionId, + } + err = decorateError(err, meta) errorList = append(errorList, err) for _, tempError := range errorList { diff --git a/cliv2/go.mod b/cliv2/go.mod index 37cb62026d..8abc8173d5 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -17,7 +17,7 @@ require ( github.com/snyk/cli-extension-sbom v0.0.0-20241016065306-0df2be5b3b8f github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 - github.com/snyk/go-application-framework v0.0.0-20250212121528-2e787c13a2cc + github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630 github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20250213084108-c87400c00e06 @@ -65,7 +65,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/denisbrodbeck/machineid v1.0.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect + github.com/dprotaso/go-yit v0.0.0-20240618133044-5a0af90af097 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/erikgeiser/promptkit v0.8.0 // indirect github.com/erni27/imcache v1.2.0 // indirect @@ -73,7 +73,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gertd/go-pluralize v0.2.1 // indirect - github.com/getkin/kin-openapi v0.128.0 // indirect + github.com/getkin/kin-openapi v0.129.0 // indirect github.com/getsentry/sentry-go v0.28.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.1 // indirect @@ -110,7 +110,6 @@ require ( github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/yaml v0.3.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect @@ -124,7 +123,7 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect @@ -142,6 +141,8 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 // indirect github.com/oapi-codegen/runtime v1.1.1 // indirect + github.com/oasdiff/yaml v0.0.0-20241214135536-5f7845c759c8 // indirect + github.com/oasdiff/yaml3 v0.0.0-20241214160948-977117996672 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/open-policy-agent/opa v0.69.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -173,7 +174,8 @@ require ( github.com/snyk/policy-engine v0.33.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd // indirect - github.com/speakeasy-api/openapi-overlay v0.9.0 // indirect + github.com/speakeasy-api/jsonpath v0.6.1 // indirect + github.com/speakeasy-api/openapi-overlay v0.10.1 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/viper v1.18.2 // indirect @@ -203,17 +205,17 @@ require ( go.opentelemetry.io/otel/sdk v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.29.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect + golang.org/x/crypto v0.33.0 // indirect golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/tools v0.30.0 // indirect google.golang.org/api v0.195.0 // indirect google.golang.org/genproto v0.0.0-20240827150818-7e3bb234dfed // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect diff --git a/cliv2/go.sum b/cliv2/go.sum index aa6660f0b4..a85591799d 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -309,8 +309,8 @@ github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8 github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= -github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= +github.com/dprotaso/go-yit v0.0.0-20240618133044-5a0af90af097 h1:f5nA5Ys8RXqFXtKc0XofVRiuwNTuJzPIwTmbjLz9vj8= +github.com/dprotaso/go-yit v0.0.0-20240618133044-5a0af90af097/go.mod h1:FTAVyH6t+SlS97rv6EXRVuBDLkQqcIe/xQw9f4IFUI4= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v1.7.0 h1:EXv2nV4EjM60ZtsEVLYJG4oBXhDGutMKperpHsZ/v+0= @@ -351,8 +351,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= -github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4= -github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/getkin/kin-openapi v0.129.0 h1:QGYTNcmyP5X0AtFQ2Dkou9DGBJsUETeLH9rFrJXZh30= +github.com/getkin/kin-openapi v0.129.0/go.mod h1:gmWI+b/J45xqpyK5wJmRRZse5wefA5H0RDMK46kLUtI= github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -569,8 +569,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= -github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= @@ -614,8 +612,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -679,6 +677,10 @@ github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOg github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= +github.com/oasdiff/yaml v0.0.0-20241214135536-5f7845c759c8 h1:9djga8U4+/TQzv5iMlZHZ/qbGQB9V2nlnk2bmiG+uBs= +github.com/oasdiff/yaml v0.0.0-20241214135536-5f7845c759c8/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8= +github.com/oasdiff/yaml3 v0.0.0-20241214160948-977117996672 h1:+273wgr7to5QhwOOBE5LwjdNDFAI+8cbJVfB0Zj75aI= +github.com/oasdiff/yaml3 v0.0.0-20241214160948-977117996672/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -780,8 +782,8 @@ github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 h1:Zn5BcV76oFAb github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 h1:qY954YMn/7TaapgatD1bn4hfGQSmu56W6EgS2m8c++I= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6/go.mod h1:Ytttq7Pw4vOCu9NtRQaOeDU2dhBYUyNBe6kX4+nIIQ4= -github.com/snyk/go-application-framework v0.0.0-20250212121528-2e787c13a2cc h1:4+Dikq3mURoCWgAwK5JOXQbBppF7EfdF8a4Ev5M2ZOQ= -github.com/snyk/go-application-framework v0.0.0-20250212121528-2e787c13a2cc/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= +github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630 h1:UK4badUJV9DbhN6/lk+IJgesEpJBNUqNgzHBLL/qw30= +github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.33.0 h1:nXH4LEVrYbEuSEq4RJBObRY2fduaXiovAJt3Kni1baY= @@ -795,8 +797,10 @@ github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIK github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd h1:Dq5WSzWsP1TbVi10zPWBI5LKEBDg4Y1OhWEph1wr5WQ= github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd/go.mod h1:SULmZY7YNBsvNiQbrb/BEDdEJ84TGnfyUQxaHt8t8rY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/speakeasy-api/openapi-overlay v0.9.0 h1:Wrz6NO02cNlLzx1fB093lBlYxSI54VRhy1aSutx0PQg= -github.com/speakeasy-api/openapi-overlay v0.9.0/go.mod h1:f5FloQrHA7MsxYg9djzMD5h6dxrHjVVByWKh7an8TRc= +github.com/speakeasy-api/jsonpath v0.6.1 h1:FWbuCEPGaJTVB60NZg2orcYHGZlelbNJAcIk/JGnZvo= +github.com/speakeasy-api/jsonpath v0.6.1/go.mod h1:ymb2iSkyOycmzKwbEAYPJV/yi2rSmvBCLZJcyD+VVWw= +github.com/speakeasy-api/openapi-overlay v0.10.1 h1:XFx/GvJvtAGf4dcQ6bxzsLNf76x/QWE2X0SSZrWojBQ= +github.com/speakeasy-api/openapi-overlay v0.10.1/go.mod h1:n0iOU7AqKpNFfEt6tq7qYITC4f0yzVVdFw0S7hukemg= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= @@ -921,8 +925,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -961,8 +965,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1018,8 +1022,8 @@ golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1061,8 +1065,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1143,14 +1147,14 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1162,8 +1166,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1222,8 +1226,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1475,6 +1479,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 355caa78399f867a97350ee9bd1b85eb97622eb5 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 20 Feb 2025 13:53:35 +0100 Subject: [PATCH 2/9] chore: restore original assertions add in validation of metadata behaviour --- cliv2/cmd/cliv2/errorhandling.go | 27 +++++++++++++++------------ cliv2/cmd/cliv2/errorhandling_test.go | 13 ++++++++++++- cliv2/cmd/cliv2/main.go | 3 +++ cliv2/go.mod | 2 +- cliv2/go.sum | 4 ++-- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/cliv2/cmd/cliv2/errorhandling.go b/cliv2/cmd/cliv2/errorhandling.go index 3096a5d900..664b46a4ec 100644 --- a/cliv2/cmd/cliv2/errorhandling.go +++ b/cliv2/cmd/cliv2/errorhandling.go @@ -2,13 +2,11 @@ package main import ( "errors" - "github.com/snyk/error-catalog-golang-public/cli" "os/exec" - "github.com/snyk/error-catalog-golang-public/snyk_errors" - "github.com/snyk/go-application-framework/pkg/networking/middleware" - cli_errors "github.com/snyk/cli/cliv2/internal/errors" + "github.com/snyk/error-catalog-golang-public/cli" + "github.com/snyk/error-catalog-golang-public/snyk_errors" ) // decorate generic errors that do not contain Error-Catalog Errors @@ -26,15 +24,20 @@ func decorateError(err error, meta map[string]any) error { } var errorCatalogError snyk_errors.Error - var errWithMeta error if errors.As(err, &errorCatalogError) { - errWithMeta = middleware.AddMetaDataToErr(errorCatalogError, meta) - } else { - genericError := cli.NewGeneralCLIFailureError(err.Error()) - genericError.StatusCode = 0 - errWithMeta = middleware.AddMetaDataToErr(genericError, meta) + for k, v := range meta { + snyk_errors.WithMeta(k, v)(&errorCatalogError) + } + + return errorCatalogError + } + + genericError := cli.NewGeneralCLIFailureError(err.Error()) + genericError.StatusCode = 0 + + for k, v := range meta { + snyk_errors.WithMeta(k, v)(&genericError) } - err = errors.Join(err, errWithMeta) - return err + return errors.Join(err, genericError) } diff --git a/cliv2/cmd/cliv2/errorhandling_test.go b/cliv2/cmd/cliv2/errorhandling_test.go index 40d7b559fb..f3896e57d1 100644 --- a/cliv2/cmd/cliv2/errorhandling_test.go +++ b/cliv2/cmd/cliv2/errorhandling_test.go @@ -6,6 +6,7 @@ import ( "os/exec" "testing" + "github.com/snyk/error-catalog-golang-public/snyk_errors" "github.com/stretchr/testify/assert" "github.com/snyk/error-catalog-golang-public/cli" @@ -19,6 +20,16 @@ func Test_decorateError(t *testing.T) { assert.Nil(t, decorateError(nil, meta)) }) + t.Run("adds metadata to snyk_error", func(t *testing.T) { + metaValues := map[string]any{"Foo": "bar"} + err := cli.NewConnectionTimeoutError("") + actualErr := decorateError(err, metaValues) + var ecError snyk_errors.Error + if errors.As(actualErr, &ecError) { + assert.Equal(t, metaValues, ecError.Meta) + } + }) + t.Run("is ErrorWithExitCode", func(t *testing.T) { err := &cli_errors.ErrorWithExitCode{ ExitCode: 2, @@ -36,7 +47,7 @@ func Test_decorateError(t *testing.T) { t.Run("is already error catalog error", func(t *testing.T) { err := cli.NewConnectionTimeoutError("") actualErr := decorateError(err, meta) - assert.ErrorAs(t, actualErr, &err) + assert.Equal(t, err, actualErr) }) t.Run("is a generic error", func(t *testing.T) { diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index 7a0492fb58..b772ee7e76 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -470,6 +470,9 @@ func displayError(err error, userInterface ui.UserInterface, config configuratio jsonErrorBuffer, _ := json.MarshalIndent(jsonError, "", " ") userInterface.Output(string(jsonErrorBuffer)) } else { + if errors.Is(err, context.DeadlineExceeded) { + err = fmt.Errorf("command timed out") + } uiError := userInterface.OutputError(err) if uiError != nil { globalLogger.Err(uiError).Msg("ui failed to show error") diff --git a/cliv2/go.mod b/cliv2/go.mod index 8abc8173d5..72ec797e1f 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -17,7 +17,7 @@ require ( github.com/snyk/cli-extension-sbom v0.0.0-20241016065306-0df2be5b3b8f github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 - github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630 + github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20250213084108-c87400c00e06 diff --git a/cliv2/go.sum b/cliv2/go.sum index a85591799d..7b92871522 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -782,8 +782,8 @@ github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 h1:Zn5BcV76oFAb github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 h1:qY954YMn/7TaapgatD1bn4hfGQSmu56W6EgS2m8c++I= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6/go.mod h1:Ytttq7Pw4vOCu9NtRQaOeDU2dhBYUyNBe6kX4+nIIQ4= -github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630 h1:UK4badUJV9DbhN6/lk+IJgesEpJBNUqNgzHBLL/qw30= -github.com/snyk/go-application-framework v0.0.0-20250219152506-780621a1e630/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= +github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd h1:3uYzn8HsA16brUC6JmJQ9IuUZpykh/r50s+d1TOnNBI= +github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.33.0 h1:nXH4LEVrYbEuSEq4RJBObRY2fduaXiovAJt3Kni1baY= From ae03e33c0480f8df7cc31174df58d5d639441a95 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 20 Feb 2025 18:55:25 +0100 Subject: [PATCH 3/9] chore: rebuild error chain --- cliv2/cmd/cliv2/errorhandling.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cliv2/cmd/cliv2/errorhandling.go b/cliv2/cmd/cliv2/errorhandling.go index 664b46a4ec..5c69cc8ef1 100644 --- a/cliv2/cmd/cliv2/errorhandling.go +++ b/cliv2/cmd/cliv2/errorhandling.go @@ -29,7 +29,19 @@ func decorateError(err error, meta map[string]any) error { snyk_errors.WithMeta(k, v)(&errorCatalogError) } - return errorCatalogError + // Rebuild the error chain, replacing the original errorCatalogError + var newErr error = errorCatalogError + current := err + for current != nil { + if current.Error() == errorCatalogError.Error() { + current = errors.Unwrap(current) + continue + } + newErr = errors.Join(newErr, current) + current = errors.Unwrap(current) + } + + return newErr } genericError := cli.NewGeneralCLIFailureError(err.Error()) From 6e05bb83789f5719ae9f50477dec69ced50bf8aa Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Thu, 20 Feb 2025 19:17:59 +0100 Subject: [PATCH 4/9] test: add validation that nested ExitError are preserved --- cliv2/cmd/cliv2/errorhandling_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cliv2/cmd/cliv2/errorhandling_test.go b/cliv2/cmd/cliv2/errorhandling_test.go index f3896e57d1..bde15207e0 100644 --- a/cliv2/cmd/cliv2/errorhandling_test.go +++ b/cliv2/cmd/cliv2/errorhandling_test.go @@ -20,6 +20,18 @@ func Test_decorateError(t *testing.T) { assert.Nil(t, decorateError(nil, meta)) }) + t.Run("preserves nested ExitError", func(t *testing.T) { + err1 := cli.NewConnectionTimeoutError("") + err2 := &exec.ExitError{ + ProcessState: &os.ProcessState{}, + } + actualErr := decorateError(errors.Join(err1, err2), meta) + // Assert that err2 is present in actualErr + if !errors.Is(actualErr, err2) { + t.Errorf("Expected actualErr to contain err2, but it did not") + } + }) + t.Run("adds metadata to snyk_error", func(t *testing.T) { metaValues := map[string]any{"Foo": "bar"} err := cli.NewConnectionTimeoutError("") From cdf4b3ab96a1053b2a5e12a5b0a4eeba582be163 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Fri, 21 Feb 2025 09:29:00 +0100 Subject: [PATCH 5/9] test: closed box validation of desired behaviour --- test/jest/acceptance/error-catalog.spec.ts | 25 +++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test/jest/acceptance/error-catalog.spec.ts b/test/jest/acceptance/error-catalog.spec.ts index 829399634b..b68f1430cf 100644 --- a/test/jest/acceptance/error-catalog.spec.ts +++ b/test/jest/acceptance/error-catalog.spec.ts @@ -15,18 +15,18 @@ const integrationWorkflows: Workflow[] = [ type: 'typescript', cmd: 'test', }, - { - type: 'golang/native', - cmd: 'code test', - }, - { - type: 'typescript', - cmd: 'monitor', - }, - { - type: 'typescript', - cmd: `container monitor ${TEST_DISTROLESS_STATIC_IMAGE}`, - }, + // { + // type: 'golang/native', + // cmd: 'code test', + // }, + // { + // type: 'typescript', + // cmd: 'monitor', + // }, + // { + // type: 'typescript', + // cmd: `container monitor ${TEST_DISTROLESS_STATIC_IMAGE}`, + // }, ]; describe.each(integrationWorkflows)( @@ -49,6 +49,7 @@ describe.each(integrationWorkflows)( expect(code).toBe(2); expect(stdout).toContain('Authentication error (SNYK-0005)'); + expect(stdout).toContain(`urn:snyk:interaction`); }); }); }); From 008d6ad7573af4a03fd6c67d570cac07d3ebad59 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Fri, 21 Feb 2025 10:07:05 +0100 Subject: [PATCH 6/9] chore: refactor to append interaction id to error output --- cliv2/cmd/cliv2/errorhandling.go | 37 +++++----------------- cliv2/cmd/cliv2/errorhandling_test.go | 24 ++++---------- cliv2/cmd/cliv2/main.go | 7 ++-- test/jest/acceptance/error-catalog.spec.ts | 26 +++++++-------- 4 files changed, 29 insertions(+), 65 deletions(-) diff --git a/cliv2/cmd/cliv2/errorhandling.go b/cliv2/cmd/cliv2/errorhandling.go index 5c69cc8ef1..43a5058e14 100644 --- a/cliv2/cmd/cliv2/errorhandling.go +++ b/cliv2/cmd/cliv2/errorhandling.go @@ -4,13 +4,14 @@ import ( "errors" "os/exec" - cli_errors "github.com/snyk/cli/cliv2/internal/errors" "github.com/snyk/error-catalog-golang-public/cli" "github.com/snyk/error-catalog-golang-public/snyk_errors" + + cli_errors "github.com/snyk/cli/cliv2/internal/errors" ) // decorate generic errors that do not contain Error-Catalog Errors -func decorateError(err error, meta map[string]any) error { +func decorateError(err error) error { if err == nil { return nil } @@ -24,32 +25,10 @@ func decorateError(err error, meta map[string]any) error { } var errorCatalogError snyk_errors.Error - if errors.As(err, &errorCatalogError) { - for k, v := range meta { - snyk_errors.WithMeta(k, v)(&errorCatalogError) - } - - // Rebuild the error chain, replacing the original errorCatalogError - var newErr error = errorCatalogError - current := err - for current != nil { - if current.Error() == errorCatalogError.Error() { - current = errors.Unwrap(current) - continue - } - newErr = errors.Join(newErr, current) - current = errors.Unwrap(current) - } - - return newErr + if !errors.As(err, &errorCatalogError) { + genericError := cli.NewGeneralCLIFailureError(err.Error()) + genericError.StatusCode = 0 + err = errors.Join(err, genericError) } - - genericError := cli.NewGeneralCLIFailureError(err.Error()) - genericError.StatusCode = 0 - - for k, v := range meta { - snyk_errors.WithMeta(k, v)(&genericError) - } - - return errors.Join(err, genericError) + return err } diff --git a/cliv2/cmd/cliv2/errorhandling_test.go b/cliv2/cmd/cliv2/errorhandling_test.go index bde15207e0..13bd00532b 100644 --- a/cliv2/cmd/cliv2/errorhandling_test.go +++ b/cliv2/cmd/cliv2/errorhandling_test.go @@ -6,7 +6,6 @@ import ( "os/exec" "testing" - "github.com/snyk/error-catalog-golang-public/snyk_errors" "github.com/stretchr/testify/assert" "github.com/snyk/error-catalog-golang-public/cli" @@ -15,9 +14,8 @@ import ( ) func Test_decorateError(t *testing.T) { - meta := map[string]any{} t.Run("is nil error", func(t *testing.T) { - assert.Nil(t, decorateError(nil, meta)) + assert.Nil(t, decorateError(nil)) }) t.Run("preserves nested ExitError", func(t *testing.T) { @@ -25,46 +23,36 @@ func Test_decorateError(t *testing.T) { err2 := &exec.ExitError{ ProcessState: &os.ProcessState{}, } - actualErr := decorateError(errors.Join(err1, err2), meta) + actualErr := decorateError(errors.Join(err1, err2)) // Assert that err2 is present in actualErr if !errors.Is(actualErr, err2) { t.Errorf("Expected actualErr to contain err2, but it did not") } }) - t.Run("adds metadata to snyk_error", func(t *testing.T) { - metaValues := map[string]any{"Foo": "bar"} - err := cli.NewConnectionTimeoutError("") - actualErr := decorateError(err, metaValues) - var ecError snyk_errors.Error - if errors.As(actualErr, &ecError) { - assert.Equal(t, metaValues, ecError.Meta) - } - }) - t.Run("is ErrorWithExitCode", func(t *testing.T) { err := &cli_errors.ErrorWithExitCode{ ExitCode: 2, } - assert.Equal(t, err, decorateError(err, meta)) + assert.Equal(t, err, decorateError(err)) }) t.Run("is ExitError", func(t *testing.T) { err := &exec.ExitError{ ProcessState: &os.ProcessState{}, } - assert.Equal(t, err, decorateError(err, meta)) + assert.Equal(t, err, decorateError(err)) }) t.Run("is already error catalog error", func(t *testing.T) { err := cli.NewConnectionTimeoutError("") - actualErr := decorateError(err, meta) + actualErr := decorateError(err) assert.Equal(t, err, actualErr) }) t.Run("is a generic error", func(t *testing.T) { err := errors.New("generic error") - actualErr := decorateError(err, meta) + actualErr := decorateError(err) expectedError := cli.NewGeneralCLIFailureError("") assert.ErrorIs(t, actualErr, err) assert.ErrorAs(t, actualErr, &expectedError) diff --git a/cliv2/cmd/cliv2/main.go b/cliv2/cmd/cliv2/main.go index b772ee7e76..addde4cd55 100644 --- a/cliv2/cmd/cliv2/main.go +++ b/cliv2/cmd/cliv2/main.go @@ -477,6 +477,7 @@ func displayError(err error, userInterface ui.UserInterface, config configuratio if uiError != nil { globalLogger.Err(uiError).Msg("ui failed to show error") } + userInterface.Output(fmt.Sprintf("\nID: %s", interactionId)) } } } @@ -595,11 +596,7 @@ func MainWithErrorCode() (int, []error) { } if err != nil { - // add any meta fields to the err - meta := map[string]any{ - "interactionId": interactionId, - } - err = decorateError(err, meta) + err = decorateError(err) errorList = append(errorList, err) for _, tempError := range errorList { diff --git a/test/jest/acceptance/error-catalog.spec.ts b/test/jest/acceptance/error-catalog.spec.ts index b68f1430cf..773b946e79 100644 --- a/test/jest/acceptance/error-catalog.spec.ts +++ b/test/jest/acceptance/error-catalog.spec.ts @@ -13,20 +13,20 @@ interface Workflow { const integrationWorkflows: Workflow[] = [ { type: 'typescript', - cmd: 'test', + cmd: 'test -d', + }, + { + type: 'golang/native', + cmd: 'code test', + }, + { + type: 'typescript', + cmd: 'monitor', + }, + { + type: 'typescript', + cmd: `container monitor ${TEST_DISTROLESS_STATIC_IMAGE}`, }, - // { - // type: 'golang/native', - // cmd: 'code test', - // }, - // { - // type: 'typescript', - // cmd: 'monitor', - // }, - // { - // type: 'typescript', - // cmd: `container monitor ${TEST_DISTROLESS_STATIC_IMAGE}`, - // }, ]; describe.each(integrationWorkflows)( From dcbe9bed39d8ec0cafaf1ebad9b66ea104114e12 Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Fri, 21 Feb 2025 11:23:36 +0100 Subject: [PATCH 7/9] chore: clean up -d flag --- cliv2/cmd/cliv2/main_test.go | 1 + test/jest/acceptance/error-catalog.spec.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cliv2/cmd/cliv2/main_test.go b/cliv2/cmd/cliv2/main_test.go index fcf078cc2f..1c5443a5b5 100644 --- a/cliv2/cmd/cliv2/main_test.go +++ b/cliv2/cmd/cliv2/main_test.go @@ -629,6 +629,7 @@ func Test_displayError(t *testing.T) { t.Run("prints out generic error messages", func(t *testing.T) { err := errors.New("test error") userInterface.EXPECT().OutputError(err).Times(1) + userInterface.EXPECT().Output(gomock.Any()).Times(1) config := configuration.NewWithOpts(configuration.WithAutomaticEnv()) displayError(err, userInterface, config) diff --git a/test/jest/acceptance/error-catalog.spec.ts b/test/jest/acceptance/error-catalog.spec.ts index 773b946e79..149163b368 100644 --- a/test/jest/acceptance/error-catalog.spec.ts +++ b/test/jest/acceptance/error-catalog.spec.ts @@ -13,7 +13,7 @@ interface Workflow { const integrationWorkflows: Workflow[] = [ { type: 'typescript', - cmd: 'test -d', + cmd: 'test', }, { type: 'golang/native', From cdffc90cf1a8029b9aa537d13e75735ee402f80a Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Fri, 21 Feb 2025 12:25:49 +0100 Subject: [PATCH 8/9] chore(deps): upgrade go-application-framework@04faf47716bb0f1a05801823b7a851e33c6dbd5f --- cliv2/go.mod | 2 +- cliv2/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cliv2/go.mod b/cliv2/go.mod index 72ec797e1f..c354bd4942 100644 --- a/cliv2/go.mod +++ b/cliv2/go.mod @@ -17,7 +17,7 @@ require ( github.com/snyk/cli-extension-sbom v0.0.0-20241016065306-0df2be5b3b8f github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 - github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd + github.com/snyk/go-application-framework v0.0.0-20250221112502-04faf47716bb github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 github.com/snyk/snyk-iac-capture v0.6.5 github.com/snyk/snyk-ls v0.0.0-20250213084108-c87400c00e06 diff --git a/cliv2/go.sum b/cliv2/go.sum index 7b92871522..f2315d9030 100644 --- a/cliv2/go.sum +++ b/cliv2/go.sum @@ -782,8 +782,8 @@ github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7 h1:Zn5BcV76oFAb github.com/snyk/container-cli v0.0.0-20240821111304-7ca1c415a5d7/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6 h1:qY954YMn/7TaapgatD1bn4hfGQSmu56W6EgS2m8c++I= github.com/snyk/error-catalog-golang-public v0.0.0-20250121101159-e6a61b2bfae6/go.mod h1:Ytttq7Pw4vOCu9NtRQaOeDU2dhBYUyNBe6kX4+nIIQ4= -github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd h1:3uYzn8HsA16brUC6JmJQ9IuUZpykh/r50s+d1TOnNBI= -github.com/snyk/go-application-framework v0.0.0-20250220150450-1833fdd0eddd/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= +github.com/snyk/go-application-framework v0.0.0-20250221112502-04faf47716bb h1:DF55ZsFXyoWelb4kdt6s8h07l6ypqxHd8i1ZSPPtTMQ= +github.com/snyk/go-application-framework v0.0.0-20250221112502-04faf47716bb/go.mod h1:hqn5+hhsz17IC/BhsMcUQUKiyyb3txYzudu1mqs47Jo= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk= github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg= github.com/snyk/policy-engine v0.33.0 h1:nXH4LEVrYbEuSEq4RJBObRY2fduaXiovAJt3Kni1baY= From 3314c9e4310dcf86e23298317df0fc60111d887c Mon Sep 17 00:00:00 2001 From: Luke Watts Date: Fri, 21 Feb 2025 14:15:35 +0100 Subject: [PATCH 9/9] test: extend mock expect checks --- cliv2/cmd/cliv2/main_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cliv2/cmd/cliv2/main_test.go b/cliv2/cmd/cliv2/main_test.go index 1c5443a5b5..b2b43d7e89 100644 --- a/cliv2/cmd/cliv2/main_test.go +++ b/cliv2/cmd/cliv2/main_test.go @@ -660,6 +660,7 @@ func Test_displayError(t *testing.T) { t.Run("prints messages of error wrapping exec.ExitError", func(t *testing.T) { err := &wrErr{wraps: &exec.ExitError{}} userInterface.EXPECT().OutputError(err).Times(1) + userInterface.EXPECT().Output(gomock.Any()).Times(1) config := configuration.NewWithOpts(configuration.WithAutomaticEnv()) displayError(err, userInterface, config)