Merge lp:~axwalk/juju-core/lp1306902-ha-upgrade-take2 into lp:~go-bot/juju-core/trunk

Proposed by Andrew Wilkins
Status: Merged
Approved by: Andrew Wilkins
Approved revision: no longer in the source branch.
Merged at revision: 2654
Proposed branch: lp:~axwalk/juju-core/lp1306902-ha-upgrade-take2
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 506 lines (+181/-94)
9 files modified
agent/format-1.18.go (+7/-4)
agent/mongo/mongo.go (+3/-6)
cmd/jujud/bootstrap.go (+4/-4)
cmd/jujud/machine.go (+126/-58)
cmd/jujud/machine_test.go (+18/-8)
worker/peergrouper/desired_test.go (+0/-6)
worker/peergrouper/initiate.go (+8/-8)
worker/peergrouper/initiate_test.go (+1/-0)
worker/peergrouper/suite_test.go (+14/-0)
To merge this branch: bzr merge lp:~axwalk/juju-core/lp1306902-ha-upgrade-take2
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+216245@code.launchpad.net

Commit message

HA: upgrade upstart and initiate replset

The machine agent will now upgrade the
Mongo upstart script and initiate the
replicaset when upgrading from a version
prior to 1.19.0.

Tested upgrading 1.18.1 to 1.19.1 with and
without HA enabled; tested straight bootstrap
to 1.19.1 with and without HA enabled.

