Files
kubesphere/pkg/apiserver/proxies/unregistered.go
Wenhao Zhou 23df7b051b ResourceGetter v1beta1 (#5416)
* add resource getter & reader

Signed-off-by: Wenhao Zhou <wenhaozhou@yunify.com>

* add resource v1beta1 handler

* delete gvrToGvk map instead of using the dynamicRESTMapper for getting gvk, and rename the ResourceLister to ResourceGetter

* add unregisteredMiddleware filter

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* add secret contains benchmark & add fieldSelector to resourcev1beta1

Signed-off-by: Wenhao Zhou <wenhaozhou@yunify.com>

* delete crds models

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* delete parameterExtractor and instead of requestInfo

Signed-off-by: Wenhao Zhou <wenhaozhou@yunify.com>

* add benchmark test

* move fieldSelector to DefaultObjectMetaFilter

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* move fieldSelector to DefaultObjectMetaFilter

* change registeredGv type to set

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* update filter chains

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* fix fieldSelector cannot work

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

* fix: list known type do not need served label

Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>

---------

Signed-off-by: Wenhao Zhou <wenhaozhou@yunify.com>
Signed-off-by: wenhaozhou <wenhaozhou@yunify.com>
2023-02-08 15:00:15 +08:00

109 lines
2.4 KiB
Go

package proxies
import (
"fmt"
"net/http"
"strings"
"github.com/emicklei/go-restful"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/klog/v2"
"kubesphere.io/kubesphere/pkg/api"
"kubesphere.io/kubesphere/pkg/apiserver/filters"
"kubesphere.io/kubesphere/pkg/apiserver/query"
"kubesphere.io/kubesphere/pkg/apiserver/request"
"kubesphere.io/kubesphere/pkg/models/resources/v1beta1"
)
type unregisteredMiddleware struct {
registeredGv sets.String
resourceGetter v1beta1.ResourceGetter
}
func NewUnregisteredMiddleware(c *restful.Container, resourceGetter v1beta1.ResourceGetter) filters.Middleware {
middleware := &unregisteredMiddleware{
registeredGv: sets.NewString(),
resourceGetter: resourceGetter,
}
for _, ws := range c.RegisteredWebServices() {
rootPath := ws.RootPath()
if strings.HasPrefix(rootPath, "/kapis") {
middleware.registeredGv.Insert(rootPath)
}
}
return middleware
}
func (u *unregisteredMiddleware) Handle(w http.ResponseWriter, req *http.Request) bool {
if req.Method != http.MethodGet {
return false
}
reqInfo, exist := request.RequestInfoFrom(req.Context())
if !exist {
return false
}
if reqInfo.IsKubernetesRequest {
return false
}
gvr := schema.GroupVersionResource{
Group: reqInfo.APIGroup,
Version: reqInfo.APIVersion,
Resource: reqInfo.Resource,
}
if gvr.Group == "" ||
gvr.Version == "" ||
gvr.Resource == "" {
return false
}
rootPath := fmt.Sprintf("/kapis/%s/%s", gvr.Group, gvr.Version)
if u.registeredGv.Has(rootPath) {
return true
}
var (
listReq bool
q *query.Query
)
restfulReq := restful.NewRequest(req)
restfulResp := restful.NewResponse(w)
if reqInfo.Name == "" {
listReq = true
q = query.ParseQueryParameter(restfulReq)
}
var (
result interface{}
err error
)
if listReq {
result, err = u.resourceGetter.ListResources(gvr, reqInfo.Namespace, q)
} else {
result, err = u.resourceGetter.GetResource(gvr, reqInfo.Name, reqInfo.Namespace)
}
handleResponse(result, err, restfulResp, restfulReq)
return true
}
func handleResponse(result interface{}, err error, resp *restful.Response, req *restful.Request) {
resp.SetRequestAccepts(restful.MIME_JSON)
if err != nil {
if err == v1beta1.ErrResourceNotSupported {
api.HandleBadRequest(resp, req, err)
return
}
klog.Error(err)
api.HandleError(resp, req, err)
return
}
resp.WriteEntity(result)
}