From 05e949103ecd799c4c0f40cd4f0dbff400ded640 Mon Sep 17 00:00:00 2001 From: hongming Date: Thu, 9 Jan 2020 15:16:05 +0800 Subject: [PATCH] refactor resources API Signed-off-by: hongming --- pkg/apiserver/devops/member.go | 6 +- pkg/apiserver/iam/am.go | 21 ++--- pkg/apiserver/iam/im.go | 12 +-- pkg/apiserver/iam/workspaces.go | 12 +-- pkg/apiserver/openpitrix/applications.go | 17 ++-- pkg/apiserver/openpitrix/apps.go | 59 +++++-------- pkg/apiserver/openpitrix/categories.go | 15 ++-- pkg/apiserver/openpitrix/repos.go | 16 ++-- pkg/apiserver/resources/resources.go | 13 +-- pkg/apiserver/tenant/tenant.go | 27 +++--- pkg/models/openpitrix/applications.go | 12 +-- pkg/models/openpitrix/apps.go | 38 ++++---- pkg/models/openpitrix/categories.go | 4 +- pkg/models/openpitrix/repos.go | 16 ++-- pkg/models/openpitrix/types.go | 16 ++++ pkg/models/resources/appplications.go | 59 ++----------- pkg/models/resources/clusterroles.go | 58 +++---------- pkg/models/resources/configmaps.go | 66 +++----------- pkg/models/resources/cronjobs.go | 55 +++--------- pkg/models/resources/daemonsets.go | 63 +++----------- pkg/models/resources/deployments.go | 58 +++---------- .../resources/horizontalpodautoscalers.go | 60 +++---------- pkg/models/resources/ingresses.go | 62 ++----------- pkg/models/resources/jobs.go | 59 +++---------- pkg/models/resources/namespaces.go | 66 +++----------- pkg/models/resources/nodes.go | 73 ++++------------ .../resources/persistentvolumeclaims.go | 52 ++--------- pkg/models/resources/pods.go | 57 +++--------- pkg/models/resources/resources.go | 86 +++++++++++++++++-- pkg/models/resources/roles.go | 54 ++---------- pkg/models/resources/s2ibuilder.go | 59 ++----------- pkg/models/resources/s2ibuildertemplate.go | 58 ++----------- pkg/models/resources/s2irun.go | 57 ++---------- pkg/models/resources/secrets.go | 61 +++---------- pkg/models/resources/services.go | 66 +++----------- pkg/models/resources/statefulsets.go | 63 +++----------- pkg/models/resources/storageclasses.go | 62 +++---------- pkg/models/resources/workspaces.go | 62 ++----------- pkg/models/tenant/workspaces.go | 4 +- pkg/server/params/params.go | 41 +++++---- 40 files changed, 469 insertions(+), 1276 deletions(-) diff --git a/pkg/apiserver/devops/member.go b/pkg/apiserver/devops/member.go index d168e833d..56201ce16 100644 --- a/pkg/apiserver/devops/member.go +++ b/pkg/apiserver/devops/member.go @@ -38,9 +38,9 @@ func GetDevOpsProjectMembersHandler(request *restful.Request, resp *restful.Resp return } orderBy := request.QueryParameter(params.OrderByParam) - reverse := params.ParseReverse(request) - limit, offset := params.ParsePaging(request.QueryParameter(params.PagingParam)) - conditions, err := params.ParseConditions(request.QueryParameter(params.ConditionsParam)) + reverse := params.GetBoolValueWithDefault(request, params.ReverseParam, false) + limit, offset := params.ParsePaging(request) + conditions, err := params.ParseConditions(request) project, err := devops.GetProjectMembers(projectId, conditions, orderBy, reverse, limit, offset) diff --git a/pkg/apiserver/iam/am.go b/pkg/apiserver/iam/am.go index 21cc996a6..9288c36b8 100644 --- a/pkg/apiserver/iam/am.go +++ b/pkg/apiserver/iam/am.go @@ -21,6 +21,7 @@ import ( "github.com/emicklei/go-restful" "k8s.io/api/rbac/v1" k8serr "k8s.io/apimachinery/pkg/api/errors" + "kubesphere.io/kubesphere/pkg/models/resources" "kubesphere.io/kubesphere/pkg/server/params" "net/http" "sort" @@ -50,10 +51,10 @@ func ListRoleUsers(req *restful.Request, resp *restful.Response) { } func ListClusterRoles(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) + conditions, err := params.ParseConditions(req) orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, false) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -73,10 +74,10 @@ func ListClusterRoles(req *restful.Request, resp *restful.Response) { func ListRoles(req *restful.Request, resp *restful.Response) { namespace := req.PathParameter("namespace") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, resources.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -161,10 +162,10 @@ func ListClusterRoleRules(req *restful.Request, resp *restful.Response) { func ListClusterRoleUsers(req *restful.Request, resp *restful.Response) { clusterRoleName := req.PathParameter("clusterrole") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) + conditions, err := params.ParseConditions(req) orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, false) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) diff --git a/pkg/apiserver/iam/im.go b/pkg/apiserver/iam/im.go index 2957d0e21..d7ecb7e06 100644 --- a/pkg/apiserver/iam/im.go +++ b/pkg/apiserver/iam/im.go @@ -20,6 +20,7 @@ package iam import ( "fmt" "k8s.io/klog" + "kubesphere.io/kubesphere/pkg/models/resources" "kubesphere.io/kubesphere/pkg/server/params" "net/http" "net/mail" @@ -281,15 +282,16 @@ func Precheck(req *restful.Request, resp *restful.Response) { func ListUsers(req *restful.Request, resp *restful.Response) { - if check := req.QueryParameter("check"); check != "" { + // TODO use dry-run instead + if check := params.GetBoolValueWithDefault(req, "check", false); check { Precheck(req, resp) return } - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - reverse := params.ParseReverse(req) + limit, offset := params.ParsePaging(req) + conditions, err := params.ParseConditions(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, resources.CreateTime) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) if err != nil { klog.Info(err) diff --git a/pkg/apiserver/iam/workspaces.go b/pkg/apiserver/iam/workspaces.go index 7bbdecb3f..3977ae2f2 100644 --- a/pkg/apiserver/iam/workspaces.go +++ b/pkg/apiserver/iam/workspaces.go @@ -32,10 +32,10 @@ import ( func ListWorkspaceRoles(req *restful.Request, resp *restful.Response) { workspace := req.PathParameter("workspace") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) + conditions, err := params.ParseConditions(req) orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, false) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -145,10 +145,10 @@ func RemoveUser(req *restful.Request, resp *restful.Response) { func ListWorkspaceUsers(req *restful.Request, resp *restful.Response) { workspace := req.PathParameter("workspace") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) + conditions, err := params.ParseConditions(req) orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, false) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) diff --git a/pkg/apiserver/openpitrix/applications.go b/pkg/apiserver/openpitrix/applications.go index f536cf85f..3bef300dc 100644 --- a/pkg/apiserver/openpitrix/applications.go +++ b/pkg/apiserver/openpitrix/applications.go @@ -36,22 +36,18 @@ import ( ) func ListApplications(req *restful.Request, resp *restful.Response) { - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) + limit, offset := params.ParsePaging(req) namespaceName := req.PathParameter("namespace") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - reverse := params.ParseReverse(req) - - if orderBy == "" { - orderBy = "create_time" - reverse = true - } + conditions, err := params.ParseConditions(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.CreateTime) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) return } + // filter namespaced applications by runtime_id if namespaceName != "" { namespace, err := resources.GetResource("", resources.Namespaces, namespaceName) @@ -60,6 +56,7 @@ func ListApplications(req *restful.Request, resp *restful.Response) { resp.WriteHeaderAndEntity(http.StatusInternalServerError, errors.Wrap(err)) return } + var runtimeId string if ns, ok := namespace.(*v1.Namespace); ok { @@ -70,7 +67,7 @@ func ListApplications(req *restful.Request, resp *restful.Response) { resp.WriteAsJson(models.PageableResponse{Items: []interface{}{}, TotalCount: 0}) return } else { - conditions.Match["runtime_id"] = runtimeId + conditions.Match[openpitrix.RuntimeId] = runtimeId } } diff --git a/pkg/apiserver/openpitrix/apps.go b/pkg/apiserver/openpitrix/apps.go index 1603b15d4..8170c5c57 100644 --- a/pkg/apiserver/openpitrix/apps.go +++ b/pkg/apiserver/openpitrix/apps.go @@ -143,16 +143,12 @@ func GetAppVersionFiles(req *restful.Request, resp *restful.Response) { } func ListAppVersionAudits(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.StatusTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) appId := req.PathParameter("app") versionId := req.PathParameter("version") - if orderBy == "" { - orderBy = "status_time" - reverse = true - } + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) return @@ -179,14 +175,11 @@ func ListAppVersionAudits(req *restful.Request, resp *restful.Response) { } func ListReviews(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) - if orderBy == "" { - orderBy = "status_time" - reverse = true - } + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.StatusTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + conditions, err := params.ParseConditions(req) + if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) return @@ -209,21 +202,17 @@ func ListReviews(req *restful.Request, resp *restful.Response) { } func ListAppVersions(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) appId := req.PathParameter("app") - statistics, _ := strconv.ParseBool(req.QueryParameter("statistics")) - if orderBy == "" { - orderBy = "create_time" - reverse = true - } + statistics := params.GetBoolValueWithDefault(req, "statistics", false) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) return } - conditions.Match["app"] = appId + conditions.Match[openpitrix.AppId] = appId result, err := openpitrix.ListAppVersions(conditions, orderBy, reverse, limit, offset) @@ -256,15 +245,11 @@ func ListAppVersions(req *restful.Request, resp *restful.Response) { } func ListApps(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) statistics, _ := strconv.ParseBool(req.QueryParameter("statistics")) - if orderBy == "" { - orderBy = "create_time" - reverse = true - } + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -288,7 +273,7 @@ func ListApps(req *restful.Request, resp *restful.Response) { for _, item := range result.Items { if app, ok := item.(*openpitrix.App); ok { status := "active|used|enabled|stopped|pending|creating|upgrading|updating|rollbacking|stopping|starting|recovering|resizing|scaling|deleting" - statisticsResult, err := openpitrix.ListApplications(¶ms.Conditions{Match: map[string]string{"app_id": app.AppId, "status": status}}, 0, 0, "", false) + statisticsResult, err := openpitrix.ListApplications(¶ms.Conditions{Match: map[string]string{openpitrix.AppId: app.AppId, openpitrix.Status: status}}, 0, 0, "", false) if err != nil { klog.Errorln(err) resp.WriteHeaderAndEntity(http.StatusInternalServerError, errors.Wrap(err)) @@ -394,7 +379,7 @@ func CreateApp(req *restful.Request, resp *restful.Response) { createAppRequest.Username = req.HeaderParameter(constants.UserNameHeader) - validate, _ := strconv.ParseBool(req.QueryParameter("validate")) + validate := params.GetBoolValueWithDefault(req, "validate", false) var result interface{} @@ -437,7 +422,7 @@ func CreateAppVersion(req *restful.Request, resp *restful.Response) { createAppVersionRequest.AppId = req.PathParameter("app") createAppVersionRequest.Username = req.HeaderParameter(constants.UserNameHeader) - validate, _ := strconv.ParseBool(req.QueryParameter("validate")) + validate := params.GetBoolValueWithDefault(req, "validate", false) var result interface{} diff --git a/pkg/apiserver/openpitrix/categories.go b/pkg/apiserver/openpitrix/categories.go index 2723f900e..cf80226e7 100644 --- a/pkg/apiserver/openpitrix/categories.go +++ b/pkg/apiserver/openpitrix/categories.go @@ -28,7 +28,6 @@ import ( "kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/simple/client" "net/http" - "strconv" ) func CreateCategory(req *restful.Request, resp *restful.Response) { @@ -125,15 +124,11 @@ func DescribeCategory(req *restful.Request, resp *restful.Response) { resp.WriteEntity(result) } func ListCategories(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) - if orderBy == "" { - orderBy = "create_time" - reverse = true - } - statistics, _ := strconv.ParseBool(req.QueryParameter("statistics")) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + statistics := params.GetBoolValueWithDefault(req, "statistics", false) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) diff --git a/pkg/apiserver/openpitrix/repos.go b/pkg/apiserver/openpitrix/repos.go index 38c1704d8..1bffdec57 100644 --- a/pkg/apiserver/openpitrix/repos.go +++ b/pkg/apiserver/openpitrix/repos.go @@ -165,14 +165,10 @@ func DescribeRepo(req *restful.Request, resp *restful.Response) { resp.WriteEntity(result) } func ListRepos(req *restful.Request, resp *restful.Response) { - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) - if orderBy == "" { - orderBy = "create_time" - reverse = true - } + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, openpitrix.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -197,8 +193,8 @@ func ListRepos(req *restful.Request, resp *restful.Response) { func ListRepoEvents(req *restful.Request, resp *restful.Response) { repoId := req.PathParameter("repo") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) + limit, offset := params.ParsePaging(req) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) diff --git a/pkg/apiserver/resources/resources.go b/pkg/apiserver/resources/resources.go index aa89dd5d1..33ff0ad97 100644 --- a/pkg/apiserver/resources/resources.go +++ b/pkg/apiserver/resources/resources.go @@ -33,15 +33,10 @@ func ListNamespacedResources(req *restful.Request, resp *restful.Response) { func ListResources(req *restful.Request, resp *restful.Response) { namespace := req.PathParameter("namespace") resourceName := req.PathParameter("resources") - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) - - if orderBy == "" { - orderBy = resources.CreateTime - reverse = true - } + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, resources.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) diff --git a/pkg/apiserver/tenant/tenant.go b/pkg/apiserver/tenant/tenant.go index d0f6a35b2..6b2e75980 100644 --- a/pkg/apiserver/tenant/tenant.go +++ b/pkg/apiserver/tenant/tenant.go @@ -58,15 +58,10 @@ func ListWorkspaceRules(req *restful.Request, resp *restful.Response) { func ListWorkspaces(req *restful.Request, resp *restful.Response) { username := req.HeaderParameter(constants.UserNameHeader) - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) - - if orderBy == "" { - orderBy = resources.CreateTime - reverse = true - } + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, resources.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) + conditions, err := params.ParseConditions(req) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -114,10 +109,10 @@ func ListNamespaces(req *restful.Request, resp *restful.Response) { username = req.HeaderParameter(constants.UserNameHeader) } - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) - orderBy := req.QueryParameter(params.OrderByParam) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - reverse := params.ParseReverse(req) + conditions, err := params.ParseConditions(req) + orderBy := params.GetStringValueWithDefault(req, params.OrderByParam, resources.CreateTime) + limit, offset := params.ParsePaging(req) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, true) if err != nil { resp.WriteHeaderAndEntity(http.StatusBadRequest, errors.Wrap(err)) @@ -223,9 +218,9 @@ func ListDevopsProjects(req *restful.Request, resp *restful.Response) { username = req.HeaderParameter(constants.UserNameHeader) } orderBy := req.QueryParameter(params.OrderByParam) - reverse := params.ParseReverse(req) - limit, offset := params.ParsePaging(req.QueryParameter(params.PagingParam)) - conditions, err := params.ParseConditions(req.QueryParameter(params.ConditionsParam)) + reverse := params.GetBoolValueWithDefault(req, params.ReverseParam, false) + limit, offset := params.ParsePaging(req) + conditions, err := params.ParseConditions(req) if err != nil { klog.Errorf("%+v", err) diff --git a/pkg/models/openpitrix/applications.go b/pkg/models/openpitrix/applications.go index 2254f1619..d8f83496a 100644 --- a/pkg/models/openpitrix/applications.go +++ b/pkg/models/openpitrix/applications.go @@ -65,25 +65,25 @@ func ListApplications(conditions *params.Conditions, limit, offset int, orderBy describeClustersRequest := &pb.DescribeClustersRequest{ Limit: uint32(limit), Offset: uint32(offset)} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { describeClustersRequest.SearchWord = &wrappers.StringValue{Value: keyword} } - if runtimeId := conditions.Match["runtime_id"]; runtimeId != "" { + if runtimeId := conditions.Match[RuntimeId]; runtimeId != "" { describeClustersRequest.RuntimeId = []string{runtimeId} } - if appId := conditions.Match["app_id"]; appId != "" { + if appId := conditions.Match[AppId]; appId != "" { describeClustersRequest.AppId = []string{appId} } - if versionId := conditions.Match["version_id"]; versionId != "" { + if versionId := conditions.Match[VersionId]; versionId != "" { describeClustersRequest.VersionId = []string{versionId} } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeClustersRequest.Status = strings.Split(status, "|") } if orderBy != "" { describeClustersRequest.SortKey = &wrappers.StringValue{Value: orderBy} } - describeClustersRequest.Reverse = &wrappers.BoolValue{Value: !reverse} + describeClustersRequest.Reverse = &wrappers.BoolValue{Value: reverse} resp, err := client.Cluster().DescribeClusters(openpitrix.SystemContext(), describeClustersRequest) if err != nil { klog.Errorln(err) diff --git a/pkg/models/openpitrix/apps.go b/pkg/models/openpitrix/apps.go index 1ba62acfb..34957eb9a 100644 --- a/pkg/models/openpitrix/apps.go +++ b/pkg/models/openpitrix/apps.go @@ -45,19 +45,19 @@ func ListApps(conditions *params.Conditions, orderBy string, reverse bool, limit } describeAppsRequest := &pb.DescribeAppsRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { describeAppsRequest.SearchWord = &wrappers.StringValue{Value: keyword} } - if appId := conditions.Match["app_id"]; appId != "" { + if appId := conditions.Match[AppId]; appId != "" { describeAppsRequest.AppId = strings.Split(appId, "|") } - if isv := conditions.Match["isv"]; isv != "" { + if isv := conditions.Match[ISV]; isv != "" { describeAppsRequest.Isv = strings.Split(isv, "|") } - if categoryId := conditions.Match["category_id"]; categoryId != "" { + if categoryId := conditions.Match[CategoryId]; categoryId != "" { describeAppsRequest.CategoryId = strings.Split(categoryId, "|") } - if repoId := conditions.Match["repo"]; repoId != "" { + if repoId := conditions.Match[RepoId]; repoId != "" { // hard code, app template in built-in repo has no repo_id attribute if repoId == BuiltinRepoId { describeAppsRequest.RepoId = []string{"\u0000"} @@ -65,7 +65,7 @@ func ListApps(conditions *params.Conditions, orderBy string, reverse bool, limit describeAppsRequest.RepoId = strings.Split(repoId, "|") } } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeAppsRequest.Status = strings.Split(status, "|") } if orderBy != "" { @@ -451,7 +451,7 @@ func DoAppAction(appId string, request *ActionRequest) error { // TODO openpitrix need to implement app suspend interface resp, err := op.App().DescribeAppVersions(openpitrix.SystemContext(), &pb.DescribeAppVersionsRequest{ AppId: []string{appId}, - Status: []string{"active"}, + Status: []string{StatusActive}, Limit: 200, Offset: 0, }) @@ -572,22 +572,22 @@ func ListAppVersionAudits(conditions *params.Conditions, orderBy string, reverse describeAppVersionAudits := &pb.DescribeAppVersionAuditsRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { describeAppVersionAudits.SearchWord = &wrappers.StringValue{Value: keyword} } - if appId := conditions.Match["app"]; appId != "" { + if appId := conditions.Match[AppId]; appId != "" { describeAppVersionAudits.AppId = []string{appId} } - if versionId := conditions.Match["version"]; versionId != "" { + if versionId := conditions.Match[VersionId]; versionId != "" { describeAppVersionAudits.VersionId = []string{versionId} } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeAppVersionAudits.Status = strings.Split(status, "|") } if orderBy != "" { describeAppVersionAudits.SortKey = &wrappers.StringValue{Value: orderBy} } - describeAppVersionAudits.Reverse = &wrappers.BoolValue{Value: !reverse} + describeAppVersionAudits.Reverse = &wrappers.BoolValue{Value: reverse} describeAppVersionAudits.Limit = uint32(limit) describeAppVersionAudits.Offset = uint32(offset) resp, err := client.App().DescribeAppVersionAudits(openpitrix.SystemContext(), describeAppVersionAudits) @@ -617,16 +617,16 @@ func ListAppVersionReviews(conditions *params.Conditions, orderBy string, revers describeAppVersionReviews := &pb.DescribeAppVersionReviewsRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { describeAppVersionReviews.SearchWord = &wrappers.StringValue{Value: keyword} } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeAppVersionReviews.Status = strings.Split(status, "|") } if orderBy != "" { describeAppVersionReviews.SortKey = &wrappers.StringValue{Value: orderBy} } - describeAppVersionReviews.Reverse = &wrappers.BoolValue{Value: !reverse} + describeAppVersionReviews.Reverse = &wrappers.BoolValue{Value: reverse} describeAppVersionReviews.Limit = uint32(limit) describeAppVersionReviews.Offset = uint32(offset) // TODO icon is needed @@ -657,19 +657,19 @@ func ListAppVersions(conditions *params.Conditions, orderBy string, reverse bool describeAppVersionsRequest := &pb.DescribeAppVersionsRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { describeAppVersionsRequest.SearchWord = &wrappers.StringValue{Value: keyword} } - if appId := conditions.Match["app"]; appId != "" { + if appId := conditions.Match[AppId]; appId != "" { describeAppVersionsRequest.AppId = []string{appId} } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeAppVersionsRequest.Status = strings.Split(status, "|") } if orderBy != "" { describeAppVersionsRequest.SortKey = &wrappers.StringValue{Value: orderBy} } - describeAppVersionsRequest.Reverse = &wrappers.BoolValue{Value: !reverse} + describeAppVersionsRequest.Reverse = &wrappers.BoolValue{Value: reverse} describeAppVersionsRequest.Limit = uint32(limit) describeAppVersionsRequest.Offset = uint32(offset) resp, err := client.App().DescribeAppVersions(openpitrix.SystemContext(), describeAppVersionsRequest) diff --git a/pkg/models/openpitrix/categories.go b/pkg/models/openpitrix/categories.go index 7215151ce..9d2c6fb09 100644 --- a/pkg/models/openpitrix/categories.go +++ b/pkg/models/openpitrix/categories.go @@ -138,13 +138,13 @@ func ListCategories(conditions *params.Conditions, orderBy string, reverse bool, req := &pb.DescribeCategoriesRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { req.SearchWord = &wrappers.StringValue{Value: keyword} } if orderBy != "" { req.SortKey = &wrappers.StringValue{Value: orderBy} } - req.Reverse = &wrappers.BoolValue{Value: !reverse} + req.Reverse = &wrappers.BoolValue{Value: reverse} req.Limit = uint32(limit) req.Offset = uint32(offset) resp, err := client.Category().DescribeCategories(openpitrix.SystemContext(), req) diff --git a/pkg/models/openpitrix/repos.go b/pkg/models/openpitrix/repos.go index 754cc63d0..91b4f414e 100644 --- a/pkg/models/openpitrix/repos.go +++ b/pkg/models/openpitrix/repos.go @@ -169,28 +169,28 @@ func ListRepos(conditions *params.Conditions, orderBy string, reverse bool, limi req := &pb.DescribeReposRequest{} - if keyword := conditions.Match["keyword"]; keyword != "" { + if keyword := conditions.Match[Keyword]; keyword != "" { req.SearchWord = &wrappers.StringValue{Value: keyword} } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { req.Status = strings.Split(status, "|") } - if typeStr := conditions.Match["type"]; typeStr != "" { + if typeStr := conditions.Match[Type]; typeStr != "" { req.Type = strings.Split(typeStr, "|") } - if visibility := conditions.Match["visibility"]; visibility != "" { + if visibility := conditions.Match[Visibility]; visibility != "" { req.Visibility = strings.Split(visibility, "|") } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { req.Status = strings.Split(status, "|") } - if workspace := conditions.Match["workspace"]; workspace != "" { + if workspace := conditions.Match[WorkspaceLabel]; workspace != "" { req.Label = &wrappers.StringValue{Value: fmt.Sprintf("workspace=%s", workspace)} } if orderBy != "" { req.SortKey = &wrappers.StringValue{Value: orderBy} } - req.Reverse = &wrappers.BoolValue{Value: !reverse} + req.Reverse = &wrappers.BoolValue{Value: reverse} req.Limit = uint32(limit) req.Offset = uint32(offset) resp, err := client.Repo().DescribeRepos(openpitrix.SystemContext(), req) @@ -273,7 +273,7 @@ func ListRepoEvents(repoId string, conditions *params.Conditions, limit, offset if eventId := conditions.Match["repo_event_id"]; eventId != "" { describeRepoEventsRequest.RepoEventId = strings.Split(eventId, "|") } - if status := conditions.Match["status"]; status != "" { + if status := conditions.Match[Status]; status != "" { describeRepoEventsRequest.Status = strings.Split(status, "|") } describeRepoEventsRequest.Limit = uint32(limit) diff --git a/pkg/models/openpitrix/types.go b/pkg/models/openpitrix/types.go index 9cec02864..5f5a27127 100644 --- a/pkg/models/openpitrix/types.go +++ b/pkg/models/openpitrix/types.go @@ -835,3 +835,19 @@ type ModifyClusterAttributesRequest struct { // cluster name Name *string `json:"name,omitempty"` } + +const ( + CreateTime = "create_time" + StatusTime = "status_time" + RuntimeId = "runtime_id" + VersionId = "version_id" + RepoId = "repo_id" + CategoryId = "category_id" + Status = "status" + Type = "type" + Visibility = "visibility" + AppId = "app_id" + Keyword = "keyword" + ISV = "isv" + WorkspaceLabel = "workspace" +) diff --git a/pkg/models/resources/appplications.go b/pkg/models/resources/appplications.go index 53bad8c38..55b68ee8e 100644 --- a/pkg/models/resources/appplications.go +++ b/pkg/models/resources/appplications.go @@ -21,12 +21,9 @@ package resources import ( "github.com/kubernetes-sigs/application/pkg/apis/app/v1beta1" "k8s.io/apimachinery/pkg/labels" - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" ) type appSearcher struct { @@ -37,67 +34,27 @@ func (*appSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*appSearcher) match(match map[string]string, item *v1beta1.Application) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*appSearcher) match(kv map[string]string, item *v1beta1.Application) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*appSearcher) fuzzy(fuzzy map[string]string, item *v1beta1.Application) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*appSearcher) fuzzy(kv map[string]string, item *v1beta1.Application) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*appSearcher) compare(a, b *v1beta1.Application, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *appSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/clusterroles.go b/pkg/models/resources/clusterroles.go index e0dfac238..3715ff829 100644 --- a/pkg/models/resources/clusterroles.go +++ b/pkg/models/resources/clusterroles.go @@ -18,16 +18,13 @@ package resources import ( + rbac "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/labels" "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/utils/k8sutil" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - rbac "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/labels" ) type clusterRoleSearcher struct { @@ -38,26 +35,17 @@ func (*clusterRoleSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*clusterRoleSearcher) match(match map[string]string, item *rbac.ClusterRole) bool { - for k, v := range match { +func (*clusterRoleSearcher) match(kv map[string]string, item *rbac.ClusterRole) bool { + for k, v := range kv { switch k { case OwnerKind: fallthrough case OwnerName: - kind := match[OwnerKind] - name := match[OwnerName] + kind := kv[OwnerKind] + name := kv[OwnerName] if !k8sutil.IsControlledBy(item.OwnerReferences, kind, name) { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } case UserFacing: if v == "true" { if !isUserFacingClusterRole(item) { @@ -65,8 +53,7 @@ func (*clusterRoleSearcher) match(match map[string]string, item *rbac.ClusterRol } } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -75,40 +62,17 @@ func (*clusterRoleSearcher) match(match map[string]string, item *rbac.ClusterRol } // Fuzzy searchInNamespace -func (*clusterRoleSearcher) fuzzy(fuzzy map[string]string, item *rbac.ClusterRole) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*clusterRoleSearcher) fuzzy(kv map[string]string, item *rbac.ClusterRole) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*clusterRoleSearcher) compare(a, b *rbac.ClusterRole, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *clusterRoleSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/configmaps.go b/pkg/models/resources/configmaps.go index 312d989ab..c333b532d 100644 --- a/pkg/models/resources/configmaps.go +++ b/pkg/models/resources/configmaps.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type configMapSearcher struct { @@ -37,67 +33,27 @@ func (*configMapSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*configMapSearcher) match(match map[string]string, item *v1.ConfigMap) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*configMapSearcher) match(kv map[string]string, item *v1.ConfigMap) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*configMapSearcher) fuzzy(fuzzy map[string]string, item *v1.ConfigMap) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*configMapSearcher) fuzzy(kv map[string]string, item *v1.ConfigMap) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*configMapSearcher) compare(a, b *v1.ConfigMap, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *configMapSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/cronjobs.go b/pkg/models/resources/cronjobs.go index 8a61a776b..7549b67f0 100644 --- a/pkg/models/resources/cronjobs.go +++ b/pkg/models/resources/cronjobs.go @@ -18,10 +18,8 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" "strings" @@ -45,25 +43,15 @@ func cronJobStatus(item *v1beta1.CronJob) string { } // Exactly Match -func (*cronJobSearcher) match(match map[string]string, item *v1beta1.CronJob) bool { - for k, v := range match { +func (*cronJobSearcher) match(kv map[string]string, item *v1beta1.CronJob) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } case Status: if cronJobStatus(item) != v { return false } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -71,34 +59,12 @@ func (*cronJobSearcher) match(match map[string]string, item *v1beta1.CronJob) bo return true } -func (*cronJobSearcher) fuzzy(fuzzy map[string]string, item *v1beta1.CronJob) bool { - - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*cronJobSearcher) fuzzy(kv map[string]string, item *v1beta1.CronJob) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } - return true } @@ -111,13 +77,12 @@ func (*cronJobSearcher) compare(a, b *v1beta1.CronJob, orderBy string) bool { if b.Status.LastScheduleTime == nil { return false } + if a.Status.LastScheduleTime.Equal(b.Status.LastScheduleTime) { + return strings.Compare(a.Name, b.Name) <= 0 + } return a.Status.LastScheduleTime.Before(b.Status.LastScheduleTime) - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) default: - fallthrough - case Name: - return strings.Compare(a.Name, b.Name) <= 0 + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } } diff --git a/pkg/models/resources/daemonsets.go b/pkg/models/resources/daemonsets.go index 9ae1eeef4..717a23170 100644 --- a/pkg/models/resources/daemonsets.go +++ b/pkg/models/resources/daemonsets.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type daemonSetSearcher struct { @@ -47,25 +43,15 @@ func daemonSetStatus(item *v1.DaemonSet) string { } // Exactly Match -func (*daemonSetSearcher) match(match map[string]string, item *v1.DaemonSet) bool { - for k, v := range match { +func (*daemonSetSearcher) match(kv map[string]string, item *v1.DaemonSet) bool { + for k, v := range kv { switch k { case Status: if daemonSetStatus(item) != v { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -73,46 +59,17 @@ func (*daemonSetSearcher) match(match map[string]string, item *v1.DaemonSet) boo return true } -func (*daemonSetSearcher) fuzzy(fuzzy map[string]string, item *v1.DaemonSet) bool { - - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*daemonSetSearcher) fuzzy(kv map[string]string, item *v1.DaemonSet) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } - return true } func (*daemonSetSearcher) compare(a, b *v1.DaemonSet, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *daemonSetSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/deployments.go b/pkg/models/resources/deployments.go index 5980c6d70..d8bd3dd32 100644 --- a/pkg/models/resources/deployments.go +++ b/pkg/models/resources/deployments.go @@ -18,10 +18,8 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" "strings" "time" @@ -52,25 +50,15 @@ func deploymentStatus(item *v1.Deployment) string { } // Exactly Match -func (*deploymentSearcher) match(match map[string]string, item *v1.Deployment) bool { - for k, v := range match { +func (*deploymentSearcher) match(kv map[string]string, item *v1.Deployment) bool { + for k, v := range kv { switch k { case Status: if deploymentStatus(item) != v { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -78,47 +66,27 @@ func (*deploymentSearcher) match(match map[string]string, item *v1.Deployment) b return true } -func (*deploymentSearcher) fuzzy(fuzzy map[string]string, item *v1.Deployment) bool { +func (*deploymentSearcher) fuzzy(kv map[string]string, item *v1.Deployment) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } - return true } func (s *deploymentSearcher) compare(a, b *v1.Deployment, orderBy string) bool { switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) case UpdateTime: - return s.lastUpdateTime(a).Before(s.lastUpdateTime(b)) - case Name: - fallthrough + aLastUpdateTime := s.lastUpdateTime(a) + bLastUpdateTime := s.lastUpdateTime(b) + if aLastUpdateTime.Equal(bLastUpdateTime) { + return strings.Compare(a.Name, b.Name) <= 0 + } + return aLastUpdateTime.Before(bLastUpdateTime) default: - return strings.Compare(a.Name, b.Name) <= 0 + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } } diff --git a/pkg/models/resources/horizontalpodautoscalers.go b/pkg/models/resources/horizontalpodautoscalers.go index 1b64656d2..8b507b38e 100644 --- a/pkg/models/resources/horizontalpodautoscalers.go +++ b/pkg/models/resources/horizontalpodautoscalers.go @@ -19,14 +19,10 @@ package resources import ( autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" - "kubesphere.io/kubesphere/pkg/constants" + "k8s.io/apimachinery/pkg/labels" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - "k8s.io/apimachinery/pkg/labels" ) type hpaSearcher struct { @@ -41,28 +37,19 @@ func hpaTargetMatch(item *autoscalingv2beta2.HorizontalPodAutoscaler, kind, name } // exactly Match -func (*hpaSearcher) match(match map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) bool { - for k, v := range match { +func (*hpaSearcher) match(kv map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) bool { + for k, v := range kv { switch k { case TargetKind: fallthrough case TargetName: - kind := match[TargetKind] - name := match[TargetName] + kind := kv[TargetKind] + name := kv[TargetName] if !hpaTargetMatch(item, kind, name) { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - if item.Labels[k] != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -71,44 +58,17 @@ func (*hpaSearcher) match(match map[string]string, item *autoscalingv2beta2.Hori } // Fuzzy searchInNamespace -func (*hpaSearcher) fuzzy(fuzzy map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*hpaSearcher) fuzzy(kv map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) && !searchFuzzy(item.Annotations, k, v) { - return false - } } } return true } func (*hpaSearcher) compare(a, b *autoscalingv2beta2.HorizontalPodAutoscaler, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *hpaSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/ingresses.go b/pkg/models/resources/ingresses.go index 28ba94279..43b7b2487 100644 --- a/pkg/models/resources/ingresses.go +++ b/pkg/models/resources/ingresses.go @@ -18,14 +18,10 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" + extensions "k8s.io/api/extensions/v1beta1" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - extensions "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/labels" ) @@ -38,67 +34,27 @@ func (*ingressSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*ingressSearcher) match(match map[string]string, item *extensions.Ingress) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*ingressSearcher) match(kv map[string]string, item *extensions.Ingress) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*ingressSearcher) fuzzy(fuzzy map[string]string, item *extensions.Ingress) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*ingressSearcher) fuzzy(kv map[string]string, item *extensions.Ingress) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*ingressSearcher) compare(a, b *extensions.Ingress, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *ingressSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/jobs.go b/pkg/models/resources/jobs.go index d9585f20c..58e9e6410 100644 --- a/pkg/models/resources/jobs.go +++ b/pkg/models/resources/jobs.go @@ -18,11 +18,9 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/utils/k8sutil" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" "strings" "time" @@ -51,8 +49,8 @@ func jobStatus(item *batchv1.Job) string { } // Exactly Match -func (*jobSearcher) match(match map[string]string, item *batchv1.Job) bool { - for k, v := range match { +func (*jobSearcher) match(kv map[string]string, item *batchv1.Job) bool { + for k, v := range kv { switch k { case Status: if jobStatus(item) != v { @@ -66,18 +64,8 @@ func (*jobSearcher) match(match map[string]string, item *batchv1.Job) bool { if v == "false" && k8sutil.IsControlledBy(item.OwnerReferences, s2iRunKind, "") { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -85,34 +73,12 @@ func (*jobSearcher) match(match map[string]string, item *batchv1.Job) bool { return true } -func (*jobSearcher) fuzzy(fuzzy map[string]string, item *batchv1.Job) bool { - - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*jobSearcher) fuzzy(kv map[string]string, item *batchv1.Job) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } - return true } @@ -131,14 +97,15 @@ func jobUpdateTime(item *batchv1.Job) time.Time { func (*jobSearcher) compare(a, b *batchv1.Job, orderBy string) bool { switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) case UpdateTime: - return jobUpdateTime(a).Before(jobUpdateTime(b)) - case Name: - fallthrough + aUpdateTime := jobUpdateTime(a) + bUpdateTime := jobUpdateTime(b) + if aUpdateTime.Equal(bUpdateTime) { + return strings.Compare(a.Name, b.Name) <= 0 + } + return aUpdateTime.Before(bUpdateTime) default: - return strings.Compare(a.Name, b.Name) <= 0 + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } } diff --git a/pkg/models/resources/namespaces.go b/pkg/models/resources/namespaces.go index 1ba4e8670..404bf07a4 100644 --- a/pkg/models/resources/namespaces.go +++ b/pkg/models/resources/namespaces.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type namespaceSearcher struct { @@ -37,67 +33,27 @@ func (*namespaceSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*namespaceSearcher) match(match map[string]string, item *v1.Namespace) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*namespaceSearcher) match(kv map[string]string, item *v1.Namespace) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*namespaceSearcher) fuzzy(fuzzy map[string]string, item *v1.Namespace) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*namespaceSearcher) fuzzy(kv map[string]string, item *v1.Namespace) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*namespaceSearcher) compare(a, b *v1.Namespace, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *namespaceSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/nodes.go b/pkg/models/resources/nodes.go index 10887cdad..a31acb430 100644 --- a/pkg/models/resources/nodes.go +++ b/pkg/models/resources/nodes.go @@ -19,15 +19,11 @@ package resources import ( "fmt" - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type nodeSearcher struct { @@ -53,10 +49,14 @@ func getNodeStatus(node *v1.Node) string { const NodeConfigOK v1.NodeConditionType = "ConfigOK" const NodeKubeletReady v1.NodeConditionType = "KubeletReady" -var expectedConditions = map[v1.NodeConditionType]v1.ConditionStatus{v1.NodeOutOfDisk: v1.ConditionFalse, - v1.NodeMemoryPressure: v1.ConditionFalse, v1.NodeDiskPressure: v1.ConditionFalse, v1.NodePIDPressure: v1.ConditionFalse, - v1.NodeNetworkUnavailable: v1.ConditionFalse, NodeConfigOK: v1.ConditionTrue, NodeKubeletReady: v1.ConditionTrue, - v1.NodeReady: v1.ConditionTrue, +var expectedConditions = map[v1.NodeConditionType]v1.ConditionStatus{ + v1.NodeMemoryPressure: v1.ConditionFalse, + v1.NodeDiskPressure: v1.ConditionFalse, + v1.NodePIDPressure: v1.ConditionFalse, + v1.NodeNetworkUnavailable: v1.ConditionFalse, + NodeConfigOK: v1.ConditionTrue, + NodeKubeletReady: v1.ConditionTrue, + v1.NodeReady: v1.ConditionTrue, } func isUnhealthStatus(condition v1.NodeCondition) bool { @@ -68,14 +68,9 @@ func isUnhealthStatus(condition v1.NodeCondition) bool { } // exactly Match -func (*nodeSearcher) match(match map[string]string, item *v1.Node) bool { - for k, v := range match { +func (*nodeSearcher) match(kv map[string]string, item *v1.Node) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } case Role: labelKey := fmt.Sprintf("node-role.kubernetes.io/%s", v) if _, ok := item.Labels[labelKey]; !ok { @@ -85,13 +80,8 @@ func (*nodeSearcher) match(match map[string]string, item *v1.Node) bool { if getNodeStatus(item) != v { return false } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -100,44 +90,17 @@ func (*nodeSearcher) match(match map[string]string, item *v1.Node) bool { } // Fuzzy searchInNamespace -func (*nodeSearcher) fuzzy(fuzzy map[string]string, item *v1.Node) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*nodeSearcher) fuzzy(kv map[string]string, item *v1.Node) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*nodeSearcher) compare(a, b *v1.Node, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *nodeSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/persistentvolumeclaims.go b/pkg/models/resources/persistentvolumeclaims.go index bdbdeaec2..963fc291c 100644 --- a/pkg/models/resources/persistentvolumeclaims.go +++ b/pkg/models/resources/persistentvolumeclaims.go @@ -18,7 +18,6 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/utils/sliceutil" @@ -49,14 +48,9 @@ func pvcStatus(item *v1.PersistentVolumeClaim) string { } // exactly Match -func (*persistentVolumeClaimSearcher) match(match map[string]string, item *v1.PersistentVolumeClaim) bool { - for k, v := range match { +func (*persistentVolumeClaimSearcher) match(kv map[string]string, item *v1.PersistentVolumeClaim) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } case Status: statuses := strings.Split(v, "|") if !sliceutil.HasString(statuses, pvcStatus(item)) { @@ -66,13 +60,8 @@ func (*persistentVolumeClaimSearcher) match(match map[string]string, item *v1.Pe if item.Spec.StorageClassName == nil || *item.Spec.StorageClassName != v { return false } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -81,44 +70,17 @@ func (*persistentVolumeClaimSearcher) match(match map[string]string, item *v1.Pe } // Fuzzy searchInNamespace -func (*persistentVolumeClaimSearcher) fuzzy(fuzzy map[string]string, item *v1.PersistentVolumeClaim) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*persistentVolumeClaimSearcher) fuzzy(kv map[string]string, item *v1.PersistentVolumeClaim) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*persistentVolumeClaimSearcher) compare(a, b *v1.PersistentVolumeClaim, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *persistentVolumeClaimSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/pods.go b/pkg/models/resources/pods.go index 8652ca00a..0345021a9 100644 --- a/pkg/models/resources/pods.go +++ b/pkg/models/resources/pods.go @@ -19,10 +19,8 @@ package resources import ( appsv1 "k8s.io/api/apps/v1" - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" "strings" @@ -147,14 +145,14 @@ func podBelongToService(item *v1.Pod, serviceName string) bool { } // exactly Match -func (*podSearcher) match(match map[string]string, item *v1.Pod) bool { - for k, v := range match { +func (*podSearcher) match(kv map[string]string, item *v1.Pod) bool { + for k, v := range kv { switch k { case OwnerKind: fallthrough case OwnerName: - kind := match[OwnerKind] - name := match[OwnerName] + kind := kv[OwnerKind] + name := kv[OwnerName] if !podBelongTo(item, kind, name) { return false } @@ -170,18 +168,8 @@ func (*podSearcher) match(match map[string]string, item *v1.Pod) bool { if !podBelongToService(item, v) { return false } - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -190,30 +178,10 @@ func (*podSearcher) match(match map[string]string, item *v1.Pod) bool { } // Fuzzy searchInNamespace -func (*podSearcher) fuzzy(fuzzy map[string]string, item *v1.Pod) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*podSearcher) fuzzy(kv map[string]string, item *v1.Pod) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true @@ -228,13 +196,12 @@ func (*podSearcher) compare(a, b *v1.Pod, orderBy string) bool { if b.Status.StartTime == nil { return true } + if a.Status.StartTime.Equal(b.Status.StartTime) { + return strings.Compare(a.Name, b.Name) <= 0 + } return a.Status.StartTime.Before(b.Status.StartTime) - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough default: - return strings.Compare(a.Name, b.Name) <= 0 + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } } diff --git a/pkg/models/resources/resources.go b/pkg/models/resources/resources.go index c1186648d..15dd34d13 100644 --- a/pkg/models/resources/resources.go +++ b/pkg/models/resources/resources.go @@ -19,7 +19,9 @@ package resources import ( "fmt" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog" + "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/models" "kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/utils/sliceutil" @@ -160,13 +162,26 @@ func ListResources(namespace, resource string, conditions *params.Conditions, or return nil, err } - for i, item := range result { - if i >= offset && (limit == -1 || len(items) < limit) { - items = append(items, injector.addExtraAnnotations(item)) - } + totalCount := len(result) + + // query all + if limit < 0 || offset < 0 { + result = result[:totalCount] + // out of range + } else if offset > totalCount { + result = result[:0] + // last page + } else if limit+offset > totalCount { + result = result[offset:totalCount] + } else { + result = result[offset : offset+limit] } - return &models.PageableResponse{TotalCount: len(result), Items: items}, nil + for _, item := range result { + items = append(items, injector.addExtraAnnotations(item)) + } + + return &models.PageableResponse{TotalCount: totalCount, Items: items}, nil } func searchFuzzy(m map[string]string, key, value string) bool { @@ -181,3 +196,64 @@ func searchFuzzy(m map[string]string, key, value string) bool { return false } + +func match(key, value string, item metav1.ObjectMeta) bool { + switch key { + case Name: + names := strings.Split(value, "|") + if !sliceutil.HasString(names, item.Name) { + return false + } + case Keyword: + if !strings.Contains(item.Name, value) && !searchFuzzy(item.Labels, "", value) && !searchFuzzy(item.Annotations, "", value) { + return false + } + default: + // label not exist or value not equal + if val, ok := item.Labels[key]; !ok || val != value { + return false + } + } + return true +} + +func fuzzy(key, value string, item metav1.ObjectMeta) bool { + switch key { + case Name: + if !strings.Contains(item.Name, value) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], value) { + return false + } + case Label: + if !searchFuzzy(item.Labels, "", value) { + return false + } + case annotation: + if !searchFuzzy(item.Annotations, "", value) { + return false + } + return false + case app: + if !strings.Contains(item.Labels[chart], value) && !strings.Contains(item.Labels[release], value) { + return false + } + default: + if !searchFuzzy(item.Labels, key, value) { + return false + } + } + return true +} + +func compare(a, b metav1.ObjectMeta, by string) bool { + switch by { + case CreateTime: + if a.CreationTimestamp.Equal(&b.CreationTimestamp) { + return strings.Compare(a.Name, b.Name) <= 0 + } + return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) + case Name: + fallthrough + default: + return strings.Compare(a.Name, b.Name) <= 0 + } +} diff --git a/pkg/models/resources/roles.go b/pkg/models/resources/roles.go index b08f30ef6..8a41dbf5e 100644 --- a/pkg/models/resources/roles.go +++ b/pkg/models/resources/roles.go @@ -18,15 +18,12 @@ package resources import ( + rbac "k8s.io/api/rbac/v1" + "k8s.io/apimachinery/pkg/labels" "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - rbac "k8s.io/api/rbac/v1" - "k8s.io/apimachinery/pkg/labels" ) type roleSearcher struct { @@ -37,18 +34,9 @@ func (*roleSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*roleSearcher) match(match map[string]string, item *rbac.Role) bool { - for k, v := range match { +func (*roleSearcher) match(kv map[string]string, item *rbac.Role) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } case UserFacing: if v == "true" { if !isUserFacingRole(item) { @@ -56,8 +44,7 @@ func (*roleSearcher) match(match map[string]string, item *rbac.Role) bool { } } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -66,40 +53,17 @@ func (*roleSearcher) match(match map[string]string, item *rbac.Role) bool { } // Fuzzy searchInNamespace -func (*roleSearcher) fuzzy(fuzzy map[string]string, item *rbac.Role) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*roleSearcher) fuzzy(kv map[string]string, item *rbac.Role) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*roleSearcher) compare(a, b *rbac.Role, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *roleSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/s2ibuilder.go b/pkg/models/resources/s2ibuilder.go index 4710a6cdf..2b74196ab 100644 --- a/pkg/models/resources/s2ibuilder.go +++ b/pkg/models/resources/s2ibuilder.go @@ -21,12 +21,9 @@ package resources import ( "github.com/kubesphere/s2ioperator/pkg/apis/devops/v1alpha1" "k8s.io/apimachinery/pkg/labels" - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" ) type s2iBuilderSearcher struct { @@ -37,67 +34,27 @@ func (*s2iBuilderSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*s2iBuilderSearcher) match(match map[string]string, item *v1alpha1.S2iBuilder) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*s2iBuilderSearcher) match(kv map[string]string, item *v1alpha1.S2iBuilder) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*s2iBuilderSearcher) fuzzy(fuzzy map[string]string, item *v1alpha1.S2iBuilder) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*s2iBuilderSearcher) fuzzy(kv map[string]string, item *v1alpha1.S2iBuilder) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*s2iBuilderSearcher) compare(a, b *v1alpha1.S2iBuilder, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *s2iBuilderSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/s2ibuildertemplate.go b/pkg/models/resources/s2ibuildertemplate.go index 03c6b469c..910a00a3e 100644 --- a/pkg/models/resources/s2ibuildertemplate.go +++ b/pkg/models/resources/s2ibuildertemplate.go @@ -19,14 +19,10 @@ package resources import ( "github.com/kubesphere/s2ioperator/pkg/apis/devops/v1alpha1" - "kubesphere.io/kubesphere/pkg/constants" + "k8s.io/apimachinery/pkg/labels" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - "k8s.io/apimachinery/pkg/labels" ) type s2iBuilderTemplateSearcher struct { @@ -37,63 +33,27 @@ func (*s2iBuilderTemplateSearcher) get(namespace, name string) (interface{}, err } // exactly Match -func (*s2iBuilderTemplateSearcher) match(match map[string]string, item *v1alpha1.S2iBuilderTemplate) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*s2iBuilderTemplateSearcher) match(kv map[string]string, item *v1alpha1.S2iBuilderTemplate) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*s2iBuilderTemplateSearcher) fuzzy(fuzzy map[string]string, item *v1alpha1.S2iBuilderTemplate) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*s2iBuilderTemplateSearcher) fuzzy(kv map[string]string, item *v1alpha1.S2iBuilderTemplate) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*s2iBuilderTemplateSearcher) compare(a, b *v1alpha1.S2iBuilderTemplate, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *s2iBuilderTemplateSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/s2irun.go b/pkg/models/resources/s2irun.go index 6d437e225..1d1bd4e1a 100644 --- a/pkg/models/resources/s2irun.go +++ b/pkg/models/resources/s2irun.go @@ -19,13 +19,9 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" + "sort" "k8s.io/apimachinery/pkg/labels" @@ -40,25 +36,15 @@ func (*s2iRunSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*s2iRunSearcher) match(match map[string]string, item *v1alpha1.S2iRun) bool { - for k, v := range match { +func (*s2iRunSearcher) match(kv map[string]string, item *v1alpha1.S2iRun) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } case Status: if string(item.Status.RunState) != v { return false } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -67,44 +53,17 @@ func (*s2iRunSearcher) match(match map[string]string, item *v1alpha1.S2iRun) boo } // Fuzzy searchInNamespace -func (*s2iRunSearcher) fuzzy(fuzzy map[string]string, item *v1alpha1.S2iRun) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*s2iRunSearcher) fuzzy(kv map[string]string, item *v1alpha1.S2iRun) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*s2iRunSearcher) compare(a, b *v1alpha1.S2iRun, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *s2iRunSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/secrets.go b/pkg/models/resources/secrets.go index 2fe113af3..bcc108c78 100644 --- a/pkg/models/resources/secrets.go +++ b/pkg/models/resources/secrets.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type secretSearcher struct { @@ -37,25 +33,15 @@ func (*secretSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*secretSearcher) match(match map[string]string, item *v1.Secret) bool { - for k, v := range match { +func (*secretSearcher) match(kv map[string]string, item *v1.Secret) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } case "type": if string(item.Type) != v { return false } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -64,44 +50,17 @@ func (*secretSearcher) match(match map[string]string, item *v1.Secret) bool { } // Fuzzy searchInNamespace -func (*secretSearcher) fuzzy(fuzzy map[string]string, item *v1.Secret) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*secretSearcher) fuzzy(kv map[string]string, item *v1.Secret) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*secretSearcher) compare(a, b *v1.Secret, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *secretSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/services.go b/pkg/models/resources/services.go index f957d5d2b..e081af4df 100644 --- a/pkg/models/resources/services.go +++ b/pkg/models/resources/services.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type serviceSearcher struct { @@ -37,67 +33,27 @@ func (*serviceSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*serviceSearcher) match(match map[string]string, item *v1.Service) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*serviceSearcher) match(kv map[string]string, item *v1.Service) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*serviceSearcher) fuzzy(fuzzy map[string]string, item *v1.Service) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*serviceSearcher) fuzzy(kv map[string]string, item *v1.Service) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*serviceSearcher) compare(a, b *v1.Service, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *serviceSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/statefulsets.go b/pkg/models/resources/statefulsets.go index fd915dcd6..73d302fde 100644 --- a/pkg/models/resources/statefulsets.go +++ b/pkg/models/resources/statefulsets.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type statefulSetSearcher struct { @@ -50,25 +46,15 @@ func statefulSetStatus(item *v1.StatefulSet) string { } // Exactly Match -func (*statefulSetSearcher) match(match map[string]string, item *v1.StatefulSet) bool { - for k, v := range match { +func (*statefulSetSearcher) match(kv map[string]string, item *v1.StatefulSet) bool { + for k, v := range kv { switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } case Status: if statefulSetStatus(item) != v { return false } default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { + if !match(k, v, item.ObjectMeta) { return false } } @@ -76,46 +62,17 @@ func (*statefulSetSearcher) match(match map[string]string, item *v1.StatefulSet) return true } -func (*statefulSetSearcher) fuzzy(fuzzy map[string]string, item *v1.StatefulSet) bool { - - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*statefulSetSearcher) fuzzy(kv map[string]string, item *v1.StatefulSet) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } - return true } func (*statefulSetSearcher) compare(a, b *v1.StatefulSet, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *statefulSetSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/storageclasses.go b/pkg/models/resources/storageclasses.go index 248047978..17a044a4e 100644 --- a/pkg/models/resources/storageclasses.go +++ b/pkg/models/resources/storageclasses.go @@ -18,15 +18,11 @@ package resources import ( - "kubesphere.io/kubesphere/pkg/constants" - "kubesphere.io/kubesphere/pkg/informers" - "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" - "sort" - "strings" - "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/labels" + "kubesphere.io/kubesphere/pkg/informers" + "kubesphere.io/kubesphere/pkg/server/params" + "sort" ) type storageClassesSearcher struct { @@ -37,63 +33,27 @@ func (*storageClassesSearcher) get(namespace, name string) (interface{}, error) } // exactly Match -func (*storageClassesSearcher) match(match map[string]string, item *v1.StorageClass) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*storageClassesSearcher) match(kv map[string]string, item *v1.StorageClass) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*storageClassesSearcher) fuzzy(fuzzy map[string]string, item *v1.StorageClass) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*storageClassesSearcher) fuzzy(kv map[string]string, item *v1.StorageClass) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*storageClassesSearcher) compare(a, b *v1.StorageClass, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *storageClassesSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/resources/workspaces.go b/pkg/models/resources/workspaces.go index 43c92e0d3..b79505c98 100644 --- a/pkg/models/resources/workspaces.go +++ b/pkg/models/resources/workspaces.go @@ -18,15 +18,11 @@ package resources import ( + "k8s.io/apimachinery/pkg/labels" tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1" - "kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/informers" "kubesphere.io/kubesphere/pkg/server/params" - "kubesphere.io/kubesphere/pkg/utils/sliceutil" "sort" - "strings" - - "k8s.io/apimachinery/pkg/labels" ) type workspaceSearcher struct { @@ -37,67 +33,27 @@ func (*workspaceSearcher) get(namespace, name string) (interface{}, error) { } // exactly Match -func (*workspaceSearcher) match(match map[string]string, item *tenantv1alpha1.Workspace) bool { - for k, v := range match { - switch k { - case Name: - names := strings.Split(v, "|") - if !sliceutil.HasString(names, item.Name) { - return false - } - case Keyword: - if !strings.Contains(item.Name, v) && !searchFuzzy(item.Labels, "", v) && !searchFuzzy(item.Annotations, "", v) { - return false - } - default: - // label not exist or value not equal - if val, ok := item.Labels[k]; !ok || val != v { - return false - } +func (*workspaceSearcher) match(kv map[string]string, item *tenantv1alpha1.Workspace) bool { + for k, v := range kv { + if !match(k, v, item.ObjectMeta) { + return false } } return true } // Fuzzy searchInNamespace -func (*workspaceSearcher) fuzzy(fuzzy map[string]string, item *tenantv1alpha1.Workspace) bool { - for k, v := range fuzzy { - switch k { - case Name: - if !strings.Contains(item.Name, v) && !strings.Contains(item.Annotations[constants.DisplayNameAnnotationKey], v) { - return false - } - case Label: - if !searchFuzzy(item.Labels, "", v) { - return false - } - case annotation: - if !searchFuzzy(item.Annotations, "", v) { - return false - } +func (*workspaceSearcher) fuzzy(kv map[string]string, item *tenantv1alpha1.Workspace) bool { + for k, v := range kv { + if !fuzzy(k, v, item.ObjectMeta) { return false - case app: - if !strings.Contains(item.Labels[chart], v) && !strings.Contains(item.Labels[release], v) { - return false - } - default: - if !searchFuzzy(item.Labels, k, v) { - return false - } } } return true } func (*workspaceSearcher) compare(a, b *tenantv1alpha1.Workspace, orderBy string) bool { - switch orderBy { - case CreateTime: - return a.CreationTimestamp.Time.Before(b.CreationTimestamp.Time) - case Name: - fallthrough - default: - return strings.Compare(a.Name, b.Name) <= 0 - } + return compare(a.ObjectMeta, b.ObjectMeta, orderBy) } func (s *workspaceSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) { diff --git a/pkg/models/tenant/workspaces.go b/pkg/models/tenant/workspaces.go index fefc8d9e4..fbed1a768 100644 --- a/pkg/models/tenant/workspaces.go +++ b/pkg/models/tenant/workspaces.go @@ -123,9 +123,7 @@ func (s *workspaceSearcher) search(username string, conditions *params.Condition // order & reverse sort.Slice(result, func(i, j int) bool { if reverse { - tmp := i - i = j - j = tmp + i, j = j, i } return s.compare(result[i], result[j], orderBy) }) diff --git a/pkg/server/params/params.go b/pkg/server/params/params.go index 1a192db1c..3931f9f16 100644 --- a/pkg/server/params/params.go +++ b/pkg/server/params/params.go @@ -30,22 +30,26 @@ const ( OrderByParam = "orderBy" ConditionsParam = "conditions" ReverseParam = "reverse" - NameParam = "name" + defaultLimit = 10 + defaultOffset = 0 ) -func ParsePaging(paging string) (limit, offset int) { - - limit = 10 - offset = 0 +func ParsePaging(req *restful.Request) (limit, offset int) { + paging := req.QueryParameter(PagingParam) if groups := regexp.MustCompile(`^limit=(-?\d+),page=(\d+)$`).FindStringSubmatch(paging); len(groups) == 3 { limit, _ = strconv.Atoi(groups[1]) page, _ := strconv.Atoi(groups[2]) offset = (page - 1) * limit + } else { + limit = defaultLimit + offset = defaultOffset } return } -func ParseConditions(conditionsStr string) (*Conditions, error) { +func ParseConditions(req *restful.Request) (*Conditions, error) { + + conditionsStr := req.QueryParameter(ConditionsParam) conditions := &Conditions{Match: make(map[string]string, 0), Fuzzy: make(map[string]string, 0)} @@ -76,16 +80,23 @@ func ParseConditions(conditionsStr string) (*Conditions, error) { return conditions, nil } -func ParseReverse(req *restful.Request) bool { - reverse := req.QueryParameter(ReverseParam) - b, err := strconv.ParseBool(reverse) - if err != nil { - return false - } - return b -} - type Conditions struct { Match map[string]string Fuzzy map[string]string } + +func GetBoolValueWithDefault(req *restful.Request, name string, dv bool) bool { + reverse := req.QueryParameter(name) + if v, err := strconv.ParseBool(reverse); err == nil { + return v + } + return dv +} + +func GetStringValueWithDefault(req *restful.Request, name string, dv string) string { + v := req.QueryParameter(name) + if v == "" { + v = dv + } + return v +}