Support manual triggering of a repository update. (#6414)
* Support manual triggering of a repository update. * cherry pick add api for workload template (#1982) * cherry pick (add operator application (#1970)) * Modify routing implementation to improve readability * cherry pick from kse dfc40e5adf5aa2e67d1 * Filter by Routing Parameter Namespace (#1990) * add doc for workloadtemplates --------- Co-authored-by: inksnw <inksnw@gmail.com>
This commit is contained in:
committed by
GitHub
parent
c9c856dfda
commit
bb60d39434
@@ -9,19 +9,13 @@ import (
|
||||
"fmt"
|
||||
goruntime "runtime"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
|
||||
"github.com/emicklei/go-restful/v3"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/klog/v2"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/query"
|
||||
resv1beta1 "kubesphere.io/kubesphere/pkg/models/resources/v1beta1"
|
||||
)
|
||||
|
||||
func (h *appHandler) conflictedDone(req *restful.Request, resp *restful.Response, pathParam string, obj client.Object) bool {
|
||||
@@ -74,32 +68,3 @@ func requestDone(err error, resp *restful.Response) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
func removeQueryArg(req *restful.Request, args ...string) {
|
||||
//The default filter is a whitelist, so delete some of our custom logical parameters
|
||||
for _, i := range args {
|
||||
q := req.Request.URL.Query()
|
||||
q.Del(i)
|
||||
req.Request.URL.RawQuery = q.Encode()
|
||||
}
|
||||
}
|
||||
|
||||
func convertToListResult(obj runtime.Object, req *restful.Request) (listResult api.ListResult) {
|
||||
removeQueryArg(req, params.ConditionsParam, "global", "create")
|
||||
_ = meta.EachListItem(obj, omitManagedFields)
|
||||
queryParams := query.ParseQueryParameter(req)
|
||||
list, _ := meta.ExtractList(obj)
|
||||
items, _, totalCount := resv1beta1.DefaultList(list, queryParams, resv1beta1.DefaultCompare, resv1beta1.DefaultFilter)
|
||||
|
||||
listResult.Items = items
|
||||
listResult.TotalItems = totalCount
|
||||
|
||||
return listResult
|
||||
}
|
||||
func omitManagedFields(o runtime.Object) error {
|
||||
a, err := meta.Accessor(o)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
a.SetManagedFields(nil)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/utils/stringutils"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
|
||||
"kubesphere.io/kubesphere/pkg/utils/stringutils"
|
||||
|
||||
"github.com/emicklei/go-restful/v3"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
@@ -48,11 +48,12 @@ func (h *appHandler) CreateOrUpdateApp(req *restful.Request, resp *restful.Respo
|
||||
api.HandleBadRequest(resp, nil, fmt.Errorf("System has no OSS store, the maximum file size is %d", maxFileSize))
|
||||
return
|
||||
}
|
||||
|
||||
newReq, err := parseRequest(createAppRequest)
|
||||
validate, _ := strconv.ParseBool(req.QueryParameter("validate"))
|
||||
newReq, err := parseRequest(createAppRequest, validate)
|
||||
if requestDone(err, resp) {
|
||||
return
|
||||
}
|
||||
|
||||
data := map[string]any{
|
||||
"icon": newReq.Icon,
|
||||
"appName": newReq.AppName,
|
||||
@@ -63,7 +64,6 @@ func (h *appHandler) CreateOrUpdateApp(req *restful.Request, resp *restful.Respo
|
||||
"resources": newReq.Resources,
|
||||
}
|
||||
|
||||
validate, _ := strconv.ParseBool(req.QueryParameter("validate"))
|
||||
if validate {
|
||||
resp.WriteAsJson(data)
|
||||
return
|
||||
@@ -163,7 +163,7 @@ func (h *appHandler) ListApps(req *restful.Request, resp *restful.Response) {
|
||||
filtered.Items = append(filtered.Items, curApp)
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(&filtered, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&filtered, req))
|
||||
}
|
||||
|
||||
func (h *appHandler) DescribeApp(req *restful.Request, resp *restful.Response) {
|
||||
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/request"
|
||||
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
@@ -55,7 +57,7 @@ func (h *appHandler) CreateOrUpdateAppRls(req *restful.Request, resp *restful.Re
|
||||
}
|
||||
|
||||
if createRlsRequest.Spec.AppType != appv2.AppTypeHelm {
|
||||
runtimeClient, _, _, err := h.getCluster(createRlsRequest.GetRlsCluster())
|
||||
runtimeClient, _, _, err := h.getCluster(req, createRlsRequest.GetRlsCluster())
|
||||
if requestDone(err, resp) {
|
||||
return
|
||||
}
|
||||
@@ -111,7 +113,7 @@ func (h *appHandler) DescribeAppRls(req *restful.Request, resp *restful.Response
|
||||
}
|
||||
app.SetManagedFields(nil)
|
||||
if app.Spec.AppType == appv2.AppTypeYaml || app.Spec.AppType == appv2.AppTypeEdge {
|
||||
data, err := h.getRealTimeYaml(ctx, app)
|
||||
data, err := h.getRealTimeYaml(ctx, req, app)
|
||||
if err != nil {
|
||||
klog.Errorf("getRealTimeYaml: %s", err.Error())
|
||||
app.Status.RealTimeResources = nil
|
||||
@@ -123,7 +125,7 @@ func (h *appHandler) DescribeAppRls(req *restful.Request, resp *restful.Response
|
||||
return
|
||||
}
|
||||
|
||||
data, err := h.getRealTimeHelm(ctx, app)
|
||||
data, err := h.getRealTimeHelm(ctx, req, app)
|
||||
if err != nil {
|
||||
klog.Errorf("getRealTimeHelm: %s", err.Error())
|
||||
app.Status.RealTimeResources = nil
|
||||
@@ -135,8 +137,8 @@ func (h *appHandler) DescribeAppRls(req *restful.Request, resp *restful.Response
|
||||
resp.WriteEntity(app)
|
||||
}
|
||||
|
||||
func (h *appHandler) getRealTimeYaml(ctx context.Context, app *appv2.ApplicationRelease) (data []json.RawMessage, err error) {
|
||||
runtimeClient, dynamicClient, cluster, err := h.getCluster(app.GetRlsCluster())
|
||||
func (h *appHandler) getRealTimeYaml(ctx context.Context, req *restful.Request, app *appv2.ApplicationRelease) (data []json.RawMessage, err error) {
|
||||
runtimeClient, dynamicClient, cluster, err := h.getCluster(req, app.GetRlsCluster())
|
||||
if err != nil {
|
||||
klog.Errorf("cluster: %s url: %s: %s", cluster.Name, cluster.Spec.Connection.KubernetesAPIEndpoint, err)
|
||||
return nil, err
|
||||
@@ -175,8 +177,8 @@ func (h *appHandler) getRealTimeYaml(ctx context.Context, app *appv2.Application
|
||||
return data, err
|
||||
}
|
||||
|
||||
func (h *appHandler) getRealTimeHelm(ctx context.Context, app *appv2.ApplicationRelease) (data []json.RawMessage, err error) {
|
||||
runtimeClient, dynamicClient, cluster, err := h.getCluster(app.GetRlsCluster())
|
||||
func (h *appHandler) getRealTimeHelm(ctx context.Context, req *restful.Request, app *appv2.ApplicationRelease) (data []json.RawMessage, err error) {
|
||||
runtimeClient, dynamicClient, cluster, err := h.getCluster(req, app.GetRlsCluster())
|
||||
if err != nil {
|
||||
klog.Errorf("cluster: %s url: %s: %s", cluster.Name, cluster.Spec.Connection.KubernetesAPIEndpoint, err)
|
||||
return nil, err
|
||||
@@ -292,5 +294,5 @@ func (h *appHandler) ListAppRls(req *restful.Request, resp *restful.Response) {
|
||||
return
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(&appList, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&appList, req))
|
||||
}
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
/*
|
||||
* Please refer to the LICENSE file in the root directory of the project.
|
||||
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
@@ -11,12 +6,17 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
|
||||
"k8s.io/apimachinery/pkg/selection"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/utils/stringutils"
|
||||
|
||||
"github.com/emicklei/go-restful/v3"
|
||||
"golang.org/x/net/context"
|
||||
"helm.sh/helm/v3/pkg/chart/loader"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
"k8s.io/apimachinery/pkg/selection"
|
||||
"k8s.io/klog/v2"
|
||||
appv2 "kubesphere.io/api/application/v2"
|
||||
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
|
||||
@@ -27,7 +27,6 @@ import (
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/application"
|
||||
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
|
||||
"kubesphere.io/kubesphere/pkg/utils/stringutils"
|
||||
)
|
||||
|
||||
func (h *appHandler) CreateOrUpdateAppVersion(req *restful.Request, resp *restful.Response) {
|
||||
@@ -42,7 +41,13 @@ func (h *appHandler) CreateOrUpdateAppVersion(req *restful.Request, resp *restfu
|
||||
|
||||
createAppVersionRequest.AppName = req.PathParameter("app")
|
||||
|
||||
vRequest, err := parseRequest(createAppVersionRequest)
|
||||
workspace := req.PathParameter("workspace")
|
||||
if workspace == "" {
|
||||
workspace = appv2.SystemWorkspace
|
||||
}
|
||||
createAppVersionRequest.Workspace = workspace
|
||||
validate, _ := strconv.ParseBool(req.QueryParameter("validate"))
|
||||
vRequest, err := parseRequest(createAppVersionRequest, validate)
|
||||
if requestDone(err, resp) {
|
||||
return
|
||||
}
|
||||
@@ -55,7 +60,6 @@ func (h *appHandler) CreateOrUpdateAppVersion(req *restful.Request, resp *restfu
|
||||
"aliasName": vRequest.AliasName,
|
||||
}
|
||||
|
||||
validate, _ := strconv.ParseBool(req.QueryParameter("validate"))
|
||||
if validate {
|
||||
resp.WriteAsJson(data)
|
||||
return
|
||||
@@ -154,7 +158,7 @@ func (h *appHandler) ListAppVersions(req *restful.Request, resp *restful.Respons
|
||||
filtered.Items = append(filtered.Items, appv)
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(&filtered, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&filtered, req))
|
||||
}
|
||||
|
||||
func (h *appHandler) GetAppVersionPackage(req *restful.Request, resp *restful.Response) {
|
||||
@@ -322,7 +326,7 @@ func (h *appHandler) ListReviews(req *restful.Request, resp *restful.Response) {
|
||||
}
|
||||
|
||||
if conditions == nil || len(conditions.Match) == 0 {
|
||||
resp.WriteEntity(convertToListResult(&appVersions, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&appVersions, req))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -335,5 +339,5 @@ func (h *appHandler) ListReviews(req *restful.Request, resp *restful.Response) {
|
||||
filteredAppVersions.Items = append(filteredAppVersions.Items, version)
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(&filteredAppVersions, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&filteredAppVersions, req))
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ package v2
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
|
||||
"github.com/emicklei/go-restful/v3"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/klog/v2"
|
||||
@@ -99,5 +101,5 @@ func (h *appHandler) ListCategories(req *restful.Request, resp *restful.Response
|
||||
if requestDone(err, resp) {
|
||||
return
|
||||
}
|
||||
resp.WriteEntity(convertToListResult(cList, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(cList, req))
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/application"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
@@ -115,6 +117,24 @@ func (h *appHandler) DeleteRepo(req *restful.Request, resp *restful.Response) {
|
||||
resp.WriteEntity(errors.None)
|
||||
}
|
||||
|
||||
func (h *appHandler) ManualSync(req *restful.Request, resp *restful.Response) {
|
||||
repoId := req.PathParameter("repo")
|
||||
|
||||
key := runtimeclient.ObjectKey{Name: repoId}
|
||||
repo := &appv2.Repo{}
|
||||
err := h.client.Get(req.Request.Context(), key, repo)
|
||||
if requestDone(err, resp) {
|
||||
return
|
||||
}
|
||||
repo.Status.State = appv2.StatusManualTrigger
|
||||
err = h.client.Status().Update(req.Request.Context(), repo)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
}
|
||||
resp.WriteEntity(errors.None)
|
||||
}
|
||||
|
||||
func (h *appHandler) DescribeRepo(req *restful.Request, resp *restful.Response) {
|
||||
repoId := req.PathParameter("repo")
|
||||
|
||||
@@ -146,7 +166,7 @@ func (h *appHandler) ListRepos(req *restful.Request, resp *restful.Response) {
|
||||
filteredList.Items = append(filteredList.Items, repo)
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(filteredList, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(filteredList, req))
|
||||
}
|
||||
|
||||
func (h *appHandler) ListRepoEvents(req *restful.Request, resp *restful.Response) {
|
||||
@@ -163,5 +183,5 @@ func (h *appHandler) ListRepoEvents(req *restful.Request, resp *restful.Response
|
||||
return
|
||||
}
|
||||
|
||||
resp.WriteEntity(convertToListResult(&list, req))
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(&list, req))
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ package v2
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
|
||||
"k8s.io/apimachinery/pkg/labels"
|
||||
|
||||
@@ -17,7 +18,6 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
appv2 "kubesphere.io/api/application/v2"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
)
|
||||
@@ -37,7 +37,7 @@ func (h *appHandler) AppCrList(req *restful.Request, resp *restful.Response) {
|
||||
return
|
||||
}
|
||||
opts.LabelSelector = labelSelector.String()
|
||||
_, dynamicClient, _, err := h.getCluster(clusterName)
|
||||
_, dynamicClient, _, err := h.getCluster(req, clusterName)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
@@ -47,41 +47,27 @@ func (h *appHandler) AppCrList(req *restful.Request, resp *restful.Response) {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
}
|
||||
resp.WriteEntity(convertToListResult(list, req))
|
||||
}
|
||||
func checkPermissions(gvr schema.GroupVersionResource, app appv2.Application) (allow bool) {
|
||||
for _, i := range app.Spec.Resources {
|
||||
if gvr.Resource == i.Resource {
|
||||
allow = true
|
||||
break
|
||||
}
|
||||
}
|
||||
return allow
|
||||
resp.WriteEntity(k8suitl.ConvertToListResult(list, req))
|
||||
}
|
||||
|
||||
func (h *appHandler) CreateOrUpdateCR(req *restful.Request, resp *restful.Response) {
|
||||
gvr := schema.GroupVersionResource{
|
||||
Group: req.QueryParameter("group"),
|
||||
Version: req.QueryParameter("version"),
|
||||
Resource: req.QueryParameter("resource"),
|
||||
}
|
||||
appID := req.QueryParameter("app")
|
||||
app := appv2.Application{}
|
||||
err := h.client.Get(req.Request.Context(), client.ObjectKey{Name: appID}, &app)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
}
|
||||
allow := checkPermissions(gvr, app)
|
||||
if !allow {
|
||||
api.HandleForbidden(resp, nil, fmt.Errorf("resource %s not allow", gvr.Resource))
|
||||
return
|
||||
}
|
||||
obj := unstructured.Unstructured{}
|
||||
err = req.ReadEntity(&obj)
|
||||
err := req.ReadEntity(&obj)
|
||||
if err != nil {
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
return
|
||||
}
|
||||
lbs := obj.GetLabels()
|
||||
if lbs == nil {
|
||||
lbs = make(map[string]string)
|
||||
}
|
||||
lbs[appv2.AppReleaseReferenceLabelKey] = req.PathParameter("application")
|
||||
obj.SetLabels(lbs)
|
||||
|
||||
js, err := obj.MarshalJSON()
|
||||
if err != nil {
|
||||
@@ -89,7 +75,7 @@ func (h *appHandler) CreateOrUpdateCR(req *restful.Request, resp *restful.Respon
|
||||
return
|
||||
}
|
||||
clusterName := req.QueryParameter("cluster")
|
||||
_, dynamicClient, _, err := h.getCluster(clusterName)
|
||||
_, dynamicClient, _, err := h.getCluster(req, clusterName)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
@@ -115,7 +101,7 @@ func (h *appHandler) DescribeAppCr(req *restful.Request, resp *restful.Response)
|
||||
Resource: req.QueryParameter("resource"),
|
||||
}
|
||||
clusterName := req.QueryParameter("cluster")
|
||||
_, dynamicClient, _, err := h.getCluster(clusterName)
|
||||
_, dynamicClient, _, err := h.getCluster(req, clusterName)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
@@ -138,7 +124,7 @@ func (h *appHandler) DeleteAppCr(req *restful.Request, resp *restful.Response) {
|
||||
Resource: req.QueryParameter("resource"),
|
||||
}
|
||||
clusterName := req.QueryParameter("cluster")
|
||||
_, dynamicClient, _, err := h.getCluster(clusterName)
|
||||
_, dynamicClient, _, err := h.getCluster(req, clusterName)
|
||||
if err != nil {
|
||||
api.HandleInternalError(resp, nil, err)
|
||||
return
|
||||
|
||||
@@ -66,6 +66,7 @@ func (h *appHandler) AddToContainer(c *restful.Container) (err error) {
|
||||
{Route: "/repos", Func: h.CreateOrUpdateRepo, Method: ws.POST, Workspace: true},
|
||||
{Route: "/repos/{repo}", Func: h.CreateOrUpdateRepo, Method: ws.PATCH, Workspace: true},
|
||||
{Route: "/repos/{repo}", Func: h.DeleteRepo, Method: ws.DELETE, Workspace: true},
|
||||
{Route: "/repos/{repo}/action", Func: h.ManualSync, Method: ws.POST, Workspace: true},
|
||||
{Route: "/repos/{repo}", Func: h.DescribeRepo, Method: ws.GET, Workspace: true},
|
||||
{Route: "/repos/{repo}/events", Func: h.ListRepoEvents, Method: ws.GET, Workspace: true},
|
||||
{Route: "/apps/{app}/action", Func: h.DoAppAction, Method: ws.POST},
|
||||
@@ -98,10 +99,10 @@ func (h *appHandler) AddToContainer(c *restful.Container) (err error) {
|
||||
{Route: "/attachments/{attachment}", Func: h.DescribeAttachment, Method: ws.GET, Workspace: true},
|
||||
{Route: "/attachments/{attachment}", Func: h.DeleteAttachments, Method: ws.DELETE, Workspace: true},
|
||||
{Route: "/apps/{app}/examplecr/{name}", Func: h.exampleCr, Method: ws.GET, Workspace: true},
|
||||
{Route: "/apps/{app}/cr", Func: h.AppCrList, Method: ws.GET, Workspace: true, Namespace: true},
|
||||
{Route: "/cr", Func: h.CreateOrUpdateCR, Method: ws.POST, Workspace: true, Namespace: true},
|
||||
{Route: "/cr/{crname}", Func: h.DescribeAppCr, Method: ws.GET, Workspace: true, Namespace: true},
|
||||
{Route: "/cr/{crname}", Func: h.DeleteAppCr, Method: ws.DELETE, Workspace: true, Namespace: true},
|
||||
{Route: "/applications/{application}/cr", Func: h.AppCrList, Method: ws.GET, Workspace: true, Namespace: true},
|
||||
{Route: "/applications/{application}/cr", Func: h.CreateOrUpdateCR, Method: ws.POST, Workspace: true, Namespace: true},
|
||||
{Route: "/applications/{application}/cr/{crname}", Func: h.DescribeAppCr, Method: ws.GET, Workspace: true, Namespace: true},
|
||||
{Route: "/applications/{application}/cr/{crname}", Func: h.DeleteAppCr, Method: ws.DELETE, Workspace: true, Namespace: true},
|
||||
}
|
||||
for _, info := range funcInfoList {
|
||||
builder := info.Method(info.Route).To(info.Func).Doc(info.Doc)
|
||||
|
||||
@@ -12,7 +12,12 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/emicklei/go-restful/v3"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/apiserver/request"
|
||||
|
||||
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
||||
|
||||
"k8s.io/apimachinery/pkg/util/yaml"
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
@@ -31,9 +36,9 @@ const (
|
||||
Status = "status"
|
||||
)
|
||||
|
||||
func parseRequest(createRequest application.AppRequest) (appRequest application.AppRequest, err error) {
|
||||
func parseRequest(createRequest application.AppRequest, validate bool) (appRequest application.AppRequest, err error) {
|
||||
if createRequest.AppType == appv2.AppTypeHelm {
|
||||
req, err := parseHelmRequest(createRequest)
|
||||
req, err := parseHelmRequest(createRequest, validate)
|
||||
return req, err
|
||||
}
|
||||
_, err = application.ReadYaml(createRequest.Package)
|
||||
@@ -41,7 +46,7 @@ func parseRequest(createRequest application.AppRequest) (appRequest application.
|
||||
return createRequest, err
|
||||
}
|
||||
|
||||
func parseHelmRequest(createRequest application.AppRequest) (req application.AppRequest, err error) {
|
||||
func parseHelmRequest(createRequest application.AppRequest, validate bool) (req application.AppRequest, err error) {
|
||||
if createRequest.Package == nil || len(createRequest.Package) == 0 {
|
||||
return req, errors.New("package is empty")
|
||||
}
|
||||
@@ -49,7 +54,21 @@ func parseHelmRequest(createRequest application.AppRequest) (req application.App
|
||||
if err != nil {
|
||||
return createRequest, err
|
||||
}
|
||||
if validate {
|
||||
createRequest, err = getCrdInfo(createRequest, chartPack)
|
||||
if err != nil {
|
||||
klog.Errorf("failed to get crd info from %s: %v", chartPack.Metadata.Name, err)
|
||||
return createRequest, err
|
||||
}
|
||||
}
|
||||
|
||||
shortName := application.GenerateShortNameMD5Hash(chartPack.Metadata.Name)
|
||||
fillEmptyFields(&createRequest, chartPack, shortName)
|
||||
|
||||
return createRequest, nil
|
||||
}
|
||||
|
||||
func getCrdInfo(createRequest application.AppRequest, chartPack *chart.Chart) (application.AppRequest, error) {
|
||||
crdFiles := chartPack.CRDObjects()
|
||||
for _, i := range crdFiles {
|
||||
dataList, err := readYaml(i.File.Data)
|
||||
@@ -83,10 +102,6 @@ func parseHelmRequest(createRequest application.AppRequest) (req application.App
|
||||
createRequest.Resources = append(createRequest.Resources, ins)
|
||||
}
|
||||
}
|
||||
|
||||
shortName := application.GenerateShortNameMD5Hash(chartPack.Metadata.Name)
|
||||
fillEmptyFields(&createRequest, chartPack, shortName)
|
||||
|
||||
return createRequest, nil
|
||||
}
|
||||
|
||||
@@ -144,7 +159,7 @@ func fillEmptyFields(createRequest *application.AppRequest, chartPack *chart.Cha
|
||||
}
|
||||
}
|
||||
|
||||
func (h *appHandler) getCluster(clusterName string) (runtimeclient.Client, *dynamic.DynamicClient, *clusterv1alpha1.Cluster, error) {
|
||||
func (h *appHandler) getCluster(req *restful.Request, clusterName string) (runtimeclient.Client, *dynamic.DynamicClient, *clusterv1alpha1.Cluster, error) {
|
||||
klog.Infof("get cluster %s", clusterName)
|
||||
runtimeClient, err := h.clusterClient.GetRuntimeClient(clusterName)
|
||||
if err != nil {
|
||||
@@ -154,7 +169,16 @@ func (h *appHandler) getCluster(clusterName string) (runtimeclient.Client, *dyna
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
dynamicClient, err := dynamic.NewForConfig(clusterClient.RestConfig)
|
||||
|
||||
userInfo, _ := request.UserFrom(req.Request.Context())
|
||||
user := ""
|
||||
if userInfo != nil {
|
||||
user = userInfo.GetName()
|
||||
}
|
||||
conf := clusterClient.RestConfig
|
||||
conf.Impersonate.UserName = user
|
||||
|
||||
dynamicClient, err := dynamic.NewForConfig(conf)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user