github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/modelmanager/modelmanager_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelmanager_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 "github.com/juju/utils" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/juju/names.v2" 11 12 basetesting "github.com/juju/juju/api/base/testing" 13 "github.com/juju/juju/api/modelmanager" 14 "github.com/juju/juju/apiserver/params" 15 "github.com/juju/juju/environs/config" 16 jujutesting "github.com/juju/juju/juju/testing" 17 "github.com/juju/juju/testing" 18 "github.com/juju/juju/testing/factory" 19 ) 20 21 type modelmanagerSuite struct { 22 jujutesting.JujuConnSuite 23 } 24 25 var _ = gc.Suite(&modelmanagerSuite{}) 26 27 func (s *modelmanagerSuite) SetUpTest(c *gc.C) { 28 s.JujuConnSuite.SetUpTest(c) 29 } 30 31 func (s *modelmanagerSuite) OpenAPI(c *gc.C) *modelmanager.Client { 32 return modelmanager.NewClient(s.OpenControllerAPI(c)) 33 } 34 35 func (s *modelmanagerSuite) TestCreateModelBadUser(c *gc.C) { 36 modelManager := s.OpenAPI(c) 37 defer modelManager.Close() 38 _, err := modelManager.CreateModel("mymodel", "not a user", "", "", names.CloudCredentialTag{}, nil) 39 c.Assert(err, gc.ErrorMatches, `invalid owner name "not a user"`) 40 } 41 42 func (s *modelmanagerSuite) TestCreateModel(c *gc.C) { 43 s.testCreateModel(c, "dummy", "dummy-region") 44 } 45 46 func (s *modelmanagerSuite) TestCreateModelCloudDefaultRegion(c *gc.C) { 47 s.testCreateModel(c, "dummy", "") 48 } 49 50 func (s *modelmanagerSuite) TestCreateModelDefaultCloudAndRegion(c *gc.C) { 51 s.testCreateModel(c, "", "") 52 } 53 54 func (s *modelmanagerSuite) testCreateModel(c *gc.C, cloud, region string) { 55 modelManager := s.OpenAPI(c) 56 defer modelManager.Close() 57 user := s.Factory.MakeUser(c, nil) 58 owner := user.UserTag().Canonical() 59 newModel, err := modelManager.CreateModel("new-model", owner, cloud, region, names.CloudCredentialTag{}, map[string]interface{}{ 60 "authorized-keys": "ssh-key", 61 // dummy needs controller 62 "controller": false, 63 }) 64 c.Assert(err, jc.ErrorIsNil) 65 c.Assert(newModel.Name, gc.Equals, "new-model") 66 c.Assert(newModel.Owner, gc.Equals, user.String()) 67 c.Assert(newModel.CloudRegion, gc.Equals, "dummy-region") 68 c.Assert(utils.IsValidUUIDString(newModel.UUID), jc.IsTrue) 69 } 70 71 func (s *modelmanagerSuite) TestListModelsBadUser(c *gc.C) { 72 modelManager := s.OpenAPI(c) 73 defer modelManager.Close() 74 _, err := modelManager.ListModels("not a user") 75 c.Assert(err, gc.ErrorMatches, `invalid user name "not a user"`) 76 } 77 78 func (s *modelmanagerSuite) TestListModels(c *gc.C) { 79 owner := names.NewUserTag("user@remote") 80 s.Factory.MakeModel(c, &factory.ModelParams{ 81 Name: "first", Owner: owner}).Close() 82 s.Factory.MakeModel(c, &factory.ModelParams{ 83 Name: "second", Owner: owner}).Close() 84 85 modelManager := s.OpenAPI(c) 86 defer modelManager.Close() 87 models, err := modelManager.ListModels("user@remote") 88 c.Assert(err, jc.ErrorIsNil) 89 c.Assert(models, gc.HasLen, 2) 90 91 modelNames := []string{models[0].Name, models[1].Name} 92 c.Assert(modelNames, jc.DeepEquals, []string{"first", "second"}) 93 ownerNames := []string{models[0].Owner, models[1].Owner} 94 c.Assert(ownerNames, jc.DeepEquals, []string{"user@remote", "user@remote"}) 95 } 96 97 func (s *modelmanagerSuite) TestDestroyModel(c *gc.C) { 98 modelManager := s.OpenAPI(c) 99 defer modelManager.Close() 100 var called bool 101 modelmanager.PatchFacadeCall(&s.CleanupSuite, modelManager, 102 func(req string, args interface{}, resp interface{}) error { 103 c.Assert(req, gc.Equals, "DestroyModels") 104 c.Assert(args, jc.DeepEquals, params.Entities{ 105 Entities: []params.Entity{{testing.ModelTag.String()}}, 106 }) 107 results := resp.(*params.ErrorResults) 108 *results = params.ErrorResults{ 109 Results: []params.ErrorResult{{}}, 110 } 111 called = true 112 return nil 113 }) 114 115 err := modelManager.DestroyModel(testing.ModelTag) 116 c.Assert(err, jc.ErrorIsNil) 117 c.Assert(called, jc.IsTrue) 118 } 119 120 func (s *modelmanagerSuite) TestModelDefaults(c *gc.C) { 121 apiCaller := basetesting.APICallerFunc( 122 func(objType string, 123 version int, 124 id, request string, 125 a, result interface{}, 126 ) error { 127 c.Check(objType, gc.Equals, "ModelManager") 128 c.Check(id, gc.Equals, "") 129 c.Check(request, gc.Equals, "ModelDefaults") 130 c.Check(a, gc.IsNil) 131 c.Assert(result, gc.FitsTypeOf, ¶ms.ModelDefaultsResult{}) 132 results := result.(*params.ModelDefaultsResult) 133 results.Config = map[string]params.ModelDefaults{ 134 "foo": {"bar", "model", []params.RegionDefaults{{ 135 "dummy-region", 136 "dummy-value"}}}, 137 } 138 return nil 139 }, 140 ) 141 client := modelmanager.NewClient(apiCaller) 142 result, err := client.ModelDefaults() 143 c.Assert(err, jc.ErrorIsNil) 144 145 c.Assert(result, jc.DeepEquals, config.ModelDefaultAttributes{ 146 "foo": {"bar", "model", []config.RegionDefaultValue{{ 147 "dummy-region", 148 "dummy-value"}}}, 149 }) 150 } 151 152 func (s *modelmanagerSuite) TestSetModelDefaults(c *gc.C) { 153 called := false 154 apiCaller := basetesting.APICallerFunc( 155 func(objType string, 156 version int, 157 id, request string, 158 a, result interface{}, 159 ) error { 160 c.Check(objType, gc.Equals, "ModelManager") 161 c.Check(id, gc.Equals, "") 162 c.Check(request, gc.Equals, "SetModelDefaults") 163 c.Check(a, jc.DeepEquals, params.SetModelDefaults{ 164 Config: []params.ModelDefaultValues{{ 165 CloudTag: "cloud-mycloud", 166 CloudRegion: "region", 167 Config: map[string]interface{}{ 168 "some-name": "value", 169 "other-name": true, 170 }, 171 }}}) 172 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 173 *(result.(*params.ErrorResults)) = params.ErrorResults{ 174 Results: []params.ErrorResult{{Error: nil}}, 175 } 176 called = true 177 return nil 178 }, 179 ) 180 client := modelmanager.NewClient(apiCaller) 181 err := client.SetModelDefaults("mycloud", "region", map[string]interface{}{ 182 "some-name": "value", 183 "other-name": true, 184 }) 185 c.Assert(err, jc.ErrorIsNil) 186 c.Assert(called, jc.IsTrue) 187 } 188 189 func (s *modelmanagerSuite) TestUnsetModelDefaults(c *gc.C) { 190 called := false 191 apiCaller := basetesting.APICallerFunc( 192 func(objType string, 193 version int, 194 id, request string, 195 a, result interface{}, 196 ) error { 197 c.Check(objType, gc.Equals, "ModelManager") 198 c.Check(id, gc.Equals, "") 199 c.Check(request, gc.Equals, "UnsetModelDefaults") 200 c.Check(a, jc.DeepEquals, params.UnsetModelDefaults{ 201 Keys: []params.ModelUnsetKeys{{ 202 CloudTag: "cloud-mycloud", 203 CloudRegion: "region", 204 Keys: []string{"foo", "bar"}, 205 }}}) 206 c.Assert(result, gc.FitsTypeOf, ¶ms.ErrorResults{}) 207 *(result.(*params.ErrorResults)) = params.ErrorResults{ 208 Results: []params.ErrorResult{{Error: nil}}, 209 } 210 called = true 211 return nil 212 }, 213 ) 214 client := modelmanager.NewClient(apiCaller) 215 err := client.UnsetModelDefaults("mycloud", "region", "foo", "bar") 216 c.Assert(err, jc.ErrorIsNil) 217 c.Assert(called, jc.IsTrue) 218 } 219 220 type dumpModelSuite struct { 221 testing.BaseSuite 222 } 223 224 var _ = gc.Suite(&dumpModelSuite{}) 225 226 func (s *dumpModelSuite) TestDumpModel(c *gc.C) { 227 expected := map[string]interface{}{ 228 "model-uuid": "some-uuid", 229 "other-key": "special", 230 } 231 results := params.MapResults{Results: []params.MapResult{{ 232 Result: expected, 233 }}} 234 apiCaller := basetesting.APICallerFunc( 235 func(objType string, version int, id, request string, args, result interface{}) error { 236 c.Check(objType, gc.Equals, "ModelManager") 237 c.Check(request, gc.Equals, "DumpModels") 238 in, ok := args.(params.Entities) 239 c.Assert(ok, jc.IsTrue) 240 c.Assert(in, gc.DeepEquals, params.Entities{[]params.Entity{{testing.ModelTag.String()}}}) 241 res, ok := result.(*params.MapResults) 242 c.Assert(ok, jc.IsTrue) 243 *res = results 244 return nil 245 }) 246 client := modelmanager.NewClient(apiCaller) 247 out, err := client.DumpModel(testing.ModelTag) 248 c.Assert(err, jc.ErrorIsNil) 249 c.Assert(out, jc.DeepEquals, expected) 250 } 251 252 func (s *dumpModelSuite) TestDumpModelError(c *gc.C) { 253 results := params.MapResults{Results: []params.MapResult{{ 254 Error: ¶ms.Error{Message: "fake error"}, 255 }}} 256 apiCaller := basetesting.APICallerFunc( 257 func(objType string, version int, id, request string, args, result interface{}) error { 258 res, ok := result.(*params.MapResults) 259 c.Assert(ok, jc.IsTrue) 260 *res = results 261 return nil 262 }) 263 client := modelmanager.NewClient(apiCaller) 264 out, err := client.DumpModel(testing.ModelTag) 265 c.Assert(err, gc.ErrorMatches, "fake error") 266 c.Assert(out, gc.IsNil) 267 } 268 269 func (s *dumpModelSuite) TestDumpModelDB(c *gc.C) { 270 expected := map[string]interface{}{ 271 "models": []map[string]interface{}{{ 272 "name": "admin", 273 "uuid": "some-uuid", 274 }}, 275 "machines": []map[string]interface{}{{ 276 "id": "0", 277 "life": 0, 278 }}, 279 } 280 results := params.MapResults{Results: []params.MapResult{{ 281 Result: expected, 282 }}} 283 apiCaller := basetesting.APICallerFunc( 284 func(objType string, version int, id, request string, args, result interface{}) error { 285 c.Check(objType, gc.Equals, "ModelManager") 286 c.Check(request, gc.Equals, "DumpModelsDB") 287 in, ok := args.(params.Entities) 288 c.Assert(ok, jc.IsTrue) 289 c.Assert(in, gc.DeepEquals, params.Entities{[]params.Entity{{testing.ModelTag.String()}}}) 290 res, ok := result.(*params.MapResults) 291 c.Assert(ok, jc.IsTrue) 292 *res = results 293 return nil 294 }) 295 client := modelmanager.NewClient(apiCaller) 296 out, err := client.DumpModelDB(testing.ModelTag) 297 c.Assert(err, jc.ErrorIsNil) 298 c.Assert(out, jc.DeepEquals, expected) 299 } 300 301 func (s *dumpModelSuite) TestDumpModelDBError(c *gc.C) { 302 results := params.MapResults{Results: []params.MapResult{{ 303 Error: ¶ms.Error{Message: "fake error"}, 304 }}} 305 apiCaller := basetesting.APICallerFunc( 306 func(objType string, version int, id, request string, args, result interface{}) error { 307 res, ok := result.(*params.MapResults) 308 c.Assert(ok, jc.IsTrue) 309 *res = results 310 return nil 311 }) 312 client := modelmanager.NewClient(apiCaller) 313 out, err := client.DumpModelDB(testing.ModelTag) 314 c.Assert(err, gc.ErrorMatches, "fake error") 315 c.Assert(out, gc.IsNil) 316 }