Merge lp:~axwalk/juju-core/envcmd-inversion into lp:~go-bot/juju-core/trunk

Proposed by Andrew Wilkins
Status: Merged
Approved by: Andrew Wilkins
Approved revision: no longer in the source branch.
Merged at revision: 2721
Proposed branch: lp:~axwalk/juju-core/envcmd-inversion
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 3088 lines (+421/-485)
83 files modified
cmd/cmd.go (+12/-9)
cmd/envcmd/environmentcommand.go (+77/-37)
cmd/envcmd/environmentcommand_test.go (+42/-18)
cmd/juju/addmachine.go (+1/-5)
cmd/juju/addmachine_test.go (+2/-1)
cmd/juju/addrelation.go (+0/-3)
cmd/juju/addrelation_test.go (+2/-1)
cmd/juju/addunit.go (+0/-4)
cmd/juju/addunit_test.go (+3/-2)
cmd/juju/adduser.go (+0/-3)
cmd/juju/adduser_test.go (+15/-9)
cmd/juju/authorizedkeys.go (+5/-4)
cmd/juju/authorizedkeys_add.go (+0/-4)
cmd/juju/authorizedkeys_delete.go (+0/-4)
cmd/juju/authorizedkeys_import.go (+0/-4)
cmd/juju/authorizedkeys_list.go (+0/-8)
cmd/juju/authorizedkeys_test.go (+11/-10)
cmd/juju/bootstrap.go (+0/-4)
cmd/juju/bootstrap_test.go (+15/-14)
cmd/juju/cmd_test.go (+20/-19)
cmd/juju/constraints.go (+0/-8)
cmd/juju/constraints_test.go (+3/-2)
cmd/juju/debuglog.go (+0/-5)
cmd/juju/debuglog_test.go (+5/-4)
cmd/juju/deploy.go (+0/-4)
cmd/juju/deploy_test.go (+4/-3)
cmd/juju/endpoint.go (+0/-8)
cmd/juju/endpoint_test.go (+2/-1)
cmd/juju/ensureavailability.go (+0/-4)
cmd/juju/ensureavailability_test.go (+2/-1)
cmd/juju/environment.go (+0/-12)
cmd/juju/environment_test.go (+12/-11)
cmd/juju/expose.go (+0/-3)
cmd/juju/expose_test.go (+2/-1)
cmd/juju/get.go (+0/-4)
cmd/juju/get_test.go (+2/-1)
cmd/juju/main.go (+67/-71)
cmd/juju/main_test.go (+20/-2)
cmd/juju/plugin.go (+2/-9)
cmd/juju/publish.go (+0/-4)
cmd/juju/publish_test.go (+8/-7)
cmd/juju/removemachine.go (+0/-4)
cmd/juju/removemachine_test.go (+2/-1)
cmd/juju/removerelation.go (+0/-3)
cmd/juju/removerelation_test.go (+2/-1)
cmd/juju/removeservice.go (+0/-3)
cmd/juju/removeservice_test.go (+2/-1)
cmd/juju/removeunit.go (+0/-3)
cmd/juju/removeunit_test.go (+2/-1)
cmd/juju/removeuser.go (+0/-3)
cmd/juju/removeuser_test.go (+5/-4)
cmd/juju/resolved.go (+0/-4)
cmd/juju/resolved_test.go (+2/-1)
cmd/juju/retryprovisioning.go (+0/-3)
cmd/juju/retryprovisioning_test.go (+2/-1)
cmd/juju/run.go (+0/-4)
cmd/juju/run_test.go (+5/-4)
cmd/juju/set.go (+0/-4)
cmd/juju/set_test.go (+3/-2)
cmd/juju/ssh.go (+0/-4)
cmd/juju/ssh_test.go (+2/-1)
cmd/juju/status.go (+0/-4)
cmd/juju/status_test.go (+2/-1)
cmd/juju/synctools.go (+0/-4)
cmd/juju/synctools_test.go (+2/-1)
cmd/juju/unexpose.go (+0/-3)
cmd/juju/unexpose_test.go (+2/-1)
cmd/juju/unset.go (+0/-9)
cmd/juju/unset_test.go (+3/-2)
cmd/juju/upgradecharm.go (+0/-4)
cmd/juju/upgradecharm_test.go (+2/-1)
cmd/juju/upgradejuju.go (+0/-4)
cmd/juju/upgradejuju_test.go (+2/-1)
cmd/plugins/juju-metadata/imagemetadata.go (+0/-8)
cmd/plugins/juju-metadata/imagemetadata_test.go (+8/-7)
cmd/plugins/juju-metadata/metadata.go (+5/-4)
cmd/plugins/juju-metadata/toolsmetadata.go (+0/-8)
cmd/plugins/juju-metadata/toolsmetadata_test.go (+7/-6)
cmd/plugins/juju-metadata/validateimagemetadata.go (+0/-4)
cmd/plugins/juju-metadata/validateimagemetadata_test.go (+11/-10)
cmd/plugins/juju-metadata/validatetoolsmetadata.go (+0/-4)
cmd/plugins/juju-metadata/validatetoolsmetadata_test.go (+15/-14)
cmd/plugins/juju-restore/restore.go (+1/-5)
To merge this branch: bzr merge lp:~axwalk/juju-core/envcmd-inversion
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+219135@code.launchpad.net

Commit message

Invert envcmd relationship

Previously we embedded EnvCommandBase in all commands
requring an environment, and EnvCommandBase included
everything (SetFlags, and Init). The problem with this
is that it was easy to miss initialisation of the
EnvCommandBase type (this happened a few times), which
leads to bad things happening like sync-tools destroying
environments.

I have inverted the relationship so that we now have
envcmd.EnvironCommand, an interface that extends Command
with a SetEnvName method, and EnvCommandBase, which
implements EnvironCommand. A new method, envcmd.Wrap takes
an EnvironCommand and creates a Command that calls
SetEnvName prior to the wrapped method's Init method. If
the environment name cannot be determined, the wrapping
command will error out early.

https://codereview.appspot.com/94350045/

Description of the change

Invert envcmd relationship

Previously we embedded EnvCommandBase in all commands
requring an environment, and EnvCommandBase included
everything (SetFlags, and Init). The problem with this
is that it was easy to miss initialisation of the
EnvCommandBase type (this happened a few times), which
leads to bad things happening like sync-tools destroying
environments.

I have inverted the relationship so that we now have
envcmd.EnvironCommand, an interface that extends Command
with a SetEnvName method, and EnvCommandBase, which
implements EnvironCommand. A new method, envcmd.Wrap takes
an EnvironCommand and creates a Command that calls
SetEnvName prior to the wrapped method's Init method. If
the environment name cannot be determined, the wrapping
command will error out early.

https://codereview.appspot.com/94350045/

To post a comment you must log in.
Revision history for this message
Andrew Wilkins (axwalk) wrote :
Download full text (3.7 KiB)

Reviewers: mp+219135_code.launchpad.net,

Message:
Please take a look.

Description:
Invert envcmd relationship

Previously we embedded EnvCommandBase in all commands
requring an environment, and EnvCommandBase included
everything (SetFlags, and Init). The problem with this
is that it was easy to miss initialisation of the
EnvCommandBase type (this happened a few times), which
leads to bad things happening like sync-tools destroying
environments.

I have inverted the relationship so that we now have
envcmd.EnvironCommand, an interface that extends Command
with a SetEnvName method, and EnvCommandBase, which
implements EnvironCommand. A new method, envcmd.Wrap takes
an EnvironCommand and creates a Command that calls
SetEnvName prior to the wrapped method's Init method. If
the environment name cannot be determined, the wrapping
command will error out early.

https://code.launchpad.net/~axwalk/juju-core/envcmd-inversion/+merge/219135

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/94350045/

Affected files (+354, -440 lines):
   A [revision details]
   M cmd/cmd.go
   M cmd/envcmd/environmentcommand.go
   M cmd/envcmd/environmentcommand_test.go
   M cmd/juju/addmachine.go
   M cmd/juju/addmachine_test.go
   M cmd/juju/addrelation.go
   M cmd/juju/addrelation_test.go
   M cmd/juju/addunit.go
   M cmd/juju/addunit_test.go
   M cmd/juju/adduser.go
   M cmd/juju/adduser_test.go
   M cmd/juju/authorizedkeys_add.go
   M cmd/juju/authorizedkeys_delete.go
   M cmd/juju/authorizedkeys_import.go
   M cmd/juju/authorizedkeys_list.go
   M cmd/juju/authorizedkeys_test.go
   M cmd/juju/bootstrap.go
   M cmd/juju/bootstrap_test.go
   M cmd/juju/cmd_test.go
   M cmd/juju/constraints.go
   M cmd/juju/constraints_test.go
   M cmd/juju/debuglog.go
   M cmd/juju/debuglog_test.go
   M cmd/juju/deploy.go
   M cmd/juju/deploy_test.go
   M cmd/juju/endpoint.go
   M cmd/juju/endpoint_test.go
   M cmd/juju/ensureavailability.go
   M cmd/juju/ensureavailability_test.go
   M cmd/juju/environment.go
   M cmd/juju/environment_test.go
   M cmd/juju/expose.go
   M cmd/juju/expose_test.go
   M cmd/juju/get.go
   M cmd/juju/get_test.go
   M cmd/juju/main.go
   M cmd/juju/main_test.go
   M cmd/juju/plugin.go
   M cmd/juju/publish.go
   M cmd/juju/publish_test.go
   M cmd/juju/removemachine.go
   M cmd/juju/removemachine_test.go
   M cmd/juju/removerelation.go
   M cmd/juju/removerelation_test.go
   M cmd/juju/removeservice.go
   M cmd/juju/removeservice_test.go
   M cmd/juju/removeunit.go
   M cmd/juju/removeunit_test.go
   M cmd/juju/removeuser.go
   M cmd/juju/removeuser_test.go
   M cmd/juju/resolved.go
   M cmd/juju/resolved_test.go
   M cmd/juju/retryprovisioning.go
   M cmd/juju/retryprovisioning_test.go
   M cmd/juju/run.go
   M cmd/juju/run_test.go
   M cmd/juju/set.go
   M cmd/juju/set_test.go
   M cmd/juju/ssh.go
   M cmd/juju/ssh_test.go
   M cmd/juju/status.go
   M cmd/juju/status_test.go
   M cmd/juju/synctools.go
   M cmd/juju/synctools_test.go
   M cmd/juju/unexpose.go
   M cmd/juju/unexpose_test.go
   M cmd/juju/unset.go
   M cmd/juju/unset_test.go
   M cmd/juju/upgradecharm.go
   M cmd/juju/upgradecharm_test....

Read more...

Revision history for this message
Ian Booth (wallyworld) wrote :

LGTM with perhaps a 2nd opinion from William.

It does seem that we are missing tests to ensure that each command is
wrapped as expected. We test the wrapping function itself in
environmentcommand but I can't see how or where we are testing that each
business command is wrapped eg for add-machine, how do we test that it
has been registered using
jujucmd.Register(wrap(&AddMachineCommand{}))and not just
jujucmd.Register(&AddMachineCommand{})

We should be able to iterate over all registered commands to check. Can
we do this before landing?

https://codereview.appspot.com/94350045/

Revision history for this message
William Reade (fwereade) wrote :

This LGTM as far as it goes (modulo the need for testing -- I'd like it
to be impossible to *casually* add a command that isn't an environment
command).

But I'm wondering whether it's rational to take it a step further -- do
something like insert the EnvName into the Run args, such that the
commands we create/test/etc are not actually cmd.Commands -- thereby
making it impossible(?) to accidentally register an unwrapped env
command.

FWIW, if it were structured that way, I'd be less dogmatic about the
need for testing the list of registered commands...

https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go
File cmd/juju/main.go (right):

https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go#newcode140
cmd/juju/main.go:140: jujucmd.Register(wrap(&cmd.VersionCommand{}))
Yeah, as Ian suggested, I'd really like us to be able to directly test
that we actually get functional environment commands -- and ideally we'd
get this tested on *every* registered command.

https://codereview.appspot.com/94350045/

Revision history for this message
Andrew Wilkins (axwalk) wrote :

On 2014/05/12 07:24:18, fwereade wrote:
> This LGTM as far as it goes (modulo the need for testing -- I'd like
it to be
> impossible to *casually* add a command that isn't an environment
command).

> But I'm wondering whether it's rational to take it a step further --
do
> something like insert the EnvName into the Run args, such that the
commands we
> create/test/etc are not actually cmd.Commands -- thereby making it
impossible(?)
> to accidentally register an unwrapped env command.

Not all commands operate on an environment. I started down this path of
having an alternative Run method (RunInEnv) which takes *cmd.Context and
envName, but found it too clumsy. The approach I've taken takes us in
that direction, so it could be changed with less churn later if desired.

> FWIW, if it were structured that way, I'd be less dogmatic about the
need for
> testing the list of registered commands...

> https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go
> File cmd/juju/main.go (right):

https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go#newcode140
> cmd/juju/main.go:140: jujucmd.Register(wrap(&cmd.VersionCommand{}))
> Yeah, as Ian suggested, I'd really like us to be able to directly test
that we
> actually get functional environment commands -- and ideally we'd get
this tested
> on *every* registered command.

I'll add a test that checks each registered command is an environment
command, with a list of exceptions.

https://codereview.appspot.com/94350045/

Revision history for this message
Andrew Wilkins (axwalk) wrote :

On 2014/05/12 07:53:07, axw wrote:
> On 2014/05/12 07:24:18, fwereade wrote:
> > This LGTM as far as it goes (modulo the need for testing -- I'd like
it to be
> > impossible to *casually* add a command that isn't an environment
command).
> >
> > But I'm wondering whether it's rational to take it a step further --
do
> > something like insert the EnvName into the Run args, such that the
commands we
> > create/test/etc are not actually cmd.Commands -- thereby making it
> impossible(?)
> > to accidentally register an unwrapped env command.

> Not all commands operate on an environment. I started down this path
of having
> an alternative Run method (RunInEnv) which takes *cmd.Context and
envName, but
> found it too clumsy. The approach I've taken takes us in that
direction, so it
> could be changed with less churn later if desired.

> > FWIW, if it were structured that way, I'd be less dogmatic about the
need for
> > testing the list of registered commands...
> >
> > https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go
> > File cmd/juju/main.go (right):
> >
> >
https://codereview.appspot.com/94350045/diff/1/cmd/juju/main.go#newcode140
> > cmd/juju/main.go:140: jujucmd.Register(wrap(&cmd.VersionCommand{}))
> > Yeah, as Ian suggested, I'd really like us to be able to directly
test that we
> > actually get functional environment commands -- and ideally we'd get
this
> tested
> > on *every* registered command.

> I'll add a test that checks each registered command is an environment
command,
> with a list of exceptions.

Actually the test is simpler than that: it just checks that there are no
EnvironCommands registered. All EnvironCommands must be wrapped.

https://codereview.appspot.com/94350045/

Revision history for this message
Andrew Wilkins (axwalk) wrote :
Revision history for this message
Ian Booth (wallyworld) wrote :

On 2014/05/12 11:11:19, axw wrote:
> Please take a look.

LGTM

https://codereview.appspot.com/94350045/

Revision history for this message
Go Bot (go-bot) wrote :
Download full text (11.8 KiB)

