github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/user/whoami.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package user
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  
    10  	"github.com/juju/cmd"
    11  	"github.com/juju/errors"
    12  	"github.com/juju/gnuflag"
    13  	"gopkg.in/juju/names.v2"
    14  
    15  	jujucmd "github.com/juju/juju/cmd"
    16  	"github.com/juju/juju/cmd/juju/common"
    17  	"github.com/juju/juju/cmd/modelcmd"
    18  	"github.com/juju/juju/cmd/output"
    19  	"github.com/juju/juju/jujuclient"
    20  )
    21  
    22  var whoAmIDetails = `
    23  Display the current controller, model and logged in user name. 
    24  
    25  Examples:
    26      juju whoami
    27  
    28  See also:
    29      controllers
    30      login
    31      logout
    32      models
    33      users
    34  `[1:]
    35  
    36  // NewWhoAmICommand returns a command to print login details.
    37  func NewWhoAmICommand() cmd.Command {
    38  	cmd := &whoAmICommand{
    39  		store: jujuclient.NewFileClientStore(),
    40  	}
    41  	return modelcmd.WrapBase(cmd)
    42  }
    43  
    44  // Info implements Command.Info
    45  func (c *whoAmICommand) Info() *cmd.Info {
    46  	return jujucmd.Info(&cmd.Info{
    47  		Name:    "whoami",
    48  		Purpose: "Print current login details.",
    49  		Doc:     whoAmIDetails,
    50  	})
    51  }
    52  
    53  // SetFlags implements Command.SetFlags.
    54  func (c *whoAmICommand) SetFlags(f *gnuflag.FlagSet) {
    55  	c.CommandBase.SetFlags(f)
    56  	c.out.AddFlags(f, "tabular", map[string]cmd.Formatter{
    57  		"yaml":    cmd.FormatYaml,
    58  		"json":    cmd.FormatJson,
    59  		"tabular": formatWhoAmITabular,
    60  	})
    61  }
    62  
    63  type whoAmI struct {
    64  	ControllerName string `yaml:"controller" json:"controller"`
    65  	ModelName      string `yaml:"model,omitempty" json:"model,omitempty"`
    66  	UserName       string `yaml:"user" json:"user"`
    67  }
    68  
    69  func formatWhoAmITabular(writer io.Writer, value interface{}) error {
    70  	details, ok := value.(whoAmI)
    71  	if !ok {
    72  		return errors.Errorf("expected value of type %T, got %T", details, value)
    73  	}
    74  	tw := output.TabWriter(writer)
    75  	fmt.Fprintf(tw, "Controller:\t%s\n", details.ControllerName)
    76  	modelName := details.ModelName
    77  	if modelName == "" {
    78  		modelName = "<no-current-model>"
    79  	}
    80  	fmt.Fprintf(tw, "Model:\t%s\n", modelName)
    81  	fmt.Fprintf(tw, "User:\t%s", details.UserName)
    82  	return tw.Flush()
    83  }
    84  
    85  // Run implements Command.Run
    86  func (c *whoAmICommand) Run(ctx *cmd.Context) error {
    87  	controllerName, err := c.store.CurrentController()
    88  	if err != nil && !errors.IsNotFound(err) {
    89  		return err
    90  	}
    91  	if err != nil {
    92  		fmt.Fprintln(ctx.Stderr, "There is no current controller.\nRun juju list-controllers to see available controllers.")
    93  		return nil
    94  	}
    95  	modelName, err := c.store.CurrentModel(controllerName)
    96  	if err != nil && !errors.IsNotFound(err) {
    97  		return err
    98  	}
    99  	userDetails, err := c.store.AccountDetails(controllerName)
   100  	if err != nil && !errors.IsNotFound(err) {
   101  		return err
   102  	}
   103  	if err != nil {
   104  		fmt.Fprintf(ctx.Stderr, "You are not logged in to controller %q and model %q.\nRun juju login if you want to login.\n", controllerName, modelName)
   105  		return nil
   106  	}
   107  	// Only qualify model name if there is a current model.
   108  	if modelName != "" {
   109  		if unqualifiedModelName, owner, err := jujuclient.SplitModelName(modelName); err == nil {
   110  			user := names.NewUserTag(userDetails.User)
   111  			modelName = common.OwnerQualifiedModelName(unqualifiedModelName, owner, user)
   112  		}
   113  	}
   114  
   115  	result := whoAmI{
   116  		ControllerName: controllerName,
   117  		ModelName:      modelName,
   118  		UserName:       userDetails.User,
   119  	}
   120  	return c.out.Write(ctx, result)
   121  }
   122  
   123  type whoAmICommand struct {
   124  	modelcmd.CommandBase
   125  
   126  	out   cmd.Output
   127  	store jujuclient.ClientStore
   128  }