github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/model/show.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for infos. 3 4 package model 5 6 import ( 7 "time" 8 9 "github.com/juju/cmd" 10 "github.com/juju/errors" 11 "github.com/juju/gnuflag" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/api/modelmanager" 15 "github.com/juju/juju/apiserver/params" 16 jujucmd "github.com/juju/juju/cmd" 17 "github.com/juju/juju/cmd/juju/common" 18 "github.com/juju/juju/cmd/modelcmd" 19 "github.com/juju/juju/cmd/output" 20 ) 21 22 const showModelCommandDoc = `Show information about the current or specified model.` 23 24 func NewShowCommand() cmd.Command { 25 showCmd := &showModelCommand{} 26 return modelcmd.Wrap(showCmd, modelcmd.WrapSkipModelFlags) 27 } 28 29 // showModelCommand shows all the users with access to the current model. 30 type showModelCommand struct { 31 modelcmd.ModelCommandBase 32 out cmd.Output 33 api ShowModelAPI 34 } 35 36 // ShowModelAPI defines the methods on the client API that the 37 // users command calls. 38 type ShowModelAPI interface { 39 Close() error 40 ModelInfo([]names.ModelTag) ([]params.ModelInfoResult, error) 41 } 42 43 func (c *showModelCommand) getAPI() (ShowModelAPI, error) { 44 if c.api != nil { 45 return c.api, nil 46 } 47 api, err := c.NewControllerAPIRoot() 48 if err != nil { 49 return nil, errors.Trace(err) 50 } 51 return modelmanager.NewClient(api), nil 52 } 53 54 // Info implements Command.Info. 55 func (c *showModelCommand) Info() *cmd.Info { 56 return jujucmd.Info(&cmd.Info{ 57 Name: "show-model", 58 Args: "<model name>", 59 Purpose: "Shows information about the current or specified model.", 60 Doc: showModelCommandDoc, 61 }) 62 } 63 64 // SetFlags implements Command.SetFlags. 65 func (c *showModelCommand) SetFlags(f *gnuflag.FlagSet) { 66 c.ModelCommandBase.SetFlags(f) 67 c.out.AddFlags(f, "yaml", output.DefaultFormatters) 68 } 69 70 // Init implements Command.Init. 71 func (c *showModelCommand) Init(args []string) error { 72 modelName := "" 73 if len(args) > 0 { 74 modelName = args[0] 75 args = args[1:] 76 } 77 if err := c.SetModelName(modelName, true); err != nil { 78 return errors.Trace(err) 79 } 80 if err := c.ModelCommandBase.Init(args); err != nil { 81 return err 82 } 83 return nil 84 } 85 86 // Run implements Command.Run. 87 func (c *showModelCommand) Run(ctx *cmd.Context) error { 88 controllerName, err := c.ControllerName() 89 if err != nil { 90 return errors.Trace(err) 91 } 92 _, modelDetails, err := c.ModelDetails() 93 if err != nil { 94 return errors.Trace(err) 95 } 96 modelTag := names.NewModelTag(modelDetails.ModelUUID) 97 98 api, err := c.getAPI() 99 if err != nil { 100 return err 101 } 102 defer api.Close() 103 104 results, err := api.ModelInfo([]names.ModelTag{modelTag}) 105 if err != nil { 106 return err 107 } 108 if results[0].Error != nil { 109 return results[0].Error 110 } 111 infoMap, err := c.apiModelInfoToModelInfoMap([]params.ModelInfo{*results[0].Result}, controllerName) 112 if err != nil { 113 return errors.Trace(err) 114 } 115 return c.out.Write(ctx, infoMap) 116 } 117 118 func (c *showModelCommand) apiModelInfoToModelInfoMap(modelInfo []params.ModelInfo, controllerName string) (map[string]common.ModelInfo, error) { 119 // TODO(perrito666) 2016-05-02 lp:1558657 120 now := time.Now() 121 output := make(map[string]common.ModelInfo) 122 for _, info := range modelInfo { 123 out, err := common.ModelInfoFromParams(info, now) 124 if err != nil { 125 return nil, errors.Trace(err) 126 } 127 out.ControllerName = controllerName 128 output[out.ShortName] = out 129 } 130 return output, nil 131 }