Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packagelists/amd64/pg16.14-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql16-16.14-2.el9
pgedge-spock60_16-6.0.0-beta1_1.el9
pgedge-snowflake_16-2.5.0-1.el9
pgedge-lolor_16-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/amd64/pg16.14-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql16-16.14-2.el9
pgedge-spock60_16-6.0.0-beta1_1.el9
pgedge-snowflake_16-2.5.0-1.el9
pgedge-lolor_16-1.2.2-1.el9
pgedge-pgaudit_16-16.1-1.el9
pgedge-postgis35_16-3.5.5-1.el9
pgedge-pgvector_16-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_16-1.8.0-1.el9
pgedge-pg_cron_16-1.6.7-1.el9
pgedge-pg-tokenizer_16-0.1.1-1.el9
pgedge-pg-vectorize_16-0.23.0-1.el9
pgedge-pg-stat-monitor_16-2.3.0-1.el9
pgedge-vchord-bm25_16-0.2.2-1.el9
pgedge-vectorizer_16-1.0-1.el9
pgedge-system_stats_16-3.2.1-1.el9
pgedge-supautils_16-3.2.2-1.el9
4 changes: 4 additions & 0 deletions packagelists/amd64/pg17.10-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql17-17.10-2.el9
pgedge-spock60_17-6.0.0-beta1_1.el9
pgedge-snowflake_17-2.5.0-1.el9
pgedge-lolor_17-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/amd64/pg17.10-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql17-17.10-2.el9
pgedge-spock60_17-6.0.0-beta1_1.el9
pgedge-snowflake_17-2.5.0-1.el9
pgedge-lolor_17-1.2.2-1.el9
pgedge-pgaudit_17-17.1-1.el9
pgedge-postgis35_17-3.5.5-1.el9
pgedge-pgvector_17-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_17-1.8.0-1.el9
pgedge-pg_cron_17-1.6.7-1.el9
pgedge-pg-tokenizer_17-0.1.1-1.el9
pgedge-pg-vectorize_17-0.23.0-1.el9
pgedge-pg-stat-monitor_17-2.3.0-1.el9
pgedge-vchord-bm25_17-0.2.2-1.el9
pgedge-vectorizer_17-1.0-1.el9
pgedge-system_stats_17-3.2.1-1.el9
pgedge-supautils_17-3.2.2-1.el9
4 changes: 4 additions & 0 deletions packagelists/amd64/pg18.4-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql18-18.4-2.el9
pgedge-spock60_18-6.0.0-beta1_1.el9
pgedge-snowflake_18-2.5.0-1.el9
pgedge-lolor_18-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/amd64/pg18.4-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql18-18.4-2.el9
pgedge-spock60_18-6.0.0-beta1_1.el9
pgedge-snowflake_18-2.5.0-1.el9
pgedge-lolor_18-1.2.2-1.el9
pgedge-pgaudit_18-18.0-1.el9
pgedge-postgis35_18-3.5.5-1.el9
pgedge-pgvector_18-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_18-1.8.0-1.el9
pgedge-pg_cron_18-1.6.7-1.el9
pgedge-pg-tokenizer_18-0.1.1-1.el9
pgedge-pg-vectorize_18-0.23.0-1.el9
pgedge-pg-stat-monitor_18-2.3.0-1.el9
pgedge-vchord-bm25_18-0.2.2-1.el9
pgedge-vectorizer_18-1.0-1.el9
pgedge-system_stats_18-3.2.1-1.el9
pgedge-supautils_18-3.2.2-1.el9
4 changes: 4 additions & 0 deletions packagelists/arm64/pg16.14-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql16-16.14-2.el9
pgedge-spock60_16-6.0.0-beta1_1.el9
pgedge-snowflake_16-2.5.0-1.el9
pgedge-lolor_16-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/arm64/pg16.14-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql16-16.14-2.el9
pgedge-spock60_16-6.0.0-beta1_1.el9
pgedge-snowflake_16-2.5.0-1.el9
pgedge-lolor_16-1.2.2-1.el9
pgedge-pgaudit_16-16.1-1.el9
pgedge-postgis35_16-3.5.5-1.el9
pgedge-pgvector_16-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_16-1.8.0-1.el9
pgedge-pg_cron_16-1.6.7-1.el9
pgedge-pg-tokenizer_16-0.1.1-1.el9
pgedge-pg-vectorize_16-0.23.0-1.el9
pgedge-pg-stat-monitor_16-2.3.0-1.el9
pgedge-vchord-bm25_16-0.2.2-1.el9
pgedge-vectorizer_16-1.0-1.el9
pgedge-system_stats_16-3.2.1-1.el9
pgedge-supautils_16-3.2.2-1.el9
4 changes: 4 additions & 0 deletions packagelists/arm64/pg17.10-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql17-17.10-2.el9
pgedge-spock60_17-6.0.0-beta1_1.el9
pgedge-snowflake_17-2.5.0-1.el9
pgedge-lolor_17-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/arm64/pg17.10-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql17-17.10-2.el9
pgedge-spock60_17-6.0.0-beta1_1.el9
pgedge-snowflake_17-2.5.0-1.el9
pgedge-lolor_17-1.2.2-1.el9
pgedge-pgaudit_17-17.1-1.el9
pgedge-postgis35_17-3.5.5-1.el9
pgedge-pgvector_17-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_17-1.8.0-1.el9
pgedge-pg_cron_17-1.6.7-1.el9
pgedge-pg-tokenizer_17-0.1.1-1.el9
pgedge-pg-vectorize_17-0.23.0-1.el9
pgedge-pg-stat-monitor_17-2.3.0-1.el9
pgedge-vchord-bm25_17-0.2.2-1.el9
pgedge-vectorizer_17-1.0-1.el9
pgedge-system_stats_17-3.2.1-1.el9
pgedge-supautils_17-3.2.2-1.el9
4 changes: 4 additions & 0 deletions packagelists/arm64/pg18.4-spock6.0.0-beta1-minimal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pgedge-postgresql18-18.4-2.el9
pgedge-spock60_18-6.0.0-beta1_1.el9
pgedge-snowflake_18-2.5.0-1.el9
pgedge-lolor_18-1.2.2-1.el9
18 changes: 18 additions & 0 deletions packagelists/arm64/pg18.4-spock6.0.0-beta1-standard.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
pgedge-postgresql18-18.4-2.el9
pgedge-spock60_18-6.0.0-beta1_1.el9
pgedge-snowflake_18-2.5.0-1.el9
pgedge-lolor_18-1.2.2-1.el9
pgedge-pgaudit_18-18.0-1.el9
pgedge-postgis35_18-3.5.5-1.el9
pgedge-pgvector_18-0.8.1-1.el9
pgedge-pgbackrest-2.58.0-1.el9
pgedge-python3-psycopg2-2.9.10-1.el9
pgedge-pgmq_18-1.8.0-1.el9
pgedge-pg_cron_18-1.6.7-1.el9
pgedge-pg-tokenizer_18-0.1.1-1.el9
pgedge-pg-vectorize_18-0.23.0-1.el9
pgedge-pg-stat-monitor_18-2.3.0-1.el9
pgedge-vchord-bm25_18-0.2.2-1.el9
pgedge-vectorizer_18-1.0-1.el9
pgedge-system_stats_18-3.2.1-1.el9
pgedge-supautils_18-3.2.2-1.el9
24 changes: 24 additions & 0 deletions scripts/build_pgedge_images.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,30 @@ def make_all_flavor_images(
is_latest_for_pg_major=True,
is_latest_for_spock_major=True,
),
# pg16 spock60 images
*make_all_flavor_images(
postgres_version="16.14",
spock_version="6.0.0-beta1",
epoch=1,
is_latest_for_pg_major=True,
is_latest_for_spock_major=True,
),
# pg17 spock60 images
*make_all_flavor_images(
postgres_version="17.10",
spock_version="6.0.0-beta1",
epoch=1,
is_latest_for_pg_major=True,
is_latest_for_spock_major=True,
),
# pg18 spock60 images
*make_all_flavor_images(
postgres_version="18.4",
spock_version="6.0.0-beta1",
epoch=1,
is_latest_for_pg_major=True,
is_latest_for_spock_major=True,
),
]


