github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/upgradeseries/upgradeseries_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgradeseries_test 5 6 import ( 7 "github.com/golang/mock/gomock" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 "gopkg.in/juju/names.v2" 11 12 "github.com/juju/juju/apiserver/common" 13 "github.com/juju/juju/apiserver/common/mocks" 14 "github.com/juju/juju/apiserver/facades/agent/upgradeseries" 15 "github.com/juju/juju/apiserver/params" 16 apiservertesting "github.com/juju/juju/apiserver/testing" 17 "github.com/juju/juju/core/model" 18 "github.com/juju/juju/state" 19 "github.com/juju/juju/testing" 20 ) 21 22 type upgradeSeriesSuite struct { 23 testing.BaseSuite 24 25 backend *mocks.MockUpgradeSeriesBackend 26 machine *mocks.MockUpgradeSeriesMachine 27 28 entityArgs params.Entities 29 upgradeSeriesStatusArgs params.UpgradeSeriesStatusParams 30 upgradeSeriesStartUnitCompletionArgs params.UpgradeSeriesStartUnitCompletionParam 31 32 api *upgradeseries.API 33 34 machineTag names.MachineTag 35 unitTag names.UnitTag 36 } 37 38 var _ = gc.Suite(&upgradeSeriesSuite{}) 39 40 func (s *upgradeSeriesSuite) SetUpTest(c *gc.C) { 41 s.BaseSuite.SetUpTest(c) 42 43 s.machineTag = names.NewMachineTag("0") 44 s.unitTag = names.NewUnitTag("redis/0") 45 46 s.entityArgs = params.Entities{Entities: []params.Entity{{Tag: s.machineTag.String()}}} 47 s.upgradeSeriesStatusArgs = params.UpgradeSeriesStatusParams{ 48 Params: []params.UpgradeSeriesStatusParam{ 49 { 50 Entity: params.Entity{Tag: s.machineTag.String()}, 51 }, 52 }, 53 } 54 s.upgradeSeriesStartUnitCompletionArgs = params.UpgradeSeriesStartUnitCompletionParam{ 55 Entities: []params.Entity{{Tag: s.machineTag.String()}}, 56 } 57 } 58 59 func (s *upgradeSeriesSuite) TestMachineStatus(c *gc.C) { 60 defer s.arrangeTest(c).Finish() 61 62 s.machine.EXPECT().UpgradeSeriesStatus().Return(model.UpgradeSeriesPrepareCompleted, nil) 63 64 results, err := s.api.MachineStatus(s.entityArgs) 65 c.Assert(err, jc.ErrorIsNil) 66 c.Assert(results, gc.DeepEquals, params.UpgradeSeriesStatusResults{ 67 Results: []params.UpgradeSeriesStatusResult{{Status: model.UpgradeSeriesPrepareCompleted}}, 68 }) 69 } 70 71 func (s *upgradeSeriesSuite) TestSetMachineStatus(c *gc.C) { 72 defer s.arrangeTest(c).Finish() 73 74 s.machine.EXPECT().SetUpgradeSeriesStatus(model.UpgradeSeriesPrepareCompleted, gomock.Any()).Return(nil) 75 76 entity := params.Entity{Tag: s.machineTag.String()} 77 args := params.UpgradeSeriesStatusParams{ 78 Params: []params.UpgradeSeriesStatusParam{{Entity: entity, Status: model.UpgradeSeriesPrepareCompleted}}, 79 } 80 81 results, err := s.api.SetMachineStatus(args) 82 c.Assert(err, jc.ErrorIsNil) 83 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 84 Results: []params.ErrorResult{{}}, 85 }) 86 } 87 88 func (s *upgradeSeriesSuite) TestUpgradeSeriesTarget(c *gc.C) { 89 defer s.arrangeTest(c).Finish() 90 91 s.machine.EXPECT().UpgradeSeriesTarget().Return("bionic", nil) 92 93 results, err := s.api.TargetSeries(s.entityArgs) 94 c.Assert(err, jc.ErrorIsNil) 95 c.Assert(results, gc.DeepEquals, params.StringResults{ 96 Results: []params.StringResult{{Result: "bionic"}}, 97 }) 98 } 99 100 func (s *upgradeSeriesSuite) TestStartUnitCompletion(c *gc.C) { 101 defer s.arrangeTest(c).Finish() 102 103 s.machine.EXPECT().StartUpgradeSeriesUnitCompletion(gomock.Any()).Return(nil) 104 105 results, err := s.api.StartUnitCompletion(s.upgradeSeriesStartUnitCompletionArgs) 106 c.Assert(err, jc.ErrorIsNil) 107 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 108 Results: []params.ErrorResult{{}}, 109 }) 110 } 111 112 func (s *upgradeSeriesSuite) TestUnitsPrepared(c *gc.C) { 113 defer s.arrangeTest(c).Finish() 114 115 s.machine.EXPECT().UpgradeSeriesUnitStatuses().Return(map[string]state.UpgradeSeriesUnitStatus{ 116 "redis/0": {Status: model.UpgradeSeriesPrepareCompleted}, 117 "redis/1": {Status: model.UpgradeSeriesPrepareStarted}, 118 }, nil) 119 120 results, err := s.api.UnitsPrepared(s.entityArgs) 121 c.Assert(err, jc.ErrorIsNil) 122 c.Assert(results, gc.DeepEquals, params.EntitiesResults{ 123 Results: []params.EntitiesResult{{Entities: []params.Entity{{Tag: s.unitTag.String()}}}}, 124 }) 125 } 126 127 func (s *upgradeSeriesSuite) TestUnitsCompleted(c *gc.C) { 128 defer s.arrangeTest(c).Finish() 129 130 s.machine.EXPECT().UpgradeSeriesUnitStatuses().Return(map[string]state.UpgradeSeriesUnitStatus{ 131 "redis/0": {Status: model.UpgradeSeriesCompleted}, 132 "redis/1": {Status: model.UpgradeSeriesCompleteStarted}, 133 }, nil) 134 135 results, err := s.api.UnitsCompleted(s.entityArgs) 136 c.Assert(err, jc.ErrorIsNil) 137 c.Assert(results, gc.DeepEquals, params.EntitiesResults{ 138 Results: []params.EntitiesResult{{Entities: []params.Entity{{Tag: s.unitTag.String()}}}}, 139 }) 140 } 141 142 func (s *upgradeSeriesSuite) TestFinishUpgradeSeriesUpgraded(c *gc.C) { 143 defer s.arrangeTest(c).Finish() 144 145 exp := s.machine.EXPECT() 146 exp.Series().Return("trusty") 147 exp.UpdateMachineSeries("xenial", true).Return(nil) 148 exp.RemoveUpgradeSeriesLock().Return(nil) 149 150 entity := params.Entity{Tag: s.machineTag.String()} 151 args := params.UpdateSeriesArgs{ 152 Args: []params.UpdateSeriesArg{{Entity: entity, Series: "xenial"}}, 153 } 154 155 results, err := s.api.FinishUpgradeSeries(args) 156 c.Assert(err, jc.ErrorIsNil) 157 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 158 Results: []params.ErrorResult{{}}, 159 }) 160 } 161 162 func (s *upgradeSeriesSuite) TestFinishUpgradeSeriesNotUpgraded(c *gc.C) { 163 defer s.arrangeTest(c).Finish() 164 165 exp := s.machine.EXPECT() 166 exp.Series().Return("trusty") 167 exp.RemoveUpgradeSeriesLock().Return(nil) 168 169 entity := params.Entity{Tag: s.machineTag.String()} 170 args := params.UpdateSeriesArgs{ 171 Args: []params.UpdateSeriesArg{{Entity: entity, Series: "trusty"}}, 172 } 173 174 results, err := s.api.FinishUpgradeSeries(args) 175 c.Assert(err, jc.ErrorIsNil) 176 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 177 Results: []params.ErrorResult{{}}, 178 }) 179 } 180 181 func (s *upgradeSeriesSuite) arrangeTest(c *gc.C) *gomock.Controller { 182 ctrl := gomock.NewController(c) 183 184 resources := common.NewResources() 185 authorizer := apiservertesting.FakeAuthorizer{Tag: s.machineTag} 186 187 s.backend = mocks.NewMockUpgradeSeriesBackend(ctrl) 188 s.machine = mocks.NewMockUpgradeSeriesMachine(ctrl) 189 190 s.backend.EXPECT().Machine(s.machineTag.Id()).Return(s.machine, nil) 191 192 var err error 193 s.api, err = upgradeseries.NewUpgradeSeriesAPI(s.backend, resources, authorizer, nil) 194 c.Assert(err, jc.ErrorIsNil) 195 196 return ctrl 197 }