github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/cmd/juju/helptool.go (about)

     1  // Copyright 2013, 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/cmd"
    11  	"gopkg.in/juju/charm.v4"
    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  type HelpToolCommand struct {
    80  	cmd.CommandBase
    81  	tool string
    82  }
    83  
    84  func (t *HelpToolCommand) Info() *cmd.Info {
    85  	return &cmd.Info{
    86  		Name:    "help-tool",
    87  		Args:    "[tool]",
    88  		Purpose: "show help on a juju charm tool",
    89  	}
    90  }
    91  
    92  func (t *HelpToolCommand) Init(args []string) error {
    93  	tool, err := cmd.ZeroOrOneArgs(args)
    94  	if err == nil {
    95  		t.tool = tool
    96  	}
    97  	return err
    98  }
    99  
   100  func (c *HelpToolCommand) Run(ctx *cmd.Context) error {
   101  	var hookctx dummyHookContext
   102  	if c.tool == "" {
   103  		// Ripped from SuperCommand. We could Run() a SuperCommand
   104  		// with "help commands", but then the implicit "help" command
   105  		// shows up.
   106  		names := jujuc.CommandNames()
   107  		cmds := make([]cmd.Command, 0, len(names))
   108  		longest := 0
   109  		for _, name := range names {
   110  			if c, err := jujuc.NewCommand(hookctx, name); err == nil {
   111  				if len(name) > longest {
   112  					longest = len(name)
   113  				}
   114  				cmds = append(cmds, c)
   115  			}
   116  		}
   117  		for _, c := range cmds {
   118  			info := c.Info()
   119  			fmt.Fprintf(ctx.Stdout, "%-*s  %s\n", longest, info.Name, info.Purpose)
   120  		}
   121  	} else {
   122  		c, err := jujuc.NewCommand(hookctx, c.tool)
   123  		if err != nil {
   124  			return err
   125  		}
   126  		info := c.Info()
   127  		f := gnuflag.NewFlagSet(info.Name, gnuflag.ContinueOnError)
   128  		c.SetFlags(f)
   129  		ctx.Stdout.Write(info.Help(f))
   130  	}
   131  	return nil
   132  }