github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/upgrades/upgradevalidation/migrate_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 jujutesting "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 "go.uber.org/mock/gomock" 11 gc "gopkg.in/check.v1" 12 13 environscloudspec "github.com/juju/juju/environs/cloudspec" 14 "github.com/juju/juju/provider/lxd" 15 "github.com/juju/juju/state" 16 coretesting "github.com/juju/juju/testing" 17 "github.com/juju/juju/upgrades/upgradevalidation" 18 "github.com/juju/juju/upgrades/upgradevalidation/mocks" 19 ) 20 21 var winVersions = []string{ 22 "win2008r2", "win2012", "win2012hv", "win2012hvr2", "win2012r2", "win2012r2", 23 "win2016", "win2016hv", "win2019", "win7", "win8", "win81", "win10", 24 } 25 26 var ubuntuVersions = []string{ 27 "12.04", 28 "12.10", 29 "13.04", 30 "13.10", 31 "14.04", 32 "14.10", 33 "15.04", 34 "15.10", 35 "16.04", 36 "16.10", 37 "17.04", 38 "17.10", 39 "18.04", 40 "18.10", 41 "19.04", 42 "19.10", 43 "20.10", 44 "21.04", 45 "21.10", 46 "22.10", 47 "23.04", 48 "23.10", 49 "24.04", 50 } 51 52 func makeBases(os string, vers []string) []state.Base { 53 bases := make([]state.Base, len(vers)) 54 for i, vers := range vers { 55 bases[i] = state.Base{OS: os, Channel: vers} 56 } 57 return bases 58 } 59 60 var _ = gc.Suite(&migrateSuite{}) 61 62 type migrateSuite struct { 63 jujutesting.IsolationSuite 64 65 st *mocks.MockState 66 statePool *mocks.MockStatePool 67 model *mocks.MockModel 68 } 69 70 func (s *migrateSuite) TestValidatorsForModelMigrationSourceJuju3(c *gc.C) { 71 ctrl, cloudSpec := s.setupMocks(c) 72 defer ctrl.Finish() 73 74 modelTag := coretesting.ModelTag 75 validators := upgradevalidation.ValidatorsForModelMigrationSource(cloudSpec) 76 77 checker := upgradevalidation.NewModelUpgradeCheck(modelTag.Id(), s.statePool, s.st, s.model, validators...) 78 blockers, err := checker.Validate() 79 c.Assert(err, jc.ErrorIsNil) 80 c.Assert(blockers, gc.IsNil) 81 } 82 83 func (s *migrateSuite) TestValidatorsForModelMigrationSourceJuju31(c *gc.C) { 84 ctrl, cloudSpec := s.setupMocks(c) 85 defer ctrl.Finish() 86 87 modelTag := coretesting.ModelTag 88 validators := upgradevalidation.ValidatorsForModelMigrationSource(cloudSpec) 89 90 checker := upgradevalidation.NewModelUpgradeCheck(modelTag.Id(), s.statePool, s.st, s.model, validators...) 91 blockers, err := checker.Validate() 92 c.Assert(err, jc.ErrorIsNil) 93 c.Assert(blockers, gc.IsNil) 94 } 95 96 func (s *migrateSuite) initializeMocks(c *gc.C) *gomock.Controller { 97 ctrl := gomock.NewController(c) 98 s.statePool = mocks.NewMockStatePool(ctrl) 99 s.st = mocks.NewMockState(ctrl) 100 s.model = mocks.NewMockModel(ctrl) 101 return ctrl 102 } 103 104 func (s *migrateSuite) setupMocks(c *gc.C) (*gomock.Controller, environscloudspec.CloudSpec) { 105 ctrl := s.initializeMocks(c) 106 server := mocks.NewMockServer(ctrl) 107 serverFactory := mocks.NewMockServerFactory(ctrl) 108 // - check LXD version. 109 cloudSpec := lxd.CloudSpec{CloudSpec: environscloudspec.CloudSpec{Type: "lxd"}} 110 serverFactory.EXPECT().RemoteServer(cloudSpec).Return(server, nil) 111 server.EXPECT().ServerVersion().Return("5.2") 112 113 s.PatchValue(&upgradevalidation.NewServerFactory, 114 func(_ lxd.NewHTTPClientFunc) lxd.ServerFactory { 115 return serverFactory 116 }, 117 ) 118 // - check no upgrade series in process. 119 s.st.EXPECT().HasUpgradeSeriesLocks().Return(false, nil) 120 // - check if the model has win machines; 121 s.st.EXPECT().MachineCountForBase(makeBases("windows", winVersions)).Return(nil, nil) 122 s.st.EXPECT().MachineCountForBase(makeBases("ubuntu", ubuntuVersions)).Return(nil, nil) 123 // - check no charm store charms 124 s.st.EXPECT().AllCharmURLs().Return([]*string{}, errors.NotFoundf("charm urls")) 125 126 return ctrl, cloudSpec.CloudSpec 127 }