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

     1  // Copyright 2022 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package upgradevalidation_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	"github.com/juju/replicaset/v3"
    10  	jc "github.com/juju/testing/checkers"
    11  	"github.com/juju/version/v2"
    12  	"go.uber.org/mock/gomock"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	environscloudspec "github.com/juju/juju/environs/cloudspec"
    16  	"github.com/juju/juju/provider/lxd"
    17  	"github.com/juju/juju/state"
    18  	coretesting "github.com/juju/juju/testing"
    19  	"github.com/juju/juju/upgrades/upgradevalidation"
    20  	"github.com/juju/juju/upgrades/upgradevalidation/mocks"
    21  )
    22  
    23  func (s *upgradeValidationSuite) TestValidatorsForControllerUpgradeJuju3(c *gc.C) {
    24  	ctrl := gomock.NewController(c)
    25  	defer ctrl.Finish()
    26  
    27  	s.PatchValue(&upgradevalidation.MinAgentVersions, map[int]version.Number{
    28  		3: version.MustParse("2.9.1"),
    29  	})
    30  
    31  	ctrlModelTag := names.NewModelTag("deadpork-0bad-400d-8000-4b1d0d06f00d")
    32  	model1ModelTag := coretesting.ModelTag
    33  	statePool := mocks.NewMockStatePool(ctrl)
    34  
    35  	ctrlState := mocks.NewMockState(ctrl)
    36  	ctrlModel := mocks.NewMockModel(ctrl)
    37  
    38  	state1 := mocks.NewMockState(ctrl)
    39  	model1 := mocks.NewMockModel(ctrl)
    40  
    41  	server := mocks.NewMockServer(ctrl)
    42  	serverFactory := mocks.NewMockServerFactory(ctrl)
    43  	s.PatchValue(&upgradevalidation.NewServerFactory,
    44  		func(_ lxd.NewHTTPClientFunc) lxd.ServerFactory {
    45  			return serverFactory
    46  		},
    47  	)
    48  	cloudSpec := lxd.CloudSpec{CloudSpec: environscloudspec.CloudSpec{Type: "lxd"}}
    49  
    50  	// 1. Check controller model.
    51  	// - check agent version;
    52  	ctrlModel.EXPECT().AgentVersion().Return(version.MustParse("3.666.1"), nil)
    53  	// - check mongo status;
    54  	ctrlState.EXPECT().MongoCurrentStatus().Return(&replicaset.Status{
    55  		Members: []replicaset.MemberStatus{
    56  			{
    57  				Id:      1,
    58  				Address: "1.1.1.1",
    59  				State:   replicaset.PrimaryState,
    60  			},
    61  			{
    62  				Id:      2,
    63  				Address: "2.2.2.2",
    64  				State:   replicaset.SecondaryState,
    65  			},
    66  			{
    67  				Id:      3,
    68  				Address: "3.3.3.3",
    69  				State:   replicaset.SecondaryState,
    70  			},
    71  		},
    72  	}, nil)
    73  	// - check mongo version;
    74  	statePool.EXPECT().MongoVersion().Return("4.4", nil)
    75  	// - check if the model has win machines;
    76  	ctrlState.EXPECT().MachineCountForBase(makeBases("windows", winVersions)).Return(nil, nil)
    77  	ctrlState.EXPECT().MachineCountForBase(makeBases("ubuntu", ubuntuVersions)).Return(nil, nil)
    78  	// - check no charm store charms
    79  	ctrlState.EXPECT().AllCharmURLs().Return([]*string{}, errors.NotFoundf("charm urls"))
    80  	// - check LXD version.
    81  	serverFactory.EXPECT().RemoteServer(cloudSpec).Return(server, nil)
    82  	server.EXPECT().ServerVersion().Return("5.2")
    83  	// 2. Check hosted models.
    84  	// - check agent version;
    85  	model1.EXPECT().AgentVersion().Return(version.MustParse("2.9.1"), nil)
    86  	//  - check if model migration is ongoing;
    87  	model1.EXPECT().MigrationMode().Return(state.MigrationModeNone)
    88  	// - check if the model has win machines;
    89  	state1.EXPECT().MachineCountForBase(makeBases("windows", winVersions)).Return(nil, nil)
    90  	state1.EXPECT().MachineCountForBase(makeBases("ubuntu", ubuntuVersions)).Return(nil, nil)
    91  	// - check no charm store charms
    92  	state1.EXPECT().AllCharmURLs().Return([]*string{}, errors.NotFoundf("charm urls"))
    93  	// - check LXD version.
    94  	serverFactory.EXPECT().RemoteServer(cloudSpec).Return(server, nil)
    95  	server.EXPECT().ServerVersion().Return("5.2")
    96  
    97  	targetVersion := version.MustParse("3.666.2")
    98  	validators := upgradevalidation.ValidatorsForControllerUpgrade(true, targetVersion, cloudSpec.CloudSpec)
    99  	checker := upgradevalidation.NewModelUpgradeCheck(ctrlModelTag.Id(), statePool, ctrlState, ctrlModel, validators...)
   100  	blockers, err := checker.Validate()
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	c.Assert(blockers, gc.IsNil)
   103  
   104  	validators = upgradevalidation.ValidatorsForControllerUpgrade(false, targetVersion, cloudSpec.CloudSpec)
   105  	checker = upgradevalidation.NewModelUpgradeCheck(model1ModelTag.Id(), statePool, state1, model1, validators...)
   106  	blockers, err = checker.Validate()
   107  	c.Assert(err, jc.ErrorIsNil)
   108  	c.Assert(blockers, gc.IsNil)
   109  }
   110  
   111  func (s *upgradeValidationSuite) TestValidatorsForModelUpgradeJuju3(c *gc.C) {
   112  	ctrl := gomock.NewController(c)
   113  	defer ctrl.Finish()
   114  
   115  	modelTag := coretesting.ModelTag
   116  	statePool := mocks.NewMockStatePool(ctrl)
   117  	state := mocks.NewMockState(ctrl)
   118  	model := mocks.NewMockModel(ctrl)
   119  
   120  	server := mocks.NewMockServer(ctrl)
   121  	serverFactory := mocks.NewMockServerFactory(ctrl)
   122  	s.PatchValue(&upgradevalidation.NewServerFactory,
   123  		func(_ lxd.NewHTTPClientFunc) lxd.ServerFactory {
   124  			return serverFactory
   125  		},
   126  	)
   127  	cloudSpec := lxd.CloudSpec{CloudSpec: environscloudspec.CloudSpec{Type: "lxd"}}
   128  
   129  	// - check no upgrade series in process.
   130  	state.EXPECT().HasUpgradeSeriesLocks().Return(false, nil)
   131  	// - check if the model has win machines.
   132  	state.EXPECT().MachineCountForBase(makeBases("windows", winVersions)).Return(nil, nil)
   133  	state.EXPECT().MachineCountForBase(makeBases("ubuntu", ubuntuVersions)).Return(nil, nil)
   134  	// - check LXD version.
   135  	serverFactory.EXPECT().RemoteServer(cloudSpec).Return(server, nil)
   136  	server.EXPECT().ServerVersion().Return("5.2")
   137  
   138  	targetVersion := version.MustParse("3.0.0")
   139  	validators := upgradevalidation.ValidatorsForModelUpgrade(false, targetVersion, cloudSpec.CloudSpec)
   140  	checker := upgradevalidation.NewModelUpgradeCheck(modelTag.Id(), statePool, state, model, validators...)
   141  	blockers, err := checker.Validate()
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	c.Assert(blockers, gc.IsNil)
   144  }