* 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>
109 lines
2.4 KiB
Go
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)
|
|
}
|