Skip to content

Commit 6ff3e78

Browse files
authored
Merge pull request #102 from cybertec-postgresql/OwnerReference
Owner reference
2 parents c6f0172 + 648c5f6 commit 6ff3e78

5 files changed

Lines changed: 85 additions & 9 deletions

File tree

docs/hugo/content/en/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ date: 2024-03-11T14:26:51+01:00
44
draft: false
55
weight: 1
66
---
7-
Current Release: 0.9.0 (xx.10.2025) [Release Notes](release_notes)
7+
Current Release: 0.9.0 (31.10.2025) [Release Notes](release_notes)
88

99
<img src="https://raw.githubusercontent.com/cybertec-postgresql/CYBERTEC-pg-operator/fac724618ea1395ed49cb1db7f3429f5b4324337/docs/diagrams/cpo_logo.svg" alt="drawing" width="350" />
1010

pkg/cluster/cluster.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,19 @@ func (c *Cluster) clusterNamespace() string {
176176
return c.ObjectMeta.Namespace
177177
}
178178

179+
func (c *Cluster) createOwnerReference() []metav1.OwnerReference {
180+
return []metav1.OwnerReference{
181+
{
182+
APIVersion: c.APIVersion,
183+
Kind: c.Kind,
184+
Name: c.Name,
185+
UID: c.UID,
186+
Controller: util.True(),
187+
BlockOwnerDeletion: util.False(),
188+
},
189+
}
190+
}
191+
179192
func (c *Cluster) teamName() string {
180193
// TODO: check Teams API for the actual name (in case the user passes an integer Id).
181194
return c.Spec.TeamID
@@ -651,6 +664,15 @@ func (c *Cluster) compareStatefulSetWith(oldSts, newSts *appsv1.StatefulSet) *co
651664
return &compareStatefulsetResult{match: match, reasons: reasons, rollingUpdate: needsRollUpdate, replace: needsReplace}
652665
}
653666

667+
func (c *Cluster) compareOwnerReferenceFromStatefulSet(current *appsv1.StatefulSet) bool {
668+
for _, ref := range current.OwnerReferences {
669+
if ref.UID == c.UID && ref.Controller != nil && *ref.Controller {
670+
return true
671+
}
672+
}
673+
return false
674+
}
675+
654676
type containerCondition func(a, b v1.Container) bool
655677

656678
type containerCheck struct {

pkg/cluster/k8sres.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1660,10 +1660,11 @@ func (c *Cluster) generateStatefulSet(spec *cpov1.PostgresSpec) (*appsv1.Statefu
16601660

16611661
statefulSet := &appsv1.StatefulSet{
16621662
ObjectMeta: metav1.ObjectMeta{
1663-
Name: c.statefulSetName(),
1664-
Namespace: c.Namespace,
1665-
Labels: c.labelsSetWithType(true, TYPE_POSTGRESQL),
1666-
Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
1663+
Name: c.statefulSetName(),
1664+
Namespace: c.Namespace,
1665+
Labels: c.labelsSetWithType(true, TYPE_POSTGRESQL),
1666+
Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
1667+
OwnerReferences: c.createOwnerReference(),
16671668
},
16681669
Spec: appsv1.StatefulSetSpec{
16691670
Replicas: &numberOfInstances,
@@ -1921,10 +1922,11 @@ func (c *Cluster) generateRepoHostStatefulSet(spec *cpov1.PostgresSpec) (*appsv1
19211922

19221923
statefulSet := &appsv1.StatefulSet{
19231924
ObjectMeta: metav1.ObjectMeta{
1924-
Name: c.getPgbackrestRepoHostName(),
1925-
Namespace: c.Namespace,
1926-
Labels: repoHostLabels,
1927-
Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
1925+
Name: c.getPgbackrestRepoHostName(),
1926+
Namespace: c.Namespace,
1927+
Labels: repoHostLabels,
1928+
Annotations: c.AnnotationsToPropagate(c.annotationsSet(nil)),
1929+
OwnerReferences: c.createOwnerReference(),
19281930
},
19291931
Spec: appsv1.StatefulSetSpec{
19301932
Replicas: &numberOfInstances,

pkg/cluster/resources.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cluster
22

33
import (
44
"context"
5+
"encoding/json"
56
"fmt"
67
"strconv"
78
"strings"
@@ -172,6 +173,39 @@ func (c *Cluster) preScaleDown(newStatefulSet *appsv1.StatefulSet) error {
172173
return nil
173174
}
174175

176+
func (c *Cluster) patchOwnerReference(sts *appsv1.StatefulSet) (*appsv1.StatefulSet, error) {
177+
c.setProcessName("patching ownerReference")
178+
179+
if sts == nil {
180+
return nil, fmt.Errorf("there is no statefulset in the cluster")
181+
}
182+
183+
statefulSetName := util.NameFromMeta(sts.ObjectMeta)
184+
ownerRefs := c.createOwnerReference()
185+
186+
patchData, err := json.Marshal(map[string]interface{}{
187+
"metadata": map[string]interface{}{
188+
"ownerReferences": ownerRefs,
189+
},
190+
})
191+
if err != nil {
192+
return nil, fmt.Errorf("could not marshal patch for ownerReference: %w", err)
193+
}
194+
195+
patched, err := c.KubeClient.StatefulSets(sts.Namespace).Patch(
196+
context.TODO(),
197+
sts.Name,
198+
types.MergePatchType,
199+
patchData,
200+
metav1.PatchOptions{},
201+
)
202+
if err != nil {
203+
return nil, fmt.Errorf("could not patch ownerReference for StatefulSet %q: %w", statefulSetName, err)
204+
}
205+
206+
return patched, nil
207+
}
208+
175209
func (c *Cluster) updateStatefulSet(newStatefulSet *appsv1.StatefulSet) error {
176210
c.setProcessName("updating statefulset")
177211
if c.Statefulset == nil {

pkg/cluster/sync.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,15 @@ func (c *Cluster) syncStatefulSet() error {
582582
c.applyRestoreStatefulSetSyncOverrides(desiredSts, c.Statefulset)
583583
}
584584

585+
// Check if OwnerReference still up to date - if not patch it
586+
if !c.compareOwnerReferenceFromStatefulSet(c.Statefulset) {
587+
patched, err := c.patchOwnerReference(c.Statefulset)
588+
if err != nil {
589+
return err
590+
}
591+
c.Statefulset = patched
592+
}
593+
585594
cmp := c.compareStatefulSetWith(c.Statefulset, desiredSts)
586595
if !cmp.match {
587596
if cmp.rollingUpdate {
@@ -1602,6 +1611,15 @@ func (c *Cluster) syncPgbackrestRepoHostConfig(spec *cpov1.PostgresSpec) error {
16021611
return fmt.Errorf("could not generate pgbackrest repo-host statefulset: %v", err)
16031612
}
16041613

1614+
// Check if OwnerReference still up to date - if not patch it
1615+
if !c.compareOwnerReferenceFromStatefulSet(curSts) {
1616+
patched, err := c.patchOwnerReference(curSts)
1617+
if err != nil {
1618+
return err
1619+
}
1620+
curSts = patched
1621+
}
1622+
16051623
cmp := c.compareStatefulSetWith(curSts, desiredSts)
16061624
if !cmp.match {
16071625
c.logStatefulSetChanges(curSts, desiredSts, false, cmp.reasons)

0 commit comments

Comments
 (0)