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