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 }