@@ -18,6 +18,7 @@ package api
18
18
19
19
import (
20
20
"context"
21
+ "errors"
21
22
"fmt"
22
23
"io"
23
24
"net"
@@ -29,7 +30,6 @@ import (
29
30
30
31
"github.com/emicklei/go-restful/v3"
31
32
"github.com/go-logr/logr"
32
- "github.com/pkg/errors"
33
33
apierrors "k8s.io/apimachinery/pkg/api/errors"
34
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35
35
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -274,7 +274,11 @@ func (h *apiServerHandler) apiV1Create(req *restful.Request, resp *restful.Respo
274
274
// TODO: consider check vs enforce for namespace on the object - namespace on the request path
275
275
obj .SetNamespace (req .PathParameter ("namespace" ))
276
276
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 ())
278
282
return
279
283
}
280
284
if err := resp .WriteEntity (obj ); err != nil {
@@ -324,7 +328,11 @@ func (h *apiServerHandler) apiV1List(req *restful.Request, resp *restful.Respons
324
328
}
325
329
326
330
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 ())
328
336
return
329
337
}
330
338
if err := resp .WriteEntity (list ); err != nil {
@@ -439,7 +447,11 @@ func (h *apiServerHandler) apiV1Update(req *restful.Request, resp *restful.Respo
439
447
// TODO: consider check vs enforce for namespace on the object - namespace on the request path
440
448
obj .SetNamespace (req .PathParameter ("namespace" ))
441
449
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 ())
443
455
return
444
456
}
445
457
if err := resp .WriteEntity (obj ); err != nil {
@@ -488,7 +500,11 @@ func (h *apiServerHandler) apiV1Patch(req *restful.Request, resp *restful.Respon
488
500
return
489
501
}
490
502
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 ())
492
508
return
493
509
}
494
510
if err := resp .WriteEntity (obj ); err != nil {
@@ -525,7 +541,11 @@ func (h *apiServerHandler) apiV1Delete(req *restful.Request, resp *restful.Respo
525
541
obj .SetNamespace (req .PathParameter ("namespace" ))
526
542
527
543
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 ())
529
549
return
530
550
}
531
551
}
@@ -613,11 +633,11 @@ func (h *apiServerHandler) healthz(_ *restful.Request, resp *restful.Response) {
613
633
func requestToGVK (req * restful.Request ) (* schema.GroupVersionKind , error ) {
614
634
resourceList := getAPIResourceList (req )
615
635
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 ())
617
637
}
618
638
gv , err := schema .ParseGroupVersion (resourceList .GroupVersion )
619
639
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 )
621
641
}
622
642
623
643
resource := req .PathParameter ("resource" )
@@ -627,7 +647,7 @@ func requestToGVK(req *restful.Request) (*schema.GroupVersionKind, error) {
627
647
return & gvk , nil
628
648
}
629
649
}
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 ())
631
651
}
632
652
633
653
func getAPIResourceList (req * restful.Request ) * metav1.APIResourceList {
0 commit comments