github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/cmd/jujud/upgrade_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "os" 8 "os/exec" 9 "path/filepath" 10 11 gc "launchpad.net/gocheck" 12 13 "launchpad.net/juju-core/agent" 14 "launchpad.net/juju-core/environs/config" 15 "launchpad.net/juju-core/state" 16 coretesting "launchpad.net/juju-core/testing" 17 jc "launchpad.net/juju-core/testing/checkers" 18 "launchpad.net/juju-core/utils" 19 "launchpad.net/juju-core/version" 20 ) 21 22 type UpgradeSuite struct { 23 commonMachineSuite 24 25 aptCmds []*exec.Cmd 26 machine *state.Machine 27 upgradeToVersion version.Binary 28 } 29 30 var _ = gc.Suite(&UpgradeSuite{}) 31 32 func fakeRestart() error { return nil } 33 34 func (s *UpgradeSuite) SetUpTest(c *gc.C) { 35 s.commonMachineSuite.SetUpTest(c) 36 37 // Capture all apt commands. 38 s.aptCmds = nil 39 aptCmds := s.HookCommandOutput(&utils.AptCommandOutput, nil, nil) 40 go func() { 41 for cmd := range aptCmds { 42 s.aptCmds = append(s.aptCmds, cmd) 43 } 44 }() 45 46 // As Juju versions increase, update the version to which we are upgrading. 47 s.upgradeToVersion = version.Current 48 s.upgradeToVersion.Number.Minor++ 49 } 50 51 func (s *UpgradeSuite) TestUpgradeStepsStateServer(c *gc.C) { 52 s.assertUpgradeSteps(c, state.JobManageEnviron) 53 s.assertStateServerUpgrades(c) 54 } 55 56 func (s *UpgradeSuite) TestUpgradeStepsHostMachine(c *gc.C) { 57 // We need to first start up a state server that thinks it has already been upgraded. 58 ss, _, _ := s.primeAgent(c, s.upgradeToVersion, state.JobManageEnviron) 59 a := s.newAgent(c, ss) 60 go func() { c.Check(a.Run(nil), gc.IsNil) }() 61 defer func() { c.Check(a.Stop(), gc.IsNil) }() 62 // Now run the test. 63 s.assertUpgradeSteps(c, state.JobHostUnits) 64 s.assertHostUpgrades(c) 65 } 66 67 func (s *UpgradeSuite) assertUpgradeSteps(c *gc.C, job state.MachineJob) { 68 s.PatchValue(&version.Current, s.upgradeToVersion) 69 err := s.State.SetEnvironAgentVersion(s.upgradeToVersion.Number) 70 c.Assert(err, gc.IsNil) 71 72 oldVersion := s.upgradeToVersion 73 oldVersion.Major = 1 74 oldVersion.Minor = 16 75 var oldConfig agent.Config 76 s.machine, oldConfig, _ = s.primeAgent(c, oldVersion, job) 77 78 a := s.newAgent(c, s.machine) 79 go func() { c.Check(a.Run(nil), gc.IsNil) }() 80 defer func() { c.Check(a.Stop(), gc.IsNil) }() 81 82 // Wait for upgrade steps to run. 83 success := false 84 for attempt := coretesting.LongAttempt.Start(); attempt.Next(); { 85 conf, err := agent.ReadConf(agent.ConfigPath(oldConfig.DataDir(), s.machine.Tag())) 86 c.Assert(err, gc.IsNil) 87 success = conf.UpgradedToVersion() == s.upgradeToVersion.Number 88 if success { 89 break 90 } 91 } 92 // Upgrade worker has completed ok. 93 c.Assert(success, jc.IsTrue) 94 } 95 96 func (s *UpgradeSuite) keyFile() string { 97 return filepath.Join(s.DataDir(), "system-identity") 98 } 99 100 func (s *UpgradeSuite) assertCommonUpgrades(c *gc.C) { 101 // rsyslog-gnutls should have been installed. 102 c.Assert(s.aptCmds, gc.HasLen, 1) 103 args := s.aptCmds[0].Args 104 c.Assert(len(args), jc.GreaterThan, 1) 105 c.Assert(args[0], gc.Equals, "apt-get") 106 c.Assert(args[len(args)-1], gc.Equals, "rsyslog-gnutls") 107 } 108 109 func (s *UpgradeSuite) assertStateServerUpgrades(c *gc.C) { 110 s.assertCommonUpgrades(c) 111 // System SSH key 112 c.Assert(s.keyFile(), jc.IsNonEmptyFile) 113 // Syslog port should have been updated 114 cfg, err := s.State.EnvironConfig() 115 c.Assert(err, gc.IsNil) 116 c.Assert(cfg.SyslogPort(), gc.Equals, config.DefaultSyslogPort) 117 // Deprecated attributes should have been deleted - just test a couple. 118 allAttrs := cfg.AllAttrs() 119 _, ok := allAttrs["public-bucket"] 120 c.Assert(ok, jc.IsFalse) 121 _, ok = allAttrs["public-bucket-region"] 122 c.Assert(ok, jc.IsFalse) 123 } 124 125 func (s *UpgradeSuite) assertHostUpgrades(c *gc.C) { 126 s.assertCommonUpgrades(c) 127 // Lock directory 128 lockdir := filepath.Join(s.DataDir(), "locks") 129 c.Assert(lockdir, jc.IsDirectory) 130 // SSH key file should not be generated for hosts. 131 _, err := os.Stat(s.keyFile()) 132 c.Assert(err, jc.Satisfies, os.IsNotExist) 133 // Syslog port should not have been updated 134 cfg, err := s.State.EnvironConfig() 135 c.Assert(err, gc.IsNil) 136 c.Assert(cfg.SyslogPort(), gc.Not(gc.Equals), config.DefaultSyslogPort) 137 // Add other checks as needed... 138 }