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