Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(22)

Side by Side Diff: cmd/jujud/upgrade_test.go

Issue 11561044: Make agent/tools and remove state.Tools
Patch Set: Created 11 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b