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  }