github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/leadership/leadership_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leadership
     5  
     6  /*
     7  Test that the service is translating incoming parameters to the
     8  manager layer correctly, and also translates the results back into
     9  network parameters.
    10  */
    11  
    12  import (
    13  	"time"
    14  
    15  	"github.com/juju/names"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/apiserver/common"
    19  	"github.com/juju/juju/apiserver/params"
    20  )
    21  
    22  func init() {
    23  	// Ensure the LeadershipService conforms to the interface at compile-time.
    24  	var _ LeadershipService = (*leadershipService)(nil)
    25  
    26  	gc.Suite(&leadershipSuite{})
    27  }
    28  
    29  type leadershipSuite struct{}
    30  
    31  const (
    32  	StubServiceNm = "stub-service"
    33  	StubUnitNm    = "stub-unit/0"
    34  )
    35  
    36  type stubLeadershipManager struct {
    37  	ClaimLeadershipFn              func(sid, uid string) (time.Duration, error)
    38  	ReleaseLeadershipFn            func(sid, uid string) error
    39  	BlockUntilLeadershipReleasedFn func(serviceId string) error
    40  }
    41  
    42  func (m *stubLeadershipManager) ClaimLeadership(sid, uid string) (time.Duration, error) {
    43  	if m.ClaimLeadershipFn != nil {
    44  		return m.ClaimLeadershipFn(sid, uid)
    45  	}
    46  	return 0, nil
    47  }
    48  
    49  func (m *stubLeadershipManager) ReleaseLeadership(sid, uid string) error {
    50  	if m.ReleaseLeadershipFn != nil {
    51  		return m.ReleaseLeadershipFn(sid, uid)
    52  	}
    53  	return nil
    54  }
    55  
    56  func (m *stubLeadershipManager) BlockUntilLeadershipReleased(serviceId string) error {
    57  	if m.BlockUntilLeadershipReleasedFn != nil {
    58  		return m.BlockUntilLeadershipReleasedFn(serviceId)
    59  	}
    60  	return nil
    61  }
    62  
    63  type stubAuthorizer struct {
    64  	AuthOwnerFn     func(names.Tag) bool
    65  	AuthUnitAgentFn func() bool
    66  }
    67  
    68  func (m *stubAuthorizer) AuthMachineAgent() bool { return true }
    69  func (m *stubAuthorizer) AuthUnitAgent() bool {
    70  	if m.AuthUnitAgentFn != nil {
    71  		return m.AuthUnitAgentFn()
    72  	}
    73  	return true
    74  }
    75  func (m *stubAuthorizer) AuthOwner(tag names.Tag) bool {
    76  	if m.AuthOwnerFn != nil {
    77  		return m.AuthOwnerFn(tag)
    78  	}
    79  	return true
    80  }
    81  func (m *stubAuthorizer) AuthEnvironManager() bool { return true }
    82  func (m *stubAuthorizer) AuthClient() bool         { return true }
    83  func (m *stubAuthorizer) GetAuthTag() names.Tag    { return names.NewServiceTag(StubUnitNm) }
    84  
    85  func (s *leadershipSuite) TestClaimLeadershipTranslation(c *gc.C) {
    86  	var ldrMgr stubLeadershipManager
    87  	ldrMgr.ClaimLeadershipFn = func(sid, uid string) (time.Duration, error) {
    88  		c.Check(sid, gc.Equals, StubServiceNm)
    89  		c.Check(uid, gc.Equals, StubUnitNm)
    90  		return 0, nil
    91  	}
    92  
    93  	ldrSvc := &leadershipService{LeadershipManager: &ldrMgr, authorizer: &stubAuthorizer{}}
    94  	results, err := ldrSvc.ClaimLeadership(params.ClaimLeadershipBulkParams{
    95  		Params: []params.ClaimLeadershipParams{
    96  			{
    97  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
    98  				UnitTag:    names.NewUnitTag(StubUnitNm).String(),
    99  			},
   100  		},
   101  	})
   102  
   103  	c.Assert(err, gc.IsNil)
   104  	c.Assert(results.Results, gc.HasLen, 1)
   105  }
   106  
   107  func (s *leadershipSuite) TestReleaseLeadershipTranslation(c *gc.C) {
   108  
   109  	var ldrMgr stubLeadershipManager
   110  	ldrMgr.ReleaseLeadershipFn = func(sid, uid string) error {
   111  		c.Check(sid, gc.Equals, StubServiceNm)
   112  		c.Check(uid, gc.Equals, StubUnitNm)
   113  		return nil
   114  	}
   115  
   116  	ldrSvc := &leadershipService{LeadershipManager: &ldrMgr, authorizer: &stubAuthorizer{}}
   117  	results, err := ldrSvc.ClaimLeadership(params.ClaimLeadershipBulkParams{
   118  		Params: []params.ClaimLeadershipParams{
   119  			{
   120  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
   121  				UnitTag:    names.NewUnitTag(StubUnitNm).String(),
   122  			},
   123  		},
   124  	})
   125  
   126  	c.Assert(err, gc.IsNil)
   127  	c.Assert(results.Results, gc.HasLen, 1)
   128  }
   129  
   130  func (s *leadershipSuite) TestBlockUntilLeadershipReleasedTranslation(c *gc.C) {
   131  
   132  	var ldrMgr stubLeadershipManager
   133  	ldrMgr.BlockUntilLeadershipReleasedFn = func(sid string) error {
   134  		c.Check(sid, gc.Equals, StubServiceNm)
   135  		return nil
   136  	}
   137  
   138  	ldrSvc := &leadershipService{LeadershipManager: &ldrMgr, authorizer: &stubAuthorizer{}}
   139  	result, err := ldrSvc.BlockUntilLeadershipReleased(names.NewServiceTag(StubServiceNm))
   140  
   141  	c.Assert(err, gc.IsNil)
   142  	c.Assert(result.Error, gc.IsNil)
   143  }
   144  
   145  func (s *leadershipSuite) TestClaimLeadershipFailOnAuthorizerErrors(c *gc.C) {
   146  	authorizer := &stubAuthorizer{
   147  		AuthUnitAgentFn: func() bool { return false },
   148  	}
   149  
   150  	ldrSvc := &leadershipService{LeadershipManager: nil, authorizer: authorizer}
   151  	results, err := ldrSvc.ClaimLeadership(params.ClaimLeadershipBulkParams{
   152  		Params: []params.ClaimLeadershipParams{
   153  			{
   154  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
   155  				UnitTag:    names.NewUnitTag(StubUnitNm).String(),
   156  			},
   157  		},
   158  	})
   159  
   160  	c.Assert(err, gc.IsNil)
   161  	c.Assert(results.Results, gc.HasLen, 1)
   162  	c.Assert(results.Results[0].Error, gc.NotNil)
   163  	c.Check(results.Results[0].Error, gc.ErrorMatches, common.ErrPerm.Error())
   164  }
   165  
   166  func (s *leadershipSuite) TestReleaseLeadershipFailOnAuthorizerErrors(c *gc.C) {
   167  	authorizer := &stubAuthorizer{
   168  		AuthUnitAgentFn: func() bool { return false },
   169  	}
   170  
   171  	ldrSvc := &leadershipService{LeadershipManager: nil, authorizer: authorizer}
   172  	results, err := ldrSvc.ClaimLeadership(params.ClaimLeadershipBulkParams{
   173  		Params: []params.ClaimLeadershipParams{
   174  			{
   175  				ServiceTag: names.NewServiceTag(StubServiceNm).String(),
   176  				UnitTag:    names.NewUnitTag(StubUnitNm).String(),
   177  			},
   178  		},
   179  	})
   180  
   181  	c.Assert(err, gc.IsNil)
   182  	c.Assert(results.Results, gc.HasLen, 1)
   183  	c.Assert(results.Results[0].Error, gc.NotNil)
   184  	c.Check(results.Results[0].Error, gc.ErrorMatches, common.ErrPerm.Error())
   185  }
   186  
   187  func (s *leadershipSuite) TestBlockUntilLeadershipReleasedErrors(c *gc.C) {
   188  	authorizer := &stubAuthorizer{
   189  		AuthUnitAgentFn: func() bool { return false },
   190  	}
   191  
   192  	ldrSvc := &leadershipService{LeadershipManager: nil, authorizer: authorizer}
   193  	result, err := ldrSvc.BlockUntilLeadershipReleased(names.NewServiceTag(StubServiceNm))
   194  
   195  	// Overall function call should succeed, but operations should
   196  	// fail with a permissions issue.
   197  	c.Assert(err, gc.IsNil)
   198  	c.Check(result.Error, gc.ErrorMatches, common.ErrPerm.Error())
   199  }