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 }