github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 gitjujutesting "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/names.v2" 14 15 "github.com/juju/juju/apiserver/facades/client/modelmanager" 16 "github.com/juju/juju/apiserver/params" 17 apiservertesting "github.com/juju/juju/apiserver/testing" 18 "github.com/juju/juju/environs/config" 19 "github.com/juju/juju/environs/context" 20 "github.com/juju/juju/permission" 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/joyent" 25 _ "github.com/juju/juju/provider/maas" 26 _ "github.com/juju/juju/provider/openstack" 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.NewCloudCallContext() 63 api, err := modelmanager.NewModelManagerAPI(s.st, &mockState{}, nil, nil, s.authoriser, s.st.model, s.callContext) 64 c.Assert(err, jc.ErrorIsNil) 65 s.api = api 66 } 67 68 func (s *ListModelsWithInfoSuite) createModel(c *gc.C, user names.UserTag) *mockModel { 69 attrs := dummy.SampleConfig() 70 attrs["agent-version"] = jujuversion.Current.String() 71 cfg, err := config.New(config.UseDefaults, attrs) 72 c.Assert(err, jc.ErrorIsNil) 73 return &mockModel{ 74 owner: user, 75 cfg: cfg, 76 setCloudCredentialF: func(tag names.CloudCredentialTag) (bool, error) { return false, nil }, 77 } 78 } 79 80 func (s *ListModelsWithInfoSuite) setAPIUser(c *gc.C, user names.UserTag) { 81 s.authoriser.Tag = user 82 modelmanager, err := modelmanager.NewModelManagerAPI(s.st, &mockState{}, nil, nil, s.authoriser, s.st.model, s.callContext) 83 c.Assert(err, jc.ErrorIsNil) 84 s.api = modelmanager 85 } 86 87 // TODO (anastasiamac 2017-11-24) add test with migration and SLA 88 89 func (s *ListModelsWithInfoSuite) TestListModelSummaries(c *gc.C) { 90 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 91 c.Assert(err, jc.ErrorIsNil) 92 c.Assert(result, jc.DeepEquals, params.ModelSummaryResults{ 93 Results: []params.ModelSummaryResult{ 94 { 95 Result: ¶ms.ModelSummary{ 96 Name: "only", 97 OwnerTag: s.adminUser.String(), 98 UUID: s.st.ModelUUID(), 99 Type: string(state.ModelTypeIAAS), 100 CloudTag: "some-cloud", 101 CloudRegion: "some-region", 102 CloudCredentialTag: "cloudcred-some-cloud_bob_some-credential", 103 Life: "alive", 104 Status: params.EntityStatus{}, 105 Counts: []params.ModelEntityCount{}, 106 SLA: ¶ms.ModelSLAInfo{"essential", "admin"}, 107 }, 108 }, 109 }, 110 }) 111 } 112 113 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithUserAccess(c *gc.C) { 114 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 115 summary := s.st.model.getModelDetails() 116 summary.Access = permission.AdminAccess 117 return []state.ModelSummary{summary}, nil 118 } 119 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 120 c.Assert(err, jc.ErrorIsNil) 121 c.Assert(result.Results[0].Result.UserAccess, jc.DeepEquals, params.ModelAdminAccess) 122 } 123 124 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithLastConnected(c *gc.C) { 125 now := time.Now() 126 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 127 summary := s.st.model.getModelDetails() 128 summary.UserLastConnection = &now 129 return []state.ModelSummary{summary}, nil 130 } 131 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 132 c.Assert(err, jc.ErrorIsNil) 133 c.Assert(result.Results[0].Result.UserLastConnection, jc.DeepEquals, &now) 134 } 135 136 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithMachineCount(c *gc.C) { 137 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 138 summary := s.st.model.getModelDetails() 139 summary.MachineCount = int64(64) 140 return []state.ModelSummary{summary}, nil 141 } 142 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 143 c.Assert(err, jc.ErrorIsNil) 144 c.Assert(result.Results[0].Result.Counts[0], jc.DeepEquals, params.ModelEntityCount{params.Machines, 64}) 145 } 146 147 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithCoreCount(c *gc.C) { 148 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 149 summary := s.st.model.getModelDetails() 150 summary.CoreCount = int64(43) 151 return []state.ModelSummary{summary}, nil 152 } 153 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 154 c.Assert(err, jc.ErrorIsNil) 155 c.Assert(result.Results[0].Result.Counts[0], jc.DeepEquals, params.ModelEntityCount{params.Cores, 43}) 156 } 157 158 func (s *ListModelsWithInfoSuite) TestListModelSummariesWithMachineAndUserDetails(c *gc.C) { 159 now := time.Now() 160 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 161 summary := s.st.model.getModelDetails() 162 summary.Access = permission.AdminAccess 163 summary.UserLastConnection = &now 164 summary.MachineCount = int64(10) 165 summary.CoreCount = int64(42) 166 return []state.ModelSummary{summary}, nil 167 } 168 result, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 169 c.Assert(err, jc.ErrorIsNil) 170 c.Assert(result, jc.DeepEquals, params.ModelSummaryResults{ 171 Results: []params.ModelSummaryResult{ 172 { 173 Result: ¶ms.ModelSummary{ 174 Name: "only", 175 OwnerTag: s.adminUser.String(), 176 UUID: s.st.ModelUUID(), 177 Type: string(state.ModelTypeIAAS), 178 CloudTag: "some-cloud", 179 CloudRegion: "some-region", 180 CloudCredentialTag: "cloudcred-some-cloud_bob_some-credential", 181 Life: "alive", 182 Status: params.EntityStatus{}, 183 SLA: ¶ms.ModelSLAInfo{"essential", "admin"}, 184 UserAccess: params.ModelAdminAccess, 185 UserLastConnection: &now, 186 Counts: []params.ModelEntityCount{ 187 {params.Machines, 10}, 188 {params.Cores, 42}, 189 }, 190 }, 191 }, 192 }, 193 }) 194 } 195 196 func (s *ListModelsWithInfoSuite) TestListModelSummariesDenied(c *gc.C) { 197 user := names.NewUserTag("external@remote") 198 s.setAPIUser(c, user) 199 other := names.NewUserTag("other@remote") 200 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: other.String()}) 201 c.Assert(err, gc.ErrorMatches, "permission denied") 202 } 203 204 func (s *ListModelsWithInfoSuite) TestListModelSummariesInvalidUser(c *gc.C) { 205 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: "invalid"}) 206 c.Assert(err, gc.ErrorMatches, `"invalid" is not a valid tag`) 207 } 208 209 func (s *ListModelsWithInfoSuite) TestListModelSummariesStateError(c *gc.C) { 210 errMsg := "captain error for ModelSummariesForUser" 211 s.st.Stub.SetErrors(errors.New(errMsg)) 212 _, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 213 c.Assert(err, gc.ErrorMatches, errMsg) 214 } 215 216 func (s *ListModelsWithInfoSuite) TestListModelSummariesNoModelsForUser(c *gc.C) { 217 s.st.modelDetailsForUser = func() ([]state.ModelSummary, error) { 218 return []state.ModelSummary{}, nil 219 } 220 results, err := s.api.ListModelSummaries(params.ModelSummariesRequest{UserTag: s.adminUser.String()}) 221 c.Assert(err, jc.ErrorIsNil) 222 c.Assert(results.Results, gc.HasLen, 0) 223 }