frostfs-node/cmd/internal/common/exit.go
Aleksey Savchuk 410b6f70ba
All checks were successful
Vulncheck / Vulncheck (push) Successful in 1m21s
Build / Build Components (push) Successful in 1m46s
Pre-commit hooks / Pre-commit (push) Successful in 1m48s
Tests and linters / gopls check (push) Successful in 3m58s
Tests and linters / Run gofumpt (push) Successful in 4m21s
OCI image / Build container images (push) Successful in 4m45s
Tests and linters / Lint (push) Successful in 4m49s
Tests and linters / Staticcheck (push) Successful in 4m45s
Tests and linters / Tests with -race (push) Successful in 4m51s
Tests and linters / Tests (push) Successful in 4m55s
[#1716] cli: Return trace ID on operation failure
Close #1716

Change-Id: I293d0cc6b7331517e8cde42eae07d65384976da5
Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
2025-04-15 18:38:55 +03:00

63 lines
1.2 KiB
Go

package common
import (
"errors"
"fmt"
"os"
sdkstatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
"github.com/spf13/cobra"
)
// ExitOnErr prints error and exits with a code that matches
// one of the common errors from sdk library. If no errors
// found, exits with 1 code.
// Does nothing if passed error in nil.
func ExitOnErr(cmd *cobra.Command, errFmt string, err error) {
if err == nil {
return
}
if errFmt != "" {
err = fmt.Errorf(errFmt, err)
}
const (
_ = iota
internal
aclDenied
apemanagerDenied
)
var (
code int
internalErr = new(sdkstatus.ServerInternal)
accessErr = new(sdkstatus.ObjectAccessDenied)
apemanagerErr = new(sdkstatus.APEManagerAccessDenied)
)
switch {
case errors.As(err, &internalErr):
code = internal
case errors.As(err, &accessErr):
code = aclDenied
err = fmt.Errorf("%w: %s", err, accessErr.Reason())
case errors.As(err, &apemanagerErr):
code = apemanagerDenied
err = fmt.Errorf("%w: %s", err, apemanagerErr.Reason())
default:
code = internal
}
cmd.PrintErrln(err)
for p := cmd; p != nil; p = p.Parent() {
if p.PersistentPostRun != nil {
p.PersistentPostRun(cmd, nil)
if !cobra.EnableTraverseRunHooks {
break
}
}
}
os.Exit(code)
}