104 lines
3.2 KiB
Go
104 lines
3.2 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
|
"k8s.io/client-go/dynamic"
|
|
)
|
|
|
|
// todo: this can get by kubectl api-resources
|
|
|
|
// ResourceKindMap get the Resource of a given kind
|
|
var ResourceKindMap = map[string]string{
|
|
"ConfigMap": "configmaps",
|
|
"Namespace": "namespaces",
|
|
"PersistentVolumeClaim": "persistentvolumeclaims",
|
|
"PersistentVolume": "persistentvolumes",
|
|
"Pod": "pods",
|
|
"Secret": "secrets",
|
|
"Service": "services",
|
|
"Deployment": "deployments",
|
|
"DaemonSet": "daemonsets",
|
|
"StatefulSet": "statefulsets",
|
|
"ReplicaSet": "replicasets",
|
|
"CronJob": "cronjobs",
|
|
"Job": "jobs",
|
|
"Ingress": "ingresses",
|
|
}
|
|
|
|
//
|
|
func generateGroupVersionResource(apiVersion, kind string) (schema.GroupVersionResource, error) {
|
|
groupVersion, err := schema.ParseGroupVersion(apiVersion)
|
|
if err != nil {
|
|
return schema.GroupVersionResource{}, err
|
|
}
|
|
dynamicResource := schema.GroupVersionResource{Group: groupVersion.Group, Version: groupVersion.Version, Resource: ResourceKindMap[kind]}
|
|
return dynamicResource, nil
|
|
}
|
|
|
|
// GetResourceStructure get resource yaml from kubernetes
|
|
func GetResourceStructure(client dynamic.Interface, apiVersion, kind, namespace, name string) (*unstructured.Unstructured, error) {
|
|
dynamicResource, err := generateGroupVersionResource(apiVersion, kind)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result, err := client.Resource(dynamicResource).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// GetResourcesStructureByFilter get resources yaml from kubernetes by filter
|
|
func GetResourcesStructureByFilter(client dynamic.Interface, apiVersion, kind, namespace string, labelSelector *metav1.LabelSelector) (*unstructured.UnstructuredList, error) {
|
|
dynamicResource, err := generateGroupVersionResource(apiVersion, kind)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result, err := client.Resource(dynamicResource).Namespace(namespace).List(context.TODO(),
|
|
metav1.ListOptions{LabelSelector: labels.Set(labelSelector.MatchLabels).String()})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// GetMatchItems get match item by compare include items and exclude items
|
|
func GetMatchItems(includeItems, excludeItems []string) []string {
|
|
if includeItems == nil {
|
|
includeItems = []string{}
|
|
}
|
|
if excludeItems == nil {
|
|
excludeItems = []string{}
|
|
}
|
|
includeSet := sets.NewString()
|
|
excludeSet := sets.NewString()
|
|
for _, targetItem := range excludeItems {
|
|
excludeSet.Insert(targetItem)
|
|
}
|
|
for _, targetItem := range includeItems {
|
|
includeSet.Insert(targetItem)
|
|
}
|
|
|
|
matchItems := includeSet.Difference(excludeSet)
|
|
|
|
return matchItems.List()
|
|
}
|
|
|
|
// GetDeduplicationArray get deduplication array
|
|
func GetDeduplicationArray(list []string) []string {
|
|
if list == nil {
|
|
return []string{}
|
|
}
|
|
result := sets.String{}
|
|
for _, item := range list {
|
|
result.Insert(item)
|
|
}
|
|
return result.List()
|
|
}
|