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

Proposed by Tim Penhey
Status: Merged
Approved by: Tim Penhey
Approved revision: no longer in the source branch.
Merged at revision: 1526
Proposed branch: lp:~thumper/juju-core/agent-tools
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 2750 lines (+490/-417)
66 files modified
agent/agent.go (+3/-2)
agent/tools/build.go (+0/-4)
agent/tools/build_test.go (+1/-1)
agent/tools/diskmanager.go (+3/-5)
agent/tools/diskmanager_test.go (+10/-10)
agent/tools/list.go (+8/-9)
agent/tools/list_test.go (+22/-27)
agent/tools/marshal.go (+40/-0)
agent/tools/marshal_test.go (+57/-0)
agent/tools/package_test.go (+14/-0)
agent/tools/storage.go (+4/-5)
agent/tools/storage_test.go (+11/-14)
agent/tools/tools.go (+5/-1)
agent/tools/tools_test.go (+71/-62)
agent/tools/toolsdir.go (+8/-9)
agent/tools_compat_test.go (+0/-35)
cmd/juju/bootstrap_test.go (+1/-1)
cmd/juju/status.go (+5/-2)
cmd/juju/status_test.go (+3/-2)
cmd/juju/synctools.go (+5/-6)
cmd/juju/synctools_test.go (+1/-1)
cmd/juju/upgradejuju.go (+1/-1)
cmd/juju/upgradejuju_test.go (+5/-4)
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/azure/customdata_test.go (+2/-1)
environs/azure/environ.go (+1/-1)
environs/cloudinit/cloudinit.go (+4/-3)
environs/cloudinit/cloudinit_test.go (+8/-5)
environs/cloudinit_test.go (+2/-1)
environs/ec2/ec2.go (+1/-1)
environs/jujutest/livetests.go (+5/-5)
environs/local/environ.go (+7/-6)
environs/maas/environ.go (+2/-2)
environs/maas/environ_test.go (+1/-1)
environs/openstack/export_test.go (+1/-1)
environs/openstack/provider.go (+1/-1)
environs/testing/storage.go (+1/-1)
environs/testing/tools.go (+8/-7)
environs/tools.go (+2/-3)
environs/tools_test.go (+3/-4)
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)
testing/imports.go (+42/-0)
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 (+2/-2)
worker/uniter/uniter_test.go (+2/-2)
To merge this branch: bzr merge lp:~thumper/juju-core/agent-tools
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+176111@code.launchpad.net

Commit message

Make agent/tools and remove state.Tools

This branch makes an agent/tools package that is all things tools.
The environs/tools package is merged in there. There is a test
to ensure that we don't bring in extra package dependencies to
tools, right now just "utils/set" and "version".

https://codereview.appspot.com/11561044/

Description of the change

Make agent/tools and remove state.Tools

This branch makes an agent/tools package that is all things tools.
The environs/tools package is merged in there. There is a test
to ensure that we don't bring in extra package dependencies to
tools, right now just "utils/set" and "version".

https://codereview.appspot.com/11561044/

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

Reviewers: mp+176111_code.launchpad.net,

Message:
Please take a look.

Description:
Make agent/tools and remove state.Tools

This branch makes an agent/tools package that is all things tools.
The environs/tools package is merged in there. There is a test
to ensure that we don't bring in extra package dependencies to
tools, right now just "utils/set" and "version".

https://code.launchpad.net/~thumper/juju-core/agent-tools/+merge/176111

(do not edit description out of merge proposal)

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

Affected files:
   A [revision details]
   M agent/agent.go
   M agent/tools/build.go
   M agent/tools/build_test.go
   M agent/tools/diskmanager.go
   M agent/tools/diskmanager_test.go
   M agent/tools/export_test.go
   M agent/tools/list.go
   M agent/tools/list_test.go
   A agent/tools/marshal.go
   A agent/tools/marshal_test.go
   A agent/tools/package_test.go
   M agent/tools/storage.go
   M agent/tools/storage_test.go
   M agent/tools/tools.go
   M agent/tools/tools_test.go
   M agent/tools/toolsdir.go
   D agent/tools_compat_test.go
   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/azure/customdata_test.go
   M environs/azure/environ.go
   M environs/cloudinit/cloudinit.go
   M environs/cloudinit/cloudinit_test.go
   M environs/cloudinit_test.go
   M environs/ec2/ec2.go
   M environs/jujutest/livetests.go
   M environs/local/environ.go
   M environs/maas/environ.go
   M environs/maas/environ_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
   A testing/imports.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
