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  }