mirror of
https://github.com/k8sgpt-ai/k8sgpt.git
synced 2025-09-27 16:04:17 +00:00
99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
)
|
|
|
|
func GetParent(client *kubernetes.Client, meta metav1.ObjectMeta) (string, bool) {
|
|
if meta.OwnerReferences != nil {
|
|
for _, owner := range meta.OwnerReferences {
|
|
switch owner.Kind {
|
|
case "ReplicaSet":
|
|
rs, err := client.GetClient().AppsV1().ReplicaSets(meta.Namespace).Get(context.Background(), owner.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
if rs.OwnerReferences != nil {
|
|
return GetParent(client, rs.ObjectMeta)
|
|
}
|
|
return "ReplicaSet/" + rs.Name, false
|
|
|
|
case "Deployment":
|
|
dep, err := client.GetClient().AppsV1().Deployments(meta.Namespace).Get(context.Background(), owner.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
if dep.OwnerReferences != nil {
|
|
return GetParent(client, dep.ObjectMeta)
|
|
}
|
|
return "Deployment/" + dep.Name, false
|
|
|
|
case "StatefulSet":
|
|
sts, err := client.GetClient().AppsV1().StatefulSets(meta.Namespace).Get(context.Background(), owner.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
if sts.OwnerReferences != nil {
|
|
return GetParent(client, sts.ObjectMeta)
|
|
}
|
|
return "StatefulSet/" + sts.Name, false
|
|
|
|
case "DaemonSet":
|
|
ds, err := client.GetClient().AppsV1().DaemonSets(meta.Namespace).Get(context.Background(), owner.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
if ds.OwnerReferences != nil {
|
|
return GetParent(client, ds.ObjectMeta)
|
|
}
|
|
return "DaemonSet/" + ds.Name, false
|
|
|
|
case "Ingress":
|
|
ds, err := client.GetClient().NetworkingV1().Ingresses(meta.Namespace).Get(context.Background(), owner.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
if ds.OwnerReferences != nil {
|
|
return GetParent(client, ds.ObjectMeta)
|
|
}
|
|
return "Ingress/" + ds.Name, false
|
|
}
|
|
}
|
|
}
|
|
return meta.Name, false
|
|
}
|
|
|
|
func RemoveDuplicates(slice []string) ([]string, []string) {
|
|
set := make(map[string]bool)
|
|
duplicates := []string{}
|
|
for _, val := range slice {
|
|
if _, ok := set[val]; !ok {
|
|
set[val] = true
|
|
} else {
|
|
duplicates = append(duplicates, val)
|
|
}
|
|
}
|
|
uniqueSlice := make([]string, 0, len(set))
|
|
for val := range set {
|
|
uniqueSlice = append(uniqueSlice, val)
|
|
}
|
|
return uniqueSlice, duplicates
|
|
}
|
|
|
|
func SliceDiff(source, dest []string) []string {
|
|
mb := make(map[string]struct{}, len(dest))
|
|
for _, x := range dest {
|
|
mb[x] = struct{}{}
|
|
}
|
|
var diff []string
|
|
for _, x := range source {
|
|
if _, found := mb[x]; !found {
|
|
diff = append(diff, x)
|
|
}
|
|
}
|
|
return diff
|
|
}
|