Skip to content

Commit 30b125c

Browse files
phiscosxd
andauthored
fix: webhook accepting image tags such as 15beta1 (cloudnative-pg#279)
Signed-off-by: Philippe Scorsolini <p.scorsolini@gmail.com> Signed-off-by: Jonathan Gonzalez V <jonathan.gonzalez@enterprisedb.com> Co-authored-by: Jonathan Gonzalez V <jonathan.gonzalez@enterprisedb.com>
1 parent 04b0a13 commit 30b125c

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

api/v1/cluster_webhook_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,33 @@ var _ = Describe("Image name validation", func() {
529529
Expect(len(cluster.validateImageName())).To(Equal(1))
530530
})
531531

532+
It("doesn't complain when a alpha tag is used", func() {
533+
cluster := Cluster{
534+
Spec: ClusterSpec{
535+
ImageName: "postgres:15alpha1",
536+
},
537+
}
538+
Expect(len(cluster.validateImageName())).To(Equal(0))
539+
})
540+
541+
It("doesn't complain when a beta tag is used", func() {
542+
cluster := Cluster{
543+
Spec: ClusterSpec{
544+
ImageName: "postgres:15beta1",
545+
},
546+
}
547+
Expect(len(cluster.validateImageName())).To(Equal(0))
548+
})
549+
550+
It("doesn't complain when a release candidate tag is used", func() {
551+
cluster := Cluster{
552+
Spec: ClusterSpec{
553+
ImageName: "postgres:15rc1",
554+
},
555+
}
556+
Expect(len(cluster.validateImageName())).To(Equal(0))
557+
})
558+
532559
It("complains when only the sha is passed", func() {
533560
cluster := Cluster{
534561
Spec: ClusterSpec{
@@ -547,6 +574,15 @@ var _ = Describe("Image name validation", func() {
547574
Expect(cluster.validateImageName()).To(BeEmpty())
548575
})
549576

577+
It("doesn't complain if the tag is valid", func() {
578+
cluster := Cluster{
579+
Spec: ClusterSpec{
580+
ImageName: "postgres:14.4-1",
581+
},
582+
}
583+
Expect(cluster.validateImageName()).To(BeEmpty())
584+
})
585+
550586
It("doesn't complain if the tag is valid and has sha", func() {
551587
cluster := Cluster{
552588
Spec: ClusterSpec{

pkg/postgres/version.go

+18-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"io/ioutil"
2222
"path"
23+
"regexp"
2324
"strconv"
2425
"strings"
2526

@@ -28,14 +29,22 @@ import (
2829

2930
const firstMajorWithoutMinor = 10
3031

32+
var semanticVersionRegex = regexp.MustCompile(`^(\d\.?)+`)
33+
3134
// GetPostgresVersionFromTag parse a PostgreSQL version string returning
3235
// a major version ID. Example:
3336
//
3437
// GetPostgresVersionFromTag("9.5.3") == 90503
3538
// GetPostgresVersionFromTag("10.2") == 100002
39+
// GetPostgresVersionFromTag("15beta1") == 150000
3640
func GetPostgresVersionFromTag(version string) (int, error) {
37-
if versionDelimiter := strings.IndexAny(version, "_-"); versionDelimiter >= 0 {
38-
version = version[:versionDelimiter]
41+
if !semanticVersionRegex.MatchString(version) {
42+
return 0,
43+
fmt.Errorf("version not starting with a semantic version regex (%v): %s", semanticVersionRegex, version)
44+
}
45+
46+
if versionOnly := semanticVersionRegex.FindString(version); versionOnly != "" {
47+
version = versionOnly
3948
}
4049

4150
splitVersion := strings.Split(version, ".")
@@ -73,8 +82,13 @@ func GetPostgresVersionFromTag(version string) (int, error) {
7382

7483
// GetPostgresMajorVersionFromTag retrieves the major version from a version tag
7584
func GetPostgresMajorVersionFromTag(version string) (int, error) {
76-
if versionDelimiter := strings.IndexAny(version, "_-"); versionDelimiter >= 0 {
77-
version = version[:versionDelimiter]
85+
if !semanticVersionRegex.MatchString(version) {
86+
return 0,
87+
fmt.Errorf("version not starting with a semantic version regex (%v): %s", semanticVersionRegex, version)
88+
}
89+
90+
if versionOnly := semanticVersionRegex.FindString(version); versionOnly != "" {
91+
version = versionOnly
7892
}
7993

8094
splitVersion := strings.Split(version, ".")

pkg/postgres/version_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var _ = Describe("PostgreSQL version handling", func() {
3838
Expect(GetPostgresVersionFromTag("10.11.12")).To(Equal(100011))
3939
Expect(GetPostgresVersionFromTag("9.4_beautiful")).To(Equal(90400))
4040
Expect(GetPostgresVersionFromTag("11-1")).To(Equal(110000))
41+
Expect(GetPostgresVersionFromTag("15beta1")).To(Equal(150000))
4142
})
4243

4344
It("should gracefully handle errors", func() {

0 commit comments

Comments
 (0)