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, &params.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, &params.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, &params.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: &params.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: &params.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  }