package util import ( "context" "encoding/json" "os" "reflect" "unsafe" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" v12 "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/tools/clientcmd/api/latest" cmdutil "k8s.io/kubectl/pkg/cmd/util" "github.com/wencaiwulue/kubevpn/v2/pkg/config" ) func GetClusterId(client v12.ConfigMapInterface) (types.UID, error) { a, err := client.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{}) if err != nil { return "", err } return a.UID, nil } func IsSameCluster(client v12.ConfigMapInterface, namespace string, clientB v12.ConfigMapInterface, namespaceB string) (bool, error) { if namespace != namespaceB { return false, nil } ctx := context.Background() a, err := client.Get(ctx, config.ConfigMapPodTrafficManager, metav1.GetOptions{}) if err != nil { return false, err } var b *corev1.ConfigMap b, err = clientB.Get(ctx, config.ConfigMapPodTrafficManager, metav1.GetOptions{}) if err != nil { return false, err } return a.UID == b.UID, nil } func ConvertToKubeconfigBytes(factory cmdutil.Factory) ([]byte, string, error) { loader := factory.ToRawKubeConfigLoader() namespace, _, err := loader.Namespace() if err != nil { return nil, "", err } // todo: use more elegant way to get MergedRawConfig var useReflectToGetRawConfigFunc = func() (c api.Config, err error) { defer func() { if er := recover(); er != nil { err = er.(error) } }() value := reflect.ValueOf(loader).Elem().Field(0) value = reflect.NewAt(value.Type(), unsafe.Pointer(value.UnsafeAddr())).Elem() loadingClientConfig := value.Interface().(*clientcmd.DeferredLoadingClientConfig) value = reflect.ValueOf(loadingClientConfig).Elem().Field(3) value = reflect.NewAt(value.Type(), unsafe.Pointer(value.UnsafeAddr())).Elem() clientConfig := value.Interface().(*clientcmd.DirectClientConfig) return clientConfig.MergedRawConfig() } rawConfig, err := useReflectToGetRawConfigFunc() if err != nil { rawConfig, err = loader.RawConfig() } if err != nil { return nil, "", err } err = api.FlattenConfig(&rawConfig) if err != nil { return nil, "", err } convertedObj, err := latest.Scheme.ConvertToVersion(&rawConfig, latest.ExternalVersion) if err != nil { return nil, "", err } marshal, err := json.Marshal(convertedObj) if err != nil { return nil, "", err } return marshal, namespace, nil } func ConvertToTempKubeconfigFile(kubeconfigBytes []byte) (string, error) { temp, err := os.CreateTemp("", "*.tmp.kubeconfig") if err != nil { return "", err } err = temp.Close() if err != nil { return "", err } err = os.WriteFile(temp.Name(), kubeconfigBytes, os.ModePerm) if err != nil { return "", err } return temp.Name(), nil }