Merge lp:~axwalk/juju-core/lp1279259-part1-prepare-context 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: 2335
Proposed branch: lp:~axwalk/juju-core/lp1279259-part1-prepare-context
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 1921 lines (+223/-273)
58 files modified
cmd/cmd.go (+17/-2)
cmd/juju/bootstrap.go (+3/-21)
cmd/juju/bootstrap_test.go (+1/-1)
cmd/juju/destroyenvironment_test.go (+5/-5)
cmd/juju/synctools.go (+1/-1)
cmd/juju/synctools_test.go (+1/-1)
cmd/plugins/juju-metadata/imagemetadata.go (+11/-4)
cmd/plugins/juju-metadata/imagemetadata_test.go (+1/-1)
cmd/plugins/juju-metadata/toolsmetadata_test.go (+1/-1)
cmd/plugins/juju-metadata/validateimagemetadata.go (+1/-1)
cmd/plugins/juju-metadata/validatetoolsmetadata.go (+1/-1)
cmd/plugins/juju-restore/restore.go (+3/-26)
environs/bootstrap/bootstrap_test.go (+9/-14)
environs/emptystorage_test.go (+4/-2)
environs/imagemetadata/urls_test.go (+1/-1)
environs/interface.go (+4/-4)
environs/jujutest/livetests.go (+5/-5)
environs/jujutest/tests.go (+3/-7)
environs/manual/bootstrap.go (+1/-1)
environs/manual/bootstrap_test.go (+1/-2)
environs/open.go (+6/-6)
environs/open_test.go (+25/-15)
environs/storage/storage_test.go (+1/-1)
environs/sync/sync_test.go (+2/-2)
environs/testing/bootstrap.go (+0/-23)
environs/tools/storage_test.go (+2/-1)
environs/tools/tools_test.go (+2/-1)
environs/tools/urls_test.go (+1/-1)
juju/apiconn_test.go (+3/-2)
juju/conn_test.go (+18/-16)
juju/testing/conn.go (+2/-2)
provider/azure/environprovider.go (+1/-1)
provider/common/bootstrap.go (+7/-7)
provider/common/bootstrap_test.go (+19/-28)
provider/dummy/config_test.go (+4/-2)
provider/dummy/environs.go (+1/-1)
provider/ec2/config_test.go (+4/-3)
provider/ec2/ec2.go (+1/-1)
provider/ec2/local_test.go (+6/-10)
provider/joyent/config_test.go (+1/-1)
provider/joyent/provider.go (+1/-1)
provider/local/config_test.go (+2/-3)
provider/local/environ.go (+2/-2)
provider/local/environ_test.go (+2/-2)
provider/local/environprovider.go (+1/-1)
provider/local/environprovider_test.go (+2/-2)
provider/maas/environ_whitebox_test.go (+5/-9)
provider/maas/environprovider.go (+1/-1)
provider/maas/environprovider_test.go (+4/-2)
provider/manual/environ.go (+1/-1)
provider/manual/environ_test.go (+1/-2)
provider/manual/provider.go (+1/-1)
provider/manual/provider_test.go (+4/-3)
provider/openstack/config_test.go (+4/-3)
provider/openstack/live_test.go (+1/-1)
provider/openstack/local_test.go (+8/-12)
provider/openstack/provider.go (+1/-1)
state/apiserver/common/environwatcher_test.go (+2/-1)
To merge this branch: bzr merge lp:~axwalk/juju-core/lp1279259-part1-prepare-context
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+206082@code.launchpad.net

Commit message

Pass environs.BootstrapContext to Prepare

This is part one of fixing lp:1279259.
In this CL, we pass context to Prepare,
giving providers an opportunity to prompt
the user to initialise an environment.

Passing context was previously restricted to
Bootstrap and EnableBootstrapStorage; this is
insufficient, as there are many ways to prepare
an environment. It is currently possible to
successfully "Prepare" and environment, but
for the result to be unusable in the manual
provider (e.g. if the bootstrap-host address is
invalid). We should that a successfully Prepared
environment should be able to be Destroyed
(with force).

https://codereview.appspot.com/62780044/

Description of the change

Pass environs.BootstrapContext to Prepare

This is part one of fixing lp:1279259.
In this CL, we pass context to Prepare,
giving providers an opportunity to prompt
the user to initialise an environment.

Passing context was previously restricted to
Bootstrap and EnableBootstrapStorage; this is
insufficient, as there are many ways to prepare
an environment. It is currently possible to
successfully "Prepare" and environment, but
for the result to be unusable in the manual
provider (e.g. if the bootstrap-host address is
invalid). We should that a successfully Prepared
environment should be able to be Destroyed
(with force).

The next CL will remove BootstrapStorager and fix
lp:1279259 by initialising the ubuntu user during
Prepare.

https://codereview.appspot.com/62780044/

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

Reviewers: mp+206082_code.launchpad.net,

Message:
Please take a look.

Description:
Pass environs.BootstrapContext to Prepare

This is part one of fixing lp:1279259.
In this CL, we pass context to Prepare,
giving providers an opportunity to prompt
the user to initialise an environment.

Passing context was previously restricted to
Bootstrap and EnableBootstrapStorage; this is
insufficient, as there are many ways to prepare
an environment. It is currently possible to
successfully "Prepare" and environment, but
for the result to be unusable in the manual
provider (e.g. if the bootstrap-host address is
invalid). We should that a successfully Prepared
environment should be able to be Destroyed
(with force).

The next CL will remove BootstrapStorager and fix
lp:1279259 by initialising the ubuntu user during
Prepare.

https://code.launchpad.net/~axwalk/juju-core/lp1279259-part1-prepare-context/+merge/206082

(do not edit description out of merge proposal)

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

Affected files (+223, -270 lines):
   [revision details]
   cmd/cmd.go
   cmd/juju/bootstrap.go
   cmd/juju/bootstrap_test.go
   cmd/juju/destroyenvironment_test.go
   cmd/juju/synctools.go
   cmd/juju/synctools_test.go
   cmd/plugins/juju-metadata/imagemetadata.go
   cmd/plugins/juju-metadata/imagemetadata_test.go
   cmd/plugins/juju-metadata/toolsmetadata_test.go
   cmd/plugins/juju-metadata/validateimagemetadata.go
   cmd/plugins/juju-metadata/validatetoolsmetadata.go
   cmd/plugins/juju-restore/restore.go
   environs/bootstrap/bootstrap_test.go
   environs/emptystorage_test.go
   environs/imagemetadata/urls_test.go
   environs/interface.go
   environs/jujutest/livetests.go
   environs/jujutest/tests.go
   environs/manual/bootstrap.go
   environs/manual/bootstrap_test.go
   environs/open.go
   environs/open_test.go
   environs/storage/storage_test.go
   environs/sync/sync_test.go
   environs/testing/bootstrap.go
   environs/tools/storage_test.go
   environs/tools/tools_test.go
   environs/tools/urls_test.go
   juju/apiconn_test.go
   juju/conn_test.go
   juju/testing/conn.go
   provider/azure/environprovider.go
   provider/common/bootstrap.go
   provider/common/bootstrap_test.go
   provider/dummy/config_test.go
   provider/dummy/environs.go
   provider/ec2/config_test.go
   provider/ec2/ec2.go
   provider/ec2/local_test.go
   provider/joyent/config_test.go
   provider/joyent/provider.go
   provider/local/config_test.go
   provider/local/environ.go
   provider/local/environ_test.go
   provider/local/environprovider.go
   provider/local/environprovider_test.go
   provider/maas/environ_whitebox_test.go
   provider/maas/environprovider.go
   provider/maas/environprovider_test.go
   provider/manual/environ.go
   provider/manual/environ_test.go
   provider/manual/provider.go
   provider/manual/provider_test.go
   provider/openstack/config_test.go
   provider/openstack/live_test.go
   provider/openstack/local_test.go
   provider/openstack/provider.go
   state/apiserver/common/environwatcher_test.go

Revision history for this message
Dimiter Naydenov (dimitern) wrote :

The diff is missing, repropose please.

https://codereview.appspot.com/62780044/

Revision history for this message
Andrew Wilkins (axwalk) wrote :
Revision history for this message
William Reade (fwereade) wrote :
Revision history for this message
Go Bot (go-bot) wrote :
Download full text (9.8 KiB)

