Files
kubesphere/pkg/kapis/application/v2/operator.go
KubeSphere CI Bot bb60d39434 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>
2025-03-11 11:36:02 +08:00

138 lines
3.9 KiB
Go

/*
* Please refer to the LICENSE file in the root directory of the project.
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
*/
package v2
import (
"context"
k8suitl "kubesphere.io/kubesphere/pkg/utils/k8sutil"
"k8s.io/apimachinery/pkg/labels"
"github.com/emicklei/go-restful/v3"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
appv2 "kubesphere.io/api/application/v2"
"kubesphere.io/kubesphere/pkg/api"
)
func (h *appHandler) AppCrList(req *restful.Request, resp *restful.Response) {
clusterName := req.QueryParameter("cluster")
gvr := schema.GroupVersionResource{
Group: req.QueryParameter("group"),
Version: req.QueryParameter("version"),
Resource: req.QueryParameter("resource"),
}
opts := metav1.ListOptions{}
labelSelectorStr := req.QueryParameter("labelSelector")
labelSelector, err := labels.Parse(labelSelectorStr)
if err != nil {
api.HandleBadRequest(resp, nil, err)
return
}
opts.LabelSelector = labelSelector.String()
_, dynamicClient, _, err := h.getCluster(req, clusterName)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
list, err := dynamicClient.Resource(gvr).List(context.Background(), opts)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
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"),
}
obj := unstructured.Unstructured{}
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 {
api.HandleInternalError(resp, nil, err)
return
}
clusterName := req.QueryParameter("cluster")
_, dynamicClient, _, err := h.getCluster(req, clusterName)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
opt := metav1.PatchOptions{FieldManager: "applicationOperator"}
_, err = dynamicClient.Resource(gvr).
Namespace(obj.GetNamespace()).
Patch(context.TODO(), obj.GetName(), types.ApplyPatchType, js, opt)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
}
func (h *appHandler) DescribeAppCr(req *restful.Request, resp *restful.Response) {
name := req.PathParameter("crname")
namespace := req.QueryParameter("namespace")
gvr := schema.GroupVersionResource{
Group: req.QueryParameter("group"),
Version: req.QueryParameter("version"),
Resource: req.QueryParameter("resource"),
}
clusterName := req.QueryParameter("cluster")
_, dynamicClient, _, err := h.getCluster(req, clusterName)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
get, err := dynamicClient.Resource(gvr).Namespace(namespace).Get(context.Background(), name, metav1.GetOptions{})
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
get.SetManagedFields(nil)
resp.WriteEntity(get)
}
func (h *appHandler) DeleteAppCr(req *restful.Request, resp *restful.Response) {
name := req.PathParameter("crname")
namespace := req.QueryParameter("namespace")
gvr := schema.GroupVersionResource{
Group: req.QueryParameter("group"),
Version: req.QueryParameter("version"),
Resource: req.QueryParameter("resource"),
}
clusterName := req.QueryParameter("cluster")
_, dynamicClient, _, err := h.getCluster(req, clusterName)
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
err = dynamicClient.Resource(gvr).Namespace(namespace).Delete(context.Background(), name, metav1.DeleteOptions{})
if err != nil {
api.HandleInternalError(resp, nil, err)
return
}
}