Skip to content

Commit 01c6690

Browse files
committed
pkg/ansible,pkg/scaffold/ansible; enables leader election for ansible operators
1 parent f30e17c commit 01c6690

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- A new command [`operator-sdk migrate`](https://github.com/operator-framework/operator-sdk/blob/master/doc/sdk-cli-reference.md#migrate) which adds a main.go source file and any associated source files for an operator that is not of the "go" type. ([#887](https://github.com/operator-framework/operator-sdk/pull/887) and [#897](https://github.com/operator-framework/operator-sdk/pull/897))
66
- New commands [`operator-sdk run ansible`](https://github.com/operator-framework/operator-sdk/blob/master/doc/sdk-cli-reference.md#ansible) and [`operator-sdk run helm`](https://github.com/operator-framework/operator-sdk/blob/master/doc/sdk-cli-reference.md#helm) which run the SDK as ansible and helm operator processes, respectively. These are intended to be used when running in a Pod inside a cluster. Developers wanting to run their operator locally should continue to use `up local`. ([#887](https://github.com/operator-framework/operator-sdk/pull/887) and [#897](https://github.com/operator-framework/operator-sdk/pull/897))
7+
- 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`.
78

89
### Changed
910

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
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2730

@@ -42,6 +45,8 @@ func printVersion() {
4245
func Run(flags *aoflags.AnsibleOperatorFlags) {
4346
logf.SetLogger(logf.ZapLogger(false))
4447

48+
printVersion()
49+
4550
namespace, found := os.LookupEnv(k8sutil.WatchNamespaceEnvVar)
4651
if found {
4752
log.Infof("Watching %v namespace.", namespace)
@@ -58,7 +63,31 @@ func Run(flags *aoflags.AnsibleOperatorFlags) {
5863
log.Fatal(err)
5964
}
6065

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

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)