github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/cloud/instance_information_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloud_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	jc "github.com/juju/testing/checkers"
    10  	"go.uber.org/mock/gomock"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	credentialcommonmocks "github.com/juju/juju/apiserver/common/credentialcommon/mocks"
    14  	cloudfacade "github.com/juju/juju/apiserver/facades/client/cloud"
    15  	"github.com/juju/juju/apiserver/facades/client/cloud/mocks"
    16  	"github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/core/constraints"
    18  	"github.com/juju/juju/environs"
    19  	"github.com/juju/juju/environs/context"
    20  	"github.com/juju/juju/environs/instances"
    21  	environsmocks "github.com/juju/juju/environs/mocks"
    22  	"github.com/juju/juju/rpc/params"
    23  	coretesting "github.com/juju/juju/testing"
    24  )
    25  
    26  type instanceTypesSuite struct {
    27  	backend                     *mocks.MockBackend
    28  	ctrlBackend                 *mocks.MockBackend
    29  	pool                        *mocks.MockModelPoolBackend
    30  	authorizer                  *testing.FakeAuthorizer
    31  	credcommonPersistentBackend *credentialcommonmocks.MockPersistentBackend
    32  }
    33  
    34  func (s *instanceTypesSuite) setup(c *gc.C, userTag names.UserTag) *gomock.Controller {
    35  	ctrl := gomock.NewController(c)
    36  
    37  	s.backend = mocks.NewMockBackend(ctrl)
    38  	s.ctrlBackend = mocks.NewMockBackend(ctrl)
    39  	s.pool = mocks.NewMockModelPoolBackend(ctrl)
    40  	s.credcommonPersistentBackend = credentialcommonmocks.NewMockPersistentBackend(ctrl)
    41  	s.authorizer = &testing.FakeAuthorizer{
    42  		Tag: userTag,
    43  	}
    44  
    45  	return ctrl
    46  }
    47  
    48  var _ = gc.Suite(&instanceTypesSuite{})
    49  
    50  var over9kCPUCores uint64 = 9001
    51  
    52  func (p *instanceTypesSuite) TestInstanceTypes(c *gc.C) {
    53  	adminTag := names.NewUserTag("admin")
    54  	ctrl := p.setup(c, adminTag)
    55  	defer ctrl.Finish()
    56  
    57  	mockModel := mocks.NewMockModel(ctrl)
    58  
    59  	itCons := constraints.Value{CpuCores: &over9kCPUCores}
    60  	failureCons := constraints.Value{}
    61  
    62  	mockEnv := environsmocks.NewMockEnviron(ctrl)
    63  	mockEnv.EXPECT().InstanceTypes(gomock.Any(),
    64  		itCons).Return(instances.InstanceTypesWithCostMetadata{
    65  		CostUnit:     "USD/h",
    66  		CostCurrency: "USD",
    67  		InstanceTypes: []instances.InstanceType{
    68  			{Name: "instancetype-1"},
    69  			{Name: "instancetype-2"}},
    70  	}, nil)
    71  	mockEnv.EXPECT().InstanceTypes(gomock.Any(),
    72  		failureCons).Return(instances.InstanceTypesWithCostMetadata{},
    73  		errors.NotFoundf("Instances matching constraint "))
    74  
    75  	fakeEnvironGet := func(
    76  		st environs.EnvironConfigGetter,
    77  		newEnviron environs.NewEnvironFunc,
    78  	) (environs.Environ, error) {
    79  		return mockEnv, nil
    80  	}
    81  
    82  	mockModel.EXPECT().UUID().Return(coretesting.ModelTag.Id()).AnyTimes()
    83  	mockModel.EXPECT().CloudName().Return("aws").AnyTimes()
    84  
    85  	p.ctrlBackend.EXPECT().Model().Return(mockModel, nil)
    86  	p.pool.EXPECT().GetModelCallContext(coretesting.ModelTag.Id()).Return(p.credcommonPersistentBackend,
    87  		context.NewEmptyCloudCallContext(), nil)
    88  	p.backend.EXPECT().ControllerTag().Return(coretesting.ControllerTag)
    89  
    90  	api, err := cloudfacade.NewCloudAPI(p.backend, p.ctrlBackend, p.pool, p.authorizer)
    91  	c.Assert(err, jc.ErrorIsNil)
    92  
    93  	cons := params.CloudInstanceTypesConstraints{
    94  		Constraints: []params.CloudInstanceTypesConstraint{
    95  			{CloudTag: "cloud-aws",
    96  				CloudRegion: "a-region",
    97  				Constraints: &itCons},
    98  			{CloudTag: "cloud-aws",
    99  				CloudRegion: "a-region",
   100  				Constraints: &failureCons},
   101  			{CloudTag: "cloud-gce",
   102  				CloudRegion: "a-region",
   103  				Constraints: &itCons}},
   104  	}
   105  	r, err := cloudfacade.InstanceTypes(api, fakeEnvironGet, cons)
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	c.Assert(r.Results, gc.HasLen, 3)
   108  	expected := []params.InstanceTypesResult{
   109  		{
   110  			InstanceTypes: []params.InstanceType{
   111  				{Name: "instancetype-1"},
   112  				{Name: "instancetype-2"}},
   113  			CostUnit:     "USD/h",
   114  			CostCurrency: "USD",
   115  		},
   116  		{
   117  			Error: &params.Error{Message: "Instances matching constraint  not found", Code: "not found"}},
   118  		{
   119  			Error: &params.Error{Message: "asking gce cloud information to aws cloud not valid", Code: "not valid"}}}
   120  	c.Assert(r.Results, gc.DeepEquals, expected)
   121  }