github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/modelgeneration/modelgeneration_test.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package modelgeneration_test
     5  
     6  import (
     7  	"github.com/golang/mock/gomock"
     8  	"github.com/juju/errors"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	facademocks "github.com/juju/juju/apiserver/facade/mocks"
    14  	"github.com/juju/juju/apiserver/facades/client/modelgeneration"
    15  	"github.com/juju/juju/apiserver/facades/client/modelgeneration/mocks"
    16  	"github.com/juju/juju/apiserver/params"
    17  )
    18  
    19  var _ = gc.Suite(&modelGenerationSuite{})
    20  
    21  type modelGenerationSuite struct {
    22  	modelUUID string
    23  
    24  	api *modelgeneration.ModelGenerationAPI
    25  }
    26  
    27  func (s *modelGenerationSuite) SetUpSuite(c *gc.C) {
    28  	s.modelUUID = "deadbeef-abcd-4fd2-967d-db9663db7bea"
    29  }
    30  
    31  func (s *modelGenerationSuite) TearDownTest(c *gc.C) {
    32  	s.api = nil
    33  }
    34  
    35  // TODO (hml) 17-jan-2019
    36  // Add more explicit permissions tests once that requirement is ironed out.
    37  
    38  func (s *modelGenerationSuite) TestAddGeneration(c *gc.C) {
    39  	defer s.setupModelGenerationAPI(c, func(_ *gomock.Controller, mockModel *mocks.MockGenerationModel) {
    40  		mExp := mockModel.EXPECT()
    41  		mExp.AddGeneration().Return(nil)
    42  	}).Finish()
    43  
    44  	result, err := s.api.AddGeneration(params.Entity{Tag: names.NewModelTag(s.modelUUID).String()})
    45  	c.Assert(err, jc.ErrorIsNil)
    46  	c.Assert(result.Error, gc.IsNil)
    47  }
    48  
    49  func (s *modelGenerationSuite) TestHasNextGeneration(c *gc.C) {
    50  	defer s.setupModelGenerationAPI(c, func(_ *gomock.Controller, mockModel *mocks.MockGenerationModel) {
    51  		mockModel.EXPECT().HasNextGeneration().Return(true, nil)
    52  	}).Finish()
    53  
    54  	result, err := s.api.HasNextGeneration(params.Entity{Tag: names.NewModelTag(s.modelUUID).String()})
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	c.Assert(result.Error, gc.IsNil)
    57  	c.Check(result.Result, jc.IsTrue)
    58  }
    59  
    60  func (s *modelGenerationSuite) TestAdvanceGenerationErrorNoAutoComplete(c *gc.C) {
    61  	arg := params.AdvanceGenerationArg{
    62  		Model: params.Entity{Tag: names.NewModelTag(s.modelUUID).String()},
    63  		Entities: []params.Entity{
    64  			{Tag: names.NewUnitTag("mysql/0").String()},
    65  			{Tag: names.NewApplicationTag("ghost").String()},
    66  			{Tag: names.NewMachineTag("7").String()},
    67  		},
    68  	}
    69  
    70  	defer s.setupModelGenerationAPI(c, func(ctrl *gomock.Controller, mockModel *mocks.MockGenerationModel) {
    71  		mockGeneration := mocks.NewMockGeneration(ctrl)
    72  		gExp := mockGeneration.EXPECT()
    73  		gExp.AssignAllUnits("ghost").Return(nil)
    74  		gExp.AssignUnit("mysql/0").Return(nil)
    75  		gExp.AutoComplete().Return(false, nil)
    76  		gExp.Refresh().Return(nil).Times(3)
    77  
    78  		mExp := mockModel.EXPECT()
    79  		mExp.NextGeneration().Return(mockGeneration, nil)
    80  	}).Finish()
    81  
    82  	result, err := s.api.AdvanceGeneration(arg)
    83  	c.Assert(err, jc.ErrorIsNil)
    84  	c.Check(result.AdvanceResults.Results, gc.DeepEquals, []params.ErrorResult{
    85  		{Error: nil},
    86  		{Error: nil},
    87  		{Error: &params.Error{Message: "expected names.UnitTag or names.ApplicationTag, got names.MachineTag"}},
    88  	})
    89  	c.Check(result.CompleteResult, gc.DeepEquals, params.BoolResult{})
    90  }
    91  
    92  func (s *modelGenerationSuite) TestAdvanceGenerationSuccessAutoComplete(c *gc.C) {
    93  	arg := params.AdvanceGenerationArg{
    94  		Model: params.Entity{Tag: names.NewModelTag(s.modelUUID).String()},
    95  		Entities: []params.Entity{
    96  			{Tag: names.NewUnitTag("mysql/0").String()},
    97  			{Tag: names.NewApplicationTag("ghost").String()},
    98  		},
    99  	}
   100  
   101  	defer s.setupModelGenerationAPI(c, func(ctrl *gomock.Controller, mockModel *mocks.MockGenerationModel) {
   102  		mockGeneration := mocks.NewMockGeneration(ctrl)
   103  		gExp := mockGeneration.EXPECT()
   104  		gExp.AssignAllUnits("ghost").Return(nil)
   105  		gExp.AssignUnit("mysql/0").Return(nil)
   106  		gExp.AutoComplete().Return(true, nil)
   107  		gExp.Refresh().Return(nil).Times(2)
   108  
   109  		mExp := mockModel.EXPECT()
   110  		mExp.NextGeneration().Return(mockGeneration, nil)
   111  	}).Finish()
   112  
   113  	result, err := s.api.AdvanceGeneration(arg)
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	c.Check(result.AdvanceResults.Results, gc.DeepEquals, []params.ErrorResult{
   116  		{Error: nil},
   117  		{Error: nil},
   118  	})
   119  	c.Check(result.CompleteResult, gc.DeepEquals, params.BoolResult{Result: true})
   120  }
   121  
   122  func (s *modelGenerationSuite) TestCancelGeneration(c *gc.C) {
   123  	defer s.setupModelGenerationAPI(c, func(ctrl *gomock.Controller, mockModel *mocks.MockGenerationModel) {
   124  		mockGeneration := mocks.NewMockGeneration(ctrl)
   125  		gExp := mockGeneration.EXPECT()
   126  		gExp.MakeCurrent().Return(nil)
   127  
   128  		mExp := mockModel.EXPECT()
   129  		mExp.NextGeneration().Return(mockGeneration, nil)
   130  	}).Finish()
   131  
   132  	result, err := s.api.CancelGeneration(params.Entity{Tag: names.NewModelTag(s.modelUUID).String()})
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Assert(result, gc.DeepEquals, params.ErrorResult{Error: nil})
   135  }
   136  
   137  func (s *modelGenerationSuite) TestCancelGenerationCanNotMakeCurrent(c *gc.C) {
   138  	errMsg := "cannot cancel generation, there are units behind a generation: riak/0"
   139  
   140  	defer s.setupModelGenerationAPI(c, func(ctrl *gomock.Controller, mockModel *mocks.MockGenerationModel) {
   141  		mockGeneration := mocks.NewMockGeneration(ctrl)
   142  		gExp := mockGeneration.EXPECT()
   143  		gExp.MakeCurrent().Return(errors.New(errMsg))
   144  
   145  		mExp := mockModel.EXPECT()
   146  		mExp.NextGeneration().Return(mockGeneration, nil)
   147  	}).Finish()
   148  
   149  	result, err := s.api.CancelGeneration(params.Entity{Tag: names.NewModelTag(s.modelUUID).String()})
   150  	c.Assert(err, jc.ErrorIsNil)
   151  	c.Assert(result, gc.DeepEquals, params.ErrorResult{Error: &params.Error{Message: errMsg}})
   152  }
   153  
   154  type setupFunc func(*gomock.Controller, *mocks.MockGenerationModel)
   155  
   156  func (s *modelGenerationSuite) setupModelGenerationAPI(c *gc.C, fn setupFunc) *gomock.Controller {
   157  	ctrl := gomock.NewController(c)
   158  
   159  	mockState := mocks.NewMockModelGenerationState(ctrl)
   160  	sExp := mockState.EXPECT()
   161  	sExp.ControllerTag().Return(names.NewControllerTag(s.modelUUID))
   162  
   163  	mockModel := mocks.NewMockGenerationModel(ctrl)
   164  
   165  	mockAuthorizer := facademocks.NewMockAuthorizer(ctrl)
   166  	aExp := mockAuthorizer.EXPECT()
   167  	aExp.HasPermission(gomock.Any(), gomock.Any()).Return(true, nil).AnyTimes()
   168  	aExp.GetAuthTag().Return(names.NewUserTag("testing"))
   169  	aExp.AuthClient().Return(true)
   170  
   171  	fn(ctrl, mockModel)
   172  
   173  	var err error
   174  	s.api, err = modelgeneration.NewModelGenerationAPI(mockState, mockAuthorizer, mockModel)
   175  	c.Assert(err, jc.ErrorIsNil)
   176  
   177  	return ctrl
   178  }