From bc5de2fb7d472668cb4f9da467fb449a4ac67ba0 Mon Sep 17 00:00:00 2001 From: Matteo Date: Thu, 29 Jan 2026 17:18:58 +0100 Subject: [PATCH 1/7] feat: Make CREATE EXTENSION tests optional Signed-off-by: Matteo --- dagger/maintenance/main.go | 14 ++++++++++++++ dagger/maintenance/parse.go | 1 + pgaudit/metadata.hcl | 1 + pgvector/metadata.hcl | 1 + postgis/metadata.hcl | 1 + templates/metadata.hcl.tmpl | 1 + test/check-extension.yaml | 6 ++++++ test/database-assert.yaml | 4 ---- test/database.yaml | 4 +--- 9 files changed, 26 insertions(+), 7 deletions(-) diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index 3a03261..a2c85ac 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -185,6 +185,17 @@ func (m *Maintenance) GenerateTestingValues( return nil, err } + var extensionsToCreate []map[string]string + var expectedExtensions []map[string]any + if metadata.CreateExtension { + extensionsToCreate = []map[string]string{ + {"name": metadata.SQLName, "version": version}, + } + expectedExtensions = []map[string]any{ + {"applied": true, "name": metadata.SQLName}, + } + } + // Build values.yaml content values := map[string]any{ "name": metadata.Name, @@ -193,6 +204,9 @@ func (m *Maintenance) GenerateTestingValues( "pg_image": pgImage, "version": version, "extensions": extensions, + "create_extension": metadata.CreateExtension, + "extensions_to_create": extensionsToCreate, + "expected_extensions": expectedExtensions, } valuesYaml, err := yaml.Marshal(values) if err != nil { diff --git a/dagger/maintenance/parse.go b/dagger/maintenance/parse.go index 82611b9..600fcf4 100644 --- a/dagger/maintenance/parse.go +++ b/dagger/maintenance/parse.go @@ -30,6 +30,7 @@ type extensionMetadata struct { 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"` + CreateExtension bool `hcl:"create_extension" cty:"create_extension"` Versions versionMap `hcl:"versions" cty:"versions"` Remain hcl.Body `hcl:",remain"` } diff --git a/pgaudit/metadata.hcl b/pgaudit/metadata.hcl index ba2a970..35a4670 100644 --- a/pgaudit/metadata.hcl +++ b/pgaudit/metadata.hcl @@ -8,6 +8,7 @@ metadata = { ld_library_path = [] auto_update_os_libs = false required_extensions = [] + create_extension = true versions = { bookworm = { diff --git a/pgvector/metadata.hcl b/pgvector/metadata.hcl index 965b403..afb37f3 100644 --- a/pgvector/metadata.hcl +++ b/pgvector/metadata.hcl @@ -8,6 +8,7 @@ metadata = { ld_library_path = [] auto_update_os_libs = false required_extensions = [] + create_extension = true versions = { bookworm = { diff --git a/postgis/metadata.hcl b/postgis/metadata.hcl index 448ad6c..cf9c76a 100644 --- a/postgis/metadata.hcl +++ b/postgis/metadata.hcl @@ -8,6 +8,7 @@ metadata = { ld_library_path = ["system"] auto_update_os_libs = true required_extensions = [] + create_extension = true versions = { bookworm = { diff --git a/templates/metadata.hcl.tmpl b/templates/metadata.hcl.tmpl index 84fad8e..56b45f8 100644 --- a/templates/metadata.hcl.tmpl +++ b/templates/metadata.hcl.tmpl @@ -47,6 +47,7 @@ metadata = { # `required_extensions`: must contain the name(s) of the sibling # folders in this repository that contain a required extension. required_extensions = [] + create_extension = true versions = { {{- range $distro := .Distros}} diff --git a/test/check-extension.yaml b/test/check-extension.yaml index d0f2241..4194a4a 100644 --- a/test/check-extension.yaml +++ b/test/check-extension.yaml @@ -13,6 +13,8 @@ spec: value: ($values.sql_name) - name: EXT_VERSION value: ($values.version) + - name: CREATE_EXTENSION + value: (to_string($values.create_extension)) - name: DB_URI valueFrom: secretKeyRef: @@ -23,6 +25,10 @@ spec: args: - | set -e + if [ "$CREATE_EXTENSION" != "true" ]; then + echo "Skipping extension check (create_extension=false)" + exit 0 + fi DB_URI=$(echo $DB_URI | sed "s|/\*|/|") test "$(psql "$DB_URI" -tAc "SELECT EXISTS (SELECT FROM pg_catalog.pg_extension WHERE extname = '${EXT_SQL_NAME}' AND extversion = '${EXT_VERSION}')" -q)" = "t" echo "Extension '${EXT_SQL_NAME} v${EXT_VERSION}' is installed!" diff --git a/test/database-assert.yaml b/test/database-assert.yaml index dcc0f42..eebb91f 100644 --- a/test/database-assert.yaml +++ b/test/database-assert.yaml @@ -4,7 +4,3 @@ metadata: name: (join('-', [$values.name, 'app'])) status: applied: true - extensions: - - applied: true - name: ($values.sql_name) - observedGeneration: 1 diff --git a/test/database.yaml b/test/database.yaml index fd61499..e36b10f 100644 --- a/test/database.yaml +++ b/test/database.yaml @@ -7,6 +7,4 @@ spec: owner: app cluster: name: ($values.name) - extensions: - - name: ($values.sql_name) - version: ($values.version) + extensions: ($values.extensions_to_create) From 0a3ad690b63145251e0a17a24b45dc617755c83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2=20Fei?= Date: Thu, 5 Feb 2026 16:09:56 +0100 Subject: [PATCH 2/7] feat: support adding required_dependencies in the Database CR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Niccolò Fei --- dagger/maintenance/dagger.json | 2 +- dagger/maintenance/go.mod | 4 +- dagger/maintenance/main.go | 30 +++----- dagger/maintenance/testingvalues.go | 103 +++++++++++++++++++++++----- test/database-assert.yaml | 2 + test/database.yaml | 2 +- 6 files changed, 103 insertions(+), 40 deletions(-) diff --git a/dagger/maintenance/dagger.json b/dagger/maintenance/dagger.json index 016457b..40159ae 100644 --- a/dagger/maintenance/dagger.json +++ b/dagger/maintenance/dagger.json @@ -1,6 +1,6 @@ { "name": "maintenance", - "engineVersion": "v0.19.7", + "engineVersion": "v0.19.10", "sdk": { "source": "go" } diff --git a/dagger/maintenance/go.mod b/dagger/maintenance/go.mod index e1300e6..51f7f42 100644 --- a/dagger/maintenance/go.mod +++ b/dagger/maintenance/go.mod @@ -88,7 +88,7 @@ require ( github.com/moby/term v0.5.2 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/opencontainers/image-spec v1.1.1 github.com/pelletier/go-toml v1.9.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect @@ -130,7 +130,7 @@ require ( golang.org/x/net v0.44.0 // indirect golang.org/x/sync v0.17.0 golang.org/x/sys v0.37.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/text v0.29.0 golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index a2c85ac..d8261aa 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -185,28 +185,20 @@ func (m *Maintenance) GenerateTestingValues( return nil, err } - var extensionsToCreate []map[string]string - var expectedExtensions []map[string]any - if metadata.CreateExtension { - extensionsToCreate = []map[string]string{ - {"name": metadata.SQLName, "version": version}, - } - expectedExtensions = []map[string]any{ - {"applied": true, "name": metadata.SQLName}, - } + databaseConfig, err := generateDatabaseConfig(ctx, source, extensions) + if err != nil { + return nil, err } // Build values.yaml content - values := map[string]any{ - "name": metadata.Name, - "sql_name": metadata.SQLName, - "shared_preload_libraries": metadata.SharedPreloadLibraries, - "pg_image": pgImage, - "version": version, - "extensions": extensions, - "create_extension": metadata.CreateExtension, - "extensions_to_create": extensionsToCreate, - "expected_extensions": expectedExtensions, + values := TestingValues{ + Name: metadata.Name, + SQLName: metadata.SQLName, + SharedPreloadLibraries: metadata.SharedPreloadLibraries, + PgImage: pgImage, + Version: version, + Extensions: extensions, + DatabaseConfig: databaseConfig, } valuesYaml, err := yaml.Marshal(values) if err != nil { diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go index 33ec68c..73111fc 100644 --- a/dagger/maintenance/testingvalues.go +++ b/dagger/maintenance/testingvalues.go @@ -7,8 +7,34 @@ import ( "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 +type ExtensionSpec struct { + Ensure string `yaml:"ensure"` + Name string `yaml:"name"` + Version string `yaml:"version"` +} + +type ExpectedStatus struct { + Applied bool `yaml:"applied"` + Name string `yaml:"name"` +} + +type DatabaseConfig struct { + ExtensionsSpec []ExtensionSpec `yaml:"extensions_spec"` + ExpectedStatus []ExpectedStatus `yaml:"expected_status"` +} + +type TestingValues struct { + Name string `yaml:"name"` + SQLName string `yaml:"sql_name"` + SharedPreloadLibraries []string `yaml:"shared_preload_libraries"` + PgImage string `yaml:"pg_image"` + Version string `yaml:"version"` + Extensions []*ExtensionConfiguration `yaml:"extensions"` + DatabaseConfig *DatabaseConfig `yaml:"database_config"` +} + +func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directory, metadata *extensionMetadata, extensionImage string) ([]*ExtensionConfiguration, error) { + var out []*ExtensionConfiguration configuration, err := generateExtensionConfiguration(metadata, extensionImage) if err != nil { return nil, err @@ -24,21 +50,21 @@ func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directo 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) + depMetadata, err := parseExtensionMetadata(ctx, source.Directory(dep)) + if err != nil { + return nil, fmt.Errorf("failed to parse dependency metadata %q: %w", dep, err) } - depsConfiguration, extErr := generateExtensionConfiguration(depMetadata, "") - if extErr != nil { - return nil, extErr + depConfiguration, err := generateExtensionConfiguration(depMetadata, "") + if err != nil { + return nil, err } - out = append(out, depsConfiguration) + out = append(out, depConfiguration) } return out, nil } -func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage string) (map[string]any, error) { +func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage string) (*ExtensionConfiguration, error) { targetExtensionImage := extensionImage if targetExtensionImage == "" { var err error @@ -48,13 +74,56 @@ func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage } } - return map[string]any{ - "name": metadata.Name, - "image": map[string]string{ - "reference": targetExtensionImage, + return &ExtensionConfiguration{ + Name: metadata.Name, + ImageVolumeSource: ImageVolumeSource{ + Reference: targetExtensionImage, }, - "extension_control_path": metadata.ExtensionControlPath, - "dynamic_library_path": metadata.DynamicLibraryPath, - "ld_library_path": metadata.LdLibraryPath, + ExtensionControlPath: metadata.ExtensionControlPath, + DynamicLibraryPath: metadata.DynamicLibraryPath, + LdLibraryPath: metadata.LdLibraryPath, }, nil } + +func generateDatabaseConfig(ctx context.Context, source *dagger.Directory, extensionsConfig []*ExtensionConfiguration) (*DatabaseConfig, error) { + var databaseConfig DatabaseConfig + for _, extension := range extensionsConfig { + extMetadata, err := parseExtensionMetadata(ctx, source.Directory(extension.Name)) + if err != nil { + return nil, fmt.Errorf("failed to parse dependency metadata %q: %w", extension.Name, err) + } + + extAnnotations, err := getImageAnnotations(extension.ImageVolumeSource.Reference) + if err != nil { + return nil, err + } + + extVersion := extAnnotations["org.opencontainers.image.version"] + if extVersion == "" { + return nil, fmt.Errorf( + "extension image %s doesn't have an 'org.opencontainers.image.version' annotation", + extension.ImageVolumeSource.Reference) + } + + ensureOption := "absent" + if extMetadata.CreateExtension { + ensureOption = "present" + } + + databaseConfig.ExtensionsSpec = append(databaseConfig.ExtensionsSpec, + ExtensionSpec{ + Ensure: ensureOption, + Name: extMetadata.SQLName, + Version: extVersion, + }, + ) + databaseConfig.ExpectedStatus = append(databaseConfig.ExpectedStatus, + ExpectedStatus{ + Name: extMetadata.SQLName, + Applied: true, + }, + ) + } + + return &databaseConfig, nil +} diff --git a/test/database-assert.yaml b/test/database-assert.yaml index eebb91f..56badd3 100644 --- a/test/database-assert.yaml +++ b/test/database-assert.yaml @@ -4,3 +4,5 @@ metadata: name: (join('-', [$values.name, 'app'])) status: applied: true + extensions: ($values.database_config.expected_status) + observedGeneration: 1 diff --git a/test/database.yaml b/test/database.yaml index e36b10f..2d6810c 100644 --- a/test/database.yaml +++ b/test/database.yaml @@ -7,4 +7,4 @@ spec: owner: app cluster: name: ($values.name) - extensions: ($values.extensions_to_create) + extensions: ($values.database_config.extensions_spec) From 382a3a45e3b66045c3b6c8c5365d3f89820ab8d4 Mon Sep 17 00:00:00 2001 From: Gabriele Bartolini Date: Tue, 10 Feb 2026 11:08:16 +1100 Subject: [PATCH 3/7] docs: add comment to metadata template Signed-off-by: Gabriele Bartolini --- templates/metadata.hcl.tmpl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/templates/metadata.hcl.tmpl b/templates/metadata.hcl.tmpl index 56b45f8..e34eaf3 100644 --- a/templates/metadata.hcl.tmpl +++ b/templates/metadata.hcl.tmpl @@ -47,6 +47,12 @@ metadata = { # `required_extensions`: must contain the name(s) of the sibling # folders in this repository that contain a required extension. required_extensions = [] + + # TODO: Remove this comment block after customizing the file. + # `create_extension`: if set to `true` (default), the test suite will + # automatically run `CREATE EXTENSION` for this project during E2E tests. + # Set to `false` if the image only provides libraries or tools without + # a formal Postgres extension object. create_extension = true versions = { From 8643e46eb4b4d419ce6d23653a6bf90d0cfb9be9 Mon Sep 17 00:00:00 2001 From: Marco Nenciarini Date: Wed, 11 Feb 2026 10:29:53 +0100 Subject: [PATCH 4/7] fix: populate create_extension in testing values TestingValues was missing the CreateExtension field, so the generated values.yaml never contained create_extension and the psql verification job always skipped. Signed-off-by: Marco Nenciarini --- dagger/maintenance/main.go | 1 + dagger/maintenance/testingvalues.go | 1 + 2 files changed, 2 insertions(+) diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index d8261aa..414b66e 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -197,6 +197,7 @@ func (m *Maintenance) GenerateTestingValues( SharedPreloadLibraries: metadata.SharedPreloadLibraries, PgImage: pgImage, Version: version, + CreateExtension: metadata.CreateExtension, Extensions: extensions, DatabaseConfig: databaseConfig, } diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go index 73111fc..3ac5ea7 100644 --- a/dagger/maintenance/testingvalues.go +++ b/dagger/maintenance/testingvalues.go @@ -29,6 +29,7 @@ type TestingValues struct { SharedPreloadLibraries []string `yaml:"shared_preload_libraries"` PgImage string `yaml:"pg_image"` Version string `yaml:"version"` + CreateExtension bool `yaml:"create_extension"` Extensions []*ExtensionConfiguration `yaml:"extensions"` DatabaseConfig *DatabaseConfig `yaml:"database_config"` } From f90bd2b4d95d77780f3a7226af0bb7f3eeca1570 Mon Sep 17 00:00:00 2001 From: Marco Nenciarini Date: Wed, 11 Feb 2026 10:48:29 +0100 Subject: [PATCH 5/7] refactor: eliminate redundant metadata parsing and registry calls Bundle extension metadata with its configuration so generateDatabaseConfig no longer re-parses metadata or re-fetches image annotations for each extension. Signed-off-by: Marco Nenciarini --- dagger/maintenance/main.go | 10 +++-- dagger/maintenance/testingvalues.go | 68 +++++++++++++++++------------ 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index 414b66e..4fa8459 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -180,16 +180,18 @@ func (m *Maintenance) GenerateTestingValues( targetExtensionImage) } - extensions, err := generateTestingValuesExtensions(ctx, source, metadata, targetExtensionImage) + extensionInfos, err := generateTestingValuesExtensions(ctx, source, metadata, targetExtensionImage, version) if err != nil { return nil, err } - databaseConfig, err := generateDatabaseConfig(ctx, source, extensions) - if err != nil { - return nil, err + extensions := make([]*ExtensionConfiguration, len(extensionInfos)) + for i, info := range extensionInfos { + extensions[i] = info.Configuration } + databaseConfig := generateDatabaseConfig(extensionInfos) + // Build values.yaml content values := TestingValues{ Name: metadata.Name, diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go index 3ac5ea7..72ba784 100644 --- a/dagger/maintenance/testingvalues.go +++ b/dagger/maintenance/testingvalues.go @@ -34,13 +34,25 @@ type TestingValues struct { DatabaseConfig *DatabaseConfig `yaml:"database_config"` } -func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directory, metadata *extensionMetadata, extensionImage string) ([]*ExtensionConfiguration, error) { - var out []*ExtensionConfiguration +type testingExtensionInfo struct { + Configuration *ExtensionConfiguration + SQLName string + Version string + CreateExtension bool +} + +func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directory, metadata *extensionMetadata, extensionImage string, version string) ([]*testingExtensionInfo, error) { + var out []*testingExtensionInfo configuration, err := generateExtensionConfiguration(metadata, extensionImage) if err != nil { return nil, err } - out = append(out, configuration) + out = append(out, &testingExtensionInfo{ + Configuration: configuration, + SQLName: metadata.SQLName, + Version: version, + CreateExtension: metadata.CreateExtension, + }) for _, dep := range metadata.RequiredExtensions { depExists, err := source.Exists(ctx, dep) @@ -59,7 +71,24 @@ func generateTestingValuesExtensions(ctx context.Context, source *dagger.Directo if err != nil { return nil, err } - out = append(out, depConfiguration) + + depAnnotations, err := getImageAnnotations(depConfiguration.ImageVolumeSource.Reference) + if err != nil { + return nil, err + } + depVersion := depAnnotations["org.opencontainers.image.version"] + if depVersion == "" { + return nil, fmt.Errorf( + "extension image %s doesn't have an 'org.opencontainers.image.version' annotation", + depConfiguration.ImageVolumeSource.Reference) + } + + out = append(out, &testingExtensionInfo{ + Configuration: depConfiguration, + SQLName: depMetadata.SQLName, + Version: depVersion, + CreateExtension: depMetadata.CreateExtension, + }) } return out, nil @@ -86,45 +115,28 @@ func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage }, nil } -func generateDatabaseConfig(ctx context.Context, source *dagger.Directory, extensionsConfig []*ExtensionConfiguration) (*DatabaseConfig, error) { +func generateDatabaseConfig(extensionInfos []*testingExtensionInfo) *DatabaseConfig { var databaseConfig DatabaseConfig - for _, extension := range extensionsConfig { - extMetadata, err := parseExtensionMetadata(ctx, source.Directory(extension.Name)) - if err != nil { - return nil, fmt.Errorf("failed to parse dependency metadata %q: %w", extension.Name, err) - } - - extAnnotations, err := getImageAnnotations(extension.ImageVolumeSource.Reference) - if err != nil { - return nil, err - } - - extVersion := extAnnotations["org.opencontainers.image.version"] - if extVersion == "" { - return nil, fmt.Errorf( - "extension image %s doesn't have an 'org.opencontainers.image.version' annotation", - extension.ImageVolumeSource.Reference) - } - + for _, info := range extensionInfos { ensureOption := "absent" - if extMetadata.CreateExtension { + if info.CreateExtension { ensureOption = "present" } databaseConfig.ExtensionsSpec = append(databaseConfig.ExtensionsSpec, ExtensionSpec{ Ensure: ensureOption, - Name: extMetadata.SQLName, - Version: extVersion, + Name: info.SQLName, + Version: info.Version, }, ) databaseConfig.ExpectedStatus = append(databaseConfig.ExpectedStatus, ExpectedStatus{ - Name: extMetadata.SQLName, + Name: info.SQLName, Applied: true, }, ) } - return &databaseConfig, nil + return &databaseConfig } From 88640ceaff79c7db12d38e98fff64cc0e18dd6b3 Mon Sep 17 00:00:00 2001 From: Marco Nenciarini Date: Wed, 11 Feb 2026 11:48:08 +0100 Subject: [PATCH 6/7] chore: sync dagger module after v0.19.11 upgrade Signed-off-by: Marco Nenciarini --- dagger/maintenance/dagger.json | 2 +- dagger/maintenance/go.mod | 32 +++++++++++++++++--------------- dagger/maintenance/go.sum | 2 ++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/dagger/maintenance/dagger.json b/dagger/maintenance/dagger.json index 40159ae..33ad24c 100644 --- a/dagger/maintenance/dagger.json +++ b/dagger/maintenance/dagger.json @@ -1,6 +1,6 @@ { "name": "maintenance", - "engineVersion": "v0.19.10", + "engineVersion": "v0.19.11", "sdk": { "source": "go" } diff --git a/dagger/maintenance/go.mod b/dagger/maintenance/go.mod index 51f7f42..dab3782 100644 --- a/dagger/maintenance/go.mod +++ b/dagger/maintenance/go.mod @@ -8,12 +8,14 @@ require ( github.com/hashicorp/hcl/v2 v2.24.0 github.com/vektah/gqlparser/v2 v2.5.30 go.opentelemetry.io/otel v1.38.0 - go.opentelemetry.io/otel/sdk v1.38.0 go.opentelemetry.io/otel/trace v1.38.0 ) +require go.opentelemetry.io/otel/sdk v1.38.0 + require ( - github.com/99designs/gqlgen v0.17.81 + dagger.io/dagger v0.19.11 + github.com/99designs/gqlgen v0.17.81 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/Khan/genqlient v0.8.1 github.com/Microsoft/go-winio v0.6.2 // indirect @@ -112,30 +114,30 @@ require ( go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 - go.opentelemetry.io/otel/log v0.14.0 - go.opentelemetry.io/otel/metric v1.38.0 - go.opentelemetry.io/otel/sdk/log v0.14.0 - go.opentelemetry.io/otel/sdk/metric v1.38.0 - go.opentelemetry.io/proto/otlp v1.8.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect + go.opentelemetry.io/proto/otlp v1.8.0 // indirect go.yaml.in/yaml/v3 v3.0.4 golang.org/x/crypto v0.42.0 // indirect golang.org/x/mod v0.29.0 // indirect golang.org/x/net v0.44.0 // indirect - golang.org/x/sync v0.17.0 + golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.37.0 // indirect golang.org/x/text v0.29.0 golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/grpc v1.76.0 + google.golang.org/grpc v1.76.0 // indirect google.golang.org/protobuf v1.36.10 // indirect ) diff --git a/dagger/maintenance/go.sum b/dagger/maintenance/go.sum index 05e6495..9ed10c7 100644 --- a/dagger/maintenance/go.sum +++ b/dagger/maintenance/go.sum @@ -1,3 +1,5 @@ +dagger.io/dagger v0.19.11 h1:Cra3wL1oaZsqXJcnPydocx3bIDD5tM7XCuwcn2Uh+2Q= +dagger.io/dagger v0.19.11/go.mod h1:BjAJWl4Lx7XRW7nooNjBi0ZAC5Ici2pkthkdBIZdbTI= github.com/99designs/gqlgen v0.17.81 h1:kCkN/xVyRb5rEQpuwOHRTYq83i0IuTQg9vdIiwEerTs= github.com/99designs/gqlgen v0.17.81/go.mod h1:vgNcZlLwemsUhYim4dC1pvFP5FX0pr2Y+uYUoHFb1ig= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= From 48ada15703a30223ecef6f5a5fa665bcae8ab41a Mon Sep 17 00:00:00 2001 From: Marco Nenciarini Date: Wed, 11 Feb 2026 15:02:27 +0100 Subject: [PATCH 7/7] fix: omit extensions from Database CR when create_extension is false Skip extensions with create_extension = false from the Database CR and status assertion entirely, rather than listing them with ensure: absent. Signed-off-by: Marco Nenciarini --- dagger/maintenance/main.go | 2 ++ dagger/maintenance/testingvalues.go | 45 ++++++++++++++++++----------- test/database-assert.yaml | 5 +--- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/dagger/maintenance/main.go b/dagger/maintenance/main.go index 4fa8459..6ef5b9b 100644 --- a/dagger/maintenance/main.go +++ b/dagger/maintenance/main.go @@ -191,6 +191,7 @@ func (m *Maintenance) GenerateTestingValues( } databaseConfig := generateDatabaseConfig(extensionInfos) + databaseAssertStatus := generateDatabaseAssertStatus(extensionInfos) // Build values.yaml content values := TestingValues{ @@ -202,6 +203,7 @@ func (m *Maintenance) GenerateTestingValues( CreateExtension: metadata.CreateExtension, Extensions: extensions, DatabaseConfig: databaseConfig, + DatabaseAssertStatus: databaseAssertStatus, } valuesYaml, err := yaml.Marshal(values) if err != nil { diff --git a/dagger/maintenance/testingvalues.go b/dagger/maintenance/testingvalues.go index 72ba784..0ff3065 100644 --- a/dagger/maintenance/testingvalues.go +++ b/dagger/maintenance/testingvalues.go @@ -13,14 +13,8 @@ type ExtensionSpec struct { Version string `yaml:"version"` } -type ExpectedStatus struct { - Applied bool `yaml:"applied"` - Name string `yaml:"name"` -} - type DatabaseConfig struct { - ExtensionsSpec []ExtensionSpec `yaml:"extensions_spec"` - ExpectedStatus []ExpectedStatus `yaml:"expected_status"` + ExtensionsSpec []ExtensionSpec `yaml:"extensions_spec,omitempty"` } type TestingValues struct { @@ -32,6 +26,7 @@ type TestingValues struct { CreateExtension bool `yaml:"create_extension"` Extensions []*ExtensionConfiguration `yaml:"extensions"` DatabaseConfig *DatabaseConfig `yaml:"database_config"` + DatabaseAssertStatus map[string]any `yaml:"database_assert_status"` } type testingExtensionInfo struct { @@ -118,25 +113,41 @@ func generateExtensionConfiguration(metadata *extensionMetadata, extensionImage func generateDatabaseConfig(extensionInfos []*testingExtensionInfo) *DatabaseConfig { var databaseConfig DatabaseConfig for _, info := range extensionInfos { - ensureOption := "absent" - if info.CreateExtension { - ensureOption = "present" + if !info.CreateExtension { + continue } databaseConfig.ExtensionsSpec = append(databaseConfig.ExtensionsSpec, ExtensionSpec{ - Ensure: ensureOption, + Ensure: "present", Name: info.SQLName, Version: info.Version, }, ) - databaseConfig.ExpectedStatus = append(databaseConfig.ExpectedStatus, - ExpectedStatus{ - Name: info.SQLName, - Applied: true, - }, - ) } return &databaseConfig } + +func generateDatabaseAssertStatus(extensionInfos []*testingExtensionInfo) map[string]any { + status := map[string]any{ + "applied": true, + "observedGeneration": 1, + } + + var extensions []map[string]any + for _, info := range extensionInfos { + if !info.CreateExtension { + continue + } + extensions = append(extensions, map[string]any{ + "applied": true, + "name": info.SQLName, + }) + } + if len(extensions) > 0 { + status["extensions"] = extensions + } + + return status +} diff --git a/test/database-assert.yaml b/test/database-assert.yaml index 56badd3..9417b87 100644 --- a/test/database-assert.yaml +++ b/test/database-assert.yaml @@ -2,7 +2,4 @@ apiVersion: postgresql.cnpg.io/v1 kind: Database metadata: name: (join('-', [$values.name, 'app'])) -status: - applied: true - extensions: ($values.database_config.expected_status) - observedGeneration: 1 +status: ($values.database_assert_status)