Merge lp:~thumper/juju-core/move-environs-tools into lp:~go-bot/juju-core/trunk

Proposed by Tim Penhey
Status: Rejected
Rejected by: Tim Penhey
Proposed branch: lp:~thumper/juju-core/move-environs-tools
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 2314 lines (+348/-363)
59 files modified
cmd/juju/bootstrap_test.go (+1/-1)
cmd/juju/status.go (+2/-1)
cmd/juju/status_test.go (+3/-2)
cmd/juju/synctools.go (+3/-4)
cmd/juju/synctools_test.go (+1/-1)
cmd/juju/upgradejuju.go (+1/-1)
cmd/juju/upgradejuju_test.go (+2/-3)
cmd/jujud/agent.go (+2/-1)
cmd/jujud/agent_test.go (+16/-16)
cmd/jujud/machine_test.go (+2/-1)
cmd/jujud/unit_test.go (+2/-1)
cmd/jujud/upgrade.go (+14/-14)
cmd/jujud/upgrade_test.go (+13/-14)
container/lxc/lxc.go (+7/-5)
container/lxc/lxc_test.go (+2/-2)
environs/agent/agent.go (+3/-2)
environs/cloudinit/cloudinit.go (+4/-3)
environs/cloudinit/cloudinit_test.go (+4/-3)
environs/ec2/ec2.go (+2/-2)
environs/jujutest/livetests.go (+5/-5)
environs/maas/environ.go (+2/-2)
environs/maas/environ_test.go (+1/-1)
environs/maas/util_test.go (+2/-1)
environs/openstack/export_test.go (+1/-1)
environs/openstack/provider.go (+2/-2)
environs/testing/storage.go (+1/-1)
environs/testing/tools.go (+5/-6)
environs/tools.go (+2/-3)
environs/tools_test.go (+1/-1)
state/api/params/internal.go (+1/-1)
state/api/upgrader/upgrader_test.go (+2/-1)
state/apiserver/upgrader/upgrader.go (+13/-12)
state/apiserver/upgrader/upgrader_test.go (+2/-1)
state/machine.go (+5/-4)
state/machine_test.go (+3/-2)
state/state.go (+0/-33)
state/state_test.go (+2/-1)
state/tools_test.go (+6/-39)
state/unit.go (+4/-3)
tools/agent.go (+8/-8)
tools/agent_test.go (+35/-34)
tools/build.go (+2/-1)
tools/diskmanager.go (+3/-9)
tools/diskmanager_test.go (+0/-30)
tools/list.go (+7/-7)
tools/list_test.go (+6/-9)
tools/marshal.go (+36/-0)
tools/marshal_test.go (+57/-0)
tools/storage.go (+6/-6)
tools/storage_test.go (+11/-10)
tools/tools_test.go (+0/-24)
worker/deployer/simple.go (+5/-4)
worker/deployer/simple_test.go (+4/-3)
worker/provisioner/lxc-broker.go (+3/-2)
worker/provisioner/lxc-broker_test.go (+3/-3)
worker/provisioner/provisioner.go (+3/-3)
worker/uniter/tools_test.go (+3/-3)
worker/uniter/uniter.go (+10/-8)
worker/uniter/uniter_test.go (+2/-2)
To merge this branch: bzr merge lp:~thumper/juju-core/move-environs-tools
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+173645@code.launchpad.net

Description of the change

remove state.Tools and use tools.Tools

Mega-move, but this branch just moves environ/agent/tools.go
and tests into tools.

Also moves state bson marshalling into tools.

https://codereview.appspot.com/11028043/

To post a comment you must log in.
Revision history for this message
Tim Penhey (thumper) wrote :

Reviewers: mp+173645_code.launchpad.net,

Message:
Please take a look.

Description:
remove state.Tools and use tools.Tools

Mega-move, but this branch just moves environ/agent/tools.go
and tests into tools.

Also moves state bson marshalling into tools.

https://code.launchpad.net/~thumper/juju-core/move-environs-tools/+merge/173645

(do not edit description out of merge proposal)

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

Affected files:
   A [revision details]
   M cmd/juju/bootstrap_test.go
   M cmd/juju/status.go
   M cmd/juju/status_test.go
   M cmd/juju/synctools.go
   M cmd/juju/synctools_test.go
   M cmd/juju/upgradejuju.go
   M cmd/juju/upgradejuju_test.go
   M cmd/jujud/agent.go
   M cmd/jujud/agent_test.go
   M cmd/jujud/machine_test.go
   M cmd/jujud/unit_test.go
   M cmd/jujud/upgrade.go
   M cmd/jujud/upgrade_test.go
   M container/lxc/lxc.go
   M container/lxc/lxc_test.go
   M environs/agent/agent.go
   M environs/cloudinit/cloudinit.go
   M environs/cloudinit/cloudinit_test.go
   M environs/ec2/ec2.go
   M environs/jujutest/livetests.go
   M environs/maas/environ.go
   M environs/maas/environ_test.go
   M environs/maas/util_test.go
   M environs/openstack/export_test.go
   M environs/openstack/provider.go
   M environs/testing/storage.go
   M environs/testing/tools.go
   M environs/tools.go
   M environs/tools_test.go
   M state/api/params/internal.go
   M state/api/upgrader/upgrader_test.go
   M state/apiserver/upgrader/upgrader.go
   M state/apiserver/upgrader/upgrader_test.go
   M state/machine.go
   M state/machine_test.go
   M state/state.go
   M state/state_test.go
   M state/tools_test.go
   M state/unit.go
   M tools/agent.go
   M tools/agent_test.go
   M tools/build.go
   M tools/diskmanager.go
   M tools/diskmanager_test.go
   M tools/export_test.go
   M tools/list.go
   M tools/list_test.go
   A tools/marshal.go
   A tools/marshal_test.go
   M tools/storage.go
   M tools/storage_test.go
   M tools/tools_test.go
   M worker/deployer/simple.go
   M worker/deployer/simple_test.go
   M worker/provisioner/lxc-broker.go
   M worker/provisioner/lxc-broker_test.go
   M worker/provisioner/provisioner.go
   M worker/uniter/tools_test.go
   M worker/uniter/uniter.go
   M worker/uniter/uniter_test.go

Revision history for this message
John A Meinel (jameinel) wrote :

We chatted a bit on IRC, and I think we sorted out that we'd rather call
it "agent.Tools". It also matches what William would like to see, which
is that most of environs/agent becomes just a top level agent/* package
that has 0 dependencies on environs. (if we have things that depend on
environs we can leave a different package there.)

So +1 on the removal of state.Tools and replacing it with something
better. I'd just like us to call that agent.Tools before we land this
patch, so we don't have to do yet-another rename-of-everything.

https://codereview.appspot.com/11028043/

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

Unmerged revisions

1413. By Tim Penhey

Missed one.

1412. By Tim Penhey

Make the tests pass.

1411. By Tim Penhey

More moves and tests in tools pass.

1410. By Tim Penhey

builds now.

1409. By Tim Penhey

Part way through the move.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'cmd/juju/bootstrap_test.go'
2--- cmd/juju/bootstrap_test.go 2013-06-21 16:57:26 +0000
3+++ cmd/juju/bootstrap_test.go 2013-07-09 05:06:28 +0000
4@@ -11,8 +11,8 @@
5 "launchpad.net/juju-core/environs"
6 "launchpad.net/juju-core/environs/dummy"
7 envtesting "launchpad.net/juju-core/environs/testing"
8- "launchpad.net/juju-core/environs/tools"
9 "launchpad.net/juju-core/testing"
10+ "launchpad.net/juju-core/tools"
11 "launchpad.net/juju-core/version"
12 "strings"
13 )
14
15=== modified file 'cmd/juju/status.go'
16--- cmd/juju/status.go 2013-06-30 23:42:39 +0000
17+++ cmd/juju/status.go 2013-07-09 05:06:28 +0000
18@@ -15,6 +15,7 @@
19 "launchpad.net/juju-core/juju"
20 "launchpad.net/juju-core/state"
21 "launchpad.net/juju-core/state/api/params"
22+ "launchpad.net/juju-core/tools"
23 "launchpad.net/juju-core/utils/set"
24 "strings"
25 )
26@@ -319,7 +320,7 @@
27 type stateAgent interface {
28 lifer
29 AgentAlive() (bool, error)
30- AgentTools() (*state.Tools, error)
31+ AgentTools() (*tools.Tools, error)
32 Status() (params.Status, string, error)
33 }
34
35
36=== modified file 'cmd/juju/status_test.go'
37--- cmd/juju/status_test.go 2013-07-01 00:52:38 +0000
38+++ cmd/juju/status_test.go 2013-07-09 05:06:28 +0000
39@@ -19,6 +19,7 @@
40 "launchpad.net/juju-core/state/api/params"
41 "launchpad.net/juju-core/state/presence"
42 coretesting "launchpad.net/juju-core/testing"
43+ "launchpad.net/juju-core/tools"
44 "launchpad.net/juju-core/version"
45 "net/url"
46 "time"
47@@ -232,7 +233,7 @@
48 },
49 },
50
51- setTools{"0", &state.Tools{
52+ setTools{"0", &tools.Tools{
53 Binary: version.Binary{
54 Number: version.MustParse("1.2.3"),
55 Series: "gutsy",
56@@ -923,7 +924,7 @@
57
58 type setTools struct {
59 machineId string
60- tools *state.Tools
61+ tools *tools.Tools
62 }
63
64 func (st setTools) step(c *C, ctx *context) {
65
66=== modified file 'cmd/juju/synctools.go'
67--- cmd/juju/synctools.go 2013-06-20 06:42:25 +0000
68+++ cmd/juju/synctools.go 2013-07-09 05:06:28 +0000
69@@ -12,9 +12,8 @@
70 "launchpad.net/juju-core/cmd"
71 "launchpad.net/juju-core/environs"
72 "launchpad.net/juju-core/environs/ec2"
73- "launchpad.net/juju-core/environs/tools"
74 "launchpad.net/juju-core/log"
75- "launchpad.net/juju-core/state"
76+ "launchpad.net/juju-core/tools"
77 "launchpad.net/juju-core/version"
78 )
79
80@@ -63,7 +62,7 @@
81 }
82
83 func copyOne(
84- tool *state.Tools, source environs.StorageReader,
85+ tool *tools.Tools, source environs.StorageReader,
86 target environs.Storage, ctx *cmd.Context,
87 ) error {
88 toolsName := tools.StorageName(tool.Binary)
89@@ -90,7 +89,7 @@
90 }
91
92 func copyTools(
93- tools []*state.Tools, source environs.StorageReader,
94+ tools []*tools.Tools, source environs.StorageReader,
95 target environs.Storage, dryRun bool, ctx *cmd.Context,
96 ) error {
97 for _, tool := range tools {
98
99=== modified file 'cmd/juju/synctools_test.go'
100--- cmd/juju/synctools_test.go 2013-06-20 13:42:24 +0000
101+++ cmd/juju/synctools_test.go 2013-07-09 05:06:28 +0000
102@@ -9,8 +9,8 @@
103 "launchpad.net/juju-core/environs"
104 "launchpad.net/juju-core/environs/dummy"
105 envtesting "launchpad.net/juju-core/environs/testing"
106- "launchpad.net/juju-core/environs/tools"
107 "launchpad.net/juju-core/testing"
108+ "launchpad.net/juju-core/tools"
109 "launchpad.net/juju-core/version"
110 )
111
112
113=== modified file 'cmd/juju/upgradejuju.go'
114--- cmd/juju/upgradejuju.go 2013-05-31 01:02:53 +0000
115+++ cmd/juju/upgradejuju.go 2013-07-09 05:06:28 +0000
116@@ -10,10 +10,10 @@
117 "launchpad.net/juju-core/cmd"
118 "launchpad.net/juju-core/environs"
119 "launchpad.net/juju-core/environs/config"
120- "launchpad.net/juju-core/environs/tools"
121 "launchpad.net/juju-core/errors"
122 "launchpad.net/juju-core/juju"
123 "launchpad.net/juju-core/log"
124+ "launchpad.net/juju-core/tools"
125 "launchpad.net/juju-core/version"
126 )
127
128
129=== modified file 'cmd/juju/upgradejuju_test.go'
130--- cmd/juju/upgradejuju_test.go 2013-05-02 15:55:42 +0000
131+++ cmd/juju/upgradejuju_test.go 2013-07-09 05:06:28 +0000
132@@ -8,10 +8,9 @@
133 . "launchpad.net/gocheck"
134 "launchpad.net/juju-core/environs"
135 envtesting "launchpad.net/juju-core/environs/testing"
136- "launchpad.net/juju-core/environs/tools"
137 "launchpad.net/juju-core/juju/testing"
138- "launchpad.net/juju-core/state"
139 coretesting "launchpad.net/juju-core/testing"
140+ "launchpad.net/juju-core/tools"
141 "launchpad.net/juju-core/version"
142 )
143
144@@ -282,7 +281,7 @@
145 // consuming build from source.
146 // TODO(fwereade) better factor environs/tools such that build logic is
147 // exposed and can itself be neatly mocked?
148-func mockUploadTools(putter tools.URLPutter, forceVersion *version.Number, series ...string) (*state.Tools, error) {
149+func mockUploadTools(putter tools.URLPutter, forceVersion *version.Number, series ...string) (*tools.Tools, error) {
150 storage := putter.(environs.Storage)
151 vers := version.Current
152 if forceVersion != nil {
153
154=== modified file 'cmd/jujud/agent.go'
155--- cmd/jujud/agent.go 2013-07-08 16:59:14 +0000
156+++ cmd/jujud/agent.go 2013-07-09 05:06:28 +0000
157@@ -14,6 +14,7 @@
158 "launchpad.net/juju-core/state"
159 "launchpad.net/juju-core/state/api"
160 "launchpad.net/juju-core/state/api/params"
161+ "launchpad.net/juju-core/tools"
162 "launchpad.net/juju-core/worker"
163 "launchpad.net/juju-core/worker/deployer"
164 "time"
165@@ -84,7 +85,7 @@
166 // that represent running agents.
167 type AgentState interface {
168 // SetAgentTools sets the tools that the agent is currently running.
169- SetAgentTools(tools *state.Tools) error
170+ SetAgentTools(tools *tools.Tools) error
171 Tag() string
172 SetMongoPassword(password string) error
173 Life() state.Life
174
175=== modified file 'cmd/jujud/agent_test.go'
176--- cmd/jujud/agent_test.go 2013-06-21 16:57:26 +0000
177+++ cmd/jujud/agent_test.go 2013-07-09 05:06:28 +0000
178@@ -10,11 +10,11 @@
179 . "launchpad.net/gocheck"
180 "launchpad.net/juju-core/cmd"
181 "launchpad.net/juju-core/environs/agent"
182- "launchpad.net/juju-core/environs/tools"
183 "launchpad.net/juju-core/juju/testing"
184 "launchpad.net/juju-core/state"
185 "launchpad.net/juju-core/state/api/machineagent"
186 coretesting "launchpad.net/juju-core/testing"
187+ "launchpad.net/juju-core/tools"
188 "launchpad.net/juju-core/version"
189 "launchpad.net/juju-core/worker"
190 "net/http"
191@@ -44,8 +44,8 @@
192 }
193 }
194
195-func mkTools(s string) *state.Tools {
196- return &state.Tools{
197+func mkTools(s string) *tools.Tools {
198+ return &tools.Tools{
199 Binary: version.MustParseBinary(s + "-foo-bar"),
200 }
201 }
202@@ -117,11 +117,11 @@
203 // primeAgent writes the configuration file and tools
204 // for an agent with the given entity name.
205 // It returns the agent's configuration and the current tools.
206-func (s *agentSuite) primeAgent(c *C, tag, password string) (*agent.Conf, *state.Tools) {
207- tools := s.primeTools(c, version.Current)
208- tools1, err := agent.ChangeAgentTools(s.DataDir(), tag, version.Current)
209+func (s *agentSuite) primeAgent(c *C, tag, password string) (*agent.Conf, *tools.Tools) {
210+ tools0 := s.primeTools(c, version.Current)
211+ tools1, err := tools.ChangeAgentTools(s.DataDir(), tag, version.Current)
212 c.Assert(err, IsNil)
213- c.Assert(tools1, DeepEquals, tools)
214+ c.Assert(tools1, DeepEquals, tools0)
215
216 conf := &agent.Conf{
217 DataDir: s.DataDir(),
218@@ -134,7 +134,7 @@
219 conf.APIInfo.Password = password
220 err = conf.Write()
221 c.Assert(err, IsNil)
222- return conf, tools
223+ return conf, tools0
224 }
225
226 // initAgent initialises the given agent command with additional
227@@ -156,7 +156,7 @@
228 c.Assert(err, IsNil)
229 }
230
231-func (s *agentSuite) uploadTools(c *C, vers version.Binary) *state.Tools {
232+func (s *agentSuite) uploadTools(c *C, vers version.Binary) *tools.Tools {
233 tgz := coretesting.TarGz(
234 coretesting.NewTarFile("jujud", 0777, "jujud contents "+vers.String()),
235 )
236@@ -165,22 +165,22 @@
237 c.Assert(err, IsNil)
238 url, err := s.Conn.Environ.Storage().URL(tools.StorageName(vers))
239 c.Assert(err, IsNil)
240- return &state.Tools{URL: url, Binary: vers}
241+ return &tools.Tools{URL: url, Binary: vers}
242 }
243
244 // primeTools sets up the current version of the tools to vers and
245 // makes sure that they're available JujuConnSuite's DataDir.
246-func (s *agentSuite) primeTools(c *C, vers version.Binary) *state.Tools {
247+func (s *agentSuite) primeTools(c *C, vers version.Binary) *tools.Tools {
248 err := os.RemoveAll(filepath.Join(s.DataDir(), "tools"))
249 c.Assert(err, IsNil)
250 version.Current = vers
251- tools := s.uploadTools(c, vers)
252- resp, err := http.Get(tools.URL)
253+ uploadedTools := s.uploadTools(c, vers)
254+ resp, err := http.Get(uploadedTools.URL)
255 c.Assert(err, IsNil)
256 defer resp.Body.Close()
257- err = agent.UnpackTools(s.DataDir(), tools, resp.Body)
258+ err = tools.UnpackTools(s.DataDir(), uploadedTools, resp.Body)
259 c.Assert(err, IsNil)
260- return tools
261+ return uploadedTools
262 }
263
264 func (s *agentSuite) testOpenAPIState(c *C, ent entity, agentCmd Agent) {
265@@ -246,7 +246,7 @@
266 assertOpen(conf)
267 }
268
269-func (s *agentSuite) testUpgrade(c *C, agent runner, currentTools *state.Tools) {
270+func (s *agentSuite) testUpgrade(c *C, agent runner, currentTools *tools.Tools) {
271 newVers := version.Current
272 newVers.Patch++
273 newTools := s.uploadTools(c, newVers)
274
275=== modified file 'cmd/jujud/machine_test.go'
276--- cmd/jujud/machine_test.go 2013-06-28 12:26:09 +0000
277+++ cmd/jujud/machine_test.go 2013-07-09 05:06:28 +0000
278@@ -20,6 +20,7 @@
279 "launchpad.net/juju-core/state/watcher"
280 "launchpad.net/juju-core/testing"
281 "launchpad.net/juju-core/testing/checkers"
282+ "launchpad.net/juju-core/tools"
283 "launchpad.net/juju-core/version"
284 "path/filepath"
285 "reflect"
286@@ -59,7 +60,7 @@
287 // primeAgent adds a new Machine to run the given jobs, and sets up the
288 // machine agent's directory. It returns the new machine, the
289 // agent's configuration and the tools currently running.
290-func (s *MachineSuite) primeAgent(c *C, jobs ...state.MachineJob) (*state.Machine, *agent.Conf, *state.Tools) {
291+func (s *MachineSuite) primeAgent(c *C, jobs ...state.MachineJob) (*state.Machine, *agent.Conf, *tools.Tools) {
292 m, err := s.State.InjectMachine("series", constraints.Value{}, "ardbeg-0", jobs...)
293 c.Assert(err, IsNil)
294 err = m.SetMongoPassword("machine-password")
295
296=== modified file 'cmd/jujud/unit_test.go'
297--- cmd/jujud/unit_test.go 2013-06-27 19:25:00 +0000
298+++ cmd/jujud/unit_test.go 2013-07-09 05:06:28 +0000
299@@ -10,6 +10,7 @@
300 "launchpad.net/juju-core/state"
301 "launchpad.net/juju-core/state/api/params"
302 "launchpad.net/juju-core/testing"
303+ "launchpad.net/juju-core/tools"
304 "time"
305 )
306
307@@ -32,7 +33,7 @@
308
309 // primeAgent creates a unit, and sets up the unit agent's directory.
310 // It returns the new unit and the agent's configuration.
311-func (s *UnitSuite) primeAgent(c *C) (*state.Unit, *agent.Conf, *state.Tools) {
312+func (s *UnitSuite) primeAgent(c *C) (*state.Unit, *agent.Conf, *tools.Tools) {
313 svc, err := s.State.AddService("wordpress", s.AddTestingCharm(c, "wordpress"))
314 c.Assert(err, IsNil)
315 unit, err := svc.AddUnit()
316
317=== modified file 'cmd/jujud/upgrade.go'
318--- cmd/jujud/upgrade.go 2013-06-19 09:47:38 +0000
319+++ cmd/jujud/upgrade.go 2013-07-09 05:06:28 +0000
320@@ -7,11 +7,11 @@
321 "fmt"
322 "launchpad.net/juju-core/downloader"
323 "launchpad.net/juju-core/environs"
324- "launchpad.net/juju-core/environs/agent"
325 "launchpad.net/juju-core/errors"
326 "launchpad.net/juju-core/log"
327 "launchpad.net/juju-core/state"
328 "launchpad.net/juju-core/state/watcher"
329+ "launchpad.net/juju-core/tools"
330 "launchpad.net/juju-core/version"
331 "launchpad.net/tomb"
332 "os"
333@@ -36,8 +36,8 @@
334 // an upgrade is ready to be performed and a restart is due.
335 type UpgradeReadyError struct {
336 AgentName string
337- OldTools *state.Tools
338- NewTools *state.Tools
339+ OldTools *tools.Tools
340+ NewTools *tools.Tools
341 DataDir string
342 }
343
344@@ -47,7 +47,7 @@
345
346 // ChangeAgentTools does the actual agent upgrade.
347 func (e *UpgradeReadyError) ChangeAgentTools() error {
348- tools, err := agent.ChangeAgentTools(e.DataDir, e.AgentName, e.NewTools.Binary)
349+ tools, err := tools.ChangeAgentTools(e.DataDir, e.AgentName, e.NewTools.Binary)
350 if err != nil {
351 return err
352 }
353@@ -88,13 +88,13 @@
354
355 func (u *Upgrader) run() error {
356 // Let the state know the version that is currently running.
357- currentTools, err := agent.ReadTools(u.dataDir, version.Current)
358+ currentTools, err := tools.ReadTools(u.dataDir, version.Current)
359 if err != nil {
360 // Don't abort everything because we can't find the tools directory.
361 // The problem should sort itself out as we will immediately
362 // download some more tools and upgrade.
363 log.Warningf("upgrader cannot read current tools: %v", err)
364- currentTools = &state.Tools{
365+ currentTools = &tools.Tools{
366 Binary: version.Current,
367 }
368 }
369@@ -118,7 +118,7 @@
370 // TODO(rog) retry downloads when they fail.
371 var (
372 download *downloader.Download
373- downloadTools *state.Tools
374+ downloadTools *tools.Tools
375 downloadDone <-chan downloader.Status
376 )
377 // If we're killed early on (probably as a result of some other
378@@ -189,7 +189,7 @@
379 Series: version.Current.Series,
380 Arch: version.Current.Arch,
381 }
382- if tools, err := agent.ReadTools(u.dataDir, required); err == nil {
383+ if tools, err := tools.ReadTools(u.dataDir, required); err == nil {
384 // The exact tools have already been downloaded, so use them.
385 return u.upgradeReady(currentTools, tools)
386 }
387@@ -208,24 +208,24 @@
388 downloadTools = tools
389 downloadDone = download.Done()
390 case status := <-downloadDone:
391- tools := downloadTools
392+ localTools := downloadTools
393 download, downloadTools, downloadDone = nil, nil, nil
394 if status.Err != nil {
395- log.Errorf("upgrader download of %v failed: %v", tools.Binary, status.Err)
396+ log.Errorf("upgrader download of %v failed: %v", localTools.Binary, status.Err)
397 noDelay()
398 break
399 }
400- err := agent.UnpackTools(u.dataDir, tools, status.File)
401+ err := tools.UnpackTools(u.dataDir, localTools, status.File)
402 status.File.Close()
403 if err := os.Remove(status.File.Name()); err != nil {
404 log.Warningf("upgrader cannot remove temporary download file: %v", err)
405 }
406 if err != nil {
407- log.Errorf("upgrader cannot unpack %v tools: %v", tools.Binary, err)
408+ log.Errorf("upgrader cannot unpack %v tools: %v", localTools.Binary, err)
409 noDelay()
410 break
411 }
412- return u.upgradeReady(currentTools, tools)
413+ return u.upgradeReady(currentTools, localTools)
414 case <-tomb.Dying():
415 if download != nil {
416 return fmt.Errorf("upgrader aborted download of %q", downloadTools.URL)
417@@ -236,7 +236,7 @@
418 panic("not reached")
419 }
420
421-func (u *Upgrader) upgradeReady(old, new *state.Tools) *UpgradeReadyError {
422+func (u *Upgrader) upgradeReady(old, new *tools.Tools) *UpgradeReadyError {
423 return &UpgradeReadyError{
424 AgentName: u.agentState.Tag(),
425 OldTools: old,
426
427=== modified file 'cmd/jujud/upgrade_test.go'
428--- cmd/jujud/upgrade_test.go 2013-05-24 07:04:48 +0000
429+++ cmd/jujud/upgrade_test.go 2013-07-09 05:06:28 +0000
430@@ -7,11 +7,10 @@
431 "fmt"
432 "io/ioutil"
433 . "launchpad.net/gocheck"
434- "launchpad.net/juju-core/environs/agent"
435 "launchpad.net/juju-core/environs/dummy"
436 envtesting "launchpad.net/juju-core/environs/testing"
437- "launchpad.net/juju-core/environs/tools"
438 "launchpad.net/juju-core/state"
439+ "launchpad.net/juju-core/tools"
440 "launchpad.net/juju-core/version"
441 "launchpad.net/juju-core/worker"
442 "path/filepath"
443@@ -36,7 +35,7 @@
444 }
445
446 func (s *UpgraderSuite) TestUpgraderStop(c *C) {
447- u := s.startUpgrader(c, &state.Tools{Binary: version.Current})
448+ u := s.startUpgrader(c, &tools.Tools{Binary: version.Current})
449 err := u.Stop()
450 c.Assert(err, IsNil)
451 }
452@@ -135,7 +134,7 @@
453 // ...but it also puts tools in storage we don't need, which is why we
454 // don't clean up garbage from earlier runs first.
455 envtesting.RemoveAllTools(c, s.Conn.Environ)
456- uploaded := make(map[version.Binary]*state.Tools)
457+ uploaded := make(map[version.Binary]*tools.Tools)
458 for _, vers := range test.available {
459 tools := s.uploadTools(c, vers)
460 uploaded[vers] = tools
461@@ -153,17 +152,17 @@
462 }
463
464 ug := waitDeath(c, u)
465- tools := uploaded[test.upgrade]
466- c.Check(ug.NewTools, DeepEquals, tools)
467+ uploadedTools := uploaded[test.upgrade]
468+ c.Check(ug.NewTools, DeepEquals, uploadedTools)
469 c.Check(ug.OldTools.Binary, Equals, version.Current)
470 c.Check(ug.DataDir, Equals, s.DataDir())
471 c.Check(ug.AgentName, Equals, "testagent")
472
473 // Check that the upgraded version was really downloaded.
474- path := agent.SharedToolsDir(s.DataDir(), tools.Binary)
475+ path := tools.SharedToolsDir(s.DataDir(), uploadedTools.Binary)
476 data, err := ioutil.ReadFile(filepath.Join(path, "jujud"))
477 c.Check(err, IsNil)
478- c.Check(string(data), Equals, "jujud contents "+tools.Binary.String())
479+ c.Check(string(data), Equals, "jujud contents "+uploadedTools.Binary.String())
480 }()
481 }
482 }
483@@ -277,13 +276,13 @@
484 currentTools := s.primeTools(c, version.MustParseBinary("2.0.2-foo-bar"))
485 ug := &UpgradeReadyError{
486 AgentName: "foo",
487- OldTools: &state.Tools{Binary: version.MustParseBinary("2.0.0-foo-bar")},
488+ OldTools: &tools.Tools{Binary: version.MustParseBinary("2.0.0-foo-bar")},
489 NewTools: currentTools,
490 DataDir: s.DataDir(),
491 }
492 err := ug.ChangeAgentTools()
493 c.Assert(err, IsNil)
494- d := agent.ToolsDir(s.DataDir(), "foo")
495+ d := tools.ToolsDir(s.DataDir(), "foo")
496 data, err := ioutil.ReadFile(filepath.Join(d, "jujud"))
497 c.Assert(err, IsNil)
498 c.Assert(string(data), Equals, "jujud contents 2.0.2-foo-bar")
499@@ -311,8 +310,8 @@
500
501 // startUpgrader starts the upgrader using the given machine,
502 // expecting to see it set the given agent tools.
503-func (s *UpgraderSuite) startUpgrader(c *C, expectTools *state.Tools) *Upgrader {
504- as := testAgentState(make(chan *state.Tools))
505+func (s *UpgraderSuite) startUpgrader(c *C, expectTools *tools.Tools) *Upgrader {
506+ as := testAgentState(make(chan *tools.Tools))
507 u := NewUpgrader(s.State, as, s.DataDir())
508 select {
509 case tools := <-as:
510@@ -338,9 +337,9 @@
511 panic("unreachable")
512 }
513
514-type testAgentState chan *state.Tools
515+type testAgentState chan *tools.Tools
516
517-func (as testAgentState) SetAgentTools(tools *state.Tools) error {
518+func (as testAgentState) SetAgentTools(tools *tools.Tools) error {
519 t := *tools
520 as <- &t
521 return nil
522
523=== modified file 'container/lxc/lxc.go'
524--- container/lxc/lxc.go 2013-07-01 01:09:16 +0000
525+++ container/lxc/lxc.go 2013-07-09 05:06:28 +0000
526@@ -11,6 +11,8 @@
527 "strings"
528
529 "launchpad.net/golxc"
530+ "launchpad.net/loggo"
531+
532 "launchpad.net/juju-core/constraints"
533 "launchpad.net/juju-core/environs"
534 "launchpad.net/juju-core/environs/cloudinit"
535@@ -18,7 +20,7 @@
536 "launchpad.net/juju-core/instance"
537 "launchpad.net/juju-core/state"
538 "launchpad.net/juju-core/state/api"
539- "launchpad.net/loggo"
540+ "launchpad.net/juju-core/tools"
541 )
542
543 var logger = loggo.GetLogger("juju.container.lxc")
544@@ -38,7 +40,7 @@
545 // StartContainer creates and starts a new lxc container for the specified machine.
546 StartContainer(
547 machineId, series, nonce string,
548- tools *state.Tools,
549+ tools *tools.Tools,
550 environConfig *config.Config,
551 stateInfo *state.Info,
552 apiInfo *api.Info) (instance.Instance, error)
553@@ -62,7 +64,7 @@
554
555 func (manager *containerManager) StartContainer(
556 machineId, series, nonce string,
557- tools *state.Tools,
558+ tools *tools.Tools,
559 environConfig *config.Config,
560 stateInfo *state.Info,
561 apiInfo *api.Info) (instance.Instance, error) {
562@@ -214,7 +216,7 @@
563
564 func writeUserData(
565 directory, machineId, nonce string,
566- tools *state.Tools,
567+ tools *tools.Tools,
568 environConfig *config.Config,
569 stateInfo *state.Info,
570 apiInfo *api.Info,
571@@ -234,7 +236,7 @@
572
573 func cloudInitUserData(
574 machineId, nonce string,
575- tools *state.Tools,
576+ tools *tools.Tools,
577 environConfig *config.Config,
578 stateInfo *state.Info,
579 apiInfo *api.Info,
580
581=== modified file 'container/lxc/lxc_test.go'
582--- container/lxc/lxc_test.go 2013-06-27 04:48:10 +0000
583+++ container/lxc/lxc_test.go 2013-07-09 05:06:28 +0000
584@@ -15,9 +15,9 @@
585 "launchpad.net/juju-core/container/lxc"
586 "launchpad.net/juju-core/instance"
587 jujutesting "launchpad.net/juju-core/juju/testing"
588- "launchpad.net/juju-core/state"
589 "launchpad.net/juju-core/testing"
590 . "launchpad.net/juju-core/testing/checkers"
591+ "launchpad.net/juju-core/tools"
592 "launchpad.net/juju-core/version"
593 )
594
595@@ -59,7 +59,7 @@
596
597 series := "series"
598 nonce := "fake-nonce"
599- tools := &state.Tools{
600+ tools := &tools.Tools{
601 Binary: version.MustParseBinary("2.3.4-foo-bar"),
602 URL: "http://tools.example.com/2.3.4-foo-bar.tgz",
603 }
604
605=== modified file 'environs/agent/agent.go'
606--- environs/agent/agent.go 2013-07-04 14:33:27 +0000
607+++ environs/agent/agent.go 2013-07-09 05:06:28 +0000
608@@ -11,6 +11,7 @@
609 "launchpad.net/juju-core/state"
610 "launchpad.net/juju-core/state/api"
611 "launchpad.net/juju-core/state/api/params"
612+ "launchpad.net/juju-core/tools"
613 "launchpad.net/juju-core/utils"
614 "os"
615 "path"
616@@ -58,7 +59,7 @@
617 // ReadConf reads configuration data for the given
618 // entity from the given data directory.
619 func ReadConf(dataDir, tag string) (*Conf, error) {
620- dir := Dir(dataDir, tag)
621+ dir := tools.Dir(dataDir, tag)
622 data, err := ioutil.ReadFile(path.Join(dir, "agent.conf"))
623 if err != nil {
624 return nil, err
625@@ -104,7 +105,7 @@
626
627 // Dir returns the agent's directory.
628 func (c *Conf) Dir() string {
629- return Dir(c.DataDir, c.Tag())
630+ return tools.Dir(c.DataDir, c.Tag())
631 }
632
633 // Check checks that the configuration has all the required elements.
634
635=== modified file 'environs/cloudinit/cloudinit.go'
636--- environs/cloudinit/cloudinit.go 2013-07-08 22:22:36 +0000
637+++ environs/cloudinit/cloudinit.go 2013-07-09 05:06:28 +0000
638@@ -18,6 +18,7 @@
639 "launchpad.net/juju-core/log/syslog"
640 "launchpad.net/juju-core/state"
641 "launchpad.net/juju-core/state/api"
642+ "launchpad.net/juju-core/tools"
643 "launchpad.net/juju-core/upstart"
644 "launchpad.net/juju-core/utils"
645 )
646@@ -63,7 +64,7 @@
647 MachineNonce string
648
649 // Tools is juju tools to be used on the new machine.
650- Tools *state.Tools
651+ Tools *tools.Tools
652
653 // DataDir holds the directory that juju state will be put in the new
654 // machine.
655@@ -272,7 +273,7 @@
656 // Make the agent run via a symbolic link to the actual tools
657 // directory, so it can upgrade itself without needing to change
658 // the upstart script.
659- toolsDir := agent.ToolsDir(cfg.DataDir, tag)
660+ toolsDir := tools.ToolsDir(cfg.DataDir, tag)
661 // TODO(dfc) ln -nfs, so it doesn't fail if for some reason that the target already exists
662 addScripts(c, fmt.Sprintf("ln -s %v %s", cfg.Tools.Binary, shquote(toolsDir)))
663
664@@ -315,7 +316,7 @@
665 }
666
667 func (cfg *MachineConfig) jujuTools() string {
668- return agent.SharedToolsDir(cfg.DataDir, cfg.Tools.Binary)
669+ return tools.SharedToolsDir(cfg.DataDir, cfg.Tools.Binary)
670 }
671
672 func (cfg *MachineConfig) stateHostAddrs() []string {
673
674=== modified file 'environs/cloudinit/cloudinit_test.go'
675--- environs/cloudinit/cloudinit_test.go 2013-07-08 22:33:40 +0000
676+++ environs/cloudinit/cloudinit_test.go 2013-07-09 05:06:28 +0000
677@@ -14,6 +14,7 @@
678 "launchpad.net/juju-core/state"
679 "launchpad.net/juju-core/state/api"
680 "launchpad.net/juju-core/testing"
681+ "launchpad.net/juju-core/tools"
682 "launchpad.net/juju-core/version"
683 "regexp"
684 "strings"
685@@ -241,8 +242,8 @@
686 },
687 }
688
689-func newSimpleTools(vers string) *state.Tools {
690- return &state.Tools{
691+func newSimpleTools(vers string) *tools.Tools {
692+ return &tools.Tools{
693 URL: "http://foo.com/tools/juju" + vers + ".tgz",
694 Binary: version.MustParseBinary(vers),
695 }
696@@ -494,7 +495,7 @@
697 cfg.Tools = nil
698 }},
699 {"missing tools URL", func(cfg *cloudinit.MachineConfig) {
700- cfg.Tools = &state.Tools{}
701+ cfg.Tools = &tools.Tools{}
702 }},
703 {"entity tag must match started machine", func(cfg *cloudinit.MachineConfig) {
704 cfg.StateServer = false
705
706=== modified file 'environs/ec2/ec2.go'
707--- environs/ec2/ec2.go 2013-07-03 22:20:05 +0000
708+++ environs/ec2/ec2.go 2013-07-09 05:06:28 +0000
709@@ -15,11 +15,11 @@
710 "launchpad.net/juju-core/environs/config"
711 "launchpad.net/juju-core/environs/imagemetadata"
712 "launchpad.net/juju-core/environs/instances"
713- "launchpad.net/juju-core/environs/tools"
714 "launchpad.net/juju-core/instance"
715 "launchpad.net/juju-core/log"
716 "launchpad.net/juju-core/state"
717 "launchpad.net/juju-core/state/api"
718+ "launchpad.net/juju-core/tools"
719 "launchpad.net/juju-core/utils"
720 "net/http"
721 "strings"
722@@ -302,7 +302,7 @@
723 })
724 }
725
726-func (e *environ) userData(scfg *startInstanceParams, tools *state.Tools) ([]byte, error) {
727+func (e *environ) userData(scfg *startInstanceParams, tools *tools.Tools) ([]byte, error) {
728 mcfg := &cloudinit.MachineConfig{
729 MachineId: scfg.machineId,
730 MachineNonce: scfg.machineNonce,
731
732=== modified file 'environs/jujutest/livetests.go'
733--- environs/jujutest/livetests.go 2013-07-05 08:03:59 +0000
734+++ environs/jujutest/livetests.go 2013-07-09 05:06:28 +0000
735@@ -13,7 +13,6 @@
736 "launchpad.net/juju-core/constraints"
737 "launchpad.net/juju-core/environs"
738 "launchpad.net/juju-core/environs/config"
739- "launchpad.net/juju-core/environs/tools"
740 "launchpad.net/juju-core/errors"
741 "launchpad.net/juju-core/instance"
742 "launchpad.net/juju-core/juju"
743@@ -23,6 +22,7 @@
744 statetesting "launchpad.net/juju-core/state/testing"
745 coretesting "launchpad.net/juju-core/testing"
746 . "launchpad.net/juju-core/testing/checkers"
747+ "launchpad.net/juju-core/tools"
748 "launchpad.net/juju-core/utils"
749 "launchpad.net/juju-core/version"
750 "time"
751@@ -475,7 +475,7 @@
752
753 type tooler interface {
754 Life() state.Life
755- AgentTools() (*state.Tools, error)
756+ AgentTools() (*tools.Tools, error)
757 Refresh() error
758 String() string
759 }
760@@ -486,7 +486,7 @@
761 }
762
763 type toolsWaiter struct {
764- lastTools *state.Tools
765+ lastTools *tools.Tools
766 // changes is a chan of struct{} so that it can
767 // be used with different kinds of entity watcher.
768 changes chan struct{}
769@@ -532,7 +532,7 @@
770
771 // NextTools returns the next changed tools, waiting
772 // until the tools are actually set.
773-func (w *toolsWaiter) NextTools(c *C) (*state.Tools, error) {
774+func (w *toolsWaiter) NextTools(c *C) (*tools.Tools, error) {
775 for _ = range w.changes {
776 err := w.tooler.Refresh()
777 if err != nil {
778@@ -561,7 +561,7 @@
779
780 // waitAgentTools waits for the given agent
781 // to start and returns the tools that it is running.
782-func waitAgentTools(c *C, w *toolsWaiter, expect version.Binary) *state.Tools {
783+func waitAgentTools(c *C, w *toolsWaiter, expect version.Binary) *tools.Tools {
784 c.Logf("waiting for %v to signal agent version", w.tooler.String())
785 tools, err := w.NextTools(c)
786 c.Assert(err, IsNil)
787
788=== modified file 'environs/maas/environ.go'
789--- environs/maas/environ.go 2013-07-03 22:20:05 +0000
790+++ environs/maas/environ.go 2013-07-09 05:06:28 +0000
791@@ -11,11 +11,11 @@
792 "launchpad.net/juju-core/environs"
793 "launchpad.net/juju-core/environs/cloudinit"
794 "launchpad.net/juju-core/environs/config"
795- "launchpad.net/juju-core/environs/tools"
796 "launchpad.net/juju-core/instance"
797 "launchpad.net/juju-core/log"
798 "launchpad.net/juju-core/state"
799 "launchpad.net/juju-core/state/api"
800+ "launchpad.net/juju-core/tools"
801 "launchpad.net/juju-core/utils"
802 "net/url"
803 "sync"
804@@ -216,7 +216,7 @@
805 }
806
807 // acquireNode allocates a node from the MAAS.
808-func (environ *maasEnviron) acquireNode(cons constraints.Value, possibleTools tools.List) (gomaasapi.MAASObject, *state.Tools, error) {
809+func (environ *maasEnviron) acquireNode(cons constraints.Value, possibleTools tools.List) (gomaasapi.MAASObject, *tools.Tools, error) {
810 retry := utils.AttemptStrategy{
811 Total: 5 * time.Second,
812 Delay: 200 * time.Millisecond,
813
814=== modified file 'environs/maas/environ_test.go'
815--- environs/maas/environ_test.go 2013-07-03 22:07:00 +0000
816+++ environs/maas/environ_test.go 2013-07-09 05:06:28 +0000
817@@ -13,10 +13,10 @@
818 "launchpad.net/juju-core/environs"
819 "launchpad.net/juju-core/environs/config"
820 envtesting "launchpad.net/juju-core/environs/testing"
821- "launchpad.net/juju-core/environs/tools"
822 "launchpad.net/juju-core/errors"
823 "launchpad.net/juju-core/instance"
824 "launchpad.net/juju-core/testing"
825+ "launchpad.net/juju-core/tools"
826 "launchpad.net/juju-core/utils"
827 "launchpad.net/juju-core/version"
828 "net/url"
829
830=== modified file 'environs/maas/util_test.go'
831--- environs/maas/util_test.go 2013-06-16 23:07:00 +0000
832+++ environs/maas/util_test.go 2013-07-09 05:06:28 +0000
833@@ -13,6 +13,7 @@
834 "launchpad.net/juju-core/state"
835 "launchpad.net/juju-core/state/api"
836 "launchpad.net/juju-core/testing"
837+ "launchpad.net/juju-core/tools"
838 "launchpad.net/juju-core/utils"
839 "launchpad.net/juju-core/version"
840 )
841@@ -42,7 +43,7 @@
842 func (s *UtilSuite) TestUserData(c *C) {
843 testJujuHome := c.MkDir()
844 defer config.SetJujuHome(config.SetJujuHome(testJujuHome))
845- tools := &state.Tools{
846+ tools := &tools.Tools{
847 URL: "http://foo.com/tools/juju1.2.3-linux-amd64.tgz",
848 Binary: version.MustParseBinary("1.2.3-linux-amd64"),
849 }
850
851=== modified file 'environs/openstack/export_test.go'
852--- environs/openstack/export_test.go 2013-07-03 22:02:21 +0000
853+++ environs/openstack/export_test.go 2013-07-09 05:06:28 +0000
854@@ -14,7 +14,7 @@
855 "launchpad.net/juju-core/environs/imagemetadata"
856 "launchpad.net/juju-core/environs/instances"
857 "launchpad.net/juju-core/environs/jujutest"
858- "launchpad.net/juju-core/environs/tools"
859+ "launchpad.net/juju-core/tools"
860 "launchpad.net/juju-core/utils"
861 "net/http"
862 "strings"
863
864=== modified file 'environs/openstack/provider.go'
865--- environs/openstack/provider.go 2013-07-03 22:20:05 +0000
866+++ environs/openstack/provider.go 2013-07-09 05:06:28 +0000
867@@ -21,11 +21,11 @@
868 "launchpad.net/juju-core/environs/config"
869 "launchpad.net/juju-core/environs/imagemetadata"
870 "launchpad.net/juju-core/environs/instances"
871- "launchpad.net/juju-core/environs/tools"
872 "launchpad.net/juju-core/instance"
873 "launchpad.net/juju-core/log"
874 "launchpad.net/juju-core/state"
875 "launchpad.net/juju-core/state/api"
876+ "launchpad.net/juju-core/tools"
877 "launchpad.net/juju-core/utils"
878 "net/http"
879 "strconv"
880@@ -629,7 +629,7 @@
881 withPublicIP bool
882 }
883
884-func (e *environ) userData(scfg *startInstanceParams, tools *state.Tools) ([]byte, error) {
885+func (e *environ) userData(scfg *startInstanceParams, tools *tools.Tools) ([]byte, error) {
886 mcfg := &cloudinit.MachineConfig{
887 MachineId: scfg.machineId,
888 MachineNonce: scfg.machineNonce,
889
890=== modified file 'environs/testing/storage.go'
891--- environs/testing/storage.go 2013-07-02 21:20:53 +0000
892+++ environs/testing/storage.go 2013-07-09 05:06:28 +0000
893@@ -18,7 +18,7 @@
894
895 "launchpad.net/juju-core/environs"
896 "launchpad.net/juju-core/environs/localstorage"
897- "launchpad.net/juju-core/environs/tools"
898+ "launchpad.net/juju-core/tools"
899 "launchpad.net/juju-core/version"
900 )
901
902
903=== modified file 'environs/testing/tools.go'
904--- environs/testing/tools.go 2013-05-02 15:55:42 +0000
905+++ environs/testing/tools.go 2013-07-09 05:06:28 +0000
906@@ -7,14 +7,13 @@
907 . "launchpad.net/gocheck"
908 "launchpad.net/juju-core/environs"
909 "launchpad.net/juju-core/environs/config"
910- "launchpad.net/juju-core/environs/tools"
911 "launchpad.net/juju-core/log"
912- "launchpad.net/juju-core/state"
913+ "launchpad.net/juju-core/tools"
914 "launchpad.net/juju-core/version"
915 "strings"
916 )
917
918-func uploadFakeToolsVersion(storage environs.Storage, vers version.Binary) (*state.Tools, error) {
919+func uploadFakeToolsVersion(storage environs.Storage, vers version.Binary) (*tools.Tools, error) {
920 data := vers.String()
921 name := tools.StorageName(vers)
922 log.Noticef("environs/testing: uploading FAKE tools %s", vers)
923@@ -25,19 +24,19 @@
924 if err != nil {
925 return nil, err
926 }
927- return &state.Tools{Binary: vers, URL: url}, nil
928+ return &tools.Tools{Binary: vers, URL: url}, nil
929 }
930
931 // UploadFakeToolsVersion puts fake tools in the supplied storage for the
932 // supplied version.
933-func UploadFakeToolsVersion(c *C, storage environs.Storage, vers version.Binary) *state.Tools {
934+func UploadFakeToolsVersion(c *C, storage environs.Storage, vers version.Binary) *tools.Tools {
935 t, err := uploadFakeToolsVersion(storage, vers)
936 c.Assert(err, IsNil)
937 return t
938 }
939
940 // MustUploadFakeToolsVersion acts as UploadFakeToolsVersion, but panics on failure.
941-func MustUploadFakeToolsVersion(storage environs.Storage, vers version.Binary) *state.Tools {
942+func MustUploadFakeToolsVersion(storage environs.Storage, vers version.Binary) *tools.Tools {
943 t, err := uploadFakeToolsVersion(storage, vers)
944 if err != nil {
945 panic(err)
946
947=== removed directory 'environs/tools'
948=== modified file 'environs/tools.go'
949--- environs/tools.go 2013-05-30 00:47:30 +0000
950+++ environs/tools.go 2013-07-09 05:06:28 +0000
951@@ -6,10 +6,9 @@
952 import (
953 "fmt"
954 "launchpad.net/juju-core/constraints"
955- "launchpad.net/juju-core/environs/tools"
956 "launchpad.net/juju-core/errors"
957 "launchpad.net/juju-core/log"
958- "launchpad.net/juju-core/state"
959+ "launchpad.net/juju-core/tools"
960 "launchpad.net/juju-core/version"
961 )
962
963@@ -119,7 +118,7 @@
964 // TODO(fwereade) this should not exist: it's used by cmd/jujud/Upgrader,
965 // which needs to run on every agent and must absolutely *not* in general
966 // have access to an Environ.
967-func FindExactTools(environ Environ, vers version.Binary) (t *state.Tools, err error) {
968+func FindExactTools(environ Environ, vers version.Binary) (t *tools.Tools, err error) {
969 defer convertToolsError(&err)
970 list, err := FindAvailableTools(environ, vers.Major)
971 if err != nil {
972
973=== modified file 'environs/tools_test.go'
974--- environs/tools_test.go 2013-05-30 00:47:30 +0000
975+++ environs/tools_test.go 2013-07-09 05:06:28 +0000
976@@ -9,9 +9,9 @@
977 "launchpad.net/juju-core/environs"
978 "launchpad.net/juju-core/environs/dummy"
979 envtesting "launchpad.net/juju-core/environs/testing"
980- "launchpad.net/juju-core/environs/tools"
981 "launchpad.net/juju-core/errors"
982 "launchpad.net/juju-core/testing"
983+ "launchpad.net/juju-core/tools"
984 "launchpad.net/juju-core/version"
985 )
986
987
988=== modified file 'state/api/params/internal.go'
989--- state/api/params/internal.go 2013-07-08 13:48:32 +0000
990+++ state/api/params/internal.go 2013-07-09 05:06:28 +0000
991@@ -57,7 +57,7 @@
992 }
993
994 // AgentTools describes the tools for a given Agent. This is mostly a flattened
995-// state.Tools description, plus an agent Tag field.
996+// tools.Tools description, plus an agent Tag field.
997 type AgentTools struct {
998 Tag string
999 Major int
1000
1001=== modified file 'state/api/upgrader/upgrader_test.go'
1002--- state/api/upgrader/upgrader_test.go 2013-07-04 14:33:27 +0000
1003+++ state/api/upgrader/upgrader_test.go 2013-07-09 05:06:28 +0000
1004@@ -17,6 +17,7 @@
1005 "launchpad.net/juju-core/state/apiserver"
1006 coretesting "launchpad.net/juju-core/testing"
1007 "launchpad.net/juju-core/testing/checkers"
1008+ "launchpad.net/juju-core/tools"
1009 "launchpad.net/juju-core/version"
1010 )
1011
1012@@ -137,7 +138,7 @@
1013
1014 func (s *upgraderSuite) TestTools(c *C) {
1015 cur := version.Current
1016- curTools := &state.Tools{Binary: cur, URL: ""}
1017+ curTools := &tools.Tools{Binary: cur, URL: ""}
1018 if curTools.Minor > 0 {
1019 curTools.Minor -= 1
1020 }
1021
1022=== modified file 'state/apiserver/upgrader/upgrader.go'
1023--- state/apiserver/upgrader/upgrader.go 2013-07-04 11:03:43 +0000
1024+++ state/apiserver/upgrader/upgrader.go 2013-07-09 05:06:28 +0000
1025@@ -8,6 +8,7 @@
1026 "launchpad.net/juju-core/state"
1027 "launchpad.net/juju-core/state/api/params"
1028 "launchpad.net/juju-core/state/apiserver/common"
1029+ "launchpad.net/juju-core/tools"
1030 "launchpad.net/juju-core/version"
1031 )
1032
1033@@ -129,30 +130,30 @@
1034 results := params.SetAgentToolsResults{
1035 Results: make([]params.SetAgentToolsResult, len(args.AgentTools)),
1036 }
1037- for i, tools := range args.AgentTools {
1038+ for i, agentTools := range args.AgentTools {
1039 var err error
1040- results.Results[i].Tag = tools.Tag
1041- if !u.authorizer.AuthOwner(tools.Tag) {
1042+ results.Results[i].Tag = agentTools.Tag
1043+ if !u.authorizer.AuthOwner(agentTools.Tag) {
1044 err = common.ErrPerm
1045 } else {
1046 // TODO: When we get there, we should support setting
1047 // Unit agent tools as well as Machine tools. We
1048 // can use something like the "AgentState"
1049 // interface that cmd/jujud/agent.go had.
1050- machine, err := u.st.Machine(state.MachineIdFromTag(tools.Tag))
1051+ machine, err := u.st.Machine(state.MachineIdFromTag(agentTools.Tag))
1052 if err == nil {
1053- stTools := state.Tools{
1054+ stTools := tools.Tools{
1055 Binary: version.Binary{
1056 Number: version.Number{
1057- Major: tools.Major,
1058- Minor: tools.Minor,
1059- Patch: tools.Patch,
1060- Build: tools.Build,
1061+ Major: agentTools.Major,
1062+ Minor: agentTools.Minor,
1063+ Patch: agentTools.Patch,
1064+ Build: agentTools.Build,
1065 },
1066- Arch: tools.Arch,
1067- Series: tools.Series,
1068+ Arch: agentTools.Arch,
1069+ Series: agentTools.Series,
1070 },
1071- URL: tools.URL,
1072+ URL: agentTools.URL,
1073 }
1074 err = machine.SetAgentTools(&stTools)
1075 }
1076
1077=== modified file 'state/apiserver/upgrader/upgrader_test.go'
1078--- state/apiserver/upgrader/upgrader_test.go 2013-07-08 11:36:10 +0000
1079+++ state/apiserver/upgrader/upgrader_test.go 2013-07-09 05:06:28 +0000
1080@@ -15,6 +15,7 @@
1081 "launchpad.net/juju-core/state/apiserver/upgrader"
1082 statetesting "launchpad.net/juju-core/state/testing"
1083 "launchpad.net/juju-core/testing/checkers"
1084+ "launchpad.net/juju-core/tools"
1085 "launchpad.net/juju-core/version"
1086 )
1087
1088@@ -149,7 +150,7 @@
1089 // The machine must have its existing tools set before we query for the
1090 // next tools. This is so that we can grab Arch and Series without
1091 // having to pass it in again
1092- err := s.rawMachine.SetAgentTools(&state.Tools{
1093+ err := s.rawMachine.SetAgentTools(&tools.Tools{
1094 URL: "",
1095 Binary: version.Current,
1096 })
1097
1098=== modified file 'state/machine.go'
1099--- state/machine.go 2013-07-01 00:17:52 +0000
1100+++ state/machine.go 2013-07-09 05:06:28 +0000
1101@@ -12,6 +12,7 @@
1102 "launchpad.net/juju-core/instance"
1103 "launchpad.net/juju-core/state/api/params"
1104 "launchpad.net/juju-core/state/presence"
1105+ "launchpad.net/juju-core/tools"
1106 "launchpad.net/juju-core/utils"
1107 "strings"
1108 "time"
1109@@ -58,8 +59,8 @@
1110 ContainerType string
1111 Principals []string
1112 Life Life
1113- Tools *Tools `bson:",omitempty"`
1114- TxnRevno int64 `bson:"txn-revno"`
1115+ Tools *tools.Tools `bson:",omitempty"`
1116+ TxnRevno int64 `bson:"txn-revno"`
1117 Jobs []MachineJob
1118 PasswordHash string
1119 Clean bool
1120@@ -184,7 +185,7 @@
1121
1122 // AgentTools returns the tools that the agent is currently running.
1123 // It returns an error that satisfies IsNotFound if the tools have not yet been set.
1124-func (m *Machine) AgentTools() (*Tools, error) {
1125+func (m *Machine) AgentTools() (*tools.Tools, error) {
1126 if m.doc.Tools == nil {
1127 return nil, errors.NotFoundf("agent tools for machine %v", m)
1128 }
1129@@ -193,7 +194,7 @@
1130 }
1131
1132 // SetAgentTools sets the tools that the agent is currently running.
1133-func (m *Machine) SetAgentTools(t *Tools) (err error) {
1134+func (m *Machine) SetAgentTools(t *tools.Tools) (err error) {
1135 defer utils.ErrorContextf(&err, "cannot set agent tools for machine %v", m)
1136 if t.Series == "" || t.Arch == "" {
1137 return fmt.Errorf("empty series or arch")
1138
1139=== modified file 'state/machine_test.go'
1140--- state/machine_test.go 2013-07-03 13:12:37 +0000
1141+++ state/machine_test.go 2013-07-09 05:06:28 +0000
1142@@ -12,6 +12,7 @@
1143 "launchpad.net/juju-core/state/api/params"
1144 "launchpad.net/juju-core/state/testing"
1145 "launchpad.net/juju-core/testing/checkers"
1146+ "launchpad.net/juju-core/tools"
1147 "launchpad.net/juju-core/version"
1148 "sort"
1149 "time"
1150@@ -421,7 +422,7 @@
1151 oldTools, _ := m0.AgentTools()
1152 m1, err := s.State.Machine(m0.Id())
1153 c.Assert(err, IsNil)
1154- err = m0.SetAgentTools(&state.Tools{
1155+ err = m0.SetAgentTools(&tools.Tools{
1156 URL: "foo",
1157 Binary: version.MustParseBinary("0.0.3-series-arch"),
1158 })
1159@@ -584,7 +585,7 @@
1160 wc.AssertOneChange()
1161
1162 // Make two changes, check one event.
1163- err = machine.SetAgentTools(&state.Tools{
1164+ err = machine.SetAgentTools(&tools.Tools{
1165 URL: "foo",
1166 Binary: version.MustParseBinary("0.0.3-series-arch"),
1167 })
1168
1169=== modified file 'state/state.go'
1170--- state/state.go 2013-07-08 06:06:57 +0000
1171+++ state/state.go 2013-07-09 05:06:28 +0000
1172@@ -22,7 +22,6 @@
1173 "launchpad.net/juju-core/state/presence"
1174 "launchpad.net/juju-core/state/watcher"
1175 "launchpad.net/juju-core/utils"
1176- "launchpad.net/juju-core/version"
1177 "net/url"
1178 "regexp"
1179 "sort"
1180@@ -34,38 +33,6 @@
1181 // TODO(niemeyer): This must not be exported.
1182 type D []bson.DocElem
1183
1184-// Tools describes a particular set of juju tools and where to find them.
1185-type Tools struct {
1186- version.Binary
1187- URL string
1188-}
1189-
1190-type toolsDoc struct {
1191- Version version.Binary
1192- URL string
1193-}
1194-
1195-func (t *Tools) GetBSON() (interface{}, error) {
1196- if t == nil {
1197- return nil, nil
1198- }
1199- return &toolsDoc{t.Binary, t.URL}, nil
1200-}
1201-
1202-func (t *Tools) SetBSON(raw bson.Raw) error {
1203- if raw.Kind == 10 {
1204- // Preserve the nil value in that case.
1205- return bson.SetZero
1206- }
1207- var doc toolsDoc
1208- if err := raw.Unmarshal(&doc); err != nil {
1209- return err
1210- }
1211- t.Binary = doc.Version
1212- t.URL = doc.URL
1213- return nil
1214-}
1215-
1216 const serviceSnippet = "[a-z][a-z0-9]*(-[a-z0-9]*[a-z][a-z0-9]*)*"
1217 const numberSnippet = "(0|[1-9][0-9]*)"
1218 const containerSnippet = "(/[a-z]+/" + numberSnippet + ")"
1219
1220=== modified file 'state/state_test.go'
1221--- state/state_test.go 2013-07-07 22:06:05 +0000
1222+++ state/state_test.go 2013-07-09 05:06:28 +0000
1223@@ -17,6 +17,7 @@
1224 statetesting "launchpad.net/juju-core/state/testing"
1225 "launchpad.net/juju-core/testing"
1226 "launchpad.net/juju-core/testing/checkers"
1227+ "launchpad.net/juju-core/tools"
1228 "launchpad.net/juju-core/version"
1229 "net/url"
1230 "strconv"
1231@@ -964,7 +965,7 @@
1232 wc.AssertOneChange()
1233
1234 // Alter the machine: not reported.
1235- tools := &state.Tools{
1236+ tools := &tools.Tools{
1237 Binary: version.Binary{
1238 Number: version.MustParse("1.2.3"),
1239 Series: "gutsy",
1240
1241=== modified file 'state/tools_test.go'
1242--- state/tools_test.go 2013-06-25 09:50:52 +0000
1243+++ state/tools_test.go 2013-07-09 05:06:28 +0000
1244@@ -5,17 +5,17 @@
1245
1246 import (
1247 "fmt"
1248- "labix.org/v2/mgo/bson"
1249 . "launchpad.net/gocheck"
1250 "launchpad.net/juju-core/errors"
1251 "launchpad.net/juju-core/state"
1252 "launchpad.net/juju-core/testing/checkers"
1253+ "launchpad.net/juju-core/tools"
1254 "launchpad.net/juju-core/version"
1255 )
1256
1257 type tooler interface {
1258- AgentTools() (*state.Tools, error)
1259- SetAgentTools(t *state.Tools) error
1260+ AgentTools() (*tools.Tools, error)
1261+ SetAgentTools(t *tools.Tools) error
1262 Life() state.Life
1263 Refresh() error
1264 Destroy() error
1265@@ -28,8 +28,8 @@
1266 ConnSuite
1267 }
1268
1269-func newTools(vers, url string) *state.Tools {
1270- return &state.Tools{
1271+func newTools(vers, url string) *tools.Tools {
1272+ return &tools.Tools{
1273 Binary: version.MustParseBinary(vers),
1274 URL: url,
1275 }
1276@@ -41,7 +41,7 @@
1277 c.Assert(t, IsNil)
1278 c.Assert(err, checkers.Satisfies, errors.IsNotFoundError)
1279
1280- err = obj.SetAgentTools(&state.Tools{})
1281+ err = obj.SetAgentTools(&tools.Tools{})
1282 c.Assert(err, ErrorMatches, fmt.Sprintf("cannot set agent tools for %s: empty series or arch", agent))
1283 t2 := newTools("7.8.9-foo-bar", "http://arble.tgz")
1284 err = obj.SetAgentTools(t2)
1285@@ -75,36 +75,3 @@
1286 preventUnitDestroyRemove(c, unit)
1287 testAgentTools(c, unit, `unit "wordpress/0"`)
1288 }
1289-
1290-func (s *ToolsSuite) TestMarshalUnmarshal(c *C) {
1291- tools := newTools("7.8.9-foo-bar", "http://arble.tgz")
1292- data, err := bson.Marshal(&tools)
1293- c.Assert(err, IsNil)
1294-
1295- // Check the exact document.
1296- want := bson.M{
1297- "version": tools.Binary.String(),
1298- "url": tools.URL,
1299- }
1300- got := bson.M{}
1301- err = bson.Unmarshal(data, &got)
1302- c.Assert(err, IsNil)
1303- c.Assert(got, DeepEquals, want)
1304-
1305- // Check that it unpacks properly too.
1306- var t state.Tools
1307- err = bson.Unmarshal(data, &t)
1308- c.Assert(err, IsNil)
1309- c.Assert(t, Equals, *tools)
1310-}
1311-
1312-func (s *ToolsSuite) TestUnmarshalNilRoundtrip(c *C) {
1313- // We have a custom unmarshaller that should keep
1314- // the field unset when it finds a nil value.
1315- var v struct{ Tools *state.Tools }
1316- data, err := bson.Marshal(&v)
1317- c.Assert(err, IsNil)
1318- err = bson.Unmarshal(data, &v)
1319- c.Assert(err, IsNil)
1320- c.Assert(v.Tools, IsNil)
1321-}
1322
1323=== modified file 'state/unit.go'
1324--- state/unit.go 2013-07-08 02:42:00 +0000
1325+++ state/unit.go 2013-07-09 05:06:28 +0000
1326@@ -14,6 +14,7 @@
1327 "launchpad.net/juju-core/instance"
1328 "launchpad.net/juju-core/state/api/params"
1329 "launchpad.net/juju-core/state/presence"
1330+ "launchpad.net/juju-core/tools"
1331 "launchpad.net/juju-core/utils"
1332 "sort"
1333 "strings"
1334@@ -73,7 +74,7 @@
1335 PrivateAddress string
1336 MachineId string
1337 Resolved ResolvedMode
1338- Tools *Tools `bson:",omitempty"`
1339+ Tools *tools.Tools `bson:",omitempty"`
1340 Ports []instance.Port
1341 Life Life
1342 TxnRevno int64 `bson:"txn-revno"`
1343@@ -160,7 +161,7 @@
1344
1345 // AgentTools returns the tools that the agent is currently running.
1346 // It an error that satisfies IsNotFound if the tools have not yet been set.
1347-func (u *Unit) AgentTools() (*Tools, error) {
1348+func (u *Unit) AgentTools() (*tools.Tools, error) {
1349 if u.doc.Tools == nil {
1350 return nil, errors.NotFoundf("agent tools for unit %q", u)
1351 }
1352@@ -169,7 +170,7 @@
1353 }
1354
1355 // SetAgentTools sets the tools that the agent is currently running.
1356-func (u *Unit) SetAgentTools(t *Tools) (err error) {
1357+func (u *Unit) SetAgentTools(t *tools.Tools) (err error) {
1358 defer utils.ErrorContextf(&err, "cannot set agent tools for unit %q", u)
1359 if t.Series == "" || t.Arch == "" {
1360 return fmt.Errorf("empty series or arch")
1361
1362=== renamed file 'environs/agent/tools.go' => 'tools/agent.go'
1363--- environs/agent/tools.go 2013-05-02 15:55:42 +0000
1364+++ tools/agent.go 2013-07-09 05:06:28 +0000
1365@@ -1,7 +1,7 @@
1366 // Copyright 2013 Canonical Ltd.
1367 // Licensed under the AGPLv3, see LICENCE file for details.
1368
1369-package agent
1370+package tools
1371
1372 import (
1373 "archive/tar"
1374@@ -9,12 +9,12 @@
1375 "fmt"
1376 "io"
1377 "io/ioutil"
1378- "launchpad.net/juju-core/log"
1379- "launchpad.net/juju-core/state"
1380- "launchpad.net/juju-core/version"
1381 "os"
1382 "path"
1383 "strings"
1384+
1385+ "launchpad.net/juju-core/log"
1386+ "launchpad.net/juju-core/version"
1387 )
1388
1389 const urlFile = "downloaded-url.txt"
1390@@ -42,7 +42,7 @@
1391 // format and unpacks them into the appropriate tools directory
1392 // within dataDir. If a valid tools directory already exists,
1393 // UnpackTools returns without error.
1394-func UnpackTools(dataDir string, tools *state.Tools, r io.Reader) (err error) {
1395+func UnpackTools(dataDir string, tools *Tools, r io.Reader) (err error) {
1396 zr, err := gzip.NewReader(r)
1397 if err != nil {
1398 return err
1399@@ -119,7 +119,7 @@
1400
1401 // ReadTools checks that the tools for the given version exist
1402 // in the dataDir directory, and returns a Tools instance describing them.
1403-func ReadTools(dataDir string, vers version.Binary) (*state.Tools, error) {
1404+func ReadTools(dataDir string, vers version.Binary) (*Tools, error) {
1405 dir := SharedToolsDir(dataDir, vers)
1406 urlData, err := ioutil.ReadFile(path.Join(dir, urlFile))
1407 if err != nil {
1408@@ -131,7 +131,7 @@
1409 }
1410 // TODO(rog): do more verification here too, such as checking
1411 // for the existence of certain files.
1412- return &state.Tools{
1413+ return &Tools{
1414 URL: url,
1415 Binary: vers,
1416 }, nil
1417@@ -140,7 +140,7 @@
1418 // ChangeAgentTools atomically replaces the agent-specific symlink
1419 // under dataDir so it points to the previously unpacked
1420 // version vers. It returns the new tools read.
1421-func ChangeAgentTools(dataDir string, agentName string, vers version.Binary) (*state.Tools, error) {
1422+func ChangeAgentTools(dataDir string, agentName string, vers version.Binary) (*Tools, error) {
1423 tools, err := ReadTools(dataDir, vers)
1424 if err != nil {
1425 return nil, err
1426
1427=== renamed file 'environs/agent/tools_test.go' => 'tools/agent_test.go'
1428--- environs/agent/tools_test.go 2013-05-02 15:55:42 +0000
1429+++ tools/agent_test.go 2013-07-09 05:06:28 +0000
1430@@ -1,19 +1,20 @@
1431 // Copyright 2013 Canonical Ltd.
1432 // Licensed under the AGPLv3, see LICENCE file for details.
1433
1434-package agent_test
1435+package tools_test
1436
1437 import (
1438 "bytes"
1439 "io/ioutil"
1440+ "os"
1441+ "path/filepath"
1442+ "sort"
1443+
1444 . "launchpad.net/gocheck"
1445- "launchpad.net/juju-core/environs/agent"
1446- "launchpad.net/juju-core/state"
1447+
1448 "launchpad.net/juju-core/testing"
1449+ "launchpad.net/juju-core/tools"
1450 "launchpad.net/juju-core/version"
1451- "os"
1452- "path/filepath"
1453- "sort"
1454 )
1455
1456 type ToolsSuite struct {
1457@@ -69,11 +70,11 @@
1458 func (t *ToolsSuite) TestUnpackToolsBadData(c *C) {
1459 for i, test := range unpackToolsBadDataTests {
1460 c.Logf("test %d", i)
1461- tools := &state.Tools{
1462+ testTools := &tools.Tools{
1463 URL: "http://foo/bar",
1464 Binary: version.MustParseBinary("1.2.3-foo-bar"),
1465 }
1466- err := agent.UnpackTools(t.dataDir, tools, bytes.NewReader(test.data))
1467+ err := tools.UnpackTools(t.dataDir, testTools, bytes.NewReader(test.data))
1468 c.Assert(err, ErrorMatches, test.err)
1469 assertDirNames(c, t.toolsDir(), []string{})
1470 }
1471@@ -88,19 +89,19 @@
1472 testing.NewTarFile("bar", 0755, "bar contents"),
1473 testing.NewTarFile("foo", 0755, "foo contents"),
1474 }
1475- tools := &state.Tools{
1476+ testTools := &tools.Tools{
1477 URL: "http://foo/bar",
1478 Binary: version.MustParseBinary("1.2.3-foo-bar"),
1479 }
1480
1481- err := agent.UnpackTools(t.dataDir, tools, bytes.NewReader(testing.TarGz(files...)))
1482+ err := tools.UnpackTools(t.dataDir, testTools, bytes.NewReader(testing.TarGz(files...)))
1483 c.Assert(err, IsNil)
1484 assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar"})
1485- t.assertToolsContents(c, tools, files)
1486+ t.assertToolsContents(c, testTools, files)
1487
1488 // Try to unpack the same version of tools again - it should succeed,
1489 // leaving the original version around.
1490- tools2 := &state.Tools{
1491+ tools2 := &tools.Tools{
1492 URL: "http://arble",
1493 Binary: version.MustParseBinary("1.2.3-foo-bar"),
1494 }
1495@@ -108,27 +109,27 @@
1496 testing.NewTarFile("bar", 0755, "bar2 contents"),
1497 testing.NewTarFile("x", 0755, "x contents"),
1498 }
1499- err = agent.UnpackTools(t.dataDir, tools2, bytes.NewReader(testing.TarGz(files2...)))
1500+ err = tools.UnpackTools(t.dataDir, tools2, bytes.NewReader(testing.TarGz(files2...)))
1501 c.Assert(err, IsNil)
1502 assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar"})
1503- t.assertToolsContents(c, tools, files)
1504+ t.assertToolsContents(c, testTools, files)
1505 }
1506
1507 func (t *ToolsSuite) TestReadToolsErrors(c *C) {
1508 vers := version.MustParseBinary("1.2.3-precise-amd64")
1509- tools, err := agent.ReadTools(t.dataDir, vers)
1510- c.Assert(tools, IsNil)
1511+ testTools, err := tools.ReadTools(t.dataDir, vers)
1512+ c.Assert(testTools, IsNil)
1513 c.Assert(err, ErrorMatches, "cannot read URL in tools directory: .*")
1514
1515- dir := agent.SharedToolsDir(t.dataDir, vers)
1516+ dir := tools.SharedToolsDir(t.dataDir, vers)
1517 err = os.MkdirAll(dir, 0755)
1518 c.Assert(err, IsNil)
1519
1520 err = ioutil.WriteFile(filepath.Join(dir, urlFile), []byte(" \t\n"), 0644)
1521 c.Assert(err, IsNil)
1522
1523- tools, err = agent.ReadTools(t.dataDir, vers)
1524- c.Assert(tools, IsNil)
1525+ testTools, err = tools.ReadTools(t.dataDir, vers)
1526+ c.Assert(testTools, IsNil)
1527 c.Assert(err, ErrorMatches, "empty URL in tools directory.*")
1528 }
1529
1530@@ -137,62 +138,62 @@
1531 testing.NewTarFile("jujuc", 0755, "juju executable"),
1532 testing.NewTarFile("jujud", 0755, "jujuc executable"),
1533 }
1534- tools := &state.Tools{
1535+ testTools := &tools.Tools{
1536 URL: "http://foo/bar1",
1537 Binary: version.MustParseBinary("1.2.3-foo-bar"),
1538 }
1539- err := agent.UnpackTools(t.dataDir, tools, bytes.NewReader(testing.TarGz(files...)))
1540+ err := tools.UnpackTools(t.dataDir, testTools, bytes.NewReader(testing.TarGz(files...)))
1541 c.Assert(err, IsNil)
1542
1543- gotTools, err := agent.ChangeAgentTools(t.dataDir, "testagent", tools.Binary)
1544+ gotTools, err := tools.ChangeAgentTools(t.dataDir, "testagent", testTools.Binary)
1545 c.Assert(err, IsNil)
1546- c.Assert(*gotTools, Equals, *tools)
1547+ c.Assert(*gotTools, Equals, *testTools)
1548
1549 assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar", "testagent"})
1550- assertDirNames(c, agent.ToolsDir(t.dataDir, "testagent"), []string{"jujuc", "jujud", urlFile})
1551+ assertDirNames(c, tools.ToolsDir(t.dataDir, "testagent"), []string{"jujuc", "jujud", urlFile})
1552
1553 // Upgrade again to check that the link replacement logic works ok.
1554 files2 := []*testing.TarFile{
1555 testing.NewTarFile("foo", 0755, "foo content"),
1556 testing.NewTarFile("bar", 0755, "bar content"),
1557 }
1558- tools2 := &state.Tools{
1559+ tools2 := &tools.Tools{
1560 URL: "http://foo/bar2",
1561 Binary: version.MustParseBinary("1.2.4-foo-bar"),
1562 }
1563- err = agent.UnpackTools(t.dataDir, tools2, bytes.NewReader(testing.TarGz(files2...)))
1564+ err = tools.UnpackTools(t.dataDir, tools2, bytes.NewReader(testing.TarGz(files2...)))
1565 c.Assert(err, IsNil)
1566
1567- gotTools, err = agent.ChangeAgentTools(t.dataDir, "testagent", tools2.Binary)
1568+ gotTools, err = tools.ChangeAgentTools(t.dataDir, "testagent", tools2.Binary)
1569 c.Assert(err, IsNil)
1570 c.Assert(*gotTools, Equals, *tools2)
1571
1572 assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar", "1.2.4-foo-bar", "testagent"})
1573- assertDirNames(c, agent.ToolsDir(t.dataDir, "testagent"), []string{"foo", "bar", urlFile})
1574+ assertDirNames(c, tools.ToolsDir(t.dataDir, "testagent"), []string{"foo", "bar", urlFile})
1575 }
1576
1577 func (t *ToolsSuite) TestSharedToolsDir(c *C) {
1578- dir := agent.SharedToolsDir("/var/lib/juju", version.MustParseBinary("1.2.3-precise-amd64"))
1579+ dir := tools.SharedToolsDir("/var/lib/juju", version.MustParseBinary("1.2.3-precise-amd64"))
1580 c.Assert(dir, Equals, "/var/lib/juju/tools/1.2.3-precise-amd64")
1581 }
1582
1583 // assertToolsContents asserts that the directory for the tools
1584 // has the given contents.
1585-func (t *ToolsSuite) assertToolsContents(c *C, tools *state.Tools, files []*testing.TarFile) {
1586+func (t *ToolsSuite) assertToolsContents(c *C, testTools *tools.Tools, files []*testing.TarFile) {
1587 var wantNames []string
1588 for _, f := range files {
1589 wantNames = append(wantNames, f.Header.Name)
1590 }
1591 wantNames = append(wantNames, urlFile)
1592- dir := agent.SharedToolsDir(t.dataDir, tools.Binary)
1593+ dir := tools.SharedToolsDir(t.dataDir, testTools.Binary)
1594 assertDirNames(c, dir, wantNames)
1595- assertFileContents(c, dir, urlFile, tools.URL, 0200)
1596+ assertFileContents(c, dir, urlFile, testTools.URL, 0200)
1597 for _, f := range files {
1598 assertFileContents(c, dir, f.Header.Name, f.Contents, 0400)
1599 }
1600- gotTools, err := agent.ReadTools(t.dataDir, tools.Binary)
1601+ gotTools, err := tools.ReadTools(t.dataDir, testTools.Binary)
1602 c.Assert(err, IsNil)
1603- c.Assert(*gotTools, Equals, *tools)
1604+ c.Assert(*gotTools, Equals, *testTools)
1605 }
1606
1607 // assertFileContents asserts that the given file in the
1608
1609=== renamed file 'environs/tools/build.go' => 'tools/build.go'
1610--- environs/tools/build.go 2013-05-02 15:55:42 +0000
1611+++ tools/build.go 2013-07-09 05:06:28 +0000
1612@@ -9,11 +9,12 @@
1613 "fmt"
1614 "io"
1615 "io/ioutil"
1616- "launchpad.net/juju-core/version"
1617 "os"
1618 "os/exec"
1619 "path/filepath"
1620 "strings"
1621+
1622+ "launchpad.net/juju-core/version"
1623 )
1624
1625 // archive writes the executable files found in the given directory in
1626
1627=== modified file 'tools/diskmanager.go'
1628--- tools/diskmanager.go 2013-07-08 04:52:30 +0000
1629+++ tools/diskmanager.go 2013-07-09 05:06:28 +0000
1630@@ -6,8 +6,6 @@
1631 import (
1632 "io"
1633
1634- "launchpad.net/juju-core/environs/agent"
1635- "launchpad.net/juju-core/state"
1636 "launchpad.net/juju-core/version"
1637 )
1638
1639@@ -23,18 +21,14 @@
1640 return &DiskManager{dataDir: dataDir}
1641 }
1642
1643-// For now, everything is just proxied from environs/agent. But really tool
1644-// handling should be independent of anything in environs.
1645-
1646 func (d *DiskManager) ReadTools(vers version.Binary) (*Tools, error) {
1647- stTools, err := agent.ReadTools(d.dataDir, vers)
1648- return (*Tools)(stTools), err
1649+ return ReadTools(d.dataDir, vers)
1650 }
1651
1652 func (d *DiskManager) UnpackTools(tools *Tools, r io.Reader) error {
1653- return agent.UnpackTools(d.dataDir, (*state.Tools)(tools), r)
1654+ return UnpackTools(d.dataDir, tools, r)
1655 }
1656
1657 func (d *DiskManager) SharedToolsDir(vers version.Binary) string {
1658- return agent.SharedToolsDir(d.dataDir, vers)
1659+ return SharedToolsDir(d.dataDir, vers)
1660 }
1661
1662=== modified file 'tools/diskmanager_test.go'
1663--- tools/diskmanager_test.go 2013-07-08 09:19:16 +0000
1664+++ tools/diskmanager_test.go 2013-07-09 05:06:28 +0000
1665@@ -5,10 +5,7 @@
1666
1667 import (
1668 "bytes"
1669- "io/ioutil"
1670- "os"
1671 "path/filepath"
1672- "sort"
1673
1674 gc "launchpad.net/gocheck"
1675
1676@@ -76,8 +73,6 @@
1677 c.Assert(dir, gc.Equals, "/var/lib/juju/tools/1.2.3-precise-amd64")
1678 }
1679
1680-const urlFile = "downloaded-url.txt"
1681-
1682 // assertToolsContents asserts that the directory for the tools
1683 // has the given contents.
1684 func (s *DiskManagerSuite) assertToolsContents(c *gc.C, t *tools.Tools, files []*coretesting.TarFile) {
1685@@ -96,28 +91,3 @@
1686 c.Assert(err, gc.IsNil)
1687 c.Assert(*gotTools, gc.Equals, *t)
1688 }
1689-
1690-// assertFileContents asserts that the given file in the
1691-// given directory has the given contents.
1692-func assertFileContents(c *gc.C, dir, file, contents string, mode os.FileMode) {
1693- file = filepath.Join(dir, file)
1694- info, err := os.Stat(file)
1695- c.Assert(err, gc.IsNil)
1696- c.Assert(info.Mode()&(os.ModeType|mode), gc.Equals, mode)
1697- data, err := ioutil.ReadFile(file)
1698- c.Assert(err, gc.IsNil)
1699- c.Assert(string(data), gc.Equals, contents)
1700-}
1701-
1702-// assertDirNames asserts that the given directory
1703-// holds the given file or directory names.
1704-func assertDirNames(c *gc.C, dir string, names []string) {
1705- f, err := os.Open(dir)
1706- c.Assert(err, gc.IsNil)
1707- defer f.Close()
1708- dnames, err := f.Readdirnames(0)
1709- c.Assert(err, gc.IsNil)
1710- sort.Strings(dnames)
1711- sort.Strings(names)
1712- c.Assert(dnames, gc.DeepEquals, names)
1713-}
1714
1715=== renamed file 'environs/tools/export_test.go' => 'tools/export_test.go'
1716=== renamed file 'environs/tools/list.go' => 'tools/list.go'
1717--- environs/tools/list.go 2013-05-02 15:55:42 +0000
1718+++ tools/list.go 2013-07-09 05:06:28 +0000
1719@@ -4,16 +4,16 @@
1720 package tools
1721
1722 import (
1723+ "strings"
1724+
1725 "launchpad.net/juju-core/log"
1726- "launchpad.net/juju-core/state"
1727 "launchpad.net/juju-core/utils/set"
1728 "launchpad.net/juju-core/version"
1729- "strings"
1730 )
1731
1732 // List holds tools available in an environment. The order of tools within
1733 // a List is not significant.
1734-type List []*state.Tools
1735+type List []*Tools
1736
1737 // String returns the versions of the tools in src, separated by semicolons.
1738 func (src List) String() string {
1739@@ -26,21 +26,21 @@
1740
1741 // Series returns all series for which some tools in src were built.
1742 func (src List) Series() []string {
1743- return src.collect(func(tools *state.Tools) string {
1744+ return src.collect(func(tools *Tools) string {
1745 return tools.Series
1746 })
1747 }
1748
1749 // Arches returns all architectures for which some tools in src were built.
1750 func (src List) Arches() []string {
1751- return src.collect(func(tools *state.Tools) string {
1752+ return src.collect(func(tools *Tools) string {
1753 return tools.Arch
1754 })
1755 }
1756
1757 // collect calls f on all values in src and returns an alphabetically
1758 // ordered list of the returned results without duplicates.
1759-func (src List) collect(f func(*state.Tools) string) []string {
1760+func (src List) collect(f func(*Tools) string) []string {
1761 var seen set.Strings
1762 for _, tools := range src {
1763 seen.Add(f(tools))
1764@@ -125,7 +125,7 @@
1765 }
1766
1767 // match returns true if the supplied tools match f.
1768-func (f Filter) match(tools *state.Tools) bool {
1769+func (f Filter) match(tools *Tools) bool {
1770 if f.Released && tools.IsDev() {
1771 return false
1772 }
1773
1774=== renamed file 'environs/tools/list_test.go' => 'tools/list_test.go'
1775--- environs/tools/list_test.go 2013-05-02 15:55:42 +0000
1776+++ tools/list_test.go 2013-07-09 05:06:28 +0000
1777@@ -5,22 +5,19 @@
1778
1779 import (
1780 . "launchpad.net/gocheck"
1781- "launchpad.net/juju-core/environs/tools"
1782- "launchpad.net/juju-core/state"
1783+ "launchpad.net/juju-core/testing"
1784+ "launchpad.net/juju-core/tools"
1785 "launchpad.net/juju-core/version"
1786- "testing"
1787 )
1788
1789-func TestPackage(t *testing.T) {
1790- TestingT(t)
1791+type ListSuite struct {
1792+ testing.LoggingSuite
1793 }
1794
1795-type ListSuite struct{}
1796-
1797 var _ = Suite(&ListSuite{})
1798
1799-func mustParseTools(name string) *state.Tools {
1800- return &state.Tools{
1801+func mustParseTools(name string) *tools.Tools {
1802+ return &tools.Tools{
1803 Binary: version.MustParseBinary(name),
1804 URL: "http://example.com/" + name,
1805 }
1806
1807=== added file 'tools/marshal.go'
1808--- tools/marshal.go 1970-01-01 00:00:00 +0000
1809+++ tools/marshal.go 2013-07-09 05:06:28 +0000
1810@@ -0,0 +1,36 @@
1811+// Copyright 2013 Canonical Ltd.
1812+// Licensed under the AGPLv3, see LICENCE file for details.
1813+
1814+package tools
1815+
1816+import (
1817+ "labix.org/v2/mgo/bson"
1818+
1819+ "launchpad.net/juju-core/version"
1820+)
1821+
1822+type toolsDoc struct {
1823+ Version version.Binary
1824+ URL string
1825+}
1826+
1827+func (t *Tools) GetBSON() (interface{}, error) {
1828+ if t == nil {
1829+ return nil, nil
1830+ }
1831+ return &toolsDoc{t.Binary, t.URL}, nil
1832+}
1833+
1834+func (t *Tools) SetBSON(raw bson.Raw) error {
1835+ if raw.Kind == 10 {
1836+ // Preserve the nil value in that case.
1837+ return bson.SetZero
1838+ }
1839+ var doc toolsDoc
1840+ if err := raw.Unmarshal(&doc); err != nil {
1841+ return err
1842+ }
1843+ t.Binary = doc.Version
1844+ t.URL = doc.URL
1845+ return nil
1846+}
1847
1848=== added file 'tools/marshal_test.go'
1849--- tools/marshal_test.go 1970-01-01 00:00:00 +0000
1850+++ tools/marshal_test.go 2013-07-09 05:06:28 +0000
1851@@ -0,0 +1,57 @@
1852+// Copyright 2013 Canonical Ltd.
1853+// Licensed under the AGPLv3, see LICENCE file for details.
1854+
1855+package tools_test
1856+
1857+import (
1858+ "labix.org/v2/mgo/bson"
1859+ . "launchpad.net/gocheck"
1860+
1861+ "launchpad.net/juju-core/tools"
1862+ "launchpad.net/juju-core/version"
1863+)
1864+
1865+var _ = Suite(&marshalSuite{})
1866+
1867+type marshalSuite struct {
1868+}
1869+
1870+func newTools(vers, url string) *tools.Tools {
1871+ return &tools.Tools{
1872+ Binary: version.MustParseBinary(vers),
1873+ URL: url,
1874+ }
1875+}
1876+
1877+func (s *marshalSuite) TestMarshalUnmarshal(c *C) {
1878+ testTools := newTools("7.8.9-foo-bar", "http://arble.tgz")
1879+ data, err := bson.Marshal(&testTools)
1880+ c.Assert(err, IsNil)
1881+
1882+ // Check the exact document.
1883+ want := bson.M{
1884+ "version": testTools.Binary.String(),
1885+ "url": testTools.URL,
1886+ }
1887+ got := bson.M{}
1888+ err = bson.Unmarshal(data, &got)
1889+ c.Assert(err, IsNil)
1890+ c.Assert(got, DeepEquals, want)
1891+
1892+ // Check that it unpacks properly too.
1893+ var t tools.Tools
1894+ err = bson.Unmarshal(data, &t)
1895+ c.Assert(err, IsNil)
1896+ c.Assert(t, Equals, *testTools)
1897+}
1898+
1899+func (s *marshalSuite) TestUnmarshalNilRoundtrip(c *C) {
1900+ // We have a custom unmarshaller that should keep
1901+ // the field unset when it finds a nil value.
1902+ var v struct{ Tools *tools.Tools }
1903+ data, err := bson.Marshal(&v)
1904+ c.Assert(err, IsNil)
1905+ err = bson.Unmarshal(data, &v)
1906+ c.Assert(err, IsNil)
1907+ c.Assert(v.Tools, IsNil)
1908+}
1909
1910=== renamed file 'environs/tools/storage.go' => 'tools/storage.go'
1911--- environs/tools/storage.go 2013-05-02 15:55:42 +0000
1912+++ tools/storage.go 2013-07-09 05:06:28 +0000
1913@@ -8,11 +8,11 @@
1914 "fmt"
1915 "io"
1916 "io/ioutil"
1917+ "os"
1918+ "strings"
1919+
1920 "launchpad.net/juju-core/log"
1921- "launchpad.net/juju-core/state"
1922 "launchpad.net/juju-core/version"
1923- "os"
1924- "strings"
1925 )
1926
1927 var ErrNoTools = errors.New("no tools available")
1928@@ -57,7 +57,7 @@
1929 if !strings.HasPrefix(name, toolPrefix) || !strings.HasSuffix(name, toolSuffix) {
1930 continue
1931 }
1932- var t state.Tools
1933+ var t Tools
1934 vers := name[len(toolPrefix) : len(name)-len(toolSuffix)]
1935 if t.Binary, err = version.ParseBinary(vers); err != nil {
1936 continue
1937@@ -95,7 +95,7 @@
1938 // of the built tools will be uploaded for use by machines of those series.
1939 // Juju tools built for one series do not necessarily run on another, but this
1940 // func exists only for development use cases.
1941-func Upload(storage URLPutter, forceVersion *version.Number, fakeSeries ...string) (*state.Tools, error) {
1942+func Upload(storage URLPutter, forceVersion *version.Number, fakeSeries ...string) (*Tools, error) {
1943 // TODO(rog) find binaries from $PATH when not using a development
1944 // version of juju within a $GOPATH.
1945
1946@@ -146,5 +146,5 @@
1947 if err != nil {
1948 return nil, err
1949 }
1950- return &state.Tools{toolsVersion, url}, nil
1951+ return &Tools{toolsVersion, url}, nil
1952 }
1953
1954=== renamed file 'environs/tools/storage_test.go' => 'tools/storage_test.go'
1955--- environs/tools/storage_test.go 2013-05-02 15:55:42 +0000
1956+++ tools/storage_test.go 2013-07-09 05:06:28 +0000
1957@@ -7,21 +7,22 @@
1958 "bytes"
1959 "io"
1960 "io/ioutil"
1961+ "net/http"
1962+ "os"
1963+ "os/exec"
1964+ "path/filepath"
1965+ "sort"
1966+ "strings"
1967+
1968 . "launchpad.net/gocheck"
1969+
1970 "launchpad.net/juju-core/environs"
1971 "launchpad.net/juju-core/environs/dummy"
1972 envtesting "launchpad.net/juju-core/environs/testing"
1973- "launchpad.net/juju-core/environs/tools"
1974 "launchpad.net/juju-core/log"
1975- "launchpad.net/juju-core/state"
1976 "launchpad.net/juju-core/testing"
1977+ "launchpad.net/juju-core/tools"
1978 "launchpad.net/juju-core/version"
1979- "net/http"
1980- "os"
1981- "os/exec"
1982- "path/filepath"
1983- "sort"
1984- "strings"
1985 )
1986
1987 type StorageSuite struct {
1988@@ -170,7 +171,7 @@
1989
1990 // downloadTools downloads the supplied tools and extracts them into a
1991 // new directory.
1992-func downloadTools(c *C, t *state.Tools) string {
1993+func downloadTools(c *C, t *tools.Tools) string {
1994 resp, err := http.Get(t.URL)
1995 c.Assert(err, IsNil)
1996 defer resp.Body.Close()
1997@@ -183,7 +184,7 @@
1998 }
1999
2000 // downloadToolsRaw downloads the supplied tools and returns the raw bytes.
2001-func downloadToolsRaw(c *C, t *state.Tools) []byte {
2002+func downloadToolsRaw(c *C, t *tools.Tools) []byte {
2003 log.Infof("dtr1")
2004 resp, err := http.Get(t.URL)
2005 c.Assert(err, IsNil)
2006
2007=== modified file 'tools/tools_test.go'
2008--- tools/tools_test.go 2013-07-07 20:23:30 +0000
2009+++ tools/tools_test.go 2013-07-09 05:06:28 +0000
2010@@ -7,32 +7,8 @@
2011 stdtesting "testing"
2012
2013 gc "launchpad.net/gocheck"
2014-
2015- "launchpad.net/juju-core/state"
2016- coretesting "launchpad.net/juju-core/testing"
2017- "launchpad.net/juju-core/tools"
2018 )
2019
2020 func TestPackage(t *stdtesting.T) {
2021 gc.TestingT(t)
2022 }
2023-
2024-var _ = gc.Suite(&ToolsSuite{})
2025-
2026-type ToolsSuite struct {
2027- coretesting.LoggingSuite
2028-}
2029-
2030-func (s *ToolsSuite) TestToolsMatchStateTools(c *gc.C) {
2031- testtools := tools.Tools{}
2032- statetools := state.Tools(testtools)
2033- testtools2 := tools.Tools(statetools)
2034- c.Assert(testtools, gc.Equals, testtools2)
2035-}
2036-
2037-func (s *ToolsSuite) TestToolPointers(c *gc.C) {
2038- testtools := &tools.Tools{}
2039- statetools := (*state.Tools)(testtools)
2040- testtools2 := (*tools.Tools)(statetools)
2041- c.Assert(testtools, gc.Equals, testtools2)
2042-}
2043
2044=== modified file 'worker/deployer/simple.go'
2045--- worker/deployer/simple.go 2013-07-08 17:11:44 +0000
2046+++ worker/deployer/simple.go 2013-07-09 05:06:28 +0000
2047@@ -15,6 +15,7 @@
2048 "launchpad.net/juju-core/log/syslog"
2049 "launchpad.net/juju-core/state"
2050 "launchpad.net/juju-core/state/api"
2051+ "launchpad.net/juju-core/tools"
2052 "launchpad.net/juju-core/upstart"
2053 "launchpad.net/juju-core/version"
2054 )
2055@@ -81,8 +82,8 @@
2056
2057 // Link the current tools for use by the new agent.
2058 tag := state.UnitTag(unitName)
2059- _, err = agent.ChangeAgentTools(ctx.dataDir, tag, version.Current)
2060- toolsDir := agent.ToolsDir(ctx.dataDir, tag)
2061+ _, err = tools.ChangeAgentTools(ctx.dataDir, tag, version.Current)
2062+ toolsDir := tools.ToolsDir(ctx.dataDir, tag)
2063 defer removeOnErr(&err, toolsDir)
2064
2065 // Retrieve addresses from state.
2066@@ -172,7 +173,7 @@
2067 return err
2068 }
2069 tag := state.UnitTag(unitName)
2070- agentDir := agent.Dir(ctx.dataDir, tag)
2071+ agentDir := tools.Dir(ctx.dataDir, tag)
2072 if err := os.RemoveAll(agentDir); err != nil {
2073 return err
2074 }
2075@@ -185,7 +186,7 @@
2076 logger.Warningf("installer: cannot restart syslog daemon: %v", err)
2077 }
2078 }()
2079- toolsDir := agent.ToolsDir(ctx.dataDir, tag)
2080+ toolsDir := tools.ToolsDir(ctx.dataDir, tag)
2081 return os.Remove(toolsDir)
2082 }
2083
2084
2085=== modified file 'worker/deployer/simple_test.go'
2086--- worker/deployer/simple_test.go 2013-07-01 12:38:51 +0000
2087+++ worker/deployer/simple_test.go 2013-07-09 05:06:28 +0000
2088@@ -17,6 +17,7 @@
2089 "launchpad.net/juju-core/state"
2090 "launchpad.net/juju-core/state/api"
2091 "launchpad.net/juju-core/testing/checkers"
2092+ "launchpad.net/juju-core/tools"
2093 "launchpad.net/juju-core/version"
2094 "launchpad.net/juju-core/worker/deployer"
2095 )
2096@@ -142,7 +143,7 @@
2097 fix.initDir = c.MkDir()
2098 fix.logDir = c.MkDir()
2099 fix.syslogConfigDir = c.MkDir()
2100- toolsDir := agent.SharedToolsDir(fix.dataDir, version.Current)
2101+ toolsDir := tools.SharedToolsDir(fix.dataDir, version.Current)
2102 err := os.MkdirAll(toolsDir, 0755)
2103 c.Assert(err, IsNil)
2104 jujudPath := filepath.Join(toolsDir, "jujud")
2105@@ -184,8 +185,8 @@
2106 func (fix *SimpleToolsFixture) paths(tag string) (confPath, agentDir, toolsDir, syslogConfPath string) {
2107 confName := fmt.Sprintf("jujud-%s.conf", tag)
2108 confPath = filepath.Join(fix.initDir, confName)
2109- agentDir = agent.Dir(fix.dataDir, tag)
2110- toolsDir = agent.ToolsDir(fix.dataDir, tag)
2111+ agentDir = tools.Dir(fix.dataDir, tag)
2112+ toolsDir = tools.ToolsDir(fix.dataDir, tag)
2113 syslogConfPath = filepath.Join(fix.syslogConfigDir, fmt.Sprintf("26-juju-%s.conf", tag))
2114 return
2115 }
2116
2117=== modified file 'worker/provisioner/lxc-broker.go'
2118--- worker/provisioner/lxc-broker.go 2013-06-27 04:48:10 +0000
2119+++ worker/provisioner/lxc-broker.go 2013-07-09 05:06:28 +0000
2120@@ -10,6 +10,7 @@
2121 "launchpad.net/juju-core/instance"
2122 "launchpad.net/juju-core/state"
2123 "launchpad.net/juju-core/state/api"
2124+ "launchpad.net/juju-core/tools"
2125 "launchpad.net/loggo"
2126 )
2127
2128@@ -17,7 +18,7 @@
2129
2130 var _ Broker = (*lxcBroker)(nil)
2131
2132-func NewLxcBroker(config *config.Config, tools *state.Tools) Broker {
2133+func NewLxcBroker(config *config.Config, tools *tools.Tools) Broker {
2134 return &lxcBroker{
2135 manager: lxc.NewContainerManager("juju"),
2136 config: config,
2137@@ -28,7 +29,7 @@
2138 type lxcBroker struct {
2139 manager lxc.ContainerManager
2140 config *config.Config
2141- tools *state.Tools
2142+ tools *tools.Tools
2143 }
2144
2145 func (broker *lxcBroker) StartInstance(machineId, machineNonce string, series string, cons constraints.Value, info *state.Info, apiInfo *api.Info) (instance.Instance, *instance.HardwareCharacteristics, error) {
2146
2147=== modified file 'worker/provisioner/lxc-broker_test.go'
2148--- worker/provisioner/lxc-broker_test.go 2013-07-01 01:09:16 +0000
2149+++ worker/provisioner/lxc-broker_test.go 2013-07-09 05:06:28 +0000
2150@@ -14,13 +14,13 @@
2151 "launchpad.net/juju-core/constraints"
2152 "launchpad.net/juju-core/container/lxc"
2153 "launchpad.net/juju-core/container/lxc/mock"
2154- "launchpad.net/juju-core/environs/agent"
2155 "launchpad.net/juju-core/environs/config"
2156 "launchpad.net/juju-core/instance"
2157 jujutesting "launchpad.net/juju-core/juju/testing"
2158 "launchpad.net/juju-core/state"
2159 "launchpad.net/juju-core/testing"
2160 . "launchpad.net/juju-core/testing/checkers"
2161+ "launchpad.net/juju-core/tools"
2162 "launchpad.net/juju-core/version"
2163 "launchpad.net/juju-core/worker/provisioner"
2164 )
2165@@ -68,7 +68,7 @@
2166
2167 func (s *lxcBrokerSuite) SetUpTest(c *C) {
2168 s.lxcSuite.SetUpTest(c)
2169- tools := &state.Tools{
2170+ tools := &tools.Tools{
2171 Binary: version.MustParseBinary("2.3.4-foo-bar"),
2172 URL: "http://tools.example.com/2.3.4-foo-bar.tgz",
2173 }
2174@@ -159,7 +159,7 @@
2175 s.CommonProvisionerSuite.SetUpTest(c)
2176 s.lxcSuite.SetUpTest(c)
2177 // Write the tools file.
2178- toolsDir := agent.SharedToolsDir(s.DataDir(), version.Current)
2179+ toolsDir := tools.SharedToolsDir(s.DataDir(), version.Current)
2180 c.Assert(os.MkdirAll(toolsDir, 0755), IsNil)
2181 urlPath := filepath.Join(toolsDir, "downloaded-url.txt")
2182 err := ioutil.WriteFile(urlPath, []byte("http://example.com/tools"), 0644)
2183
2184=== modified file 'worker/provisioner/provisioner.go'
2185--- worker/provisioner/provisioner.go 2013-07-01 01:09:16 +0000
2186+++ worker/provisioner/provisioner.go 2013-07-09 05:06:28 +0000
2187@@ -8,11 +8,11 @@
2188 "sync"
2189
2190 "launchpad.net/juju-core/environs"
2191- "launchpad.net/juju-core/environs/agent"
2192 "launchpad.net/juju-core/environs/config"
2193 "launchpad.net/juju-core/instance"
2194 "launchpad.net/juju-core/state"
2195 "launchpad.net/juju-core/state/watcher"
2196+ "launchpad.net/juju-core/tools"
2197 "launchpad.net/juju-core/version"
2198 "launchpad.net/juju-core/worker"
2199 "launchpad.net/loggo"
2200@@ -175,8 +175,8 @@
2201 return nil, fmt.Errorf("unknown provisioner type")
2202 }
2203
2204-func (p *Provisioner) getAgentTools() (*state.Tools, error) {
2205- tools, err := agent.ReadTools(p.dataDir, version.Current)
2206+func (p *Provisioner) getAgentTools() (*tools.Tools, error) {
2207+ tools, err := tools.ReadTools(p.dataDir, version.Current)
2208 if err != nil {
2209 logger.Errorf("cannot read agent tools from %q", p.dataDir)
2210 return nil, err
2211
2212=== modified file 'worker/uniter/tools_test.go'
2213--- worker/uniter/tools_test.go 2013-05-02 15:55:42 +0000
2214+++ worker/uniter/tools_test.go 2013-07-09 05:06:28 +0000
2215@@ -6,7 +6,7 @@
2216 import (
2217 "io/ioutil"
2218 . "launchpad.net/gocheck"
2219- "launchpad.net/juju-core/environs/agent"
2220+ "launchpad.net/juju-core/tools"
2221 "launchpad.net/juju-core/version"
2222 "launchpad.net/juju-core/worker/uniter"
2223 "launchpad.net/juju-core/worker/uniter/jujuc"
2224@@ -23,10 +23,10 @@
2225
2226 func (s *ToolsSuite) SetUpTest(c *C) {
2227 s.dataDir = c.MkDir()
2228- s.toolsDir = agent.SharedToolsDir(s.dataDir, version.Current)
2229+ s.toolsDir = tools.SharedToolsDir(s.dataDir, version.Current)
2230 err := os.MkdirAll(s.toolsDir, 0755)
2231 c.Assert(err, IsNil)
2232- err = os.Symlink(s.toolsDir, agent.ToolsDir(s.dataDir, "unit-u-123"))
2233+ err = os.Symlink(s.toolsDir, tools.ToolsDir(s.dataDir, "unit-u-123"))
2234 c.Assert(err, IsNil)
2235 }
2236
2237
2238=== modified file 'worker/uniter/uniter.go'
2239--- worker/uniter/uniter.go 2013-05-31 08:33:34 +0000
2240+++ worker/uniter/uniter.go 2013-07-09 05:06:28 +0000
2241@@ -6,26 +6,28 @@
2242 import (
2243 stderrors "errors"
2244 "fmt"
2245+ "math/rand"
2246+ "os"
2247+ "path/filepath"
2248+ "strings"
2249+ "time"
2250+
2251+ "launchpad.net/tomb"
2252+
2253 corecharm "launchpad.net/juju-core/charm"
2254 "launchpad.net/juju-core/charm/hooks"
2255 "launchpad.net/juju-core/cmd"
2256- "launchpad.net/juju-core/environs/agent"
2257 "launchpad.net/juju-core/errors"
2258 "launchpad.net/juju-core/log"
2259 "launchpad.net/juju-core/state"
2260 "launchpad.net/juju-core/state/watcher"
2261+ "launchpad.net/juju-core/tools"
2262 "launchpad.net/juju-core/utils"
2263 "launchpad.net/juju-core/utils/fslock"
2264 "launchpad.net/juju-core/worker/uniter/charm"
2265 "launchpad.net/juju-core/worker/uniter/hook"
2266 "launchpad.net/juju-core/worker/uniter/jujuc"
2267 "launchpad.net/juju-core/worker/uniter/relation"
2268- "launchpad.net/tomb"
2269- "math/rand"
2270- "os"
2271- "path/filepath"
2272- "strings"
2273- "time"
2274 )
2275
2276 // Uniter implements the capabilities of the unit agent. It is not intended to
2277@@ -139,7 +141,7 @@
2278 return err
2279 }
2280 ename := u.unit.Tag()
2281- u.toolsDir = agent.ToolsDir(u.dataDir, ename)
2282+ u.toolsDir = tools.ToolsDir(u.dataDir, ename)
2283 if err := EnsureJujucSymlinks(u.toolsDir); err != nil {
2284 return err
2285 }
2286
2287=== modified file 'worker/uniter/uniter_test.go'
2288--- worker/uniter/uniter_test.go 2013-06-28 12:26:09 +0000
2289+++ worker/uniter/uniter_test.go 2013-07-09 05:06:28 +0000
2290@@ -13,7 +13,6 @@
2291 . "launchpad.net/gocheck"
2292 "launchpad.net/goyaml"
2293 "launchpad.net/juju-core/charm"
2294- "launchpad.net/juju-core/environs/agent"
2295 "launchpad.net/juju-core/environs/config"
2296 "launchpad.net/juju-core/errors"
2297 "launchpad.net/juju-core/juju/testing"
2298@@ -21,6 +20,7 @@
2299 "launchpad.net/juju-core/state/api/params"
2300 coretesting "launchpad.net/juju-core/testing"
2301 "launchpad.net/juju-core/testing/checkers"
2302+ "launchpad.net/juju-core/tools"
2303 "launchpad.net/juju-core/utils/fslock"
2304 "launchpad.net/juju-core/worker"
2305 "launchpad.net/juju-core/worker/uniter"
2306@@ -60,7 +60,7 @@
2307 s.JujuConnSuite.SetUpSuite(c)
2308 s.HTTPSuite.SetUpSuite(c)
2309 s.dataDir = c.MkDir()
2310- toolsDir := agent.ToolsDir(s.dataDir, "unit-u-0")
2311+ toolsDir := tools.ToolsDir(s.dataDir, "unit-u-0")
2312 err := os.MkdirAll(toolsDir, 0755)
2313 c.Assert(err, IsNil)
2314 cmd := exec.Command("go", "build", "launchpad.net/juju-core/cmd/jujud")

Subscribers

People subscribed via source and target branches

to status/vote changes: