github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/upgrades/upgradevalidation/version_test.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgradevalidation_test
     5  
     6  import (
     7  	jujutesting "github.com/juju/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version/v2"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/upgrades/upgradevalidation"
    13  )
    14  
    15  type versionSuite struct {
    16  	jujutesting.IsolationSuite
    17  }
    18  
    19  var _ = gc.Suite(&versionSuite{})
    20  
    21  type versionCheckTC struct {
    22  	from    string
    23  	to      string
    24  	allowed bool
    25  	minVers string
    26  	err     string
    27  }
    28  
    29  func (s *versionSuite) TestUpgradeControllerAllowed(c *gc.C) {
    30  	for i, t := range []versionCheckTC{
    31  		{
    32  			from:    "2.8.0",
    33  			to:      "3.0.0",
    34  			allowed: false,
    35  			minVers: "2.9.36",
    36  		}, {
    37  			from:    "2.9.65",
    38  			to:      "3.0.0",
    39  			allowed: true,
    40  			minVers: "2.9.36",
    41  		}, {
    42  			from:    "2.9.37",
    43  			to:      "3.0.0",
    44  			allowed: true,
    45  			minVers: "2.9.36",
    46  		}, {
    47  			from:    "2.9.0",
    48  			to:      "4.0.0",
    49  			allowed: false,
    50  			minVers: "0.0.0",
    51  			err:     `upgrading controller to "4.0.0" is not supported from "2.9.0"`,
    52  		}, {
    53  			from:    "3.0.0",
    54  			to:      "2.0.0",
    55  			allowed: false,
    56  			minVers: "0.0.0",
    57  			err:     `downgrade is not allowed`,
    58  		},
    59  	} {
    60  		s.assertUpgradeControllerAllowed(c, i, t)
    61  	}
    62  }
    63  
    64  func (s *versionSuite) assertUpgradeControllerAllowed(c *gc.C, i int, t versionCheckTC) {
    65  	c.Logf("testing %d", i)
    66  
    67  	restore := jujutesting.PatchValue(&upgradevalidation.MinAgentVersions, map[int]version.Number{
    68  		3: version.MustParse("2.9.36"),
    69  	})
    70  	defer restore()
    71  
    72  	from := version.MustParse(t.from)
    73  	to := version.MustParse(t.to)
    74  	minVers := version.MustParse(t.minVers)
    75  	allowed, vers, err := upgradevalidation.UpgradeControllerAllowed(from, to)
    76  	c.Check(allowed, gc.Equals, t.allowed)
    77  	c.Check(vers, gc.DeepEquals, minVers)
    78  	if t.err == "" {
    79  		c.Check(err, jc.ErrorIsNil)
    80  	} else {
    81  		c.Check(err, gc.ErrorMatches, t.err)
    82  	}
    83  }
    84  
    85  func (s *versionSuite) TestMigrateToAllowed(c *gc.C) {
    86  	for i, t := range []versionCheckTC{
    87  		{
    88  			from:    "2.8.0",
    89  			to:      "3.0.0",
    90  			allowed: false,
    91  			minVers: "2.9.43",
    92  		}, {
    93  			from:    "2.9.43",
    94  			to:      "3.0.0",
    95  			allowed: true,
    96  			minVers: "2.9.43",
    97  		}, {
    98  			from:    "2.9.44",
    99  			to:      "3.0.0",
   100  			allowed: true,
   101  			minVers: "2.9.43",
   102  		},
   103  		{
   104  			from:    "2.9.0",
   105  			to:      "4.0.0",
   106  			allowed: false,
   107  			minVers: "0.0.0",
   108  			err:     `migrate to "4.0.0" is not supported from "2.9.0"`,
   109  		},
   110  		{
   111  			from:    "3.0.0",
   112  			to:      "2.0.0",
   113  			allowed: false,
   114  			minVers: "0.0.0",
   115  			err:     `downgrade is not allowed`,
   116  		},
   117  	} {
   118  		s.assertMigrateToAllowed(c, i, t)
   119  	}
   120  }
   121  
   122  func (s *versionSuite) assertMigrateToAllowed(c *gc.C, i int, t versionCheckTC) {
   123  	c.Logf("testing %d", i)
   124  	from := version.MustParse(t.from)
   125  	to := version.MustParse(t.to)
   126  	minVers := version.MustParse(t.minVers)
   127  	allowed, vers, err := upgradevalidation.MigrateToAllowed(from, to)
   128  	c.Check(allowed, gc.Equals, t.allowed)
   129  	c.Check(vers, gc.DeepEquals, minVers)
   130  	if t.err == "" {
   131  		c.Check(err, jc.ErrorIsNil)
   132  	} else {
   133  		c.Check(err, gc.ErrorMatches, t.err)
   134  	}
   135  }