pkg/kubeconfig/read.go
package kubeconfig import ( "fmt" "io" "os" "sort" "github.com/rs/zerolog/log" "k8s.io/client-go/tools/clientcmd" clientcmdapi "k8s.io/client-go/tools/clientcmd/api") // Read loads a kubeconfig file and returns an api.Config (client-go) typefunc Read(filepath string) (*clientcmdapi.Config, error) { var config *clientcmdapi.Config var err error if filepath == "" && HasPipeData() { pipedData, _ := io.ReadAll(os.Stdin) config, err = clientcmd.Load(pipedData) } else { config, err = clientcmd.LoadFromFile(filepath) } if err != nil { log.Debug(). Err(err). Msgf("error while reading '%s'", filepath) return nil, err } return config, nil} // GetConfig reads the main kubeconfig and returns a KConf typefunc GetConfig() (*KConf, error) { k := &KConf{} _, err := os.Stat(MainConfigPath) if err != nil { if os.IsNotExist(err) { log.Debug().Msgf("Main config does not yet exist") // return empty config object if file does not exist k.Config = *clientcmdapi.NewConfig() return k, nil } return nil, err } kubeconfig, err := Read(MainConfigPath) if err != nil { log.Debug().Msgf("Error while reading main config: %v", err) return nil, err } k.Config = *kubeconfig return k, nil} // List returns an array of contextsfunc (k *KConf) List() ([]string, string) { currentContext := k.Config.CurrentContext contexts := []string{} for context := range k.Contexts { contexts = append(contexts, context) } sort.Strings(contexts) return contexts, currentContext} // Export returns a single context's config from a kubeconfig filefunc (k *KConf) Export(name string) (*clientcmdapi.Config, error) { context, ok := k.Contexts[name] if !ok { // the context never existed return nil, fmt.Errorf("could not find context '%s'", name) } // create new config for only this context config := *clientcmdapi.NewConfig() config.Contexts[name] = context config.AuthInfos[context.AuthInfo] = k.AuthInfos[context.AuthInfo] config.Clusters[context.Cluster] = k.Clusters[context.Cluster] config.CurrentContext = name return &config, nil} // GetContent converts a single config into writeable contentfunc (k *KConf) GetContent(name string) ([]byte, error) { config, err := k.Export(name) if err != nil { log.Debug().Msgf("could not export context '%s'", name) return []byte{}, err } content, err := clientcmd.Write(*config) if err != nil { log.Debug().Msgf("error in clientcmd.Write command for context '%s'", name) return []byte{}, err } return content, nil} // ValidateConfig checks the provided kubeconfig file for errorsfunc ValidateConfig(config *clientcmdapi.Config) error { return clientcmd.Validate(*config)}