Skip to content

Commit 82097e7

Browse files
committed
Create warning event when postgres version is EOL.
1 parent e2fa7f2 commit 82097e7

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed

internal/controller/postgrescluster/controller.go

+10
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,16 @@ func (r *Reconciler) Reconcile(
136136
return runtime.ErrorWithBackoff(err)
137137
}
138138
}
139+
// Issue Warning Event if postgres version is EOL according to PostgreSQL:
140+
// https://www.postgresql.org/support/versioning/
141+
currentTime := time.Now()
142+
if postgres.ReleaseIsFinal(cluster.Spec.PostgresVersion, currentTime) {
143+
r.Recorder.Eventf(cluster, corev1.EventTypeWarning, "EndOfLifePostgresVersion",
144+
"The last minor version of Postgres %[1]v has been released."+
145+
" PG %[1]v will no longer receive updates. We recommend upgrading."+
146+
" See https://www.postgresql.org/support/versioning",
147+
cluster.Spec.PostgresVersion)
148+
}
139149

140150
if cluster.Spec.Standby != nil &&
141151
cluster.Spec.Standby.Enabled &&

internal/controller/postgrescluster/controller_test.go

+62
Original file line numberDiff line numberDiff line change
@@ -556,4 +556,66 @@ spec:
556556
Expect(instance.Spec.Replicas).To(PointTo(BeEquivalentTo(1)))
557557
})
558558
})
559+
560+
Context("Postgres version EOL", func() {
561+
var cluster *v1beta1.PostgresCluster
562+
563+
BeforeEach(func() {
564+
cluster = create(`
565+
metadata:
566+
name: old-postgres
567+
spec:
568+
postgresVersion: 11
569+
image: postgres
570+
instances:
571+
- name: instance1
572+
dataVolumeClaimSpec:
573+
accessModes:
574+
- "ReadWriteMany"
575+
resources:
576+
requests:
577+
storage: 1Gi
578+
backups:
579+
pgbackrest:
580+
image: pgbackrest
581+
repos:
582+
- name: repo1
583+
volume:
584+
volumeClaimSpec:
585+
accessModes:
586+
- "ReadWriteOnce"
587+
resources:
588+
requests:
589+
storage: 1Gi
590+
`)
591+
Expect(reconcile(cluster)).To(BeZero())
592+
})
593+
594+
AfterEach(func() {
595+
ctx := context.Background()
596+
597+
if cluster != nil {
598+
Expect(client.IgnoreNotFound(
599+
suite.Client.Delete(ctx, cluster),
600+
)).To(Succeed())
601+
602+
// Remove finalizers, if any, so the namespace can terminate.
603+
Expect(client.IgnoreNotFound(
604+
suite.Client.Patch(ctx, cluster, client.RawPatch(
605+
client.Merge.Type(), []byte(`{"metadata":{"finalizers":[]}}`))),
606+
)).To(Succeed())
607+
}
608+
})
609+
610+
Specify("Postgres EOL Warning Event", func() {
611+
existing := &v1beta1.PostgresCluster{}
612+
Expect(suite.Client.Get(
613+
context.Background(), client.ObjectKeyFromObject(cluster), existing,
614+
)).To(Succeed())
615+
616+
event, ok := <-test.Recorder.Events
617+
Expect(ok).To(BeTrue())
618+
Expect(event).To(ContainSubstring("PG 11 will no longer receive updates. We recommend upgrading."))
619+
})
620+
})
559621
})

internal/postgres/versions.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2021 - 2024 Crunchy Data Solutions, Inc.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package postgres
6+
7+
import "time"
8+
9+
// https://www.postgresql.org/support/versioning
10+
var finalReleaseDates = map[int]time.Time{
11+
10: time.Date(2022, time.November+1, 10, 0, 0, 0, 0, time.UTC),
12+
11: time.Date(2023, time.November+1, +9, 0, 0, 0, 0, time.UTC),
13+
12: time.Date(2024, time.November+1, 14, 0, 0, 0, 0, time.UTC),
14+
13: time.Date(2025, time.November+1, 13, 0, 0, 0, 0, time.UTC),
15+
14: time.Date(2026, time.November+1, 12, 0, 0, 0, 0, time.UTC),
16+
15: time.Date(2027, time.November+1, 11, 0, 0, 0, 0, time.UTC),
17+
16: time.Date(2028, time.November+1, +9, 0, 0, 0, 0, time.UTC),
18+
17: time.Date(2029, time.November+1, +8, 0, 0, 0, 0, time.UTC),
19+
}
20+
21+
// ReleaseIsFinal returns whether or not t is definitively past the final
22+
// scheduled release of a Postgres version.
23+
func ReleaseIsFinal(majorVersion int, t time.Time) bool {
24+
known, ok := finalReleaseDates[majorVersion]
25+
return ok && t.After(known)
26+
}

internal/postgres/versions_test.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2021 - 2024 Crunchy Data Solutions, Inc.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package postgres
6+
7+
import (
8+
"testing"
9+
"time"
10+
11+
"gotest.tools/v3/assert"
12+
)
13+
14+
func TestReleaseIsFinal(t *testing.T) {
15+
// On November 4th, 2024, PG 10 and 11 were EOL and 12-17 were supported.
16+
testDate, err := time.Parse("2006-Jan-02", "2024-Nov-04")
17+
assert.NilError(t, err)
18+
assert.Check(t, ReleaseIsFinal(10, testDate))
19+
assert.Check(t, ReleaseIsFinal(11, testDate))
20+
assert.Check(t, !ReleaseIsFinal(12, testDate))
21+
assert.Check(t, !ReleaseIsFinal(13, testDate))
22+
assert.Check(t, !ReleaseIsFinal(14, testDate))
23+
assert.Check(t, !ReleaseIsFinal(15, testDate))
24+
assert.Check(t, !ReleaseIsFinal(16, testDate))
25+
assert.Check(t, !ReleaseIsFinal(17, testDate))
26+
27+
// On December 15th, 2024 we alert that PG 12 is EOL
28+
testDate = testDate.AddDate(0, 1, 11)
29+
assert.Check(t, ReleaseIsFinal(12, testDate))
30+
31+
// ReleaseIsFinal covers PG versions 10 and greater. Any version not covered
32+
// by the case statement in ReleaseIsFinal returns false
33+
assert.Check(t, !ReleaseIsFinal(1, testDate))
34+
}

0 commit comments

Comments
 (0)