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 := &params.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  }