62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
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
|
||
}
|