pkg/internal/converter/options.go (72 lines of code) (raw):
package converter
import (
"fmt"
"github.com/Azure/kubelogin/pkg/internal/token"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"k8s.io/cli-runtime/pkg/genericclioptions"
)
type Options struct {
Flags *pflag.FlagSet
configFlags genericclioptions.RESTClientGetter
TokenOptions token.Options
// context is the kubeconfig context name
context string
azureConfigDir string
}
func stringptr(str string) *string { return &str }
func New() Options {
configFlags := &genericclioptions.ConfigFlags{
KubeConfig: stringptr(""),
}
return Options{configFlags: configFlags}
}
func (o *Options) AddFlags(fs *pflag.FlagSet) {
o.TokenOptions = token.NewOptions(true)
if cf, ok := o.configFlags.(*genericclioptions.ConfigFlags); ok {
cf.AddFlags(fs)
}
fs.StringVar(&o.context, flagContext, "", "The name of the kubeconfig context to use")
fs.StringVar(&o.azureConfigDir, flagAzureConfigDir, "", "Azure CLI config path")
o.TokenOptions.AddFlags(fs)
}
func (o *Options) Validate() error {
return o.TokenOptions.Validate()
}
func (o *Options) UpdateFromEnv() {
o.TokenOptions.UpdateFromEnv()
}
func (o *Options) ToString() string {
return fmt.Sprintf("Context: %s, %s", o.context, o.TokenOptions.ToString())
}
func (o *Options) isSet(name string) bool {
found := false
o.Flags.Visit(func(f *pflag.Flag) {
if f.Name == name {
found = true
}
})
return found
}
func (o *Options) AddCompletions(cmd *cobra.Command) {
_ = cmd.RegisterFlagCompletionFunc(flagContext, completeContexts(o))
_ = cmd.MarkFlagDirname(flagAzureConfigDir)
_ = cmd.MarkFlagFilename("kubeconfig", "")
o.TokenOptions.AddCompletions(cmd)
cmd.Flags().VisitAll(func(flag *pflag.Flag) {
// Set a default completion function if none was set. We don't look
// up if it does already have one set, because Cobra does this for
// us, and returns an error (which we ignore for this reason).
_ = cmd.RegisterFlagCompletionFunc(flag.Name, cobra.NoFileCompletions)
})
}
func completeContexts(o *Options) func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
clientConfig := o.configFlags.ToRawKubeConfigLoader()
config, err := clientConfig.RawConfig()
if err != nil {
cobra.CompDebugln(fmt.Sprintf("unable to load kubeconfig: %s", err), false)
}
contexts := make([]string, 0, len(config.Contexts))
for name := range config.Contexts {
contexts = append(contexts, name)
}
return contexts, cobra.ShellCompDirectiveNoFileComp
}
}