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: ¶ms.Error{Message: "Instances matching constraint not found", Code: "not found"}}, 118 { 119 Error: ¶ms.Error{Message: "asking gce cloud information to aws cloud not valid", Code: "not valid"}}} 120 c.Assert(r.Results, gc.DeepEquals, expected) 121 }