The attempt to merge lp:~axwalk/juju-core/envcmd-inversion into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core 0.013s
ok launchpad.net/juju-core/agent 0.885s
ok launchpad.net/juju-core/agent/mongo 0.441s
ok launchpad.net/juju-core/agent/tools 0.219s
ok launchpad.net/juju-core/bzr 4.744s
ok launchpad.net/juju-core/cert 2.578s
ok launchpad.net/juju-core/charm 0.511s
? launchpad.net/juju-core/charm/hooks [no test files]
? launchpad.net/juju-core/charm/testing [no test files]
ok launchpad.net/juju-core/cloudinit 0.026s
ok launchpad.net/juju-core/cloudinit/sshinit 0.781s
ok launchpad.net/juju-core/cmd 0.142s
ok launchpad.net/juju-core/cmd/charm-admin 0.276s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/envcmd 0.181s
ok launchpad.net/juju-core/cmd/juju 218.654s
ok launchpad.net/juju-core/cmd/jujud 65.577s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 9.149s
? launchpad.net/juju-core/cmd/plugins/juju-restore [no test files]
ok launchpad.net/juju-core/cmd/plugins/local 0.179s
? launchpad.net/juju-core/cmd/plugins/local/juju-local [no test files]
ok launchpad.net/juju-core/constraints 0.028s
ok launchpad.net/juju-core/container 0.040s
ok launchpad.net/juju-core/container/factory 0.037s
ok launchpad.net/juju-core/container/kvm 0.166s
ok launchpad.net/juju-core/container/kvm/mock 0.040s
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 4.283s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
? launchpad.net/juju-core/container/testing [no test files]
ok launchpad.net/juju-core/downloader 5.206s
ok launchpad.net/juju-core/environs 2.176s
ok launchpad.net/juju-core/environs/bootstrap 12.224s
ok launchpad.net/juju-core/environs/cloudinit 0.420s
ok launchpad.net/juju-core/environs/config 1.910s
ok launchpad.net/juju-core/environs/configstore 0.029s
ok launchpad.net/juju-core/environs/filestorage 0.024s
ok launchpad.net/juju-core/environs/httpstorage 0.645s
ok launchpad.net/juju-core/environs/imagemetadata 0.416s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.044s
ok launchpad.net/juju-core/environs/jujutest 0.168s
ok launchpad.net/juju-core/environs/manual 8.986s
? launchpad.net/juju-core/environs/network [no test files]
ok launchpad.net/juju-core/environs/simplestreams 0.246s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 0.858s
ok launchpad.net/juju-core/environs/storage 0.757s
ok launchpad.net/juju-core/environs/sync 50.475s
ok launchpad.net/juju-core/environs/testing 0.133s
ok launchpad.net/juju-core/environs/tools 4.920s
? launchpad.net/juju-core/environs/tools/testing [no test files]
ok launchpad.net/juju-core/errors 0.015s
ok launchpad.net/juju-core/instance 0.019s
? launchpad.net/juju-core/instance/testing [...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmd/cmd.go'
--- cmd/cmd.go 2014-04-01 07:47:11 +0000
+++ cmd/cmd.go 2014-05-12 11:08:32 +0000
@@ -210,20 +210,23 @@
210 return buf.Bytes()210 return buf.Bytes()
211}211}
212212
213// Errors from commands can be either ErrHelp, which means "show the help" or213// Errors from commands can be ErrSilent (don't print an error message),
214// some other error related to needed flags missing, or needed positional args214// ErrHelp (show the help) or some other error related to needed flags
215// missing, in which case we should print the error and return a non-zero215// missing, or needed positional args missing, in which case we should
216// return code.216// print the error and return a non-zero return code.
217func handleCommandError(c Command, ctx *Context, err error, f *gnuflag.FlagSet) (int, bool) {217func handleCommandError(c Command, ctx *Context, err error, f *gnuflag.FlagSet) (rc int, done bool) {
218 if err == gnuflag.ErrHelp {218 switch err {
219 case nil:
220 return 0, false
221 case gnuflag.ErrHelp:
219 ctx.Stdout.Write(c.Info().Help(f))222 ctx.Stdout.Write(c.Info().Help(f))
220 return 0, true223 return 0, true
221 }224 case ErrSilent:
222 if err != nil {225 return 2, true
226 default:
223 fmt.Fprintf(ctx.Stderr, "error: %v\n", err)227 fmt.Fprintf(ctx.Stderr, "error: %v\n", err)
224 return 2, true228 return 2, true
225 }229 }
226 return 0, false
227}230}
228231
229// Main runs the given Command in the supplied Context with the given232// Main runs the given Command in the supplied Context with the given
230233
=== modified file 'cmd/envcmd/environmentcommand.go'
--- cmd/envcmd/environmentcommand.go 2014-05-09 13:24:50 +0000
+++ cmd/envcmd/environmentcommand.go 2014-05-12 11:08:32 +0000
@@ -24,13 +24,6 @@
24// has been explicitly specified, and there is no default environment.24// has been explicitly specified, and there is no default environment.
25var ErrNoEnvironmentSpecified = fmt.Errorf("no environment specified")25var ErrNoEnvironmentSpecified = fmt.Errorf("no environment specified")
2626
27// The purpose of EnvCommandBase is to provide a default member and flag
28// setting for commands that deal across different environments.
29type EnvCommandBase struct {
30 cmd.CommandBase
31 EnvName string
32}
33
34func getCurrentEnvironmentFilePath() string {27func getCurrentEnvironmentFilePath() string {
35 return filepath.Join(osenv.JujuHome(), CurrentEnvironmentFilename)28 return filepath.Join(osenv.JujuHome(), CurrentEnvironmentFilename)
36}29}
@@ -60,39 +53,86 @@
6053
61// There is simple ordering for the default environment. Firstly check the54// There is simple ordering for the default environment. Firstly check the
62// JUJU_ENV environment variable. If that is set, it gets used. If it isn't55// JUJU_ENV environment variable. If that is set, it gets used. If it isn't
63// set, look in the $JUJU_HOME/current-environment file.56// set, look in the $JUJU_HOME/current-environment file. If neither are
64func getDefaultEnvironment() string {57// available, read environments.yaml and use the default environment therein.
65 defaultEnv := os.Getenv(osenv.JujuEnvEnvKey)58func getDefaultEnvironment() (string, error) {
66 if defaultEnv != "" {59 if defaultEnv := os.Getenv(osenv.JujuEnvEnvKey); defaultEnv != "" {
67 return defaultEnv60 return defaultEnv, nil
68 }61 }
69 return ReadCurrentEnvironment()62 if currentEnv := ReadCurrentEnvironment(); currentEnv != "" {
70}63 return currentEnv, nil
7164 }
72// EnsureEnvName ensures that c.EnvName is non-empty, or sets it to the default65 envs, err := environs.ReadEnvirons("")
73// environment name. If there is no default environment name, then66 if err != nil {
74// EnsureEnvName returns ErrNoEnvironmentSpecified.67 return "", err
75func (c *EnvCommandBase) EnsureEnvName() error {68 }
76 if c.EnvName == "" {69 if envs.Default == "" {
77 envs, err := environs.ReadEnvirons("")70 return "", ErrNoEnvironmentSpecified
78 if err != nil {71 }
79 return err72 return envs.Default, nil
80 }73}
81 if envs.Default == "" {74
82 return ErrNoEnvironmentSpecified75// EnvironCommand extends cmd.Command with a SetEnvName method.
83 }76type EnvironCommand interface {
84 c.EnvName = envs.Default77 cmd.Command
85 }78
79 // SetEnvName is called prior to the wrapped command's Init method
80 // with the active environment name. The environment name is guaranteed
81 // to be non-empty at entry of Init.
82 SetEnvName(envName string)
83}
84
85// EnvCommandBase is a convenience type for embedding in commands
86// that wish to implement EnvironCommand.
87type EnvCommandBase struct {
88 cmd.CommandBase
89 EnvName string
90}
91
92func (c *EnvCommandBase) SetEnvName(envName string) {
93 c.EnvName = envName
94}
95
96// Wrap wraps the specified EnvironCommand, returning a Command
97// that proxies to each of the EnvironCommand methods.
98func Wrap(c EnvironCommand) cmd.Command {
99 return &environCommandWrapper{EnvironCommand: c}
100}
101
102type environCommandWrapper struct {
103 EnvironCommand
104 envName string
105}
106
107func (w *environCommandWrapper) EnvironName() string {
108 return w.envName
109}
110
111// ensureEnvName ensures that w.envName is non-empty, or sets it to
112// the default environment name. If there is no default environment name,
113// then ensureEnvName returns ErrNoEnvironmentSpecified.
114func (w *environCommandWrapper) ensureEnvName() error {
115 if w.envName != "" {
116 return nil
117 }
118 defaultEnv, err := getDefaultEnvironment()
119 if err != nil {
120 return err
121 }
122 w.envName = defaultEnv
86 return nil123 return nil
87}124}
88125
89func (c *EnvCommandBase) SetFlags(f *gnuflag.FlagSet) {126func (w *environCommandWrapper) SetFlags(f *gnuflag.FlagSet) {
90 defaultEnv := getDefaultEnvironment()127 f.StringVar(&w.envName, "e", "", "juju environment to operate in")
91 f.StringVar(&c.EnvName, "e", defaultEnv, "juju environment to operate in")128 f.StringVar(&w.envName, "environment", "", "")
92 f.StringVar(&c.EnvName, "environment", defaultEnv, "")129 w.EnvironCommand.SetFlags(f)
93}130}
94131
95// EnvironName returns the name of the environment for this command132func (w *environCommandWrapper) Init(args []string) error {
96func (c *EnvCommandBase) EnvironName() string {133 if err := w.ensureEnvName(); err != nil {
97 return c.EnvName134 return err
135 }
136 w.SetEnvName(w.envName)
137 return w.EnvironCommand.Init(args)
98}138}
99139
=== modified file 'cmd/envcmd/environmentcommand_test.go'
--- cmd/envcmd/environmentcommand_test.go 2014-05-09 13:24:50 +0000
+++ cmd/envcmd/environmentcommand_test.go 2014-05-12 11:08:32 +0000
@@ -12,6 +12,7 @@
12 "launchpad.net/gnuflag"12 "launchpad.net/gnuflag"
13 gc "launchpad.net/gocheck"13 gc "launchpad.net/gocheck"
1414
15 "launchpad.net/juju-core/cmd"
15 "launchpad.net/juju-core/cmd/envcmd"16 "launchpad.net/juju-core/cmd/envcmd"
16 "launchpad.net/juju-core/environs"17 "launchpad.net/juju-core/environs"
17 "launchpad.net/juju-core/juju/osenv"18 "launchpad.net/juju-core/juju/osenv"
@@ -47,29 +48,33 @@
47}48}
4849
49func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentNothingSet(c *gc.C) {50func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentNothingSet(c *gc.C) {
50 env := envcmd.GetDefaultEnvironment()51 env, err := envcmd.GetDefaultEnvironment()
51 c.Assert(env, gc.Equals, "")52 c.Assert(env, gc.Equals, "")
53 c.Assert(err, jc.Satisfies, environs.IsNoEnv)
52}54}
5355
54func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentCurrentEnvironmentSet(c *gc.C) {56func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentCurrentEnvironmentSet(c *gc.C) {
55 err := envcmd.WriteCurrentEnvironment("fubar")57 err := envcmd.WriteCurrentEnvironment("fubar")
56 c.Assert(err, gc.IsNil)58 c.Assert(err, gc.IsNil)
57 env := envcmd.GetDefaultEnvironment()59 env, err := envcmd.GetDefaultEnvironment()
58 c.Assert(env, gc.Equals, "fubar")60 c.Assert(env, gc.Equals, "fubar")
61 c.Assert(err, gc.IsNil)
59}62}
6063
61func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentJujuEnvSet(c *gc.C) {64func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentJujuEnvSet(c *gc.C) {
62 os.Setenv(osenv.JujuEnvEnvKey, "magic")65 os.Setenv(osenv.JujuEnvEnvKey, "magic")
63 env := envcmd.GetDefaultEnvironment()66 env, err := envcmd.GetDefaultEnvironment()
64 c.Assert(env, gc.Equals, "magic")67 c.Assert(env, gc.Equals, "magic")
68 c.Assert(err, gc.IsNil)
65}69}
6670
67func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentBothSet(c *gc.C) {71func (s *EnvironmentCommandSuite) TestGetDefaultEnvironmentBothSet(c *gc.C) {
68 os.Setenv(osenv.JujuEnvEnvKey, "magic")72 os.Setenv(osenv.JujuEnvEnvKey, "magic")
69 err := envcmd.WriteCurrentEnvironment("fubar")73 err := envcmd.WriteCurrentEnvironment("fubar")
70 c.Assert(err, gc.IsNil)74 c.Assert(err, gc.IsNil)
71 env := envcmd.GetDefaultEnvironment()75 env, err := envcmd.GetDefaultEnvironment()
72 c.Assert(env, gc.Equals, "magic")76 c.Assert(env, gc.Equals, "magic")
77 c.Assert(err, gc.IsNil)
73}78}
7479
75func (s *EnvironmentCommandSuite) TestWriteAddsNewline(c *gc.C) {80func (s *EnvironmentCommandSuite) TestWriteAddsNewline(c *gc.C) {
@@ -87,12 +92,12 @@
87 c.Assert(err, gc.ErrorMatches, "unable to write to the environment file: .*")92 c.Assert(err, gc.ErrorMatches, "unable to write to the environment file: .*")
88}93}
8994
90func (s *EnvironmentCommandSuite) TestEnsureEnvName(c *gc.C) {95func (s *EnvironmentCommandSuite) TestEnvironCommandInit(c *gc.C) {
91 // Take environment name from command line arg.96 // Take environment name from command line arg.
92 cmd := initEnvCommandBase(c, "explicit")97 cmd, envName := prepareEnvCommand(c, "explicit")
93 err := cmd.EnsureEnvName()98 err := cmd.Init(nil)
94 c.Assert(err, gc.IsNil)99 c.Assert(err, gc.IsNil)
95 c.Assert(cmd.EnvName, gc.Equals, "explicit")100 c.Assert(*envName, gc.Equals, "explicit")
96101
97 // Take environment name from the default.102 // Take environment name from the default.
98 defer coretesting.MakeFakeHome(c, coretesting.MultipleEnvConfig).Restore()103 defer coretesting.MakeFakeHome(c, coretesting.MultipleEnvConfig).Restore()
@@ -108,33 +113,52 @@
108 testEnsureEnvName(c, "fubar")113 testEnsureEnvName(c, "fubar")
109}114}
110115
111func (s *EnvironmentCommandSuite) TestEnsureEnvNameErrors(c *gc.C) {116func (s *EnvironmentCommandSuite) TestEnvironCommandInitErrors(c *gc.C) {
112 err := initEnvCommandBase(c, "").EnsureEnvName()117 cmd, _ := prepareEnvCommand(c, "")
118 err := cmd.Init(nil)
113 c.Assert(err, jc.Satisfies, environs.IsNoEnv)119 c.Assert(err, jc.Satisfies, environs.IsNoEnv)
114120
115 // If there are multiple environments but no default,121 // If there are multiple environments but no default,
116 // an error should be returned.122 // an error should be returned.
117 defer coretesting.MakeFakeHome(c, coretesting.MultipleEnvConfigNoDefault).Restore()123 defer coretesting.MakeFakeHome(c, coretesting.MultipleEnvConfigNoDefault).Restore()
118 err = initEnvCommandBase(c, "").EnsureEnvName()124 cmd, _ = prepareEnvCommand(c, "")
125 err = cmd.Init(nil)
119 c.Assert(err, gc.Equals, envcmd.ErrNoEnvironmentSpecified)126 c.Assert(err, gc.Equals, envcmd.ErrNoEnvironmentSpecified)
120}127}
121128
122func initEnvCommandBase(c *gc.C, name string) *envcmd.EnvCommandBase {129type testCommand struct {
130 envcmd.EnvCommandBase
131}
132
133func (c *testCommand) Info() *cmd.Info {
134 panic("should not be called")
135}
136
137func (c *testCommand) Run(ctx *cmd.Context) error {
138 panic("should not be called")
139}
140
141// prepareEnvCommand prepares a Command for a call to Init,
142// returning the Command and a pointer to a string that will
143// contain the environment name after the Command's Init method
144// has been called.
145func prepareEnvCommand(c *gc.C, name string) (cmd.Command, *string) {
123 var flags gnuflag.FlagSet146 var flags gnuflag.FlagSet
124 var cmd envcmd.EnvCommandBase147 var cmd testCommand
125 cmd.SetFlags(&flags)148 wrapped := envcmd.Wrap(&cmd)
149 wrapped.SetFlags(&flags)
126 var args []string150 var args []string
127 if name != "" {151 if name != "" {
128 args = []string{"-e", name}152 args = []string{"-e", name}
129 }153 }
130 err := flags.Parse(false, args)154 err := flags.Parse(false, args)
131 c.Assert(err, gc.IsNil)155 c.Assert(err, gc.IsNil)
132 return &cmd156 return wrapped, &cmd.EnvName
133}157}
134158
135func testEnsureEnvName(c *gc.C, expect string) {159func testEnsureEnvName(c *gc.C, expect string) {
136 cmd := initEnvCommandBase(c, "")160 cmd, envName := prepareEnvCommand(c, "")
137 err := cmd.EnsureEnvName()161 err := cmd.Init(nil)
138 c.Assert(err, gc.IsNil)162 c.Assert(err, gc.IsNil)
139 c.Assert(cmd.EnvName, gc.Equals, expect)163 c.Assert(*envName, gc.Equals, expect)
140}164}
141165
=== modified file 'cmd/juju/addmachine.go'
--- cmd/juju/addmachine.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/addmachine.go 2014-05-12 11:08:32 +0000
@@ -74,15 +74,11 @@
74}74}
7575
76func (c *AddMachineCommand) SetFlags(f *gnuflag.FlagSet) {76func (c *AddMachineCommand) SetFlags(f *gnuflag.FlagSet) {
77 c.EnvCommandBase.SetFlags(f)
78 f.StringVar(&c.Series, "series", "", "the charm series")77 f.StringVar(&c.Series, "series", "", "the charm series")
79 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "additional machine constraints")78 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "additional machine constraints")
80}79}
8180
82func (c *AddMachineCommand) Init(args []string) error {81func (c *AddMachineCommand) Init(args []string) error {
83 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
84 return err
85 }
86 if c.Constraints.Container != nil {82 if c.Constraints.Container != nil {
87 return fmt.Errorf("container constraint %q not allowed when adding a machine", *c.Constraints.Container)83 return fmt.Errorf("container constraint %q not allowed when adding a machine", *c.Constraints.Container)
88 }84 }
@@ -92,7 +88,7 @@
92 }88 }
93 c.Placement, err = instance.ParsePlacement(placement)89 c.Placement, err = instance.ParsePlacement(placement)
94 if err == instance.ErrPlacementScopeMissing {90 if err == instance.ErrPlacementScopeMissing {
95 placement = c.EnvironName() + ":" + placement91 placement = c.EnvName + ":" + placement
96 c.Placement, err = instance.ParsePlacement(placement)92 c.Placement, err = instance.ParsePlacement(placement)
97 }93 }
98 if err != nil {94 if err != nil {
9995
=== modified file 'cmd/juju/addmachine_test.go'
--- cmd/juju/addmachine_test.go 2014-04-23 05:38:27 +0000
+++ cmd/juju/addmachine_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 jc "github.com/juju/testing/checkers"10 jc "github.com/juju/testing/checkers"
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/constraints"14 "launchpad.net/juju-core/constraints"
14 "launchpad.net/juju-core/instance"15 "launchpad.net/juju-core/instance"
15 jujutesting "launchpad.net/juju-core/juju/testing"16 jujutesting "launchpad.net/juju-core/juju/testing"
@@ -24,7 +25,7 @@
24var _ = gc.Suite(&AddMachineSuite{})25var _ = gc.Suite(&AddMachineSuite{})
2526
26func runAddMachine(c *gc.C, args ...string) error {27func runAddMachine(c *gc.C, args ...string) error {
27 _, err := testing.RunCommand(c, &AddMachineCommand{}, args)28 _, err := testing.RunCommand(c, envcmd.Wrap(&AddMachineCommand{}), args)
28 return err29 return err
29}30}
3031
3132
=== modified file 'cmd/juju/addrelation.go'
--- cmd/juju/addrelation.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/addrelation.go 2014-05-12 11:08:32 +0000
@@ -26,9 +26,6 @@
26}26}
2727
28func (c *AddRelationCommand) Init(args []string) error {28func (c *AddRelationCommand) Init(args []string) error {
29 if err := c.EnsureEnvName(); err != nil {
30 return err
31 }
32 if len(args) != 2 {29 if len(args) != 2 {
33 return fmt.Errorf("a relation must involve two services")30 return fmt.Errorf("a relation must involve two services")
34 }31 }
3532
=== modified file 'cmd/juju/addrelation_test.go'
--- cmd/juju/addrelation_test.go 2013-09-13 14:48:13 +0000
+++ cmd/juju/addrelation_test.go 2014-05-12 11:08:32 +0000
@@ -6,6 +6,7 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/cmd/envcmd"
9 jujutesting "launchpad.net/juju-core/juju/testing"10 jujutesting "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/testing"11 "launchpad.net/juju-core/testing"
11)12)
@@ -17,7 +18,7 @@
17var _ = gc.Suite(&AddRelationSuite{})18var _ = gc.Suite(&AddRelationSuite{})
1819
19func runAddRelation(c *gc.C, args ...string) error {20func runAddRelation(c *gc.C, args ...string) error {
20 _, err := testing.RunCommand(c, &AddRelationCommand{}, args)21 _, err := testing.RunCommand(c, envcmd.Wrap(&AddRelationCommand{}), args)
21 return err22 return err
22}23}
2324
2425
=== modified file 'cmd/juju/addunit.go'
--- cmd/juju/addunit.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/addunit.go 2014-05-12 11:08:32 +0000
@@ -74,15 +74,11 @@
74}74}
7575
76func (c *AddUnitCommand) SetFlags(f *gnuflag.FlagSet) {76func (c *AddUnitCommand) SetFlags(f *gnuflag.FlagSet) {
77 c.EnvCommandBase.SetFlags(f)
78 c.UnitCommandBase.SetFlags(f)77 c.UnitCommandBase.SetFlags(f)
79 f.IntVar(&c.NumUnits, "n", 1, "number of service units to add")78 f.IntVar(&c.NumUnits, "n", 1, "number of service units to add")
80}79}
8180
82func (c *AddUnitCommand) Init(args []string) error {81func (c *AddUnitCommand) Init(args []string) error {
83 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
84 return err
85 }
86 switch len(args) {82 switch len(args) {
87 case 1:83 case 1:
88 c.ServiceName = args[0]84 c.ServiceName = args[0]
8985
=== modified file 'cmd/juju/addunit_test.go'
--- cmd/juju/addunit_test.go 2013-12-05 17:30:02 +0000
+++ cmd/juju/addunit_test.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/charm"9 "launchpad.net/juju-core/charm"
10 "launchpad.net/juju-core/cmd/envcmd"
10 "launchpad.net/juju-core/instance"11 "launchpad.net/juju-core/instance"
11 jujutesting "launchpad.net/juju-core/juju/testing"12 jujutesting "launchpad.net/juju-core/juju/testing"
12 "launchpad.net/juju-core/state"13 "launchpad.net/juju-core/state"
@@ -38,13 +39,13 @@
38func (s *AddUnitSuite) TestInitErrors(c *gc.C) {39func (s *AddUnitSuite) TestInitErrors(c *gc.C) {
39 for i, t := range initAddUnitErrorTests {40 for i, t := range initAddUnitErrorTests {
40 c.Logf("test %d", i)41 c.Logf("test %d", i)
41 err := testing.InitCommand(&AddUnitCommand{}, t.args)42 err := testing.InitCommand(envcmd.Wrap(&AddUnitCommand{}), t.args)
42 c.Check(err, gc.ErrorMatches, t.err)43 c.Check(err, gc.ErrorMatches, t.err)
43 }44 }
44}45}
4546
46func runAddUnit(c *gc.C, args ...string) error {47func runAddUnit(c *gc.C, args ...string) error {
47 _, err := testing.RunCommand(c, &AddUnitCommand{}, args)48 _, err := testing.RunCommand(c, envcmd.Wrap(&AddUnitCommand{}), args)
48 return err49 return err
49}50}
5051
5152
=== modified file 'cmd/juju/adduser.go'
--- cmd/juju/adduser.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/adduser.go 2014-05-12 11:08:32 +0000
@@ -51,9 +51,6 @@
51 })51 })
52}52}
53func (c *AddUserCommand) Init(args []string) error {53func (c *AddUserCommand) Init(args []string) error {
54 if err := c.EnsureEnvName(); err != nil {
55 return err
56 }
57 switch len(args) {54 switch len(args) {
58 case 0:55 case 0:
59 return fmt.Errorf("no username supplied")56 return fmt.Errorf("no username supplied")
6057
=== modified file 'cmd/juju/adduser_test.go'
--- cmd/juju/adduser_test.go 2014-03-28 10:55:18 +0000
+++ cmd/juju/adduser_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,8 @@
11 "launchpad.net/goyaml"11 "launchpad.net/goyaml"
12 jujutesting "launchpad.net/juju-core/juju/testing"12 jujutesting "launchpad.net/juju-core/juju/testing"
1313
14 "launchpad.net/juju-core/cmd"
15 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/testing"16 "launchpad.net/juju-core/testing"
15)17)
1618
@@ -22,22 +24,26 @@
2224
23var _ = gc.Suite(&AddUserSuite{})25var _ = gc.Suite(&AddUserSuite{})
2426
27func newAddUserCommand() cmd.Command {
28 return envcmd.Wrap(&AddUserCommand{})
29}
30
25func (s *AddUserSuite) TestAddUser(c *gc.C) {31func (s *AddUserSuite) TestAddUser(c *gc.C) {
2632
27 _, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password"})33 _, err := testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password"})
28 c.Assert(err, gc.IsNil)34 c.Assert(err, gc.IsNil)
2935
30 _, err = testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "newpassword"})36 _, err = testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "newpassword"})
31 c.Assert(err, gc.ErrorMatches, "Failed to create user: user already exists")37 c.Assert(err, gc.ErrorMatches, "Failed to create user: user already exists")
32}38}
3339
34func (s *AddUserSuite) TestTooManyArgs(c *gc.C) {40func (s *AddUserSuite) TestTooManyArgs(c *gc.C) {
35 _, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password", "whoops"})41 _, err := testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password", "whoops"})
36 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["whoops"\]`)42 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["whoops"\]`)
37}43}
3844
39func (s *AddUserSuite) TestNotEnoughArgs(c *gc.C) {45func (s *AddUserSuite) TestNotEnoughArgs(c *gc.C) {
40 _, err := testing.RunCommand(c, &AddUserCommand{}, []string{})46 _, err := testing.RunCommand(c, newAddUserCommand(), []string{})
41 c.Assert(err, gc.ErrorMatches, `no username supplied`)47 c.Assert(err, gc.ErrorMatches, `no username supplied`)
42}48}
4349
@@ -50,7 +56,7 @@
50 tempFile, err := ioutil.TempFile("", "adduser-test")56 tempFile, err := ioutil.TempFile("", "adduser-test")
51 tempFile.Close()57 tempFile.Close()
52 c.Assert(err, gc.IsNil)58 c.Assert(err, gc.IsNil)
53 _, err = testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password", "-o", tempFile.Name()})59 _, err = testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password", "-o", tempFile.Name()})
54 c.Assert(err, gc.IsNil)60 c.Assert(err, gc.IsNil)
55 data, err := ioutil.ReadFile(tempFile.Name())61 data, err := ioutil.ReadFile(tempFile.Name())
56 result := map[string]interface{}{}62 result := map[string]interface{}{}
@@ -65,7 +71,7 @@
65 "password": "password",71 "password": "password",
66 "state-servers": []interface{}{},72 "state-servers": []interface{}{},
67 "ca-cert": ""}73 "ca-cert": ""}
68 ctx, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password"})74 ctx, err := testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password"})
69 c.Assert(err, gc.IsNil)75 c.Assert(err, gc.IsNil)
70 stdout := ctx.Stdout.(*bytes.Buffer).Bytes()76 stdout := ctx.Stdout.(*bytes.Buffer).Bytes()
71 result := map[string]interface{}{}77 result := map[string]interface{}{}
@@ -80,7 +86,7 @@
80 tempFile, err := ioutil.TempFile("", "adduser-test")86 tempFile, err := ioutil.TempFile("", "adduser-test")
81 tempFile.Close()87 tempFile.Close()
82 c.Assert(err, gc.IsNil)88 c.Assert(err, gc.IsNil)
83 _, err = testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password", "-o", tempFile.Name(), "--format", "json"})89 _, err = testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password", "-o", tempFile.Name(), "--format", "json"})
84 c.Assert(err, gc.IsNil)90 c.Assert(err, gc.IsNil)
85 data, err := ioutil.ReadFile(tempFile.Name())91 data, err := ioutil.ReadFile(tempFile.Name())
86 c.Assert(string(data), gc.DeepEquals, expected)92 c.Assert(string(data), gc.DeepEquals, expected)
@@ -89,14 +95,14 @@
89func (s *AddUserSuite) TestJenvJsonFileOutput(c *gc.C) {95func (s *AddUserSuite) TestJenvJsonFileOutput(c *gc.C) {
90 expected := `{"User":"foobar","Password":"password","state-servers":null,"ca-cert":""}96 expected := `{"User":"foobar","Password":"password","state-servers":null,"ca-cert":""}
91`97`
92 ctx, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password", "--format", "json"})98 ctx, err := testing.RunCommand(c, newAddUserCommand(), []string{"foobar", "password", "--format", "json"})
93 c.Assert(err, gc.IsNil)99 c.Assert(err, gc.IsNil)
94 stdout := ctx.Stdout.(*bytes.Buffer).String()100 stdout := ctx.Stdout.(*bytes.Buffer).String()
95 c.Assert(stdout, gc.DeepEquals, expected)101 c.Assert(stdout, gc.DeepEquals, expected)
96}102}
97103
98func (s *AddUserSuite) TestGeneratePassword(c *gc.C) {104func (s *AddUserSuite) TestGeneratePassword(c *gc.C) {
99 ctx, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar"})105 ctx, err := testing.RunCommand(c, newAddUserCommand(), []string{"foobar"})
100 c.Assert(err, gc.IsNil)106 c.Assert(err, gc.IsNil)
101 stdout := ctx.Stdout.(*bytes.Buffer).Bytes()107 stdout := ctx.Stdout.(*bytes.Buffer).Bytes()
102 var d map[string]interface{}108 var d map[string]interface{}
103109
=== modified file 'cmd/juju/authorizedkeys.go'
--- cmd/juju/authorizedkeys.go 2014-04-25 06:39:01 +0000
+++ cmd/juju/authorizedkeys.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 "launchpad.net/gnuflag"7 "launchpad.net/gnuflag"
88
9 "launchpad.net/juju-core/cmd"9 "launchpad.net/juju-core/cmd"
10 "launchpad.net/juju-core/cmd/envcmd"
10)11)
1112
12var authKeysDoc = `13var authKeysDoc = `
@@ -29,10 +30,10 @@
29 Aliases: []string{"authorised-keys"},30 Aliases: []string{"authorised-keys"},
30 }),31 }),
31 }32 }
32 sshkeyscmd.Register(&AddKeysCommand{})33 sshkeyscmd.Register(envcmd.Wrap(&AddKeysCommand{}))
33 sshkeyscmd.Register(&DeleteKeysCommand{})34 sshkeyscmd.Register(envcmd.Wrap(&DeleteKeysCommand{}))
34 sshkeyscmd.Register(&ImportKeysCommand{})35 sshkeyscmd.Register(envcmd.Wrap(&ImportKeysCommand{}))
35 sshkeyscmd.Register(&ListKeysCommand{})36 sshkeyscmd.Register(envcmd.Wrap(&ListKeysCommand{}))
36 return sshkeyscmd37 return sshkeyscmd
37}38}
3839
3940
=== modified file 'cmd/juju/authorizedkeys_add.go'
--- cmd/juju/authorizedkeys_add.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/authorizedkeys_add.go 2014-05-12 11:08:32 +0000
@@ -35,9 +35,6 @@
35}35}
3636
37func (c *AddKeysCommand) Init(args []string) error {37func (c *AddKeysCommand) Init(args []string) error {
38 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
39 return err
40 }
41 switch len(args) {38 switch len(args) {
42 case 0:39 case 0:
43 return errors.New("no ssh key specified")40 return errors.New("no ssh key specified")
@@ -48,7 +45,6 @@
48}45}
4946
50func (c *AddKeysCommand) SetFlags(f *gnuflag.FlagSet) {47func (c *AddKeysCommand) SetFlags(f *gnuflag.FlagSet) {
51 c.EnvCommandBase.SetFlags(f)
52 f.StringVar(&c.user, "user", "admin", "the user for which to add the keys")48 f.StringVar(&c.user, "user", "admin", "the user for which to add the keys")
53}49}
5450
5551
=== modified file 'cmd/juju/authorizedkeys_delete.go'
--- cmd/juju/authorizedkeys_delete.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/authorizedkeys_delete.go 2014-05-12 11:08:32 +0000
@@ -37,9 +37,6 @@
37}37}
3838
39func (c *DeleteKeysCommand) Init(args []string) error {39func (c *DeleteKeysCommand) Init(args []string) error {
40 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
41 return err
42 }
43 switch len(args) {40 switch len(args) {
44 case 0:41 case 0:
45 return errors.New("no ssh key id specified")42 return errors.New("no ssh key id specified")
@@ -50,7 +47,6 @@
50}47}
5148
52func (c *DeleteKeysCommand) SetFlags(f *gnuflag.FlagSet) {49func (c *DeleteKeysCommand) SetFlags(f *gnuflag.FlagSet) {
53 c.EnvCommandBase.SetFlags(f)
54 f.StringVar(&c.user, "user", "admin", "the user for which to delete the keys")50 f.StringVar(&c.user, "user", "admin", "the user for which to delete the keys")
55}51}
5652
5753
=== modified file 'cmd/juju/authorizedkeys_import.go'
--- cmd/juju/authorizedkeys_import.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/authorizedkeys_import.go 2014-05-12 11:08:32 +0000
@@ -36,9 +36,6 @@
36}36}
3737
38func (c *ImportKeysCommand) Init(args []string) error {38func (c *ImportKeysCommand) Init(args []string) error {
39 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
40 return err
41 }
42 switch len(args) {39 switch len(args) {
43 case 0:40 case 0:
44 return errors.New("no ssh key id specified")41 return errors.New("no ssh key id specified")
@@ -49,7 +46,6 @@
49}46}
5047
51func (c *ImportKeysCommand) SetFlags(f *gnuflag.FlagSet) {48func (c *ImportKeysCommand) SetFlags(f *gnuflag.FlagSet) {
52 c.EnvCommandBase.SetFlags(f)
53 f.StringVar(&c.user, "user", "admin", "the user for which to import the keys")49 f.StringVar(&c.user, "user", "admin", "the user for which to import the keys")
54}50}
5551
5652
=== modified file 'cmd/juju/authorizedkeys_list.go'
--- cmd/juju/authorizedkeys_list.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/authorizedkeys_list.go 2014-05-12 11:08:32 +0000
@@ -37,18 +37,10 @@
37}37}
3838
39func (c *ListKeysCommand) SetFlags(f *gnuflag.FlagSet) {39func (c *ListKeysCommand) SetFlags(f *gnuflag.FlagSet) {
40 c.EnvCommandBase.SetFlags(f)
41 f.BoolVar(&c.showFullKey, "full", false, "show full key instead of just the key fingerprint")40 f.BoolVar(&c.showFullKey, "full", false, "show full key instead of just the key fingerprint")
42 f.StringVar(&c.user, "user", "admin", "the user for which to list the keys")41 f.StringVar(&c.user, "user", "admin", "the user for which to list the keys")
43}42}
4443
45func (c *ListKeysCommand) Init(args []string) error {
46 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
47 return err
48 }
49 return cmd.CheckEmpty(args)
50}
51
52func (c *ListKeysCommand) Run(context *cmd.Context) error {44func (c *ListKeysCommand) Run(context *cmd.Context) error {
53 client, err := juju.NewKeyManagerClient(c.EnvName)45 client, err := juju.NewKeyManagerClient(c.EnvName)
54 if err != nil {46 if err != nil {
5547
=== modified file 'cmd/juju/authorizedkeys_test.go'
--- cmd/juju/authorizedkeys_test.go 2014-04-25 06:39:01 +0000
+++ cmd/juju/authorizedkeys_test.go 2014-05-12 11:08:32 +0000
@@ -9,6 +9,7 @@
99
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/cmd/envcmd"
12 "launchpad.net/juju-core/juju/osenv"13 "launchpad.net/juju-core/juju/osenv"
13 jujutesting "launchpad.net/juju-core/juju/testing"14 jujutesting "launchpad.net/juju-core/juju/testing"
14 keymanagerserver "launchpad.net/juju-core/state/apiserver/keymanager"15 keymanagerserver "launchpad.net/juju-core/state/apiserver/keymanager"
@@ -127,7 +128,7 @@
127 key2 := sshtesting.ValidKeyTwo.Key + " another@host"128 key2 := sshtesting.ValidKeyTwo.Key + " another@host"
128 s.setAuthorizedKeys(c, key1, key2)129 s.setAuthorizedKeys(c, key1, key2)
129130
130 context, err := coretesting.RunCommand(c, &ListKeysCommand{}, []string{})131 context, err := coretesting.RunCommand(c, envcmd.Wrap(&ListKeysCommand{}), []string{})
131 c.Assert(err, gc.IsNil)132 c.Assert(err, gc.IsNil)
132 output := strings.TrimSpace(coretesting.Stdout(context))133 output := strings.TrimSpace(coretesting.Stdout(context))
133 c.Assert(err, gc.IsNil)134 c.Assert(err, gc.IsNil)
@@ -139,7 +140,7 @@
139 key2 := sshtesting.ValidKeyTwo.Key + " another@host"140 key2 := sshtesting.ValidKeyTwo.Key + " another@host"
140 s.setAuthorizedKeys(c, key1, key2)141 s.setAuthorizedKeys(c, key1, key2)
141142
142 context, err := coretesting.RunCommand(c, &ListKeysCommand{}, []string{"--full"})143 context, err := coretesting.RunCommand(c, envcmd.Wrap(&ListKeysCommand{}), []string{"--full"})
143 c.Assert(err, gc.IsNil)144 c.Assert(err, gc.IsNil)
144 output := strings.TrimSpace(coretesting.Stdout(context))145 output := strings.TrimSpace(coretesting.Stdout(context))
145 c.Assert(err, gc.IsNil)146 c.Assert(err, gc.IsNil)
@@ -153,7 +154,7 @@
153 _, err := s.State.AddUser("fred", "password")154 _, err := s.State.AddUser("fred", "password")
154 c.Assert(err, gc.IsNil)155 c.Assert(err, gc.IsNil)
155156
156 context, err := coretesting.RunCommand(c, &ListKeysCommand{}, []string{"--user", "fred"})157 context, err := coretesting.RunCommand(c, envcmd.Wrap(&ListKeysCommand{}), []string{"--user", "fred"})
157 c.Assert(err, gc.IsNil)158 c.Assert(err, gc.IsNil)
158 output := strings.TrimSpace(coretesting.Stdout(context))159 output := strings.TrimSpace(coretesting.Stdout(context))
159 c.Assert(err, gc.IsNil)160 c.Assert(err, gc.IsNil)
@@ -161,7 +162,7 @@
161}162}
162163
163func (s *ListKeysSuite) TestTooManyArgs(c *gc.C) {164func (s *ListKeysSuite) TestTooManyArgs(c *gc.C) {
164 _, err := coretesting.RunCommand(c, &ListKeysCommand{}, []string{"foo"})165 _, err := coretesting.RunCommand(c, envcmd.Wrap(&ListKeysCommand{}), []string{"foo"})
165 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["foo"\]`)166 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["foo"\]`)
166}167}
167168
@@ -176,7 +177,7 @@
176 s.setAuthorizedKeys(c, key1)177 s.setAuthorizedKeys(c, key1)
177178
178 key2 := sshtesting.ValidKeyTwo.Key + " another@host"179 key2 := sshtesting.ValidKeyTwo.Key + " another@host"
179 context, err := coretesting.RunCommand(c, &AddKeysCommand{}, []string{key2, "invalid-key"})180 context, err := coretesting.RunCommand(c, envcmd.Wrap(&AddKeysCommand{}), []string{key2, "invalid-key"})
180 c.Assert(err, gc.IsNil)181 c.Assert(err, gc.IsNil)
181 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot add key "invalid-key".*\n`)182 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot add key "invalid-key".*\n`)
182 s.assertEnvironKeys(c, key1, key2)183 s.assertEnvironKeys(c, key1, key2)
@@ -189,7 +190,7 @@
189 c.Assert(err, gc.IsNil)190 c.Assert(err, gc.IsNil)
190191
191 key2 := sshtesting.ValidKeyTwo.Key + " another@host"192 key2 := sshtesting.ValidKeyTwo.Key + " another@host"
192 context, err := coretesting.RunCommand(c, &AddKeysCommand{}, []string{"--user", "fred", key2})193 context, err := coretesting.RunCommand(c, envcmd.Wrap(&AddKeysCommand{}), []string{"--user", "fred", key2})
193 c.Assert(err, gc.IsNil)194 c.Assert(err, gc.IsNil)
194 c.Assert(coretesting.Stderr(context), gc.Equals, "")195 c.Assert(coretesting.Stderr(context), gc.Equals, "")
195 s.assertEnvironKeys(c, key1, key2)196 s.assertEnvironKeys(c, key1, key2)
@@ -207,7 +208,7 @@
207 s.setAuthorizedKeys(c, key1, key2)208 s.setAuthorizedKeys(c, key1, key2)
208209
209 context, err := coretesting.RunCommand(210 context, err := coretesting.RunCommand(
210 c, &DeleteKeysCommand{}, []string{sshtesting.ValidKeyTwo.Fingerprint, "invalid-key"})211 c, envcmd.Wrap(&DeleteKeysCommand{}), []string{sshtesting.ValidKeyTwo.Fingerprint, "invalid-key"})
211 c.Assert(err, gc.IsNil)212 c.Assert(err, gc.IsNil)
212 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot delete key id "invalid-key".*\n`)213 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot delete key id "invalid-key".*\n`)
213 s.assertEnvironKeys(c, key1)214 s.assertEnvironKeys(c, key1)
@@ -221,7 +222,7 @@
221 c.Assert(err, gc.IsNil)222 c.Assert(err, gc.IsNil)
222223
223 context, err := coretesting.RunCommand(224 context, err := coretesting.RunCommand(
224 c, &DeleteKeysCommand{}, []string{"--user", "fred", sshtesting.ValidKeyTwo.Fingerprint})225 c, envcmd.Wrap(&DeleteKeysCommand{}), []string{"--user", "fred", sshtesting.ValidKeyTwo.Fingerprint})
225 c.Assert(err, gc.IsNil)226 c.Assert(err, gc.IsNil)
226 c.Assert(coretesting.Stderr(context), gc.Equals, "")227 c.Assert(coretesting.Stderr(context), gc.Equals, "")
227 s.assertEnvironKeys(c, key1)228 s.assertEnvironKeys(c, key1)
@@ -242,7 +243,7 @@
242 key1 := sshtesting.ValidKeyOne.Key + " user@host"243 key1 := sshtesting.ValidKeyOne.Key + " user@host"
243 s.setAuthorizedKeys(c, key1)244 s.setAuthorizedKeys(c, key1)
244245
245 context, err := coretesting.RunCommand(c, &ImportKeysCommand{}, []string{"lp:validuser", "invalid-key"})246 context, err := coretesting.RunCommand(c, envcmd.Wrap(&ImportKeysCommand{}), []string{"lp:validuser", "invalid-key"})
246 c.Assert(err, gc.IsNil)247 c.Assert(err, gc.IsNil)
247 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot import key id "invalid-key".*\n`)248 c.Assert(coretesting.Stderr(context), gc.Matches, `cannot import key id "invalid-key".*\n`)
248 s.assertEnvironKeys(c, key1, sshtesting.ValidKeyThree.Key)249 s.assertEnvironKeys(c, key1, sshtesting.ValidKeyThree.Key)
@@ -254,7 +255,7 @@
254 _, err := s.State.AddUser("fred", "password")255 _, err := s.State.AddUser("fred", "password")
255 c.Assert(err, gc.IsNil)256 c.Assert(err, gc.IsNil)
256257
257 context, err := coretesting.RunCommand(c, &ImportKeysCommand{}, []string{"--user", "fred", "lp:validuser"})258 context, err := coretesting.RunCommand(c, envcmd.Wrap(&ImportKeysCommand{}), []string{"--user", "fred", "lp:validuser"})
258 c.Assert(err, gc.IsNil)259 c.Assert(err, gc.IsNil)
259 c.Assert(coretesting.Stderr(context), gc.Equals, "")260 c.Assert(coretesting.Stderr(context), gc.Equals, "")
260 s.assertEnvironKeys(c, key1, sshtesting.ValidKeyThree.Key)261 s.assertEnvironKeys(c, key1, sshtesting.ValidKeyThree.Key)
261262
=== modified file 'cmd/juju/bootstrap.go'
--- cmd/juju/bootstrap.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/bootstrap.go 2014-05-12 11:08:32 +0000
@@ -78,7 +78,6 @@
78}78}
7979
80func (c *BootstrapCommand) SetFlags(f *gnuflag.FlagSet) {80func (c *BootstrapCommand) SetFlags(f *gnuflag.FlagSet) {
81 c.EnvCommandBase.SetFlags(f)
82 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "set environment constraints")81 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "set environment constraints")
83 f.BoolVar(&c.UploadTools, "upload-tools", false, "upload local version of tools before bootstrapping")82 f.BoolVar(&c.UploadTools, "upload-tools", false, "upload local version of tools before bootstrapping")
84 f.Var(newSeriesValue(nil, &c.Series), "upload-series", "upload tools for supplied comma-separated series list")83 f.Var(newSeriesValue(nil, &c.Series), "upload-series", "upload tools for supplied comma-separated series list")
@@ -88,9 +87,6 @@
88}87}
8988
90func (c *BootstrapCommand) Init(args []string) (err error) {89func (c *BootstrapCommand) Init(args []string) (err error) {
91 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
92 return err
93 }
94 if len(c.Series) > 0 && !c.UploadTools {90 if len(c.Series) > 0 && !c.UploadTools {
95 return fmt.Errorf("--upload-series requires --upload-tools")91 return fmt.Errorf("--upload-series requires --upload-tools")
96 }92 }
9793
=== modified file 'cmd/juju/bootstrap_test.go'
--- cmd/juju/bootstrap_test.go 2014-05-12 00:24:54 +0000
+++ cmd/juju/bootstrap_test.go 2014-05-12 11:08:32 +0000
@@ -12,6 +12,7 @@
12 gc "launchpad.net/gocheck"12 gc "launchpad.net/gocheck"
1313
14 "launchpad.net/juju-core/cmd"14 "launchpad.net/juju-core/cmd"
15 "launchpad.net/juju-core/cmd/envcmd"
15 "launchpad.net/juju-core/constraints"16 "launchpad.net/juju-core/constraints"
16 "launchpad.net/juju-core/environs"17 "launchpad.net/juju-core/environs"
17 "launchpad.net/juju-core/environs/config"18 "launchpad.net/juju-core/environs/config"
@@ -142,7 +143,7 @@
142 restore := envtools.TestingPatchBootstrapFindTools(mockFindTools)143 restore := envtools.TestingPatchBootstrapFindTools(mockFindTools)
143 defer restore()144 defer restore()
144145
145 _, errc := runCommand(nullContext(c), new(BootstrapCommand), test.args...)146 _, errc := runCommand(nullContext(c), envcmd.Wrap(new(BootstrapCommand)), test.args...)
146 err := <-errc147 err := <-errc
147 c.Check(findToolsRetryValues, gc.DeepEquals, test.expectedAllowRetry)148 c.Check(findToolsRetryValues, gc.DeepEquals, test.expectedAllowRetry)
148 stripped := strings.Replace(err.Error(), "\n", "", -1)149 stripped := strings.Replace(err.Error(), "\n", "", -1)
@@ -225,7 +226,7 @@
225 }226 }
226227
227 // Run command and check for uploads.228 // Run command and check for uploads.
228 opc, errc := runCommand(nullContext(c), new(BootstrapCommand), test.args...)229 opc, errc := runCommand(nullContext(c), envcmd.Wrap(new(BootstrapCommand)), test.args...)
229 // Check for remaining operations/errors.230 // Check for remaining operations/errors.
230 if test.err != "" {231 if test.err != "" {
231 err := <-errc232 err := <-errc
@@ -402,10 +403,10 @@
402 defaultSeriesVersion.Minor = 11403 defaultSeriesVersion.Minor = 11
403 s.PatchValue(&version.Current, defaultSeriesVersion)404 s.PatchValue(&version.Current, defaultSeriesVersion)
404405
405 _, err := coretesting.RunCommand(c, &BootstrapCommand{}, nil)406 _, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), nil)
406 c.Assert(err, gc.IsNil)407 c.Assert(err, gc.IsNil)
407408
408 _, err = coretesting.RunCommand(c, &BootstrapCommand{}, nil)409 _, err = coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), nil)
409 c.Assert(err, gc.ErrorMatches, "environment is already bootstrapped")410 c.Assert(err, gc.ErrorMatches, "environment is already bootstrapped")
410}411}
411412
@@ -428,7 +429,7 @@
428 _, fake := makeEmptyFakeHome(c)429 _, fake := makeEmptyFakeHome(c)
429 defer fake.Restore()430 defer fake.Restore()
430431
431 ctx, err := coretesting.RunCommand(c, &BootstrapCommand{},432 ctx, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}),
432 []string{"--upload-tools", argVariant, "foo,bar"})433 []string{"--upload-tools", argVariant, "foo,bar"})
433434
434 c.Assert(err, gc.IsNil)435 c.Assert(err, gc.IsNil)
@@ -457,7 +458,7 @@
457 loggo.RegisterWriter(logger, testWriter, loggo.WARNING)458 loggo.RegisterWriter(logger, testWriter, loggo.WARNING)
458 defer loggo.RemoveWriter(logger)459 defer loggo.RemoveWriter(logger)
459460
460 _, errc := runCommand(ctx, new(BootstrapCommand), "-e", "peckham")461 _, errc := runCommand(ctx, envcmd.Wrap(new(BootstrapCommand)), "-e", "peckham")
461 c.Assert(<-errc, gc.IsNil)462 c.Assert(<-errc, gc.IsNil)
462 c.Assert(testWriter.Log, jc.LogMatches, []string{"ignoring environments.yaml: using bootstrap config in .*"})463 c.Assert(testWriter.Log, jc.LogMatches, []string{"ignoring environments.yaml: using bootstrap config in .*"})
463}464}
@@ -469,7 +470,7 @@
469470
470 // Bootstrap the environment with an invalid source.471 // Bootstrap the environment with an invalid source.
471 // The command returns with an error.472 // The command returns with an error.
472 _, err := coretesting.RunCommand(c, &BootstrapCommand{}, []string{"--metadata-source", c.MkDir()})473 _, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), []string{"--metadata-source", c.MkDir()})
473 c.Check(err, gc.ErrorMatches, "cannot upload bootstrap tools: Juju "+474 c.Check(err, gc.ErrorMatches, "cannot upload bootstrap tools: Juju "+
474 "cannot bootstrap because no tools are available for your "+475 "cannot bootstrap because no tools are available for your "+
475 "environment(.|\n)*")476 "environment(.|\n)*")
@@ -524,7 +525,7 @@
524 devVersion.Minor = 11525 devVersion.Minor = 11
525 s.PatchValue(&version.Current, devVersion)526 s.PatchValue(&version.Current, devVersion)
526527
527 _, err := coretesting.RunCommand(c, &BootstrapCommand{}, []string{"--metadata-source", sourceDir})528 _, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), []string{"--metadata-source", sourceDir})
528 c.Assert(err, gc.IsNil)529 c.Assert(err, gc.IsNil)
529 c.Assert(imagemetadata.DefaultBaseURL, gc.Equals, imagemetadata.UbuntuCloudImagesURL)530 c.Assert(imagemetadata.DefaultBaseURL, gc.Equals, imagemetadata.UbuntuCloudImagesURL)
530531
@@ -541,7 +542,7 @@
541 // Bootstrap the environment with the valid source.542 // Bootstrap the environment with the valid source.
542 // The bootstrapping has to show no error, because the tools543 // The bootstrapping has to show no error, because the tools
543 // are automatically synchronized.544 // are automatically synchronized.
544 _, err := coretesting.RunCommand(c, &BootstrapCommand{}, []string{"--metadata-source", sourceDir})545 _, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), []string{"--metadata-source", sourceDir})
545 c.Assert(err, gc.IsNil)546 c.Assert(err, gc.IsNil)
546547
547 // Now check the available tools which are the 1.2.0 envtools.548 // Now check the available tools which are the 1.2.0 envtools.
@@ -575,7 +576,7 @@
575576
576 env := s.setupAutoUploadTest(c, "1.7.3", otherSeries)577 env := s.setupAutoUploadTest(c, "1.7.3", otherSeries)
577 // Run command and check for that upload has been run for tools matching the current juju version.578 // Run command and check for that upload has been run for tools matching the current juju version.
578 opc, errc := runCommand(nullContext(c), new(BootstrapCommand))579 opc, errc := runCommand(nullContext(c), envcmd.Wrap(new(BootstrapCommand)))
579 c.Assert(<-errc, gc.IsNil)580 c.Assert(<-errc, gc.IsNil)
580 c.Assert((<-opc).(dummy.OpPutFile).Env, gc.Equals, "peckham")581 c.Assert((<-opc).(dummy.OpPutFile).Env, gc.Equals, "peckham")
581 list, err := envtools.FindTools(env, version.Current.Major, version.Current.Minor, coretools.Filter{}, false)582 list, err := envtools.FindTools(env, version.Current.Major, version.Current.Minor, coretools.Filter{}, false)
@@ -603,7 +604,7 @@
603604
604func (s *BootstrapSuite) TestAutoUploadOnlyForDev(c *gc.C) {605func (s *BootstrapSuite) TestAutoUploadOnlyForDev(c *gc.C) {
605 s.setupAutoUploadTest(c, "1.8.3", "precise")606 s.setupAutoUploadTest(c, "1.8.3", "precise")
606 _, errc := runCommand(nullContext(c), new(BootstrapCommand))607 _, errc := runCommand(nullContext(c), envcmd.Wrap(new(BootstrapCommand)))
607 err := <-errc608 err := <-errc
608 stripped := strings.Replace(err.Error(), "\n", "", -1)609 stripped := strings.Replace(err.Error(), "\n", "", -1)
609 c.Assert(stripped, gc.Matches, noToolsAvailableMessage)610 c.Assert(stripped, gc.Matches, noToolsAvailableMessage)
@@ -612,7 +613,7 @@
612func (s *BootstrapSuite) TestMissingToolsError(c *gc.C) {613func (s *BootstrapSuite) TestMissingToolsError(c *gc.C) {
613 s.setupAutoUploadTest(c, "1.8.3", "precise")614 s.setupAutoUploadTest(c, "1.8.3", "precise")
614615
615 _, err := coretesting.RunCommand(c, &BootstrapCommand{}, nil)616 _, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), nil)
616 c.Assert(err, gc.ErrorMatches, "cannot upload bootstrap tools: Juju "+617 c.Assert(err, gc.ErrorMatches, "cannot upload bootstrap tools: Juju "+
617 "cannot bootstrap because no tools are available for your "+618 "cannot bootstrap because no tools are available for your "+
618 "environment(.|\n)*")619 "environment(.|\n)*")
@@ -626,7 +627,7 @@
626 s.setupAutoUploadTest(c, "1.7.3", "precise")627 s.setupAutoUploadTest(c, "1.7.3", "precise")
627 s.PatchValue(&sync.Upload, uploadToolsAlwaysFails)628 s.PatchValue(&sync.Upload, uploadToolsAlwaysFails)
628629
629 ctx, err := coretesting.RunCommand(c, &BootstrapCommand{}, nil)630 ctx, err := coretesting.RunCommand(c, envcmd.Wrap(&BootstrapCommand{}), nil)
630631
631 c.Check(coretesting.Stderr(ctx), gc.Matches,632 c.Check(coretesting.Stderr(ctx), gc.Matches,
632 "uploading tools for series \\[precise .* raring\\]\n")633 "uploading tools for series \\[precise .* raring\\]\n")
@@ -642,7 +643,7 @@
642 // upload is only enabled for dev versions.643 // upload is only enabled for dev versions.
643 devVersion.Minor = 11644 devVersion.Minor = 11
644 s.PatchValue(&version.Current, devVersion)645 s.PatchValue(&version.Current, devVersion)
645 opc, errc := runCommand(nullContext(c), new(BootstrapCommand), "-e", "brokenenv")646 opc, errc := runCommand(nullContext(c), envcmd.Wrap(new(BootstrapCommand)), "-e", "brokenenv")
646 err := <-errc647 err := <-errc
647 c.Assert(err, gc.ErrorMatches, "dummy.Bootstrap is broken")648 c.Assert(err, gc.ErrorMatches, "dummy.Bootstrap is broken")
648 var opDestroy *dummy.OpDestroy649 var opDestroy *dummy.OpDestroy
649650
=== modified file 'cmd/juju/cmd_test.go'
--- cmd/juju/cmd_test.go 2014-05-11 22:52:40 +0000
+++ cmd/juju/cmd_test.go 2014-05-12 11:08:32 +0000
@@ -13,6 +13,7 @@
13 gc "launchpad.net/gocheck"13 gc "launchpad.net/gocheck"
1414
15 "launchpad.net/juju-core/cmd"15 "launchpad.net/juju-core/cmd"
16 "launchpad.net/juju-core/cmd/envcmd"
16 "launchpad.net/juju-core/juju/osenv"17 "launchpad.net/juju-core/juju/osenv"
17 "launchpad.net/juju-core/juju/testing"18 "launchpad.net/juju-core/juju/testing"
18 "launchpad.net/juju-core/provider/dummy"19 "launchpad.net/juju-core/provider/dummy"
@@ -68,12 +69,12 @@
68 }69 }
69}70}
7071
71// assertConnName asserts that the Command is using72// assertEnvName asserts that the Command is using
72// the given environment name.73// the given environment name.
73// Since every command has a different type,74// Since every command has a different type,
74// we use reflection to look at the value of the75// we use reflection to look at the value of the
75// Conn field in the value.76// Conn field in the value.
76func assertConnName(c *gc.C, com cmd.Command, name string) {77func assertEnvName(c *gc.C, com cmd.Command, name string) {
77 v := reflect.ValueOf(com).Elem().FieldByName("EnvName")78 v := reflect.ValueOf(com).Elem().FieldByName("EnvName")
78 c.Assert(v, jc.Satisfies, reflect.Value.IsValid)79 c.Assert(v, jc.Satisfies, reflect.Value.IsValid)
79 c.Assert(v.Interface(), gc.Equals, name)80 c.Assert(v.Interface(), gc.Equals, name)
@@ -81,12 +82,12 @@
8182
82// All members of EnvironmentInitTests are tested for the -environment and -e83// All members of EnvironmentInitTests are tested for the -environment and -e
83// flags, and that extra arguments will cause parsing to fail.84// flags, and that extra arguments will cause parsing to fail.
84var EnvironmentInitTests = []func() (cmd.Command, []string){85var EnvironmentInitTests = []func() (envcmd.EnvironCommand, []string){
85 func() (cmd.Command, []string) { return new(BootstrapCommand), nil },86 func() (envcmd.EnvironCommand, []string) { return new(BootstrapCommand), nil },
86 func() (cmd.Command, []string) {87 func() (envcmd.EnvironCommand, []string) {
87 return new(DeployCommand), []string{"charm-name", "service-name"}88 return new(DeployCommand), []string{"charm-name", "service-name"}
88 },89 },
89 func() (cmd.Command, []string) { return new(StatusCommand), nil },90 func() (envcmd.EnvironCommand, []string) { return new(StatusCommand), nil },
90}91}
9192
92// TestEnvironmentInit tests that all commands which accept93// TestEnvironmentInit tests that all commands which accept
@@ -96,24 +97,24 @@
96 for i, cmdFunc := range EnvironmentInitTests {97 for i, cmdFunc := range EnvironmentInitTests {
97 c.Logf("test %d", i)98 c.Logf("test %d", i)
98 com, args := cmdFunc()99 com, args := cmdFunc()
99 testInit(c, com, args, "")100 testInit(c, envcmd.Wrap(com), args, "")
100 assertConnName(c, com, "peckham")101 assertEnvName(c, com, "peckham")
101102
102 com, args = cmdFunc()103 com, args = cmdFunc()
103 testInit(c, com, append(args, "-e", "walthamstow"), "")104 testInit(c, envcmd.Wrap(com), append(args, "-e", "walthamstow"), "")
104 assertConnName(c, com, "walthamstow")105 assertEnvName(c, com, "walthamstow")
105106
106 com, args = cmdFunc()107 com, args = cmdFunc()
107 testInit(c, com, append(args, "--environment", "walthamstow"), "")108 testInit(c, envcmd.Wrap(com), append(args, "--environment", "walthamstow"), "")
108 assertConnName(c, com, "walthamstow")109 assertEnvName(c, com, "walthamstow")
109110
110 // JUJU_ENV is the final place the environment can be overriden111 // JUJU_ENV is the final place the environment can be overriden
111 com, args = cmdFunc()112 com, args = cmdFunc()
112 oldenv := os.Getenv(osenv.JujuEnvEnvKey)113 oldenv := os.Getenv(osenv.JujuEnvEnvKey)
113 os.Setenv(osenv.JujuEnvEnvKey, "walthamstow")114 os.Setenv(osenv.JujuEnvEnvKey, "walthamstow")
114 testInit(c, com, args, "")115 testInit(c, envcmd.Wrap(com), args, "")
115 os.Setenv(osenv.JujuEnvEnvKey, oldenv)116 os.Setenv(osenv.JujuEnvEnvKey, oldenv)
116 assertConnName(c, com, "walthamstow")117 assertEnvName(c, com, "walthamstow")
117 }118 }
118}119}
119120
@@ -192,7 +193,7 @@
192193
193func initDeployCommand(args ...string) (*DeployCommand, error) {194func initDeployCommand(args ...string) (*DeployCommand, error) {
194 com := &DeployCommand{}195 com := &DeployCommand{}
195 return com, coretesting.InitCommand(com, args)196 return com, coretesting.InitCommand(envcmd.Wrap(com), args)
196}197}
197198
198func (*CmdSuite) TestDeployCommandInit(c *gc.C) {199func (*CmdSuite) TestDeployCommandInit(c *gc.C) {
199200
=== modified file 'cmd/juju/constraints.go'
--- cmd/juju/constraints.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/constraints.go 2014-05-12 11:08:32 +0000
@@ -70,7 +70,6 @@
70}70}
7171
72func (c *GetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {72func (c *GetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {
73 c.EnvCommandBase.SetFlags(f)
74 c.out.AddFlags(f, "constraints", map[string]cmd.Formatter{73 c.out.AddFlags(f, "constraints", map[string]cmd.Formatter{
75 "constraints": formatConstraints,74 "constraints": formatConstraints,
76 "yaml": cmd.FormatYaml,75 "yaml": cmd.FormatYaml,
@@ -79,9 +78,6 @@
79}78}
8079
81func (c *GetConstraintsCommand) Init(args []string) error {80func (c *GetConstraintsCommand) Init(args []string) error {
82 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
83 return err
84 }
85 if len(args) > 0 {81 if len(args) > 0 {
86 if !names.IsService(args[0]) {82 if !names.IsService(args[0]) {
87 return fmt.Errorf("invalid service name %q", args[0])83 return fmt.Errorf("invalid service name %q", args[0])
@@ -127,15 +123,11 @@
127}123}
128124
129func (c *SetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {125func (c *SetConstraintsCommand) SetFlags(f *gnuflag.FlagSet) {
130 c.EnvCommandBase.SetFlags(f)
131 f.StringVar(&c.ServiceName, "s", "", "set service constraints")126 f.StringVar(&c.ServiceName, "s", "", "set service constraints")
132 f.StringVar(&c.ServiceName, "service", "", "")127 f.StringVar(&c.ServiceName, "service", "", "")
133}128}
134129
135func (c *SetConstraintsCommand) Init(args []string) (err error) {130func (c *SetConstraintsCommand) Init(args []string) (err error) {
136 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
137 return err
138 }
139 if c.ServiceName != "" && !names.IsService(c.ServiceName) {131 if c.ServiceName != "" && !names.IsService(c.ServiceName) {
140 return fmt.Errorf("invalid service name %q", c.ServiceName)132 return fmt.Errorf("invalid service name %q", c.ServiceName)
141 }133 }
142134
=== modified file 'cmd/juju/constraints_test.go'
--- cmd/juju/constraints_test.go 2014-03-13 07:54:56 +0000
+++ cmd/juju/constraints_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/constraints"14 "launchpad.net/juju-core/constraints"
14 "launchpad.net/juju-core/juju/testing"15 "launchpad.net/juju-core/juju/testing"
15 coretesting "launchpad.net/juju-core/testing"16 coretesting "launchpad.net/juju-core/testing"
@@ -35,7 +36,7 @@
35}36}
3637
37func assertSet(c *gc.C, args ...string) {38func assertSet(c *gc.C, args ...string) {
38 rcode, rstdout, rstderr := runCmdLine(c, &SetConstraintsCommand{}, args...)39 rcode, rstdout, rstderr := runCmdLine(c, envcmd.Wrap(&SetConstraintsCommand{}), args...)
39 c.Assert(rcode, gc.Equals, 0)40 c.Assert(rcode, gc.Equals, 0)
40 c.Assert(rstdout, gc.Equals, "")41 c.Assert(rstdout, gc.Equals, "")
41 c.Assert(rstderr, gc.Equals, "")42 c.Assert(rstderr, gc.Equals, "")
@@ -78,7 +79,7 @@
78}79}
7980
80func assertSetError(c *gc.C, code int, stderr string, args ...string) {81func assertSetError(c *gc.C, code int, stderr string, args ...string) {
81 rcode, rstdout, rstderr := runCmdLine(c, &SetConstraintsCommand{}, args...)82 rcode, rstdout, rstderr := runCmdLine(c, envcmd.Wrap(&SetConstraintsCommand{}), args...)
82 c.Assert(rcode, gc.Equals, code)83 c.Assert(rcode, gc.Equals, code)
83 c.Assert(rstdout, gc.Equals, "")84 c.Assert(rstdout, gc.Equals, "")
84 c.Assert(rstderr, gc.Matches, "error: "+stderr+"\n")85 c.Assert(rstderr, gc.Matches, "error: "+stderr+"\n")
8586
=== modified file 'cmd/juju/debuglog.go'
--- cmd/juju/debuglog.go 2014-05-11 22:36:42 +0000
+++ cmd/juju/debuglog.go 2014-05-12 11:08:32 +0000
@@ -44,8 +44,6 @@
44}44}
4545
46func (c *DebugLogCommand) SetFlags(f *gnuflag.FlagSet) {46func (c *DebugLogCommand) SetFlags(f *gnuflag.FlagSet) {
47 c.EnvCommandBase.SetFlags(f)
48
49 f.Var(cmd.NewAppendStringsValue(&c.params.IncludeEntity), "i", "only show log messages for these entities")47 f.Var(cmd.NewAppendStringsValue(&c.params.IncludeEntity), "i", "only show log messages for these entities")
50 f.Var(cmd.NewAppendStringsValue(&c.params.IncludeEntity), "include", "only show log messages for these entities")48 f.Var(cmd.NewAppendStringsValue(&c.params.IncludeEntity), "include", "only show log messages for these entities")
51 f.Var(cmd.NewAppendStringsValue(&c.params.ExcludeEntity), "x", "do not show log messages for these entities")49 f.Var(cmd.NewAppendStringsValue(&c.params.ExcludeEntity), "x", "do not show log messages for these entities")
@@ -63,9 +61,6 @@
63}61}
6462
65func (c *DebugLogCommand) Init(args []string) error {63func (c *DebugLogCommand) Init(args []string) error {
66 if err := c.EnsureEnvName(); err != nil {
67 return err
68 }
69 if c.level != "" {64 if c.level != "" {
70 level, ok := loggo.ParseLevel(c.level)65 level, ok := loggo.ParseLevel(c.level)
71 if !ok || level < loggo.TRACE || level > loggo.ERROR {66 if !ok || level < loggo.TRACE || level > loggo.ERROR {
7267
=== modified file 'cmd/juju/debuglog_test.go'
--- cmd/juju/debuglog_test.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/debuglog_test.go 2014-05-12 11:08:32 +0000
@@ -14,6 +14,7 @@
14 gc "launchpad.net/gocheck"14 gc "launchpad.net/gocheck"
1515
16 "launchpad.net/juju-core/cmd"16 "launchpad.net/juju-core/cmd"
17 "launchpad.net/juju-core/cmd/envcmd"
17 "launchpad.net/juju-core/errors"18 "launchpad.net/juju-core/errors"
18 "launchpad.net/juju-core/state/api"19 "launchpad.net/juju-core/state/api"
19 "launchpad.net/juju-core/testing"20 "launchpad.net/juju-core/testing"
@@ -91,7 +92,7 @@
91 } {92 } {
92 c.Logf("test %v", i)93 c.Logf("test %v", i)
93 command := &DebugLogCommand{}94 command := &DebugLogCommand{}
94 err := testing.InitCommand(command, test.args)95 err := testing.InitCommand(envcmd.Wrap(command), test.args)
95 if test.errMatch == "" {96 if test.errMatch == "" {
96 c.Check(err, gc.IsNil)97 c.Check(err, gc.IsNil)
97 c.Check(command.params, jc.DeepEquals, test.expected)98 c.Check(command.params, jc.DeepEquals, test.expected)
@@ -106,7 +107,7 @@
106 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {107 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {
107 return fake, nil108 return fake, nil
108 })109 })
109 _, err := testing.RunCommand(c, &DebugLogCommand{}, []string{110 _, err := testing.RunCommand(c, envcmd.Wrap(&DebugLogCommand{}), []string{
110 "-i", "machine-1*", "-x", "machine-1-lxc-1",111 "-i", "machine-1*", "-x", "machine-1-lxc-1",
111 "--include-module=juju.provisioner",112 "--include-module=juju.provisioner",
112 "--lines=500",113 "--lines=500",
@@ -126,7 +127,7 @@
126 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {127 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {
127 return &fakeDebugLogAPI{log: "this is the log output"}, nil128 return &fakeDebugLogAPI{log: "this is the log output"}, nil
128 })129 })
129 ctx, err := testing.RunCommand(c, &DebugLogCommand{}, nil)130 ctx, err := testing.RunCommand(c, envcmd.Wrap(&DebugLogCommand{}), nil)
130 c.Assert(err, gc.IsNil)131 c.Assert(err, gc.IsNil)
131 c.Assert(testing.Stdout(ctx), gc.Equals, "this is the log output")132 c.Assert(testing.Stdout(ctx), gc.Equals, "this is the log output")
132}133}
@@ -139,7 +140,7 @@
139 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {140 s.PatchValue(&getDebugLogAPI, func(envName string) (DebugLogAPI, error) {
140 return &fakeDebugLogAPI{err: errors.NotSupportedf("testing")}, nil141 return &fakeDebugLogAPI{err: errors.NotSupportedf("testing")}, nil
141 })142 })
142 ctx, err := testing.RunCommand(c, &DebugLogCommand{}, []string{"-n", "100"})143 ctx, err := testing.RunCommand(c, envcmd.Wrap(&DebugLogCommand{}), []string{"-n", "100"})
143 c.Assert(err, gc.IsNil)144 c.Assert(err, gc.IsNil)
144 c.Check(testing.Stderr(ctx), gc.Equals, "Server does not support new stream log, falling back to tail\n")145 c.Check(testing.Stderr(ctx), gc.Equals, "Server does not support new stream log, falling back to tail\n")
145 c.Check(testing.Stdout(ctx), gc.Equals, "[tail -n -100 -f /var/log/juju/all-machines.log]")146 c.Check(testing.Stdout(ctx), gc.Equals, "[tail -n -100 -f /var/log/juju/all-machines.log]")
146147
=== modified file 'cmd/juju/deploy.go'
--- cmd/juju/deploy.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/deploy.go 2014-05-12 11:08:32 +0000
@@ -100,7 +100,6 @@
100}100}
101101
102func (c *DeployCommand) SetFlags(f *gnuflag.FlagSet) {102func (c *DeployCommand) SetFlags(f *gnuflag.FlagSet) {
103 c.EnvCommandBase.SetFlags(f)
104 c.UnitCommandBase.SetFlags(f)103 c.UnitCommandBase.SetFlags(f)
105 f.IntVar(&c.NumUnits, "n", 1, "number of service units to deploy for principal charms")104 f.IntVar(&c.NumUnits, "n", 1, "number of service units to deploy for principal charms")
106 f.BoolVar(&c.BumpRevision, "u", false, "increment local charm directory revision (DEPRECATED)")105 f.BoolVar(&c.BumpRevision, "u", false, "increment local charm directory revision (DEPRECATED)")
@@ -113,9 +112,6 @@
113}112}
114113
115func (c *DeployCommand) Init(args []string) error {114func (c *DeployCommand) Init(args []string) error {
116 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
117 return err
118 }
119 switch len(args) {115 switch len(args) {
120 case 2:116 case 2:
121 if !names.IsService(args[1]) {117 if !names.IsService(args[1]) {
122118
=== modified file 'cmd/juju/deploy_test.go'
--- cmd/juju/deploy_test.go 2014-05-02 22:26:15 +0000
+++ cmd/juju/deploy_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/charm"12 "launchpad.net/juju-core/charm"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/constraints"14 "launchpad.net/juju-core/constraints"
14 "launchpad.net/juju-core/errors"15 "launchpad.net/juju-core/errors"
15 "launchpad.net/juju-core/instance"16 "launchpad.net/juju-core/instance"
@@ -26,7 +27,7 @@
26var _ = gc.Suite(&DeploySuite{})27var _ = gc.Suite(&DeploySuite{})
2728
28func runDeploy(c *gc.C, args ...string) error {29func runDeploy(c *gc.C, args ...string) error {
29 _, err := coretesting.RunCommand(c, &DeployCommand{}, args)30 _, err := coretesting.RunCommand(c, envcmd.Wrap(&DeployCommand{}), args)
30 return err31 return err
31}32}
3233
@@ -64,7 +65,7 @@
64func (s *DeploySuite) TestInitErrors(c *gc.C) {65func (s *DeploySuite) TestInitErrors(c *gc.C) {
65 for i, t := range initErrorTests {66 for i, t := range initErrorTests {
66 c.Logf("test %d", i)67 c.Logf("test %d", i)
67 err := coretesting.InitCommand(&DeployCommand{}, t.args)68 err := coretesting.InitCommand(envcmd.Wrap(&DeployCommand{}), t.args)
68 c.Assert(err, gc.ErrorMatches, t.err)69 c.Assert(err, gc.ErrorMatches, t.err)
69 }70 }
70}71}
@@ -84,7 +85,7 @@
8485
85func (s *DeploySuite) TestUpgradeReportsDeprecated(c *gc.C) {86func (s *DeploySuite) TestUpgradeReportsDeprecated(c *gc.C) {
86 coretesting.Charms.ClonedDirPath(s.SeriesPath, "dummy")87 coretesting.Charms.ClonedDirPath(s.SeriesPath, "dummy")
87 ctx, err := coretesting.RunCommand(c, &DeployCommand{}, []string{"local:dummy", "-u"})88 ctx, err := coretesting.RunCommand(c, envcmd.Wrap(&DeployCommand{}), []string{"local:dummy", "-u"})
88 c.Assert(err, gc.IsNil)89 c.Assert(err, gc.IsNil)
8990
90 c.Assert(coretesting.Stdout(ctx), gc.Equals, "")91 c.Assert(coretesting.Stdout(ctx), gc.Equals, "")
9192
=== modified file 'cmd/juju/endpoint.go'
--- cmd/juju/endpoint.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/endpoint.go 2014-05-12 11:08:32 +0000
@@ -37,15 +37,7 @@
37 }37 }
38}38}
3939
40func (c *EndpointCommand) Init(args []string) error {
41 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
42 return err
43 }
44 return cmd.CheckEmpty(args)
45}
46
47func (c *EndpointCommand) SetFlags(f *gnuflag.FlagSet) {40func (c *EndpointCommand) SetFlags(f *gnuflag.FlagSet) {
48 c.EnvCommandBase.SetFlags(f)
49 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)41 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)
50 f.BoolVar(&c.refresh, "refresh", false, "connect to the API to ensure up-to-date endpoint locations")42 f.BoolVar(&c.refresh, "refresh", false, "connect to the API to ensure up-to-date endpoint locations")
51}43}
5244
=== modified file 'cmd/juju/endpoint_test.go'
--- cmd/juju/endpoint_test.go 2013-08-15 15:00:54 +0000
+++ cmd/juju/endpoint_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/juju/testing"14 "launchpad.net/juju-core/juju/testing"
14 coretesting "launchpad.net/juju-core/testing"15 coretesting "launchpad.net/juju-core/testing"
15)16)
@@ -22,7 +23,7 @@
2223
23func (s *EndpointSuite) TestEndpoint(c *gc.C) {24func (s *EndpointSuite) TestEndpoint(c *gc.C) {
24 ctx := coretesting.Context(c)25 ctx := coretesting.Context(c)
25 code := cmd.Main(&EndpointCommand{}, ctx, []string{})26 code := cmd.Main(envcmd.Wrap(&EndpointCommand{}), ctx, []string{})
26 c.Check(code, gc.Equals, 0)27 c.Check(code, gc.Equals, 0)
27 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")28 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")
28 output := string(ctx.Stdout.(*bytes.Buffer).Bytes())29 output := string(ctx.Stdout.(*bytes.Buffer).Bytes())
2930
=== modified file 'cmd/juju/ensureavailability.go'
--- cmd/juju/ensureavailability.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/ensureavailability.go 2014-05-12 11:08:32 +0000
@@ -56,16 +56,12 @@
56}56}
5757
58func (c *EnsureAvailabilityCommand) SetFlags(f *gnuflag.FlagSet) {58func (c *EnsureAvailabilityCommand) SetFlags(f *gnuflag.FlagSet) {
59 c.EnvCommandBase.SetFlags(f)
60 f.IntVar(&c.NumStateServers, "n", 0, "number of state servers to make available")59 f.IntVar(&c.NumStateServers, "n", 0, "number of state servers to make available")
61 f.StringVar(&c.Series, "series", "", "the charm series")60 f.StringVar(&c.Series, "series", "", "the charm series")
62 f.Var(constraints.ConstraintsValue{&c.Constraints}, "constraints", "additional machine constraints")61 f.Var(constraints.ConstraintsValue{&c.Constraints}, "constraints", "additional machine constraints")
63}62}
6463
65func (c *EnsureAvailabilityCommand) Init(args []string) error {64func (c *EnsureAvailabilityCommand) Init(args []string) error {
66 if err := c.EnsureEnvName(); err != nil {
67 return err
68 }
69 if c.NumStateServers < 0 || (c.NumStateServers%2 != 1 && c.NumStateServers != 0) {65 if c.NumStateServers < 0 || (c.NumStateServers%2 != 1 && c.NumStateServers != 0) {
70 return fmt.Errorf("must specify a number of state servers odd and non-negative")66 return fmt.Errorf("must specify a number of state servers odd and non-negative")
71 }67 }
7268
=== modified file 'cmd/juju/ensureavailability_test.go'
--- cmd/juju/ensureavailability_test.go 2014-04-23 11:57:06 +0000
+++ cmd/juju/ensureavailability_test.go 2014-05-12 11:08:32 +0000
@@ -9,6 +9,7 @@
9 jc "github.com/juju/testing/checkers"9 jc "github.com/juju/testing/checkers"
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/cmd/envcmd"
12 "launchpad.net/juju-core/constraints"13 "launchpad.net/juju-core/constraints"
13 jujutesting "launchpad.net/juju-core/juju/testing"14 jujutesting "launchpad.net/juju-core/juju/testing"
14 "launchpad.net/juju-core/state"15 "launchpad.net/juju-core/state"
@@ -49,7 +50,7 @@
49}50}
5051
51func runEnsureAvailability(c *gc.C, args ...string) error {52func runEnsureAvailability(c *gc.C, args ...string) error {
52 _, err := coretesting.RunCommand(c, &EnsureAvailabilityCommand{}, args)53 _, err := coretesting.RunCommand(c, envcmd.Wrap(&EnsureAvailabilityCommand{}), args)
53 return err54 return err
54}55}
5556
5657
=== modified file 'cmd/juju/environment.go'
--- cmd/juju/environment.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/environment.go 2014-05-12 11:08:32 +0000
@@ -45,14 +45,10 @@
45}45}
4646
47func (c *GetEnvironmentCommand) SetFlags(f *gnuflag.FlagSet) {47func (c *GetEnvironmentCommand) SetFlags(f *gnuflag.FlagSet) {
48 c.EnvCommandBase.SetFlags(f)
49 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)48 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)
50}49}
5150
52func (c *GetEnvironmentCommand) Init(args []string) (err error) {51func (c *GetEnvironmentCommand) Init(args []string) (err error) {
53 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
54 return err
55 }
56 c.key, err = cmd.ZeroOrOneArgs(args)52 c.key, err = cmd.ZeroOrOneArgs(args)
57 return53 return
58}54}
@@ -102,12 +98,7 @@
102 }98 }
103}99}
104100
105// SetFlags handled entirely by envcmd.EnvCommandBase
106
107func (c *SetEnvironmentCommand) Init(args []string) (err error) {101func (c *SetEnvironmentCommand) Init(args []string) (err error) {
108 if err := c.EnsureEnvName(); err != nil {
109 return err
110 }
111 if len(args) == 0 {102 if len(args) == 0 {
112 return fmt.Errorf("No key, value pairs specified")103 return fmt.Errorf("No key, value pairs specified")
113 }104 }
@@ -166,9 +157,6 @@
166}157}
167158
168func (c *UnsetEnvironmentCommand) Init(args []string) (err error) {159func (c *UnsetEnvironmentCommand) Init(args []string) (err error) {
169 if err := c.EnsureEnvName(); err != nil {
170 return err
171 }
172 if len(args) == 0 {160 if len(args) == 0 {
173 return fmt.Errorf("No keys specified")161 return fmt.Errorf("No keys specified")
174 }162 }
175163
=== modified file 'cmd/juju/environment_test.go'
--- cmd/juju/environment_test.go 2014-04-09 16:36:12 +0000
+++ cmd/juju/environment_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 jc "github.com/juju/testing/checkers"10 jc "github.com/juju/testing/checkers"
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/environs/config"14 "launchpad.net/juju-core/environs/config"
14 jujutesting "launchpad.net/juju-core/juju/testing"15 jujutesting "launchpad.net/juju-core/juju/testing"
15 "launchpad.net/juju-core/provider/dummy"16 "launchpad.net/juju-core/provider/dummy"
@@ -45,7 +46,7 @@
4546
46func (s *GetEnvironmentSuite) TestSingleValue(c *gc.C) {47func (s *GetEnvironmentSuite) TestSingleValue(c *gc.C) {
47 for _, t := range singleValueTests {48 for _, t := range singleValueTests {
48 context, err := testing.RunCommand(c, &GetEnvironmentCommand{}, []string{t.key})49 context, err := testing.RunCommand(c, envcmd.Wrap(&GetEnvironmentCommand{}), []string{t.key})
49 if t.err != "" {50 if t.err != "" {
50 c.Assert(err, gc.ErrorMatches, t.err)51 c.Assert(err, gc.ErrorMatches, t.err)
51 } else {52 } else {
@@ -57,12 +58,12 @@
57}58}
5859
59func (s *GetEnvironmentSuite) TestTooManyArgs(c *gc.C) {60func (s *GetEnvironmentSuite) TestTooManyArgs(c *gc.C) {
60 _, err := testing.RunCommand(c, &GetEnvironmentCommand{}, []string{"name", "type"})61 _, err := testing.RunCommand(c, envcmd.Wrap(&GetEnvironmentCommand{}), []string{"name", "type"})
61 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["type"\]`)62 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["type"\]`)
62}63}
6364
64func (s *GetEnvironmentSuite) TestAllValues(c *gc.C) {65func (s *GetEnvironmentSuite) TestAllValues(c *gc.C) {
65 context, _ := testing.RunCommand(c, &GetEnvironmentCommand{}, []string{})66 context, _ := testing.RunCommand(c, envcmd.Wrap(&GetEnvironmentCommand{}), []string{})
66 output := strings.TrimSpace(testing.Stdout(context))67 output := strings.TrimSpace(testing.Stdout(context))
6768
68 // Make sure that all the environment keys are there. The admin69 // Make sure that all the environment keys are there. The admin
@@ -116,7 +117,7 @@
116func (s *SetEnvironmentSuite) TestInit(c *gc.C) {117func (s *SetEnvironmentSuite) TestInit(c *gc.C) {
117 for _, t := range setEnvInitTests {118 for _, t := range setEnvInitTests {
118 command := &SetEnvironmentCommand{}119 command := &SetEnvironmentCommand{}
119 testing.TestInit(c, command, t.args, t.err)120 testing.TestInit(c, envcmd.Wrap(command), t.args, t.err)
120 if t.expected != nil {121 if t.expected != nil {
121 c.Assert(command.values, gc.DeepEquals, t.expected)122 c.Assert(command.values, gc.DeepEquals, t.expected)
122 }123 }
@@ -131,7 +132,7 @@
131 c.Assert(ok, gc.Equals, true)132 c.Assert(ok, gc.Equals, true)
132 c.Assert(series, gc.Equals, "precise") // default-series set in RepoSuite.SetUpTest133 c.Assert(series, gc.Equals, "precise") // default-series set in RepoSuite.SetUpTest
133134
134 _, err = testing.RunCommand(c, &SetEnvironmentCommand{}, []string{"default-series=raring"})135 _, err = testing.RunCommand(c, envcmd.Wrap(&SetEnvironmentCommand{}), []string{"default-series=raring"})
135 c.Assert(err, gc.IsNil)136 c.Assert(err, gc.IsNil)
136137
137 stateConfig, err = s.State.EnvironConfig()138 stateConfig, err = s.State.EnvironConfig()
@@ -143,7 +144,7 @@
143}144}
144145
145func (s *SetEnvironmentSuite) TestChangeBooleanAttribute(c *gc.C) {146func (s *SetEnvironmentSuite) TestChangeBooleanAttribute(c *gc.C) {
146 _, err := testing.RunCommand(c, &SetEnvironmentCommand{}, []string{"ssl-hostname-verification=false"})147 _, err := testing.RunCommand(c, envcmd.Wrap(&SetEnvironmentCommand{}), []string{"ssl-hostname-verification=false"})
147 c.Assert(err, gc.IsNil)148 c.Assert(err, gc.IsNil)
148149
149 stateConfig, err := s.State.EnvironConfig()150 stateConfig, err := s.State.EnvironConfig()
@@ -152,7 +153,7 @@
152}153}
153154
154func (s *SetEnvironmentSuite) TestChangeMultipleValues(c *gc.C) {155func (s *SetEnvironmentSuite) TestChangeMultipleValues(c *gc.C) {
155 _, err := testing.RunCommand(c, &SetEnvironmentCommand{}, []string{"default-series=spartan", "broken=nope", "secret=sekrit"})156 _, err := testing.RunCommand(c, envcmd.Wrap(&SetEnvironmentCommand{}), []string{"default-series=spartan", "broken=nope", "secret=sekrit"})
156 c.Assert(err, gc.IsNil)157 c.Assert(err, gc.IsNil)
157158
158 stateConfig, err := s.State.EnvironConfig()159 stateConfig, err := s.State.EnvironConfig()
@@ -164,10 +165,10 @@
164}165}
165166
166func (s *SetEnvironmentSuite) TestChangeAsCommandPair(c *gc.C) {167func (s *SetEnvironmentSuite) TestChangeAsCommandPair(c *gc.C) {
167 _, err := testing.RunCommand(c, &SetEnvironmentCommand{}, []string{"default-series=raring"})168 _, err := testing.RunCommand(c, envcmd.Wrap(&SetEnvironmentCommand{}), []string{"default-series=raring"})
168 c.Assert(err, gc.IsNil)169 c.Assert(err, gc.IsNil)
169170
170 context, err := testing.RunCommand(c, &GetEnvironmentCommand{}, []string{"default-series"})171 context, err := testing.RunCommand(c, envcmd.Wrap(&GetEnvironmentCommand{}), []string{"default-series"})
171 c.Assert(err, gc.IsNil)172 c.Assert(err, gc.IsNil)
172 output := strings.TrimSpace(testing.Stdout(context))173 output := strings.TrimSpace(testing.Stdout(context))
173174
@@ -185,7 +186,7 @@
185func (s *SetEnvironmentSuite) TestImmutableConfigValues(c *gc.C) {186func (s *SetEnvironmentSuite) TestImmutableConfigValues(c *gc.C) {
186 for name, value := range immutableConfigTests {187 for name, value := range immutableConfigTests {
187 param := fmt.Sprintf("%s=%s", name, value)188 param := fmt.Sprintf("%s=%s", name, value)
188 _, err := testing.RunCommand(c, &SetEnvironmentCommand{}, []string{param})189 _, err := testing.RunCommand(c, envcmd.Wrap(&SetEnvironmentCommand{}), []string{param})
189 errorPattern := fmt.Sprintf("cannot change %s from .* to [\"]?%v[\"]?", name, value)190 errorPattern := fmt.Sprintf("cannot change %s from .* to [\"]?%v[\"]?", name, value)
190 c.Assert(err, gc.ErrorMatches, errorPattern)191 c.Assert(err, gc.ErrorMatches, errorPattern)
191 }192 }
@@ -239,7 +240,7 @@
239 for _, t := range unsetEnvTests {240 for _, t := range unsetEnvTests {
240 c.Logf("testing unset-env %v", t.args)241 c.Logf("testing unset-env %v", t.args)
241 s.initConfig(c)242 s.initConfig(c)
242 _, err := testing.RunCommand(c, &UnsetEnvironmentCommand{}, t.args)243 _, err := testing.RunCommand(c, envcmd.Wrap(&UnsetEnvironmentCommand{}), t.args)
243 if t.err != "" {244 if t.err != "" {
244 c.Assert(err, gc.ErrorMatches, t.err)245 c.Assert(err, gc.ErrorMatches, t.err)
245 } else {246 } else {
246247
=== modified file 'cmd/juju/expose.go'
--- cmd/juju/expose.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/expose.go 2014-05-12 11:08:32 +0000
@@ -33,9 +33,6 @@
33}33}
3434
35func (c *ExposeCommand) Init(args []string) error {35func (c *ExposeCommand) Init(args []string) error {
36 if err := c.EnsureEnvName(); err != nil {
37 return err
38 }
39 if len(args) == 0 {36 if len(args) == 0 {
40 return errors.New("no service name specified")37 return errors.New("no service name specified")
41 }38 }
4239
=== modified file 'cmd/juju/expose_test.go'
--- cmd/juju/expose_test.go 2013-09-13 14:48:13 +0000
+++ cmd/juju/expose_test.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/charm"9 "launchpad.net/juju-core/charm"
10 "launchpad.net/juju-core/cmd/envcmd"
10 jujutesting "launchpad.net/juju-core/juju/testing"11 jujutesting "launchpad.net/juju-core/juju/testing"
11 "launchpad.net/juju-core/testing"12 "launchpad.net/juju-core/testing"
12)13)
@@ -18,7 +19,7 @@
18var _ = gc.Suite(&ExposeSuite{})19var _ = gc.Suite(&ExposeSuite{})
1920
20func runExpose(c *gc.C, args ...string) error {21func runExpose(c *gc.C, args ...string) error {
21 _, err := testing.RunCommand(c, &ExposeCommand{}, args)22 _, err := testing.RunCommand(c, envcmd.Wrap(&ExposeCommand{}), args)
22 return err23 return err
23}24}
2425
2526
=== modified file 'cmd/juju/get.go'
--- cmd/juju/get.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/get.go 2014-05-12 11:08:32 +0000
@@ -29,7 +29,6 @@
29}29}
3030
31func (c *GetCommand) SetFlags(f *gnuflag.FlagSet) {31func (c *GetCommand) SetFlags(f *gnuflag.FlagSet) {
32 c.EnvCommandBase.SetFlags(f)
33 // TODO(dfc) add json formatting ?32 // TODO(dfc) add json formatting ?
34 c.out.AddFlags(f, "yaml", map[string]cmd.Formatter{33 c.out.AddFlags(f, "yaml", map[string]cmd.Formatter{
35 "yaml": cmd.FormatYaml,34 "yaml": cmd.FormatYaml,
@@ -37,9 +36,6 @@
37}36}
3837
39func (c *GetCommand) Init(args []string) error {38func (c *GetCommand) Init(args []string) error {
40 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
41 return err
42 }
43 // TODO(dfc) add --schema-only39 // TODO(dfc) add --schema-only
44 if len(args) == 0 {40 if len(args) == 0 {
45 return errors.New("no service name specified")41 return errors.New("no service name specified")
4642
=== modified file 'cmd/juju/get_test.go'
--- cmd/juju/get_test.go 2013-10-09 13:55:14 +0000
+++ cmd/juju/get_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,7 @@
1111
12 "launchpad.net/juju-core/charm"12 "launchpad.net/juju-core/charm"
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/juju/testing"15 "launchpad.net/juju-core/juju/testing"
15 coretesting "launchpad.net/juju-core/testing"16 coretesting "launchpad.net/juju-core/testing"
16)17)
@@ -67,7 +68,7 @@
67 c.Assert(err, gc.IsNil)68 c.Assert(err, gc.IsNil)
68 for _, t := range getTests {69 for _, t := range getTests {
69 ctx := coretesting.Context(c)70 ctx := coretesting.Context(c)
70 code := cmd.Main(&GetCommand{}, ctx, []string{t.service})71 code := cmd.Main(envcmd.Wrap(&GetCommand{}), ctx, []string{t.service})
71 c.Check(code, gc.Equals, 0)72 c.Check(code, gc.Equals, 0)
72 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")73 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Equals, "")
73 // round trip via goyaml to avoid being sucked into a quagmire of74 // round trip via goyaml to avoid being sucked into a quagmire of
7475
=== modified file 'cmd/juju/main.go'
--- cmd/juju/main.go 2014-05-09 22:56:29 +0000
+++ cmd/juju/main.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 "github.com/juju/loggo"10 "github.com/juju/loggo"
1111
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/environs"14 "launchpad.net/juju-core/environs"
14 "launchpad.net/juju-core/juju"15 "launchpad.net/juju-core/juju"
1516
@@ -72,104 +73,99 @@
7273
73 jujucmd.AddHelpTopicCallback("plugins", "Show Juju plugins", PluginHelpTopic)74 jujucmd.AddHelpTopicCallback("plugins", "Show Juju plugins", PluginHelpTopic)
7475
76 registerCommands(jujucmd, ctx)
77 os.Exit(cmd.Main(jujucmd, ctx, args[1:]))
78}
79
80type commandRegistry interface {
81 Register(cmd.Command)
82}
83
84// registerCommands registers commands in the specified registry.
85// EnvironCommands must be wrapped with an envCmdWrapper.
86func registerCommands(r commandRegistry, ctx *cmd.Context) {
87 wrapEnvCommand := func(c envcmd.EnvironCommand) cmd.Command {
88 return envCmdWrapper{envcmd.Wrap(c), ctx}
89 }
90
75 // Creation commands.91 // Creation commands.
76 jujucmd.Register(wrap(&BootstrapCommand{}))92 r.Register(wrapEnvCommand(&BootstrapCommand{}))
77 jujucmd.Register(wrap(&AddMachineCommand{}))93 r.Register(wrapEnvCommand(&AddMachineCommand{}))
78 jujucmd.Register(wrap(&DeployCommand{}))94 r.Register(wrapEnvCommand(&DeployCommand{}))
79 jujucmd.Register(wrap(&AddRelationCommand{}))95 r.Register(wrapEnvCommand(&AddRelationCommand{}))
80 jujucmd.Register(wrap(&AddUnitCommand{}))96 r.Register(wrapEnvCommand(&AddUnitCommand{}))
8197
82 // Destruction commands.98 // Destruction commands.
83 jujucmd.Register(wrap(&RemoveMachineCommand{}))99 r.Register(wrapEnvCommand(&RemoveMachineCommand{}))
84 jujucmd.Register(wrap(&RemoveRelationCommand{}))100 r.Register(wrapEnvCommand(&RemoveRelationCommand{}))
85 jujucmd.Register(wrap(&RemoveServiceCommand{}))101 r.Register(wrapEnvCommand(&RemoveServiceCommand{}))
86 jujucmd.Register(wrap(&RemoveUnitCommand{}))102 r.Register(wrapEnvCommand(&RemoveUnitCommand{}))
87 jujucmd.Register(wrap(&DestroyEnvironmentCommand{}))103 r.Register(&DestroyEnvironmentCommand{})
88104
89 // Reporting commands.105 // Reporting commands.
90 jujucmd.Register(wrap(&StatusCommand{}))106 r.Register(wrapEnvCommand(&StatusCommand{}))
91 jujucmd.Register(wrap(&SwitchCommand{}))107 r.Register(&SwitchCommand{})
92 jujucmd.Register(wrap(&EndpointCommand{}))108 r.Register(wrapEnvCommand(&EndpointCommand{}))
93109
94 // Error resolution and debugging commands.110 // Error resolution and debugging commands.
95 jujucmd.Register(wrap(&RunCommand{}))111 r.Register(wrapEnvCommand(&RunCommand{}))
96 jujucmd.Register(wrap(&SCPCommand{}))112 r.Register(wrapEnvCommand(&SCPCommand{}))
97 jujucmd.Register(wrap(&SSHCommand{}))113 r.Register(wrapEnvCommand(&SSHCommand{}))
98 jujucmd.Register(wrap(&ResolvedCommand{}))114 r.Register(wrapEnvCommand(&ResolvedCommand{}))
99 jujucmd.Register(wrap(&DebugLogCommand{}))115 r.Register(wrapEnvCommand(&DebugLogCommand{}))
100 jujucmd.Register(wrap(&DebugHooksCommand{}))116 r.Register(wrapEnvCommand(&DebugHooksCommand{}))
101 jujucmd.Register(wrap(&RetryProvisioningCommand{}))117 r.Register(wrapEnvCommand(&RetryProvisioningCommand{}))
102118
103 // Configuration commands.119 // Configuration commands.
104 jujucmd.Register(wrap(&InitCommand{}))120 r.Register(&InitCommand{})
105 jujucmd.Register(wrap(&GetCommand{}))121 r.Register(wrapEnvCommand(&GetCommand{}))
106 jujucmd.Register(wrap(&SetCommand{}))122 r.Register(wrapEnvCommand(&SetCommand{}))
107 jujucmd.Register(wrap(&UnsetCommand{}))123 r.Register(wrapEnvCommand(&UnsetCommand{}))
108 jujucmd.Register(wrap(&GetConstraintsCommand{}))124 r.Register(wrapEnvCommand(&GetConstraintsCommand{}))
109 jujucmd.Register(wrap(&SetConstraintsCommand{}))125 r.Register(wrapEnvCommand(&SetConstraintsCommand{}))
110 jujucmd.Register(wrap(&GetEnvironmentCommand{}))126 r.Register(wrapEnvCommand(&GetEnvironmentCommand{}))
111 jujucmd.Register(wrap(&SetEnvironmentCommand{}))127 r.Register(wrapEnvCommand(&SetEnvironmentCommand{}))
112 jujucmd.Register(wrap(&UnsetEnvironmentCommand{}))128 r.Register(wrapEnvCommand(&UnsetEnvironmentCommand{}))
113 jujucmd.Register(wrap(&ExposeCommand{}))129 r.Register(wrapEnvCommand(&ExposeCommand{}))
114 jujucmd.Register(wrap(&SyncToolsCommand{}))130 r.Register(wrapEnvCommand(&SyncToolsCommand{}))
115 jujucmd.Register(wrap(&UnexposeCommand{}))131 r.Register(wrapEnvCommand(&UnexposeCommand{}))
116 jujucmd.Register(wrap(&UpgradeJujuCommand{}))132 r.Register(wrapEnvCommand(&UpgradeJujuCommand{}))
117 jujucmd.Register(wrap(&UpgradeCharmCommand{}))133 r.Register(wrapEnvCommand(&UpgradeCharmCommand{}))
118134
119 // Charm publishing commands.135 // Charm publishing commands.
120 jujucmd.Register(wrap(&PublishCommand{}))136 r.Register(wrapEnvCommand(&PublishCommand{}))
121137
122 // Charm tool commands.138 // Charm tool commands.
123 jujucmd.Register(wrap(&HelpToolCommand{}))139 r.Register(&HelpToolCommand{})
124140
125 // Manage authorized ssh keys.141 // Manage authorized ssh keys.
126 jujucmd.Register(wrap(NewAuthorizedKeysCommand()))142 r.Register(NewAuthorizedKeysCommand())
127143
128 // Manage state server availability.144 // Manage state server availability.
129 // TODO: enable once the backend is ready for it.145 r.Register(wrapEnvCommand(&EnsureAvailabilityCommand{}))
130 jujucmd.Register(wrap(&EnsureAvailabilityCommand{}))
131146
132 // Common commands.147 // Common commands.
133 jujucmd.Register(wrap(&cmd.VersionCommand{}))148 r.Register(&cmd.VersionCommand{})
134
135 os.Exit(cmd.Main(jujucmd, ctx, args[1:]))
136}
137
138// wrap encapsulates code that wraps some of the commands in a helper class
139// that handles some common errors
140func wrap(c cmd.Command) cmd.Command {
141 if ec, ok := c.(envCmd); ok {
142 return envCmdWrapper{ec}
143 }
144 return c
145}
146
147// envCmd is a Command that interacts with the juju client environment
148type envCmd interface {
149 cmd.Command
150 EnvironName() string
151}149}
152150
153// envCmdWrapper is a struct that wraps an environment command and lets us handle151// envCmdWrapper is a struct that wraps an environment command and lets us handle
154// errors returned from Run before they're returned to the main function152// errors returned from Init before they're returned to the main function.
155type envCmdWrapper struct {153type envCmdWrapper struct {
156 envCmd154 cmd.Command
155 ctx *cmd.Context
157}156}
158157
159// Run in envCmdWrapper gives us an opportunity to handle errors after the command is158func (w envCmdWrapper) Init(args []string) error {
160// run. This is used to give informative messages to the user.159 err := w.Command.Init(args)
161func (c envCmdWrapper) Run(ctx *cmd.Context) error {160 if environs.IsNoEnv(err) {
162 err := c.envCmd.Run(ctx)161 fmt.Fprintln(w.ctx.Stderr, "No juju environment configuration file exists.")
163 if environs.IsNoEnv(err) && c.EnvironName() == "" {162 fmt.Fprintln(w.ctx.Stderr, err)
164 fmt.Fprintln(ctx.Stderr, "No juju environment configuration file exists.")163 fmt.Fprintln(w.ctx.Stderr, "Please create a configuration by running:")
165 fmt.Fprintln(ctx.Stderr, err)164 fmt.Fprintln(w.ctx.Stderr, " juju init")
166 fmt.Fprintln(ctx.Stderr, "Please create a configuration by running:")165 fmt.Fprintln(w.ctx.Stderr, "then edit the file to configure your juju environment.")
167 fmt.Fprintln(ctx.Stderr, " juju init")166 fmt.Fprintln(w.ctx.Stderr, "You can then re-run the command.")
168 fmt.Fprintln(ctx.Stderr, "then edit the file to configure your juju environment.")
169 fmt.Fprintln(ctx.Stderr, "You can then re-run the command.")
170 return cmd.ErrSilent167 return cmd.ErrSilent
171 }168 }
172
173 return err169 return err
174}170}
175171
176172
=== modified file 'cmd/juju/main_test.go'
--- cmd/juju/main_test.go 2014-04-25 13:57:06 +0000
+++ cmd/juju/main_test.go 2014-05-12 11:08:32 +0000
@@ -19,6 +19,7 @@
19 gc "launchpad.net/gocheck"19 gc "launchpad.net/gocheck"
2020
21 "launchpad.net/juju-core/cmd"21 "launchpad.net/juju-core/cmd"
22 "launchpad.net/juju-core/cmd/envcmd"
22 "launchpad.net/juju-core/juju/osenv"23 "launchpad.net/juju-core/juju/osenv"
23 _ "launchpad.net/juju-core/provider/dummy"24 _ "launchpad.net/juju-core/provider/dummy"
24 "launchpad.net/juju-core/testing"25 "launchpad.net/juju-core/testing"
@@ -70,11 +71,11 @@
70}71}
7172
72func deployHelpText() string {73func deployHelpText() string {
73 return helpText(&DeployCommand{}, "juju deploy")74 return helpText(envcmd.Wrap(&DeployCommand{}), "juju deploy")
74}75}
7576
76func syncToolsHelpText() string {77func syncToolsHelpText() string {
77 return helpText(&SyncToolsCommand{}, "juju sync-tools")78 return helpText(envcmd.Wrap(&SyncToolsCommand{}), "juju sync-tools")
78}79}
7980
80func (s *MainSuite) TestRunMain(c *gc.C) {81func (s *MainSuite) TestRunMain(c *gc.C) {
@@ -350,3 +351,20 @@
350 c.Assert(line, gc.Matches, globalFlags[i])351 c.Assert(line, gc.Matches, globalFlags[i])
351 }352 }
352}353}
354
355type commands []cmd.Command
356
357func (r *commands) Register(c cmd.Command) {
358 *r = append(*r, c)
359}
360
361func (s *MainSuite) TestEnvironCommands(c *gc.C) {
362 var commands commands
363 registerCommands(&commands, testing.Context(c))
364 // There should not be any EnvironCommands registered.
365 // EnvironCommands must be wrapped using envcmd.Wrap.
366 for _, cmd := range commands {
367 c.Logf("%v", cmd.Info().Name)
368 c.Check(cmd, gc.Not(gc.FitsTypeOf), envcmd.EnvironCommand(&BootstrapCommand{}))
369 }
370}
353371
=== modified file 'cmd/juju/plugin.go'
--- cmd/juju/plugin.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/plugin.go 2014-05-12 11:08:32 +0000
@@ -46,7 +46,7 @@
4646
47func RunPlugin(ctx *cmd.Context, subcommand string, args []string) error {47func RunPlugin(ctx *cmd.Context, subcommand string, args []string) error {
48 cmdName := JujuPluginPrefix + subcommand48 cmdName := JujuPluginPrefix + subcommand
49 plugin := &PluginCommand{name: cmdName}49 plugin := envcmd.Wrap(&PluginCommand{name: cmdName})
5050
51 // We process common flags supported by Juju commands.51 // We process common flags supported by Juju commands.
52 // To do this, we extract only those supported flags from the52 // To do this, we extract only those supported flags from the
@@ -84,22 +84,15 @@
84}84}
8585
86func (c *PluginCommand) Init(args []string) error {86func (c *PluginCommand) Init(args []string) error {
87 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
88 return err
89 }
90 c.args = args87 c.args = args
91 return nil88 return nil
92}89}
9390
94func (c *PluginCommand) SetFlags(f *gnuflag.FlagSet) {
95 c.EnvCommandBase.SetFlags(f)
96}
97
98func (c *PluginCommand) Run(ctx *cmd.Context) error {91func (c *PluginCommand) Run(ctx *cmd.Context) error {
99 command := exec.Command(c.name, c.args...)92 command := exec.Command(c.name, c.args...)
100 command.Env = append(os.Environ(), []string{93 command.Env = append(os.Environ(), []string{
101 osenv.JujuHomeEnvKey + "=" + osenv.JujuHome(),94 osenv.JujuHomeEnvKey + "=" + osenv.JujuHome(),
102 osenv.JujuEnvEnvKey + "=" + c.EnvironName()}...,95 osenv.JujuEnvEnvKey + "=" + c.EnvName}...,
103 )96 )
10497
105 // Now hook up stdin, stdout, stderr98 // Now hook up stdin, stdout, stderr
10699
=== modified file 'cmd/juju/publish.go'
--- cmd/juju/publish.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/publish.go 2014-05-12 11:08:32 +0000
@@ -55,14 +55,10 @@
55}55}
5656
57func (c *PublishCommand) SetFlags(f *gnuflag.FlagSet) {57func (c *PublishCommand) SetFlags(f *gnuflag.FlagSet) {
58 c.EnvCommandBase.SetFlags(f)
59 f.StringVar(&c.CharmPath, "from", ".", "path for charm to be published")58 f.StringVar(&c.CharmPath, "from", ".", "path for charm to be published")
60}59}
6160
62func (c *PublishCommand) Init(args []string) error {61func (c *PublishCommand) Init(args []string) error {
63 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
64 return err
65 }
66 if len(args) == 0 {62 if len(args) == 0 {
67 return nil63 return nil
68 }64 }
6965
=== modified file 'cmd/juju/publish_test.go'
--- cmd/juju/publish_test.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/publish_test.go 2014-05-12 11:08:32 +0000
@@ -12,6 +12,7 @@
12 "launchpad.net/juju-core/bzr"12 "launchpad.net/juju-core/bzr"
13 "launchpad.net/juju-core/charm"13 "launchpad.net/juju-core/charm"
14 "launchpad.net/juju-core/cmd"14 "launchpad.net/juju-core/cmd"
15 "launchpad.net/juju-core/cmd/envcmd"
15 "launchpad.net/juju-core/testing"16 "launchpad.net/juju-core/testing"
16 "launchpad.net/juju-core/testing/testbase"17 "launchpad.net/juju-core/testing/testbase"
17)18)
@@ -52,7 +53,7 @@
52}53}
5354
54func (s *PublishSuite) runPublish(c *gc.C, args ...string) (*cmd.Context, error) {55func (s *PublishSuite) runPublish(c *gc.C, args ...string) (*cmd.Context, error) {
55 return testing.RunCommandInDir(c, &PublishCommand{}, args, s.dir)56 return testing.RunCommandInDir(c, envcmd.Wrap(&PublishCommand{}), args, s.dir)
56}57}
5758
58const pollDelay = testing.ShortWait59const pollDelay = testing.ShortWait
@@ -94,7 +95,7 @@
9495
95func (s *PublishSuite) TestNoBranch(c *gc.C) {96func (s *PublishSuite) TestNoBranch(c *gc.C) {
96 dir := c.MkDir()97 dir := c.MkDir()
97 _, err := testing.RunCommandInDir(c, &PublishCommand{}, []string{"cs:precise/wordpress"}, dir)98 _, err := testing.RunCommandInDir(c, envcmd.Wrap(&PublishCommand{}), []string{"cs:precise/wordpress"}, dir)
98 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("not a charm branch: %s", dir))99 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("not a charm branch: %s", dir))
99}100}
100101
@@ -104,7 +105,7 @@
104}105}
105106
106func (s *PublishSuite) TestFrom(c *gc.C) {107func (s *PublishSuite) TestFrom(c *gc.C) {
107 _, err := testing.RunCommandInDir(c, &PublishCommand{}, []string{"--from", s.dir, "cs:precise/wordpress"}, c.MkDir())108 _, err := testing.RunCommandInDir(c, envcmd.Wrap(&PublishCommand{}), []string{"--from", s.dir, "cs:precise/wordpress"}, c.MkDir())
108 c.Assert(err, gc.ErrorMatches, `cannot obtain local digest: branch has no content`)109 c.Assert(err, gc.ErrorMatches, `cannot obtain local digest: branch has no content`)
109}110}
110111
@@ -149,7 +150,7 @@
149 panic("unreachable")150 panic("unreachable")
150 })151 })
151152
152 _, err := testing.RunCommandInDir(c, cmd, []string{"precise/wordpress"}, s.dir)153 _, err := testing.RunCommandInDir(c, envcmd.Wrap(cmd), []string{"precise/wordpress"}, s.dir)
153 c.Assert(err, gc.IsNil)154 c.Assert(err, gc.IsNil)
154 c.Fatal("shouldn't get here; location closure didn't run?")155 c.Fatal("shouldn't get here; location closure didn't run?")
155}156}
@@ -264,7 +265,7 @@
264 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}`265 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}`
265 testing.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest)))266 testing.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest)))
266267
267 ctx, err := testing.RunCommandInDir(c, cmd, []string{"cs:~user/precise/wordpress"}, s.dir)268 ctx, err := testing.RunCommandInDir(c, envcmd.Wrap(cmd), []string{"cs:~user/precise/wordpress"}, s.dir)
268 c.Assert(err, gc.IsNil)269 c.Assert(err, gc.IsNil)
269 c.Assert(testing.Stdout(ctx), gc.Equals, "cs:~user/precise/wordpress-42\n")270 c.Assert(testing.Stdout(ctx), gc.Equals, "cs:~user/precise/wordpress-42\n")
270271
@@ -320,7 +321,7 @@
320 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}`321 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": %q, "revision": 42}}`
321 testing.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest)))322 testing.Server.Response(200, nil, []byte(fmt.Sprintf(body, digest)))
322323
323 ctx, err := testing.RunCommandInDir(c, cmd, []string{"cs:~user/precise/wordpress"}, s.dir)324 ctx, err := testing.RunCommandInDir(c, envcmd.Wrap(cmd), []string{"cs:~user/precise/wordpress"}, s.dir)
324 c.Assert(err, gc.IsNil)325 c.Assert(err, gc.IsNil)
325 c.Assert(testing.Stdout(ctx), gc.Equals, "cs:~user/precise/wordpress-42\n")326 c.Assert(testing.Stdout(ctx), gc.Equals, "cs:~user/precise/wordpress-42\n")
326327
@@ -376,7 +377,7 @@
376 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": "surprising-digest", "revision": 42}}`377 body = `{"cs:~user/precise/wordpress": {"kind": "published", "digest": "surprising-digest", "revision": 42}}`
377 testing.Server.Response(200, nil, []byte(body))378 testing.Server.Response(200, nil, []byte(body))
378379
379 _, err = testing.RunCommandInDir(c, cmd, []string{"cs:~user/precise/wordpress"}, s.dir)380 _, err = testing.RunCommandInDir(c, envcmd.Wrap(cmd), []string{"cs:~user/precise/wordpress"}, s.dir)
380 c.Assert(err, gc.ErrorMatches, `charm changed but not to local charm digest; publishing race\?`)381 c.Assert(err, gc.ErrorMatches, `charm changed but not to local charm digest; publishing race\?`)
381382
382 // Ensure the branch was actually pushed.383 // Ensure the branch was actually pushed.
383384
=== modified file 'cmd/juju/removemachine.go'
--- cmd/juju/removemachine.go 2014-05-11 22:52:40 +0000
+++ cmd/juju/removemachine.go 2014-05-12 11:08:32 +0000
@@ -46,14 +46,10 @@
46}46}
4747
48func (c *RemoveMachineCommand) SetFlags(f *gnuflag.FlagSet) {48func (c *RemoveMachineCommand) SetFlags(f *gnuflag.FlagSet) {
49 c.EnvCommandBase.SetFlags(f)
50 f.BoolVar(&c.Force, "force", false, "completely remove machine and all dependencies")49 f.BoolVar(&c.Force, "force", false, "completely remove machine and all dependencies")
51}50}
5251
53func (c *RemoveMachineCommand) Init(args []string) error {52func (c *RemoveMachineCommand) Init(args []string) error {
54 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
55 return err
56 }
57 if len(args) == 0 {53 if len(args) == 0 {
58 return fmt.Errorf("no machines specified")54 return fmt.Errorf("no machines specified")
59 }55 }
6056
=== modified file 'cmd/juju/removemachine_test.go'
--- cmd/juju/removemachine_test.go 2014-05-09 22:56:29 +0000
+++ cmd/juju/removemachine_test.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 jc "github.com/juju/testing/checkers"7 jc "github.com/juju/testing/checkers"
8 gc "launchpad.net/gocheck"8 gc "launchpad.net/gocheck"
99
10 "launchpad.net/juju-core/cmd/envcmd"
10 "launchpad.net/juju-core/errors"11 "launchpad.net/juju-core/errors"
11 jujutesting "launchpad.net/juju-core/juju/testing"12 jujutesting "launchpad.net/juju-core/juju/testing"
12 "launchpad.net/juju-core/state"13 "launchpad.net/juju-core/state"
@@ -20,7 +21,7 @@
20var _ = gc.Suite(&RemoveMachineSuite{})21var _ = gc.Suite(&RemoveMachineSuite{})
2122
22func runRemoveMachine(c *gc.C, args ...string) error {23func runRemoveMachine(c *gc.C, args ...string) error {
23 _, err := testing.RunCommand(c, &RemoveMachineCommand{}, args)24 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveMachineCommand{}), args)
24 return err25 return err
25}26}
2627
2728
=== modified file 'cmd/juju/removerelation.go'
--- cmd/juju/removerelation.go 2014-05-11 22:52:40 +0000
+++ cmd/juju/removerelation.go 2014-05-12 11:08:32 +0000
@@ -27,9 +27,6 @@
27}27}
2828
29func (c *RemoveRelationCommand) Init(args []string) error {29func (c *RemoveRelationCommand) Init(args []string) error {
30 if err := c.EnsureEnvName(); err != nil {
31 return err
32 }
33 if len(args) != 2 {30 if len(args) != 2 {
34 return fmt.Errorf("a relation must involve two services")31 return fmt.Errorf("a relation must involve two services")
35 }32 }
3633
=== modified file 'cmd/juju/removerelation_test.go'
--- cmd/juju/removerelation_test.go 2014-05-08 21:27:00 +0000
+++ cmd/juju/removerelation_test.go 2014-05-12 11:08:32 +0000
@@ -6,6 +6,7 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/cmd/envcmd"
9 jujutesting "launchpad.net/juju-core/juju/testing"10 jujutesting "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/testing"11 "launchpad.net/juju-core/testing"
11)12)
@@ -17,7 +18,7 @@
17var _ = gc.Suite(&RemoveRelationSuite{})18var _ = gc.Suite(&RemoveRelationSuite{})
1819
19func runRemoveRelation(c *gc.C, args ...string) error {20func runRemoveRelation(c *gc.C, args ...string) error {
20 _, err := testing.RunCommand(c, &RemoveRelationCommand{}, args)21 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveRelationCommand{}), args)
21 return err22 return err
22}23}
2324
2425
=== modified file 'cmd/juju/removeservice.go'
--- cmd/juju/removeservice.go 2014-05-11 22:52:40 +0000
+++ cmd/juju/removeservice.go 2014-05-12 11:08:32 +0000
@@ -29,9 +29,6 @@
29}29}
3030
31func (c *RemoveServiceCommand) Init(args []string) error {31func (c *RemoveServiceCommand) Init(args []string) error {
32 if err := c.EnsureEnvName(); err != nil {
33 return err
34 }
35 if len(args) == 0 {32 if len(args) == 0 {
36 return fmt.Errorf("no service specified")33 return fmt.Errorf("no service specified")
37 }34 }
3835
=== modified file 'cmd/juju/removeservice_test.go'
--- cmd/juju/removeservice_test.go 2014-05-08 21:27:00 +0000
+++ cmd/juju/removeservice_test.go 2014-05-12 11:08:32 +0000
@@ -6,6 +6,7 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/cmd/envcmd"
9 jujutesting "launchpad.net/juju-core/juju/testing"10 jujutesting "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/state"11 "launchpad.net/juju-core/state"
11 "launchpad.net/juju-core/testing"12 "launchpad.net/juju-core/testing"
@@ -18,7 +19,7 @@
18var _ = gc.Suite(&RemoveServiceSuite{})19var _ = gc.Suite(&RemoveServiceSuite{})
1920
20func runRemoveService(c *gc.C, args ...string) error {21func runRemoveService(c *gc.C, args ...string) error {
21 _, err := testing.RunCommand(c, &RemoveServiceCommand{}, args)22 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveServiceCommand{}), args)
22 return err23 return err
23}24}
2425
2526
=== modified file 'cmd/juju/removeunit.go'
--- cmd/juju/removeunit.go 2014-05-11 22:52:40 +0000
+++ cmd/juju/removeunit.go 2014-05-12 11:08:32 +0000
@@ -29,9 +29,6 @@
29}29}
3030
31func (c *RemoveUnitCommand) Init(args []string) error {31func (c *RemoveUnitCommand) Init(args []string) error {
32 if err := c.EnsureEnvName(); err != nil {
33 return err
34 }
35 c.UnitNames = args32 c.UnitNames = args
36 if len(c.UnitNames) == 0 {33 if len(c.UnitNames) == 0 {
37 return errors.New("no units specified")34 return errors.New("no units specified")
3835
=== modified file 'cmd/juju/removeunit_test.go'
--- cmd/juju/removeunit_test.go 2014-05-08 21:27:00 +0000
+++ cmd/juju/removeunit_test.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/charm"9 "launchpad.net/juju-core/charm"
10 "launchpad.net/juju-core/cmd/envcmd"
10 jujutesting "launchpad.net/juju-core/juju/testing"11 jujutesting "launchpad.net/juju-core/juju/testing"
11 "launchpad.net/juju-core/state"12 "launchpad.net/juju-core/state"
12 "launchpad.net/juju-core/testing"13 "launchpad.net/juju-core/testing"
@@ -19,7 +20,7 @@
19var _ = gc.Suite(&RemoveUnitSuite{})20var _ = gc.Suite(&RemoveUnitSuite{})
2021
21func runRemoveUnit(c *gc.C, args ...string) error {22func runRemoveUnit(c *gc.C, args ...string) error {
22 _, err := testing.RunCommand(c, &RemoveUnitCommand{}, args)23 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveUnitCommand{}), args)
23 return err24 return err
24}25}
2526
2627
=== modified file 'cmd/juju/removeuser.go'
--- cmd/juju/removeuser.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/removeuser.go 2014-05-12 11:08:32 +0000
@@ -33,9 +33,6 @@
33}33}
3434
35func (c *RemoveUserCommand) Init(args []string) error {35func (c *RemoveUserCommand) Init(args []string) error {
36 if err := c.EnsureEnvName(); err != nil {
37 return err
38 }
39 if len(args) == 0 {36 if len(args) == 0 {
40 return errors.New("no username supplied")37 return errors.New("no username supplied")
41 }38 }
4239
=== modified file 'cmd/juju/removeuser_test.go'
--- cmd/juju/removeuser_test.go 2014-03-27 04:28:45 +0000
+++ cmd/juju/removeuser_test.go 2014-05-12 11:08:32 +0000
@@ -6,6 +6,7 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/cmd/envcmd"
9 jujutesting "launchpad.net/juju-core/juju/testing"10 jujutesting "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/testing"11 "launchpad.net/juju-core/testing"
11)12)
@@ -17,19 +18,19 @@
17var _ = gc.Suite(&RemoveUserSuite{})18var _ = gc.Suite(&RemoveUserSuite{})
1819
19func (s *RemoveUserSuite) TestRemoveUser(c *gc.C) {20func (s *RemoveUserSuite) TestRemoveUser(c *gc.C) {
20 _, err := testing.RunCommand(c, &AddUserCommand{}, []string{"foobar", "password"})21 _, err := testing.RunCommand(c, envcmd.Wrap(&AddUserCommand{}), []string{"foobar", "password"})
21 c.Assert(err, gc.IsNil)22 c.Assert(err, gc.IsNil)
2223
23 _, err = testing.RunCommand(c, &RemoveUserCommand{}, []string{"foobar"})24 _, err = testing.RunCommand(c, envcmd.Wrap(&RemoveUserCommand{}), []string{"foobar"})
24 c.Assert(err, gc.IsNil)25 c.Assert(err, gc.IsNil)
25}26}
2627
27func (s *RemoveUserSuite) TestTooManyArgs(c *gc.C) {28func (s *RemoveUserSuite) TestTooManyArgs(c *gc.C) {
28 _, err := testing.RunCommand(c, &RemoveUserCommand{}, []string{"foobar", "password"})29 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveUserCommand{}), []string{"foobar", "password"})
29 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["password"\]`)30 c.Assert(err, gc.ErrorMatches, `unrecognized args: \["password"\]`)
30}31}
3132
32func (s *RemoveUserSuite) TestNotEnoughArgs(c *gc.C) {33func (s *RemoveUserSuite) TestNotEnoughArgs(c *gc.C) {
33 _, err := testing.RunCommand(c, &RemoveUserCommand{}, []string{})34 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveUserCommand{}), []string{})
34 c.Assert(err, gc.ErrorMatches, `no username supplied`)35 c.Assert(err, gc.ErrorMatches, `no username supplied`)
35}36}
3637
=== modified file 'cmd/juju/resolved.go'
--- cmd/juju/resolved.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/resolved.go 2014-05-12 11:08:32 +0000
@@ -30,15 +30,11 @@
30}30}
3131
32func (c *ResolvedCommand) SetFlags(f *gnuflag.FlagSet) {32func (c *ResolvedCommand) SetFlags(f *gnuflag.FlagSet) {
33 c.EnvCommandBase.SetFlags(f)
34 f.BoolVar(&c.Retry, "r", false, "re-execute failed hooks")33 f.BoolVar(&c.Retry, "r", false, "re-execute failed hooks")
35 f.BoolVar(&c.Retry, "retry", false, "")34 f.BoolVar(&c.Retry, "retry", false, "")
36}35}
3736
38func (c *ResolvedCommand) Init(args []string) error {37func (c *ResolvedCommand) Init(args []string) error {
39 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
40 return err
41 }
42 if len(args) > 0 {38 if len(args) > 0 {
43 c.UnitName = args[0]39 c.UnitName = args[0]
44 if !names.IsUnit(c.UnitName) {40 if !names.IsUnit(c.UnitName) {
4541
=== modified file 'cmd/juju/resolved_test.go'
--- cmd/juju/resolved_test.go 2013-09-18 15:57:30 +0000
+++ cmd/juju/resolved_test.go 2014-05-12 11:08:32 +0000
@@ -6,6 +6,7 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/cmd/envcmd"
9 jujutesting "launchpad.net/juju-core/juju/testing"10 jujutesting "launchpad.net/juju-core/juju/testing"
10 "launchpad.net/juju-core/state"11 "launchpad.net/juju-core/state"
11 "launchpad.net/juju-core/state/api/params"12 "launchpad.net/juju-core/state/api/params"
@@ -19,7 +20,7 @@
19var _ = gc.Suite(&ResolvedSuite{})20var _ = gc.Suite(&ResolvedSuite{})
2021
21func runResolved(c *gc.C, args []string) error {22func runResolved(c *gc.C, args []string) error {
22 _, err := testing.RunCommand(c, &ResolvedCommand{}, args)23 _, err := testing.RunCommand(c, envcmd.Wrap(&ResolvedCommand{}), args)
23 return err24 return err
24}25}
2526
2627
=== modified file 'cmd/juju/retryprovisioning.go'
--- cmd/juju/retryprovisioning.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/retryprovisioning.go 2014-05-12 11:08:32 +0000
@@ -28,9 +28,6 @@
28}28}
2929
30func (c *RetryProvisioningCommand) Init(args []string) error {30func (c *RetryProvisioningCommand) Init(args []string) error {
31 if err := c.EnsureEnvName(); err != nil {
32 return err
33 }
34 if len(args) == 0 {31 if len(args) == 0 {
35 return fmt.Errorf("no machine specified")32 return fmt.Errorf("no machine specified")
36 }33 }
3734
=== modified file 'cmd/juju/retryprovisioning_test.go'
--- cmd/juju/retryprovisioning_test.go 2014-03-26 12:42:30 +0000
+++ cmd/juju/retryprovisioning_test.go 2014-05-12 11:08:32 +0000
@@ -9,6 +9,7 @@
9 jc "github.com/juju/testing/checkers"9 jc "github.com/juju/testing/checkers"
10 gc "launchpad.net/gocheck"10 gc "launchpad.net/gocheck"
1111
12 "launchpad.net/juju-core/cmd/envcmd"
12 jujutesting "launchpad.net/juju-core/juju/testing"13 jujutesting "launchpad.net/juju-core/juju/testing"
13 "launchpad.net/juju-core/state"14 "launchpad.net/juju-core/state"
14 "launchpad.net/juju-core/state/api/params"15 "launchpad.net/juju-core/state/api/params"
@@ -61,7 +62,7 @@
6162
62 for i, t := range resolvedMachineTests {63 for i, t := range resolvedMachineTests {
63 c.Logf("test %d: %v", i, t.args)64 c.Logf("test %d: %v", i, t.args)
64 context, err := testing.RunCommand(c, &RetryProvisioningCommand{}, t.args)65 context, err := testing.RunCommand(c, envcmd.Wrap(&RetryProvisioningCommand{}), t.args)
65 if t.err != "" {66 if t.err != "" {
66 c.Check(err, gc.ErrorMatches, t.err)67 c.Check(err, gc.ErrorMatches, t.err)
67 continue68 continue
6869
=== modified file 'cmd/juju/run.go'
--- cmd/juju/run.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/run.go 2014-05-12 11:08:32 +0000
@@ -70,7 +70,6 @@
70}70}
7171
72func (c *RunCommand) SetFlags(f *gnuflag.FlagSet) {72func (c *RunCommand) SetFlags(f *gnuflag.FlagSet) {
73 c.EnvCommandBase.SetFlags(f)
74 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)73 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)
75 f.BoolVar(&c.all, "all", false, "run the commands on all the machines")74 f.BoolVar(&c.all, "all", false, "run the commands on all the machines")
76 f.DurationVar(&c.timeout, "timeout", 5*time.Minute, "how long to wait before the remote command is considered to have failed")75 f.DurationVar(&c.timeout, "timeout", 5*time.Minute, "how long to wait before the remote command is considered to have failed")
@@ -80,9 +79,6 @@
80}79}
8180
82func (c *RunCommand) Init(args []string) error {81func (c *RunCommand) Init(args []string) error {
83 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
84 return err
85 }
86 if len(args) == 0 {82 if len(args) == 0 {
87 return errors.New("no commands specified")83 return errors.New("no commands specified")
88 }84 }
8985
=== modified file 'cmd/juju/run_test.go'
--- cmd/juju/run_test.go 2014-03-27 04:10:28 +0000
+++ cmd/juju/run_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,7 @@
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/state/api/params"15 "launchpad.net/juju-core/state/api/params"
15 "launchpad.net/juju-core/testing"16 "launchpad.net/juju-core/testing"
16 "launchpad.net/juju-core/utils/exec"17 "launchpad.net/juju-core/utils/exec"
@@ -106,7 +107,7 @@
106 }} {107 }} {
107 c.Log(fmt.Sprintf("%v: %s", i, test.message))108 c.Log(fmt.Sprintf("%v: %s", i, test.message))
108 runCmd := &RunCommand{}109 runCmd := &RunCommand{}
109 testing.TestInit(c, runCmd, test.args, test.errMatch)110 testing.TestInit(c, envcmd.Wrap(runCmd), test.args, test.errMatch)
110 if test.errMatch == "" {111 if test.errMatch == "" {
111 c.Check(runCmd.all, gc.Equals, test.all)112 c.Check(runCmd.all, gc.Equals, test.all)
112 c.Check(runCmd.machines, gc.DeepEquals, test.machines)113 c.Check(runCmd.machines, gc.DeepEquals, test.machines)
@@ -142,7 +143,7 @@
142 }} {143 }} {
143 c.Log(fmt.Sprintf("%v: %s", i, test.message))144 c.Log(fmt.Sprintf("%v: %s", i, test.message))
144 runCmd := &RunCommand{}145 runCmd := &RunCommand{}
145 testing.TestInit(c, runCmd, test.args, test.errMatch)146 testing.TestInit(c, envcmd.Wrap(runCmd), test.args, test.errMatch)
146 if test.errMatch == "" {147 if test.errMatch == "" {
147 c.Check(runCmd.timeout, gc.Equals, test.timeout)148 c.Check(runCmd.timeout, gc.Equals, test.timeout)
148 }149 }
@@ -257,7 +258,7 @@
257 jsonFormatted, err := cmd.FormatJson(unformatted)258 jsonFormatted, err := cmd.FormatJson(unformatted)
258 c.Assert(err, gc.IsNil)259 c.Assert(err, gc.IsNil)
259260
260 context, err := testing.RunCommand(c, &RunCommand{}, []string{261 context, err := testing.RunCommand(c, envcmd.Wrap(&RunCommand{}), []string{
261 "--format=json", "--machine=0", "--unit=unit/0", "hostname",262 "--format=json", "--machine=0", "--unit=unit/0", "hostname",
262 })263 })
263 c.Assert(err, gc.IsNil)264 c.Assert(err, gc.IsNil)
@@ -337,7 +338,7 @@
337 args = append(args, "--format", test.format)338 args = append(args, "--format", test.format)
338 }339 }
339 args = append(args, "--all", "ignored")340 args = append(args, "--all", "ignored")
340 context, err := testing.RunCommand(c, &RunCommand{}, args)341 context, err := testing.RunCommand(c, envcmd.Wrap(&RunCommand{}), args)
341 if test.errorMatch != "" {342 if test.errorMatch != "" {
342 c.Check(err, gc.ErrorMatches, test.errorMatch)343 c.Check(err, gc.ErrorMatches, test.errorMatch)
343 } else {344 } else {
344345
=== modified file 'cmd/juju/set.go'
--- cmd/juju/set.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/set.go 2014-05-12 11:08:32 +0000
@@ -39,14 +39,10 @@
39}39}
4040
41func (c *SetCommand) SetFlags(f *gnuflag.FlagSet) {41func (c *SetCommand) SetFlags(f *gnuflag.FlagSet) {
42 c.EnvCommandBase.SetFlags(f)
43 f.Var(&c.SettingsYAML, "config", "path to yaml-formatted service config")42 f.Var(&c.SettingsYAML, "config", "path to yaml-formatted service config")
44}43}
4544
46func (c *SetCommand) Init(args []string) error {45func (c *SetCommand) Init(args []string) error {
47 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
48 return err
49 }
50 if len(args) == 0 || len(strings.Split(args[0], "=")) > 1 {46 if len(args) == 0 || len(strings.Split(args[0], "=")) > 1 {
51 return errors.New("no service name specified")47 return errors.New("no service name specified")
52 }48 }
5349
=== modified file 'cmd/juju/set_test.go'
--- cmd/juju/set_test.go 2013-10-09 13:55:14 +0000
+++ cmd/juju/set_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,7 @@
1111
12 "launchpad.net/juju-core/charm"12 "launchpad.net/juju-core/charm"
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/juju/testing"15 "launchpad.net/juju-core/juju/testing"
15 "launchpad.net/juju-core/state"16 "launchpad.net/juju-core/state"
16 coretesting "launchpad.net/juju-core/testing"17 coretesting "launchpad.net/juju-core/testing"
@@ -73,7 +74,7 @@
73// assertSetSuccess sets configuration options and checks the expected settings.74// assertSetSuccess sets configuration options and checks the expected settings.
74func assertSetSuccess(c *gc.C, dir string, svc *state.Service, args []string, expect charm.Settings) {75func assertSetSuccess(c *gc.C, dir string, svc *state.Service, args []string, expect charm.Settings) {
75 ctx := coretesting.ContextForDir(c, dir)76 ctx := coretesting.ContextForDir(c, dir)
76 code := cmd.Main(&SetCommand{}, ctx, append([]string{"dummy-service"}, args...))77 code := cmd.Main(envcmd.Wrap(&SetCommand{}), ctx, append([]string{"dummy-service"}, args...))
77 c.Check(code, gc.Equals, 0)78 c.Check(code, gc.Equals, 0)
78 settings, err := svc.ConfigSettings()79 settings, err := svc.ConfigSettings()
79 c.Assert(err, gc.IsNil)80 c.Assert(err, gc.IsNil)
@@ -83,7 +84,7 @@
83// assertSetFail sets configuration options and checks the expected error.84// assertSetFail sets configuration options and checks the expected error.
84func assertSetFail(c *gc.C, dir string, args []string, err string) {85func assertSetFail(c *gc.C, dir string, args []string, err string) {
85 ctx := coretesting.ContextForDir(c, dir)86 ctx := coretesting.ContextForDir(c, dir)
86 code := cmd.Main(&SetCommand{}, ctx, append([]string{"dummy-service"}, args...))87 code := cmd.Main(envcmd.Wrap(&SetCommand{}), ctx, append([]string{"dummy-service"}, args...))
87 c.Check(code, gc.Not(gc.Equals), 0)88 c.Check(code, gc.Not(gc.Equals), 0)
88 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Matches, err)89 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Matches, err)
89}90}
9091
=== modified file 'cmd/juju/ssh.go'
--- cmd/juju/ssh.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/ssh.go 2014-05-12 11:08:32 +0000
@@ -40,7 +40,6 @@
40}40}
4141
42func (c *SSHCommon) SetFlags(f *gnuflag.FlagSet) {42func (c *SSHCommon) SetFlags(f *gnuflag.FlagSet) {
43 c.EnvCommandBase.SetFlags(f)
44 f.BoolVar(&c.proxy, "proxy", true, "proxy through the API server")43 f.BoolVar(&c.proxy, "proxy", true, "proxy through the API server")
45 f.BoolVar(&c.pty, "pty", true, "enable pseudo-tty allocation")44 f.BoolVar(&c.pty, "pty", true, "enable pseudo-tty allocation")
46}45}
@@ -94,9 +93,6 @@
94}93}
9594
96func (c *SSHCommand) Init(args []string) error {95func (c *SSHCommand) Init(args []string) error {
97 if err := c.EnsureEnvName(); err != nil {
98 return err
99 }
100 if len(args) == 0 {96 if len(args) == 0 {
101 return errors.New("no target name specified")97 return errors.New("no target name specified")
102 }98 }
10399
=== modified file 'cmd/juju/ssh_test.go'
--- cmd/juju/ssh_test.go 2014-05-09 07:41:52 +0000
+++ cmd/juju/ssh_test.go 2014-05-12 11:08:32 +0000
@@ -14,6 +14,7 @@
1414
15 "launchpad.net/juju-core/charm"15 "launchpad.net/juju-core/charm"
16 "launchpad.net/juju-core/cmd"16 "launchpad.net/juju-core/cmd"
17 "launchpad.net/juju-core/cmd/envcmd"
17 "launchpad.net/juju-core/instance"18 "launchpad.net/juju-core/instance"
18 "launchpad.net/juju-core/juju/testing"19 "launchpad.net/juju-core/juju/testing"
19 "launchpad.net/juju-core/state"20 "launchpad.net/juju-core/state"
@@ -113,7 +114,7 @@
113 c.Logf("test %d: %s -> %s\n", i, t.about, t.args)114 c.Logf("test %d: %s -> %s\n", i, t.about, t.args)
114 ctx := coretesting.Context(c)115 ctx := coretesting.Context(c)
115 jujucmd := cmd.NewSuperCommand(cmd.SuperCommandParams{})116 jujucmd := cmd.NewSuperCommand(cmd.SuperCommandParams{})
116 jujucmd.Register(&SSHCommand{})117 jujucmd.Register(envcmd.Wrap(&SSHCommand{}))
117118
118 code := cmd.Main(jujucmd, ctx, t.args)119 code := cmd.Main(jujucmd, ctx, t.args)
119 c.Check(code, gc.Equals, 0)120 c.Check(code, gc.Equals, 0)
120121
=== modified file 'cmd/juju/status.go'
--- cmd/juju/status.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/status.go 2014-05-12 11:08:32 +0000
@@ -50,7 +50,6 @@
50}50}
5151
52func (c *StatusCommand) SetFlags(f *gnuflag.FlagSet) {52func (c *StatusCommand) SetFlags(f *gnuflag.FlagSet) {
53 c.EnvCommandBase.SetFlags(f)
54 c.out.AddFlags(f, "yaml", map[string]cmd.Formatter{53 c.out.AddFlags(f, "yaml", map[string]cmd.Formatter{
55 "yaml": cmd.FormatYaml,54 "yaml": cmd.FormatYaml,
56 "json": cmd.FormatJson,55 "json": cmd.FormatJson,
@@ -58,9 +57,6 @@
58}57}
5958
60func (c *StatusCommand) Init(args []string) error {59func (c *StatusCommand) Init(args []string) error {
61 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
62 return err
63 }
64 c.patterns = args60 c.patterns = args
65 return nil61 return nil
66}62}
6763
=== modified file 'cmd/juju/status_test.go'
--- cmd/juju/status_test.go 2014-05-01 17:56:04 +0000
+++ cmd/juju/status_test.go 2014-05-12 11:08:32 +0000
@@ -17,6 +17,7 @@
1717
18 "launchpad.net/juju-core/charm"18 "launchpad.net/juju-core/charm"
19 "launchpad.net/juju-core/cmd"19 "launchpad.net/juju-core/cmd"
20 "launchpad.net/juju-core/cmd/envcmd"
20 "launchpad.net/juju-core/constraints"21 "launchpad.net/juju-core/constraints"
21 "launchpad.net/juju-core/environs/network"22 "launchpad.net/juju-core/environs/network"
22 "launchpad.net/juju-core/instance"23 "launchpad.net/juju-core/instance"
@@ -31,7 +32,7 @@
3132
32func runStatus(c *gc.C, args ...string) (code int, stdout, stderr []byte) {33func runStatus(c *gc.C, args ...string) (code int, stdout, stderr []byte) {
33 ctx := coretesting.Context(c)34 ctx := coretesting.Context(c)
34 code = cmd.Main(&StatusCommand{}, ctx, args)35 code = cmd.Main(envcmd.Wrap(&StatusCommand{}), ctx, args)
35 stdout = ctx.Stdout.(*bytes.Buffer).Bytes()36 stdout = ctx.Stdout.(*bytes.Buffer).Bytes()
36 stderr = ctx.Stderr.(*bytes.Buffer).Bytes()37 stderr = ctx.Stderr.(*bytes.Buffer).Bytes()
37 return38 return
3839
=== modified file 'cmd/juju/synctools.go'
--- cmd/juju/synctools.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/synctools.go 2014-05-12 11:08:32 +0000
@@ -52,7 +52,6 @@
52}52}
5353
54func (c *SyncToolsCommand) SetFlags(f *gnuflag.FlagSet) {54func (c *SyncToolsCommand) SetFlags(f *gnuflag.FlagSet) {
55 c.EnvCommandBase.SetFlags(f)
56 f.BoolVar(&c.allVersions, "all", false, "copy all versions, not just the latest")55 f.BoolVar(&c.allVersions, "all", false, "copy all versions, not just the latest")
57 f.StringVar(&c.versionStr, "version", "", "copy a specific major[.minor] version")56 f.StringVar(&c.versionStr, "version", "", "copy a specific major[.minor] version")
58 f.BoolVar(&c.dryRun, "dry-run", false, "don't copy, just print what would be copied")57 f.BoolVar(&c.dryRun, "dry-run", false, "don't copy, just print what would be copied")
@@ -64,9 +63,6 @@
64}63}
6564
66func (c *SyncToolsCommand) Init(args []string) error {65func (c *SyncToolsCommand) Init(args []string) error {
67 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
68 return err
69 }
70 if c.destination != "" {66 if c.destination != "" {
71 // Override localDir with destination as localDir now replaces destination67 // Override localDir with destination as localDir now replaces destination
72 c.localDir = c.destination68 c.localDir = c.destination
7369
=== modified file 'cmd/juju/synctools_test.go'
--- cmd/juju/synctools_test.go 2014-03-24 10:42:51 +0000
+++ cmd/juju/synctools_test.go 2014-05-12 11:08:32 +0000
@@ -12,6 +12,7 @@
12 gc "launchpad.net/gocheck"12 gc "launchpad.net/gocheck"
1313
14 "launchpad.net/juju-core/cmd"14 "launchpad.net/juju-core/cmd"
15 "launchpad.net/juju-core/cmd/envcmd"
15 "launchpad.net/juju-core/environs"16 "launchpad.net/juju-core/environs"
16 "launchpad.net/juju-core/environs/configstore"17 "launchpad.net/juju-core/environs/configstore"
17 "launchpad.net/juju-core/environs/sync"18 "launchpad.net/juju-core/environs/sync"
@@ -61,7 +62,7 @@
61}62}
6263
63func runSyncToolsCommand(c *gc.C, args ...string) (*cmd.Context, error) {64func runSyncToolsCommand(c *gc.C, args ...string) (*cmd.Context, error) {
64 return coretesting.RunCommand(c, &SyncToolsCommand{}, args)65 return coretesting.RunCommand(c, envcmd.Wrap(&SyncToolsCommand{}), args)
65}66}
6667
67func wait(signal chan struct{}) error {68func wait(signal chan struct{}) error {
6869
=== modified file 'cmd/juju/unexpose.go'
--- cmd/juju/unexpose.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/unexpose.go 2014-05-12 11:08:32 +0000
@@ -26,9 +26,6 @@
26}26}
2727
28func (c *UnexposeCommand) Init(args []string) error {28func (c *UnexposeCommand) Init(args []string) error {
29 if err := c.EnsureEnvName(); err != nil {
30 return err
31 }
32 if len(args) == 0 {29 if len(args) == 0 {
33 return errors.New("no service name specified")30 return errors.New("no service name specified")
34 }31 }
3532
=== modified file 'cmd/juju/unexpose_test.go'
--- cmd/juju/unexpose_test.go 2013-09-13 14:48:13 +0000
+++ cmd/juju/unexpose_test.go 2014-05-12 11:08:32 +0000
@@ -7,6 +7,7 @@
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/charm"9 "launchpad.net/juju-core/charm"
10 "launchpad.net/juju-core/cmd/envcmd"
10 jujutesting "launchpad.net/juju-core/juju/testing"11 jujutesting "launchpad.net/juju-core/juju/testing"
11 "launchpad.net/juju-core/testing"12 "launchpad.net/juju-core/testing"
12)13)
@@ -18,7 +19,7 @@
18var _ = gc.Suite(&UnexposeSuite{})19var _ = gc.Suite(&UnexposeSuite{})
1920
20func runUnexpose(c *gc.C, args ...string) error {21func runUnexpose(c *gc.C, args ...string) error {
21 _, err := testing.RunCommand(c, &UnexposeCommand{}, args)22 _, err := testing.RunCommand(c, envcmd.Wrap(&UnexposeCommand{}), args)
22 return err23 return err
23}24}
2425
2526
=== modified file 'cmd/juju/unset.go'
--- cmd/juju/unset.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/unset.go 2014-05-12 11:08:32 +0000
@@ -6,8 +6,6 @@
6import (6import (
7 "errors"7 "errors"
88
9 "launchpad.net/gnuflag"
10
11 "launchpad.net/juju-core/cmd"9 "launchpad.net/juju-core/cmd"
12 "launchpad.net/juju-core/cmd/envcmd"10 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/juju"11 "launchpad.net/juju-core/juju"
@@ -36,14 +34,7 @@
36 }34 }
37}35}
3836
39func (c *UnsetCommand) SetFlags(f *gnuflag.FlagSet) {
40 c.EnvCommandBase.SetFlags(f)
41}
42
43func (c *UnsetCommand) Init(args []string) error {37func (c *UnsetCommand) Init(args []string) error {
44 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
45 return err
46 }
47 if len(args) == 0 {38 if len(args) == 0 {
48 return errors.New("no service name specified")39 return errors.New("no service name specified")
49 }40 }
5041
=== modified file 'cmd/juju/unset_test.go'
--- cmd/juju/unset_test.go 2013-11-28 15:53:00 +0000
+++ cmd/juju/unset_test.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
1010
11 "launchpad.net/juju-core/charm"11 "launchpad.net/juju-core/charm"
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/juju/testing"14 "launchpad.net/juju-core/juju/testing"
14 "launchpad.net/juju-core/state"15 "launchpad.net/juju-core/state"
15 coretesting "launchpad.net/juju-core/testing"16 coretesting "launchpad.net/juju-core/testing"
@@ -77,7 +78,7 @@
77// assertUnsetSuccess unsets configuration options and checks the expected settings.78// assertUnsetSuccess unsets configuration options and checks the expected settings.
78func assertUnsetSuccess(c *gc.C, dir string, svc *state.Service, args []string, expect charm.Settings) {79func assertUnsetSuccess(c *gc.C, dir string, svc *state.Service, args []string, expect charm.Settings) {
79 ctx := coretesting.ContextForDir(c, dir)80 ctx := coretesting.ContextForDir(c, dir)
80 code := cmd.Main(&UnsetCommand{}, ctx, append([]string{"dummy-service"}, args...))81 code := cmd.Main(envcmd.Wrap(&UnsetCommand{}), ctx, append([]string{"dummy-service"}, args...))
81 c.Check(code, gc.Equals, 0)82 c.Check(code, gc.Equals, 0)
82 settings, err := svc.ConfigSettings()83 settings, err := svc.ConfigSettings()
83 c.Assert(err, gc.IsNil)84 c.Assert(err, gc.IsNil)
@@ -87,7 +88,7 @@
87// assertUnsetFail unsets configuration options and checks the expected error.88// assertUnsetFail unsets configuration options and checks the expected error.
88func assertUnsetFail(c *gc.C, dir string, args []string, err string) {89func assertUnsetFail(c *gc.C, dir string, args []string, err string) {
89 ctx := coretesting.ContextForDir(c, dir)90 ctx := coretesting.ContextForDir(c, dir)
90 code := cmd.Main(&UnsetCommand{}, ctx, append([]string{"dummy-service"}, args...))91 code := cmd.Main(envcmd.Wrap(&UnsetCommand{}), ctx, append([]string{"dummy-service"}, args...))
91 c.Check(code, gc.Not(gc.Equals), 0)92 c.Check(code, gc.Not(gc.Equals), 0)
92 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Matches, err)93 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), gc.Matches, err)
93}94}
9495
=== modified file 'cmd/juju/upgradecharm.go'
--- cmd/juju/upgradecharm.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/upgradecharm.go 2014-05-12 11:08:32 +0000
@@ -76,7 +76,6 @@
76}76}
7777
78func (c *UpgradeCharmCommand) SetFlags(f *gnuflag.FlagSet) {78func (c *UpgradeCharmCommand) SetFlags(f *gnuflag.FlagSet) {
79 c.EnvCommandBase.SetFlags(f)
80 f.BoolVar(&c.Force, "force", false, "upgrade all units immediately, even if in error state")79 f.BoolVar(&c.Force, "force", false, "upgrade all units immediately, even if in error state")
81 f.StringVar(&c.RepoPath, "repository", os.Getenv("JUJU_REPOSITORY"), "local charm repository path")80 f.StringVar(&c.RepoPath, "repository", os.Getenv("JUJU_REPOSITORY"), "local charm repository path")
82 f.StringVar(&c.SwitchURL, "switch", "", "crossgrade to a different charm")81 f.StringVar(&c.SwitchURL, "switch", "", "crossgrade to a different charm")
@@ -84,9 +83,6 @@
84}83}
8584
86func (c *UpgradeCharmCommand) Init(args []string) error {85func (c *UpgradeCharmCommand) Init(args []string) error {
87 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
88 return err
89 }
90 switch len(args) {86 switch len(args) {
91 case 1:87 case 1:
92 if !names.IsService(args[0]) {88 if !names.IsService(args[0]) {
9389
=== modified file 'cmd/juju/upgradecharm_test.go'
--- cmd/juju/upgradecharm_test.go 2014-03-18 05:08:25 +0000
+++ cmd/juju/upgradecharm_test.go 2014-05-12 11:08:32 +0000
@@ -13,6 +13,7 @@
1313
14 "launchpad.net/juju-core/charm"14 "launchpad.net/juju-core/charm"
15 charmtesting "launchpad.net/juju-core/charm/testing"15 charmtesting "launchpad.net/juju-core/charm/testing"
16 "launchpad.net/juju-core/cmd/envcmd"
16 jujutesting "launchpad.net/juju-core/juju/testing"17 jujutesting "launchpad.net/juju-core/juju/testing"
17 "launchpad.net/juju-core/state"18 "launchpad.net/juju-core/state"
18 "launchpad.net/juju-core/testing"19 "launchpad.net/juju-core/testing"
@@ -34,7 +35,7 @@
34var _ = gc.Suite(&UpgradeCharmErrorsSuite{})35var _ = gc.Suite(&UpgradeCharmErrorsSuite{})
3536
36func runUpgradeCharm(c *gc.C, args ...string) error {37func runUpgradeCharm(c *gc.C, args ...string) error {
37 _, err := testing.RunCommand(c, &UpgradeCharmCommand{}, args)38 _, err := testing.RunCommand(c, envcmd.Wrap(&UpgradeCharmCommand{}), args)
38 return err39 return err
39}40}
4041
4142
=== modified file 'cmd/juju/upgradejuju.go'
--- cmd/juju/upgradejuju.go 2014-05-09 13:24:50 +0000
+++ cmd/juju/upgradejuju.go 2014-05-12 11:08:32 +0000
@@ -76,16 +76,12 @@
76}76}
7777
78func (c *UpgradeJujuCommand) SetFlags(f *gnuflag.FlagSet) {78func (c *UpgradeJujuCommand) SetFlags(f *gnuflag.FlagSet) {
79 c.EnvCommandBase.SetFlags(f)
80 f.StringVar(&c.vers, "version", "", "upgrade to specific version")79 f.StringVar(&c.vers, "version", "", "upgrade to specific version")
81 f.BoolVar(&c.UploadTools, "upload-tools", false, "upload local version of tools")80 f.BoolVar(&c.UploadTools, "upload-tools", false, "upload local version of tools")
82 f.Var(newSeriesValue(nil, &c.Series), "series", "upload tools for supplied comma-separated series list")81 f.Var(newSeriesValue(nil, &c.Series), "series", "upload tools for supplied comma-separated series list")
83}82}
8483
85func (c *UpgradeJujuCommand) Init(args []string) error {84func (c *UpgradeJujuCommand) Init(args []string) error {
86 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
87 return err
88 }
89 if c.vers != "" {85 if c.vers != "" {
90 vers, err := version.Parse(c.vers)86 vers, err := version.Parse(c.vers)
91 if err != nil {87 if err != nil {
9288
=== modified file 'cmd/juju/upgradejuju_test.go'
--- cmd/juju/upgradejuju_test.go 2014-04-09 16:36:12 +0000
+++ cmd/juju/upgradejuju_test.go 2014-05-12 11:08:32 +0000
@@ -14,6 +14,7 @@
14 jc "github.com/juju/testing/checkers"14 jc "github.com/juju/testing/checkers"
15 gc "launchpad.net/gocheck"15 gc "launchpad.net/gocheck"
1616
17 "launchpad.net/juju-core/cmd/envcmd"
17 "launchpad.net/juju-core/environs/config"18 "launchpad.net/juju-core/environs/config"
18 "launchpad.net/juju-core/environs/filestorage"19 "launchpad.net/juju-core/environs/filestorage"
19 "launchpad.net/juju-core/environs/storage"20 "launchpad.net/juju-core/environs/storage"
@@ -313,7 +314,7 @@
313 // Set up apparent CLI version and initialize the command.314 // Set up apparent CLI version and initialize the command.
314 version.Current = version.MustParseBinary(test.currentVersion)315 version.Current = version.MustParseBinary(test.currentVersion)
315 com := &UpgradeJujuCommand{}316 com := &UpgradeJujuCommand{}
316 if err := coretesting.InitCommand(com, test.args); err != nil {317 if err := coretesting.InitCommand(envcmd.Wrap(com), test.args); err != nil {
317 if test.expectInitErr != "" {318 if test.expectInitErr != "" {
318 c.Check(err, gc.ErrorMatches, test.expectInitErr)319 c.Check(err, gc.ErrorMatches, test.expectInitErr)
319 } else {320 } else {
320321
=== modified file 'cmd/plugins/juju-metadata/imagemetadata.go'
--- cmd/plugins/juju-metadata/imagemetadata.go 2014-05-09 13:24:50 +0000
+++ cmd/plugins/juju-metadata/imagemetadata.go 2014-05-12 11:08:32 +0000
@@ -53,7 +53,6 @@
53}53}
5454
55func (c *ImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {55func (c *ImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
56 c.EnvCommandBase.SetFlags(f)
57 f.StringVar(&c.Series, "s", "", "the charm series")56 f.StringVar(&c.Series, "s", "", "the charm series")
58 f.StringVar(&c.Arch, "a", arch.AMD64, "the image achitecture")57 f.StringVar(&c.Arch, "a", arch.AMD64, "the image achitecture")
59 f.StringVar(&c.Dir, "d", "", "the destination directory in which to place the metadata files")58 f.StringVar(&c.Dir, "d", "", "the destination directory in which to place the metadata files")
@@ -62,13 +61,6 @@
62 f.StringVar(&c.Endpoint, "u", "", "the cloud endpoint (for Openstack, this is the Identity Service endpoint)")61 f.StringVar(&c.Endpoint, "u", "", "the cloud endpoint (for Openstack, this is the Identity Service endpoint)")
63}62}
6463
65func (c *ImageMetadataCommand) Init(args []string) error {
66 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
67 return err
68 }
69 return cmd.CheckEmpty(args)
70}
71
72// setParams sets parameters based on the environment configuration64// setParams sets parameters based on the environment configuration
73// for those which have not been explicitly specified.65// for those which have not been explicitly specified.
74func (c *ImageMetadataCommand) setParams(context *cmd.Context) error {66func (c *ImageMetadataCommand) setParams(context *cmd.Context) error {
7567
=== modified file 'cmd/plugins/juju-metadata/imagemetadata_test.go'
--- cmd/plugins/juju-metadata/imagemetadata_test.go 2014-05-09 21:54:06 +0000
+++ cmd/plugins/juju-metadata/imagemetadata_test.go 2014-05-12 11:08:32 +0000
@@ -15,6 +15,7 @@
15 gc "launchpad.net/gocheck"15 gc "launchpad.net/gocheck"
1616
17 "launchpad.net/juju-core/cmd"17 "launchpad.net/juju-core/cmd"
18 "launchpad.net/juju-core/cmd/envcmd"
18 "launchpad.net/juju-core/environs/config"19 "launchpad.net/juju-core/environs/config"
19 "launchpad.net/juju-core/provider/dummy"20 "launchpad.net/juju-core/provider/dummy"
20 "launchpad.net/juju-core/testing"21 "launchpad.net/juju-core/testing"
@@ -116,7 +117,7 @@
116func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {117func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {
117 ctx := testing.Context(c)118 ctx := testing.Context(c)
118 code := cmd.Main(119 code := cmd.Main(
119 &ImageMetadataCommand{}, ctx, []string{120 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
120 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})121 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})
121 c.Assert(code, gc.Equals, 0)122 c.Assert(code, gc.Equals, 0)
122 out := testing.Stdout(ctx)123 out := testing.Stdout(ctx)
@@ -130,7 +131,7 @@
130func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {131func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {
131 ctx := testing.Context(c)132 ctx := testing.Context(c)
132 code := cmd.Main(133 code := cmd.Main(
133 &ImageMetadataCommand{}, ctx, []string{134 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
134 "-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})135 "-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})
135 c.Assert(code, gc.Equals, 0)136 c.Assert(code, gc.Equals, 0)
136 out := testing.Stdout(ctx)137 out := testing.Stdout(ctx)
@@ -144,7 +145,7 @@
144func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) {145func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) {
145 ctx := testing.Context(c)146 ctx := testing.Context(c)
146 code := cmd.Main(147 code := cmd.Main(
147 &ImageMetadataCommand{}, ctx, []string{148 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
148 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})149 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})
149 c.Assert(code, gc.Equals, 0)150 c.Assert(code, gc.Equals, 0)
150 out := testing.Stdout(ctx)151 out := testing.Stdout(ctx)
@@ -158,7 +159,7 @@
158func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) {159func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) {
159 ctx := testing.Context(c)160 ctx := testing.Context(c)
160 code := cmd.Main(161 code := cmd.Main(
161 &ImageMetadataCommand{}, ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"})162 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"})
162 c.Assert(code, gc.Equals, 0)163 c.Assert(code, gc.Equals, 0)
163 out := testing.Stdout(ctx)164 out := testing.Stdout(ctx)
164 expected := expectedMetadata{165 expected := expectedMetadata{
@@ -173,7 +174,7 @@
173func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) {174func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) {
174 ctx := testing.Context(c)175 ctx := testing.Context(c)
175 code := cmd.Main(176 code := cmd.Main(
176 &ImageMetadataCommand{}, ctx, []string{177 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
177 "-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"})178 "-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"})
178 c.Assert(code, gc.Equals, 0)179 c.Assert(code, gc.Equals, 0)
179 out := testing.Stdout(ctx)180 out := testing.Stdout(ctx)
@@ -189,7 +190,7 @@
189func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) {190func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) {
190 ctx := testing.Context(c)191 ctx := testing.Context(c)
191 code := cmd.Main(192 code := cmd.Main(
192 &ImageMetadataCommand{}, ctx, []string{193 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
193 "-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"})194 "-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"})
194 c.Assert(code, gc.Equals, 0)195 c.Assert(code, gc.Equals, 0)
195 out := testing.Stdout(ctx)196 out := testing.Stdout(ctx)
@@ -234,7 +235,7 @@
234 for i, t := range errTests {235 for i, t := range errTests {
235 c.Logf("test: %d", i)236 c.Logf("test: %d", i)
236 ctx := testing.Context(c)237 ctx := testing.Context(c)
237 code := cmd.Main(&ImageMetadataCommand{}, ctx, t.args)238 code := cmd.Main(envcmd.Wrap(&ImageMetadataCommand{}), ctx, t.args)
238 c.Check(code, gc.Equals, 1)239 c.Check(code, gc.Equals, 1)
239 }240 }
240}241}
241242
=== modified file 'cmd/plugins/juju-metadata/metadata.go'
--- cmd/plugins/juju-metadata/metadata.go 2014-03-21 14:28:36 +0000
+++ cmd/plugins/juju-metadata/metadata.go 2014-05-12 11:08:32 +0000
@@ -10,6 +10,7 @@
10 "github.com/juju/loggo"10 "github.com/juju/loggo"
1111
12 "launchpad.net/juju-core/cmd"12 "launchpad.net/juju-core/cmd"
13 "launchpad.net/juju-core/cmd/envcmd"
13 "launchpad.net/juju-core/juju"14 "launchpad.net/juju-core/juju"
14 _ "launchpad.net/juju-core/provider/all"15 _ "launchpad.net/juju-core/provider/all"
15)16)
@@ -41,10 +42,10 @@
41 Purpose: "tools for generating and validating image and tools metadata",42 Purpose: "tools for generating and validating image and tools metadata",
42 Log: &cmd.Log{}})43 Log: &cmd.Log{}})
4344
44 metadatacmd.Register(&ValidateImageMetadataCommand{})45 metadatacmd.Register(envcmd.Wrap(&ValidateImageMetadataCommand{}))
45 metadatacmd.Register(&ImageMetadataCommand{})46 metadatacmd.Register(envcmd.Wrap(&ImageMetadataCommand{}))
46 metadatacmd.Register(&ToolsMetadataCommand{})47 metadatacmd.Register(envcmd.Wrap(&ToolsMetadataCommand{}))
47 metadatacmd.Register(&ValidateToolsMetadataCommand{})48 metadatacmd.Register(envcmd.Wrap(&ValidateToolsMetadataCommand{}))
48 metadatacmd.Register(&SignMetadataCommand{})49 metadatacmd.Register(&SignMetadataCommand{})
4950
50 os.Exit(cmd.Main(metadatacmd, ctx, args[1:]))51 os.Exit(cmd.Main(metadatacmd, ctx, args[1:]))
5152
=== modified file 'cmd/plugins/juju-metadata/toolsmetadata.go'
--- cmd/plugins/juju-metadata/toolsmetadata.go 2014-05-09 13:24:50 +0000
+++ cmd/plugins/juju-metadata/toolsmetadata.go 2014-05-12 11:08:32 +0000
@@ -37,18 +37,10 @@
37}37}
3838
39func (c *ToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) {39func (c *ToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
40 c.EnvCommandBase.SetFlags(f)
41 f.StringVar(&c.metadataDir, "d", "", "local directory in which to store metadata")40 f.StringVar(&c.metadataDir, "d", "", "local directory in which to store metadata")
42 f.BoolVar(&c.public, "public", false, "tools are for a public cloud, so generate mirrors information")41 f.BoolVar(&c.public, "public", false, "tools are for a public cloud, so generate mirrors information")
43}42}
4443
45func (c *ToolsMetadataCommand) Init(args []string) error {
46 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
47 return err
48 }
49 return cmd.CheckEmpty(args)
50}
51
52func (c *ToolsMetadataCommand) Run(context *cmd.Context) error {44func (c *ToolsMetadataCommand) Run(context *cmd.Context) error {
53 loggo.RegisterWriter("toolsmetadata", cmd.NewCommandLogWriter("juju.environs.tools", context.Stdout, context.Stderr), loggo.INFO)45 loggo.RegisterWriter("toolsmetadata", cmd.NewCommandLogWriter("juju.environs.tools", context.Stdout, context.Stderr), loggo.INFO)
54 defer loggo.RemoveWriter("toolsmetadata")46 defer loggo.RemoveWriter("toolsmetadata")
5547
=== modified file 'cmd/plugins/juju-metadata/toolsmetadata_test.go'
--- cmd/plugins/juju-metadata/toolsmetadata_test.go 2014-04-09 16:36:12 +0000
+++ cmd/plugins/juju-metadata/toolsmetadata_test.go 2014-05-12 11:08:32 +0000
@@ -14,6 +14,7 @@
14 gc "launchpad.net/gocheck"14 gc "launchpad.net/gocheck"
1515
16 "launchpad.net/juju-core/cmd"16 "launchpad.net/juju-core/cmd"
17 "launchpad.net/juju-core/cmd/envcmd"
17 "launchpad.net/juju-core/environs"18 "launchpad.net/juju-core/environs"
18 "launchpad.net/juju-core/environs/configstore"19 "launchpad.net/juju-core/environs/configstore"
19 envtesting "launchpad.net/juju-core/environs/testing"20 envtesting "launchpad.net/juju-core/environs/testing"
@@ -100,7 +101,7 @@
100 metadataDir := osenv.JujuHome() // default metadata dir101 metadataDir := osenv.JujuHome() // default metadata dir
101 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)102 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)
102 ctx := coretesting.Context(c)103 ctx := coretesting.Context(c)
103 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil)104 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
104 c.Assert(code, gc.Equals, 0)105 c.Assert(code, gc.Equals, 0)
105 output := ctx.Stdout.(*bytes.Buffer).String()106 output := ctx.Stdout.(*bytes.Buffer).String()
106 c.Assert(output, gc.Matches, expectedOutputDirectory)107 c.Assert(output, gc.Matches, expectedOutputDirectory)
@@ -118,7 +119,7 @@
118 metadataDir := c.MkDir()119 metadataDir := c.MkDir()
119 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)120 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)
120 ctx := coretesting.Context(c)121 ctx := coretesting.Context(c)
121 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"-d", metadataDir})122 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"-d", metadataDir})
122 c.Assert(code, gc.Equals, 0)123 c.Assert(code, gc.Equals, 0)
123 output := ctx.Stdout.(*bytes.Buffer).String()124 output := ctx.Stdout.(*bytes.Buffer).String()
124 c.Assert(output, gc.Matches, expectedOutputDirectory)125 c.Assert(output, gc.Matches, expectedOutputDirectory)
@@ -139,7 +140,7 @@
139 // Run the command with no local metadata.140 // Run the command with no local metadata.
140 ctx := coretesting.Context(c)141 ctx := coretesting.Context(c)
141 metadataDir := c.MkDir()142 metadataDir := c.MkDir()
142 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"-d", metadataDir})143 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"-d", metadataDir})
143 c.Assert(code, gc.Equals, 0)144 c.Assert(code, gc.Equals, 0)
144 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false)145 metadata := ttesting.ParseMetadataFromDir(c, metadataDir, false)
145 c.Assert(metadata, gc.HasLen, len(versionStrings))146 c.Assert(metadata, gc.HasLen, len(versionStrings))
@@ -155,7 +156,7 @@
155 metadataDir := c.MkDir()156 metadataDir := c.MkDir()
156 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)157 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)
157 ctx := coretesting.Context(c)158 ctx := coretesting.Context(c)
158 code := cmd.Main(&ToolsMetadataCommand{}, ctx, []string{"--public", "-d", metadataDir})159 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, []string{"--public", "-d", metadataDir})
159 c.Assert(code, gc.Equals, 0)160 c.Assert(code, gc.Equals, 0)
160 output := ctx.Stdout.(*bytes.Buffer).String()161 output := ctx.Stdout.(*bytes.Buffer).String()
161 c.Assert(output, gc.Matches, expectedOutputMirrors)162 c.Assert(output, gc.Matches, expectedOutputMirrors)
@@ -171,7 +172,7 @@
171172
172func (s *ToolsMetadataSuite) TestNoTools(c *gc.C) {173func (s *ToolsMetadataSuite) TestNoTools(c *gc.C) {
173 ctx := coretesting.Context(c)174 ctx := coretesting.Context(c)
174 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil)175 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
175 c.Assert(code, gc.Equals, 1)176 c.Assert(code, gc.Equals, 1)
176 stdout := ctx.Stdout.(*bytes.Buffer).String()177 stdout := ctx.Stdout.(*bytes.Buffer).String()
177 c.Assert(stdout, gc.Matches, "Finding tools in .*\n")178 c.Assert(stdout, gc.Matches, "Finding tools in .*\n")
@@ -189,7 +190,7 @@
189 metadataDir := osenv.JujuHome() // default metadata dir190 metadataDir := osenv.JujuHome() // default metadata dir
190 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)191 ttesting.MakeTools(c, metadataDir, "releases", versionStrings)
191 ctx := coretesting.Context(c)192 ctx := coretesting.Context(c)
192 code := cmd.Main(&ToolsMetadataCommand{}, ctx, nil)193 code := cmd.Main(envcmd.Wrap(&ToolsMetadataCommand{}), ctx, nil)
193 c.Assert(code, gc.Equals, 0)194 c.Assert(code, gc.Equals, 0)
194 output := ctx.Stdout.(*bytes.Buffer).String()195 output := ctx.Stdout.(*bytes.Buffer).String()
195 expectedOutput := fmt.Sprintf(`196 expectedOutput := fmt.Sprintf(`
196197
=== modified file 'cmd/plugins/juju-metadata/validateimagemetadata.go'
--- cmd/plugins/juju-metadata/validateimagemetadata.go 2014-05-09 13:24:50 +0000
+++ cmd/plugins/juju-metadata/validateimagemetadata.go 2014-05-12 11:08:32 +0000
@@ -81,7 +81,6 @@
81}81}
8282
83func (c *ValidateImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {83func (c *ValidateImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
84 c.EnvCommandBase.SetFlags(f)
85 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)84 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)
86 f.StringVar(&c.providerType, "p", "", "the provider type eg ec2, openstack")85 f.StringVar(&c.providerType, "p", "", "the provider type eg ec2, openstack")
87 f.StringVar(&c.metadataDir, "d", "", "directory where metadata files are found")86 f.StringVar(&c.metadataDir, "d", "", "directory where metadata files are found")
@@ -92,9 +91,6 @@
92}91}
9392
94func (c *ValidateImageMetadataCommand) Init(args []string) error {93func (c *ValidateImageMetadataCommand) Init(args []string) error {
95 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
96 return err
97 }
98 if c.providerType != "" {94 if c.providerType != "" {
99 if c.series == "" {95 if c.series == "" {
100 return fmt.Errorf("series required if provider type is specified")96 return fmt.Errorf("series required if provider type is specified")
10197
=== modified file 'cmd/plugins/juju-metadata/validateimagemetadata_test.go'
--- cmd/plugins/juju-metadata/validateimagemetadata_test.go 2014-05-08 09:27:50 +0000
+++ cmd/plugins/juju-metadata/validateimagemetadata_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,7 @@
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/environs/filestorage"15 "launchpad.net/juju-core/environs/filestorage"
15 "launchpad.net/juju-core/environs/imagemetadata"16 "launchpad.net/juju-core/environs/imagemetadata"
16 "launchpad.net/juju-core/environs/simplestreams"17 "launchpad.net/juju-core/environs/simplestreams"
@@ -27,7 +28,7 @@
27var _ = gc.Suite(&ValidateImageMetadataSuite{})28var _ = gc.Suite(&ValidateImageMetadataSuite{})
2829
29func runValidateImageMetadata(c *gc.C, args ...string) error {30func runValidateImageMetadata(c *gc.C, args ...string) error {
30 _, err := coretesting.RunCommand(c, &ValidateImageMetadataCommand{}, args)31 _, err := coretesting.RunCommand(c, envcmd.Wrap(&ValidateImageMetadataCommand{}), args)
31 return err32 return err
32}33}
3334
@@ -50,7 +51,7 @@
50func (s *ValidateImageMetadataSuite) TestInitErrors(c *gc.C) {51func (s *ValidateImageMetadataSuite) TestInitErrors(c *gc.C) {
51 for i, t := range validateInitImageErrorTests {52 for i, t := range validateInitImageErrorTests {
52 c.Logf("test %d", i)53 c.Logf("test %d", i)
53 err := coretesting.InitCommand(&ValidateImageMetadataCommand{}, t.args)54 err := coretesting.InitCommand(envcmd.Wrap(&ValidateImageMetadataCommand{}), t.args)
54 c.Check(err, gc.ErrorMatches, t.err)55 c.Check(err, gc.ErrorMatches, t.err)
55 }56 }
56}57}
@@ -130,7 +131,7 @@
130 s.setupEc2LocalMetadata(c, "us-east-1", stream)131 s.setupEc2LocalMetadata(c, "us-east-1", stream)
131 ctx := coretesting.Context(c)132 ctx := coretesting.Context(c)
132 code := cmd.Main(133 code := cmd.Main(
133 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", s.metadataDir, "-m", stream},134 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir, "-m", stream},
134 )135 )
135 c.Assert(code, gc.Equals, 0)136 c.Assert(code, gc.Equals, 0)
136 errOut := ctx.Stdout.(*bytes.Buffer).String()137 errOut := ctx.Stdout.(*bytes.Buffer).String()
@@ -154,7 +155,7 @@
154 s.setupEc2LocalMetadata(c, "us-east-1", "")155 s.setupEc2LocalMetadata(c, "us-east-1", "")
155 ctx := coretesting.Context(c)156 ctx := coretesting.Context(c)
156 code := cmd.Main(157 code := cmd.Main(
157 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", s.metadataDir},158 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir},
158 )159 )
159 c.Assert(code, gc.Equals, 1)160 c.Assert(code, gc.Equals, 1)
160 errOut := ctx.Stderr.(*bytes.Buffer).String()161 errOut := ctx.Stderr.(*bytes.Buffer).String()
@@ -166,7 +167,7 @@
166 s.setupEc2LocalMetadata(c, "us-west-1", "")167 s.setupEc2LocalMetadata(c, "us-west-1", "")
167 ctx := coretesting.Context(c)168 ctx := coretesting.Context(c)
168 code := cmd.Main(169 code := cmd.Main(
169 &ValidateImageMetadataCommand{}, ctx, []string{170 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
170 "-p", "ec2", "-s", "precise", "-r", "us-west-1",171 "-p", "ec2", "-s", "precise", "-r", "us-west-1",
171 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},172 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
172 )173 )
@@ -182,13 +183,13 @@
182 s.setupEc2LocalMetadata(c, "us-east-1", "")183 s.setupEc2LocalMetadata(c, "us-east-1", "")
183 ctx := coretesting.Context(c)184 ctx := coretesting.Context(c)
184 code := cmd.Main(185 code := cmd.Main(
185 &ValidateImageMetadataCommand{}, ctx, []string{186 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
186 "-p", "ec2", "-s", "raring", "-r", "us-west-1",187 "-p", "ec2", "-s", "raring", "-r", "us-west-1",
187 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},188 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
188 )189 )
189 c.Assert(code, gc.Equals, 1)190 c.Assert(code, gc.Equals, 1)
190 code = cmd.Main(191 code = cmd.Main(
191 &ValidateImageMetadataCommand{}, ctx, []string{192 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
192 "-p", "ec2", "-s", "precise", "-r", "region",193 "-p", "ec2", "-s", "precise", "-r", "region",
193 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},194 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},
194 )195 )
@@ -202,7 +203,7 @@
202 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "")203 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "")
203 ctx := coretesting.Context(c)204 ctx := coretesting.Context(c)
204 code := cmd.Main(205 code := cmd.Main(
205 &ValidateImageMetadataCommand{}, ctx, []string{206 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
206 "-p", "openstack", "-s", "raring", "-r", "region-2",207 "-p", "openstack", "-s", "raring", "-r", "region-2",
207 "-u", "some-auth-url", "-d", s.metadataDir},208 "-u", "some-auth-url", "-d", s.metadataDir},
208 )209 )
@@ -218,7 +219,7 @@
218 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "")219 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "")
219 ctx := coretesting.Context(c)220 ctx := coretesting.Context(c)
220 code := cmd.Main(221 code := cmd.Main(
221 &ValidateImageMetadataCommand{}, ctx, []string{222 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
222 "-p", "openstack", "-s", "precise", "-r", "region-2",223 "-p", "openstack", "-s", "precise", "-r", "region-2",
223 "-u", "some-auth-url", "-d", s.metadataDir},224 "-u", "some-auth-url", "-d", s.metadataDir},
224 )225 )
@@ -227,7 +228,7 @@
227 strippedOut := strings.Replace(errOut, "\n", "", -1)228 strippedOut := strings.Replace(errOut, "\n", "", -1)
228 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)229 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)
229 code = cmd.Main(230 code = cmd.Main(
230 &ValidateImageMetadataCommand{}, ctx, []string{231 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{
231 "-p", "openstack", "-s", "raring", "-r", "region-3",232 "-p", "openstack", "-s", "raring", "-r", "region-3",
232 "-u", "some-auth-url", "-d", s.metadataDir},233 "-u", "some-auth-url", "-d", s.metadataDir},
233 )234 )
234235
=== modified file 'cmd/plugins/juju-metadata/validatetoolsmetadata.go'
--- cmd/plugins/juju-metadata/validatetoolsmetadata.go 2014-05-09 13:24:50 +0000
+++ cmd/plugins/juju-metadata/validatetoolsmetadata.go 2014-05-12 11:08:32 +0000
@@ -103,7 +103,6 @@
103}103}
104104
105func (c *ValidateToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) {105func (c *ValidateToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
106 c.EnvCommandBase.SetFlags(f)
107 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)106 c.out.AddFlags(f, "smart", cmd.DefaultFormatters)
108 f.StringVar(&c.providerType, "p", "", "the provider type eg ec2, openstack")107 f.StringVar(&c.providerType, "p", "", "the provider type eg ec2, openstack")
109 f.StringVar(&c.metadataDir, "d", "", "directory where metadata files are found")108 f.StringVar(&c.metadataDir, "d", "", "directory where metadata files are found")
@@ -118,9 +117,6 @@
118}117}
119118
120func (c *ValidateToolsMetadataCommand) Init(args []string) error {119func (c *ValidateToolsMetadataCommand) Init(args []string) error {
121 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
122 return err
123 }
124 if c.providerType != "" {120 if c.providerType != "" {
125 if c.region == "" {121 if c.region == "" {
126 return fmt.Errorf("region required if provider type is specified")122 return fmt.Errorf("region required if provider type is specified")
127123
=== modified file 'cmd/plugins/juju-metadata/validatetoolsmetadata_test.go'
--- cmd/plugins/juju-metadata/validatetoolsmetadata_test.go 2014-03-18 15:43:41 +0000
+++ cmd/plugins/juju-metadata/validatetoolsmetadata_test.go 2014-05-12 11:08:32 +0000
@@ -11,6 +11,7 @@
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/cmd/envcmd"
14 "launchpad.net/juju-core/environs/filestorage"15 "launchpad.net/juju-core/environs/filestorage"
15 "launchpad.net/juju-core/environs/tools"16 "launchpad.net/juju-core/environs/tools"
16 coretesting "launchpad.net/juju-core/testing"17 coretesting "launchpad.net/juju-core/testing"
@@ -27,7 +28,7 @@
27var _ = gc.Suite(&ValidateToolsMetadataSuite{})28var _ = gc.Suite(&ValidateToolsMetadataSuite{})
2829
29func runValidateToolsMetadata(c *gc.C, args ...string) error {30func runValidateToolsMetadata(c *gc.C, args ...string) error {
30 _, err := coretesting.RunCommand(c, &ValidateToolsMetadataCommand{}, args)31 _, err := coretesting.RunCommand(c, envcmd.Wrap(&ValidateToolsMetadataCommand{}), args)
31 return err32 return err
32}33}
3334
@@ -56,7 +57,7 @@
56func (s *ValidateToolsMetadataSuite) TestInitErrors(c *gc.C) {57func (s *ValidateToolsMetadataSuite) TestInitErrors(c *gc.C) {
57 for i, t := range validateInitToolsErrorTests {58 for i, t := range validateInitToolsErrorTests {
58 c.Logf("test %d", i)59 c.Logf("test %d", i)
59 err := coretesting.InitCommand(&ValidateToolsMetadataCommand{}, t.args)60 err := coretesting.InitCommand(envcmd.Wrap(&ValidateToolsMetadataCommand{}), t.args)
60 c.Check(err, gc.ErrorMatches, t.err)61 c.Check(err, gc.ErrorMatches, t.err)
61 }62 }
62}63}
@@ -112,7 +113,7 @@
112 s.setupEc2LocalMetadata(c, "us-east-1")113 s.setupEc2LocalMetadata(c, "us-east-1")
113 ctx := coretesting.Context(c)114 ctx := coretesting.Context(c)
114 code := cmd.Main(115 code := cmd.Main(
115 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir},116 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir},
116 )117 )
117 c.Assert(code, gc.Equals, 0)118 c.Assert(code, gc.Equals, 0)
118 errOut := ctx.Stdout.(*bytes.Buffer).String()119 errOut := ctx.Stdout.(*bytes.Buffer).String()
@@ -126,7 +127,7 @@
126 s.setupEc2LocalMetadata(c, "us-east-1")127 s.setupEc2LocalMetadata(c, "us-east-1")
127 ctx := coretesting.Context(c)128 ctx := coretesting.Context(c)
128 code := cmd.Main(129 code := cmd.Main(
129 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4"},130 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4"},
130 )131 )
131 c.Assert(code, gc.Equals, 1)132 c.Assert(code, gc.Equals, 1)
132 errOut := ctx.Stderr.(*bytes.Buffer).String()133 errOut := ctx.Stderr.(*bytes.Buffer).String()
@@ -138,7 +139,7 @@
138 s.setupEc2LocalMetadata(c, "us-west-1")139 s.setupEc2LocalMetadata(c, "us-west-1")
139 ctx := coretesting.Context(c)140 ctx := coretesting.Context(c)
140 code := cmd.Main(141 code := cmd.Main(
141 &ValidateToolsMetadataCommand{}, ctx, []string{142 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
142 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4",143 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4",
143 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},144 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
144 )145 )
@@ -152,13 +153,13 @@
152 s.setupEc2LocalMetadata(c, "us-east-1")153 s.setupEc2LocalMetadata(c, "us-east-1")
153 ctx := coretesting.Context(c)154 ctx := coretesting.Context(c)
154 code := cmd.Main(155 code := cmd.Main(
155 &ValidateToolsMetadataCommand{}, ctx, []string{156 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
156 "-p", "ec2", "-s", "raring", "-r", "us-west-1",157 "-p", "ec2", "-s", "raring", "-r", "us-west-1",
157 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},158 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
158 )159 )
159 c.Assert(code, gc.Equals, 1)160 c.Assert(code, gc.Equals, 1)
160 code = cmd.Main(161 code = cmd.Main(
161 &ValidateToolsMetadataCommand{}, ctx, []string{162 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
162 "-p", "ec2", "-s", "precise", "-r", "region",163 "-p", "ec2", "-s", "precise", "-r", "region",
163 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},164 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},
164 )165 )
@@ -172,7 +173,7 @@
172 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")173 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
173 ctx := coretesting.Context(c)174 ctx := coretesting.Context(c)
174 code := cmd.Main(175 code := cmd.Main(
175 &ValidateToolsMetadataCommand{}, ctx, []string{176 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
176 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4",177 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4",
177 "-u", "some-auth-url", "-d", s.metadataDir},178 "-u", "some-auth-url", "-d", s.metadataDir},
178 )179 )
@@ -186,13 +187,13 @@
186 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")187 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
187 ctx := coretesting.Context(c)188 ctx := coretesting.Context(c)
188 code := cmd.Main(189 code := cmd.Main(
189 &ValidateToolsMetadataCommand{}, ctx, []string{190 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
190 "-p", "openstack", "-s", "precise", "-r", "region-2",191 "-p", "openstack", "-s", "precise", "-r", "region-2",
191 "-u", "some-auth-url", "-d", s.metadataDir},192 "-u", "some-auth-url", "-d", s.metadataDir},
192 )193 )
193 c.Assert(code, gc.Equals, 1)194 c.Assert(code, gc.Equals, 1)
194 code = cmd.Main(195 code = cmd.Main(
195 &ValidateToolsMetadataCommand{}, ctx, []string{196 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
196 "-p", "openstack", "-s", "raring", "-r", "region-3",197 "-p", "openstack", "-s", "raring", "-r", "region-3",
197 "-u", "some-auth-url", "-d", s.metadataDir},198 "-u", "some-auth-url", "-d", s.metadataDir},
198 )199 )
@@ -206,7 +207,7 @@
206 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")207 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")
207 ctx := coretesting.Context(c)208 ctx := coretesting.Context(c)
208 code := cmd.Main(209 code := cmd.Main(
209 &ValidateToolsMetadataCommand{}, ctx, []string{210 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
210 "-p", "openstack", "-s", "raring", "-r", "region-2",211 "-p", "openstack", "-s", "raring", "-r", "region-2",
211 "-u", "some-auth-url", "-d", s.metadataDir},212 "-u", "some-auth-url", "-d", s.metadataDir},
212 )213 )
@@ -220,7 +221,7 @@
220 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")221 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
221 ctx := coretesting.Context(c)222 ctx := coretesting.Context(c)
222 code := cmd.Main(223 code := cmd.Main(
223 &ValidateToolsMetadataCommand{}, ctx, []string{224 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
224 "-p", "openstack", "-s", "raring", "-r", "region-2",225 "-p", "openstack", "-s", "raring", "-r", "region-2",
225 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"},226 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"},
226 )227 )
@@ -234,7 +235,7 @@
234 s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url")235 s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url")
235 ctx := coretesting.Context(c)236 ctx := coretesting.Context(c)
236 code := cmd.Main(237 code := cmd.Main(
237 &ValidateToolsMetadataCommand{}, ctx, []string{238 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
238 "-p", "openstack", "-s", "raring", "-r", "region-2",239 "-p", "openstack", "-s", "raring", "-r", "region-2",
239 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"},240 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"},
240 )241 )
@@ -248,7 +249,7 @@
248 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")249 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")
249 ctx := coretesting.Context(c)250 ctx := coretesting.Context(c)
250 code := cmd.Main(251 code := cmd.Main(
251 &ValidateToolsMetadataCommand{}, ctx, []string{"-s", "raring", "-d", s.metadataDir},252 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-s", "raring", "-d", s.metadataDir},
252 )253 )
253 c.Assert(code, gc.Equals, 0)254 c.Assert(code, gc.Equals, 0)
254 errOut := ctx.Stdout.(*bytes.Buffer).String()255 errOut := ctx.Stdout.(*bytes.Buffer).String()
255256
=== modified file 'cmd/plugins/juju-restore/restore.go'
--- cmd/plugins/juju-restore/restore.go 2014-05-09 13:24:50 +0000
+++ cmd/plugins/juju-restore/restore.go 2014-05-12 11:08:32 +0000
@@ -48,7 +48,7 @@
48 fmt.Fprintf(os.Stderr, "error: %s\n", err)48 fmt.Fprintf(os.Stderr, "error: %s\n", err)
49 os.Exit(2)49 os.Exit(2)
50 }50 }
51 os.Exit(cmd.Main(&restoreCommand{}, ctx, args[1:]))51 os.Exit(cmd.Main(envcmd.Wrap(&restoreCommand{}), ctx, args[1:]))
52}52}
5353
54var logger = loggo.GetLogger("juju.plugins.restore")54var logger = loggo.GetLogger("juju.plugins.restore")
@@ -82,16 +82,12 @@
82}82}
8383
84func (c *restoreCommand) SetFlags(f *gnuflag.FlagSet) {84func (c *restoreCommand) SetFlags(f *gnuflag.FlagSet) {
85 c.EnvCommandBase.SetFlags(f)
86 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "set environment constraints")85 f.Var(constraints.ConstraintsValue{Target: &c.Constraints}, "constraints", "set environment constraints")
87 f.BoolVar(&c.showDescription, "description", false, "show the purpose of this plugin")86 f.BoolVar(&c.showDescription, "description", false, "show the purpose of this plugin")
88 c.Log.AddFlags(f)87 c.Log.AddFlags(f)
89}88}
9089
91func (c *restoreCommand) Init(args []string) error {90func (c *restoreCommand) Init(args []string) error {
92 if err := c.EnvCommandBase.EnsureEnvName(); err != nil {
93 return err
94 }
95 if c.showDescription {91 if c.showDescription {
96 return cmd.CheckEmpty(args)92 return cmd.CheckEmpty(args)
97 }93 }

Subscribers

People subscribed via source and target branches

to status/vote changes: