Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
3 changes: 3 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 10 additions & 5 deletions dagger/maintenance/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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]]
Expand Down Expand Up @@ -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 {
Expand Down
10 changes: 10 additions & 0 deletions dagger/maintenance/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"context"
"encoding/json"
"fmt"
"path"

"github.com/docker/buildx/bake"
Expand All @@ -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"`
}
Expand Down Expand Up @@ -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("not a valid target, metadata.hcl file is missing")
}

data, err := extensionDirectory.File(metadataFile).Contents(ctx)
if err != nil {
return nil, err
Expand Down
60 changes: 60 additions & 0 deletions dagger/maintenance/testingvalues.go
Original file line number Diff line number Diff line change
@@ -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, 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
}
1 change: 1 addition & 0 deletions pgaudit/metadata.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ metadata = {
dynamic_library_path = []
ld_library_path = []
auto_update_os_libs = false
required_extensions = []

versions = {
bookworm = {
Expand Down
1 change: 1 addition & 0 deletions pgvector/metadata.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ metadata = {
dynamic_library_path = []
ld_library_path = []
auto_update_os_libs = false
required_extensions = []

versions = {
bookworm = {
Expand Down
1 change: 1 addition & 0 deletions postgis/metadata.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ metadata = {
dynamic_library_path = []
ld_library_path = ["/system"]
auto_update_os_libs = true
required_extensions = []

versions = {
bookworm = {
Expand Down
8 changes: 1 addition & 7 deletions postgis/test/cluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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)
1 change: 1 addition & 0 deletions templates/metadata.hcl.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ metadata = {
dynamic_library_path = []
ld_library_path = []
auto_update_os_libs = false
required_extensions = []

versions = {
{{- range $distro := .Distros}}
Expand Down
8 changes: 1 addition & 7 deletions test/cluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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)