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