diff --git a/packagelists/amd64/pg16.14-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg16.14-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..6fb93fa --- /dev/null +++ b/packagelists/amd64/pg16.14-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/amd64/pg16.14-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg16.14-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..e9130f5 --- /dev/null +++ b/packagelists/amd64/pg16.14-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/packagelists/amd64/pg17.10-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg17.10-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..d208e38 --- /dev/null +++ b/packagelists/amd64/pg17.10-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/amd64/pg17.10-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg17.10-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..f0e89aa --- /dev/null +++ b/packagelists/amd64/pg17.10-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/packagelists/amd64/pg18.4-spock6.0.0-beta1-minimal.txt b/packagelists/amd64/pg18.4-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..29334f8 --- /dev/null +++ b/packagelists/amd64/pg18.4-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/amd64/pg18.4-spock6.0.0-beta1-standard.txt b/packagelists/amd64/pg18.4-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..ce1dd33 --- /dev/null +++ b/packagelists/amd64/pg18.4-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/packagelists/arm64/pg16.14-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg16.14-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..6fb93fa --- /dev/null +++ b/packagelists/arm64/pg16.14-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/arm64/pg16.14-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg16.14-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..e9130f5 --- /dev/null +++ b/packagelists/arm64/pg16.14-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/packagelists/arm64/pg17.10-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg17.10-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..d208e38 --- /dev/null +++ b/packagelists/arm64/pg17.10-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/arm64/pg17.10-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg17.10-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..f0e89aa --- /dev/null +++ b/packagelists/arm64/pg17.10-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/packagelists/arm64/pg18.4-spock6.0.0-beta1-minimal.txt b/packagelists/arm64/pg18.4-spock6.0.0-beta1-minimal.txt new file mode 100644 index 0000000..29334f8 --- /dev/null +++ b/packagelists/arm64/pg18.4-spock6.0.0-beta1-minimal.txt @@ -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 diff --git a/packagelists/arm64/pg18.4-spock6.0.0-beta1-standard.txt b/packagelists/arm64/pg18.4-spock6.0.0-beta1-standard.txt new file mode 100644 index 0000000..ce1dd33 --- /dev/null +++ b/packagelists/arm64/pg18.4-spock6.0.0-beta1-standard.txt @@ -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 diff --git a/scripts/build_pgedge_images.py b/scripts/build_pgedge_images.py index 70a4994..2263ea2 100755 --- a/scripts/build_pgedge_images.py +++ b/scripts/build_pgedge_images.py @@ -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, + ), ] diff --git a/tests/main.go b/tests/main.go index be2cc73..7166e8f 100644 --- a/tests/main.go +++ b/tests/main.go @@ -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() @@ -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)") @@ -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{ @@ -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) } @@ -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" { @@ -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{ {