Ian Booth (wallyworld) wrote :

LGTM

https://codereview.appspot.com/11561044/diff/1/agent/tools/storage.go
File agent/tools/storage.go (right):

https://codereview.appspot.com/11561044/diff/1/agent/tools/storage.go#newcode84
agent/tools/storage.go:84: // environs.Storage; it exists to avoid a
dependency on environs.
Perhaps this is no longer relevant with the refactoring?

https://codereview.appspot.com/11561044/

Revision history for this message
Tim Penhey (thumper) wrote :

https://codereview.appspot.com/11561044/diff/1/agent/tools/storage.go
File agent/tools/storage.go (right):

https://codereview.appspot.com/11561044/diff/1/agent/tools/storage.go#newcode84
agent/tools/storage.go:84: // environs.Storage; it exists to avoid a
dependency on environs.
On 2013/07/22 04:52:03, wallyworld wrote:
> Perhaps this is no longer relevant with the refactoring?

It is still valid. We don't want to bring in the environs package as a
dependency.

https://codereview.appspot.com/11561044/

Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

LGTM — of course I can't comment on the actual change, because my brain
stopped working after a thousand lines of collateral damage. This may
be a fun language for re-inventing wheels in, but it's not good for
engineering.

As discussed on IRC, the test against new dependencies needs commenting
because adding a dependency _can_ be a bug but in general is merely
undesirable.

The loop in FindJujuCoreImports is an abomination. Is there some better
way of phrasing this? I realize Go forces your hand to some extent, but
there must be *something* less like assembly language. For penance,
re-read Goto Considered Harmful.

https://codereview.appspot.com/11561044/

Revision history for this message
Go Bot (go-bot) wrote :

There are additional revisions which have not been approved in review. Please seek review and approval of these new revisions.

Revision history for this message
Roger Peppe (rogpeppe) wrote :

LGTM with some suggestions below.

I think this is a good example of how we can
refactor without fear given a statically typed
language.

https://codereview.appspot.com/11561044/diff/1/agent/tools/diskmanager.go
File agent/tools/diskmanager.go (right):

https://codereview.appspot.com/11561044/diff/1/agent/tools/diskmanager.go#newcode29
agent/tools/diskmanager.go:29: return UnpackTools(d.dataDir, tools, r)
nice change

https://codereview.appspot.com/11561044/diff/1/agent/tools/list_test.go
File agent/tools/list_test.go (right):

https://codereview.appspot.com/11561044/diff/1/agent/tools/list_test.go#newcode7
agent/tools/list_test.go:7: gc "launchpad.net/gocheck"
in this already huge CL, it would perhaps be nice to keep unnecessary
changes to a minimum, though I appreciate these are fairly automatic.

https://codereview.appspot.com/11561044/diff/1/agent/tools/tools_test.go
File agent/tools/tools_test.go (right):

https://codereview.appspot.com/11561044/diff/1/agent/tools/tools_test.go#newcode13
agent/tools/tools_test.go:13: gc "launchpad.net/gocheck"
again, it would be nice to restrict changes to those directly relevant
to this CL.

https://codereview.appspot.com/11561044/diff/1/testing/imports.go
File testing/imports.go (right):

https://codereview.appspot.com/11561044/diff/1/testing/imports.go#newcode16
testing/imports.go:16: // imported by the packageName parameter. The
resulting list removes the
// imported by the package with the given name.
?

https://codereview.appspot.com/11561044/diff/1/testing/imports.go#newcode19
testing/imports.go:19: var imports []string
i don't think you need to traverse SrcDirs manually.

i think you probably want something like the following:

pkg, err := build.Import(packageName)
if err != nil {
    c.Fatalf("cannot import %q: %v", packageName, err)
}
[...]
for _, name := range pkg.Imports {
[...]

https://codereview.appspot.com/11561044/diff/1/testing/imports.go#newcode31
testing/imports.go:31: c.Logf(packageName + " not found")
probably c.Fatalf, but no need if you make the change above.

https://codereview.appspot.com/11561044/

Preview Diff

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

Subscribers

People subscribed via source and target branches

to status/vote changes: