Skip to content

Commit f1f2260

Browse files
authored
Merge branch 'main' into fix-cust-users-ppg1314
2 parents 0d91727 + d8248fe commit f1f2260

File tree

10 files changed

+115
-33
lines changed

10 files changed

+115
-33
lines changed

build/crd/percona/generated/pgv2.percona.com_perconapgclusters.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21143,6 +21143,10 @@ spec:
2114321143
version:
2114421144
type: string
2114521145
type: object
21146+
patroniVersion:
21147+
description: 'Deprecated: Use Patroni instead. This field will be
21148+
removed in a future release.'
21149+
type: string
2114621150
pgbackrest:
2114721151
description: Status information for pgBackRest
2114821152
properties:

config/crd/bases/pgv2.percona.com_perconapgclusters.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21548,6 +21548,10 @@ spec:
2154821548
version:
2154921549
type: string
2155021550
type: object
21551+
patroniVersion:
21552+
description: 'Deprecated: Use Patroni instead. This field will be
21553+
removed in a future release.'
21554+
type: string
2155121555
pgbackrest:
2155221556
description: Status information for pgBackRest
2155321557
properties:

deploy/bundle.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21845,6 +21845,10 @@ spec:
2184521845
version:
2184621846
type: string
2184721847
type: object
21848+
patroniVersion:
21849+
description: 'Deprecated: Use Patroni instead. This field will be
21850+
removed in a future release.'
21851+
type: string
2184821852
pgbackrest:
2184921853
description: Status information for pgBackRest
2185021854
properties:

deploy/crd.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21845,6 +21845,10 @@ spec:
2184521845
version:
2184621846
type: string
2184721847
type: object
21848+
patroniVersion:
21849+
description: 'Deprecated: Use Patroni instead. This field will be
21850+
removed in a future release.'
21851+
type: string
2184821852
pgbackrest:
2184921853
description: Status information for pgBackRest
2185021854
properties:

deploy/cw-bundle.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21845,6 +21845,10 @@ spec:
2184521845
version:
2184621846
type: string
2184721847
type: object
21848+
patroniVersion:
21849+
description: 'Deprecated: Use Patroni instead. This field will be
21850+
removed in a future release.'
21851+
type: string
2184821852
pgbackrest:
2184921853
description: Status information for pgBackRest
2185021854
properties:

percona/controller/pgcluster/controller.go

Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,6 @@ func (r *PGClusterReconciler) reconcilePatroniVersionCheck(ctx context.Context,
374374
}
375375

376376
if patroniVersion, ok := cr.Annotations[pNaming.AnnotationCustomPatroniVersion]; ok {
377-
cr.Annotations[pNaming.AnnotationPatroniVersion] = patroniVersion
378-
379377
patroniVersionUpdateFunc := func() error {
380378
cluster := &v2.PerconaPGCluster{}
381379
if err := r.Client.Get(ctx, types.NamespacedName{
@@ -388,10 +386,17 @@ func (r *PGClusterReconciler) reconcilePatroniVersionCheck(ctx context.Context,
388386
orig := cluster.DeepCopy()
389387

390388
cluster.Status.Patroni.Version = patroniVersion
389+
cluster.Status.PatroniVersion = patroniVersion
391390

392391
if err := r.Client.Status().Patch(ctx, cluster.DeepCopy(), client.MergeFrom(orig)); err != nil {
393392
return errors.Wrap(err, "failed to patch patroni version")
394393
}
394+
395+
err := r.patchPatroniVersionAnnotation(ctx, cr, patroniVersion)
396+
if err != nil {
397+
return errors.Wrap(err, "failed to patch patroni version annotation")
398+
}
399+
395400
return nil
396401
}
397402

@@ -403,40 +408,29 @@ func (r *PGClusterReconciler) reconcilePatroniVersionCheck(ctx context.Context,
403408
return nil
404409
}
405410

406-
getImageIDFromPod := func(pod *corev1.Pod, containerName string) string {
407-
idx := slices.IndexFunc(pod.Status.ContainerStatuses, func(s corev1.ContainerStatus) bool {
408-
return s.Name == containerName
409-
})
410-
if idx == -1 {
411-
return ""
412-
}
413-
return pod.Status.ContainerStatuses[idx].ImageID
414-
}
415-
416-
pods := new(corev1.PodList)
417-
instances, err := naming.AsSelector(naming.ClusterInstances(cr.Name))
411+
imageIDs, err := r.instanceImageIDs(ctx, cr)
418412
if err != nil {
419-
return err
420-
}
421-
if err = r.Client.List(ctx, pods, client.InNamespace(cr.Namespace), client.MatchingLabelsSelector{Selector: instances}); err != nil {
422-
return err
423-
}
424-
425-
// Collecting all image IDs from instance pods. Under normal conditions, this slice will contain a single image ID, as all pods typically use the same image.
426-
// During an image update, it may contain multiple different image IDs as the update progresses.
427-
imageIDs := []string{}
428-
for _, pod := range pods.Items {
429-
imageID := getImageIDFromPod(&pod, naming.ContainerDatabase)
430-
if imageID != "" && !slices.Contains(imageIDs, imageID) {
431-
imageIDs = append(imageIDs, imageID)
432-
}
413+
return errors.Wrap(err, "get image IDs")
433414
}
434415

435416
// If the imageIDs slice contains the imageID from the status, we skip checking the Patroni version.
436417
// This ensures that the Patroni version is only checked after all pods have been updated.
437-
if (len(imageIDs) == 0 || slices.Contains(imageIDs, cr.Status.Postgres.ImageID)) && cr.Status.Patroni.Version != "" {
438-
cr.Annotations[pNaming.AnnotationPatroniVersion] = cr.Status.Patroni.Version
439-
return nil
418+
if cr.CompareVersion("2.8.0") >= 0 {
419+
if (len(imageIDs) == 0 || slices.Contains(imageIDs, cr.Status.Postgres.ImageID)) && cr.Status.Patroni.Version != "" {
420+
err = r.patchPatroniVersionAnnotation(ctx, cr, cr.Status.Patroni.Version)
421+
if err != nil {
422+
return errors.Wrap(err, "failed to patch patroni version annotation")
423+
}
424+
return nil
425+
}
426+
} else {
427+
if (len(imageIDs) == 0 || slices.Contains(imageIDs, cr.Status.Postgres.ImageID)) && cr.Status.PatroniVersion != "" {
428+
err = r.patchPatroniVersionAnnotation(ctx, cr, cr.Status.PatroniVersion)
429+
if err != nil {
430+
return errors.Wrap(err, "failed to patch patroni version annotation")
431+
}
432+
return nil
433+
}
440434
}
441435

442436
meta := metav1.ObjectMeta{
@@ -535,21 +529,68 @@ func (r *PGClusterReconciler) reconcilePatroniVersionCheck(ctx context.Context,
535529
orig := cr.DeepCopy()
536530

537531
cr.Status.Patroni.Version = patroniVersion
532+
cr.Status.PatroniVersion = patroniVersion
538533
cr.Status.Postgres.Version = cr.Spec.PostgresVersion
539534
cr.Status.Postgres.ImageID = getImageIDFromPod(p, pNaming.ContainerPatroniVersionCheck)
540535

541536
if err := r.Client.Status().Patch(ctx, cr.DeepCopy(), client.MergeFrom(orig)); err != nil {
542537
return errors.Wrap(err, "failed to patch patroni version")
543538
}
544539

540+
err = r.patchPatroniVersionAnnotation(ctx, cr, patroniVersion)
541+
if err != nil {
542+
return errors.Wrap(err, "failed to patch patroni version annotation")
543+
}
544+
545545
if err := r.Client.Delete(ctx, p); err != nil {
546546
return errors.Wrap(err, "failed to delete patroni version check pod")
547547
}
548-
cr.Annotations[pNaming.AnnotationPatroniVersion] = patroniVersion
549548

550549
return nil
551550
}
552551

552+
func (r *PGClusterReconciler) patchPatroniVersionAnnotation(ctx context.Context, cr *v2.PerconaPGCluster, patroniVersion string) error {
553+
orig := cr.DeepCopy()
554+
cr.Annotations[pNaming.AnnotationPatroniVersion] = patroniVersion
555+
if err := r.Client.Patch(ctx, cr.DeepCopy(), client.MergeFrom(orig)); err != nil {
556+
return errors.Wrap(err, "failed to patch the pg cluster")
557+
}
558+
return nil
559+
}
560+
561+
func (r *PGClusterReconciler) instanceImageIDs(ctx context.Context, cr *v2.PerconaPGCluster) ([]string, error) {
562+
pods := new(corev1.PodList)
563+
instances, err := naming.AsSelector(naming.ClusterInstances(cr.Name))
564+
if err != nil {
565+
return nil, errors.Wrap(err, "failed to create a selector for instance pods")
566+
}
567+
if err = r.Client.List(ctx, pods, client.InNamespace(cr.Namespace), client.MatchingLabelsSelector{Selector: instances}); err != nil {
568+
return nil, errors.Wrap(err, "failed to list instances")
569+
}
570+
571+
// Collecting all image IDs from instance pods. Under normal conditions, this slice will contain a single image ID, as all pods typically use the same image.
572+
// During an image update, it may contain multiple different image IDs as the update progresses.
573+
var imageIDs []string
574+
for _, pod := range pods.Items {
575+
imageID := getImageIDFromPod(&pod, naming.ContainerDatabase)
576+
if imageID != "" && !slices.Contains(imageIDs, imageID) {
577+
imageIDs = append(imageIDs, imageID)
578+
}
579+
}
580+
581+
return imageIDs, nil
582+
}
583+
584+
func getImageIDFromPod(pod *corev1.Pod, containerName string) string {
585+
idx := slices.IndexFunc(pod.Status.ContainerStatuses, func(s corev1.ContainerStatus) bool {
586+
return s.Name == containerName
587+
})
588+
if idx == -1 {
589+
return ""
590+
}
591+
return pod.Status.ContainerStatuses[idx].ImageID
592+
}
593+
553594
func (r *PGClusterReconciler) reconcileTLS(ctx context.Context, cr *v2.PerconaPGCluster) error {
554595
if err := r.validateTLS(ctx, cr); err != nil {
555596
return errors.Wrap(err, "validate TLS")

percona/controller/pgcluster/controller_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,6 +2079,8 @@ var _ = Describe("patroni version check", Ordered, func() {
20792079
Expect(k8sClient.Get(ctx, crNamespacedName, updatedCR)).Should(Succeed())
20802080

20812081
Expect(updatedCR.Status.Patroni.Version).To(Equal("3.2.1"))
2082+
Expect(updatedCR.Status.PatroniVersion).To(Equal("3.2.1"))
2083+
Expect(updatedCR.Annotations[pNaming.AnnotationPatroniVersion]).To(Equal("3.2.1"))
20822084
})
20832085
})
20842086

@@ -2134,7 +2136,9 @@ var _ = Describe("patroni version check", Ordered, func() {
21342136
}
21352137

21362138
cr2.Status.Patroni.Version = "3.1.0"
2139+
cr2.Status.PatroniVersion = "3.1.0"
21372140
cr2.Status.Postgres.ImageID = "some-image-id"
2141+
cr2.Annotations[pNaming.AnnotationPatroniVersion] = "3.1.0"
21382142

21392143
status := cr2.Status
21402144
Expect(k8sClient.Create(ctx, cr2)).Should(Succeed())
@@ -2240,6 +2244,8 @@ var _ = Describe("patroni version check", Ordered, func() {
22402244
Expect(k8sClient.Get(ctx, crNamespacedName2, updatedCR)).Should(Succeed())
22412245

22422246
Expect(updatedCR.Status.Patroni.Version).To(Equal("3.1.0"))
2247+
Expect(updatedCR.Status.PatroniVersion).To(Equal("3.1.0"))
2248+
Expect(updatedCR.Annotations[pNaming.AnnotationPatroniVersion]).To(Equal("3.1.0"))
22432249
})
22442250
})
22452251
})

percona/postgres/common.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ func GetPrimaryPod(ctx context.Context, cli client.Client, cr *v2.PerconaPGClust
1717
// K8SPG-648: patroni v4.0.0 deprecated "master" role.
1818
// We should use "primary" instead
1919
role := "primary"
20-
patroniVer, err := gover.NewVersion(cr.Status.Patroni.Version)
20+
21+
patroniVersion := cr.Status.PatroniVersion
22+
if cr.CompareVersion("2.8.0") >= 0 {
23+
patroniVersion = cr.Status.Patroni.Version
24+
}
25+
26+
patroniVer, err := gover.NewVersion(patroniVersion)
2127
if err != nil {
2228
return nil, errors.Wrap(err, "failed to get patroni version")
2329
}

percona/watcher/wal_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77
"time"
88

9+
"github.com/percona/percona-postgresql-operator/v2/percona/version"
910
"github.com/stretchr/testify/assert"
1011
"github.com/stretchr/testify/require"
1112
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -343,6 +344,9 @@ func TestGetLatestCommitTimestamp(t *testing.T) {
343344
Version: "error",
344345
},
345346
},
347+
Spec: pgv2.PerconaPGClusterSpec{
348+
CRVersion: version.Version(),
349+
},
346350
},
347351
expectedErr: errors.New("failed to get patroni version: Malformed version: error: primary pod not found"),
348352
},

pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,11 @@ type PerconaPGClusterStatus struct {
442442
// +operator-sdk:csv:customresourcedefinitions:type=status
443443
State AppState `json:"state"`
444444

445+
// +optional
446+
// +operator-sdk:csv:customresourcedefinitions:type=status
447+
// Deprecated: Use Patroni instead. This field will be removed in a future release.
448+
PatroniVersion string `json:"patroniVersion"`
449+
445450
// +optional
446451
// +operator-sdk:csv:customresourcedefinitions:type=status
447452
Patroni Patroni `json:"patroni,omitempty"`

0 commit comments

Comments
 (0)