Merge lp:~thumper/juju-core/agent-tools into lp:~go-bot/juju-core/trunk
- agent-tools
- Merge into trunk
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 |
Related bugs: |
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".
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".
Tim Penhey (thumper) wrote : | # |
Ian Booth (wallyworld) wrote : | # |
LGTM
https:/
File agent/tools/
https:/
agent/tools/
dependency on environs.
Perhaps this is no longer relevant with the refactoring?
Tim Penhey (thumper) wrote : | # |
https:/
File agent/tools/
https:/
agent/tools/
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.
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.
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.
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:/
File agent/tools/
https:/
agent/tools/
nice change
https:/
File agent/tools/
https:/
agent/tools/
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:/
File agent/tools/
https:/
agent/tools/
again, it would be nice to restrict changes to those directly relevant
to this CL.
https:/
File testing/imports.go (right):
https:/
testing/
resulting list removes the
// imported by the package with the given name.
?
https:/
testing/
i don't think you need to traverse SrcDirs manually.
i think you probably want something like the following:
pkg, err := build.Import(
if err != nil {
c.Fatalf(
}
[...]
for _, name := range pkg.Imports {
[...]
https:/
testing/
probably c.Fatalf, but no need if you make the change above.
Preview Diff
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") |
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: build.go build_test. go diskmanager. go diskmanager_ test.go export_ test.go list_test. go marshal. go marshal_ test.go package_ test.go storage. go storage_ test.go tools.go tools_test. go toolsdir. go compat_ test.go bootstrap_ test.go status_ test.go synctools. go synctools_ test.go upgradejuju. go upgradejuju_ test.go agent_test. go machine_ test.go unit_test. go upgrade. go upgrade_ test.go lxc/lxc. go lxc/lxc_ test.go azure/customdat a_test. go azure/environ. go cloudinit/ cloudinit. go cloudinit/ cloudinit_ test.go cloudinit_ test.go jujutest/ livetests. go local/environ. go maas/environ. go maas/environ_ test.go openstack/ export_ test.go openstack/ provider. go testing/ storage. go testing/ tools.go tools_test. go params/ internal. go upgrader/ upgrader_ test.go /upgrader/ upgrader. go /upgrader/ upgrader_ test.go test.go deployer/ simple. go deployer/ simple_ test.go provisioner/ lxc-broker. go provisioner/ lxc-broker_ test.go provisioner/ provisioner. go uniter/ tools_test. go uniter/ uniter. go uniter/ uniter_ test.go
A [revision details]
M agent/agent.go
M agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/list.go
M agent/tools/
A agent/tools/
A agent/tools/
A agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/
M agent/tools/
D agent/tools_
M cmd/juju/
M cmd/juju/status.go
M cmd/juju/
M cmd/juju/
M cmd/juju/
M cmd/juju/
M cmd/juju/
M cmd/jujud/agent.go
M cmd/jujud/
M cmd/jujud/
M cmd/jujud/
M cmd/jujud/
M cmd/jujud/
M container/
M container/
M environs/
M environs/
M environs/
M environs/
M environs/
M environs/ec2/ec2.go
M environs/
M environs/
M environs/
M environs/
M environs/
M environs/
M environs/
M environs/
M environs/tools.go
M environs/
M state/api/
M state/api/
M state/apiserver
M state/apiserver
M state/machine.go
M state/machine_
M state/state.go
M state/state_test.go
M state/tools_test.go
M state/unit.go
A testing/imports.go
M worker/
M worker/
M worker/
M worker/
M worker/
M worker/
M worker/
M worker/