github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/cmd/juju/commands/helptool.go (about)

     1  // Copyright 2013, 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package commands
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/cmd"
    11  	"gopkg.in/juju/charm.v5"
    12  	"launchpad.net/gnuflag"
    13  
    14  	"github.com/juju/juju/network"
    15  	"github.com/juju/juju/storage"
    16  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    17  )
    18  
    19  // dummyHookContext implements jujuc.Context,
    20  // as expected by jujuc.NewCommand.
    21  type dummyHookContext struct{ jujuc.Context }
    22  
    23  func (dummyHookContext) AddMetrics(_, _ string, _ time.Time) error {
    24  	return nil
    25  }
    26  func (dummyHookContext) UnitName() string {
    27  	return ""
    28  }
    29  func (dummyHookContext) PublicAddress() (string, bool) {
    30  	return "", false
    31  }
    32  func (dummyHookContext) PrivateAddress() (string, bool) {
    33  	return "", false
    34  }
    35  func (dummyHookContext) AvailabilityZone() (string, bool) {
    36  	return "", false
    37  }
    38  func (dummyHookContext) OpenPort(protocol string, port int) error {
    39  	return nil
    40  }
    41  func (dummyHookContext) ClosePort(protocol string, port int) error {
    42  	return nil
    43  }
    44  func (dummyHookContext) OpenedPorts() []network.PortRange {
    45  	return nil
    46  }
    47  func (dummyHookContext) ConfigSettings() (charm.Settings, error) {
    48  	return charm.NewConfig().DefaultSettings(), nil
    49  }
    50  func (dummyHookContext) HookRelation() (jujuc.ContextRelation, bool) {
    51  	return nil, false
    52  }
    53  func (dummyHookContext) RemoteUnitName() (string, bool) {
    54  	return "", false
    55  }
    56  func (dummyHookContext) Relation(id int) (jujuc.ContextRelation, bool) {
    57  	return nil, false
    58  }
    59  func (dummyHookContext) RelationIds() []int {
    60  	return []int{}
    61  }
    62  
    63  func (dummyHookContext) RequestReboot(prio jujuc.RebootPriority) error {
    64  	return nil
    65  }
    66  
    67  func (dummyHookContext) HookStorageInstance() (*storage.StorageInstance, bool) {
    68  	return nil, false
    69  }
    70  
    71  func (dummyHookContext) StorageInstance(id string) (*storage.StorageInstance, bool) {
    72  	return nil, false
    73  }
    74  
    75  func (dummyHookContext) OwnerTag() string {
    76  	return ""
    77  }
    78  
    79  func (dummyHookContext) UnitStatus() (*jujuc.StatusInfo, error) {
    80  	return &jujuc.StatusInfo{}, nil
    81  }
    82  
    83  func (dummyHookContext) SetStatus(jujuc.StatusInfo) error {
    84  	return nil
    85  }
    86  
    87  type HelpToolCommand struct {
    88  	cmd.CommandBase
    89  	tool string
    90  }
    91  
    92  func (t *HelpToolCommand) Info() *cmd.Info {
    93  	return &cmd.Info{
    94  		Name:    "help-tool",
    95  		Args:    "[tool]",
    96  		Purpose: "show help on a juju charm tool",
    97  	}
    98  }
    99  
   100  func (t *HelpToolCommand) Init(args []string) error {
   101  	tool, err := cmd.ZeroOrOneArgs(args)
   102  	if err == nil {
   103  		t.tool = tool
   104  	}
   105  	return err
   106  }
   107  
   108  func (c *HelpToolCommand) Run(ctx *cmd.Context) error {
   109  	var hookctx dummyHookContext
   110  	if c.tool == "" {
   111  		// Ripped from SuperCommand. We could Run() a SuperCommand
   112  		// with "help commands", but then the implicit "help" command
   113  		// shows up.
   114  		names := jujuc.CommandNames()
   115  		cmds := make([]cmd.Command, 0, len(names))
   116  		longest := 0
   117  		for _, name := range names {
   118  			if c, err := jujuc.NewCommand(hookctx, name); err == nil {
   119  				if len(name) > longest {
   120  					longest = len(name)
   121  				}
   122  				cmds = append(cmds, c)
   123  			}
   124  		}
   125  		for _, c := range cmds {
   126  			info := c.Info()
   127  			fmt.Fprintf(ctx.Stdout, "%-*s  %s\n", longest, info.Name, info.Purpose)
   128  		}
   129  	} else {
   130  		c, err := jujuc.NewCommand(hookctx, c.tool)
   131  		if err != nil {
   132  			return err
   133  		}
   134  		info := c.Info()
   135  		f := gnuflag.NewFlagSet(info.Name, gnuflag.ContinueOnError)
   136  		c.SetFlags(f)
   137  		ctx.Stdout.Write(info.Help(f))
   138  	}
   139  	return nil
   140  }