Skip to content

Commit e37cc7b

Browse files
authored
Merge pull request #208 from arangodb/feature/set-leader-role-label
Set a `role=leader` label on the Pod who won the leader election
2 parents 598ff5e + 74f9225 commit e37cc7b

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

pkg/operator/operator_leader.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import (
3434
"k8s.io/client-go/tools/leaderelection"
3535
"k8s.io/client-go/tools/leaderelection/resourcelock"
3636

37+
"github.com/arangodb/arangosync/pkg/retry"
38+
"github.com/arangodb/kube-arangodb/pkg/util/constants"
3739
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3840
"github.com/arangodb/kube-arangodb/pkg/util/probe"
3941
)
@@ -75,6 +77,10 @@ func (o *Operator) runLeaderElection(lockName string, onStart func(stop <-chan s
7577
OnStartedLeading: func(stop <-chan struct{}) {
7678
recordEvent("Leader Election Won", fmt.Sprintf("Pod %s is running as leader", o.Config.PodName))
7779
readyProbe.SetReady()
80+
if err := o.setRoleLabel(log, constants.LabelRoleLeader); err != nil {
81+
log.Error().Msg("Cannot set leader role on Pod. Terminating process")
82+
os.Exit(2)
83+
}
7884
onStart(stop)
7985
},
8086
OnStoppedLeading: func() {
@@ -123,3 +129,38 @@ func (o *Operator) getLeaderElectionEventTarget(log zerolog.Logger) runtime.Obje
123129
}
124130
return depl
125131
}
132+
133+
// setRoleLabel sets a label with key `role` and given value in the pod metadata.
134+
func (o *Operator) setRoleLabel(log zerolog.Logger, role string) error {
135+
ns := o.Config.Namespace
136+
kubecli := o.Dependencies.KubeCli
137+
pods := kubecli.CoreV1().Pods(ns)
138+
log = log.With().Str("pod-name", o.Config.PodName).Logger()
139+
op := func() error {
140+
pod, err := pods.Get(o.Config.PodName, metav1.GetOptions{})
141+
if k8sutil.IsNotFound(err) {
142+
log.Error().Err(err).Msg("Pod not found, so we cannot set its role label")
143+
return retry.Permanent(maskAny(err))
144+
} else if err != nil {
145+
return maskAny(err)
146+
}
147+
labels := pod.ObjectMeta.GetLabels()
148+
if labels == nil {
149+
labels = make(map[string]string)
150+
}
151+
labels[constants.LabelRole] = role
152+
pod.ObjectMeta.SetLabels(labels)
153+
if _, err := pods.Update(pod); k8sutil.IsConflict(err) {
154+
// Retry it
155+
return maskAny(err)
156+
} else if err != nil {
157+
log.Error().Err(err).Msg("Failed to update Pod wrt 'role' label")
158+
return retry.Permanent(maskAny(err))
159+
}
160+
return nil
161+
}
162+
if err := retry.Retry(op, time.Second*15); err != nil {
163+
return maskAny(err)
164+
}
165+
return nil
166+
}

pkg/util/constants/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ const (
5151
FinalizerPVCMemberExists = "pvc.database.arangodb.com/member-exists" // Finalizer added to PVCs, indicating the need to keep is as long as its member exists
5252

5353
AnnotationEnforceAntiAffinity = "database.arangodb.com/enforce-anti-affinity" // Key of annotation added to PVC. Value is a boolean "true" or "false"
54+
55+
LabelRole = "role"
56+
LabelRoleLeader = "leader"
5457
)

0 commit comments

Comments
 (0)