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  }