github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/retrystrategy/retrystrategy_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Copyright 2016 Cloudbase Solutions 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package retrystrategy_test 6 7 import ( 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/common" 12 "github.com/juju/juju/apiserver/facades/agent/retrystrategy" 13 "github.com/juju/juju/apiserver/params" 14 apiservertesting "github.com/juju/juju/apiserver/testing" 15 jujutesting "github.com/juju/juju/juju/testing" 16 "github.com/juju/juju/state" 17 statetesting "github.com/juju/juju/state/testing" 18 jujufactory "github.com/juju/juju/testing/factory" 19 ) 20 21 var _ = gc.Suite(&retryStrategySuite{}) 22 23 type retryStrategySuite struct { 24 jujutesting.JujuConnSuite 25 26 authorizer apiservertesting.FakeAuthorizer 27 resources *common.Resources 28 29 unit *state.Unit 30 31 strategy retrystrategy.RetryStrategy 32 } 33 34 var tagsTests = []struct { 35 tag string 36 expectedErr string 37 }{ 38 {"user-admin", "permission denied"}, 39 {"unit-wut-4", "permission denied"}, 40 {"definitelynotatag", `"definitelynotatag" is not a valid tag`}, 41 {"machine-5", "permission denied"}, 42 } 43 44 func (s *retryStrategySuite) SetUpTest(c *gc.C) { 45 s.JujuConnSuite.SetUpTest(c) 46 s.unit = s.Factory.MakeUnit(c, nil) 47 48 // Create a FakeAuthorizer so we can check permissions, 49 // set up assuming unit 0 has logged in. 50 s.authorizer = apiservertesting.FakeAuthorizer{ 51 Tag: s.unit.UnitTag(), 52 } 53 54 // Create the resource registry separately to track invocations to 55 // Register. 56 s.resources = common.NewResources() 57 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 58 59 strategy, err := retrystrategy.NewRetryStrategyAPI(s.State, s.resources, s.authorizer) 60 c.Assert(err, jc.ErrorIsNil) 61 s.strategy = strategy 62 } 63 64 func (s *retryStrategySuite) TestRetryStrategyUnauthenticated(c *gc.C) { 65 svc, err := s.unit.Application() 66 c.Assert(err, jc.ErrorIsNil) 67 otherUnit := s.Factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc}) 68 args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}} 69 70 res, err := s.strategy.RetryStrategy(args) 71 c.Assert(err, jc.ErrorIsNil) 72 c.Assert(res.Results, gc.HasLen, 1) 73 c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied") 74 c.Assert(res.Results[0].Result, gc.IsNil) 75 } 76 77 func (s *retryStrategySuite) TestRetryStrategyBadTag(c *gc.C) { 78 args := params.Entities{Entities: make([]params.Entity, len(tagsTests))} 79 for i, t := range tagsTests { 80 args.Entities[i] = params.Entity{Tag: t.tag} 81 } 82 res, err := s.strategy.RetryStrategy(args) 83 c.Assert(err, jc.ErrorIsNil) 84 c.Assert(res.Results, gc.HasLen, len(tagsTests)) 85 for i, r := range res.Results { 86 c.Logf("result %d", i) 87 c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr) 88 c.Assert(res.Results[i].Result, gc.IsNil) 89 } 90 } 91 92 func (s *retryStrategySuite) TestRetryStrategyUnit(c *gc.C) { 93 s.assertRetryStrategy(c, s.unit.Tag().String()) 94 } 95 96 func (s *retryStrategySuite) TestRetryStrategyApplication(c *gc.C) { 97 app := s.Factory.MakeApplication(c, &jujufactory.ApplicationParams{Name: "app"}) 98 s.authorizer = apiservertesting.FakeAuthorizer{ 99 Tag: app.Tag(), 100 } 101 102 strategy, err := retrystrategy.NewRetryStrategyAPI(s.State, s.resources, s.authorizer) 103 c.Assert(err, jc.ErrorIsNil) 104 s.strategy = strategy 105 106 s.assertRetryStrategy(c, app.Tag().String()) 107 } 108 109 func (s *retryStrategySuite) assertRetryStrategy(c *gc.C, tag string) { 110 expected := ¶ms.RetryStrategy{ 111 ShouldRetry: true, 112 MinRetryTime: retrystrategy.MinRetryTime, 113 MaxRetryTime: retrystrategy.MaxRetryTime, 114 JitterRetryTime: retrystrategy.JitterRetryTime, 115 RetryTimeFactor: retrystrategy.RetryTimeFactor, 116 } 117 args := params.Entities{Entities: []params.Entity{{Tag: tag}}} 118 r, err := s.strategy.RetryStrategy(args) 119 c.Assert(err, jc.ErrorIsNil) 120 c.Assert(r.Results, gc.HasLen, 1) 121 c.Assert(r.Results[0].Error, gc.IsNil) 122 c.Assert(r.Results[0].Result, jc.DeepEquals, expected) 123 124 s.setRetryStrategy(c, false) 125 expected.ShouldRetry = false 126 127 r, err = s.strategy.RetryStrategy(args) 128 c.Assert(err, jc.ErrorIsNil) 129 c.Assert(r.Results, gc.HasLen, 1) 130 c.Assert(r.Results[0].Error, gc.IsNil) 131 c.Assert(r.Results[0].Result, jc.DeepEquals, expected) 132 } 133 134 func (s *retryStrategySuite) setRetryStrategy(c *gc.C, automaticallyRetryHooks bool) { 135 err := s.Model.UpdateModelConfig(map[string]interface{}{"automatically-retry-hooks": automaticallyRetryHooks}, nil) 136 c.Assert(err, jc.ErrorIsNil) 137 modelConfig, err := s.Model.ModelConfig() 138 c.Assert(err, jc.ErrorIsNil) 139 c.Assert(modelConfig.AutomaticallyRetryHooks(), gc.Equals, automaticallyRetryHooks) 140 } 141 142 func (s *retryStrategySuite) TestWatchRetryStrategyUnauthenticated(c *gc.C) { 143 svc, err := s.unit.Application() 144 c.Assert(err, jc.ErrorIsNil) 145 otherUnit := s.Factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc}) 146 args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}} 147 148 res, err := s.strategy.WatchRetryStrategy(args) 149 c.Assert(err, jc.ErrorIsNil) 150 c.Assert(res.Results, gc.HasLen, 1) 151 c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied") 152 c.Assert(res.Results[0].NotifyWatcherId, gc.Equals, "") 153 } 154 155 func (s *retryStrategySuite) TestWatchRetryStrategyBadTag(c *gc.C) { 156 args := params.Entities{Entities: make([]params.Entity, len(tagsTests))} 157 for i, t := range tagsTests { 158 args.Entities[i] = params.Entity{Tag: t.tag} 159 } 160 res, err := s.strategy.WatchRetryStrategy(args) 161 c.Assert(err, jc.ErrorIsNil) 162 c.Assert(res.Results, gc.HasLen, len(tagsTests)) 163 for i, r := range res.Results { 164 c.Logf("result %d", i) 165 c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr) 166 c.Assert(res.Results[i].NotifyWatcherId, gc.Equals, "") 167 } 168 } 169 170 func (s *retryStrategySuite) TestWatchRetryStrategy(c *gc.C) { 171 c.Assert(s.resources.Count(), gc.Equals, 0) 172 173 args := params.Entities{Entities: []params.Entity{ 174 {Tag: s.unit.UnitTag().String()}, 175 {Tag: "unit-foo-42"}, 176 }} 177 r, err := s.strategy.WatchRetryStrategy(args) 178 c.Assert(err, jc.ErrorIsNil) 179 c.Assert(r, gc.DeepEquals, params.NotifyWatchResults{ 180 Results: []params.NotifyWatchResult{ 181 {NotifyWatcherId: "1"}, 182 {Error: apiservertesting.ErrUnauthorized}, 183 }, 184 }) 185 186 c.Assert(s.resources.Count(), gc.Equals, 1) 187 resource := s.resources.Get("1") 188 defer statetesting.AssertStop(c, resource) 189 190 wc := statetesting.NewNotifyWatcherC(c, s.State, resource.(state.NotifyWatcher)) 191 wc.AssertNoChange() 192 193 s.setRetryStrategy(c, false) 194 c.Assert(err, jc.ErrorIsNil) 195 wc.AssertOneChange() 196 }