@@ -19,8 +19,10 @@ package leaderelection
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "io/ioutil"
22
23
"os"
23
24
"regexp"
25
+ "strings"
24
26
"time"
25
27
26
28
"k8s.io/api/core/v1"
@@ -62,16 +64,15 @@ type leaderElection struct {
62
64
}
63
65
64
66
// NewLeaderElection returns the default & preferred leader election type
65
- func NewLeaderElection (clientset kubernetes.Interface , lockName , lockNamespace string , runFunc func (ctx context.Context )) * leaderElection {
66
- return NewLeaderElectionWithLeases (clientset , lockName , lockNamespace , runFunc )
67
+ func NewLeaderElection (clientset kubernetes.Interface , lockName string , runFunc func (ctx context.Context )) * leaderElection {
68
+ return NewLeaderElectionWithLeases (clientset , lockName , runFunc )
67
69
}
68
70
69
71
// NewLeaderElectionWithLeases returns an implementation of leader election using Leases
70
- func NewLeaderElectionWithLeases (clientset kubernetes.Interface , lockName , lockNamespace string , runFunc func (ctx context.Context )) * leaderElection {
72
+ func NewLeaderElectionWithLeases (clientset kubernetes.Interface , lockName string , runFunc func (ctx context.Context )) * leaderElection {
71
73
return & leaderElection {
72
74
runFunc : runFunc ,
73
75
lockName : lockName ,
74
- namespace : lockNamespace ,
75
76
resourceLock : resourcelock .LeasesResourceLock ,
76
77
leaseDuration : defaultLeaseDuration ,
77
78
renewDeadline : defaultRenewDeadline ,
@@ -81,11 +82,10 @@ func NewLeaderElectionWithLeases(clientset kubernetes.Interface, lockName, lockN
81
82
}
82
83
83
84
// NewLeaderElectionWithEndpoints returns an implementation of leader election using Endpoints
84
- func NewLeaderElectionWithEndpoints (clientset kubernetes.Interface , lockName , lockNamespace string , runFunc func (ctx context.Context )) * leaderElection {
85
+ func NewLeaderElectionWithEndpoints (clientset kubernetes.Interface , lockName string , runFunc func (ctx context.Context )) * leaderElection {
85
86
return & leaderElection {
86
87
runFunc : runFunc ,
87
88
lockName : lockName ,
88
- namespace : lockNamespace ,
89
89
resourceLock : resourcelock .EndpointsResourceLock ,
90
90
leaseDuration : defaultLeaseDuration ,
91
91
renewDeadline : defaultRenewDeadline ,
@@ -95,11 +95,10 @@ func NewLeaderElectionWithEndpoints(clientset kubernetes.Interface, lockName, lo
95
95
}
96
96
97
97
// NewLeaderElectionWithConfigMaps returns an implementation of leader election using ConfigMaps
98
- func NewLeaderElectionWithConfigMaps (clientset kubernetes.Interface , lockName , lockNamespace string , runFunc func (ctx context.Context )) * leaderElection {
98
+ func NewLeaderElectionWithConfigMaps (clientset kubernetes.Interface , lockName string , runFunc func (ctx context.Context )) * leaderElection {
99
99
return & leaderElection {
100
100
runFunc : runFunc ,
101
101
lockName : lockName ,
102
- namespace : lockNamespace ,
103
102
resourceLock : resourcelock .ConfigMapsResourceLock ,
104
103
leaseDuration : defaultLeaseDuration ,
105
104
renewDeadline : defaultRenewDeadline ,
@@ -108,20 +107,29 @@ func NewLeaderElectionWithConfigMaps(clientset kubernetes.Interface, lockName, l
108
107
}
109
108
}
110
109
111
- func (l * leaderElection ) WithIdentity (identity string ) {
110
+ func (l * leaderElection ) WithIdentity (identity string ) * leaderElection {
112
111
l .identity = identity
112
+ return l
113
113
}
114
114
115
- func (l * leaderElection ) WithLeaseDuration (leaseDuration time.Duration ) {
115
+ func (l * leaderElection ) WithNamespace (namespace string ) * leaderElection {
116
+ l .namespace = namespace
117
+ return l
118
+ }
119
+
120
+ func (l * leaderElection ) WithLeaseDuration (leaseDuration time.Duration ) * leaderElection {
116
121
l .leaseDuration = leaseDuration
122
+ return l
117
123
}
118
124
119
- func (l * leaderElection ) WithRenewDeadline (renewDeadline time.Duration ) {
125
+ func (l * leaderElection ) WithRenewDeadline (renewDeadline time.Duration ) * leaderElection {
120
126
l .renewDeadline = renewDeadline
127
+ return l
121
128
}
122
129
123
- func (l * leaderElection ) WithRetryPeriod (retryPeriod time.Duration ) {
130
+ func (l * leaderElection ) WithRetryPeriod (retryPeriod time.Duration ) * leaderElection {
124
131
l .retryPeriod = retryPeriod
132
+ return l
125
133
}
126
134
127
135
func (l * leaderElection ) Run () error {
@@ -134,6 +142,10 @@ func (l *leaderElection) Run() error {
134
142
l .identity = id
135
143
}
136
144
145
+ if l .namespace == "" {
146
+ l .namespace = inClusterNamespace ()
147
+ }
148
+
137
149
broadcaster := record .NewBroadcaster ()
138
150
broadcaster .StartRecordingToSink (& corev1.EventSinkImpl {Interface : l .clientset .CoreV1 ().Events (l .namespace )})
139
151
eventRecorder := broadcaster .NewRecorder (scheme .Scheme , v1.EventSource {Component : fmt .Sprintf ("%s/%s" , l .lockName , string (l .identity ))})
@@ -185,3 +197,20 @@ func sanitizeName(name string) string {
185
197
}
186
198
return name
187
199
}
200
+
201
+ // inClusterNamespace returns the namespace in which the pod is running in by checking
202
+ // the env var POD_NAMESPACE, then the file /var/run/secrets/kubernetes.io/serviceaccount/namespace.
203
+ // if neither returns a valid namespace, the "default" namespace is returned
204
+ func inClusterNamespace () string {
205
+ if ns := os .Getenv ("POD_NAMESPACE" ); ns != "" {
206
+ return ns
207
+ }
208
+
209
+ if data , err := ioutil .ReadFile ("/var/run/secrets/kubernetes.io/serviceaccount/namespace" ); err == nil {
210
+ if ns := strings .TrimSpace (string (data )); len (ns ) > 0 {
211
+ return ns
212
+ }
213
+ }
214
+
215
+ return "default"
216
+ }
0 commit comments