Files
kubesphere/pkg/utils/k8sutil/k8sutil.go
2025-04-30 15:53:51 +08:00

109 lines
3.4 KiB
Go

/*
* Copyright 2024 the KubeSphere Authors.
* Please refer to the LICENSE file in the root directory of the project.
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
*/
package k8sutil
import (
"github.com/emicklei/go-restful/v3"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
tenantv1beta1 "kubesphere.io/api/tenant/v1beta1"
"kubesphere.io/kubesphere/pkg/api"
"kubesphere.io/kubesphere/pkg/apiserver/query"
resv1beta1 "kubesphere.io/kubesphere/pkg/models/resources/v1beta1"
)
// IsControlledBy returns whether the ownerReferences contains the specified resource kind
func IsControlledBy(ownerReferences []metav1.OwnerReference, kind string, name string) bool {
for _, owner := range ownerReferences {
if owner.Kind == kind && (name == "" || owner.Name == name) {
return true
}
}
return false
}
// RemoveWorkspaceOwnerReference remove workspace kind owner reference
func RemoveWorkspaceOwnerReference(ownerReferences []metav1.OwnerReference) []metav1.OwnerReference {
tmp := make([]metav1.OwnerReference, 0)
for _, owner := range ownerReferences {
if owner.Kind != tenantv1beta1.ResourceKindWorkspace &&
owner.Kind != tenantv1beta1.ResourceKindWorkspaceTemplate {
tmp = append(tmp, owner)
}
}
return tmp
}
// GetWorkspaceOwnerName return workspace kind owner name
func GetWorkspaceOwnerName(ownerReferences []metav1.OwnerReference) string {
for _, owner := range ownerReferences {
if owner.Kind == tenantv1beta1.ResourceKindWorkspace ||
owner.Kind == tenantv1beta1.ResourceKindWorkspaceTemplate {
return owner.Name
}
}
return ""
}
// LoadKubeConfigFromBytes parses the kubeconfig yaml data to the rest.Config struct.
func LoadKubeConfigFromBytes(kubeconfig []byte) (*rest.Config, error) {
clientConfig, err := clientcmd.NewClientConfigFromBytes(kubeconfig)
if err != nil {
return nil, err
}
config, err := clientConfig.ClientConfig()
if err != nil {
return nil, err
}
return config, nil
}
func GetObjectMeta(obj metav1.Object) metav1.ObjectMeta {
return metav1.ObjectMeta{
Name: obj.GetName(),
GenerateName: obj.GetGenerateName(),
Namespace: obj.GetNamespace(),
UID: obj.GetUID(),
ResourceVersion: obj.GetResourceVersion(),
Generation: obj.GetGeneration(),
CreationTimestamp: obj.GetCreationTimestamp(),
DeletionTimestamp: obj.GetDeletionTimestamp(),
DeletionGracePeriodSeconds: obj.GetDeletionGracePeriodSeconds(),
Labels: obj.GetLabels(),
Annotations: obj.GetAnnotations(),
OwnerReferences: obj.GetOwnerReferences(),
Finalizers: obj.GetFinalizers(),
ManagedFields: obj.GetManagedFields(),
}
}
func ConvertToListResult(obj runtime.Object, req *restful.Request) (listResult api.ListResult) {
_ = 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
}