The attempt to merge lp:~axwalk/juju-core/lp1279259-part1-prepare-context into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core 0.015s
ok launchpad.net/juju-core/agent 1.190s
ok launchpad.net/juju-core/agent/tools 0.259s
ok launchpad.net/juju-core/bzr 6.740s
ok launchpad.net/juju-core/cert 2.988s
ok launchpad.net/juju-core/charm 0.530s
? 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.035s
ok launchpad.net/juju-core/cloudinit/sshinit 1.128s
ok launchpad.net/juju-core/cmd 0.230s
ok launchpad.net/juju-core/cmd/charm-admin 0.788s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/juju 239.741s
ok launchpad.net/juju-core/cmd/jujud 61.496s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 10.401s
? launchpad.net/juju-core/cmd/plugins/juju-restore [no test files]
ok launchpad.net/juju-core/constraints 0.027s
ok launchpad.net/juju-core/container 0.037s
ok launchpad.net/juju-core/container/factory 0.051s
ok launchpad.net/juju-core/container/kvm 0.288s
ok launchpad.net/juju-core/container/kvm/mock 0.038s
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 0.268s
? 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.267s
ok launchpad.net/juju-core/environs 3.120s
ok launchpad.net/juju-core/environs/bootstrap 4.481s
ok launchpad.net/juju-core/environs/cloudinit 0.646s
ok launchpad.net/juju-core/environs/config 4.303s
ok launchpad.net/juju-core/environs/configstore 0.038s
ok launchpad.net/juju-core/environs/filestorage 0.032s
ok launchpad.net/juju-core/environs/httpstorage 0.965s
ok launchpad.net/juju-core/environs/imagemetadata 0.611s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.061s
ok launchpad.net/juju-core/environs/jujutest 0.351s
ok launchpad.net/juju-core/environs/manual 10.041s
ok launchpad.net/juju-core/environs/simplestreams 0.408s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 1.157s
ok launchpad.net/juju-core/environs/storage 1.201s
ok launchpad.net/juju-core/environs/sync 33.427s
ok launchpad.net/juju-core/environs/testing 0.234s
ok launchpad.net/juju-core/environs/tools 6.893s
? 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.023s
? launchpad.net/juju-core/instance/testing [no test files]
ok launchpad.net/juju-core/juju 23.668s
ok launchpad.net/juju-core/juju/osenv 0.019s
? launchpad.net/juju-core/juju/testing [no test files]
ok launchpad.net/juju-core/log 0.015s
ok launchpad.net/juju-core/log/syslog 0.023s
? launchpad.net/j...

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 2013-12-19 09:15:40 +0000
+++ cmd/cmd.go 2014-02-18 02:14:09 +0000
@@ -112,12 +112,27 @@
112 return filepath.Join(ctx.Dir, path)112 return filepath.Join(ctx.Dir, path)
113}113}
114114
115// InterruptNotify partially satisfies environs/bootstrap.BootstrapContext115// GetStdin satisfies environs.BootstrapContext
116func (ctx *Context) GetStdin() io.Reader {
117 return ctx.Stdin
118}
119
120// GetStdout satisfies environs.BootstrapContext
121func (ctx *Context) GetStdout() io.Writer {
122 return ctx.Stdout
123}
124
125// GetStderr satisfies environs.BootstrapContext
126func (ctx *Context) GetStderr() io.Writer {
127 return ctx.Stderr
128}
129
130// InterruptNotify satisfies environs.BootstrapContext
116func (ctx *Context) InterruptNotify(c chan<- os.Signal) {131func (ctx *Context) InterruptNotify(c chan<- os.Signal) {
117 signal.Notify(c, os.Interrupt)132 signal.Notify(c, os.Interrupt)
118}133}
119134
120// StopInterruptNotify partially satisfies environs/bootstrap.BootstrapContext135// StopInterruptNotify satisfies environs.BootstrapContext
121func (ctx *Context) StopInterruptNotify(c chan<- os.Signal) {136func (ctx *Context) StopInterruptNotify(c chan<- os.Signal) {
122 signal.Stop(c)137 signal.Stop(c)
123}138}
124139
=== modified file 'cmd/juju/bootstrap.go'
--- cmd/juju/bootstrap.go 2014-02-11 01:35:20 +0000
+++ cmd/juju/bootstrap.go 2014-02-18 02:14:09 +0000
@@ -5,7 +5,6 @@
55
6import (6import (
7 "fmt"7 "fmt"
8 "io"
9 "os"8 "os"
10 "strings"9 "strings"
1110
@@ -97,22 +96,6 @@
97 return cmd.CheckEmpty(args)96 return cmd.CheckEmpty(args)
98}97}
9998
100type bootstrapContext struct {
101 *cmd.Context
102}
103
104func (c bootstrapContext) Stdin() io.Reader {
105 return c.Context.Stdin
106}
107
108func (c bootstrapContext) Stdout() io.Writer {
109 return c.Context.Stdout
110}
111
112func (c bootstrapContext) Stderr() io.Writer {
113 return c.Context.Stderr
114}
115
116func destroyPreparedEnviron(env environs.Environ, store configstore.Storage, err *error, action string) {99func destroyPreparedEnviron(env environs.Environ, store configstore.Storage, err *error, action string) {
117 if *err == nil {100 if *err == nil {
118 return101 return
@@ -134,18 +117,17 @@
134 if _, err := store.ReadInfo(c.EnvName); !errors.IsNotFoundError(err) {117 if _, err := store.ReadInfo(c.EnvName); !errors.IsNotFoundError(err) {
135 existing = true118 existing = true
136 }119 }
137 environ, err := environs.PrepareFromName(c.EnvName, store)120 environ, err := environs.PrepareFromName(c.EnvName, ctx, store)
138 if err != nil {121 if err != nil {
139 return err122 return err
140 }123 }
141 if !existing {124 if !existing {
142 defer destroyPreparedEnviron(environ, store, &resultErr, "Bootstrap")125 defer destroyPreparedEnviron(environ, store, &resultErr, "Bootstrap")
143 }126 }
144 bootstrapContext := bootstrapContext{ctx}
145 // If the environment has a special bootstrap Storage, use it wherever127 // If the environment has a special bootstrap Storage, use it wherever
146 // we'd otherwise use environ.Storage.128 // we'd otherwise use environ.Storage.
147 if bs, ok := environ.(environs.BootstrapStorager); ok {129 if bs, ok := environ.(environs.BootstrapStorager); ok {
148 if err := bs.EnableBootstrapStorage(bootstrapContext); err != nil {130 if err := bs.EnableBootstrapStorage(ctx); err != nil {
149 return errgo.Annotate(err, "failed to enable bootstrap storage")131 return errgo.Annotate(err, "failed to enable bootstrap storage")
150 }132 }
151 }133 }
@@ -179,7 +161,7 @@
179 return err161 return err
180 }162 }
181 }163 }
182 return bootstrap.Bootstrap(bootstrapContext, environ, c.Constraints)164 return bootstrap.Bootstrap(ctx, environ, c.Constraints)
183}165}
184166
185func (c *BootstrapCommand) uploadTools(environ environs.Environ) error {167func (c *BootstrapCommand) uploadTools(environ environs.Environ) error {
186168
=== modified file 'cmd/juju/bootstrap_test.go'
--- cmd/juju/bootstrap_test.go 2014-02-03 06:58:26 +0000
+++ cmd/juju/bootstrap_test.go 2014-02-18 02:14:09 +0000
@@ -516,7 +516,7 @@
516 dummy.Reset()516 dummy.Reset()
517 store, err := configstore.Default()517 store, err := configstore.Default()
518 c.Assert(err, gc.IsNil)518 c.Assert(err, gc.IsNil)
519 env, err := environs.PrepareFromName("peckham", store)519 env, err := environs.PrepareFromName("peckham", nullContext(), store)
520 c.Assert(err, gc.IsNil)520 c.Assert(err, gc.IsNil)
521 envtesting.RemoveAllTools(c, env)521 envtesting.RemoveAllTools(c, env)
522 return env, fake522 return env, fake
523523
=== modified file 'cmd/juju/destroyenvironment_test.go'
--- cmd/juju/destroyenvironment_test.go 2014-02-03 09:09:49 +0000
+++ cmd/juju/destroyenvironment_test.go 2014-02-18 02:14:09 +0000
@@ -27,7 +27,7 @@
2727
28func (s *destroyEnvSuite) TestDestroyEnvironmentCommand(c *gc.C) {28func (s *destroyEnvSuite) TestDestroyEnvironmentCommand(c *gc.C) {
29 // Prepare the environment so we can destroy it.29 // Prepare the environment so we can destroy it.
30 _, err := environs.PrepareFromName("dummyenv", s.ConfigStore)30 _, err := environs.PrepareFromName("dummyenv", nullContext(), s.ConfigStore)
31 c.Assert(err, gc.IsNil)31 c.Assert(err, gc.IsNil)
3232
33 // check environment is mandatory33 // check environment is mandatory
@@ -46,7 +46,7 @@
4646
47func (s *destroyEnvSuite) TestDestroyEnvironmentCommandEFlag(c *gc.C) {47func (s *destroyEnvSuite) TestDestroyEnvironmentCommandEFlag(c *gc.C) {
48 // Prepare the environment so we can destroy it.48 // Prepare the environment so we can destroy it.
49 _, err := environs.PrepareFromName("dummyenv", s.ConfigStore)49 _, err := environs.PrepareFromName("dummyenv", nullContext(), s.ConfigStore)
50 c.Assert(err, gc.IsNil)50 c.Assert(err, gc.IsNil)
5151
52 // check that either environment or the flag is mandatory52 // check that either environment or the flag is mandatory
@@ -89,7 +89,7 @@
89 c.Assert(err, gc.IsNil)89 c.Assert(err, gc.IsNil)
9090
91 // Prepare the environment so we can destroy it.91 // Prepare the environment so we can destroy it.
92 _, err = environs.PrepareFromName("dummyenv", s.ConfigStore)92 _, err = environs.PrepareFromName("dummyenv", nullContext(), s.ConfigStore)
93 c.Assert(err, gc.IsNil)93 c.Assert(err, gc.IsNil)
9494
95 // destroy with broken environment95 // destroy with broken environment
@@ -122,7 +122,7 @@
122 ctx.Stdin = &stdin122 ctx.Stdin = &stdin
123123
124 // Prepare the environment so we can destroy it.124 // Prepare the environment so we can destroy it.
125 env, err := environs.PrepareFromName("dummyenv", s.ConfigStore)125 env, err := environs.PrepareFromName("dummyenv", nullContext(), s.ConfigStore)
126 c.Assert(err, gc.IsNil)126 c.Assert(err, gc.IsNil)
127127
128 assertEnvironNotDestroyed(c, env, s.ConfigStore)128 assertEnvironNotDestroyed(c, env, s.ConfigStore)
@@ -156,7 +156,7 @@
156 for _, answer := range []string{"y", "Y", "yes", "YES"} {156 for _, answer := range []string{"y", "Y", "yes", "YES"} {
157 // Prepare the environment so we can destroy it.157 // Prepare the environment so we can destroy it.
158 s.Reset(c)158 s.Reset(c)
159 env, err := environs.PrepareFromName("dummyenv", s.ConfigStore)159 env, err := environs.PrepareFromName("dummyenv", nullContext(), s.ConfigStore)
160 c.Assert(err, gc.IsNil)160 c.Assert(err, gc.IsNil)
161161
162 stdin.Reset()162 stdin.Reset()
163163
=== modified file 'cmd/juju/synctools.go'
--- cmd/juju/synctools.go 2014-02-17 21:23:26 +0000
+++ cmd/juju/synctools.go 2014-02-18 02:14:09 +0000
@@ -92,7 +92,7 @@
92 if _, err := store.ReadInfo(c.EnvName); !errors.IsNotFoundError(err) {92 if _, err := store.ReadInfo(c.EnvName); !errors.IsNotFoundError(err) {
93 existing = true93 existing = true
94 }94 }
95 environ, err := environs.PrepareFromName(c.EnvName, store)95 environ, err := environs.PrepareFromName(c.EnvName, ctx, store)
96 if err != nil {96 if err != nil {
97 return err97 return err
98 }98 }
9999
=== modified file 'cmd/juju/synctools_test.go'
--- cmd/juju/synctools_test.go 2014-02-17 21:23:26 +0000
+++ cmd/juju/synctools_test.go 2014-02-18 02:14:09 +0000
@@ -125,7 +125,7 @@
125func (s *syncToolsSuite) TestSyncToolsCommand(c *gc.C) {125func (s *syncToolsSuite) TestSyncToolsCommand(c *gc.C) {
126 for i, test := range syncToolsCommandTests {126 for i, test := range syncToolsCommandTests {
127 c.Logf("test %d: %s", i, test.description)127 c.Logf("test %d: %s", i, test.description)
128 targetEnv, err := environs.PrepareFromName("test-target", s.configStore)128 targetEnv, err := environs.PrepareFromName("test-target", nullContext(), s.configStore)
129 c.Assert(err, gc.IsNil)129 c.Assert(err, gc.IsNil)
130 called := false130 called := false
131 syncTools = func(sctx *sync.SyncContext) error {131 syncTools = func(sctx *sync.SyncContext) error {
132132
=== modified file 'cmd/plugins/juju-metadata/imagemetadata.go'
--- cmd/plugins/juju-metadata/imagemetadata.go 2014-01-31 00:14:11 +0000
+++ cmd/plugins/juju-metadata/imagemetadata.go 2014-02-18 02:14:09 +0000
@@ -61,10 +61,16 @@
61}61}
6262
63func (c *ImageMetadataCommand) Init(args []string) error {63func (c *ImageMetadataCommand) Init(args []string) error {
64 return cmd.CheckEmpty(args)
65}
66
67// setParams sets parameters based on the environment configuration
68// for those which have not been explicitly specified.
69func (c *ImageMetadataCommand) setParams(context *cmd.Context) error {
64 c.privateStorage = "<private storage name>"70 c.privateStorage = "<private storage name>"
65 var environ environs.Environ71 var environ environs.Environ
66 if store, err := configstore.Default(); err == nil {72 if store, err := configstore.Default(); err == nil {
67 if environ, err = environs.PrepareFromName(c.EnvName, store); err == nil {73 if environ, err = environs.PrepareFromName(c.EnvName, context, store); err == nil {
68 logger.Infof("creating image metadata for environment %q", environ.Name())74 logger.Infof("creating image metadata for environment %q", environ.Name())
69 // If the user has not specified region and endpoint, try and get it from the environment.75 // If the user has not specified region and endpoint, try and get it from the environment.
70 if c.Region == "" || c.Endpoint == "" {76 if c.Region == "" || c.Endpoint == "" {
@@ -120,8 +126,7 @@
120 return err126 return err
121 }127 }
122 }128 }
123129 return nil
124 return cmd.CheckEmpty(args)
125}130}
126131
127var helpDoc = `132var helpDoc = `
@@ -143,8 +148,10 @@
143`148`
144149
145func (c *ImageMetadataCommand) Run(context *cmd.Context) error {150func (c *ImageMetadataCommand) Run(context *cmd.Context) error {
151 if err := c.setParams(context); err != nil {
152 return err
153 }
146 out := context.Stdout154 out := context.Stdout
147
148 im := &imagemetadata.ImageMetadata{155 im := &imagemetadata.ImageMetadata{
149 Id: c.ImageId,156 Id: c.ImageId,
150 Arch: c.Arch,157 Arch: c.Arch,
151158
=== modified file 'cmd/plugins/juju-metadata/imagemetadata_test.go'
--- cmd/plugins/juju-metadata/imagemetadata_test.go 2013-11-04 00:24:21 +0000
+++ cmd/plugins/juju-metadata/imagemetadata_test.go 2014-02-18 02:14:09 +0000
@@ -228,6 +228,6 @@
228 c.Logf("test: %d", i)228 c.Logf("test: %d", i)
229 ctx := testing.Context(c)229 ctx := testing.Context(c)
230 code := cmd.Main(&ImageMetadataCommand{}, ctx, t.args)230 code := cmd.Main(&ImageMetadataCommand{}, ctx, t.args)
231 c.Check(code, gc.Equals, 2)231 c.Check(code, gc.Equals, 1)
232 }232 }
233}233}
234234
=== modified file 'cmd/plugins/juju-metadata/toolsmetadata_test.go'
--- cmd/plugins/juju-metadata/toolsmetadata_test.go 2014-01-31 04:29:28 +0000
+++ cmd/plugins/juju-metadata/toolsmetadata_test.go 2014-02-18 02:14:09 +0000
@@ -43,7 +43,7 @@
43 dummy.Reset()43 dummy.Reset()
44 loggo.ResetLoggers()44 loggo.ResetLoggers()
45 })45 })
46 env, err := environs.PrepareFromName("erewhemos", configstore.NewMem())46 env, err := environs.PrepareFromName("erewhemos", coretesting.Context(c), configstore.NewMem())
47 c.Assert(err, gc.IsNil)47 c.Assert(err, gc.IsNil)
48 s.env = env48 s.env = env
49 envtesting.RemoveAllTools(c, s.env)49 envtesting.RemoveAllTools(c, s.env)
5050
=== modified file 'cmd/plugins/juju-metadata/validateimagemetadata.go'
--- cmd/plugins/juju-metadata/validateimagemetadata.go 2014-01-29 06:45:16 +0000
+++ cmd/plugins/juju-metadata/validateimagemetadata.go 2014-02-18 02:14:09 +0000
@@ -134,7 +134,7 @@
134 if err != nil {134 if err != nil {
135 return err135 return err
136 }136 }
137 environ, err := environs.PrepareFromName(c.EnvName, store)137 environ, err := environs.PrepareFromName(c.EnvName, context, store)
138 if err != nil {138 if err != nil {
139 return err139 return err
140 }140 }
141141
=== modified file 'cmd/plugins/juju-metadata/validatetoolsmetadata.go'
--- cmd/plugins/juju-metadata/validatetoolsmetadata.go 2013-10-10 11:40:54 +0000
+++ cmd/plugins/juju-metadata/validatetoolsmetadata.go 2014-02-18 02:14:09 +0000
@@ -141,7 +141,7 @@
141 if err != nil {141 if err != nil {
142 return err142 return err
143 }143 }
144 environ, err := environs.PrepareFromName(c.EnvName, store)144 environ, err := environs.PrepareFromName(c.EnvName, context, store)
145 if err == nil {145 if err == nil {
146 mdLookup, ok := environ.(simplestreams.MetadataValidator)146 mdLookup, ok := environ.(simplestreams.MetadataValidator)
147 if !ok {147 if !ok {
148148
=== modified file 'cmd/plugins/juju-restore/restore.go'
--- cmd/plugins/juju-restore/restore.go 2014-02-06 11:18:27 +0000
+++ cmd/plugins/juju-restore/restore.go 2014-02-18 02:14:09 +0000
@@ -12,7 +12,6 @@
12 "io/ioutil"12 "io/ioutil"
13 "os"13 "os"
14 "os/exec"14 "os/exec"
15 "os/signal"
16 "path"15 "path"
17 "text/template"16 "text/template"
1817
@@ -154,7 +153,7 @@
154 if err != nil {153 if err != nil {
155 return err154 return err
156 }155 }
157 env, err := rebootstrap(cfg, c.Constraints)156 env, err := rebootstrap(cfg, ctx, c.Constraints)
158 if err != nil {157 if err != nil {
159 return fmt.Errorf("cannot re-bootstrap environment: %v", err)158 return fmt.Errorf("cannot re-bootstrap environment: %v", err)
160 }159 }
@@ -203,7 +202,7 @@
203 fmt.Printf("%s\n", fmt.Sprintf(f, a...))202 fmt.Printf("%s\n", fmt.Sprintf(f, a...))
204}203}
205204
206func rebootstrap(cfg *config.Config, cons constraints.Value) (environs.Environ, error) {205func rebootstrap(cfg *config.Config, ctx *cmd.Context, cons constraints.Value) (environs.Environ, error) {
207 progress("re-bootstrapping environment")206 progress("re-bootstrapping environment")
208 // Turn on safe mode so that the newly bootstrapped instance207 // Turn on safe mode so that the newly bootstrapped instance
209 // will not destroy all the instances it does not know about.208 // will not destroy all the instances it does not know about.
@@ -245,7 +244,7 @@
245 // error-prone) or we could provide a --no-check flag to make244 // error-prone) or we could provide a --no-check flag to make
246 // it go ahead anyway without the check.245 // it go ahead anyway without the check.
247246
248 if err := bootstrap.Bootstrap(bootstrapContext{}, env, cons); err != nil {247 if err := bootstrap.Bootstrap(ctx, env, cons); err != nil {
249 return nil, fmt.Errorf("cannot bootstrap new instance: %v", err)248 return nil, fmt.Errorf("cannot bootstrap new instance: %v", err)
250 }249 }
251 return env, nil250 return env, nil
@@ -462,25 +461,3 @@
462 }461 }
463 return buf.String()462 return buf.String()
464}463}
465
466type bootstrapContext struct{}
467
468func (bootstrapContext) Stdin() io.Reader {
469 return os.Stdin
470}
471
472func (bootstrapContext) Stdout() io.Writer {
473 return os.Stdout
474}
475
476func (bootstrapContext) Stderr() io.Writer {
477 return os.Stderr
478}
479
480func (bootstrapContext) InterruptNotify(c chan<- os.Signal) {
481 signal.Notify(c, os.Interrupt)
482}
483
484func (bootstrapContext) StopInterruptNotify(c chan<- os.Signal) {
485 signal.Stop(c)
486}
487464
=== modified file 'environs/bootstrap/bootstrap_test.go'
--- environs/bootstrap/bootstrap_test.go 2014-01-20 23:32:00 +0000
+++ environs/bootstrap/bootstrap_test.go 2014-02-18 02:14:09 +0000
@@ -53,11 +53,6 @@
53 s.LoggingSuite.TearDownTest(c)53 s.LoggingSuite.TearDownTest(c)
54}54}
5555
56func bootstrapContext(c *gc.C) environs.BootstrapContext {
57 ctx := coretesting.Context(c)
58 return envtesting.NewBootstrapContext(ctx)
59}
60
61func (s *bootstrapSuite) TestBootstrapNeedsSettings(c *gc.C) {56func (s *bootstrapSuite) TestBootstrapNeedsSettings(c *gc.C) {
62 env := newEnviron("bar", noKeysDefined)57 env := newEnviron("bar", noKeysDefined)
63 s.setDummyStorage(c, env)58 s.setDummyStorage(c, env)
@@ -69,20 +64,20 @@
69 env.cfg = cfg64 env.cfg = cfg
70 }65 }
7166
72 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})67 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
73 c.Assert(err, gc.ErrorMatches, "environment configuration has no admin-secret")68 c.Assert(err, gc.ErrorMatches, "environment configuration has no admin-secret")
7469
75 fixEnv("admin-secret", "whatever")70 fixEnv("admin-secret", "whatever")
76 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})71 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
77 c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-cert")72 c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-cert")
7873
79 fixEnv("ca-cert", coretesting.CACert)74 fixEnv("ca-cert", coretesting.CACert)
80 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})75 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
81 c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-private-key")76 c.Assert(err, gc.ErrorMatches, "environment configuration has no ca-private-key")
8277
83 fixEnv("ca-private-key", coretesting.CAKey)78 fixEnv("ca-private-key", coretesting.CAKey)
84 uploadTools(c, env)79 uploadTools(c, env)
85 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})80 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
86 c.Assert(err, gc.IsNil)81 c.Assert(err, gc.IsNil)
87}82}
8883
@@ -95,7 +90,7 @@
95func (s *bootstrapSuite) TestBootstrapEmptyConstraints(c *gc.C) {90func (s *bootstrapSuite) TestBootstrapEmptyConstraints(c *gc.C) {
96 env := newEnviron("foo", useDefaultKeys)91 env := newEnviron("foo", useDefaultKeys)
97 s.setDummyStorage(c, env)92 s.setDummyStorage(c, env)
98 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})93 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
99 c.Assert(err, gc.IsNil)94 c.Assert(err, gc.IsNil)
100 c.Assert(env.bootstrapCount, gc.Equals, 1)95 c.Assert(env.bootstrapCount, gc.Equals, 1)
101 c.Assert(env.constraints, gc.DeepEquals, constraints.Value{})96 c.Assert(env.constraints, gc.DeepEquals, constraints.Value{})
@@ -105,7 +100,7 @@
105 env := newEnviron("foo", useDefaultKeys)100 env := newEnviron("foo", useDefaultKeys)
106 s.setDummyStorage(c, env)101 s.setDummyStorage(c, env)
107 cons := constraints.MustParse("cpu-cores=2 mem=4G")102 cons := constraints.MustParse("cpu-cores=2 mem=4G")
108 err := bootstrap.Bootstrap(bootstrapContext(c), env, cons)103 err := bootstrap.Bootstrap(coretesting.Context(c), env, cons)
109 c.Assert(err, gc.IsNil)104 c.Assert(err, gc.IsNil)
110 c.Assert(env.bootstrapCount, gc.Equals, 1)105 c.Assert(env.bootstrapCount, gc.Equals, 1)
111 c.Assert(env.constraints, gc.DeepEquals, cons)106 c.Assert(env.constraints, gc.DeepEquals, cons)
@@ -157,7 +152,7 @@
157 }152 }
158 cfg, err := config.New(config.NoDefaults, attrs)153 cfg, err := config.New(config.NoDefaults, attrs)
159 c.Assert(err, gc.IsNil)154 c.Assert(err, gc.IsNil)
160 env, err := environs.Prepare(cfg, configstore.NewMem())155 env, err := environs.Prepare(cfg, coretesting.Context(c), configstore.NewMem())
161 c.Assert(err, gc.IsNil)156 c.Assert(err, gc.IsNil)
162 envtesting.RemoveAllTools(c, env)157 envtesting.RemoveAllTools(c, env)
163158
@@ -170,7 +165,7 @@
170 if test.Arch != "" {165 if test.Arch != "" {
171 cons = constraints.MustParse("arch=" + test.Arch)166 cons = constraints.MustParse("arch=" + test.Arch)
172 }167 }
173 err = bootstrap.Bootstrap(bootstrapContext(c), env, cons)168 err = bootstrap.Bootstrap(coretesting.Context(c), env, cons)
174 if test.Err != nil {169 if test.Err != nil {
175 c.Check(err, gc.ErrorMatches, ".*"+test.Err.Error())170 c.Check(err, gc.ErrorMatches, ".*"+test.Err.Error())
176 continue171 continue
@@ -193,7 +188,7 @@
193 env := newEnviron("foo", useDefaultKeys)188 env := newEnviron("foo", useDefaultKeys)
194 s.setDummyStorage(c, env)189 s.setDummyStorage(c, env)
195 envtesting.RemoveFakeTools(c, env.Storage())190 envtesting.RemoveFakeTools(c, env.Storage())
196 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})191 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
197 // bootstrap.Bootstrap leaves it to the provider to192 // bootstrap.Bootstrap leaves it to the provider to
198 // locate bootstrap tools.193 // locate bootstrap tools.
199 c.Assert(err, gc.IsNil)194 c.Assert(err, gc.IsNil)
200195
=== modified file 'environs/emptystorage_test.go'
--- environs/emptystorage_test.go 2013-10-03 01:28:51 +0000
+++ environs/emptystorage_test.go 2014-02-18 02:14:09 +0000
@@ -63,7 +63,8 @@
63func (s *verifyStorageSuite) TestVerifyStorage(c *gc.C) {63func (s *verifyStorageSuite) TestVerifyStorage(c *gc.C) {
64 defer testing.MakeFakeHome(c, existingEnv, "existing").Restore()64 defer testing.MakeFakeHome(c, existingEnv, "existing").Restore()
6565
66 environ, err := environs.PrepareFromName("test", configstore.NewMem())66 ctx := testing.Context(c)
67 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
67 c.Assert(err, gc.IsNil)68 c.Assert(err, gc.IsNil)
68 stor := environ.Storage()69 stor := environ.Storage()
69 err = environs.VerifyStorage(stor)70 err = environs.VerifyStorage(stor)
@@ -80,7 +81,8 @@
80func (s *verifyStorageSuite) TestVerifyStorageFails(c *gc.C) {81func (s *verifyStorageSuite) TestVerifyStorageFails(c *gc.C) {
81 defer testing.MakeFakeHome(c, existingEnv, "existing").Restore()82 defer testing.MakeFakeHome(c, existingEnv, "existing").Restore()
8283
83 environ, err := environs.PrepareFromName("test", configstore.NewMem())84 ctx := testing.Context(c)
85 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
84 c.Assert(err, gc.IsNil)86 c.Assert(err, gc.IsNil)
85 stor := environ.Storage()87 stor := environ.Storage()
86 someError := errors.Unauthorizedf("you shall not pass")88 someError := errors.Unauthorizedf("you shall not pass")
8789
=== modified file 'environs/imagemetadata/urls_test.go'
--- environs/imagemetadata/urls_test.go 2014-01-30 07:37:38 +0000
+++ environs/imagemetadata/urls_test.go 2014-02-18 02:14:09 +0000
@@ -46,7 +46,7 @@
46 }46 }
47 cfg, err := config.New(config.NoDefaults, attrs)47 cfg, err := config.New(config.NoDefaults, attrs)
48 c.Assert(err, gc.IsNil)48 c.Assert(err, gc.IsNil)
49 env, err := environs.Prepare(cfg, configstore.NewMem())49 env, err := environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
50 c.Assert(err, gc.IsNil)50 c.Assert(err, gc.IsNil)
51 // Put a file in images since the dummy storage provider requires a51 // Put a file in images since the dummy storage provider requires a
52 // file to exist before the URL can be found. This is to ensure it behaves52 // file to exist before the URL can be found. This is to ensure it behaves
5353
=== modified file 'environs/interface.go'
--- environs/interface.go 2013-12-20 02:38:56 +0000
+++ environs/interface.go 2014-02-18 02:14:09 +0000
@@ -21,7 +21,7 @@
21 // configuration attributes in the returned environment should21 // configuration attributes in the returned environment should
22 // be saved to be used later. If the environment is already22 // be saved to be used later. If the environment is already
23 // prepared, this call is equivalent to Open.23 // prepared, this call is equivalent to Open.
24 Prepare(cfg *config.Config) (Environ, error)24 Prepare(ctx BootstrapContext, cfg *config.Config) (Environ, error)
2525
26 // Open opens the environment and returns it.26 // Open opens the environment and returns it.
27 // The configuration must have come from a previously27 // The configuration must have come from a previously
@@ -201,9 +201,9 @@
201// information about and manipulating the context in which201// information about and manipulating the context in which
202// it is being invoked.202// it is being invoked.
203type BootstrapContext interface {203type BootstrapContext interface {
204 Stdin() io.Reader204 GetStdin() io.Reader
205 Stdout() io.Writer205 GetStdout() io.Writer
206 Stderr() io.Writer206 GetStderr() io.Writer
207207
208 // InterruptNotify starts watching for interrupt signals208 // InterruptNotify starts watching for interrupt signals
209 // on behalf of the caller, sending them to the supplied209 // on behalf of the caller, sending them to the supplied
210210
=== modified file 'environs/jujutest/livetests.go'
--- environs/jujutest/livetests.go 2014-01-07 07:35:12 +0000
+++ environs/jujutest/livetests.go 2014-02-18 02:14:09 +0000
@@ -118,7 +118,7 @@
118 }118 }
119 cfg, err := config.New(config.NoDefaults, t.TestConfig)119 cfg, err := config.New(config.NoDefaults, t.TestConfig)
120 c.Assert(err, gc.IsNil)120 c.Assert(err, gc.IsNil)
121 e, err := environs.Prepare(cfg, t.ConfigStore)121 e, err := environs.Prepare(cfg, coretesting.Context(c), t.ConfigStore)
122 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", t.TestConfig))122 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", t.TestConfig))
123 c.Assert(e, gc.NotNil)123 c.Assert(e, gc.NotNil)
124 t.Env = e124 t.Env = e
@@ -140,7 +140,7 @@
140 envtesting.UploadFakeTools(c, t.Env.Storage())140 envtesting.UploadFakeTools(c, t.Env.Storage())
141 err := common.EnsureNotBootstrapped(t.Env)141 err := common.EnsureNotBootstrapped(t.Env)
142 c.Assert(err, gc.IsNil)142 c.Assert(err, gc.IsNil)
143 err = bootstrap.Bootstrap(bootstrapContext(c), t.Env, cons)143 err = bootstrap.Bootstrap(coretesting.Context(c), t.Env, cons)
144 c.Assert(err, gc.IsNil)144 c.Assert(err, gc.IsNil)
145 t.bootstrapped = true145 t.bootstrapped = true
146}146}
@@ -895,7 +895,7 @@
895 "state-server": false,895 "state-server": false,
896 "name": "dummy storage",896 "name": "dummy storage",
897 }))897 }))
898 dummyenv, err := environs.Prepare(dummyCfg, configstore.NewMem())898 dummyenv, err := environs.Prepare(dummyCfg, coretesting.Context(c), configstore.NewMem())
899 c.Assert(err, gc.IsNil)899 c.Assert(err, gc.IsNil)
900 defer dummyenv.Destroy()900 defer dummyenv.Destroy()
901901
@@ -904,7 +904,7 @@
904 attrs := t.TestConfig.Merge(coretesting.Attrs{"default-series": other.Series})904 attrs := t.TestConfig.Merge(coretesting.Attrs{"default-series": other.Series})
905 cfg, err := config.New(config.NoDefaults, attrs)905 cfg, err := config.New(config.NoDefaults, attrs)
906 c.Assert(err, gc.IsNil)906 c.Assert(err, gc.IsNil)
907 env, err := environs.Prepare(cfg, t.ConfigStore)907 env, err := environs.Prepare(cfg, coretesting.Context(c), t.ConfigStore)
908 c.Assert(err, gc.IsNil)908 c.Assert(err, gc.IsNil)
909 defer environs.Destroy(env, t.ConfigStore)909 defer environs.Destroy(env, t.ConfigStore)
910910
@@ -924,7 +924,7 @@
924 err = storageCopy(dummyStorage, currentName, envStorage, otherName)924 err = storageCopy(dummyStorage, currentName, envStorage, otherName)
925 c.Assert(err, gc.IsNil)925 c.Assert(err, gc.IsNil)
926926
927 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})927 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
928 c.Assert(err, gc.IsNil)928 c.Assert(err, gc.IsNil)
929929
930 conn, err := juju.NewConn(env)930 conn, err := juju.NewConn(env)
931931
=== modified file 'environs/jujutest/tests.go'
--- environs/jujutest/tests.go 2013-12-20 02:38:56 +0000
+++ environs/jujutest/tests.go 2014-02-18 02:14:09 +0000
@@ -61,7 +61,7 @@
61func (t *Tests) Prepare(c *gc.C) environs.Environ {61func (t *Tests) Prepare(c *gc.C) environs.Environ {
62 cfg, err := config.New(config.NoDefaults, t.TestConfig)62 cfg, err := config.New(config.NoDefaults, t.TestConfig)
63 c.Assert(err, gc.IsNil)63 c.Assert(err, gc.IsNil)
64 e, err := environs.Prepare(cfg, t.ConfigStore)64 e, err := environs.Prepare(cfg, coretesting.Context(c), t.ConfigStore)
65 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", t.TestConfig))65 c.Assert(err, gc.IsNil, gc.Commentf("preparing environ %#v", t.TestConfig))
66 c.Assert(e, gc.NotNil)66 c.Assert(e, gc.NotNil)
67 return e67 return e
@@ -78,10 +78,6 @@
78 t.LoggingSuite.TearDownTest(c)78 t.LoggingSuite.TearDownTest(c)
79}79}
8080
81func bootstrapContext(c *gc.C) environs.BootstrapContext {
82 return envtesting.NewBootstrapContext(coretesting.Context(c))
83}
84
85func (t *Tests) TestStartStop(c *gc.C) {81func (t *Tests) TestStartStop(c *gc.C) {
86 e := t.Prepare(c)82 e := t.Prepare(c)
87 envtesting.UploadFakeTools(c, e.Storage())83 envtesting.UploadFakeTools(c, e.Storage())
@@ -138,7 +134,7 @@
138 envtesting.UploadFakeTools(c, e.Storage())134 envtesting.UploadFakeTools(c, e.Storage())
139 err := common.EnsureNotBootstrapped(e)135 err := common.EnsureNotBootstrapped(e)
140 c.Assert(err, gc.IsNil)136 c.Assert(err, gc.IsNil)
141 err = bootstrap.Bootstrap(bootstrapContext(c), e, constraints.Value{})137 err = bootstrap.Bootstrap(coretesting.Context(c), e, constraints.Value{})
142 c.Assert(err, gc.IsNil)138 c.Assert(err, gc.IsNil)
143139
144 info, apiInfo, err := e.StateInfo()140 info, apiInfo, err := e.StateInfo()
@@ -166,7 +162,7 @@
166162
167 err = common.EnsureNotBootstrapped(e3)163 err = common.EnsureNotBootstrapped(e3)
168 c.Assert(err, gc.IsNil)164 c.Assert(err, gc.IsNil)
169 err = bootstrap.Bootstrap(bootstrapContext(c), e3, constraints.Value{})165 err = bootstrap.Bootstrap(coretesting.Context(c), e3, constraints.Value{})
170 c.Assert(err, gc.IsNil)166 c.Assert(err, gc.IsNil)
171167
172 err = common.EnsureNotBootstrapped(e3)168 err = common.EnsureNotBootstrapped(e3)
173169
=== modified file 'environs/manual/bootstrap.go'
--- environs/manual/bootstrap.go 2014-01-06 07:38:53 +0000
+++ environs/manual/bootstrap.go 2014-02-18 02:14:09 +0000
@@ -136,5 +136,5 @@
136 for k, v := range agentEnv {136 for k, v := range agentEnv {
137 mcfg.AgentEnvironment[k] = v137 mcfg.AgentEnvironment[k] = v
138 }138 }
139 return provisionMachineAgent(args.Host, mcfg, args.Context.Stderr())139 return provisionMachineAgent(args.Host, mcfg, args.Context.GetStderr())
140}140}
141141
=== modified file 'environs/manual/bootstrap_test.go'
--- environs/manual/bootstrap_test.go 2014-01-06 07:17:46 +0000
+++ environs/manual/bootstrap_test.go 2014-02-18 02:14:09 +0000
@@ -12,7 +12,6 @@
12 "launchpad.net/juju-core/environs/bootstrap"12 "launchpad.net/juju-core/environs/bootstrap"
13 "launchpad.net/juju-core/environs/filestorage"13 "launchpad.net/juju-core/environs/filestorage"
14 "launchpad.net/juju-core/environs/storage"14 "launchpad.net/juju-core/environs/storage"
15 envtesting "launchpad.net/juju-core/environs/testing"
16 "launchpad.net/juju-core/environs/tools"15 "launchpad.net/juju-core/environs/tools"
17 "launchpad.net/juju-core/instance"16 "launchpad.net/juju-core/instance"
18 "launchpad.net/juju-core/juju/testing"17 "launchpad.net/juju-core/juju/testing"
@@ -81,7 +80,7 @@
81 HardwareCharacteristics: &instance.HardwareCharacteristics{80 HardwareCharacteristics: &instance.HardwareCharacteristics{
82 Arch: &arch,81 Arch: &arch,
83 },82 },
84 Context: envtesting.NewBootstrapContext(coretesting.Context(c)),83 Context: coretesting.Context(c),
85 }84 }
86}85}
8786
8887
=== modified file 'environs/open.go'
--- environs/open.go 2014-02-13 10:08:31 +0000
+++ environs/open.go 2014-02-18 02:14:09 +0000
@@ -118,12 +118,12 @@
118// and environment information is created using the118// and environment information is created using the
119// given store. If the environment is already prepared,119// given store. If the environment is already prepared,
120// it behaves like NewFromName.120// it behaves like NewFromName.
121func PrepareFromName(name string, store configstore.Storage) (Environ, error) {121func PrepareFromName(name string, ctx BootstrapContext, store configstore.Storage) (Environ, error) {
122 cfg, _, err := ConfigForName(name, store)122 cfg, _, err := ConfigForName(name, store)
123 if err != nil {123 if err != nil {
124 return nil, err124 return nil, err
125 }125 }
126 return Prepare(cfg, store)126 return Prepare(cfg, ctx, store)
127}127}
128128
129// NewFromAttrs returns a new environment based on the provided configuration129// NewFromAttrs returns a new environment based on the provided configuration
@@ -148,7 +148,7 @@
148148
149// Prepare prepares a new environment based on the provided configuration.149// Prepare prepares a new environment based on the provided configuration.
150// If the environment is already prepared, it behaves like New.150// If the environment is already prepared, it behaves like New.
151func Prepare(cfg *config.Config, store configstore.Storage) (Environ, error) {151func Prepare(cfg *config.Config, ctx BootstrapContext, store configstore.Storage) (Environ, error) {
152 p, err := Provider(cfg.Type())152 p, err := Provider(cfg.Type())
153 if err != nil {153 if err != nil {
154 return nil, err154 return nil, err
@@ -175,7 +175,7 @@
175 if err != nil {175 if err != nil {
176 return nil, fmt.Errorf("cannot create new info for environment %q: %v", cfg.Name(), err)176 return nil, fmt.Errorf("cannot create new info for environment %q: %v", cfg.Name(), err)
177 }177 }
178 env, err := prepare(cfg, info, p)178 env, err := prepare(ctx, cfg, info, p)
179 if err != nil {179 if err != nil {
180 if err := info.Destroy(); err != nil {180 if err := info.Destroy(); err != nil {
181 logger.Warningf("cannot destroy newly created environment info: %v", err)181 logger.Warningf("cannot destroy newly created environment info: %v", err)
@@ -189,7 +189,7 @@
189 return env, nil189 return env, nil
190}190}
191191
192func prepare(cfg *config.Config, info configstore.EnvironInfo, p EnvironProvider) (Environ, error) {192func prepare(ctx BootstrapContext, cfg *config.Config, info configstore.EnvironInfo, p EnvironProvider) (Environ, error) {
193 cfg, err := ensureAdminSecret(cfg)193 cfg, err := ensureAdminSecret(cfg)
194 if err != nil {194 if err != nil {
195 return nil, fmt.Errorf("cannot generate admin-secret: %v", err)195 return nil, fmt.Errorf("cannot generate admin-secret: %v", err)
@@ -198,7 +198,7 @@
198 if err != nil {198 if err != nil {
199 return nil, fmt.Errorf("cannot ensure CA certificate: %v", err)199 return nil, fmt.Errorf("cannot ensure CA certificate: %v", err)
200 }200 }
201 return p.Prepare(cfg)201 return p.Prepare(ctx, cfg)
202}202}
203203
204// ensureAdminSecret returns a config with a non-empty admin-secret.204// ensureAdminSecret returns a config with a non-empty admin-secret.
205205
=== modified file 'environs/open_test.go'
--- environs/open_test.go 2014-02-11 02:50:17 +0000
+++ environs/open_test.go 2014-02-18 02:14:09 +0000
@@ -37,10 +37,10 @@
37 // matches *Settings.Map()37 // matches *Settings.Map()
38 cfg, err := config.New(config.NoDefaults, dummySampleConfig())38 cfg, err := config.New(config.NoDefaults, dummySampleConfig())
39 c.Assert(err, gc.IsNil)39 c.Assert(err, gc.IsNil)
40 env, err := environs.Prepare(cfg, configstore.NewMem())40 ctx := testing.Context(c)
41 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
41 c.Assert(err, gc.IsNil)42 c.Assert(err, gc.IsNil)
42 envtesting.UploadFakeTools(c, env.Storage())43 envtesting.UploadFakeTools(c, env.Storage())
43 ctx := envtesting.NewBootstrapContext(testing.Context(c))
44 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})44 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
45 c.Assert(err, gc.IsNil)45 c.Assert(err, gc.IsNil)
46}46}
@@ -57,7 +57,8 @@
57func (*OpenSuite) TestNewFromName(c *gc.C) {57func (*OpenSuite) TestNewFromName(c *gc.C) {
58 defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore()58 defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore()
59 store := configstore.NewMem()59 store := configstore.NewMem()
60 e, err := environs.PrepareFromName("erewhemos", store)60 ctx := testing.Context(c)
61 e, err := environs.PrepareFromName("erewhemos", ctx, store)
61 c.Assert(err, gc.IsNil)62 c.Assert(err, gc.IsNil)
6263
63 e, err = environs.NewFromName("erewhemos", store)64 e, err = environs.NewFromName("erewhemos", store)
@@ -96,7 +97,8 @@
9697
97func (*OpenSuite) TestPrepareFromName(c *gc.C) {98func (*OpenSuite) TestPrepareFromName(c *gc.C) {
98 defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore()99 defer testing.MakeFakeHome(c, testing.MultipleEnvConfigNoDefault, testing.SampleCertName).Restore()
99 e, err := environs.PrepareFromName("erewhemos", configstore.NewMem())100 ctx := testing.Context(c)
101 e, err := environs.PrepareFromName("erewhemos", ctx, configstore.NewMem())
100 c.Assert(err, gc.IsNil)102 c.Assert(err, gc.IsNil)
101 c.Assert(e.Name(), gc.Equals, "erewhemos")103 c.Assert(e.Name(), gc.Equals, "erewhemos")
102 // Check we can access storage ok, which implies the environment has been prepared.104 // Check we can access storage ok, which implies the environment has been prepared.
@@ -175,7 +177,8 @@
175 cfg, err := config.New(config.NoDefaults, baselineAttrs)177 cfg, err := config.New(config.NoDefaults, baselineAttrs)
176 c.Assert(err, gc.IsNil)178 c.Assert(err, gc.IsNil)
177 store := configstore.NewMem()179 store := configstore.NewMem()
178 env, err := environs.Prepare(cfg, store)180 ctx := testing.Context(c)
181 env, err := environs.Prepare(cfg, ctx, store)
179 c.Assert(err, gc.IsNil)182 c.Assert(err, gc.IsNil)
180 // Check we can access storage ok, which implies the environment has been prepared.183 // Check we can access storage ok, which implies the environment has been prepared.
181 c.Assert(env.Storage(), gc.NotNil)184 c.Assert(env.Storage(), gc.NotNil)
@@ -204,7 +207,7 @@
204 c.Assert(caCert.Subject.CommonName, gc.Equals, `juju-generated CA for environment "`+testing.SampleEnvName+`"`)207 c.Assert(caCert.Subject.CommonName, gc.Equals, `juju-generated CA for environment "`+testing.SampleEnvName+`"`)
205208
206 // Check we can call Prepare again.209 // Check we can call Prepare again.
207 env, err = environs.Prepare(cfg, store)210 env, err = environs.Prepare(cfg, ctx, store)
208 c.Assert(err, gc.IsNil)211 c.Assert(err, gc.IsNil)
209 c.Assert(env.Name(), gc.Equals, "erewhemos")212 c.Assert(env.Name(), gc.Equals, "erewhemos")
210 c.Assert(env.Storage(), gc.NotNil)213 c.Assert(env.Storage(), gc.NotNil)
@@ -221,13 +224,14 @@
221 cfg, err := config.New(config.NoDefaults, baselineAttrs)224 cfg, err := config.New(config.NoDefaults, baselineAttrs)
222 c.Assert(err, gc.IsNil)225 c.Assert(err, gc.IsNil)
223226
224 env0, err := environs.Prepare(cfg, configstore.NewMem())227 ctx := testing.Context(c)
228 env0, err := environs.Prepare(cfg, ctx, configstore.NewMem())
225 c.Assert(err, gc.IsNil)229 c.Assert(err, gc.IsNil)
226 adminSecret0 := env0.Config().AdminSecret()230 adminSecret0 := env0.Config().AdminSecret()
227 c.Assert(adminSecret0, gc.HasLen, 32)231 c.Assert(adminSecret0, gc.HasLen, 32)
228 c.Assert(adminSecret0, gc.Matches, "^[0-9a-f]*$")232 c.Assert(adminSecret0, gc.Matches, "^[0-9a-f]*$")
229233
230 env1, err := environs.Prepare(cfg, configstore.NewMem())234 env1, err := environs.Prepare(cfg, ctx, configstore.NewMem())
231 c.Assert(err, gc.IsNil)235 c.Assert(err, gc.IsNil)
232 adminSecret1 := env1.Config().AdminSecret()236 adminSecret1 := env1.Config().AdminSecret()
233 c.Assert(adminSecret1, gc.HasLen, 32)237 c.Assert(adminSecret1, gc.HasLen, 32)
@@ -246,7 +250,7 @@
246 ))250 ))
247 c.Assert(err, gc.IsNil)251 c.Assert(err, gc.IsNil)
248 store := configstore.NewMem()252 store := configstore.NewMem()
249 env, err := environs.Prepare(cfg, store)253 env, err := environs.Prepare(cfg, testing.Context(c), store)
250 c.Assert(err, gc.ErrorMatches, "cannot ensure CA certificate: environment configuration with a certificate but no CA private key")254 c.Assert(err, gc.ErrorMatches, "cannot ensure CA certificate: environment configuration with a certificate but no CA private key")
251 c.Assert(env, gc.IsNil)255 c.Assert(env, gc.IsNil)
252 // Ensure that the config storage info is cleaned up.256 // Ensure that the config storage info is cleaned up.
@@ -264,7 +268,8 @@
264 },268 },
265 ))269 ))
266 c.Assert(err, gc.IsNil)270 c.Assert(err, gc.IsNil)
267 env, err := environs.Prepare(cfg, configstore.NewMem())271 ctx := testing.Context(c)
272 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
268 c.Assert(err, gc.IsNil)273 c.Assert(err, gc.IsNil)
269 cfgCertPEM, cfgCertOK := env.Config().CACert()274 cfgCertPEM, cfgCertOK := env.Config().CACert()
270 cfgKeyPEM, cfgKeyOK := env.Config().CAPrivateKey()275 cfgKeyPEM, cfgKeyOK := env.Config().CAPrivateKey()
@@ -286,7 +291,8 @@
286 store := configstore.NewMem()291 store := configstore.NewMem()
287 // Prepare the environment and sanity-check that292 // Prepare the environment and sanity-check that
288 // the config storage info has been made.293 // the config storage info has been made.
289 e, err := environs.Prepare(cfg, store)294 ctx := testing.Context(c)
295 e, err := environs.Prepare(cfg, ctx, store)
290 c.Assert(err, gc.IsNil)296 c.Assert(err, gc.IsNil)
291 _, err = store.ReadInfo(e.Name())297 _, err = store.ReadInfo(e.Name())
292 c.Assert(err, gc.IsNil)298 c.Assert(err, gc.IsNil)
@@ -332,7 +338,8 @@
332func (s *checkEnvironmentSuite) TestCheckEnvironment(c *gc.C) {338func (s *checkEnvironmentSuite) TestCheckEnvironment(c *gc.C) {
333 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()339 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()
334340
335 environ, err := environs.PrepareFromName("test", configstore.NewMem())341 ctx := testing.Context(c)
342 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
336 c.Assert(err, gc.IsNil)343 c.Assert(err, gc.IsNil)
337344
338 // VerifyStorage is sufficient for our tests and much simpler345 // VerifyStorage is sufficient for our tests and much simpler
@@ -347,7 +354,8 @@
347func (s *checkEnvironmentSuite) TestCheckEnvironmentFileNotFound(c *gc.C) {354func (s *checkEnvironmentSuite) TestCheckEnvironmentFileNotFound(c *gc.C) {
348 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()355 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()
349356
350 environ, err := environs.PrepareFromName("test", configstore.NewMem())357 ctx := testing.Context(c)
358 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
351 c.Assert(err, gc.IsNil)359 c.Assert(err, gc.IsNil)
352360
353 // VerifyStorage is sufficient for our tests and much simpler361 // VerifyStorage is sufficient for our tests and much simpler
@@ -368,7 +376,8 @@
368func (s *checkEnvironmentSuite) TestCheckEnvironmentGetFails(c *gc.C) {376func (s *checkEnvironmentSuite) TestCheckEnvironmentGetFails(c *gc.C) {
369 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()377 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()
370378
371 environ, err := environs.PrepareFromName("test", configstore.NewMem())379 ctx := testing.Context(c)
380 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
372 c.Assert(err, gc.IsNil)381 c.Assert(err, gc.IsNil)
373382
374 // VerifyStorage is sufficient for our tests and much simpler383 // VerifyStorage is sufficient for our tests and much simpler
@@ -388,7 +397,8 @@
388func (s *checkEnvironmentSuite) TestCheckEnvironmentBadContent(c *gc.C) {397func (s *checkEnvironmentSuite) TestCheckEnvironmentBadContent(c *gc.C) {
389 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()398 defer testing.MakeFakeHome(c, checkEnv, "existing").Restore()
390399
391 environ, err := environs.PrepareFromName("test", configstore.NewMem())400 ctx := testing.Context(c)
401 environ, err := environs.PrepareFromName("test", ctx, configstore.NewMem())
392 c.Assert(err, gc.IsNil)402 c.Assert(err, gc.IsNil)
393403
394 // We mock a bad (eg. from a Python-juju environment) bootstrap-verify.404 // We mock a bad (eg. from a Python-juju environment) bootstrap-verify.
395405
=== modified file 'environs/storage/storage_test.go'
--- environs/storage/storage_test.go 2014-01-31 00:14:11 +0000
+++ environs/storage/storage_test.go 2014-02-18 02:14:09 +0000
@@ -42,7 +42,7 @@
4242
43func (s *datasourceSuite) SetUpTest(c *gc.C) {43func (s *datasourceSuite) SetUpTest(c *gc.C) {
44 s.home = testing.MakeFakeHome(c, existingEnv, "existing")44 s.home = testing.MakeFakeHome(c, existingEnv, "existing")
45 environ, err := environs.PrepareFromName("test", configstore.NewMem())45 environ, err := environs.PrepareFromName("test", testing.Context(c), configstore.NewMem())
46 c.Assert(err, gc.IsNil)46 c.Assert(err, gc.IsNil)
47 s.stor = environ.Storage()47 s.stor = environ.Storage()
48 s.baseURL, err = s.stor.URL("")48 s.baseURL, err = s.stor.URL("")
4949
=== modified file 'environs/sync/sync_test.go'
--- environs/sync/sync_test.go 2014-01-30 06:21:03 +0000
+++ environs/sync/sync_test.go 2014-02-18 02:14:09 +0000
@@ -68,7 +68,7 @@
68`)68`)
69 s.AddCleanup(func(*gc.C) { fakeHome.Restore() })69 s.AddCleanup(func(*gc.C) { fakeHome.Restore() })
70 var err error70 var err error
71 s.targetEnv, err = environs.PrepareFromName("test-target", configstore.NewMem())71 s.targetEnv, err = environs.PrepareFromName("test-target", coretesting.Context(c), configstore.NewMem())
72 c.Assert(err, gc.IsNil)72 c.Assert(err, gc.IsNil)
73 envtesting.RemoveAllTools(c, s.targetEnv)73 envtesting.RemoveAllTools(c, s.targetEnv)
7474
@@ -264,7 +264,7 @@
264 // We only want to use simplestreams to find any synced tools.264 // We only want to use simplestreams to find any synced tools.
265 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())265 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
266 c.Assert(err, gc.IsNil)266 c.Assert(err, gc.IsNil)
267 s.env, err = environs.Prepare(cfg, configstore.NewMem())267 s.env, err = environs.Prepare(cfg, coretesting.Context(c), configstore.NewMem())
268 c.Assert(err, gc.IsNil)268 c.Assert(err, gc.IsNil)
269}269}
270270
271271
=== modified file 'environs/testing/bootstrap.go'
--- environs/testing/bootstrap.go 2014-01-28 04:58:43 +0000
+++ environs/testing/bootstrap.go 2014-02-18 02:14:09 +0000
@@ -4,11 +4,8 @@
4package testing4package testing
55
6import (6import (
7 "io"
8
9 "github.com/loggo/loggo"7 "github.com/loggo/loggo"
108
11 "launchpad.net/juju-core/cmd"
12 "launchpad.net/juju-core/environs"9 "launchpad.net/juju-core/environs"
13 "launchpad.net/juju-core/environs/cloudinit"10 "launchpad.net/juju-core/environs/cloudinit"
14 "launchpad.net/juju-core/instance"11 "launchpad.net/juju-core/instance"
@@ -29,23 +26,3 @@
29 }26 }
30 return testbase.PatchValue(&common.FinishBootstrap, f)27 return testbase.PatchValue(&common.FinishBootstrap, f)
31}28}
32
33type bootstrapContext struct {
34 *cmd.Context
35}
36
37func (c bootstrapContext) Stdin() io.Reader {
38 return c.Context.Stdin
39}
40
41func (c bootstrapContext) Stdout() io.Writer {
42 return c.Context.Stdout
43}
44
45func (c bootstrapContext) Stderr() io.Writer {
46 return c.Context.Stderr
47}
48
49func NewBootstrapContext(ctx *cmd.Context) environs.BootstrapContext {
50 return bootstrapContext{ctx}
51}
5229
=== modified file 'environs/tools/storage_test.go'
--- environs/tools/storage_test.go 2013-09-27 02:31:45 +0000
+++ environs/tools/storage_test.go 2014-02-18 02:14:09 +0000
@@ -12,6 +12,7 @@
12 envtesting "launchpad.net/juju-core/environs/testing"12 envtesting "launchpad.net/juju-core/environs/testing"
13 envtools "launchpad.net/juju-core/environs/tools"13 envtools "launchpad.net/juju-core/environs/tools"
14 "launchpad.net/juju-core/provider/dummy"14 "launchpad.net/juju-core/provider/dummy"
15 "launchpad.net/juju-core/testing"
15 "launchpad.net/juju-core/testing/testbase"16 "launchpad.net/juju-core/testing/testbase"
16 coretools "launchpad.net/juju-core/tools"17 coretools "launchpad.net/juju-core/tools"
17 "launchpad.net/juju-core/version"18 "launchpad.net/juju-core/version"
@@ -29,7 +30,7 @@
29 s.LoggingSuite.SetUpTest(c)30 s.LoggingSuite.SetUpTest(c)
30 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())31 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
31 c.Assert(err, gc.IsNil)32 c.Assert(err, gc.IsNil)
32 s.env, err = environs.Prepare(cfg, configstore.NewMem())33 s.env, err = environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
33 c.Assert(err, gc.IsNil)34 c.Assert(err, gc.IsNil)
34 s.dataDir = c.MkDir()35 s.dataDir = c.MkDir()
35}36}
3637
=== modified file 'environs/tools/tools_test.go'
--- environs/tools/tools_test.go 2014-01-30 07:37:38 +0000
+++ environs/tools/tools_test.go 2014-02-18 02:14:09 +0000
@@ -25,6 +25,7 @@
25 envtools "launchpad.net/juju-core/environs/tools"25 envtools "launchpad.net/juju-core/environs/tools"
26 "launchpad.net/juju-core/errors"26 "launchpad.net/juju-core/errors"
27 "launchpad.net/juju-core/provider/dummy"27 "launchpad.net/juju-core/provider/dummy"
28 "launchpad.net/juju-core/testing"
28 jc "launchpad.net/juju-core/testing/checkers"29 jc "launchpad.net/juju-core/testing/checkers"
29 "launchpad.net/juju-core/testing/testbase"30 "launchpad.net/juju-core/testing/testbase"
30 coretools "launchpad.net/juju-core/tools"31 coretools "launchpad.net/juju-core/tools"
@@ -171,7 +172,7 @@
171 dummy.Reset()172 dummy.Reset()
172 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig().Merge(attrs))173 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig().Merge(attrs))
173 c.Assert(err, gc.IsNil)174 c.Assert(err, gc.IsNil)
174 env, err := environs.Prepare(cfg, configstore.NewMem())175 env, err := environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
175 c.Assert(err, gc.IsNil)176 c.Assert(err, gc.IsNil)
176 s.env = env177 s.env = env
177 s.removeTools(c)178 s.removeTools(c)
178179
=== modified file 'environs/tools/urls_test.go'
--- environs/tools/urls_test.go 2014-01-31 00:14:11 +0000
+++ environs/tools/urls_test.go 2014-02-18 02:14:09 +0000
@@ -43,7 +43,7 @@
43 }43 }
44 cfg, err := config.New(config.NoDefaults, attrs)44 cfg, err := config.New(config.NoDefaults, attrs)
45 c.Assert(err, gc.IsNil)45 c.Assert(err, gc.IsNil)
46 env, err := environs.Prepare(cfg, configstore.NewMem())46 env, err := environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
47 c.Assert(err, gc.IsNil)47 c.Assert(err, gc.IsNil)
48 return env48 return env
49}49}
5050
=== modified file 'juju/apiconn_test.go'
--- juju/apiconn_test.go 2014-01-22 22:48:54 +0000
+++ juju/apiconn_test.go 2014-02-18 02:14:09 +0000
@@ -46,11 +46,12 @@
46func (*NewAPIConnSuite) TestNewConn(c *gc.C) {46func (*NewAPIConnSuite) TestNewConn(c *gc.C) {
47 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())47 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
48 c.Assert(err, gc.IsNil)48 c.Assert(err, gc.IsNil)
49 env, err := environs.Prepare(cfg, configstore.NewMem())49 ctx := coretesting.Context(c)
50 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
50 c.Assert(err, gc.IsNil)51 c.Assert(err, gc.IsNil)
5152
52 envtesting.UploadFakeTools(c, env.Storage())53 envtesting.UploadFakeTools(c, env.Storage())
53 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})54 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
54 c.Assert(err, gc.IsNil)55 c.Assert(err, gc.IsNil)
5556
56 cfg = env.Config()57 cfg = env.Config()
5758
=== modified file 'juju/conn_test.go'
--- juju/conn_test.go 2014-01-30 13:50:27 +0000
+++ juju/conn_test.go 2014-02-18 02:14:09 +0000
@@ -62,17 +62,14 @@
62 c.Assert(err, gc.IsNil)62 c.Assert(err, gc.IsNil)
63}63}
6464
65func bootstrapContext(c *gc.C) environs.BootstrapContext {
66 return envtesting.NewBootstrapContext(coretesting.Context(c))
67}
68
69func (*NewConnSuite) TestNewConnWithoutAdminSecret(c *gc.C) {65func (*NewConnSuite) TestNewConnWithoutAdminSecret(c *gc.C) {
70 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())66 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
71 c.Assert(err, gc.IsNil)67 c.Assert(err, gc.IsNil)
72 env, err := environs.Prepare(cfg, configstore.NewMem())68 ctx := coretesting.Context(c)
69 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
73 c.Assert(err, gc.IsNil)70 c.Assert(err, gc.IsNil)
74 envtesting.UploadFakeTools(c, env.Storage())71 envtesting.UploadFakeTools(c, env.Storage())
75 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})72 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
76 c.Assert(err, gc.IsNil)73 c.Assert(err, gc.IsNil)
7774
78 attrs := env.Config().AllAttrs()75 attrs := env.Config().AllAttrs()
@@ -88,10 +85,11 @@
88 if store == nil {85 if store == nil {
89 store = configstore.NewMem()86 store = configstore.NewMem()
90 }87 }
91 env, err := environs.PrepareFromName(envName, store)88 ctx := coretesting.Context(c)
89 env, err := environs.PrepareFromName(envName, ctx, store)
92 c.Assert(err, gc.IsNil)90 c.Assert(err, gc.IsNil)
93 envtesting.UploadFakeTools(c, env.Storage())91 envtesting.UploadFakeTools(c, env.Storage())
94 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})92 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
95 c.Assert(err, gc.IsNil)93 c.Assert(err, gc.IsNil)
96}94}
9795
@@ -133,10 +131,11 @@
133 })131 })
134 cfg, err := config.New(config.NoDefaults, attrs)132 cfg, err := config.New(config.NoDefaults, attrs)
135 c.Assert(err, gc.IsNil)133 c.Assert(err, gc.IsNil)
136 env, err := environs.Prepare(cfg, configstore.NewMem())134 ctx := coretesting.Context(c)
135 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
137 c.Assert(err, gc.IsNil)136 c.Assert(err, gc.IsNil)
138 envtesting.UploadFakeTools(c, env.Storage())137 envtesting.UploadFakeTools(c, env.Storage())
139 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})138 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
140 c.Assert(err, gc.IsNil)139 c.Assert(err, gc.IsNil)
141 info, _, err := env.StateInfo()140 info, _, err := env.StateInfo()
142 c.Assert(err, gc.IsNil)141 c.Assert(err, gc.IsNil)
@@ -182,10 +181,11 @@
182 })181 })
183 cfg, err := config.New(config.NoDefaults, attrs)182 cfg, err := config.New(config.NoDefaults, attrs)
184 c.Assert(err, gc.IsNil)183 c.Assert(err, gc.IsNil)
185 env, err := environs.Prepare(cfg, configstore.NewMem())184 ctx := coretesting.Context(c)
185 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
186 c.Assert(err, gc.IsNil)186 c.Assert(err, gc.IsNil)
187 envtesting.UploadFakeTools(c, env.Storage())187 envtesting.UploadFakeTools(c, env.Storage())
188 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})188 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
189 c.Assert(err, gc.IsNil)189 c.Assert(err, gc.IsNil)
190190
191 // Make a new Conn, which will push the secrets.191 // Make a new Conn, which will push the secrets.
@@ -218,10 +218,11 @@
218 })218 })
219 cfg, err := config.New(config.NoDefaults, attrs)219 cfg, err := config.New(config.NoDefaults, attrs)
220 c.Assert(err, gc.IsNil)220 c.Assert(err, gc.IsNil)
221 env, err := environs.Prepare(cfg, configstore.NewMem())221 ctx := coretesting.Context(c)
222 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
222 c.Assert(err, gc.IsNil)223 c.Assert(err, gc.IsNil)
223 envtesting.UploadFakeTools(c, env.Storage())224 envtesting.UploadFakeTools(c, env.Storage())
224 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})225 err = bootstrap.Bootstrap(ctx, env, constraints.Value{})
225 c.Assert(err, gc.IsNil)226 c.Assert(err, gc.IsNil)
226227
227 // Check that Bootstrap has correctly used a hash228 // Check that Bootstrap has correctly used a hash
@@ -272,10 +273,11 @@
272 s.ToolsFixture.SetUpTest(c)273 s.ToolsFixture.SetUpTest(c)
273 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())274 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
274 c.Assert(err, gc.IsNil)275 c.Assert(err, gc.IsNil)
275 environ, err := environs.Prepare(cfg, configstore.NewMem())276 ctx := coretesting.Context(c)
277 environ, err := environs.Prepare(cfg, ctx, configstore.NewMem())
276 c.Assert(err, gc.IsNil)278 c.Assert(err, gc.IsNil)
277 envtesting.UploadFakeTools(c, environ.Storage())279 envtesting.UploadFakeTools(c, environ.Storage())
278 err = bootstrap.Bootstrap(bootstrapContext(c), environ, constraints.Value{})280 err = bootstrap.Bootstrap(ctx, environ, constraints.Value{})
279 c.Assert(err, gc.IsNil)281 c.Assert(err, gc.IsNil)
280 s.conn, err = juju.NewConn(environ)282 s.conn, err = juju.NewConn(environ)
281 c.Assert(err, gc.IsNil)283 c.Assert(err, gc.IsNil)
282284
=== modified file 'juju/testing/conn.go'
--- juju/testing/conn.go 2014-02-13 00:54:09 +0000
+++ juju/testing/conn.go 2014-02-18 02:14:09 +0000
@@ -196,13 +196,13 @@
196 c.Assert(err, gc.IsNil)196 c.Assert(err, gc.IsNil)
197 s.ConfigStore = store197 s.ConfigStore = store
198198
199 environ, err := environs.PrepareFromName("dummyenv", s.ConfigStore)199 ctx := testing.Context(c)
200 environ, err := environs.PrepareFromName("dummyenv", ctx, s.ConfigStore)
200 c.Assert(err, gc.IsNil)201 c.Assert(err, gc.IsNil)
201 // sanity check we've got the correct environment.202 // sanity check we've got the correct environment.
202 c.Assert(environ.Name(), gc.Equals, "dummyenv")203 c.Assert(environ.Name(), gc.Equals, "dummyenv")
203204
204 envtesting.MustUploadFakeTools(environ.Storage())205 envtesting.MustUploadFakeTools(environ.Storage())
205 ctx := envtesting.NewBootstrapContext(testing.Context(c))
206 c.Assert(bootstrap.Bootstrap(ctx, environ, constraints.Value{}), gc.IsNil)206 c.Assert(bootstrap.Bootstrap(ctx, environ, constraints.Value{}), gc.IsNil)
207207
208 s.BackingState = environ.(GetStater).GetStateInAPIServer()208 s.BackingState = environ.(GetStater).GetStateInAPIServer()
209209
=== modified file 'provider/azure/environprovider.go'
--- provider/azure/environprovider.go 2014-01-28 04:58:43 +0000
+++ provider/azure/environprovider.go 2014-02-18 02:14:09 +0000
@@ -42,7 +42,7 @@
42}42}
4343
44// Prepare is specified in the EnvironProvider interface.44// Prepare is specified in the EnvironProvider interface.
45func (prov azureEnvironProvider) Prepare(cfg *config.Config) (environs.Environ, error) {45func (prov azureEnvironProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
46 // TODO prepare environment as necessary46 // TODO prepare environment as necessary
47 return prov.Open(cfg)47 return prov.Open(cfg)
48}48}
4949
=== modified file 'provider/common/bootstrap.go'
--- provider/common/bootstrap.go 2014-01-30 14:13:54 +0000
+++ provider/common/bootstrap.go 2014-02-18 02:14:09 +0000
@@ -68,12 +68,12 @@
68 return err68 return err
69 }69 }
7070
71 fmt.Fprintln(ctx.Stderr(), "Launching instance")71 fmt.Fprintln(ctx.GetStderr(), "Launching instance")
72 inst, hw, err := env.StartInstance(cons, selectedTools, machineConfig)72 inst, hw, err := env.StartInstance(cons, selectedTools, machineConfig)
73 if err != nil {73 if err != nil {
74 return fmt.Errorf("cannot start bootstrap instance: %v", err)74 return fmt.Errorf("cannot start bootstrap instance: %v", err)
75 }75 }
76 fmt.Fprintf(ctx.Stderr(), " - %s\n", inst.Id())76 fmt.Fprintf(ctx.GetStderr(), " - %s\n", inst.Id())
7777
78 var characteristics []instance.HardwareCharacteristics78 var characteristics []instance.HardwareCharacteristics
79 if hw != nil {79 if hw != nil {
@@ -144,12 +144,12 @@
144 defer close(ch)144 defer close(ch)
145 go func() {145 go func() {
146 for _ = range ch {146 for _ = range ch {
147 fmt.Fprintln(ctx.Stderr(), "Cleaning up failed bootstrap")147 fmt.Fprintln(ctx.GetStderr(), "Cleaning up failed bootstrap")
148 }148 }
149 }()149 }()
150150
151 if inst != nil {151 if inst != nil {
152 fmt.Fprintln(ctx.Stderr(), "Stopping instance...")152 fmt.Fprintln(ctx.GetStderr(), "Stopping instance...")
153 if stoperr := env.StopInstances([]instance.Instance{inst}); stoperr != nil {153 if stoperr := env.StopInstances([]instance.Instance{inst}); stoperr != nil {
154 logger.Errorf("cannot stop failed bootstrap instance %q: %v", inst.Id(), stoperr)154 logger.Errorf("cannot stop failed bootstrap instance %q: %v", inst.Id(), stoperr)
155 } else {155 } else {
@@ -217,7 +217,7 @@
217 Host: "ubuntu@" + addr,217 Host: "ubuntu@" + addr,
218 Client: client,218 Client: client,
219 Config: cloudcfg,219 Config: cloudcfg,
220 ProgressWriter: ctx.Stderr(),220 ProgressWriter: ctx.GetStderr(),
221 })221 })
222}222}
223223
@@ -365,14 +365,14 @@
365 checker := parallelHostChecker{365 checker := parallelHostChecker{
366 Try: parallel.NewTry(0, nil),366 Try: parallel.NewTry(0, nil),
367 client: client,367 client: client,
368 stderr: ctx.Stderr(),368 stderr: ctx.GetStderr(),
369 active: make(map[instance.Address]chan struct{}),369 active: make(map[instance.Address]chan struct{}),
370 checkDelay: timeout.RetryDelay,370 checkDelay: timeout.RetryDelay,
371 checkHostScript: checkHostScript,371 checkHostScript: checkHostScript,
372 }372 }
373 defer checker.Kill()373 defer checker.Kill()
374374
375 fmt.Fprintln(ctx.Stderr(), "Waiting for address")375 fmt.Fprintln(ctx.GetStderr(), "Waiting for address")
376 for {376 for {
377 select {377 select {
378 case <-pollAddresses.C:378 case <-pollAddresses.C:
379379
=== modified file 'provider/common/bootstrap_test.go'
--- provider/common/bootstrap_test.go 2014-01-30 17:27:26 +0000
+++ provider/common/bootstrap_test.go 2014-02-18 02:14:09 +0000
@@ -4,7 +4,6 @@
4package common_test4package common_test
55
6import (6import (
7 "bytes"
8 "fmt"7 "fmt"
9 "os"8 "os"
10 "time"9 "time"
@@ -76,22 +75,13 @@
76 return func() *config.Config { return cfg }75 return func() *config.Config { return cfg }
77}76}
7877
79// bootstrapContext creates a BootstrapContext which
80// writes stderr to the bytes.Buffer returned.
81func bootstrapContext(c *gc.C) (ctx environs.BootstrapContext, stderr *bytes.Buffer) {
82 cmdContext := coretesting.Context(c)
83 stderr = &bytes.Buffer{}
84 cmdContext.Stderr = stderr
85 return envtesting.NewBootstrapContext(cmdContext), stderr
86}
87
88func (s *BootstrapSuite) TestCannotWriteStateFile(c *gc.C) {78func (s *BootstrapSuite) TestCannotWriteStateFile(c *gc.C) {
89 brokenStorage := &mockStorage{79 brokenStorage := &mockStorage{
90 Storage: newStorage(s, c),80 Storage: newStorage(s, c),
91 putErr: fmt.Errorf("noes!"),81 putErr: fmt.Errorf("noes!"),
92 }82 }
93 env := &mockEnviron{storage: brokenStorage}83 env := &mockEnviron{storage: brokenStorage}
94 ctx, _ := bootstrapContext(c)84 ctx := coretesting.Context(c)
95 err := common.Bootstrap(ctx, env, constraints.Value{})85 err := common.Bootstrap(ctx, env, constraints.Value{})
96 c.Assert(err, gc.ErrorMatches, "cannot create initial state file: noes!")86 c.Assert(err, gc.ErrorMatches, "cannot create initial state file: noes!")
97}87}
@@ -118,7 +108,7 @@
118 config: configGetter(c),108 config: configGetter(c),
119 }109 }
120110
121 ctx, _ := bootstrapContext(c)111 ctx := coretesting.Context(c)
122 err = common.Bootstrap(ctx, env, checkCons)112 err = common.Bootstrap(ctx, env, checkCons)
123 c.Assert(err, gc.ErrorMatches, "cannot start bootstrap instance: meh, not started")113 c.Assert(err, gc.ErrorMatches, "cannot start bootstrap instance: meh, not started")
124}114}
@@ -149,7 +139,7 @@
149 config: configGetter(c),139 config: configGetter(c),
150 }140 }
151141
152 ctx, _ := bootstrapContext(c)142 ctx := coretesting.Context(c)
153 err := common.Bootstrap(ctx, env, constraints.Value{})143 err := common.Bootstrap(ctx, env, constraints.Value{})
154 c.Assert(err, gc.ErrorMatches, "cannot save state: suddenly a wild blah")144 c.Assert(err, gc.ErrorMatches, "cannot save state: suddenly a wild blah")
155 c.Assert(stopped, gc.HasLen, 1)145 c.Assert(stopped, gc.HasLen, 1)
@@ -186,7 +176,7 @@
186 config: configGetter(c),176 config: configGetter(c),
187 }177 }
188178
189 ctx, _ := bootstrapContext(c)179 ctx := coretesting.Context(c)
190 err := common.Bootstrap(ctx, env, constraints.Value{})180 err := common.Bootstrap(ctx, env, constraints.Value{})
191 c.Assert(err, gc.ErrorMatches, "cannot save state: suddenly a wild blah")181 c.Assert(err, gc.ErrorMatches, "cannot save state: suddenly a wild blah")
192 c.Assert(stopped, gc.HasLen, 1)182 c.Assert(stopped, gc.HasLen, 1)
@@ -231,7 +221,7 @@
231 setConfig: setConfig,221 setConfig: setConfig,
232 }222 }
233 originalAuthKeys := env.Config().AuthorizedKeys()223 originalAuthKeys := env.Config().AuthorizedKeys()
234 ctx, _ := bootstrapContext(c)224 ctx := coretesting.Context(c)
235 err := common.Bootstrap(ctx, env, constraints.Value{})225 err := common.Bootstrap(ctx, env, constraints.Value{})
236 c.Assert(err, gc.IsNil)226 c.Assert(err, gc.IsNil)
237227
@@ -268,14 +258,14 @@
268}258}
269259
270func (s *BootstrapSuite) TestWaitSSHTimesOutWaitingForAddresses(c *gc.C) {260func (s *BootstrapSuite) TestWaitSSHTimesOutWaitingForAddresses(c *gc.C) {
271 ctx, stderr := bootstrapContext(c)261 ctx := coretesting.Context(c)
272 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", neverAddresses{}, testSSHTimeout)262 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", neverAddresses{}, testSSHTimeout)
273 c.Check(err, gc.ErrorMatches, `waited for `+testSSHTimeout.Timeout.String()+` without getting any addresses`)263 c.Check(err, gc.ErrorMatches, `waited for `+testSSHTimeout.Timeout.String()+` without getting any addresses`)
274 c.Check(stderr.String(), gc.Matches, "Waiting for address\n")264 c.Check(coretesting.Stderr(ctx), gc.Matches, "Waiting for address\n")
275}265}
276266
277func (s *BootstrapSuite) TestWaitSSHKilledWaitingForAddresses(c *gc.C) {267func (s *BootstrapSuite) TestWaitSSHKilledWaitingForAddresses(c *gc.C) {
278 ctx, stderr := bootstrapContext(c)268 ctx := coretesting.Context(c)
279 interrupted := make(chan os.Signal, 1)269 interrupted := make(chan os.Signal, 1)
280 go func() {270 go func() {
281 <-time.After(2 * time.Millisecond)271 <-time.After(2 * time.Millisecond)
@@ -283,7 +273,7 @@
283 }()273 }()
284 _, err := common.WaitSSH(ctx, interrupted, ssh.DefaultClient, "/bin/true", neverAddresses{}, testSSHTimeout)274 _, err := common.WaitSSH(ctx, interrupted, ssh.DefaultClient, "/bin/true", neverAddresses{}, testSSHTimeout)
285 c.Check(err, gc.ErrorMatches, "interrupted")275 c.Check(err, gc.ErrorMatches, "interrupted")
286 c.Check(stderr.String(), gc.Matches, "Waiting for address\n")276 c.Check(coretesting.Stderr(ctx), gc.Matches, "Waiting for address\n")
287}277}
288278
289type brokenAddresses struct {279type brokenAddresses struct {
@@ -295,10 +285,10 @@
295}285}
296286
297func (s *BootstrapSuite) TestWaitSSHStopsOnBadError(c *gc.C) {287func (s *BootstrapSuite) TestWaitSSHStopsOnBadError(c *gc.C) {
298 ctx, stderr := bootstrapContext(c)288 ctx := coretesting.Context(c)
299 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", brokenAddresses{}, testSSHTimeout)289 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", brokenAddresses{}, testSSHTimeout)
300 c.Check(err, gc.ErrorMatches, "getting addresses: Addresses will never work")290 c.Check(err, gc.ErrorMatches, "getting addresses: Addresses will never work")
301 c.Check(stderr.String(), gc.Equals, "Waiting for address\n")291 c.Check(coretesting.Stderr(ctx), gc.Equals, "Waiting for address\n")
302}292}
303293
304type neverOpensPort struct {294type neverOpensPort struct {
@@ -311,12 +301,12 @@
311}301}
312302
313func (s *BootstrapSuite) TestWaitSSHTimesOutWaitingForDial(c *gc.C) {303func (s *BootstrapSuite) TestWaitSSHTimesOutWaitingForDial(c *gc.C) {
314 ctx, stderr := bootstrapContext(c)304 ctx := coretesting.Context(c)
315 // 0.x.y.z addresses are always invalid305 // 0.x.y.z addresses are always invalid
316 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", &neverOpensPort{addr: "0.1.2.3"}, testSSHTimeout)306 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "/bin/true", &neverOpensPort{addr: "0.1.2.3"}, testSSHTimeout)
317 c.Check(err, gc.ErrorMatches,307 c.Check(err, gc.ErrorMatches,
318 `waited for `+testSSHTimeout.Timeout.String()+` without being able to connect: mock connection failure to 0.1.2.3`)308 `waited for `+testSSHTimeout.Timeout.String()+` without being able to connect: mock connection failure to 0.1.2.3`)
319 c.Check(stderr.String(), gc.Matches,309 c.Check(coretesting.Stderr(ctx), gc.Matches,
320 "Waiting for address\n"+310 "Waiting for address\n"+
321 "(Attempting to connect to 0.1.2.3:22\n)+")311 "(Attempting to connect to 0.1.2.3:22\n)+")
322}312}
@@ -339,14 +329,14 @@
339}329}
340330
341func (s *BootstrapSuite) TestWaitSSHKilledWaitingForDial(c *gc.C) {331func (s *BootstrapSuite) TestWaitSSHKilledWaitingForDial(c *gc.C) {
342 ctx, stderr := bootstrapContext(c)332 ctx := coretesting.Context(c)
343 timeout := testSSHTimeout333 timeout := testSSHTimeout
344 timeout.Timeout = 1 * time.Minute334 timeout.Timeout = 1 * time.Minute
345 interrupted := make(chan os.Signal, 1)335 interrupted := make(chan os.Signal, 1)
346 _, err := common.WaitSSH(ctx, interrupted, ssh.DefaultClient, "", &interruptOnDial{name: "0.1.2.3", interrupted: interrupted}, timeout)336 _, err := common.WaitSSH(ctx, interrupted, ssh.DefaultClient, "", &interruptOnDial{name: "0.1.2.3", interrupted: interrupted}, timeout)
347 c.Check(err, gc.ErrorMatches, "interrupted")337 c.Check(err, gc.ErrorMatches, "interrupted")
348 // Exact timing is imprecise but it should have tried a few times before being killed338 // Exact timing is imprecise but it should have tried a few times before being killed
349 c.Check(stderr.String(), gc.Matches,339 c.Check(coretesting.Stderr(ctx), gc.Matches,
350 "Waiting for address\n"+340 "Waiting for address\n"+
351 "(Attempting to connect to 0.1.2.3:22\n)+")341 "(Attempting to connect to 0.1.2.3:22\n)+")
352}342}
@@ -371,7 +361,7 @@
371}361}
372362
373func (s *BootstrapSuite) TestWaitSSHRefreshAddresses(c *gc.C) {363func (s *BootstrapSuite) TestWaitSSHRefreshAddresses(c *gc.C) {
374 ctx, stderr := bootstrapContext(c)364 ctx := coretesting.Context(c)
375 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "", &addressesChange{addrs: [][]string{365 _, err := common.WaitSSH(ctx, nil, ssh.DefaultClient, "", &addressesChange{addrs: [][]string{
376 nil,366 nil,
377 nil,367 nil,
@@ -383,10 +373,11 @@
383 // Not necessarily the last one in the list, due to scheduling.373 // Not necessarily the last one in the list, due to scheduling.
384 c.Check(err, gc.ErrorMatches,374 c.Check(err, gc.ErrorMatches,
385 `waited for `+testSSHTimeout.Timeout.String()+` without being able to connect: mock connection failure to 0.1.2.[34]`)375 `waited for `+testSSHTimeout.Timeout.String()+` without being able to connect: mock connection failure to 0.1.2.[34]`)
386 c.Check(stderr.String(), gc.Matches,376 stderr := coretesting.Stderr(ctx)
377 c.Check(stderr, gc.Matches,
387 "Waiting for address\n"+378 "Waiting for address\n"+
388 "(.|\n)*(Attempting to connect to 0.1.2.3:22\n)+(.|\n)*")379 "(.|\n)*(Attempting to connect to 0.1.2.3:22\n)+(.|\n)*")
389 c.Check(stderr.String(), gc.Matches,380 c.Check(stderr, gc.Matches,
390 "Waiting for address\n"+381 "Waiting for address\n"+
391 "(.|\n)*(Attempting to connect to 0.1.2.4:22\n)+(.|\n)*")382 "(.|\n)*(Attempting to connect to 0.1.2.4:22\n)+(.|\n)*")
392}383}
393384
=== modified file 'provider/dummy/config_test.go'
--- provider/dummy/config_test.go 2013-10-01 16:46:31 +0000
+++ provider/dummy/config_test.go 2014-02-18 02:14:09 +0000
@@ -29,7 +29,8 @@
29 attrs := dummy.SampleConfig().Delete("secret")29 attrs := dummy.SampleConfig().Delete("secret")
30 cfg, err := config.New(config.NoDefaults, attrs)30 cfg, err := config.New(config.NoDefaults, attrs)
31 c.Assert(err, gc.IsNil)31 c.Assert(err, gc.IsNil)
32 env, err := environs.Prepare(cfg, configstore.NewMem())32 ctx := testing.Context(c)
33 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
33 c.Assert(err, gc.IsNil)34 c.Assert(err, gc.IsNil)
34 defer env.Destroy()35 defer env.Destroy()
35 expected := map[string]string{36 expected := map[string]string{
@@ -81,7 +82,8 @@
81 c.Assert(err, gc.ErrorMatches, test.errorMsg)82 c.Assert(err, gc.ErrorMatches, test.errorMsg)
82 continue83 continue
83 }84 }
84 env, err := environs.Prepare(cfg, configstore.NewMem())85 ctx := testing.Context(c)
86 env, err := environs.Prepare(cfg, ctx, configstore.NewMem())
85 if test.errorMsg != "" {87 if test.errorMsg != "" {
86 c.Assert(err, gc.ErrorMatches, test.errorMsg)88 c.Assert(err, gc.ErrorMatches, test.errorMsg)
87 continue89 continue
8890
=== modified file 'provider/dummy/environs.go'
--- provider/dummy/environs.go 2014-02-03 06:58:26 +0000
+++ provider/dummy/environs.go 2014-02-18 02:14:09 +0000
@@ -422,7 +422,7 @@
422 return env, nil422 return env, nil
423}423}
424424
425func (p *environProvider) Prepare(cfg *config.Config) (environs.Environ, error) {425func (p *environProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
426 cfg, err := p.prepare(cfg)426 cfg, err := p.prepare(cfg)
427 if err != nil {427 if err != nil {
428 return nil, err428 return nil, err
429429
=== modified file 'provider/ec2/config_test.go'
--- provider/ec2/config_test.go 2013-10-24 00:20:59 +0000
+++ provider/ec2/config_test.go 2014-02-18 02:14:09 +0000
@@ -294,12 +294,13 @@
294 cfg, err := config.New(config.NoDefaults, attrs)294 cfg, err := config.New(config.NoDefaults, attrs)
295 c.Assert(err, gc.IsNil)295 c.Assert(err, gc.IsNil)
296296
297 env0, err := providerInstance.Prepare(cfg)297 ctx := testing.Context(c)
298 env0, err := providerInstance.Prepare(ctx, cfg)
298 c.Assert(err, gc.IsNil)299 c.Assert(err, gc.IsNil)
299 bucket0 := env0.(*environ).ecfg().controlBucket()300 bucket0 := env0.(*environ).ecfg().controlBucket()
300 c.Assert(bucket0, gc.Matches, "[a-f0-9]{32}")301 c.Assert(bucket0, gc.Matches, "[a-f0-9]{32}")
301302
302 env1, err := providerInstance.Prepare(cfg)303 env1, err := providerInstance.Prepare(ctx, cfg)
303 c.Assert(err, gc.IsNil)304 c.Assert(err, gc.IsNil)
304 bucket1 := env1.(*environ).ecfg().controlBucket()305 bucket1 := env1.(*environ).ecfg().controlBucket()
305 c.Assert(bucket1, gc.Matches, "[a-f0-9]{32}")306 c.Assert(bucket1, gc.Matches, "[a-f0-9]{32}")
@@ -315,7 +316,7 @@
315 cfg, err := config.New(config.NoDefaults, attrs)316 cfg, err := config.New(config.NoDefaults, attrs)
316 c.Assert(err, gc.IsNil)317 c.Assert(err, gc.IsNil)
317318
318 env, err := providerInstance.Prepare(cfg)319 env, err := providerInstance.Prepare(testing.Context(c), cfg)
319 c.Assert(err, gc.IsNil)320 c.Assert(err, gc.IsNil)
320 bucket := env.(*environ).ecfg().controlBucket()321 bucket := env.(*environ).ecfg().controlBucket()
321 c.Assert(bucket, gc.Equals, "burblefoo")322 c.Assert(bucket, gc.Equals, "burblefoo")
322323
=== modified file 'provider/ec2/ec2.go'
--- provider/ec2/ec2.go 2014-01-29 09:58:08 +0000
+++ provider/ec2/ec2.go 2014-02-18 02:14:09 +0000
@@ -207,7 +207,7 @@
207 return e, nil207 return e, nil
208}208}
209209
210func (p environProvider) Prepare(cfg *config.Config) (environs.Environ, error) {210func (p environProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
211 attrs := cfg.UnknownAttrs()211 attrs := cfg.UnknownAttrs()
212 if _, ok := attrs["control-bucket"]; !ok {212 if _, ok := attrs["control-bucket"]; !ok {
213 uuid, err := utils.NewUUID()213 uuid, err := utils.NewUUID()
214214
=== modified file 'provider/ec2/local_test.go'
--- provider/ec2/local_test.go 2014-01-29 06:45:16 +0000
+++ provider/ec2/local_test.go 2014-02-18 02:14:09 +0000
@@ -74,7 +74,7 @@
74 }74 }
75 cfg, err := config.New(config.NoDefaults, envAttrs)75 cfg, err := config.New(config.NoDefaults, envAttrs)
76 c.Assert(err, gc.IsNil)76 c.Assert(err, gc.IsNil)
77 env, err := environs.Prepare(cfg, configstore.NewMem())77 env, err := environs.Prepare(cfg, coretesting.Context(c), configstore.NewMem())
78 c.Assert(err, gc.IsNil)78 c.Assert(err, gc.IsNil)
79 c.Assert(env, gc.NotNil)79 c.Assert(env, gc.NotNil)
8080
@@ -229,10 +229,6 @@
229 t.srv.stopServer(c)229 t.srv.stopServer(c)
230}230}
231231
232func bootstrapContext(c *gc.C) environs.BootstrapContext {
233 return envtesting.NewBootstrapContext(coretesting.Context(c))
234}
235
236func (t *localServerSuite) TestPrecheck(c *gc.C) {232func (t *localServerSuite) TestPrecheck(c *gc.C) {
237 env := t.Prepare(c)233 env := t.Prepare(c)
238 prechecker, ok := env.(environs.Prechecker)234 prechecker, ok := env.(environs.Prechecker)
@@ -247,7 +243,7 @@
247func (t *localServerSuite) TestBootstrapInstanceUserDataAndState(c *gc.C) {243func (t *localServerSuite) TestBootstrapInstanceUserDataAndState(c *gc.C) {
248 env := t.Prepare(c)244 env := t.Prepare(c)
249 envtesting.UploadFakeTools(c, env.Storage())245 envtesting.UploadFakeTools(c, env.Storage())
250 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})246 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
251 c.Assert(err, gc.IsNil)247 c.Assert(err, gc.IsNil)
252248
253 // check that the state holds the id of the bootstrap machine.249 // check that the state holds the id of the bootstrap machine.
@@ -334,7 +330,7 @@
334func (t *localServerSuite) TestInstanceStatus(c *gc.C) {330func (t *localServerSuite) TestInstanceStatus(c *gc.C) {
335 env := t.Prepare(c)331 env := t.Prepare(c)
336 envtesting.UploadFakeTools(c, env.Storage())332 envtesting.UploadFakeTools(c, env.Storage())
337 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})333 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
338 c.Assert(err, gc.IsNil)334 c.Assert(err, gc.IsNil)
339 t.srv.ec2srv.SetInitialInstanceState(ec2test.Terminated)335 t.srv.ec2srv.SetInitialInstanceState(ec2test.Terminated)
340 inst, _ := testing.AssertStartInstance(c, env, "1")336 inst, _ := testing.AssertStartInstance(c, env, "1")
@@ -345,7 +341,7 @@
345func (t *localServerSuite) TestStartInstanceHardwareCharacteristics(c *gc.C) {341func (t *localServerSuite) TestStartInstanceHardwareCharacteristics(c *gc.C) {
346 env := t.Prepare(c)342 env := t.Prepare(c)
347 envtesting.UploadFakeTools(c, env.Storage())343 envtesting.UploadFakeTools(c, env.Storage())
348 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})344 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
349 c.Assert(err, gc.IsNil)345 c.Assert(err, gc.IsNil)
350 _, hc := testing.AssertStartInstance(c, env, "1")346 _, hc := testing.AssertStartInstance(c, env, "1")
351 c.Check(*hc.Arch, gc.Equals, "amd64")347 c.Check(*hc.Arch, gc.Equals, "amd64")
@@ -357,7 +353,7 @@
357func (t *localServerSuite) TestAddresses(c *gc.C) {353func (t *localServerSuite) TestAddresses(c *gc.C) {
358 env := t.Prepare(c)354 env := t.Prepare(c)
359 envtesting.UploadFakeTools(c, env.Storage())355 envtesting.UploadFakeTools(c, env.Storage())
360 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})356 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
361 c.Assert(err, gc.IsNil)357 c.Assert(err, gc.IsNil)
362 inst, _ := testing.AssertStartInstance(c, env, "1")358 inst, _ := testing.AssertStartInstance(c, env, "1")
363 c.Assert(err, gc.IsNil)359 c.Assert(err, gc.IsNil)
@@ -442,7 +438,7 @@
442438
443 cfg, err := config.New(config.NoDefaults, localConfigAttrs)439 cfg, err := config.New(config.NoDefaults, localConfigAttrs)
444 c.Assert(err, gc.IsNil)440 c.Assert(err, gc.IsNil)
445 env, err := environs.Prepare(cfg, configstore.NewMem())441 env, err := environs.Prepare(cfg, coretesting.Context(c), configstore.NewMem())
446 c.Assert(err, gc.IsNil)442 c.Assert(err, gc.IsNil)
447 t.env = env443 t.env = env
448}444}
449445
=== modified file 'provider/joyent/config_test.go'
--- provider/joyent/config_test.go 2013-11-21 17:53:05 +0000
+++ provider/joyent/config_test.go 2014-02-18 02:14:09 +0000
@@ -286,7 +286,7 @@
286 c.Logf("test %d: %s", i, test.info)286 c.Logf("test %d: %s", i, test.info)
287 attrs := validAttrs().Merge(test.insert).Delete(test.remove...)287 attrs := validAttrs().Merge(test.insert).Delete(test.remove...)
288 testConfig := newConfig(c, attrs)288 testConfig := newConfig(c, attrs)
289 preparedConfig, err := joyent.Provider.Prepare(testConfig)289 preparedConfig, err := joyent.Provider.Prepare(testing.Context(c), testConfig)
290 if test.err == "" {290 if test.err == "" {
291 c.Assert(err, gc.IsNil)291 c.Assert(err, gc.IsNil)
292 attrs := preparedConfig.Config().AllAttrs()292 attrs := preparedConfig.Config().AllAttrs()
293293
=== modified file 'provider/joyent/provider.go'
--- provider/joyent/provider.go 2014-01-28 04:58:43 +0000
+++ provider/joyent/provider.go 2014-02-18 02:14:09 +0000
@@ -30,7 +30,7 @@
3030
31var errNotImplemented = errors.New("not implemented in Joyent provider")31var errNotImplemented = errors.New("not implemented in Joyent provider")
3232
33func (environProvider) Prepare(cfg *config.Config) (environs.Environ, error) {33func (environProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
34 // This method may be called with an incomplete cfg. It should make every34 // This method may be called with an incomplete cfg. It should make every
35 // reasonable effort to create a valid configuration based on the supplied,35 // reasonable effort to create a valid configuration based on the supplied,
36 // and open the resulting environment.36 // and open the resulting environment.
3737
=== modified file 'provider/local/config_test.go'
--- provider/local/config_test.go 2014-01-31 08:44:08 +0000
+++ provider/local/config_test.go 2014-02-18 02:14:09 +0000
@@ -10,7 +10,6 @@
1010
11 "launchpad.net/juju-core/constraints"11 "launchpad.net/juju-core/constraints"
12 "launchpad.net/juju-core/environs/config"12 "launchpad.net/juju-core/environs/config"
13 envtesting "launchpad.net/juju-core/environs/testing"
14 "launchpad.net/juju-core/juju/osenv"13 "launchpad.net/juju-core/juju/osenv"
15 "launchpad.net/juju-core/provider"14 "launchpad.net/juju-core/provider"
16 "launchpad.net/juju-core/provider/local"15 "launchpad.net/juju-core/provider/local"
@@ -109,8 +108,8 @@
109func (s *configSuite) TestBootstrapAsRoot(c *gc.C) {108func (s *configSuite) TestBootstrapAsRoot(c *gc.C) {
110 restore := local.SetRootCheckFunction(func() bool { return true })109 restore := local.SetRootCheckFunction(func() bool { return true })
111 defer restore()110 defer restore()
112 env, err := local.Provider.Prepare(minimalConfig(c))111 env, err := local.Provider.Prepare(testing.Context(c), minimalConfig(c))
113 c.Assert(err, gc.IsNil)112 c.Assert(err, gc.IsNil)
114 err = env.Bootstrap(envtesting.NewBootstrapContext(testing.Context(c)), constraints.Value{})113 err = env.Bootstrap(testing.Context(c), constraints.Value{})
115 c.Assert(err, gc.ErrorMatches, "bootstrapping a local environment must not be done as root")114 c.Assert(err, gc.ErrorMatches, "bootstrapping a local environment must not be done as root")
116}115}
117116
=== modified file 'provider/local/environ.go'
--- provider/local/environ.go 2014-02-14 03:11:25 +0000
+++ provider/local/environ.go 2014-02-18 02:14:09 +0000
@@ -195,8 +195,8 @@
195 }195 }
196 cmd := exec.Command("sudo", "/bin/bash", "-s")196 cmd := exec.Command("sudo", "/bin/bash", "-s")
197 cmd.Stdin = strings.NewReader(script)197 cmd.Stdin = strings.NewReader(script)
198 cmd.Stdout = ctx.Stdout()198 cmd.Stdout = ctx.GetStdout()
199 cmd.Stderr = ctx.Stderr()199 cmd.Stderr = ctx.GetStderr()
200 return cmd.Run()200 return cmd.Run()
201}201}
202202
203203
=== modified file 'provider/local/environ_test.go'
--- provider/local/environ_test.go 2014-02-12 02:56:13 +0000
+++ provider/local/environ_test.go 2014-02-18 02:14:09 +0000
@@ -161,11 +161,11 @@
161 return nil161 return nil
162 })162 })
163 testConfig := minimalConfig(c)163 testConfig := minimalConfig(c)
164 environ, err := local.Provider.Prepare(testConfig)164 ctx := coretesting.Context(c)
165 environ, err := local.Provider.Prepare(ctx, testConfig)
165 c.Assert(err, gc.IsNil)166 c.Assert(err, gc.IsNil)
166 envtesting.UploadFakeTools(c, environ.Storage())167 envtesting.UploadFakeTools(c, environ.Storage())
167 defer environ.Storage().RemoveAll()168 defer environ.Storage().RemoveAll()
168 ctx := envtesting.NewBootstrapContext(coretesting.Context(c))
169 err = environ.Bootstrap(ctx, constraints.Value{})169 err = environ.Bootstrap(ctx, constraints.Value{})
170 c.Assert(err, gc.IsNil)170 c.Assert(err, gc.IsNil)
171}171}
172172
=== modified file 'provider/local/environprovider.go'
--- provider/local/environprovider.go 2014-02-14 04:26:21 +0000
+++ provider/local/environprovider.go 2014-02-18 02:14:09 +0000
@@ -86,7 +86,7 @@
86var detectAptProxies = utils.DetectAptProxies86var detectAptProxies = utils.DetectAptProxies
8787
88// Prepare implements environs.EnvironProvider.Prepare.88// Prepare implements environs.EnvironProvider.Prepare.
89func (p environProvider) Prepare(cfg *config.Config) (environs.Environ, error) {89func (p environProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
90 // The user must not set bootstrap-ip; this is determined by the provider,90 // The user must not set bootstrap-ip; this is determined by the provider,
91 // and its presence used to determine whether the environment has yet been91 // and its presence used to determine whether the environment has yet been
92 // bootstrapped.92 // bootstrapped.
9393
=== modified file 'provider/local/environprovider_test.go'
--- provider/local/environprovider_test.go 2014-02-14 03:41:57 +0000
+++ provider/local/environprovider_test.go 2014-02-18 02:14:09 +0000
@@ -215,7 +215,7 @@
215 testConfig, err = baseConfig.Apply(test.extraConfig)215 testConfig, err = baseConfig.Apply(test.extraConfig)
216 c.Assert(err, gc.IsNil)216 c.Assert(err, gc.IsNil)
217 }217 }
218 env, err := provider.Prepare(testConfig)218 env, err := provider.Prepare(testing.Context(c), testConfig)
219 c.Assert(err, gc.IsNil)219 c.Assert(err, gc.IsNil)
220220
221 envConfig := env.Config()221 envConfig := env.Config()
@@ -269,7 +269,7 @@
269 s.PatchValue(local.UserCurrent, func() (*user.User, error) {269 s.PatchValue(local.UserCurrent, func() (*user.User, error) {
270 return &user.User{Username: test.userOS}, test.userOSErr270 return &user.User{Username: test.userOS}, test.userOSErr
271 })271 })
272 env, err := provider.Prepare(basecfg)272 env, err := provider.Prepare(testing.Context(c), basecfg)
273 if test.err == "" {273 if test.err == "" {
274 c.Assert(err, gc.IsNil)274 c.Assert(err, gc.IsNil)
275 cfg := env.Config()275 cfg := env.Config()
276276
=== modified file 'provider/maas/environ_whitebox_test.go'
--- provider/maas/environ_whitebox_test.go 2014-01-29 06:45:16 +0000
+++ provider/maas/environ_whitebox_test.go 2014-02-18 02:14:09 +0000
@@ -149,16 +149,12 @@
149 return utils.Gunzip(data)149 return utils.Gunzip(data)
150}150}
151151
152func bootstrapContext(c *gc.C) environs.BootstrapContext {
153 return envtesting.NewBootstrapContext(coretesting.Context(c))
154}
155
156func (suite *environSuite) TestStartInstanceStartsInstance(c *gc.C) {152func (suite *environSuite) TestStartInstanceStartsInstance(c *gc.C) {
157 suite.setupFakeTools(c)153 suite.setupFakeTools(c)
158 env := suite.makeEnviron()154 env := suite.makeEnviron()
159 // Create node 0: it will be used as the bootstrap node.155 // Create node 0: it will be used as the bootstrap node.
160 suite.testMAASObject.TestServer.NewNode(`{"system_id": "node0", "hostname": "host0"}`)156 suite.testMAASObject.TestServer.NewNode(`{"system_id": "node0", "hostname": "host0"}`)
161 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})157 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
162 c.Assert(err, gc.IsNil)158 c.Assert(err, gc.IsNil)
163 // The bootstrap node has been acquired and started.159 // The bootstrap node has been acquired and started.
164 operations := suite.testMAASObject.TestServer.NodeOperations()160 operations := suite.testMAASObject.TestServer.NodeOperations()
@@ -372,7 +368,7 @@
372 suite.setupFakeTools(c)368 suite.setupFakeTools(c)
373 env := suite.makeEnviron()369 env := suite.makeEnviron()
374 suite.testMAASObject.TestServer.NewNode(`{"system_id": "thenode", "hostname": "host"}`)370 suite.testMAASObject.TestServer.NewNode(`{"system_id": "thenode", "hostname": "host"}`)
375 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})371 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
376 c.Assert(err, gc.IsNil)372 c.Assert(err, gc.IsNil)
377}373}
378374
@@ -388,14 +384,14 @@
388 c.Assert(err, gc.IsNil)384 c.Assert(err, gc.IsNil)
389 err = env.SetConfig(cfg)385 err = env.SetConfig(cfg)
390 c.Assert(err, gc.IsNil)386 c.Assert(err, gc.IsNil)
391 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})387 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
392 c.Check(err, gc.ErrorMatches, "cannot find bootstrap tools.*")388 c.Check(err, gc.ErrorMatches, "cannot find bootstrap tools.*")
393}389}
394390
395func (suite *environSuite) TestBootstrapFailsIfNoNodes(c *gc.C) {391func (suite *environSuite) TestBootstrapFailsIfNoNodes(c *gc.C) {
396 suite.setupFakeTools(c)392 suite.setupFakeTools(c)
397 env := suite.makeEnviron()393 env := suite.makeEnviron()
398 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})394 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
399 // Since there are no nodes, the attempt to allocate one returns a395 // Since there are no nodes, the attempt to allocate one returns a
400 // 409: Conflict.396 // 409: Conflict.
401 c.Check(err, gc.ErrorMatches, ".*409.*")397 c.Check(err, gc.ErrorMatches, ".*409.*")
@@ -407,7 +403,7 @@
407 suite.testMAASObject.TestServer.NewNode(`{"system_id": "bootstrapnode", "hostname": "host"}`)403 suite.testMAASObject.TestServer.NewNode(`{"system_id": "bootstrapnode", "hostname": "host"}`)
408404
409 // bootstrap.Bootstrap calls Environ.Bootstrap. This works.405 // bootstrap.Bootstrap calls Environ.Bootstrap. This works.
410 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})406 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
411 c.Assert(err, gc.IsNil)407 c.Assert(err, gc.IsNil)
412}408}
413409
414410
=== modified file 'provider/maas/environprovider.go'
--- provider/maas/environprovider.go 2014-01-28 04:58:43 +0000
+++ provider/maas/environprovider.go 2014-02-18 02:14:09 +0000
@@ -41,7 +41,7 @@
41var errAgentNameAlreadySet = errors.New(41var errAgentNameAlreadySet = errors.New(
42 "maas-agent-name is already set; this should not be set by hand")42 "maas-agent-name is already set; this should not be set by hand")
4343
44func (p maasEnvironProvider) Prepare(cfg *config.Config) (environs.Environ, error) {44func (p maasEnvironProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
45 attrs := cfg.UnknownAttrs()45 attrs := cfg.UnknownAttrs()
46 oldName, found := attrs["maas-agent-name"]46 oldName, found := attrs["maas-agent-name"]
47 if found && oldName != "" {47 if found && oldName != "" {
4848
=== modified file 'provider/maas/environprovider_test.go'
--- provider/maas/environprovider_test.go 2014-01-22 22:48:54 +0000
+++ provider/maas/environprovider_test.go 2014-02-18 02:14:09 +0000
@@ -52,7 +52,8 @@
52 config, err := config.New(config.NoDefaults, attrs)52 config, err := config.New(config.NoDefaults, attrs)
53 c.Assert(err, gc.IsNil)53 c.Assert(err, gc.IsNil)
5454
55 environ, err := suite.makeEnviron().Provider().Prepare(config)55 ctx := testing.Context(c)
56 environ, err := suite.makeEnviron().Provider().Prepare(ctx, config)
56 c.Assert(err, gc.IsNil)57 c.Assert(err, gc.IsNil)
5758
58 preparedConfig := environ.Config()59 preparedConfig := environ.Config()
@@ -76,7 +77,8 @@
76 config, err := config.New(config.NoDefaults, attrs)77 config, err := config.New(config.NoDefaults, attrs)
77 c.Assert(err, gc.IsNil)78 c.Assert(err, gc.IsNil)
7879
79 _, err = suite.makeEnviron().Provider().Prepare(config)80 ctx := testing.Context(c)
81 _, err = suite.makeEnviron().Provider().Prepare(ctx, config)
80 c.Assert(err, gc.Equals, errAgentNameAlreadySet)82 c.Assert(err, gc.Equals, errAgentNameAlreadySet)
81}83}
8284
8385
=== modified file 'provider/manual/environ.go'
--- provider/manual/environ.go 2014-02-10 11:35:13 +0000
+++ provider/manual/environ.go 2014-02-18 02:14:09 +0000
@@ -100,7 +100,7 @@
100 return nil100 return nil
101 }101 }
102 cfg := e.envConfig()102 cfg := e.envConfig()
103 err := initUbuntuUser(cfg.bootstrapHost(), cfg.bootstrapUser(), cfg.AuthorizedKeys(), ctx.Stdin(), ctx.Stdout())103 err := initUbuntuUser(cfg.bootstrapHost(), cfg.bootstrapUser(), cfg.AuthorizedKeys(), ctx.GetStdin(), ctx.GetStdout())
104 if err != nil {104 if err != nil {
105 logger.Errorf("initializing ubuntu user: %v", err)105 logger.Errorf("initializing ubuntu user: %v", err)
106 return err106 return err
107107
=== modified file 'provider/manual/environ_test.go'
--- provider/manual/environ_test.go 2014-02-10 07:27:49 +0000
+++ provider/manual/environ_test.go 2014-02-18 02:14:09 +0000
@@ -13,7 +13,6 @@
13 "launchpad.net/juju-core/environs"13 "launchpad.net/juju-core/environs"
14 "launchpad.net/juju-core/environs/manual"14 "launchpad.net/juju-core/environs/manual"
15 "launchpad.net/juju-core/environs/storage"15 "launchpad.net/juju-core/environs/storage"
16 envtesting "launchpad.net/juju-core/environs/testing"
17 "launchpad.net/juju-core/environs/tools"16 "launchpad.net/juju-core/environs/tools"
18 "launchpad.net/juju-core/instance"17 "launchpad.net/juju-core/instance"
19 coretesting "launchpad.net/juju-core/testing"18 coretesting "launchpad.net/juju-core/testing"
@@ -139,7 +138,7 @@
139 return initUbuntuResult138 return initUbuntuResult
140 })139 })
141140
142 ctx := envtesting.NewBootstrapContext(coretesting.Context(c))141 ctx := coretesting.Context(c)
143 initUbuntuResult = errors.New("failed to initialise ubuntu user")142 initUbuntuResult = errors.New("failed to initialise ubuntu user")
144 c.Assert(s.env.EnableBootstrapStorage(ctx), gc.Equals, initUbuntuResult)143 c.Assert(s.env.EnableBootstrapStorage(ctx), gc.Equals, initUbuntuResult)
145 initUbuntuResult = nil144 initUbuntuResult = nil
146145
=== modified file 'provider/manual/provider.go'
--- provider/manual/provider.go 2014-02-10 12:32:35 +0000
+++ provider/manual/provider.go 2014-02-18 02:14:09 +0000
@@ -21,7 +21,7 @@
2121
22var errNoBootstrapHost = errors.New("bootstrap-host must be specified")22var errNoBootstrapHost = errors.New("bootstrap-host must be specified")
2323
24func (p manualProvider) Prepare(cfg *config.Config) (environs.Environ, error) {24func (p manualProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
25 if _, ok := cfg.UnknownAttrs()["storage-auth-key"]; !ok {25 if _, ok := cfg.UnknownAttrs()["storage-auth-key"]; !ok {
26 uuid, err := utils.NewUUID()26 uuid, err := utils.NewUUID()
27 if err != nil {27 if err != nil {
2828
=== modified file 'provider/manual/provider_test.go'
--- provider/manual/provider_test.go 2014-02-10 12:32:35 +0000
+++ provider/manual/provider_test.go 2014-02-18 02:14:09 +0000
@@ -12,6 +12,7 @@
12 "launchpad.net/juju-core/environs/config"12 "launchpad.net/juju-core/environs/config"
13 "launchpad.net/juju-core/environs/storage"13 "launchpad.net/juju-core/environs/storage"
14 "launchpad.net/juju-core/provider/manual"14 "launchpad.net/juju-core/provider/manual"
15 coretesting "launchpad.net/juju-core/testing"
15 jc "launchpad.net/juju-core/testing/checkers"16 jc "launchpad.net/juju-core/testing/checkers"
16 "launchpad.net/juju-core/testing/testbase"17 "launchpad.net/juju-core/testing/testbase"
17 "launchpad.net/juju-core/utils"18 "launchpad.net/juju-core/utils"
@@ -29,7 +30,7 @@
29 delete(minimal, "storage-auth-key")30 delete(minimal, "storage-auth-key")
30 testConfig, err := config.New(config.UseDefaults, minimal)31 testConfig, err := config.New(config.UseDefaults, minimal)
31 c.Assert(err, gc.IsNil)32 c.Assert(err, gc.IsNil)
32 env, err := manual.ProviderInstance.Prepare(testConfig)33 env, err := manual.ProviderInstance.Prepare(coretesting.Context(c), testConfig)
33 c.Assert(err, gc.IsNil)34 c.Assert(err, gc.IsNil)
34 cfg := env.Config()35 cfg := env.Config()
35 key, _ := cfg.UnknownAttrs()["storage-auth-key"].(string)36 key, _ := cfg.UnknownAttrs()["storage-auth-key"].(string)
@@ -41,7 +42,7 @@
41 minimal["use-sshstorage"] = false42 minimal["use-sshstorage"] = false
42 testConfig, err := config.New(config.UseDefaults, minimal)43 testConfig, err := config.New(config.UseDefaults, minimal)
43 c.Assert(err, gc.IsNil)44 c.Assert(err, gc.IsNil)
44 _, err = manual.ProviderInstance.Prepare(testConfig)45 _, err = manual.ProviderInstance.Prepare(coretesting.Context(c), testConfig)
45 c.Assert(err, gc.ErrorMatches, "use-sshstorage must not be specified")46 c.Assert(err, gc.ErrorMatches, "use-sshstorage must not be specified")
4647
47 s.PatchValue(manual.NewSSHStorage, func(sshHost, storageDir, storageTmpdir string) (storage.Storage, error) {48 s.PatchValue(manual.NewSSHStorage, func(sshHost, storageDir, storageTmpdir string) (storage.Storage, error) {
@@ -50,7 +51,7 @@
50 minimal["use-sshstorage"] = true51 minimal["use-sshstorage"] = true
51 testConfig, err = config.New(config.UseDefaults, minimal)52 testConfig, err = config.New(config.UseDefaults, minimal)
52 c.Assert(err, gc.IsNil)53 c.Assert(err, gc.IsNil)
53 _, err = manual.ProviderInstance.Prepare(testConfig)54 _, err = manual.ProviderInstance.Prepare(coretesting.Context(c), testConfig)
54 c.Assert(err, gc.ErrorMatches, "initialising SSH storage failed: newSSHStorage failed")55 c.Assert(err, gc.ErrorMatches, "initialising SSH storage failed: newSSHStorage failed")
55}56}
5657
5758
=== modified file 'provider/openstack/config_test.go'
--- provider/openstack/config_test.go 2014-01-28 04:58:43 +0000
+++ provider/openstack/config_test.go 2014-02-18 02:14:09 +0000
@@ -460,12 +460,13 @@
460 cfg, err := config.New(config.NoDefaults, attrs)460 cfg, err := config.New(config.NoDefaults, attrs)
461 c.Assert(err, gc.IsNil)461 c.Assert(err, gc.IsNil)
462462
463 env0, err := providerInstance.Prepare(cfg)463 ctx := testing.Context(c)
464 env0, err := providerInstance.Prepare(ctx, cfg)
464 c.Assert(err, gc.IsNil)465 c.Assert(err, gc.IsNil)
465 bucket0 := env0.(*environ).ecfg().controlBucket()466 bucket0 := env0.(*environ).ecfg().controlBucket()
466 c.Assert(bucket0, gc.Matches, "[a-f0-9]{32}")467 c.Assert(bucket0, gc.Matches, "[a-f0-9]{32}")
467468
468 env1, err := providerInstance.Prepare(cfg)469 env1, err := providerInstance.Prepare(ctx, cfg)
469 c.Assert(err, gc.IsNil)470 c.Assert(err, gc.IsNil)
470 bucket1 := env1.(*environ).ecfg().controlBucket()471 bucket1 := env1.(*environ).ecfg().controlBucket()
471 c.Assert(bucket1, gc.Matches, "[a-f0-9]{32}")472 c.Assert(bucket1, gc.Matches, "[a-f0-9]{32}")
@@ -482,7 +483,7 @@
482 cfg, err := config.New(config.NoDefaults, attrs)483 cfg, err := config.New(config.NoDefaults, attrs)
483 c.Assert(err, gc.IsNil)484 c.Assert(err, gc.IsNil)
484485
485 env, err := providerInstance.Prepare(cfg)486 env, err := providerInstance.Prepare(testing.Context(c), cfg)
486 c.Assert(err, gc.IsNil)487 c.Assert(err, gc.IsNil)
487 bucket := env.(*environ).ecfg().controlBucket()488 bucket := env.(*environ).ecfg().controlBucket()
488 c.Assert(bucket, gc.Equals, "burblefoo")489 c.Assert(bucket, gc.Equals, "burblefoo")
489490
=== modified file 'provider/openstack/live_test.go'
--- provider/openstack/live_test.go 2014-02-17 12:57:06 +0000
+++ provider/openstack/live_test.go 2014-02-18 02:14:09 +0000
@@ -230,7 +230,7 @@
230 c.Assert(env, gc.NotNil)230 c.Assert(env, gc.NotNil)
231 defer env.Destroy()231 defer env.Destroy()
232 // Bootstrap and start an instance.232 // Bootstrap and start an instance.
233 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})233 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
234 c.Assert(err, gc.IsNil)234 c.Assert(err, gc.IsNil)
235 inst, _ := jujutesting.AssertStartInstance(c, env, "100")235 inst, _ := jujutesting.AssertStartInstance(c, env, "100")
236 // Check whether the instance has the default security group assigned.236 // Check whether the instance has the default security group assigned.
237237
=== modified file 'provider/openstack/local_test.go'
--- provider/openstack/local_test.go 2014-02-14 01:03:03 +0000
+++ provider/openstack/local_test.go 2014-02-18 02:14:09 +0000
@@ -252,10 +252,6 @@
252 s.LoggingSuite.TearDownTest(c)252 s.LoggingSuite.TearDownTest(c)
253}253}
254254
255func bootstrapContext(c *gc.C) environs.BootstrapContext {
256 return envtesting.NewBootstrapContext(coretesting.Context(c))
257}
258
259func (s *localServerSuite) TestPrecheck(c *gc.C) {255func (s *localServerSuite) TestPrecheck(c *gc.C) {
260 var cons constraints.Value256 var cons constraints.Value
261 env := s.Prepare(c)257 env := s.Prepare(c)
@@ -285,7 +281,7 @@
285 c.Assert(err, gc.IsNil)281 c.Assert(err, gc.IsNil)
286 env, err := environs.New(cfg)282 env, err := environs.New(cfg)
287 c.Assert(err, gc.IsNil)283 c.Assert(err, gc.IsNil)
288 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})284 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
289 c.Assert(err, gc.ErrorMatches, "(.|\n)*cannot allocate a public IP as needed(.|\n)*")285 c.Assert(err, gc.ErrorMatches, "(.|\n)*cannot allocate a public IP as needed(.|\n)*")
290}286}
291287
@@ -312,9 +308,9 @@
312 "use-floating-ip": false,308 "use-floating-ip": false,
313 }))309 }))
314 c.Assert(err, gc.IsNil)310 c.Assert(err, gc.IsNil)
315 env, err := environs.Prepare(cfg, s.ConfigStore)311 env, err := environs.Prepare(cfg, coretesting.Context(c), s.ConfigStore)
316 c.Assert(err, gc.IsNil)312 c.Assert(err, gc.IsNil)
317 err = bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})313 err = bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
318 c.Assert(err, gc.IsNil)314 c.Assert(err, gc.IsNil)
319 inst, _ := testing.AssertStartInstance(c, env, "100")315 inst, _ := testing.AssertStartInstance(c, env, "100")
320 err = env.StopInstances([]instance.Instance{inst})316 err = env.StopInstances([]instance.Instance{inst})
@@ -323,7 +319,7 @@
323319
324func (s *localServerSuite) TestStartInstanceHardwareCharacteristics(c *gc.C) {320func (s *localServerSuite) TestStartInstanceHardwareCharacteristics(c *gc.C) {
325 env := s.Prepare(c)321 env := s.Prepare(c)
326 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})322 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
327 c.Assert(err, gc.IsNil)323 c.Assert(err, gc.IsNil)
328 _, hc := testing.AssertStartInstanceWithConstraints(c, env, "100", constraints.MustParse("mem=1024"))324 _, hc := testing.AssertStartInstanceWithConstraints(c, env, "100", constraints.MustParse("mem=1024"))
329 c.Check(*hc.Arch, gc.Equals, "amd64")325 c.Check(*hc.Arch, gc.Equals, "amd64")
@@ -522,7 +518,7 @@
522// It should be moved to environs.jujutests.Tests.518// It should be moved to environs.jujutests.Tests.
523func (s *localServerSuite) TestBootstrapInstanceUserDataAndState(c *gc.C) {519func (s *localServerSuite) TestBootstrapInstanceUserDataAndState(c *gc.C) {
524 env := s.Prepare(c)520 env := s.Prepare(c)
525 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})521 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
526 c.Assert(err, gc.IsNil)522 c.Assert(err, gc.IsNil)
527523
528 // check that the state holds the id of the bootstrap machine.524 // check that the state holds the id of the bootstrap machine.
@@ -760,7 +756,7 @@
760 c.Assert(attrs["auth-url"].(string)[:8], gc.Equals, "https://")756 c.Assert(attrs["auth-url"].(string)[:8], gc.Equals, "https://")
761 cfg, err := config.New(config.NoDefaults, attrs)757 cfg, err := config.New(config.NoDefaults, attrs)
762 c.Assert(err, gc.IsNil)758 c.Assert(err, gc.IsNil)
763 s.env, err = environs.Prepare(cfg, configstore.NewMem())759 s.env, err = environs.Prepare(cfg, coretesting.Context(c), configstore.NewMem())
764 c.Assert(err, gc.IsNil)760 c.Assert(err, gc.IsNil)
765 s.attrs = s.env.Config().AllAttrs()761 s.attrs = s.env.Config().AllAttrs()
766}762}
@@ -817,7 +813,7 @@
817 openstack.UseTestImageData(metadataStorage, s.cred)813 openstack.UseTestImageData(metadataStorage, s.cred)
818 defer openstack.RemoveTestImageData(metadataStorage)814 defer openstack.RemoveTestImageData(metadataStorage)
819815
820 err = bootstrap.Bootstrap(bootstrapContext(c), s.env, constraints.Value{})816 err = bootstrap.Bootstrap(coretesting.Context(c), s.env, constraints.Value{})
821 c.Assert(err, gc.IsNil)817 c.Assert(err, gc.IsNil)
822}818}
823819
@@ -960,7 +956,7 @@
960956
961func (s *localServerSuite) TestAllInstancesIgnoresOtherMachines(c *gc.C) {957func (s *localServerSuite) TestAllInstancesIgnoresOtherMachines(c *gc.C) {
962 env := s.Prepare(c)958 env := s.Prepare(c)
963 err := bootstrap.Bootstrap(bootstrapContext(c), env, constraints.Value{})959 err := bootstrap.Bootstrap(coretesting.Context(c), env, constraints.Value{})
964 c.Assert(err, gc.IsNil)960 c.Assert(err, gc.IsNil)
965961
966 // Check that we see 1 instance in the environment962 // Check that we see 1 instance in the environment
967963
=== modified file 'provider/openstack/provider.go'
--- provider/openstack/provider.go 2014-01-29 09:58:08 +0000
+++ provider/openstack/provider.go 2014-02-18 02:14:09 +0000
@@ -180,7 +180,7 @@
180 return e, nil180 return e, nil
181}181}
182182
183func (p environProvider) Prepare(cfg *config.Config) (environs.Environ, error) {183func (p environProvider) Prepare(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
184 attrs := cfg.UnknownAttrs()184 attrs := cfg.UnknownAttrs()
185 if _, ok := attrs["control-bucket"]; !ok {185 if _, ok := attrs["control-bucket"]; !ok {
186 uuid, err := utils.NewUUID()186 uuid, err := utils.NewUUID()
187187
=== modified file 'state/apiserver/common/environwatcher_test.go'
--- state/apiserver/common/environwatcher_test.go 2014-01-21 13:56:50 +0000
+++ state/apiserver/common/environwatcher_test.go 2014-02-18 02:14:09 +0000
@@ -16,6 +16,7 @@
16 "launchpad.net/juju-core/state/api/params"16 "launchpad.net/juju-core/state/api/params"
17 "launchpad.net/juju-core/state/apiserver/common"17 "launchpad.net/juju-core/state/apiserver/common"
18 apiservertesting "launchpad.net/juju-core/state/apiserver/testing"18 apiservertesting "launchpad.net/juju-core/state/apiserver/testing"
19 "launchpad.net/juju-core/testing"
19 jc "launchpad.net/juju-core/testing/checkers"20 jc "launchpad.net/juju-core/testing/checkers"
20 "launchpad.net/juju-core/testing/testbase"21 "launchpad.net/juju-core/testing/testbase"
21)22)
@@ -187,7 +188,7 @@
187func testingEnvConfig(c *gc.C) *config.Config {188func testingEnvConfig(c *gc.C) *config.Config {
188 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())189 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
189 c.Assert(err, gc.IsNil)190 c.Assert(err, gc.IsNil)
190 env, err := environs.Prepare(cfg, configstore.NewMem())191 env, err := environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
191 c.Assert(err, gc.IsNil)192 c.Assert(err, gc.IsNil)
192 return env.Config()193 return env.Config()
193}194}

Subscribers

People subscribed via source and target branches

to status/vote changes: