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 }