Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 54 additions & 21 deletions pkg/cli/whoami/whoami.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import (
v1 "k8s.io/api/authentication/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/cli-runtime/pkg/genericiooptions"
"k8s.io/cli-runtime/pkg/genericclioptions"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is deprecated. genericiooptions needs to be used.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But isn't genericclioptions used for PrintFlags? I see I can use genericiooptions for IOStream. Both are used right? Because rollback and startBuild also use this approach

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

genericclioptions has been deprecated in favor of genericiooptions. So theoretically you can use genericclioptions. However, it is always preferable to use the recommended one (i.e. genericiooptions), since the other one will be removed entirely at some point.

"k8s.io/cli-runtime/pkg/printers"
"k8s.io/client-go/kubernetes"
authenticationv1client "k8s.io/client-go/kubernetes/typed/authentication/v1"
"k8s.io/client-go/rest"
Expand Down Expand Up @@ -47,21 +48,24 @@ type WhoAmIOptions struct {
KubeClient kubernetes.Interface
RawConfig api.Config

ShowToken bool
ShowContext bool
ShowServer bool
ShowConsoleUrl bool
ShowToken bool
ShowContext bool
ShowServer bool
ShowConsoleUrl bool
PrintFlags *genericclioptions.PrintFlags
resourcePrinterFunc printers.ResourcePrinterFunc

genericiooptions.IOStreams
genericclioptions.IOStreams
}

func NewWhoAmIOptions(streams genericiooptions.IOStreams) *WhoAmIOptions {
func NewWhoAmIOptions(streams genericclioptions.IOStreams) *WhoAmIOptions {
return &WhoAmIOptions{
IOStreams: streams,
PrintFlags: genericclioptions.NewPrintFlags("").WithDefaultOutput(""),
IOStreams: streams,
}
}

func NewCmdWhoAmI(f kcmdutil.Factory, streams genericiooptions.IOStreams) *cobra.Command {
func NewCmdWhoAmI(f kcmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
o := NewWhoAmIOptions(streams)

cmd := &cobra.Command{
Expand All @@ -80,6 +84,7 @@ func NewCmdWhoAmI(f kcmdutil.Factory, streams genericiooptions.IOStreams) *cobra
cmd.Flags().BoolVarP(&o.ShowContext, "show-context", "c", o.ShowContext, "Print the current user context name")
cmd.Flags().BoolVar(&o.ShowServer, "show-server", o.ShowServer, "If true, print the current server's REST API URL")
cmd.Flags().BoolVar(&o.ShowConsoleUrl, "show-console", o.ShowConsoleUrl, "If true, print the current server's web console URL")
o.PrintFlags.AddFlags(cmd)

return cmd
}
Expand Down Expand Up @@ -122,10 +127,28 @@ func (o *WhoAmIOptions) Complete(f kcmdutil.Factory) error {
o.KubeClient = kubeClient

o.RawConfig, err = f.ToRawKubeConfigLoader().RawConfig()
return err
if err != nil {
return err
}

// Setup printer function
if o.PrintFlags.OutputFlagSpecified() {
printer, err := o.PrintFlags.ToPrinter()
if err != nil {
return err
}
o.resourcePrinterFunc = printer.PrintObj
}

return nil
}

func (o *WhoAmIOptions) Validate() error {
// Check if output flag is used with other show flags
if o.PrintFlags.OutputFlagSpecified() && (o.ShowToken || o.ShowContext || o.ShowServer || o.ShowConsoleUrl) {
return fmt.Errorf("--output cannot be used with --show-token, --show-context, --show-server, or --show-console")
}

if o.ShowToken && len(o.ClientConfig.BearerToken) == 0 {
return fmt.Errorf("no token is currently in use for this session")
}
Expand Down Expand Up @@ -154,6 +177,17 @@ func (o *WhoAmIOptions) getWebConsoleUrl() (string, error) {
}

func (o *WhoAmIOptions) Run() error {
var err error
o.UserInterface, err = userv1typedclient.NewForConfig(o.ClientConfig)
if err != nil {
return err
}

o.AuthV1Client, err = authenticationv1client.NewForConfig(o.ClientConfig)
if err != nil {
return err
}

switch {
case o.ShowToken:
fmt.Fprintf(o.Out, "%s\n", o.ClientConfig.BearerToken)
Expand All @@ -171,19 +205,18 @@ func (o *WhoAmIOptions) Run() error {
}
fmt.Fprintf(o.Out, "%s\n", consoleUrl)
return nil
case o.resourcePrinterFunc != nil:
// If output format is specified, get the user info and print it in the requested format
me, err := o.WhoAmI()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WhoAmI function still prints the username into the terminal. So the output of this function is not an valid json/yaml. I think we can pass a boolean to print username or not.

if err != nil {
return err
}
// Set GroupVersionKind so it's properly displayed
me.SetGroupVersionKind(userv1.GroupVersion.WithKind("User"))
return o.resourcePrinterFunc(me, o.Out)
}

var err error
o.UserInterface, err = userv1typedclient.NewForConfig(o.ClientConfig)
if err != nil {
return err
}

o.AuthV1Client, err = authenticationv1client.NewForConfig(o.ClientConfig)
if err != nil {
return err
}

// Default behavior: just print the username
_, err = o.WhoAmI()
return err
}