blob: 600ea295ed06a778fa174f6b9899d49ffa3fd24e [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"strings"
)
// Values should try to use sendmail-style values as in <sysexits.h>
// See e.g. https://man.openbsd.org/sysexits.3
// or `less /usr/includes/sysexits.h` if you're on Linux
//
// Picking the right range is tricky--there are a lot of reserved ones (see
// https://www.tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF) and then some
// used by convention (see sysexits).
//
// The intention here is to use 64-78 in a way that matches the attempt in
// sysexits to signify some error running istioctl, and use 79-125 as custom
// error codes for other info that we'd like to use to pass info on.
const (
ExitUnknownError = 1 // for compatibility with existing exit code
ExitIncorrectUsage = 64
ExitDataError = 65 // some format error with input data
// below here are non-zero exit codes that don't indicate an error with istioctl itself
ExitAnalyzerFoundIssues = 79 // istioctl analyze found issues, for CI/CD
)
func GetExitCode(e error) int {
if strings.Contains(e.Error(), "unknown command") {
e = CommandParseError{e}
}
switch e.(type) {
case CommandParseError:
return ExitIncorrectUsage
case FileParseError:
return ExitDataError
case AnalyzerFoundIssuesError:
return ExitAnalyzerFoundIssues
default:
return ExitUnknownError
}
}