Skip to content

Commit 1fe47fc

Browse files
committed
Implement leaderelection type getter via restmapper
1 parent 801e12a commit 1fe47fc

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

pkg/client/apiutil/apimachinery.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ import (
3636
func NewDiscoveryRESTMapper(c *rest.Config) (meta.RESTMapper, error) {
3737
// Get a mapper
3838
dc := discovery.NewDiscoveryClientForConfigOrDie(c)
39+
40+
// TODO(mszostok): here we have useful info about all supported groups and resource
41+
// in api-server
3942
gr, err := restmapper.GetAPIGroupResources(dc)
4043
if err != nil {
4144
return nil, err

pkg/leaderelection/leader_election.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ type Options struct {
4343
// LeaderElectionID determines the name of the configmap that leader election
4444
// will use for holding the leader lock.
4545
LeaderElectionID string
46+
47+
// LeaderElectionLockType determines leader election lock type for holding
48+
// the leader lock information.
49+
LeaderElectionLockType LockType
4650
}
4751

4852
// NewResourceLock creates a new config map resource lock for use in a leader
@@ -80,7 +84,7 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op
8084
}
8185

8286
// TODO(JoelSpeed): switch to leaderelection object in 1.12
83-
return resourcelock.New(resourcelock.ConfigMapsResourceLock,
87+
return resourcelock.New(string(options.LeaderElectionLockType),
8488
options.LeaderElectionNamespace,
8589
options.LeaderElectionID,
8690
client.CoreV1(),
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package leaderelection
2+
3+
import (
4+
"fmt"
5+
6+
coordinationv1 "k8s.io/api/coordination/v1"
7+
"k8s.io/apimachinery/pkg/api/meta"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
)
10+
11+
type LockType string
12+
13+
const (
14+
ConfigMapsResourceLock LockType = "configmaps"
15+
LeasesResourceLock = "leases"
16+
EndpointsResourceLock = "endpoints"
17+
)
18+
19+
// GetPreferredLockType chooses the Lease lock if `lease.coordination.k8s.io` is available.
20+
// Otherwise, the ConfigMap resource lock is used.
21+
func GetPreferredLockType(mapper meta.RESTMapper) (LockType, error) {
22+
// check if new leader election api is available
23+
_, err := mapper.RESTMapping(schema.GroupKind{
24+
Kind: "Lease",
25+
Group: coordinationv1.GroupName,
26+
})
27+
switch {
28+
case err == nil:
29+
return LeasesResourceLock, nil
30+
case meta.IsNoMatchError(err):
31+
return ConfigMapsResourceLock, nil
32+
default:
33+
return "", fmt.Errorf("unable to retrieve supported server groups: %v", err)
34+
}
35+
}

pkg/manager/manager.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ type Options struct {
118118
// will use for holding the leader lock.
119119
LeaderElectionID string
120120

121+
// LeaderElectionLockType determines leader election lock type for holding
122+
// the leader lock information.
123+
LeaderElectionLockType leaderelection.LockType
124+
121125
// LeaseDuration is the duration that non-leader candidates will
122126
// wait to force acquire leadership. This is measured against time of
123127
// last observed ack. Default is 15 seconds.
@@ -245,10 +249,19 @@ func New(config *rest.Config, options Options) (Manager, error) {
245249
}
246250

247251
// Create the resource lock to enable leader election)
252+
if options.LeaderElectionLockType == "" { // this should be moved somehow into `setOptionsDefaults` func
253+
lockType, err := leaderelection.GetPreferredLockType(mapper)
254+
if err != nil {
255+
return nil, err
256+
}
257+
options.LeaderElectionLockType = lockType
258+
}
259+
248260
resourceLock, err := options.newResourceLock(config, recorderProvider, leaderelection.Options{
249261
LeaderElection: options.LeaderElection,
250262
LeaderElectionID: options.LeaderElectionID,
251263
LeaderElectionNamespace: options.LeaderElectionNamespace,
264+
LeaderElectionLockType: options.LeaderElectionLockType,
252265
})
253266
if err != nil {
254267
return nil, err

0 commit comments

Comments
 (0)