github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/client/modelmanager/listmodelsummaries_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelmanager_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/names/v5" 11 gitjujutesting "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/apiserver/common" 16 "github.com/juju/juju/apiserver/facades/client/modelmanager" 17 apiservertesting "github.com/juju/juju/apiserver/testing" 18 "github.com/juju/juju/core/permission" 19 "github.com/juju/juju/environs/config" 20 "github.com/juju/juju/environs/context" 21 _ "github.com/juju/juju/provider/azure" 22 "github.com/juju/juju/provider/dummy" 23 _ "github.com/juju/juju/provider/ec2" 24 _ "github.com/juju/juju/provider/maas" 25 _ "github.com/juju/juju/provider/openstack" 26 "github.com/juju/juju/rpc/params" 27 "github.com/juju/juju/state" 28 jujuversion "github.com/juju/juju/version" 29 ) 30 31 type ListModelsWithInfoSuite struct { 32 gitjujutesting.IsolationSuite 33 34 st *mockState 35 36 authoriser apiservertesting.FakeAuthorizer 37 adminUser names.UserTag 38 39 api *modelmanager.ModelManagerAPI 40 callContext context.ProviderCallContext 41 } 42 43 var _ = gc.Suite(&ListModelsWithInfoSuite{}) 44 45 func (s *ListModelsWithInfoSuite) SetUpTest(c *gc.C) { 46 s.IsolationSuite.SetUpTest(c) 47 48 adminUser := "admin" 49 s.adminUser = names.NewUserTag(adminUser) 50 51 s.st = &mockState{ 52 model: s.createModel(c, s.adminUser), 53 } 54 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 55 return []state.ModelSummary{s.st.model.getModelDetails()}, s.st.NextErr() 56 } 57 58 s.authoriser = apiservertesting.FakeAuthorizer{ 59 Tag: s.adminUser, 60 } 61 62 s.callContext = context.NewEmptyCloudCallContext() 63 api, err := modelmanager.NewModelManagerAPI( 64 s.st, &mockState{}, nil, nil, 65 common.NewBlockChecker(s.st), s.authoriser, s.st.model, s.callContext, 66 ) 67 c.Assert(err, jc.ErrorIsNil) 68 s.api = api 69 } 70 71 func (s *ListModelsWithInfoSuite) createModel(c *gc.C, user names.UserTag) *mockModel { 72 attrs := dummy.SampleConfig() 73 attrs["agent-version"] = jujuversion.Current.String() 74 cfg, err := config.New(config.UseDefaults, attrs) 75 c.Assert(err, jc.ErrorIsNil) 76 return &mockModel{ 77 owner: user, 78 cfg: cfg, 79 setCloudCredentialF: func(tag names.CloudCredentialTag) (bool, error) { return false, nil }, 80 } 81 } 82 83 func (s *ListModelsWithInfoSuite) setAPIUser(c *gc.C, user names.UserTag) { 84 s.authoriser.Tag = user 85 modelmanager, err := modelmanager.NewModelManagerAPI( 86 s.st, &mockState{}, nil, nil, 87 common.NewBlockChecker(s.st), s.authoriser, s.st.model, s.callContext, 88 ) 89 c.Assert(err, jc.ErrorIsNil) 90 s.api = modelmanager 91 } 92 93 // TODO (anastasiamac 2017-11-24) add test with migration and SLA 94 95 func (s *ListModelsWithInfoSuite) TestListModelSummaries(c *gc.C) { 96 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 97 c.Assert(err, jc.ErrorIsNil) 98 c.Assert(result, jc.DeepEquals, params.ModelSummaryResults{ 99 Results: []params.ModelSummaryResult{ 100 { 101 Result: ¶ms.ModelSummary{ 102 Name: "only", 103 OwnerTag: s.adminUser.String(), 104 UUID: s.st.ModelUUID(), 105 Type: string(state.ModelTypeIAAS), 106 CloudTag: "some-cloud", 107 CloudRegion: "some-region", 108 CloudCredentialTag: "cloudcred-some-cloud_bob_some-credential", 109 Life: "alive", 110 Status: params.EntityStatus{}, 111 Counts: []params.ModelEntityCount{}, 112 SLA: ¶ms.ModelSLAInfo{"essential", "admin"}, 113 }, 114 }, 115 }, 116 }) 117 } 118 119 func (s *ListModelsWithInfoSuite) TestListModelSummariesV9(c *gc.C) { 120 api := &modelmanager.ModelManagerAPIV9{s.api} 121 result, err := api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 122 c.Assert(err, jc.ErrorIsNil) 123 c.Assert(result, jc.DeepEquals, params.ModelSummaryResults{ 124 Results: []params.ModelSummaryResult{ 125 { 126 Result: ¶ms.ModelSummary{ 127 Name: "only", 128 OwnerTag: s.adminUser.String(), 129 UUID: s.st.ModelUUID(), 130 Type: string(state.ModelTypeIAAS), 131 DefaultSeries: "jammy", 132 CloudTag: "some-cloud", 133 CloudRegion: "some-region", 134 CloudCredentialTag: "cloudcred-some-cloud_bob_some-credential", 135 Life: "alive", 136 Status: params.EntityStatus{}, 137 Counts: []params.ModelEntityCount{}, 138 SLA: ¶ms.ModelSLAInfo{"essential", "admin"}, 139 }, 140 }, 141 }, 142 }) 143 } 144 145 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithUserAccess(c *gc.C) { 146 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 147 summary := s.st.model.getModelDetails() 148 summary.Access = permission.AdminAccess 149 return []state.ModelSummary{summary}, nil 150 } 151 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 152 c.Assert(err, jc.ErrorIsNil) 153 c.Assert(result.Results[0].Result.UserAccess, jc.DeepEquals, params.ModelAdminAccess) 154 } 155 156 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithLastConnected(c *gc.C) { 157 now := time.Now() 158 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 159 summary := s.st.model.getModelDetails() 160 summary.UserLastConnection = &now 161 return []state.ModelSummary{summary}, nil 162 } 163 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 164 c.Assert(err, jc.ErrorIsNil) 165 c.Assert(result.Results[0].Result.UserLastConnection, jc.DeepEquals, &now) 166 } 167 168 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithMachineCount(c *gc.C) { 169 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 170 summary := s.st.model.getModelDetails() 171 summary.MachineCount = int64(64) 172 return []state.ModelSummary{summary}, nil 173 } 174 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 175 c.Assert(err, jc.ErrorIsNil) 176 c.Assert(result.Results[0].Result.Counts[0], jc.DeepEquals, params.ModelEntityCount{params.Machines, 64}) 177 } 178 179 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithCoreCount(c *gc.C) { 180 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 181 summary := s.st.model.getModelDetails() 182 summary.CoreCount = int64(43) 183 return []state.ModelSummary{summary}, nil 184 } 185 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 186 c.Assert(err, jc.ErrorIsNil) 187 c.Assert(result.Results[0].Result.Counts[0], jc.DeepEquals, params.ModelEntityCount{params.Cores, 43}) 188 } 189 190 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithMachineAndUserDetails(c *gc.C) { 191 now := time.Now() 192 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 193 summary := s.st.model.getModelDetails() 194 summary.Access = permission.AdminAccess 195 summary.UserLastConnection = &now 196 summary.MachineCount = int64(10) 197 summary.CoreCount = int64(42) 198 return []state.ModelSummary{summary}, nil 199 } 200 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 201 c.Assert(err, jc.ErrorIsNil) 202 c.Assert(result, jc.DeepEquals, params.ModelSummaryResults{ 203 Results: []params.ModelSummaryResult{ 204 { 205 Result: ¶ms.ModelSummary{ 206 Name: "only", 207 OwnerTag: s.adminUser.String(), 208 UUID: s.st.ModelUUID(), 209 Type: string(state.ModelTypeIAAS), 210 CloudTag: "some-cloud", 211 CloudRegion: "some-region", 212 CloudCredentialTag: "cloudcred-some-cloud_bob_some-credential", 213 Life: "alive", 214 Status: params.EntityStatus{}, 215 SLA: ¶ms.ModelSLAInfo{"essential", "admin"}, 216 UserAccess: params.ModelAdminAccess, 217 UserLastConnection: &now, 218 Counts: []params.ModelEntityCount{ 219 {params.Machines, 10}, 220 {params.Cores, 42}, 221 }, 222 }, 223 }, 224 }, 225 }) 226 } 227 228 func (s *ListModelsWithInfoSuite) TestListModelSummariesDenied(c *gc.C) { 229 user := names.NewUserTag("external@remote") 230 s.setAPIUser(c, user) 231 other := names.NewUserTag("other@remote") 232 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: other.String()}) 233 c.Assert(err, gc.ErrorMatches, "permission denied") 234 } 235 236 func (s *ListModelsWithInfoSuite) TestListModelSummariesInvalidUser(c *gc.C) { 237 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: "invalid"}) 238 c.Assert(err, gc.ErrorMatches, `"invalid" is not a valid tag`) 239 } 240 241 func (s *ListModelsWithInfoSuite) TestListModelSummariesStateError(c *gc.C) { 242 errMsg := "captain error for ModelSummariesForUser" 243 s.st.Stub.SetErrors(errors.New(errMsg)) 244 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 245 c.Assert(err, gc.ErrorMatches, errMsg) 246 } 247 248 func (s *ListModelsWithInfoSuite) TestListModelSummariesNoModelsForUser(c *gc.C) { 249 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 250 return []state.ModelSummary{}, nil 251 } 252 results, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 253 c.Assert(err, jc.ErrorIsNil) 254 c.Assert(results.Results, gc.HasLen, 0) 255 }