github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/leadership/settings_test.go (about)

     1  // Copyright 2014-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leadership_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/testing"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/apiserver/facades/agent/leadership"
    14  	"github.com/juju/juju/apiserver/params"
    15  	coreleadership "github.com/juju/juju/core/leadership"
    16  )
    17  
    18  // TODO(fwereade): this is *severely* undertested.
    19  type settingsSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&settingsSuite{})
    24  
    25  func (s *settingsSuite) TestReadSettings(c *gc.C) {
    26  
    27  	settingsToReturn := params.Settings(map[string]string{"foo": "bar"})
    28  	numGetSettingCalls := 0
    29  	getSettings := func(serviceId string) (map[string]string, error) {
    30  		numGetSettingCalls++
    31  		c.Check(serviceId, gc.Equals, StubAppNm)
    32  		return settingsToReturn, nil
    33  	}
    34  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
    35  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, getSettings, nil, nil)
    36  
    37  	results, err := accessor.Read(params.Entities{
    38  		Entities: []params.Entity{
    39  			{Tag: names.NewApplicationTag(StubAppNm).String()},
    40  		},
    41  	})
    42  	c.Assert(err, gc.IsNil)
    43  	c.Assert(numGetSettingCalls, gc.Equals, 1)
    44  	c.Assert(results.Results, gc.HasLen, 1)
    45  	c.Assert(results.Results[0].Error, gc.IsNil)
    46  	c.Check(results.Results[0].Settings, gc.DeepEquals, settingsToReturn)
    47  }
    48  
    49  func (s *settingsSuite) TestWriteSettings(c *gc.C) {
    50  
    51  	expectToken := &fakeToken{}
    52  
    53  	numLeaderCheckCalls := 0
    54  	leaderCheck := func(appName, unitId string) coreleadership.Token {
    55  		numLeaderCheckCalls++
    56  		c.Check(appName, gc.Equals, StubAppNm)
    57  		c.Check(unitId, gc.Equals, StubUnitNm)
    58  		return expectToken
    59  	}
    60  
    61  	numWriteSettingCalls := 0
    62  	writeSettings := func(token coreleadership.Token, serviceId string, settings map[string]string) error {
    63  		numWriteSettingCalls++
    64  		c.Check(serviceId, gc.Equals, StubAppNm)
    65  		c.Check(token, gc.Equals, expectToken)
    66  		c.Check(settings, jc.DeepEquals, map[string]string{"baz": "biz"})
    67  		return nil
    68  	}
    69  
    70  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
    71  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, nil, leaderCheck, writeSettings)
    72  
    73  	results, err := accessor.Merge(params.MergeLeadershipSettingsBulkParams{
    74  		Params: []params.MergeLeadershipSettingsParam{
    75  			{
    76  				ApplicationTag: names.NewApplicationTag(StubAppNm).String(),
    77  				Settings:       map[string]string{"baz": "biz"},
    78  			},
    79  		},
    80  	})
    81  	c.Assert(err, gc.IsNil)
    82  	c.Assert(results.Results, gc.HasLen, 1)
    83  	c.Check(results.Results[0].Error, gc.IsNil)
    84  	c.Check(numWriteSettingCalls, gc.Equals, 1)
    85  	c.Check(numLeaderCheckCalls, gc.Equals, 1)
    86  }
    87  
    88  func (s *settingsSuite) TestWriteSettingsWrongUnit(c *gc.C) {
    89  
    90  	numLeaderCheckCalls := 0
    91  	leaderCheck := func(appName, unitId string) coreleadership.Token {
    92  		numLeaderCheckCalls++
    93  		return &fakeToken{}
    94  	}
    95  
    96  	numWriteSettingCalls := 0
    97  	writeSettings := func(token coreleadership.Token, serviceId string, settings map[string]string) error {
    98  		numWriteSettingCalls++
    99  		return nil
   100  	}
   101  
   102  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
   103  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, nil, leaderCheck, writeSettings)
   104  
   105  	results, err := accessor.Merge(params.MergeLeadershipSettingsBulkParams{
   106  		Params: []params.MergeLeadershipSettingsParam{
   107  			{
   108  				ApplicationTag: names.NewApplicationTag(StubAppNm).String(),
   109  				UnitTag:        names.NewUnitTag("foo/0").String(),
   110  				Settings:       map[string]string{"baz": "biz"},
   111  			},
   112  		},
   113  	})
   114  	c.Assert(err, gc.IsNil)
   115  	c.Assert(results.Results, gc.HasLen, 1)
   116  	c.Check(results.Results[0].Error, gc.ErrorMatches, "permission denied")
   117  	c.Check(numWriteSettingCalls, gc.Equals, 0)
   118  	c.Check(numLeaderCheckCalls, gc.Equals, 0)
   119  }
   120  
   121  func (s *settingsSuite) TestWriteSettingsError(c *gc.C) {
   122  
   123  	expectToken := &fakeToken{}
   124  
   125  	numLeaderCheckCalls := 0
   126  	leaderCheck := func(serviceId, unitId string) coreleadership.Token {
   127  		numLeaderCheckCalls++
   128  		c.Check(serviceId, gc.Equals, StubAppNm)
   129  		c.Check(unitId, gc.Equals, StubUnitNm)
   130  		return expectToken
   131  	}
   132  
   133  	numWriteSettingCalls := 0
   134  	writeSettings := func(token coreleadership.Token, serviceId string, settings map[string]string) error {
   135  		numWriteSettingCalls++
   136  		c.Check(serviceId, gc.Equals, StubAppNm)
   137  		c.Check(token, gc.Equals, expectToken)
   138  		c.Check(settings, jc.DeepEquals, map[string]string{"baz": "biz"})
   139  		return errors.New("zap blort")
   140  	}
   141  
   142  	authorizer := stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
   143  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, nil, nil, leaderCheck, writeSettings)
   144  
   145  	results, err := accessor.Merge(params.MergeLeadershipSettingsBulkParams{
   146  		Params: []params.MergeLeadershipSettingsParam{
   147  			{
   148  				ApplicationTag: names.NewApplicationTag(StubAppNm).String(),
   149  				Settings:       map[string]string{"baz": "biz"},
   150  			},
   151  		},
   152  	})
   153  	c.Assert(err, gc.IsNil)
   154  	c.Assert(results.Results, gc.HasLen, 1)
   155  	c.Check(results.Results[0].Error, gc.ErrorMatches, "zap blort")
   156  	c.Check(numWriteSettingCalls, gc.Equals, 1)
   157  	c.Check(numLeaderCheckCalls, gc.Equals, 1)
   158  }
   159  
   160  func (s *settingsSuite) TestBlockUntilChanges(c *gc.C) {
   161  
   162  	numSettingsWatcherCalls := 0
   163  	registerWatcher := func(appName string) (string, error) {
   164  		numSettingsWatcherCalls++
   165  		c.Check(appName, gc.Equals, StubAppNm)
   166  		return "foo", nil
   167  	}
   168  
   169  	authorizer := &stubAuthorizer{tag: names.NewUnitTag(StubUnitNm)}
   170  	accessor := leadership.NewLeadershipSettingsAccessor(authorizer, registerWatcher, nil, nil, nil)
   171  
   172  	results, err := accessor.WatchLeadershipSettings(params.Entities{Entities: []params.Entity{
   173  		{Tag: names.NewApplicationTag(StubAppNm).String()},
   174  	}})
   175  	c.Assert(err, gc.IsNil)
   176  	c.Assert(results.Results, gc.HasLen, 1)
   177  	c.Assert(results.Results[0].Error, gc.IsNil)
   178  }
   179  
   180  type fakeToken struct {
   181  	coreleadership.Token
   182  }