(Supersedes https://codereview.appspot.com/88350043/)

https://codereview.appspot.com/88790043/

Description of the change

HA: upgrade upstart and initiate replset

The machine agent will now upgrade the
Mongo upstart script and initiate the
replicaset when upgrading from a version
prior to 1.19.0.

Tested upgrading 1.18.1 to 1.19.1 with and
without HA enabled; tested straight bootstrap
to 1.19.1 with and without HA enabled.

(Supersedes https://codereview.appspot.com/88350043/)

https://codereview.appspot.com/88790043/

To post a comment you must log in.
Revision history for this message
Andrew Wilkins (axwalk) wrote :

Reviewers: mp+216245_code.launchpad.net,

Message:
Please take a look.

Description:
HA: upgrade upstart and initiate replset

The machine agent will now upgrade the
Mongo upstart script and initiate the
replicaset when upgrading from a version
prior to 1.19.0.

Tested upgrading 1.18.1 to 1.19.1 with and
without HA enabled; tested straight bootstrap
to 1.19.1 with and without HA enabled.

(Supersedes https://codereview.appspot.com/88350043/)

https://code.launchpad.net/~axwalk/juju-core/lp1306902-ha-upgrade-take2/+merge/216245

(do not edit description out of merge proposal)

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

Affected files (+153, -66 lines):
   A [revision details]
   M agent/format-1.18.go
   M agent/mongo/mongo.go
   M cmd/jujud/bootstrap.go
   M cmd/jujud/machine.go
   M cmd/jujud/machine_test.go
   M worker/peergrouper/desired_test.go
   M worker/peergrouper/initiate.go
   M worker/peergrouper/initiate_test.go
   A worker/peergrouper/suite_test.go

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

LGTM with two minor suggestions.

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go
File cmd/jujud/machine.go (right):

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go#newcode438
cmd/jujud/machine.go:438: func (a *MachineAgent)
ensureMongoServer(agentConfig agent.Config) error {
can we put this after StateWorker, so functions read generally from
higher level to lower level?

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go#newcode468
cmd/jujud/machine.go:468: }
perhaps refresh agentConfig here?

(I actually think that ChangeConfig should probably always return the
new version of the agent configuration)

https://codereview.appspot.com/88790043/

Revision history for this message
Andrew Wilkins (axwalk) wrote :

Please take a look.

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go
File cmd/jujud/machine.go (right):

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go#newcode438
cmd/jujud/machine.go:438: func (a *MachineAgent)
ensureMongoServer(agentConfig agent.Config) error {
On 2014/04/17 18:20:23, rog wrote:
> can we put this after StateWorker, so functions read generally from
higher level
> to lower level?

Done.

https://codereview.appspot.com/88790043/diff/1/cmd/jujud/machine.go#newcode468
cmd/jujud/machine.go:468: }
On 2014/04/17 18:20:23, rog wrote:
> perhaps refresh agentConfig here?

> (I actually think that ChangeConfig should probably always return the
new
> version of the agent configuration)

Done.

https://codereview.appspot.com/88790043/

Revision history for this message
Andrew Wilkins (axwalk) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'agent/format-1.18.go'
--- agent/format-1.18.go 2014-04-11 17:51:58 +0000
+++ agent/format-1.18.go 2014-04-18 04:41:05 +0000
@@ -46,6 +46,7 @@
46 StateServerKey string `yaml:",omitempty"`46 StateServerKey string `yaml:",omitempty"`
47 APIPort int `yaml:",omitempty"`47 APIPort int `yaml:",omitempty"`
48 StatePort int `yaml:",omitempty"`48 StatePort int `yaml:",omitempty"`
49 SharedSecret string `yaml:",omitempty"`
49}50}
5051
51func init() {52func init() {
@@ -99,10 +100,11 @@
99 }100 }
100 if len(format.StateServerKey) != 0 {101 if len(format.StateServerKey) != 0 {
101 config.servingInfo = &params.StateServingInfo{102 config.servingInfo = &params.StateServingInfo{
102 Cert: format.StateServerCert,103 Cert: format.StateServerCert,
103 PrivateKey: format.StateServerKey,104 PrivateKey: format.StateServerKey,
104 APIPort: format.APIPort,105 APIPort: format.APIPort,
105 StatePort: format.StatePort,106 StatePort: format.StatePort,
107 SharedSecret: format.SharedSecret,
106 }108 }
107 // There's a private key, then we need the state port,109 // There's a private key, then we need the state port,
108 // which wasn't always in the 1.18 format. If it's not present110 // which wasn't always in the 1.18 format. If it's not present
@@ -144,6 +146,7 @@
144 format.StateServerKey = config.servingInfo.PrivateKey146 format.StateServerKey = config.servingInfo.PrivateKey
145 format.APIPort = config.servingInfo.APIPort147 format.APIPort = config.servingInfo.APIPort
146 format.StatePort = config.servingInfo.StatePort148 format.StatePort = config.servingInfo.StatePort
149 format.SharedSecret = config.servingInfo.SharedSecret
147 }150 }
148 if config.stateDetails != nil {151 if config.stateDetails != nil {
149 format.StateAddresses = config.stateDetails.addresses152 format.StateAddresses = config.stateDetails.addresses
150153
=== modified file 'agent/mongo/mongo.go'
--- agent/mongo/mongo.go 2014-04-17 12:33:55 +0000
+++ agent/mongo/mongo.go 2014-04-18 04:41:05 +0000
@@ -192,14 +192,11 @@
192 }192 }
193 logMongoVersion(mongoPath)193 logMongoVersion(mongoPath)
194194
195 // TODO(natefinch) 2014-04-12 https://launchpad.net/bugs/1306902195 if err := upstartServiceStop(&upstartConf.Service); err != nil {
196 // remove this once we support upgrading to HA196 return fmt.Errorf("failed to stop mongo: %v", err)
197 if upstartConf.Installed() {
198 return nil
199 }197 }
200
201 if err := makeJournalDirs(dbDir); err != nil {198 if err := makeJournalDirs(dbDir); err != nil {
202 return fmt.Errorf("Error creating journal directories: %v", err)199 return fmt.Errorf("error creating journal directories: %v", err)
203 }200 }
204 return upstartConfInstall(upstartConf)201 return upstartConfInstall(upstartConf)
205}202}
206203
=== modified file 'cmd/jujud/bootstrap.go'
--- cmd/jujud/bootstrap.go 2014-04-17 16:26:01 +0000
+++ cmd/jujud/bootstrap.go 2014-04-18 04:41:05 +0000
@@ -18,7 +18,6 @@
18 "launchpad.net/juju-core/environs"18 "launchpad.net/juju-core/environs"
19 "launchpad.net/juju-core/environs/config"19 "launchpad.net/juju-core/environs/config"
20 "launchpad.net/juju-core/instance"20 "launchpad.net/juju-core/instance"
21 "launchpad.net/juju-core/provider"
22 "launchpad.net/juju-core/state"21 "launchpad.net/juju-core/state"
23 "launchpad.net/juju-core/state/api/params"22 "launchpad.net/juju-core/state/api/params"
24 "launchpad.net/juju-core/worker/peergrouper"23 "launchpad.net/juju-core/worker/peergrouper"
@@ -171,14 +170,15 @@
171 dialInfo.Addrs = []string{170 dialInfo.Addrs = []string{
172 net.JoinHostPort("127.0.0.1", fmt.Sprint(servingInfo.StatePort)),171 net.JoinHostPort("127.0.0.1", fmt.Sprint(servingInfo.StatePort)),
173 }172 }
173
174 logger.Debugf("calling ensureMongoServer")174 logger.Debugf("calling ensureMongoServer")
175 providerType := agentConfig.Value(agent.ProviderType)175 withHA := shouldEnableHA(agentConfig)
176 withHA := providerType != provider.Local
177 err = ensureMongoServer(176 err = ensureMongoServer(
178 agentConfig.DataDir(),177 agentConfig.DataDir(),
179 agentConfig.Value(agent.Namespace),178 agentConfig.Value(agent.Namespace),
180 servingInfo,179 servingInfo,
181 withHA)180 withHA,
181 )
182 if err != nil {182 if err != nil {
183 return err183 return err
184 }184 }
185185
=== modified file 'cmd/jujud/machine.go'
--- cmd/jujud/machine.go 2014-04-17 17:30:48 +0000
+++ cmd/jujud/machine.go 2014-04-18 04:41:05 +0000
@@ -5,6 +5,7 @@
55
6import (6import (
7 "fmt"7 "fmt"
8 "net"
8 "os"9 "os"
9 "path/filepath"10 "path/filepath"
10 "runtime"11 "runtime"
@@ -397,76 +398,19 @@
397 return nil398 return nil
398}399}
399400
400func (a *MachineAgent) ensureMongoAdminUser(agentConfig agent.Config) (added bool, err error) {
401 stateInfo, ok1 := agentConfig.StateInfo()
402 servingInfo, ok2 := agentConfig.StateServingInfo()
403 if !ok1 || !ok2 {
404 return false, fmt.Errorf("no state serving info configuration")
405 }
406 dialInfo, err := state.DialInfo(stateInfo, state.DefaultDialOpts())
407 if err != nil {
408 return false, err
409 }
410 if len(dialInfo.Addrs) > 1 {
411 logger.Infof("more than one state server; admin user must exist")
412 return false, nil
413 }
414 return ensureMongoAdminUser(mongo.EnsureAdminUserParams{
415 DialInfo: dialInfo,
416 Namespace: agentConfig.Value(agent.Namespace),
417 DataDir: agentConfig.DataDir(),
418 Port: servingInfo.StatePort,
419 User: stateInfo.Tag,
420 Password: stateInfo.Password,
421 })
422}
423
424// StateJobs returns a worker running all the workers that require401// StateJobs returns a worker running all the workers that require
425// a *state.State connection.402// a *state.State connection.
426func (a *MachineAgent) StateWorker() (worker.Worker, error) {403func (a *MachineAgent) StateWorker() (worker.Worker, error) {
427 agentConfig := a.CurrentConfig()404 agentConfig := a.CurrentConfig()
428405 if err := a.ensureMongoServer(agentConfig); err != nil {
429 servingInfo, ok := agentConfig.StateServingInfo()
430 if !ok {
431 return nil, fmt.Errorf("state worker was started with no state serving info")
432 }
433 providerType := agentConfig.Value(agent.ProviderType)
434 namespace := agentConfig.Value(agent.Namespace)
435 withHA := providerType != provider.Local
436 err := ensureMongoServer(
437 agentConfig.DataDir(),
438 namespace,
439 servingInfo,
440 withHA,
441 )
442 if err != nil {
443 return nil, err406 return nil, err
444 }407 }
445
446 st, m, err := openState(agentConfig)408 st, m, err := openState(agentConfig)
447 if errors.IsUnauthorized(err) {
448 // TODO(axw) remove this when we no longer need
449 // to upgrade from pre-HA-capable environments.
450 logger.Debugf("failed to open state, reattempt after ensuring admin user exists: %v", err)
451 added, ensureErr := a.ensureMongoAdminUser(agentConfig)
452 if ensureErr != nil {
453 err = ensureErr
454 }
455 if !added {
456 // No user added, so it's probably a genuine unauthorized error.
457 return nil, err
458 }
459 st, m, err = openState(agentConfig)
460 }
461 if err != nil {409 if err != nil {
462 return nil, err410 return nil, err
463 }411 }
464 reportOpenedState(st)412 reportOpenedState(st)
465413
466 // TODO(rog) call maybeInitiateMongoServer to upgrade mongo
467 // from old environments. We'll need to acquire a non-localhost
468 // address for the current instance before we do.
469
470 singularStateConn := singularStateConn{st.MongoSession(), m}414 singularStateConn := singularStateConn{st.MongoSession(), m}
471 runner := newRunner(connectionIsFatal(st), moreImportant)415 runner := newRunner(connectionIsFatal(st), moreImportant)
472 singularRunner, err := newSingularRunner(runner, singularStateConn)416 singularRunner, err := newSingularRunner(runner, singularStateConn)
@@ -476,6 +420,7 @@
476420
477 // Take advantage of special knowledge here in that we will only ever want421 // Take advantage of special knowledge here in that we will only ever want
478 // the storage provider on one machine, and that is the "bootstrap" node.422 // the storage provider on one machine, and that is the "bootstrap" node.
423 providerType := agentConfig.Value(agent.ProviderType)
479 if (providerType == provider.Local || provider.IsManual(providerType)) && m.Id() == bootstrapMachineId {424 if (providerType == provider.Local || provider.IsManual(providerType)) && m.Id() == bootstrapMachineId {
480 a.startWorkerAfterUpgrade(runner, "local-storage", func() (worker.Worker, error) {425 a.startWorkerAfterUpgrade(runner, "local-storage", func() (worker.Worker, error) {
481 // TODO(axw) 2013-09-24 bug #1229507426 // TODO(axw) 2013-09-24 bug #1229507
@@ -540,6 +485,129 @@
540 return newCloseWorker(runner, st), nil485 return newCloseWorker(runner, st), nil
541}486}
542487
488// ensureMongoServer ensures that mongo is installed and running,
489// and ready for opening a state connection.
490func (a *MachineAgent) ensureMongoServer(agentConfig agent.Config) error {
491 servingInfo, ok := agentConfig.StateServingInfo()
492 if !ok {
493 return fmt.Errorf("state worker was started with no state serving info")
494 }
495 namespace := agentConfig.Value(agent.Namespace)
496 withHA := shouldEnableHA(agentConfig)
497
498 // When upgrading from a pre-HA-capable environment,
499 // we must add machine-0 to the admin database and
500 // initiate its replicaset.
501 //
502 // TODO(axw) remove this when we no longer need
503 // to upgrade from pre-HA-capable environments.
504 var shouldInitiateMongoServer bool
505 var addrs []instance.Address
506 if isPreHAVersion(agentConfig.UpgradedToVersion()) {
507 _, err := a.ensureMongoAdminUser(agentConfig)
508 if err != nil {
509 return err
510 }
511 if servingInfo.SharedSecret == "" {
512 servingInfo.SharedSecret, err = mongo.GenerateSharedSecret()
513 if err != nil {
514 return err
515 }
516 if err = a.ChangeConfig(func(config agent.ConfigSetter) {
517 config.SetStateServingInfo(servingInfo)
518 }); err != nil {
519 return err
520 }
521 agentConfig = a.CurrentConfig()
522 }
523 st, m, err := openState(agentConfig)
524 if err != nil {
525 return err
526 }
527 if err := st.SetStateServingInfo(servingInfo); err != nil {
528 st.Close()
529 return fmt.Errorf("cannot set state serving info: %v", err)
530 }
531 st.Close()
532 addrs = m.Addresses()
533 shouldInitiateMongoServer = withHA
534 }
535
536 // ensureMongoServer installs/upgrades the upstart config as necessary.
537 if err := ensureMongoServer(
538 agentConfig.DataDir(),
539 namespace,
540 servingInfo,
541 withHA,
542 ); err != nil {
543 return err
544 }
545 if !shouldInitiateMongoServer {
546 return nil
547 }
548
549 // Initiate the replicaset for upgraded environments.
550 //
551 // TODO(axw) remove this when we no longer need
552 // to upgrade from pre-HA-capable environments.
553 stateInfo, ok := agentConfig.StateInfo()
554 if !ok {
555 return fmt.Errorf("state worker was started with no state serving info")
556 }
557 dialInfo, err := state.DialInfo(stateInfo, state.DefaultDialOpts())
558 if err != nil {
559 return err
560 }
561 peerAddr := mongo.SelectPeerAddress(addrs)
562 if peerAddr == "" {
563 return fmt.Errorf("no appropriate peer address found in %q", addrs)
564 }
565 return maybeInitiateMongoServer(peergrouper.InitiateMongoParams{
566 DialInfo: dialInfo,
567 MemberHostPort: net.JoinHostPort(peerAddr, fmt.Sprint(servingInfo.StatePort)),
568 User: stateInfo.Tag,
569 Password: stateInfo.Password,
570 })
571}
572
573func (a *MachineAgent) ensureMongoAdminUser(agentConfig agent.Config) (added bool, err error) {
574 stateInfo, ok1 := agentConfig.StateInfo()
575 servingInfo, ok2 := agentConfig.StateServingInfo()
576 if !ok1 || !ok2 {
577 return false, fmt.Errorf("no state serving info configuration")
578 }
579 dialInfo, err := state.DialInfo(stateInfo, state.DefaultDialOpts())
580 if err != nil {
581 return false, err
582 }
583 if len(dialInfo.Addrs) > 1 {
584 logger.Infof("more than one state server; admin user must exist")
585 return false, nil
586 }
587 return ensureMongoAdminUser(mongo.EnsureAdminUserParams{
588 DialInfo: dialInfo,
589 Namespace: agentConfig.Value(agent.Namespace),
590 DataDir: agentConfig.DataDir(),
591 Port: servingInfo.StatePort,
592 User: stateInfo.Tag,
593 Password: stateInfo.Password,
594 })
595}
596
597func isPreHAVersion(v version.Number) bool {
598 return v.Compare(version.MustParse("1.19.0")) < 0
599}
600
601// shouldEnableHA reports whether HA should be enabled.
602//
603// Eventually this should always be true, and ideally
604// it should be true before 1.20 is released or we'll
605// have more upgrade scenarios on our hands.
606func shouldEnableHA(agentConfig agent.Config) bool {
607 providerType := agentConfig.Value(agent.ProviderType)
608 return providerType != provider.Local
609}
610
543func openState(agentConfig agent.Config) (_ *state.State, _ *state.Machine, err error) {611func openState(agentConfig agent.Config) (_ *state.State, _ *state.Machine, err error) {
544 info, ok := agentConfig.StateInfo()612 info, ok := agentConfig.StateInfo()
545 if !ok {613 if !ok {
546614
=== modified file 'cmd/jujud/machine_test.go'
--- cmd/jujud/machine_test.go 2014-04-17 17:30:48 +0000
+++ cmd/jujud/machine_test.go 2014-04-18 04:41:05 +0000
@@ -59,6 +59,7 @@
59 agentSuite59 agentSuite
60 singularRecord *singularRunnerRecord60 singularRecord *singularRunnerRecord
61 lxctesting.TestSuite61 lxctesting.TestSuite
62 fakeEnsureMongo fakeEnsure
62}63}
6364
64func (s *commonMachineSuite) SetUpSuite(c *gc.C) {65func (s *commonMachineSuite) SetUpSuite(c *gc.C) {
@@ -96,6 +97,10 @@
96 testing.PatchValue(&peergrouperNew, func(st *state.State) (worker.Worker, error) {97 testing.PatchValue(&peergrouperNew, func(st *state.State) (worker.Worker, error) {
97 return newDummyWorker(), nil98 return newDummyWorker(), nil
98 })99 })
100
101 s.fakeEnsureMongo = fakeEnsure{}
102 s.PatchValue(&ensureMongoServer, s.fakeEnsureMongo.fakeEnsureMongo)
103 s.PatchValue(&maybeInitiateMongoServer, s.fakeEnsureMongo.fakeInitiateMongo)
99}104}
100105
101func fakeCmd(path string) {106func fakeCmd(path string) {
@@ -123,6 +128,10 @@
123 inst, md := jujutesting.AssertStartInstance(c, s.Conn.Environ, m.Id())128 inst, md := jujutesting.AssertStartInstance(c, s.Conn.Environ, m.Id())
124 c.Assert(m.SetProvisioned(inst.Id(), state.BootstrapNonce, md), gc.IsNil)129 c.Assert(m.SetProvisioned(inst.Id(), state.BootstrapNonce, md), gc.IsNil)
125130
131 // Add an address for the tests in case the maybeInitiateMongoServer
132 // codepath is exercised.
133 s.setFakeMachineAddresses(c, m)
134
126 // Set up the new machine.135 // Set up the new machine.
127 err = m.SetAgentVersion(vers)136 err = m.SetAgentVersion(vers)
128 c.Assert(err, gc.IsNil)137 c.Assert(err, gc.IsNil)
@@ -327,7 +336,7 @@
327 return ctx, func() { newDeployContext = orig }336 return ctx, func() { newDeployContext = orig }
328}337}
329338
330func (s *MachineSuite) setFakeMachineAddresses(c *gc.C, machine *state.Machine) {339func (s *commonMachineSuite) setFakeMachineAddresses(c *gc.C, machine *state.Machine) {
331 addrs := []instance.Address{340 addrs := []instance.Address{
332 instance.NewAddress("0.1.2.3", instance.NetworkUnknown),341 instance.NewAddress("0.1.2.3", instance.NetworkUnknown),
333 }342 }
@@ -347,7 +356,6 @@
347 usefulVersion.Series = "quantal" // to match the charm created below356 usefulVersion.Series = "quantal" // to match the charm created below
348 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)357 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)
349 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)358 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)
350 s.setFakeMachineAddresses(c, m)
351 op := make(chan dummy.Operation, 200)359 op := make(chan dummy.Operation, 200)
352 dummy.Listen(op)360 dummy.Listen(op)
353361
@@ -405,7 +413,6 @@
405 usefulVersion.Series = "quantal" // to match the charm created below413 usefulVersion.Series = "quantal" // to match the charm created below
406 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)414 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)
407 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)415 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)
408 s.setFakeMachineAddresses(c, m)
409 a := s.newAgent(c, m)416 a := s.newAgent(c, m)
410 defer a.Stop()417 defer a.Stop()
411 go func() {418 go func() {
@@ -469,7 +476,6 @@
469 usefulVersion.Series = "quantal"476 usefulVersion.Series = "quantal"
470 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)477 envtesting.AssertUploadFakeToolsVersions(c, s.Conn.Environ.Storage(), usefulVersion)
471 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)478 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)
472 s.setFakeMachineAddresses(c, m)
473 calledChan := make(chan struct{}, 1)479 calledChan := make(chan struct{}, 1)
474 s.PatchValue(&useMultipleCPUs, func() { calledChan <- struct{}{} })480 s.PatchValue(&useMultipleCPUs, func() { calledChan <- struct{}{} })
475 // Now, start the agent, and observe that a JobManageEnviron agent481 // Now, start the agent, and observe that a JobManageEnviron agent
@@ -489,7 +495,6 @@
489 c.Check(a.Stop(), gc.IsNil)495 c.Check(a.Stop(), gc.IsNil)
490 // However, an agent that just JobHostUnits doesn't call UseMultipleCPUs496 // However, an agent that just JobHostUnits doesn't call UseMultipleCPUs
491 m2, _, _ := s.primeAgent(c, version.Current, state.JobHostUnits)497 m2, _, _ := s.primeAgent(c, version.Current, state.JobHostUnits)
492 s.setFakeMachineAddresses(c, m2)
493 a2 := s.newAgent(c, m2)498 a2 := s.newAgent(c, m2)
494 defer a2.Stop()499 defer a2.Stop()
495 go func() {500 go func() {
@@ -923,9 +928,12 @@
923 c.Fatalf("timeout while waiting for agent config to change")928 c.Fatalf("timeout while waiting for agent config to change")
924}929}
925930
926func (s *MachineSuite) TestMachineAgentEnsureAdminUser(c *gc.C) {931func (s *MachineSuite) TestMachineAgentUpgradeMongo(c *gc.C) {
927 m, _, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)932 m, agentConfig, _ := s.primeAgent(c, version.Current, state.JobManageEnviron)
928 err := s.State.MongoSession().DB("admin").RemoveUser(m.Tag())933 agentConfig.SetUpgradedToVersion(version.MustParse("1.18.0"))
934 err := agentConfig.Write()
935 c.Assert(err, gc.IsNil)
936 err = s.State.MongoSession().DB("admin").RemoveUser(m.Tag())
929 c.Assert(err, gc.IsNil)937 c.Assert(err, gc.IsNil)
930938
931 s.PatchValue(&ensureMongoAdminUser, func(p mongo.EnsureAdminUserParams) (bool, error) {939 s.PatchValue(&ensureMongoAdminUser, func(p mongo.EnsureAdminUserParams) (bool, error) {
@@ -954,6 +962,8 @@
954 c.Fatalf("state not opened")962 c.Fatalf("state not opened")
955 }963 }
956 s.waitStopped(c, state.JobManageEnviron, a, done)964 s.waitStopped(c, state.JobManageEnviron, a, done)
965 c.Assert(s.fakeEnsureMongo.ensureCount, gc.Equals, 1)
966 c.Assert(s.fakeEnsureMongo.initiateCount, gc.Equals, 1)
957}967}
958968
959// MachineWithCharmsSuite provides infrastructure for tests which need to969// MachineWithCharmsSuite provides infrastructure for tests which need to
960970
=== modified file 'worker/peergrouper/desired_test.go'
--- worker/peergrouper/desired_test.go 2014-04-17 16:27:08 +0000
+++ worker/peergrouper/desired_test.go 2014-04-18 04:41:05 +0000
@@ -8,21 +8,15 @@
8 "sort"8 "sort"
9 "strconv"9 "strconv"
10 "strings"10 "strings"
11 stdtesting "testing"
1211
13 jc "github.com/juju/testing/checkers"12 jc "github.com/juju/testing/checkers"
14 gc "launchpad.net/gocheck"13 gc "launchpad.net/gocheck"
1514
16 "launchpad.net/juju-core/instance"15 "launchpad.net/juju-core/instance"
17 "launchpad.net/juju-core/replicaset"16 "launchpad.net/juju-core/replicaset"
18 coretesting "launchpad.net/juju-core/testing"
19 "launchpad.net/juju-core/testing/testbase"17 "launchpad.net/juju-core/testing/testbase"
20)18)
2119
22func TestPackage(t *stdtesting.T) {
23 coretesting.MgoTestPackage(t)
24}
25
26type desiredPeerGroupSuite struct {20type desiredPeerGroupSuite struct {
27 testbase.LoggingSuite21 testbase.LoggingSuite
28}22}
2923
=== modified file 'worker/peergrouper/initiate.go'
--- worker/peergrouper/initiate.go 2014-04-15 16:37:08 +0000
+++ worker/peergrouper/initiate.go 2014-04-18 04:41:05 +0000
@@ -39,20 +39,20 @@
39 return nil39 return nil
40 }40 }
41 p.DialInfo.Direct = true41 p.DialInfo.Direct = true
42
43 // TODO(rog) remove this code when we no longer need to upgrade
44 // from pre-HA-capable environments.
45 if p.User != "" {
46 p.DialInfo.Username = p.User
47 p.DialInfo.Password = p.Password
48 }
49
42 session, err := mgo.DialWithInfo(p.DialInfo)50 session, err := mgo.DialWithInfo(p.DialInfo)
43 if err != nil {51 if err != nil {
44 return fmt.Errorf("can't dial mongo to initiate replicaset: %v", err)52 return fmt.Errorf("can't dial mongo to initiate replicaset: %v", err)
45 }53 }
46 defer session.Close()54 defer session.Close()
4755
48 // TODO(rog) remove this code when we no longer need to upgrade
49 // from pre-HA-capable environments.
50 if p.User != "" {
51 err := session.DB("admin").Login(p.User, p.Password)
52 if err != nil {
53 logger.Errorf("cannot login to admin db as %q, password %q, falling back: %v", p.User, p.Password, err)
54 }
55 }
56 cfg, err := replicaset.CurrentConfig(session)56 cfg, err := replicaset.CurrentConfig(session)
57 if err == nil && len(cfg.Members) > 0 {57 if err == nil && len(cfg.Members) > 0 {
58 logger.Infof("replica set configuration already found: %#v", cfg)58 logger.Infof("replica set configuration already found: %#v", cfg)
5959
=== modified file 'worker/peergrouper/initiate_test.go'
--- worker/peergrouper/initiate_test.go 2014-04-14 19:23:22 +0000
+++ worker/peergrouper/initiate_test.go 2014-04-18 04:41:05 +0000
@@ -25,6 +25,7 @@
25 inst := &coretesting.MgoInstance{Params: []string{"--replSet", "juju"}}25 inst := &coretesting.MgoInstance{Params: []string{"--replSet", "juju"}}
26 err = inst.Start(true)26 err = inst.Start(true)
27 c.Assert(err, gc.IsNil)27 c.Assert(err, gc.IsNil)
28 defer inst.Destroy()
2829
29 info := inst.DialInfo()30 info := inst.DialInfo()
30 args := peergrouper.InitiateMongoParams{31 args := peergrouper.InitiateMongoParams{
3132
=== added file 'worker/peergrouper/suite_test.go'
--- worker/peergrouper/suite_test.go 1970-01-01 00:00:00 +0000
+++ worker/peergrouper/suite_test.go 2014-04-18 04:41:05 +0000
@@ -0,0 +1,14 @@
1// Copyright 2014 Canonical Ltd.
2// Licensed under the AGPLv3, see LICENCE file for details.
3
4package peergrouper_test
5
6import (
7 stdtesting "testing"
8
9 "launchpad.net/juju-core/testing"
10)
11
12func TestPackage(t *stdtesting.T) {
13 testing.MgoTestPackage(t)
14}

Subscribers

People subscribed via source and target branches

to status/vote changes: