add api error for apply conflicts and check in field manager

This commit is contained in:
Kevin Wiesmüller
2019-01-04 17:52:17 +01:00
parent e2a1d340e8
commit b9ccd9c3cb
2 changed files with 29 additions and 0 deletions

View File

@@ -27,6 +27,7 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/validation/field"
"sigs.k8s.io/structured-merge-diff/merge"
)
const (
@@ -184,6 +185,30 @@ func NewConflict(qualifiedResource schema.GroupResource, name string, err error)
}}
}
// NewApplyConflict returns an error including details on the requests apply conflicts
func NewApplyConflict(conflicts merge.Conflicts, err error) *StatusError {
causes := make([]metav1.StatusCause, 0, len(conflicts))
for i := range conflicts {
err := conflicts[i]
causes = append(causes, metav1.StatusCause{
Type: metav1.CauseType("conflict"),
Message: err.Error(),
Field: err.Path.String(),
})
}
return &StatusError{ErrStatus: metav1.Status{
Status: metav1.StatusFailure,
Code: http.StatusConflict,
Reason: metav1.StatusReasonConflict,
Details: &metav1.StatusDetails{
// TODO: Get obj details here?
Causes: causes,
},
Message: fmt.Sprintf("Apply failed with %d conflicts: %v", len(conflicts), err),
}}
}
// NewGone returns an error indicating the item no longer available at the server and no forwarding address is known.
func NewGone(message string) *StatusError {
return &StatusError{metav1.Status{

View File

@@ -19,6 +19,7 @@ package fieldmanager
import (
"fmt"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal"
@@ -136,6 +137,9 @@ func (f *FieldManager) Apply(liveObj runtime.Object, patch []byte, force bool) (
apiVersion := fieldpath.APIVersion(f.groupVersion.String())
newObjTyped, managed, err := f.updater.Apply(liveObjTyped, patchObjTyped, apiVersion, managed, applyManager, force)
if err != nil {
if conflicts, ok := err.(merge.Conflicts); ok {
return nil, errors.NewApplyConflict(conflicts, err)
}
return nil, err
}