package client import ( "fmt" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) // Client хранит клиентов Kubernetes API для работы с CRD Fission. type Client struct { DynClient dynamic.Interface K8sClient kubernetes.Interface Namespace string } // New создает Kubernetes clients из kubeconfig/context. func New(kubeconfigPath, kubeContext, namespace string) (*Client, error) { cfg, err := buildConfig(kubeconfigPath, kubeContext) if err != nil { return nil, err } dynClient, err := dynamic.NewForConfig(cfg) if err != nil { return nil, fmt.Errorf("create dynamic client: %w", err) } k8sClient, err := kubernetes.NewForConfig(cfg) if err != nil { return nil, fmt.Errorf("create kubernetes client: %w", err) } return &Client{ DynClient: dynClient, K8sClient: k8sClient, Namespace: namespace, }, nil } func buildConfig(kubeconfigPath, kubeContext string) (*rest.Config, error) { loadingRules := &clientcmd.ClientConfigLoadingRules{} if kubeconfigPath != "" { loadingRules.ExplicitPath = kubeconfigPath } overrides := &clientcmd.ConfigOverrides{} if kubeContext != "" { overrides.CurrentContext = kubeContext } clientCfg := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides) cfg, err := clientCfg.ClientConfig() if err != nil { return nil, fmt.Errorf("build kube config: %w", err) } return cfg, nil }