github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/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/params"
    13  	"github.com/juju/juju/apiserver/retrystrategy"
    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  	factory *jujufactory.Factory
    30  
    31  	unit *state.Unit
    32  
    33  	strategy retrystrategy.RetryStrategy
    34  }
    35  
    36  var tagsTests = []struct {
    37  	tag         string
    38  	expectedErr string
    39  }{
    40  	{"user-admin", "permission denied"},
    41  	{"unit-wut-4", "permission denied"},
    42  	{"definitelynotatag", `"definitelynotatag" is not a valid tag`},
    43  	{"machine-5", "permission denied"},
    44  }
    45  
    46  func (s *retryStrategySuite) SetUpTest(c *gc.C) {
    47  	s.JujuConnSuite.SetUpTest(c)
    48  
    49  	s.factory = jujufactory.NewFactory(s.State)
    50  	s.unit = s.factory.MakeUnit(c, nil)
    51  
    52  	// Create a FakeAuthorizer so we can check permissions,
    53  	// set up assuming unit 0 has logged in.
    54  	s.authorizer = apiservertesting.FakeAuthorizer{
    55  		Tag: s.unit.UnitTag(),
    56  	}
    57  
    58  	// Create the resource registry separately to track invocations to
    59  	// Register.
    60  	s.resources = common.NewResources()
    61  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    62  
    63  	strategy, err := retrystrategy.NewRetryStrategyAPI(s.State, s.resources, s.authorizer)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	s.strategy = strategy
    66  }
    67  
    68  func (s *retryStrategySuite) TestRetryStrategyUnauthenticated(c *gc.C) {
    69  	svc, err := s.unit.Application()
    70  	c.Assert(err, jc.ErrorIsNil)
    71  	otherUnit := s.factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc})
    72  	args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}}
    73  
    74  	res, err := s.strategy.RetryStrategy(args)
    75  	c.Assert(err, jc.ErrorIsNil)
    76  	c.Assert(res.Results, gc.HasLen, 1)
    77  	c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied")
    78  	c.Assert(res.Results[0].Result, gc.IsNil)
    79  }
    80  
    81  func (s *retryStrategySuite) TestRetryStrategyBadTag(c *gc.C) {
    82  	args := params.Entities{Entities: make([]params.Entity, len(tagsTests))}
    83  	for i, t := range tagsTests {
    84  		args.Entities[i] = params.Entity{Tag: t.tag}
    85  	}
    86  	res, err := s.strategy.RetryStrategy(args)
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(res.Results, gc.HasLen, len(tagsTests))
    89  	for i, r := range res.Results {
    90  		c.Logf("result %d", i)
    91  		c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr)
    92  		c.Assert(res.Results[i].Result, gc.IsNil)
    93  	}
    94  }
    95  
    96  func (s *retryStrategySuite) TestRetryStrategy(c *gc.C) {
    97  	expected := &params.RetryStrategy{
    98  		ShouldRetry:     true,
    99  		MinRetryTime:    retrystrategy.MinRetryTime,
   100  		MaxRetryTime:    retrystrategy.MaxRetryTime,
   101  		JitterRetryTime: retrystrategy.JitterRetryTime,
   102  		RetryTimeFactor: retrystrategy.RetryTimeFactor,
   103  	}
   104  	args := params.Entities{Entities: []params.Entity{{Tag: s.unit.Tag().String()}}}
   105  	r, err := s.strategy.RetryStrategy(args)
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	c.Assert(r.Results, gc.HasLen, 1)
   108  	c.Assert(r.Results[0].Error, gc.IsNil)
   109  	c.Assert(r.Results[0].Result, jc.DeepEquals, expected)
   110  
   111  	s.setRetryStrategy(c, false)
   112  	expected.ShouldRetry = false
   113  
   114  	r, err = s.strategy.RetryStrategy(args)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Assert(r.Results, gc.HasLen, 1)
   117  	c.Assert(r.Results[0].Error, gc.IsNil)
   118  	c.Assert(r.Results[0].Result, jc.DeepEquals, expected)
   119  }
   120  
   121  func (s *retryStrategySuite) setRetryStrategy(c *gc.C, automaticallyRetryHooks bool) {
   122  	err := s.State.UpdateModelConfig(map[string]interface{}{"automatically-retry-hooks": automaticallyRetryHooks}, nil, nil)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  	envConfig, err := s.State.ModelConfig()
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	c.Assert(envConfig.AutomaticallyRetryHooks(), gc.Equals, automaticallyRetryHooks)
   127  }
   128  
   129  func (s *retryStrategySuite) TestWatchRetryStrategyUnauthenticated(c *gc.C) {
   130  	svc, err := s.unit.Application()
   131  	c.Assert(err, jc.ErrorIsNil)
   132  	otherUnit := s.factory.MakeUnit(c, &jujufactory.UnitParams{Application: svc})
   133  	args := params.Entities{Entities: []params.Entity{{otherUnit.Tag().String()}}}
   134  
   135  	res, err := s.strategy.WatchRetryStrategy(args)
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(res.Results, gc.HasLen, 1)
   138  	c.Assert(res.Results[0].Error, gc.ErrorMatches, "permission denied")
   139  	c.Assert(res.Results[0].NotifyWatcherId, gc.Equals, "")
   140  }
   141  
   142  func (s *retryStrategySuite) TestWatchRetryStrategyBadTag(c *gc.C) {
   143  	args := params.Entities{Entities: make([]params.Entity, len(tagsTests))}
   144  	for i, t := range tagsTests {
   145  		args.Entities[i] = params.Entity{Tag: t.tag}
   146  	}
   147  	res, err := s.strategy.WatchRetryStrategy(args)
   148  	c.Assert(err, jc.ErrorIsNil)
   149  	c.Assert(res.Results, gc.HasLen, len(tagsTests))
   150  	for i, r := range res.Results {
   151  		c.Logf("result %d", i)
   152  		c.Assert(r.Error, gc.ErrorMatches, tagsTests[i].expectedErr)
   153  		c.Assert(res.Results[i].NotifyWatcherId, gc.Equals, "")
   154  	}
   155  }
   156  
   157  func (s *retryStrategySuite) TestWatchRetryStrategy(c *gc.C) {
   158  	c.Assert(s.resources.Count(), gc.Equals, 0)
   159  
   160  	args := params.Entities{Entities: []params.Entity{
   161  		{Tag: s.unit.UnitTag().String()},
   162  		{Tag: "unit-foo-42"},
   163  	}}
   164  	r, err := s.strategy.WatchRetryStrategy(args)
   165  	c.Assert(err, jc.ErrorIsNil)
   166  	c.Assert(r, gc.DeepEquals, params.NotifyWatchResults{
   167  		Results: []params.NotifyWatchResult{
   168  			{NotifyWatcherId: "1"},
   169  			{Error: apiservertesting.ErrUnauthorized},
   170  		},
   171  	})
   172  
   173  	c.Assert(s.resources.Count(), gc.Equals, 1)
   174  	resource := s.resources.Get("1")
   175  	defer statetesting.AssertStop(c, resource)
   176  
   177  	wc := statetesting.NewNotifyWatcherC(c, s.State, resource.(state.NotifyWatcher))
   178  	wc.AssertNoChange()
   179  
   180  	s.setRetryStrategy(c, false)
   181  	c.Assert(err, jc.ErrorIsNil)
   182  	wc.AssertOneChange()
   183  }