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