mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package resource
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
)
|
|
|
|
// Package-level errors.
|
|
var (
|
|
ErrOptimisticLockingFailed = errors.New("optimistic locking failed")
|
|
ErrNotImplementedYet = errors.New("not implemented yet")
|
|
)
|
|
|
|
func NewBadRequestError(msg string) *ErrorResult {
|
|
return &ErrorResult{
|
|
Message: msg,
|
|
Code: http.StatusBadRequest,
|
|
Reason: string(metav1.StatusReasonBadRequest),
|
|
}
|
|
}
|
|
|
|
func NewNotFoundError(key *ResourceKey) *ErrorResult {
|
|
return &ErrorResult{
|
|
Code: http.StatusNotFound,
|
|
Details: &ErrorDetails{
|
|
Group: key.Group,
|
|
Kind: key.Resource, // yup, resource as kind same is true in apierrors.NewNotFound()
|
|
Name: key.Name,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Convert golang errors to status result errors that can be returned to a client
|
|
func AsErrorResult(err error) *ErrorResult {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
apistatus, ok := err.(apierrors.APIStatus)
|
|
if ok {
|
|
s := apistatus.Status()
|
|
res := &ErrorResult{
|
|
Message: s.Message,
|
|
Reason: string(s.Reason),
|
|
Code: s.Code,
|
|
}
|
|
if s.Details != nil {
|
|
res.Details = &ErrorDetails{
|
|
Group: s.Details.Group,
|
|
Kind: s.Details.Kind,
|
|
Name: s.Details.Name,
|
|
Uid: string(s.Details.UID),
|
|
RetryAfterSeconds: s.Details.RetryAfterSeconds,
|
|
}
|
|
for _, c := range s.Details.Causes {
|
|
res.Details.Causes = append(res.Details.Causes, &ErrorCause{
|
|
Reason: string(c.Type),
|
|
Message: c.Message,
|
|
Field: c.Field,
|
|
})
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
// TODO... better conversion??
|
|
return &ErrorResult{
|
|
Message: err.Error(),
|
|
Code: 500,
|
|
}
|
|
}
|
|
|
|
func GetError(res *ErrorResult) error {
|
|
if res == nil {
|
|
return nil
|
|
}
|
|
|
|
status := &apierrors.StatusError{ErrStatus: metav1.Status{
|
|
Status: metav1.StatusFailure,
|
|
Code: res.Code,
|
|
Reason: metav1.StatusReason(res.Reason),
|
|
Message: res.Message,
|
|
}}
|
|
if res.Details != nil {
|
|
status.ErrStatus.Details = &metav1.StatusDetails{
|
|
Group: res.Details.Group,
|
|
Kind: res.Details.Kind,
|
|
Name: res.Details.Name,
|
|
UID: types.UID(res.Details.Uid),
|
|
RetryAfterSeconds: res.Details.RetryAfterSeconds,
|
|
}
|
|
for _, c := range res.Details.Causes {
|
|
status.ErrStatus.Details.Causes = append(status.ErrStatus.Details.Causes, metav1.StatusCause{
|
|
Type: metav1.CauseType(c.Reason),
|
|
Message: c.Message,
|
|
Field: c.Field,
|
|
})
|
|
}
|
|
}
|
|
return status
|
|
}
|