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 }