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 }