package utils import ( "os" "github.com/rs/zerolog/log" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) func NewClient(config *rest.Config, gv *schema.GroupVersion) (rest.Interface, *kubernetes.Clientset, error) { // creates in-cluster config if available restClient, err := GetRestClientForConfig(config, gv) if err != nil { return nil, nil, err } clientset, err := kubernetes.NewForConfig(config) if err != nil { return nil, nil, err } return restClient, clientset, nil } func GetKubeConfig(masterconfig string) (*rest.Config, error) { config, err := rest.InClusterConfig() if err != nil { log.Warn().Err(err).Msg("failed to load in-cluster config, attempting to use local kubeconfig") // create out-of-cluster config using the masterconfig that is passed in config, err = clientcmd.BuildConfigFromFlags("", masterconfig) if err != nil { return nil, err } } return config, err } func NewRestClient(kubeconfig *rest.Config, gv *schema.GroupVersion) (rest.Interface, error) { restClient, err := GetRestClientForConfig(kubeconfig, gv) if err != nil { return nil, err } return restClient, nil } func NewKubeClient(kubeconfig string) (*kubernetes.Clientset, error) { config, err := GetRestConfig(kubeconfig) if err != nil { return nil, err } clientset, err := kubernetes.NewForConfig(config) if err != nil { return nil, err } return clientset, nil } func GetRestConfig(kubeconfig string) (*rest.Config, error) { tempConfig, err := os.CreateTemp("", "kubeconfig-") if err != nil { return nil, err } defer os.Remove(tempConfig.Name()) if _, err := tempConfig.WriteString(kubeconfig); err != nil { return nil, err } return clientcmd.BuildConfigFromFlags("", tempConfig.Name()) } func GetRestClientForConfig(c *rest.Config, gv *schema.GroupVersion) (rest.Interface, error) { config := *c config.ContentConfig.GroupVersion = gv config.APIPath = "/apis" config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() config.UserAgent = rest.DefaultKubernetesUserAgent() return rest.RESTClientFor(&config) }