Skip to content

Commit 3586924

Browse files
committed
pkg/ansible,pkg/scaffold/ansible; enables leader election for ansible operators
1 parent 429c43c commit 3586924

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
### Added
44

5+
- Ansible-based operators have leader election turned on by default. When upgrading, add environment variable `POD_NAME` to your operator's Deployment using the Kubernetes downward API. To see an example, run `operator-sdk new --type=ansible ...` and see file `deploy/operator.yaml`. You should also consider adding the readinessProbe that you'll see in the same example Deployment definition.
6+
57
### Changed
68

79
- The official images for the Ansible and Helm operators have moved! Travis now builds, tags, and pushes operator base images during CI ([#832](https://github.com/operator-framework/operator-sdk/pull/832)).

pkg/ansible/run.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
package ansible
1616

1717
import (
18+
"context"
1819
"os"
1920
"runtime"
2021

2122
aoflags "github.com/operator-framework/operator-sdk/pkg/ansible/flags"
2223
"github.com/operator-framework/operator-sdk/pkg/ansible/operator"
2324
proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy"
2425
"github.com/operator-framework/operator-sdk/pkg/k8sutil"
26+
"github.com/operator-framework/operator-sdk/pkg/leader"
27+
"github.com/operator-framework/operator-sdk/pkg/ready"
2528
sdkVersion "github.com/operator-framework/operator-sdk/version"
2629

2730
log "github.com/sirupsen/logrus"
@@ -41,6 +44,8 @@ func printVersion() {
4144
func Run(flags *aoflags.AnsibleOperatorFlags) {
4245
logf.SetLogger(logf.ZapLogger(false))
4346

47+
printVersion()
48+
4449
namespace, found := os.LookupEnv(k8sutil.WatchNamespaceEnvVar)
4550
if found {
4651
log.Infof("Watching %v namespace.", namespace)
@@ -56,7 +61,31 @@ func Run(flags *aoflags.AnsibleOperatorFlags) {
5661
log.Fatal(err)
5762
}
5863

59-
printVersion()
64+
name, found := os.LookupEnv(k8sutil.OperatorNameEnvVar)
65+
if !found {
66+
log.Fatal("OPERATOR_NAME environment variable not set")
67+
}
68+
// Become the leader before proceeding
69+
err = leader.Become(context.TODO(), name+"-lock")
70+
if err != nil {
71+
log.Error(err, "")
72+
os.Exit(1)
73+
}
74+
75+
// Set ready
76+
r := ready.NewFileReady()
77+
err = r.Set()
78+
if err != nil {
79+
log.Error(err, "")
80+
os.Exit(1)
81+
}
82+
defer func() {
83+
if err = r.Unset(); err != nil {
84+
log.Error(err, "")
85+
os.Exit(1)
86+
}
87+
}()
88+
6089
done := make(chan error)
6190
cMap := proxy.NewControllerMap()
6291

pkg/scaffold/ansible/operator.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ spec:
5858
- containerPort: 60000
5959
name: metrics
6060
imagePullPolicy: Always
61+
readinessProbe:
62+
exec:
63+
command:
64+
- stat
65+
- /tmp/operator-sdk-ready
66+
initialDelaySeconds: 4
67+
periodSeconds: 10
68+
failureThreshold: 1
6169
env:
6270
- name: WATCH_NAMESPACE
6371
{{- if .IsClusterScoped }}
@@ -67,6 +75,10 @@ spec:
6775
fieldRef:
6876
fieldPath: metadata.namespace
6977
{{- end}}
78+
- name: POD_NAME
79+
valueFrom:
80+
fieldRef:
81+
fieldPath: metadata.name
7082
- name: OPERATOR_NAME
7183
value: "{{.ProjectName}}"
7284
`

0 commit comments

Comments
 (0)