diff --git a/Taskfile.yml b/Taskfile.yml index d22a197..ed85e48 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -328,6 +328,9 @@ tasks: # We need to replace localhost with the registry container name as it is how # the registry is reachable from within the Docker network. sh: sed -E 's/^localhost/{{ .REGISTRY_NAME }}/;t' <<< "{{ .EXTENSION_IMAGE }}" + requires: + vars: + - name: TARGET e2e:test: desc: Test target extension using Chainsaw diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index 508c722..618c407 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -136,6 +136,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]] @@ -174,18 +178,19 @@ func (m *Maintenance) GenerateTestingValues( targetExtensionImage) } + extensions, err := generateTestingValuesExtensions(ctx, source, metadata, targetExtensionImage) + if err != nil { + return nil, err + } + // 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..82611b9 100644 --- a/dagger/maintenance/parse.go +++ b/dagger/maintenance/parse.go @@ -3,6 +3,7 @@ package main import ( "context" "encoding/json" + "fmt" "path" "github.com/docker/buildx/bake" @@ -28,6 +29,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"` } @@ -91,6 +93,14 @@ func parseExtensionMetadata(ctx context.Context, extensionDirectory *dagger.Dire Remain hcl.Body `hcl:",remain"` } + hasMetadataFile, err := extensionDirectory.Exists(ctx, metadataFile) + if err != nil { + return nil, err + } + if !hasMetadataFile { + return nil, fmt.Errorf("metadata.hcl file is missing") + } + data, err := extensionDirectory.File(metadataFile).Contents(ctx) if err != nil { return nil, err diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go new file mode 100644 index 0000000..33ec68c --- /dev/null +++ b/dagger/maintenance/testingvalues.go @@ -0,0 +1,60 @@ +package main + +import ( + "context" + "fmt" + + "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 _, dep := range metadata.RequiredExtensions { + depExists, err := source.Exists(ctx, dep) + if err != nil { + return nil, err + } + if !depExists { + return nil, fmt.Errorf("required dependency %q not found", dep) + } + + depMetadata, parseErr := parseExtensionMetadata(ctx, source.Directory(dep)) + if parseErr != nil { + return nil, fmt.Errorf("failed to parse dependency metadata %q: %w", dep, parseErr) + } + depsConfiguration, extErr := generateExtensionConfiguration(depMetadata, "") + 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/templates/metadata.hcl.tmpl b/templates/metadata.hcl.tmpl index d6f800f..cffc0ea 100644 --- a/templates/metadata.hcl.tmpl +++ b/templates/metadata.hcl.tmpl @@ -9,6 +9,7 @@ metadata = { dynamic_library_path = [] ld_library_path = [] auto_update_os_libs = false + required_extensions = [] versions = { {{- range $distro := .Distros}} 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)