From 0c388d66c223ee27adb8452f8247d532fd9ab3ae Mon Sep 17 00:00:00 2001 From: Matteo Date: Thu, 15 Jan 2026 16:17:43 +0100 Subject: [PATCH] feat: support required extensions Signed-off-by: Matteo --- dagger/maintenance/main.go | 19 ++++++++--- dagger/maintenance/parse.go | 1 + dagger/maintenance/testingvalues.go | 49 +++++++++++++++++++++++++++++ pgaudit/metadata.hcl | 1 + pgvector/metadata.hcl | 1 + postgis/metadata.hcl | 1 + postgis/test/cluster.yaml | 8 +---- test/cluster.yaml | 8 +---- 8 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 dagger/maintenance/testingvalues.go diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index 6d3521d..662ec77 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -130,6 +130,10 @@ func (m *Maintenance) GetTargets( // Generates Chainsaw's testing external values in YAML format func (m *Maintenance) GenerateTestingValues( ctx context.Context, + // The source directory containing the extension folders. Defaults to the current directory + // +ignore=["dagger", ".github"] + // +defaultPath="/" + source *dagger.Directory, // Path to the target extension directory target *dagger.Directory, // URL reference to the extension image to test [REPOSITORY[:TAG]] @@ -168,18 +172,23 @@ func (m *Maintenance) GenerateTestingValues( targetExtensionImage) } + extensions, generateExtErr := generateTestingValuesExtensions( + ctx, + source, + metadata, + targetExtensionImage, + ) + if generateExtErr != nil { + return nil, generateExtErr + } // Build values.yaml content values := map[string]any{ "name": metadata.Name, "sql_name": metadata.SQLName, - "image_name": metadata.ImageName, "shared_preload_libraries": metadata.SharedPreloadLibraries, - "extension_control_path": metadata.ExtensionControlPath, - "dynamic_library_path": metadata.DynamicLibraryPath, - "ld_library_path": metadata.LdLibraryPath, - "extension_image": targetExtensionImage, "pg_image": pgImage, "version": version, + "extensions": extensions, } valuesYaml, err := yaml.Marshal(values) if err != nil { diff --git a/dagger/maintenance/parse.go b/dagger/maintenance/parse.go index d82dd81..5853634 100644 --- a/dagger/maintenance/parse.go +++ b/dagger/maintenance/parse.go @@ -28,6 +28,7 @@ type extensionMetadata struct { DynamicLibraryPath []string `hcl:"dynamic_library_path" cty:"dynamic_library_path"` LdLibraryPath []string `hcl:"ld_library_path" cty:"ld_library_path"` AutoUpdateOsLibs bool `hcl:"auto_update_os_libs" cty:"auto_update_os_libs"` + RequiredExtensions []string `hcl:"required_extensions" cty:"required_extensions"` Versions versionMap `hcl:"versions" cty:"versions"` Remain hcl.Body `hcl:",remain"` } diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go new file mode 100644 index 0000000..99e7b99 --- /dev/null +++ b/dagger/maintenance/testingvalues.go @@ -0,0 +1,49 @@ +package main + +import ( + "context" + + "dagger/maintenance/internal/dagger" +) + +func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directory, metadata *extensionMetadata, extensionImage string) ([]map[string]any, error) { + var out []map[string]any + configuration, err := generateExtensionConfiguration(metadata, extensionImage) + if err != nil { + return nil, err + } + out = append(out, configuration) + for _, deps := range metadata.RequiredExtensions { + depsMetadata, parseErr := parseExtensionMetadata(ctx, source.Directory(deps)) + if parseErr != nil { + return nil, parseErr + } + depsConfiguration, extErr := generateExtensionConfiguration(depsMetadata, "") + if extErr != nil { + return nil, extErr + } + out = append(out, depsConfiguration) + + } + return out, nil +} + +func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage string) (map[string]any, error) { + targetExtensionImage := extensionImage + if targetExtensionImage == "" { + var err error + targetExtensionImage, err = getDefaultExtensionImage(metadata) + if err != nil { + return nil, err + } + } + return map[string]any{ + "name": metadata.Name, + "image": map[string]string{ + "reference": targetExtensionImage, + }, + "extension_control_path": metadata.ExtensionControlPath, + "dynamic_library_path": metadata.DynamicLibraryPath, + "ld_library_path": metadata.LdLibraryPath, + }, nil +} diff --git a/pgaudit/metadata.hcl b/pgaudit/metadata.hcl index 7cdf53a..ba2a970 100644 --- a/pgaudit/metadata.hcl +++ b/pgaudit/metadata.hcl @@ -7,6 +7,7 @@ metadata = { dynamic_library_path = [] ld_library_path = [] auto_update_os_libs = false + required_extensions = [] versions = { bookworm = { diff --git a/pgvector/metadata.hcl b/pgvector/metadata.hcl index c8ca281..965b403 100644 --- a/pgvector/metadata.hcl +++ b/pgvector/metadata.hcl @@ -7,6 +7,7 @@ metadata = { dynamic_library_path = [] ld_library_path = [] auto_update_os_libs = false + required_extensions = [] versions = { bookworm = { diff --git a/postgis/metadata.hcl b/postgis/metadata.hcl index be8de2c..9f2156c 100644 --- a/postgis/metadata.hcl +++ b/postgis/metadata.hcl @@ -7,6 +7,7 @@ metadata = { dynamic_library_path = [] ld_library_path = ["/system"] auto_update_os_libs = true + required_extensions = [] versions = { bookworm = { diff --git a/postgis/test/cluster.yaml b/postgis/test/cluster.yaml index 779b4a1..1a06cd3 100644 --- a/postgis/test/cluster.yaml +++ b/postgis/test/cluster.yaml @@ -11,10 +11,4 @@ spec: postgresql: shared_preload_libraries: ($values.shared_preload_libraries) - extensions: - - name: ($values.name) - image: - reference: ($values.extension_image) - extension_control_path: ($values.extension_control_path) - dynamic_library_path: ($values.dynamic_library_path) - ld_library_path: ($values.ld_library_path) + extensions: ($values.extensions) diff --git a/test/cluster.yaml b/test/cluster.yaml index 779b4a1..1a06cd3 100644 --- a/test/cluster.yaml +++ b/test/cluster.yaml @@ -11,10 +11,4 @@ spec: postgresql: shared_preload_libraries: ($values.shared_preload_libraries) - extensions: - - name: ($values.name) - image: - reference: ($values.extension_image) - extension_control_path: ($values.extension_control_path) - dynamic_library_path: ($values.dynamic_library_path) - ld_library_path: ($values.ld_library_path) + extensions: ($values.extensions)