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: ¶ms.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: ¶ms.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 }