~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/cmd/juju/setmeterstatus/setmeterstatus.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2016 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package setmeterstatus
 
5
 
 
6
import (
 
7
        "strings"
 
8
 
 
9
        "github.com/juju/cmd"
 
10
        "github.com/juju/errors"
 
11
        "gopkg.in/juju/names.v2"
 
12
        "launchpad.net/gnuflag"
 
13
 
 
14
        "github.com/juju/juju/api/metricsdebug"
 
15
        "github.com/juju/juju/cmd/modelcmd"
 
16
)
 
17
 
 
18
const setMeterStatusDoc = `
 
19
Set meter status on the given application or unit. This command is used
 
20
to test the meter-status-changed hook for charms in development.
 
21
 
 
22
Examples:
 
23
    # Set Red meter status on all units of myapp
 
24
    juju set-meter-status myapp RED
 
25
 
 
26
    # Set AMBER meter status with "my message" as info on unit myapp/0
 
27
    juju set-meter-status myapp/0 AMBER --info "my message"
 
28
`
 
29
 
 
30
// SetMeterStatusCommand sets the meter status on an application or unit. Useful for charm authors.
 
31
type SetMeterStatusCommand struct {
 
32
        modelcmd.ModelCommandBase
 
33
        Tag        names.Tag
 
34
        Status     string
 
35
        StatusInfo string
 
36
}
 
37
 
 
38
// New creates a new SetMeterStatusCommand.
 
39
func New() cmd.Command {
 
40
        return modelcmd.Wrap(&SetMeterStatusCommand{})
 
41
}
 
42
 
 
43
// Info implements Command.Info.
 
44
func (c *SetMeterStatusCommand) Info() *cmd.Info {
 
45
        return &cmd.Info{
 
46
                Name:    "set-meter-status",
 
47
                Args:    "[application or unit] status",
 
48
                Purpose: "Sets the meter status on an application or unit.",
 
49
                Doc:     setMeterStatusDoc,
 
50
        }
 
51
}
 
52
 
 
53
// Init reads and verifies the cli arguments for the SetMeterStatusCommand
 
54
func (c *SetMeterStatusCommand) Init(args []string) error {
 
55
        if len(args) != 2 {
 
56
                return errors.New("you need to specify an entity (application or unit) and a status")
 
57
        }
 
58
        if names.IsValidUnit(args[0]) {
 
59
                c.Tag = names.NewUnitTag(args[0])
 
60
        } else if names.IsValidApplication(args[0]) {
 
61
                c.Tag = names.NewApplicationTag(args[0])
 
62
        } else {
 
63
                return errors.Errorf("%q is not a valid unit or application", args[0])
 
64
        }
 
65
        c.Status = args[1]
 
66
 
 
67
        if err := cmd.CheckEmpty(args[2:]); err != nil {
 
68
                return errors.Errorf("unknown command line arguments: " + strings.Join(args, ","))
 
69
        }
 
70
        return nil
 
71
}
 
72
 
 
73
// SetFlags implements Command.SetFlags.
 
74
func (c *SetMeterStatusCommand) SetFlags(f *gnuflag.FlagSet) {
 
75
        c.ModelCommandBase.SetFlags(f)
 
76
        f.StringVar(&c.StatusInfo, "info", "", "Set the meter status info to this string")
 
77
}
 
78
 
 
79
// SetMeterStatusClient defines the juju api required by the command.
 
80
type SetMeterStatusClient interface {
 
81
        SetMeterStatus(tag, status, info string) error
 
82
        Close() error
 
83
}
 
84
 
 
85
var newClient = func(env modelcmd.ModelCommandBase) (SetMeterStatusClient, error) {
 
86
        state, err := env.NewAPIRoot()
 
87
        if err != nil {
 
88
                return nil, errors.Trace(err)
 
89
        }
 
90
        return metricsdebug.NewClient(state), nil
 
91
}
 
92
 
 
93
// Run implements Command.Run.
 
94
func (c *SetMeterStatusCommand) Run(ctx *cmd.Context) error {
 
95
        client, err := newClient(c.ModelCommandBase)
 
96
        if err != nil {
 
97
                return errors.Trace(err)
 
98
        }
 
99
        defer client.Close()
 
100
        err = client.SetMeterStatus(c.Tag.String(), c.Status, c.StatusInfo)
 
101
        if err != nil {
 
102
                return errors.Trace(err)
 
103
        }
 
104
        return nil
 
105
}