github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasupgrader/upgrader_test.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasupgrader_test
     5  
     6  import (
     7  	"github.com/juju/names/v5"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version/v2"
    10  	"github.com/juju/worker/v3/workertest"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/core/arch"
    14  	coreos "github.com/juju/juju/core/os"
    15  	"github.com/juju/juju/core/watcher/watchertest"
    16  	coretesting "github.com/juju/juju/testing"
    17  	jujuversion "github.com/juju/juju/version"
    18  	"github.com/juju/juju/worker/caasupgrader"
    19  	"github.com/juju/juju/worker/gate"
    20  )
    21  
    22  type UpgraderSuite struct {
    23  	coretesting.BaseSuite
    24  
    25  	confVersion      version.Number
    26  	upgraderClient   *mockUpgraderClient
    27  	operatorUpgrader *mockOperatorUpgrader
    28  	ch               chan struct{}
    29  
    30  	upgradeStepsComplete gate.Lock
    31  	initialCheckComplete gate.Lock
    32  }
    33  
    34  var _ = gc.Suite(&UpgraderSuite{})
    35  
    36  func (s *UpgraderSuite) SetUpTest(c *gc.C) {
    37  	s.BaseSuite.SetUpTest(c)
    38  
    39  	s.upgradeStepsComplete = gate.NewLock()
    40  	s.initialCheckComplete = gate.NewLock()
    41  	s.ch = make(chan struct{})
    42  	s.upgraderClient = &mockUpgraderClient{
    43  		watcher: watchertest.NewMockNotifyWatcher(s.ch),
    44  	}
    45  	s.operatorUpgrader = &mockOperatorUpgrader{}
    46  }
    47  
    48  func (s *UpgraderSuite) patchVersion(v version.Binary) {
    49  	s.PatchValue(&arch.HostArch, func() string { return v.Arch })
    50  	s.PatchValue(&coreos.HostOS, func() coreos.OSType { return coreos.Ubuntu })
    51  	s.PatchValue(&jujuversion.Current, v.Number)
    52  }
    53  
    54  func (s *UpgraderSuite) makeUpgrader(c *gc.C, agent names.Tag) *caasupgrader.Upgrader {
    55  	w, err := caasupgrader.NewUpgrader(caasupgrader.Config{
    56  		UpgraderClient:              s.upgraderClient,
    57  		CAASOperatorUpgrader:        s.operatorUpgrader,
    58  		AgentTag:                    agent,
    59  		OrigAgentVersion:            s.confVersion,
    60  		UpgradeStepsWaiter:          s.upgradeStepsComplete,
    61  		InitialUpgradeCheckComplete: s.initialCheckComplete,
    62  	})
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	workertest.CheckAlive(c, w)
    65  	s.ch <- struct{}{}
    66  	return w
    67  }
    68  
    69  func (s *UpgraderSuite) TestUpgraderSetsVersion(c *gc.C) {
    70  	vers := version.MustParse("6.6.6")
    71  	s.PatchValue(&jujuversion.Current, vers)
    72  	s.upgraderClient.desired = vers
    73  
    74  	u := s.makeUpgrader(c, names.NewMachineTag("0"))
    75  	workertest.CleanKill(c, u)
    76  
    77  	s.expectInitialUpgradeCheckDone(c)
    78  	c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers)
    79  }
    80  
    81  func (s *UpgraderSuite) TestUpgraderController(c *gc.C) {
    82  	vers := version.MustParseBinary("6.6.6-ubuntu-amd64")
    83  	s.patchVersion(vers)
    84  	s.upgraderClient.desired = version.MustParse("6.6.7")
    85  
    86  	u := s.makeUpgrader(c, names.NewMachineTag("0"))
    87  	workertest.CleanKill(c, u)
    88  
    89  	s.expectInitialUpgradeCheckNotDone(c)
    90  	c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers.Number)
    91  	s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion")
    92  	s.upgraderClient.CheckCall(c, 0, "SetVersion", "machine-0", vers)
    93  	s.operatorUpgrader.CheckCallNames(c, "Upgrade")
    94  	s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired)
    95  }
    96  
    97  func (s *UpgraderSuite) TestUpgraderApplication(c *gc.C) {
    98  	vers := version.MustParseBinary("6.6.6-ubuntu-amd64")
    99  	s.patchVersion(vers)
   100  	s.upgraderClient.desired = version.MustParse("6.6.7")
   101  
   102  	u := s.makeUpgrader(c, names.NewApplicationTag("app"))
   103  	workertest.CleanKill(c, u)
   104  
   105  	s.expectInitialUpgradeCheckNotDone(c)
   106  	s.upgraderClient.CheckCallNames(c, "DesiredVersion")
   107  	s.operatorUpgrader.CheckCallNames(c, "Upgrade")
   108  	s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "application-app", s.upgraderClient.desired)
   109  }
   110  
   111  func (s *UpgraderSuite) TestUpgraderSidecarUnit(c *gc.C) {
   112  	vers := version.MustParseBinary("6.6.6-ubuntu-amd64")
   113  	s.patchVersion(vers)
   114  	s.upgraderClient.desired = version.MustParse("6.6.7")
   115  
   116  	u := s.makeUpgrader(c, names.NewUnitTag("cockroachdb/0"))
   117  	workertest.CleanKill(c, u)
   118  
   119  	s.expectInitialUpgradeCheckNotDone(c)
   120  	s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion")
   121  	s.upgraderClient.CheckCall(c, 0, "SetVersion", "unit-cockroachdb-0", vers)
   122  	s.operatorUpgrader.CheckCallNames(c, "Upgrade")
   123  	s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "unit-cockroachdb-0", s.upgraderClient.desired)
   124  }
   125  
   126  func (s *UpgraderSuite) TestUpgraderDowngradePatch(c *gc.C) {
   127  	vers := version.MustParse("6.6.7")
   128  	s.PatchValue(&jujuversion.Current, vers)
   129  	s.upgraderClient.desired = version.MustParse("6.6.6")
   130  
   131  	u := s.makeUpgrader(c, names.NewMachineTag("0"))
   132  	workertest.CleanKill(c, u)
   133  
   134  	s.expectInitialUpgradeCheckNotDone(c)
   135  	c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers)
   136  	s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion")
   137  	s.operatorUpgrader.CheckCallNames(c, "Upgrade")
   138  	s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired)
   139  }
   140  
   141  func (s *UpgraderSuite) TestUpgraderDowngradeMinor(c *gc.C) {
   142  	// We'll allow this for the case of restoring a backup from a
   143  	// previous juju version.
   144  	vers := version.MustParse("6.6.7")
   145  	s.PatchValue(&jujuversion.Current, vers)
   146  	s.upgraderClient.desired = version.MustParse("6.5.10")
   147  
   148  	u := s.makeUpgrader(c, names.NewMachineTag("0"))
   149  	workertest.CleanKill(c, u)
   150  
   151  	s.expectInitialUpgradeCheckNotDone(c)
   152  	c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers)
   153  	s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion")
   154  	s.operatorUpgrader.CheckCallNames(c, "Upgrade")
   155  	s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired)
   156  }
   157  
   158  func (s *UpgraderSuite) expectInitialUpgradeCheckDone(c *gc.C) {
   159  	c.Assert(s.initialCheckComplete.IsUnlocked(), jc.IsTrue)
   160  }
   161  
   162  func (s *UpgraderSuite) expectInitialUpgradeCheckNotDone(c *gc.C) {
   163  	c.Assert(s.initialCheckComplete.IsUnlocked(), jc.IsFalse)
   164  }