Expand Down
78 changes: 71 additions & 7 deletions tests/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ type DefaultEntrypointRunner struct {
func main() {
image, flavor := parseFlags()

// Derive the expected spock major version from the image tag (e.g.
// "...-spock6.0.0-beta1-standard" -> "6"). Used to assert that the image
// actually ships the spock version its tag advertises.
spockMajor := spockMajorFromImage(image)

printHeader(image, flavor)

cli, ctx := setupDockerClient()
Expand All @@ -59,14 +64,41 @@ func main() {
}

errorCount := runEntrypointTests(defaultRunner, flavor)
errorCount += runExtensionTests(cli, ctx, image, flavor)
errorCount += runExtensionTests(cli, ctx, image, flavor, spockMajor)

printSummary(errorCount, flavor)
printSummary(errorCount, flavor, spockMajor)
if errorCount > 0 {
os.Exit(1)
}
}

// spockMajorFromImage extracts the spock major version from an image reference's
// tag, e.g. "ghcr.io/pgedge/pgedge-postgres:16.14-spock6.0.0-beta1-standard-1"
// or "...:16-spock6-standard" both yield "6". It returns "" when no spock
// version can be determined, in which case the version assertion is skipped.
func spockMajorFromImage(image string) string {
// Isolate the tag: the portion after the final ':'. Registry ports (e.g.
// "127.0.0.1:5000/...") use earlier colons, so the last one starts the tag.
tag := image
if idx := strings.LastIndex(image, ":"); idx != -1 {
tag = image[idx+1:]
}

idx := strings.Index(tag, "spock")
if idx == -1 {
return ""
}

var major strings.Builder
for _, c := range tag[idx+len("spock"):] {
if c < '0' || c > '9' {
break
}
major.WriteRune(c)
}
return major.String()
}

func parseFlags() (string, string) {
image := flag.String("image", "", "Docker image to test (required)")
flavor := flag.String("flavor", "", "Image flavor: minimal or standard (required)")
Expand Down Expand Up @@ -135,7 +167,7 @@ func runEntrypointTests(runner *DefaultEntrypointRunner, flavor string) int {
return errorCount
}

func runExtensionTests(cli *client.Client, ctx context.Context, image, flavor string) int {
func runExtensionTests(cli *client.Client, ctx context.Context, image, flavor, spockMajor string) int {
printPhaseHeader("Phase 3: Extension Tests")

runner := &TestRunner{
Expand All @@ -154,7 +186,7 @@ func runExtensionTests(cli *client.Client, ctx context.Context, image, flavor st
}
defer runner.Cleanup()

tests := buildTestSuite()
tests := buildTestSuite(spockMajor)
return runner.RunTests(tests)
}

Expand All @@ -163,8 +195,8 @@ func printPhaseHeader(title string) {
fmt.Println()
}

func printSummary(errorCount int, flavor string) {
tests := buildTestSuite()
func printSummary(errorCount int, flavor, spockMajor string) {
tests := buildTestSuite(spockMajor)
extensionTests := 0
for _, t := range tests {
if !t.StandardOnly || flavor == "standard" {
Expand Down Expand Up @@ -625,14 +657,46 @@ func (r *TestRunner) RunTests(tests []Test) int {
return errorCount
}

func buildTestSuite() []Test {
func buildTestSuite(spockMajor string) []Test {
tests := []Test{}
tests = append(tests, getPostgreSQLTests()...)
tests = append(tests, getCommonExtensionTests()...)
// Runs after getCommonExtensionTests, which creates the spock extension.
tests = append(tests, getSpockVersionTests(spockMajor)...)
tests = append(tests, getStandardOnlyTests()...)
return tests
}

// getSpockVersionTests asserts that the spock extension installed in the image
// matches the major version advertised by the image tag. This distinguishes,
// for example, a spock6 image from a spock5 image — a mismatch would otherwise
// pass every other test unnoticed. Returns no tests when the expected major
// version could not be derived from the image tag.
func getSpockVersionTests(spockMajor string) []Test {
if spockMajor == "" {
return nil
}
return []Test{
{
Name: fmt.Sprintf("Spock extension major version is %s", spockMajor),
Cmd: "psql -U postgres -d testdb -t -A -c \"SELECT extversion FROM pg_extension WHERE extname = 'spock';\"",
ExpectedOutput: func(exitCode int, output string) error {
if exitCode != 0 {
return fmt.Errorf("unexpected exit code: %d", exitCode)
}
version := strings.TrimSpace(output)
if version == "" {
return fmt.Errorf("spock extension is not installed")
}
if !strings.HasPrefix(version, spockMajor+".") {
return fmt.Errorf("spock version %q does not match expected major version %s", version, spockMajor)
}
return nil
},
},
}
}

func getPostgreSQLTests() []Test {
return []Test{
{
Expand Down
Loading