~sinzui/ubuntu/vivid/juju-core/vivid-1.24.6

« back to all changes in this revision

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

  • Committer: Curtis Hovey
  • Date: 2015-09-30 14:14:54 UTC
  • mfrom: (1.1.34)
  • Revision ID: curtis@hovey.name-20150930141454-o3ldf23dzyjio6c0
Backport of 1.24.6 from wily. (LP: #1500916)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright 2013 Canonical Ltd.
2
 
// Licensed under the AGPLv3, see LICENCE file for details.
3
 
 
4
 
package main
5
 
 
6
 
import (
7
 
        "fmt"
8
 
 
9
 
        "github.com/juju/cmd"
10
 
        "github.com/juju/names"
11
 
        "launchpad.net/gnuflag"
12
 
 
13
 
        "github.com/juju/juju/cmd/envcmd"
14
 
        "github.com/juju/juju/cmd/juju/block"
15
 
        "github.com/juju/juju/constraints"
16
 
)
17
 
 
18
 
const getConstraintsDoc = `
19
 
get-constraints returns a list of constraints that have been set on
20
 
the environment using juju set-constraints.  You can also view constraints set
21
 
for a specific service by using juju get-constraints <service>.
22
 
 
23
 
See Also:
24
 
   juju help constraints
25
 
   juju help set-constraints
26
 
`
27
 
 
28
 
const setConstraintsDoc = `
29
 
set-constraints sets machine constraints on the system, which are used as the
30
 
default constraints for all new machines provisioned in the environment (unless
31
 
overridden).  You can also set constraints on a specific service by using juju
32
 
set-constraints <service>.
33
 
 
34
 
Constraints set on a service are combined with environment constraints for
35
 
commands (such as juju deploy) that provision machines for services.  Where
36
 
environment and service constraints overlap, the service constraints take
37
 
precedence.
38
 
 
39
 
Examples:
40
 
 
41
 
   set-constraints mem=8G                         (all new machines in the environment must have at least 8GB of RAM)
42
 
   set-constraints --service wordpress mem=4G     (all new wordpress machines can ignore the 8G constraint above, and require only 4G)
43
 
 
44
 
See Also:
45
 
   juju help constraints
46
 
   juju help get-constraints
47
 
   juju help deploy
48
 
   juju help add-machine
49
 
   juju help add-unit
50
 
`
51
 
 
52
 
// GetConstraintsCommand shows the constraints for a service or environment.
53
 
type GetConstraintsCommand struct {
54
 
        envcmd.EnvCommandBase
55
 
        ServiceName string
56
 
        out         cmd.Output
57
 
}
58
 
 
59
 
func (c *GetConstraintsCommand) Info() *cmd.Info {
60
 
        return &cmd.Info{
61
 
                Name:    "get-constraints",
62
 
                Args:    "[<service>]",
63
 
                Purpose: "view constraints on the environment or a service",
64
 
                Doc:     getConstraintsDoc,
65
 
        }
66
 
}
67
 
 
68
 
func formatConstraints(value interface{}) ([]byte, error) {
69
 
        return []byte(value.(constraints.Value).String()), nil
70
 
}
71
 
 
72
 
func (c *GetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {
73
 
        c.out.AddFlags(f, "constraints", map[string]cmd.Formatter{
74
 
                "constraints": formatConstraints,
75
 
                "yaml":        cmd.FormatYaml,
76
 
                "json":        cmd.FormatJson,
77
 
        })
78
 
}
79
 
 
80
 
func (c *GetConstraintsCommand) Init(args []string) error {
81
 
        if len(args) > 0 {
82
 
                if !names.IsValidService(args[0]) {
83
 
                        return fmt.Errorf("invalid service name %q", args[0])
84
 
                }
85
 
                c.ServiceName, args = args[0], args[1:]
86
 
        }
87
 
        return cmd.CheckEmpty(args)
88
 
}
89
 
 
90
 
func (c *GetConstraintsCommand) Run(ctx *cmd.Context) error {
91
 
        apiclient, err := c.NewAPIClient()
92
 
        if err != nil {
93
 
                return err
94
 
        }
95
 
        defer apiclient.Close()
96
 
 
97
 
        var cons constraints.Value
98
 
        if c.ServiceName == "" {
99
 
                cons, err = apiclient.GetEnvironmentConstraints()
100
 
        } else {
101
 
                cons, err = apiclient.GetServiceConstraints(c.ServiceName)
102
 
        }
103
 
        if err != nil {
104
 
                return err
105
 
        }
106
 
        return c.out.Write(ctx, cons)
107
 
}
108
 
 
109
 
// SetConstraintsCommand shows the constraints for a service or environment.
110
 
type SetConstraintsCommand struct {
111
 
        envcmd.EnvCommandBase
112
 
        ServiceName string
113
 
        Constraints constraints.Value
114
 
}
115
 
 
116
 
func (c *SetConstraintsCommand) Info() *cmd.Info {
117
 
        return &cmd.Info{
118
 
                Name:    "set-constraints",
119
 
                Args:    "[key=[value] ...]",
120
 
                Purpose: "set constraints on the environment or a service",
121
 
                Doc:     setConstraintsDoc,
122
 
        }
123
 
}
124
 
 
125
 
func (c *SetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {
126
 
        f.StringVar(&c.ServiceName, "s", "", "set service constraints")
127
 
        f.StringVar(&c.ServiceName, "service", "", "")
128
 
}
129
 
 
130
 
func (c *SetConstraintsCommand) Init(args []string) (err error) {
131
 
        if c.ServiceName != "" && !names.IsValidService(c.ServiceName) {
132
 
                return fmt.Errorf("invalid service name %q", c.ServiceName)
133
 
        }
134
 
        c.Constraints, err = constraints.Parse(args...)
135
 
        return err
136
 
}
137
 
 
138
 
func (c *SetConstraintsCommand) Run(_ *cmd.Context) (err error) {
139
 
        apiclient, err := c.NewAPIClient()
140
 
        if err != nil {
141
 
                return err
142
 
        }
143
 
        defer apiclient.Close()
144
 
 
145
 
        if c.ServiceName == "" {
146
 
                err = apiclient.SetEnvironmentConstraints(c.Constraints)
147
 
        } else {
148
 
                err = apiclient.SetServiceConstraints(c.ServiceName, c.Constraints)
149
 
        }
150
 
        return block.ProcessBlockedError(err, block.BlockChange)
151
 
}