@@ -18,6 +18,7 @@ package api
1818
1919import (
2020 "context"
21+ "errors"
2122 "fmt"
2223 "io"
2324 "net"
@@ -29,7 +30,6 @@ import (
2930
3031 "github.com/emicklei/go-restful/v3"
3132 "github.com/go-logr/logr"
32- "github.com/pkg/errors"
3333 apierrors "k8s.io/apimachinery/pkg/api/errors"
3434 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3535 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -274,7 +274,11 @@ func (h *apiServerHandler) apiV1Create(req *restful.Request, resp *restful.Respo
274274 // TODO: consider check vs enforce for namespace on the object - namespace on the request path
275275 obj .SetNamespace (req .PathParameter ("namespace" ))
276276 if err := cloudClient .Create (ctx , obj ); err != nil {
277- _ = resp .WriteErrorString (http .StatusInternalServerError , err .Error ())
277+ if status , ok := err .(apierrors.APIStatus ); ok || errors .As (err , & status ) {
278+ _ = resp .WriteHeaderAndEntity (int (status .Status ().Code ), status )
279+ return
280+ }
281+ _ = resp .WriteHeaderAndEntity (http .StatusInternalServerError , err .Error ())
278282 return
279283 }
280284 if err := resp .WriteEntity (obj ); err != nil {
@@ -324,7 +328,11 @@ func (h *apiServerHandler) apiV1List(req *restful.Request, resp *restful.Respons
324328 }
325329
326330 if err := cloudClient .List (ctx , list , listOpts ... ); err != nil {
327- _ = resp .WriteErrorString (http .StatusInternalServerError , err .Error ())
331+ if status , ok := err .(apierrors.APIStatus ); ok || errors .As (err , & status ) {
332+ _ = resp .WriteHeaderAndEntity (int (status .Status ().Code ), status )
333+ return
334+ }
335+ _ = resp .WriteHeaderAndEntity (http .StatusInternalServerError , err .Error ())
328336 return
329337 }
330338 if err := resp .WriteEntity (list ); err != nil {
@@ -439,7 +447,11 @@ func (h *apiServerHandler) apiV1Update(req *restful.Request, resp *restful.Respo
439447 // TODO: consider check vs enforce for namespace on the object - namespace on the request path
440448 obj .SetNamespace (req .PathParameter ("namespace" ))
441449 if err := cloudClient .Update (ctx , obj ); err != nil {
442- _ = resp .WriteErrorString (http .StatusInternalServerError , err .Error ())
450+ if status , ok := err .(apierrors.APIStatus ); ok || errors .As (err , & status ) {
451+ _ = resp .WriteHeaderAndEntity (int (status .Status ().Code ), status )
452+ return
453+ }
454+ _ = resp .WriteHeaderAndEntity (http .StatusInternalServerError , err .Error ())
443455 return
444456 }
445457 if err := resp .WriteEntity (obj ); err != nil {
@@ -488,7 +500,11 @@ func (h *apiServerHandler) apiV1Patch(req *restful.Request, resp *restful.Respon
488500 return
489501 }
490502 if err := cloudClient .Patch (ctx , obj , patch ); err != nil {
491- _ = resp .WriteErrorString (http .StatusInternalServerError , err .Error ())
503+ if status , ok := err .(apierrors.APIStatus ); ok || errors .As (err , & status ) {
504+ _ = resp .WriteHeaderAndEntity (int (status .Status ().Code ), status )
505+ return
506+ }
507+ _ = resp .WriteHeaderAndEntity (http .StatusInternalServerError , err .Error ())
492508 return
493509 }
494510 if err := resp .WriteEntity (obj ); err != nil {
@@ -525,7 +541,11 @@ func (h *apiServerHandler) apiV1Delete(req *restful.Request, resp *restful.Respo
525541 obj .SetNamespace (req .PathParameter ("namespace" ))
526542
527543 if err := cloudClient .Delete (ctx , obj ); err != nil {
528- _ = resp .WriteErrorString (http .StatusInternalServerError , err .Error ())
544+ if status , ok := err .(apierrors.APIStatus ); ok || errors .As (err , & status ) {
545+ _ = resp .WriteHeaderAndEntity (int (status .Status ().Code ), status )
546+ return
547+ }
548+ _ = resp .WriteHeaderAndEntity (http .StatusInternalServerError , err .Error ())
529549 return
530550 }
531551}
@@ -613,11 +633,11 @@ func (h *apiServerHandler) healthz(_ *restful.Request, resp *restful.Response) {
613633func requestToGVK (req * restful.Request ) (* schema.GroupVersionKind , error ) {
614634 resourceList := getAPIResourceList (req )
615635 if resourceList == nil {
616- return nil , errors .Errorf ("no APIResourceList defined for %s" , req .PathParameters ())
636+ return nil , fmt .Errorf ("no APIResourceList defined for %s" , req .PathParameters ())
617637 }
618638 gv , err := schema .ParseGroupVersion (resourceList .GroupVersion )
619639 if err != nil {
620- return nil , errors .Errorf ("invalid group version in APIResourceList: %s" , resourceList .GroupVersion )
640+ return nil , fmt .Errorf ("invalid group version in APIResourceList: %s" , resourceList .GroupVersion )
621641 }
622642
623643 resource := req .PathParameter ("resource" )
@@ -627,7 +647,7 @@ func requestToGVK(req *restful.Request) (*schema.GroupVersionKind, error) {
627647 return & gvk , nil
628648 }
629649 }
630- return nil , errors .Errorf ("Resource %s is not defined in the APIResourceList for %s" , resource , req .PathParameters ())
650+ return nil , fmt .Errorf ("resource %s is not defined in the APIResourceList for %s" , resource , req .PathParameters ())
631651}
632652
633653func getAPIResourceList (req * restful.Request ) * metav1.APIResourceList {
0 commit comments