Skip to content

Commit b9401ae

Browse files
authored
pkg/ansible,pkg/scaffold/ansible; enables leader election for ansible operators (#904)
* pkg/ansible,pkg/scaffold/ansible; enables leader election for ansible operators * Fix test-cluster and add some debug statements
1 parent 3b86d1a commit b9401ae

File tree

6 files changed

+31
-3
lines changed

6 files changed

+31
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
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))
77
- Ansible operator proxy added the cache handler which allows the get requests to use the operators cache. [#760](https://github.com/operator-framework/operator-sdk/pull/760)
88
- Ansible operator proxy added ability to dynamically watch dependent resource that were created by ansible operator. [#857](https://github.com/operator-framework/operator-sdk/pull/857)
9+
- 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`.
10+
911
### Changed
1012

1113
- 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)).

commands/operator-sdk/cmd/test/cluster.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"github.com/operator-framework/operator-sdk/internal/util/fileutil"
2424
k8sInternal "github.com/operator-framework/operator-sdk/internal/util/k8sutil"
2525
"github.com/operator-framework/operator-sdk/internal/util/projutil"
26+
"github.com/operator-framework/operator-sdk/pkg/k8sutil"
27+
"github.com/operator-framework/operator-sdk/pkg/leader"
2628
"github.com/operator-framework/operator-sdk/pkg/scaffold"
2729
"github.com/operator-framework/operator-sdk/pkg/scaffold/ansible"
2830
"github.com/operator-framework/operator-sdk/pkg/test"
@@ -109,6 +111,12 @@ func testClusterFunc(cmd *cobra.Command, args []string) error {
109111
Env: []v1.EnvVar{{
110112
Name: test.TestNamespaceEnv,
111113
ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.namespace"}},
114+
}, {
115+
Name: k8sutil.OperatorNameEnvVar,
116+
Value: "test-operator",
117+
}, {
118+
Name: leader.PodNameEnv,
119+
ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.name"}},
112120
}},
113121
}},
114122
},

pkg/ansible/run.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
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"
2527
sdkVersion "github.com/operator-framework/operator-sdk/version"
2628
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2729

@@ -42,6 +44,8 @@ func printVersion() {
4244
func Run(flags *aoflags.AnsibleOperatorFlags) {
4345
logf.SetLogger(logf.ZapLogger(false))
4446

47+
printVersion()
48+
4549
namespace, found := os.LookupEnv(k8sutil.WatchNamespaceEnvVar)
4650
if found {
4751
log.Infof("Watching %v namespace.", namespace)
@@ -58,7 +62,17 @@ func Run(flags *aoflags.AnsibleOperatorFlags) {
5862
log.Fatal(err)
5963
}
6064

61-
printVersion()
65+
name, found := os.LookupEnv(k8sutil.OperatorNameEnvVar)
66+
if !found {
67+
log.Fatal("OPERATOR_NAME environment variable not set")
68+
}
69+
// Become the leader before proceeding
70+
err = leader.Become(context.TODO(), name+"-lock")
71+
if err != nil {
72+
log.Error(err, "")
73+
os.Exit(1)
74+
}
75+
6276
done := make(chan error)
6377
cMap := proxy.NewControllerMap()
6478

pkg/scaffold/ansible/build_test_framework_ansible_test_script.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (b *BuildTestFrameworkAnsibleTestScript) GetInput() (input.Input, error) {
3939

4040
const buildTestFrameworkAnsibleTestScriptAnsibleTmpl = `#!/bin/sh
4141
export WATCH_NAMESPACE=${TEST_NAMESPACE}
42-
(/usr/local/bin/entrypoint > /tmp/operator.log 2>&1)&
42+
(/usr/local/bin/entrypoint)&
4343
trap "kill $!" SIGINT SIGTERM EXIT
4444
4545
cd ${HOME}/project

pkg/scaffold/ansible/deploy_operator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ spec:
7070
fieldRef:
7171
fieldPath: metadata.namespace
7272
{{- end}}
73+
- name: POD_NAME
74+
valueFrom:
75+
fieldRef:
76+
fieldPath: metadata.name
7377
- name: OPERATOR_NAME
7478
value: "{{.ProjectName}}"
7579
`

test/ansible-memcached/asserts.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
- name: Wait 2 minutes for memcached deployment
2424
debug:
25-
msg: Waiting for memcached deployment...
25+
var: deploy
2626
until: deploy and deploy.status and deploy.status.replicas == deploy.status.get("availableReplicas", 0)
2727
retries: 12
2828
delay: 10

0 commit comments

Comments
 (0)