OLD | NEW |
1 // Copyright 2012, 2013 Canonical Ltd. | 1 // Copyright 2012, 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package main | 4 package main |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 "io/ioutil" | 8 "io/ioutil" |
9 "path/filepath" | 9 "path/filepath" |
10 "time" | 10 "time" |
11 | 11 |
12 . "launchpad.net/gocheck" | 12 . "launchpad.net/gocheck" |
13 | 13 |
14 » "launchpad.net/juju-core/agent" | 14 » "launchpad.net/juju-core/agent/tools" |
15 "launchpad.net/juju-core/environs/dummy" | 15 "launchpad.net/juju-core/environs/dummy" |
16 envtesting "launchpad.net/juju-core/environs/testing" | 16 envtesting "launchpad.net/juju-core/environs/testing" |
17 "launchpad.net/juju-core/environs/tools" | |
18 "launchpad.net/juju-core/state" | 17 "launchpad.net/juju-core/state" |
19 coretesting "launchpad.net/juju-core/testing" | 18 coretesting "launchpad.net/juju-core/testing" |
20 "launchpad.net/juju-core/version" | 19 "launchpad.net/juju-core/version" |
21 "launchpad.net/juju-core/worker" | 20 "launchpad.net/juju-core/worker" |
22 ) | 21 ) |
23 | 22 |
24 var _ = Suite(&UpgraderSuite{}) | 23 var _ = Suite(&UpgraderSuite{}) |
25 | 24 |
26 type UpgraderSuite struct { | 25 type UpgraderSuite struct { |
27 oldVersion version.Binary | 26 oldVersion version.Binary |
28 agentSuite | 27 agentSuite |
29 } | 28 } |
30 | 29 |
31 func (s *UpgraderSuite) SetUpTest(c *C) { | 30 func (s *UpgraderSuite) SetUpTest(c *C) { |
32 s.JujuConnSuite.SetUpTest(c) | 31 s.JujuConnSuite.SetUpTest(c) |
33 s.oldVersion = version.Current | 32 s.oldVersion = version.Current |
34 } | 33 } |
35 | 34 |
36 func (s *UpgraderSuite) TearDownTest(c *C) { | 35 func (s *UpgraderSuite) TearDownTest(c *C) { |
37 version.Current = s.oldVersion | 36 version.Current = s.oldVersion |
38 s.JujuConnSuite.TearDownTest(c) | 37 s.JujuConnSuite.TearDownTest(c) |
39 } | 38 } |
40 | 39 |
41 func (s *UpgraderSuite) TestUpgraderStop(c *C) { | 40 func (s *UpgraderSuite) TestUpgraderStop(c *C) { |
42 » u := s.startUpgrader(c, &state.Tools{Binary: version.Current}) | 41 » u := s.startUpgrader(c, &tools.Tools{Binary: version.Current}) |
43 err := u.Stop() | 42 err := u.Stop() |
44 c.Assert(err, IsNil) | 43 c.Assert(err, IsNil) |
45 } | 44 } |
46 | 45 |
47 var _ worker.Worker = (*Upgrader)(nil) | 46 var _ worker.Worker = (*Upgrader)(nil) |
48 | 47 |
49 var ( | 48 var ( |
50 v200 = version.MustParse("2.0.0") | 49 v200 = version.MustParse("2.0.0") |
51 t200p64 = version.MustParseBinary("2.0.0-precise-amd64") | 50 t200p64 = version.MustParseBinary("2.0.0-precise-amd64") |
52 t200p32 = version.MustParseBinary("2.0.0-precise-i386") | 51 t200p32 = version.MustParseBinary("2.0.0-precise-i386") |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 }} | 130 }} |
132 | 131 |
133 func (s *UpgraderSuite) TestUpgrader(c *C) { | 132 func (s *UpgraderSuite) TestUpgrader(c *C) { |
134 for i, test := range upgraderTests { | 133 for i, test := range upgraderTests { |
135 c.Logf("\ntest %d: %s", i, test.about) | 134 c.Logf("\ntest %d: %s", i, test.about) |
136 // Note: primeTools sets version.Current... | 135 // Note: primeTools sets version.Current... |
137 currentTools := s.primeTools(c, test.current) | 136 currentTools := s.primeTools(c, test.current) |
138 // ...but it also puts tools in storage we don't need, which is
why we | 137 // ...but it also puts tools in storage we don't need, which is
why we |
139 // don't clean up garbage from earlier runs first. | 138 // don't clean up garbage from earlier runs first. |
140 envtesting.RemoveAllTools(c, s.Conn.Environ) | 139 envtesting.RemoveAllTools(c, s.Conn.Environ) |
141 » » uploaded := make(map[version.Binary]*state.Tools) | 140 » » uploaded := make(map[version.Binary]*tools.Tools) |
142 for _, vers := range test.available { | 141 for _, vers := range test.available { |
143 tools := s.uploadTools(c, vers) | 142 tools := s.uploadTools(c, vers) |
144 uploaded[vers] = tools | 143 uploaded[vers] = tools |
145 } | 144 } |
146 | 145 |
147 func() { | 146 func() { |
148 u := s.startUpgrader(c, currentTools) | 147 u := s.startUpgrader(c, currentTools) |
149 defer u.Stop() | 148 defer u.Stop() |
150 s.proposeVersion(c, test.propose) | 149 s.proposeVersion(c, test.propose) |
151 s.State.StartSync() | 150 s.State.StartSync() |
152 if test.upgrade.Number == version.Zero { | 151 if test.upgrade.Number == version.Zero { |
153 assertNothingHappens(c, u) | 152 assertNothingHappens(c, u) |
154 c.Assert(u.Stop(), IsNil) | 153 c.Assert(u.Stop(), IsNil) |
155 return | 154 return |
156 } | 155 } |
157 | 156 |
158 ug := waitDeath(c, u) | 157 ug := waitDeath(c, u) |
159 » » » tools := uploaded[test.upgrade] | 158 » » » newTools := uploaded[test.upgrade] |
160 » » » c.Check(ug.NewTools, DeepEquals, tools) | 159 » » » c.Check(ug.NewTools, DeepEquals, newTools) |
161 c.Check(ug.OldTools.Binary, Equals, version.Current) | 160 c.Check(ug.OldTools.Binary, Equals, version.Current) |
162 c.Check(ug.DataDir, Equals, s.DataDir()) | 161 c.Check(ug.DataDir, Equals, s.DataDir()) |
163 c.Check(ug.AgentName, Equals, "testagent") | 162 c.Check(ug.AgentName, Equals, "testagent") |
164 | 163 |
165 // Check that the upgraded version was really downloaded
. | 164 // Check that the upgraded version was really downloaded
. |
166 » » » path := agent.SharedToolsDir(s.DataDir(), tools.Binary) | 165 » » » path := tools.SharedToolsDir(s.DataDir(), newTools.Binar
y) |
167 data, err := ioutil.ReadFile(filepath.Join(path, "jujud"
)) | 166 data, err := ioutil.ReadFile(filepath.Join(path, "jujud"
)) |
168 c.Check(err, IsNil) | 167 c.Check(err, IsNil) |
169 » » » c.Check(string(data), Equals, "jujud contents "+tools.Bi
nary.String()) | 168 » » » c.Check(string(data), Equals, "jujud contents "+newTools
.Binary.String()) |
170 }() | 169 }() |
171 } | 170 } |
172 } | 171 } |
173 | 172 |
174 func (s *UpgraderSuite) TestStillWorksAfterBadVersions(c *C) { | 173 func (s *UpgraderSuite) TestStillWorksAfterBadVersions(c *C) { |
175 currentTools := s.primeTools(c, t200p64) | 174 currentTools := s.primeTools(c, t200p64) |
176 envtesting.RemoveAllTools(c, s.Conn.Environ) | 175 envtesting.RemoveAllTools(c, s.Conn.Environ) |
177 u := s.startUpgrader(c, currentTools) | 176 u := s.startUpgrader(c, currentTools) |
178 defer u.Stop() | 177 defer u.Stop() |
179 | 178 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 func (s *UpgraderSuite) removeVersion(c *C, vers version.Binary) { | 272 func (s *UpgraderSuite) removeVersion(c *C, vers version.Binary) { |
274 name := tools.StorageName(vers) | 273 name := tools.StorageName(vers) |
275 err := s.Conn.Environ.Storage().Remove(name) | 274 err := s.Conn.Environ.Storage().Remove(name) |
276 c.Assert(err, IsNil) | 275 c.Assert(err, IsNil) |
277 } | 276 } |
278 | 277 |
279 func (s *UpgraderSuite) TestUpgraderReadyErrorUpgrade(c *C) { | 278 func (s *UpgraderSuite) TestUpgraderReadyErrorUpgrade(c *C) { |
280 currentTools := s.primeTools(c, version.MustParseBinary("2.0.2-foo-bar")
) | 279 currentTools := s.primeTools(c, version.MustParseBinary("2.0.2-foo-bar")
) |
281 ug := &UpgradeReadyError{ | 280 ug := &UpgradeReadyError{ |
282 AgentName: "foo", | 281 AgentName: "foo", |
283 » » OldTools: &state.Tools{Binary: version.MustParseBinary("2.0.0-f
oo-bar")}, | 282 » » OldTools: &tools.Tools{Binary: version.MustParseBinary("2.0.0-f
oo-bar")}, |
284 NewTools: currentTools, | 283 NewTools: currentTools, |
285 DataDir: s.DataDir(), | 284 DataDir: s.DataDir(), |
286 } | 285 } |
287 err := ug.ChangeAgentTools() | 286 err := ug.ChangeAgentTools() |
288 c.Assert(err, IsNil) | 287 c.Assert(err, IsNil) |
289 » d := agent.ToolsDir(s.DataDir(), "foo") | 288 » d := tools.ToolsDir(s.DataDir(), "foo") |
290 data, err := ioutil.ReadFile(filepath.Join(d, "jujud")) | 289 data, err := ioutil.ReadFile(filepath.Join(d, "jujud")) |
291 c.Assert(err, IsNil) | 290 c.Assert(err, IsNil) |
292 c.Assert(string(data), Equals, "jujud contents 2.0.2-foo-bar") | 291 c.Assert(string(data), Equals, "jujud contents 2.0.2-foo-bar") |
293 } | 292 } |
294 func assertNothingHappens(c *C, u *Upgrader) { | 293 func assertNothingHappens(c *C, u *Upgrader) { |
295 done := make(chan error, 1) | 294 done := make(chan error, 1) |
296 go func() { | 295 go func() { |
297 done <- u.Wait() | 296 done <- u.Wait() |
298 }() | 297 }() |
299 select { | 298 select { |
300 case got := <-done: | 299 case got := <-done: |
301 c.Fatalf("expected nothing to happen, got %#v", got) | 300 c.Fatalf("expected nothing to happen, got %#v", got) |
302 case <-time.After(coretesting.ShortWait): | 301 case <-time.After(coretesting.ShortWait): |
303 } | 302 } |
304 } | 303 } |
305 | 304 |
306 func assertEvent(c *C, event <-chan string, want string) { | 305 func assertEvent(c *C, event <-chan string, want string) { |
307 select { | 306 select { |
308 case got := <-event: | 307 case got := <-event: |
309 c.Assert(got, Equals, want) | 308 c.Assert(got, Equals, want) |
310 case <-time.After(coretesting.LongWait): | 309 case <-time.After(coretesting.LongWait): |
311 c.Fatalf("no event received; expected %q", want) | 310 c.Fatalf("no event received; expected %q", want) |
312 } | 311 } |
313 } | 312 } |
314 | 313 |
315 // startUpgrader starts the upgrader using the given machine, | 314 // startUpgrader starts the upgrader using the given machine, |
316 // expecting to see it set the given agent tools. | 315 // expecting to see it set the given agent tools. |
317 func (s *UpgraderSuite) startUpgrader(c *C, expectTools *state.Tools) *Upgrader
{ | 316 func (s *UpgraderSuite) startUpgrader(c *C, expectTools *tools.Tools) *Upgrader
{ |
318 » as := testAgentState(make(chan *state.Tools)) | 317 » as := testAgentState(make(chan *tools.Tools)) |
319 u := NewUpgrader(s.State, as, s.DataDir()) | 318 u := NewUpgrader(s.State, as, s.DataDir()) |
320 select { | 319 select { |
321 case tools := <-as: | 320 case tools := <-as: |
322 c.Assert(tools, DeepEquals, expectTools) | 321 c.Assert(tools, DeepEquals, expectTools) |
323 case <-time.After(coretesting.LongWait): | 322 case <-time.After(coretesting.LongWait): |
324 c.Fatalf("upgrader did not set agent tools") | 323 c.Fatalf("upgrader did not set agent tools") |
325 } | 324 } |
326 return u | 325 return u |
327 } | 326 } |
328 | 327 |
329 func waitDeath(c *C, u *Upgrader) *UpgradeReadyError { | 328 func waitDeath(c *C, u *Upgrader) *UpgradeReadyError { |
330 done := make(chan error, 1) | 329 done := make(chan error, 1) |
331 go func() { | 330 go func() { |
332 done <- u.Wait() | 331 done <- u.Wait() |
333 }() | 332 }() |
334 select { | 333 select { |
335 case err := <-done: | 334 case err := <-done: |
336 c.Assert(err, FitsTypeOf, &UpgradeReadyError{}) | 335 c.Assert(err, FitsTypeOf, &UpgradeReadyError{}) |
337 return err.(*UpgradeReadyError) | 336 return err.(*UpgradeReadyError) |
338 case <-time.After(coretesting.LongWait): | 337 case <-time.After(coretesting.LongWait): |
339 c.Fatalf("upgrader did not die as expected") | 338 c.Fatalf("upgrader did not die as expected") |
340 } | 339 } |
341 panic("unreachable") | 340 panic("unreachable") |
342 } | 341 } |
343 | 342 |
344 type testAgentState chan *state.Tools | 343 type testAgentState chan *tools.Tools |
345 | 344 |
346 func (as testAgentState) SetAgentTools(tools *state.Tools) error { | 345 func (as testAgentState) SetAgentTools(tools *tools.Tools) error { |
347 t := *tools | 346 t := *tools |
348 as <- &t | 347 as <- &t |
349 return nil | 348 return nil |
350 } | 349 } |
351 | 350 |
352 func (as testAgentState) Tag() string { | 351 func (as testAgentState) Tag() string { |
353 return "testagent" | 352 return "testagent" |
354 } | 353 } |
355 | 354 |
356 func (as testAgentState) Life() state.Life { | 355 func (as testAgentState) Life() state.Life { |
357 panic("unimplemented") | 356 panic("unimplemented") |
358 } | 357 } |
359 | 358 |
360 func (as testAgentState) SetMongoPassword(string) error { | 359 func (as testAgentState) SetMongoPassword(string) error { |
361 panic("unimplemented") | 360 panic("unimplemented") |
362 } | 361 } |
OLD | NEW |