Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion deployments/pulumi/pkg/api/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ func createDeployment(ctx *pulumi.Context, args createDeploymentArgs, resourceOp
Containers: corev1.ContainerArray{
corev1.ContainerArgs{
Name: pulumi.String("ledger-api"),
Image: utils.GetMainImage(args.Tag),
Image: utils.GetMainImage(args.ImageConfiguration),
ImagePullPolicy: args.ImagePullPolicy.ToOutput(ctx.Context()).Untyped().(pulumi.StringOutput),
Args: pulumi.StringArray{
pulumi.String("serve"),
Expand Down
4 changes: 3 additions & 1 deletion deployments/pulumi/pkg/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ package common

import (
"github.com/formancehq/ledger/deployments/pulumi/pkg/monitoring"
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
)

type CommonArgs struct {
utils.ImageConfiguration
Namespace pulumix.Input[string]
Monitoring *monitoring.Args
Tag pulumix.Input[string]
ImagePullPolicy pulumix.Input[string]
Debug pulumix.Input[bool]
}
Expand Down Expand Up @@ -37,4 +38,5 @@ func (args *CommonArgs) SetDefaults() {
if args.Monitoring != nil {
args.Monitoring.SetDefaults()
}
args.ImageConfiguration.SetDefaults()
}
68 changes: 54 additions & 14 deletions deployments/pulumi/pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import (
"encoding/json"
"errors"
"fmt"
"reflect"
"time"

"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/rds"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
"gopkg.in/yaml.v3"

. "github.com/formancehq/go-libs/v3/collectionutils"
pulumi_ledger "github.com/formancehq/ledger/deployments/pulumi/pkg"
"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
Expand All @@ -14,13 +24,6 @@ import (
"github.com/formancehq/ledger/deployments/pulumi/pkg/provision"
"github.com/formancehq/ledger/deployments/pulumi/pkg/storage"
"github.com/formancehq/ledger/deployments/pulumi/pkg/worker"
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/rds"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
"gopkg.in/yaml.v3"
"reflect"
"time"
)

type Ingress struct {
Expand Down Expand Up @@ -183,8 +186,8 @@ func (a *PostgresDatabase) toInput() *storage.PostgresDatabaseArgs {

return &storage.PostgresDatabaseArgs{
Install: &storage.PostgresInstallArgs{
Username: pulumix.Val(a.Install.Username),
Password: pulumix.Val(a.Install.Password),
Username: pulumix.Val(a.Install.Username),
Password: pulumix.Val(a.Install.Password),
ChartVersion: pulumix.Val(a.Install.ChartVersion),
},
}
Expand Down Expand Up @@ -572,8 +575,12 @@ type Common struct {
Monitoring *Monitoring `json:"monitoring,omitempty" yaml:"monitoring,omitempty"`

// Tag is the version tag for the ledger
// deprecated
Tag string `json:"version,omitempty" yaml:"version,omitempty"`

// Image configuration
Image *ImageConfiguration `json:"image"`

// ImagePullPolicy is the image pull policy for the ledger
ImagePullPolicy string `json:"image-pull-policy,omitempty" yaml:"image-pull-policy,omitempty"`

Expand All @@ -583,11 +590,11 @@ type Common struct {

func (c Common) toInput() common.CommonArgs {
return common.CommonArgs{
Namespace: pulumix.Val(c.Namespace),
Monitoring: c.Monitoring.ToInput(),
Tag: pulumix.Val(c.Tag),
ImagePullPolicy: pulumix.Val(c.ImagePullPolicy),
Debug: pulumix.Val(c.Debug),
Namespace: pulumix.Val(c.Namespace),
Monitoring: c.Monitoring.ToInput(),
ImageConfiguration: imageConfigurationOrTag(c.Image, c.Tag),
ImagePullPolicy: pulumix.Val(c.ImagePullPolicy),
Debug: pulumix.Val(c.Debug),
}
}

Expand Down Expand Up @@ -662,6 +669,7 @@ func (g GeneratorLedgerConfiguration) toInput() generator.LedgerConfiguration {

type Generator struct {
// GeneratorVersion is the version of the generator
// deprecated
GeneratorVersion string `json:"generator-version" yaml:"generator-version"`

// Ledgers are the ledgers to run the generator against
Expand Down Expand Up @@ -725,6 +733,12 @@ func (cfg Config) ToInput() pulumi_ledger.ComponentArgs {
}
}

type ImageConfiguration struct {
Registry string `json:"registry" yaml:"registry"`
Repository string `json:"repository" yaml:"repository"`
Tag string `json:"version" yaml:"version"`
}

func Load(ctx *pulumi.Context) (*Config, error) {
cfg := config.New(ctx, "")

Expand Down Expand Up @@ -795,6 +809,13 @@ func Load(ctx *pulumi.Context) (*Config, error) {
generator = nil
}

image := &ImageConfiguration{}
if err := cfg.TryObject("image", image); err != nil {
if !errors.Is(err, config.ErrMissingVar) {
return nil, fmt.Errorf("error reading generator config: %w", err)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error message incorrectly states "error reading generator config" when actually reading image configuration. This will mislead debugging efforts.

Fix:

return nil, fmt.Errorf("error reading image config: %w", err)
Suggested change
return nil, fmt.Errorf("error reading generator config: %w", err)
return nil, fmt.Errorf("error reading image config: %w", err)

Spotted by Graphite Agent

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

}
}
Comment on lines +812 to +817
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix incorrect error message - copy-paste error.

The error message references "generator config" but should reference "image config".

 	image := &ImageConfiguration{}
 	if err := cfg.TryObject("image", image); err != nil {
 		if !errors.Is(err, config.ErrMissingVar) {
-			return nil, fmt.Errorf("error reading generator config: %w", err)
+			return nil, fmt.Errorf("error reading image config: %w", err)
 		}
 	}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
image := &ImageConfiguration{}
if err := cfg.TryObject("image", image); err != nil {
if !errors.Is(err, config.ErrMissingVar) {
return nil, fmt.Errorf("error reading generator config: %w", err)
}
}
image := &ImageConfiguration{}
if err := cfg.TryObject("image", image); err != nil {
if !errors.Is(err, config.ErrMissingVar) {
return nil, fmt.Errorf("error reading image config: %w", err)
}
}
🤖 Prompt for AI Agents
In deployments/pulumi/pkg/config/config.go around lines 812 to 817, the error
message logged when TryObject("image", ...) returns a non-missing error
incorrectly says "generator config"; change the fmt.Errorf call to reference
"image config" instead so the returned error reads fmt.Errorf("error reading
image config: %w", err). Keep the same error wrapping and behavior for
non-missing errors.


namespace := cfg.Get("namespace")
if namespace == "" {
namespace = ctx.Stack()
Expand All @@ -807,6 +828,7 @@ func Load(ctx *pulumi.Context) (*Config, error) {
Namespace: namespace,
Tag: cfg.Get("version"),
Monitoring: monitoring,
Image: image,
ImagePullPolicy: cfg.Get("image-pull-policy"),
},
InstallDevBox: cfg.GetBool("install-dev-box"),
Expand All @@ -819,3 +841,21 @@ func Load(ctx *pulumi.Context) (*Config, error) {
Generator: generator,
}, nil
}

func imageConfigurationOrTag(configuration *ImageConfiguration, tag string) utils.ImageConfiguration {
if configuration == nil {
return utils.ImageConfiguration{
Tag: pulumix.Val(tag),
}
}

if configuration.Tag != "" {
tag = configuration.Tag
}

return utils.ImageConfiguration{
Registry: pulumix.Val(configuration.Registry),
Repository: pulumix.Val(configuration.Repository),
Tag: pulumix.Val(tag),
}
}
26 changes: 8 additions & 18 deletions deployments/pulumi/pkg/generator/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ package generator
import (
"errors"
"fmt"
"os"
"path/filepath"
"time"

"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
"github.com/formancehq/ledger/deployments/pulumi/pkg/common"
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
Expand All @@ -12,9 +16,6 @@ import (
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
"os"
"path/filepath"
"time"
)

type Component struct {
Expand Down Expand Up @@ -48,15 +49,6 @@ type Args struct {
}

func (a *Args) SetDefaults() {
if a.GeneratorVersion == nil {
a.GeneratorVersion = pulumix.Val("")
}
a.GeneratorVersion = pulumix.Apply(a.GeneratorVersion, func(generatorVersion string) string {
if generatorVersion == "" {
return "latest"
}
return generatorVersion
})
if a.Ledgers == nil {
a.Ledgers = make(map[string]LedgerConfiguration)
}
Expand Down Expand Up @@ -149,12 +141,10 @@ func NewComponent(ctx *pulumi.Context, name string, args ComponentArgs, opts ...
corev1.ContainerArgs{
Name: pulumi.String("generator"),
Args: generatorArgs.ToOutput(ctx.Context()).Untyped().(pulumi.StringArrayOutput),
Image: utils.GetImage(pulumi.String("ledger-generator"), pulumix.Apply2(args.GeneratorVersion, args.Tag, func(generatorVersion string, ledgerVersion string) string {
if generatorVersion == "" {
return ledgerVersion
}
return generatorVersion
})),
Image: utils.GetImage(
args.WithFallbackTag(args.GeneratorVersion),
pulumi.String("ledger-generator"),
),
ImagePullPolicy: pulumi.String("Always"),
VolumeMounts: corev1.VolumeMountArray{
corev1.VolumeMountArgs{
Expand Down
17 changes: 8 additions & 9 deletions deployments/pulumi/pkg/provision/component.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package provision

import (
"fmt"

"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
"github.com/formancehq/ledger/deployments/pulumi/pkg/common"
"github.com/formancehq/ledger/deployments/pulumi/pkg/exporters"
Expand All @@ -19,14 +20,14 @@ type Component struct {
}

type LedgerConfigArgs struct {
Bucket string `json:"bucket"`
Metadata map[string]string `json:"metadata"`
Bucket string `json:"bucket"`
Metadata map[string]string `json:"metadata"`
Features map[string]string `json:"features"`
Exporters []string `json:"exporters"`
}

type Args struct {
ProvisionerVersion pulumi.String
ProvisionerVersion pulumix.Input[string]
Ledgers map[string]LedgerConfigArgs `json:"ledgers"`
}

Expand Down Expand Up @@ -129,12 +130,10 @@ func NewComponent(ctx *pulumi.Context, name string, args ComponentArgs, opts ...
pulumi.String("--state-store"),
pulumi.Sprintf("k8s:///%s/provisioner", args.Namespace),
},
Image: utils.GetImage(pulumi.String("ledger-provisioner"), pulumix.Apply2(args.Tag, args.ProvisionerVersion, func(ledgerVersion, provisionerVersion string) string {
if provisionerVersion != "" {
return provisionerVersion
}
return ledgerVersion
})),
Image: utils.GetImage(
args.WithFallbackTag(args.ProvisionerVersion),
pulumi.String("ledger-provisioner"),
),
VolumeMounts: corev1.VolumeMountArray{
corev1.VolumeMountArgs{
Name: pulumi.String("config"),
Expand Down
2 changes: 1 addition & 1 deletion deployments/pulumi/pkg/storage/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func runMigrateJob(ctx *pulumi.Context, args migrationArgs, opts ...pulumi.Resou
Args: pulumi.StringArray{
pulumi.String("migrate"),
},
Image: utils.GetMainImage(args.Tag),
Image: utils.GetMainImage(args.ImageConfiguration),
ImagePullPolicy: args.ImagePullPolicy.ToOutput(ctx.Context()).Untyped().(pulumi.StringOutput),
Env: envVars,
},
Expand Down
85 changes: 76 additions & 9 deletions deployments/pulumi/pkg/utils/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,33 @@ import (
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
)

func GetMainImage(tag pulumix.Input[string]) pulumi.StringOutput {
return GetImage(pulumi.String("ledger"), tag)
func GetMainImage(imageConfiguration ImageConfiguration) pulumi.StringOutput {
return GetImage(imageConfiguration, pulumi.String("ledger"))
}

func GetImage(component, tag pulumix.Input[string]) pulumi.StringOutput {
return pulumi.Sprintf("ghcr.io/formancehq/%s:%s", component, pulumix.Apply(tag, func(version string) string {
if version == "" {
return "latest"
}
return version
}))
func GetImage(imageConfiguration ImageConfiguration, component pulumix.Input[string]) pulumi.StringOutput {
return pulumi.Sprintf(
"%s/%s/%s:%s",
pulumix.Apply(imageConfiguration.Registry, func(registry string) string {
if registry == "" {
return "ghcr.io"
}
return registry
}),
pulumix.Apply(imageConfiguration.Repository, func(repository string) string {
if repository == "" {
return "formancehq"
}
return repository
}),
component,
pulumix.Apply(imageConfiguration.Tag, func(version string) string {
if version == "" {
return "latest"
}
return version
}),
)
}

func BoolToString(output pulumix.Input[bool]) pulumix.Output[string] {
Expand All @@ -26,3 +42,54 @@ func BoolToString(output pulumix.Input[bool]) pulumix.Output[string] {
return "false"
})
}

type ImageConfiguration struct {
Registry pulumix.Input[string]
Repository pulumix.Input[string]
Tag pulumix.Input[string]
}

func (args ImageConfiguration) WithFallbackTag(input pulumix.Input[string]) ImageConfiguration {
args.Tag = pulumix.Apply2(args.Tag, input, func(providedVersion, fallbackVersion string) string {
if providedVersion == "" {
return fallbackVersion
}
return providedVersion
})
return args
}

func (args *ImageConfiguration) SetDefaults() {
if args.Registry == nil {
args.Registry = pulumi.String("ghcr.io")
} else {
args.Registry = pulumix.Apply(args.Registry, func(registry string) string {
if registry == "" {
return "ghcr.io"
}
return registry
})
}

if args.Repository == nil {
args.Repository = pulumi.String("formancehq")
} else {
args.Repository = pulumix.Apply(args.Repository, func(repository string) string {
if repository == "" {
return "formancehq"
}
return repository
})
}

if args.Tag == nil {
args.Tag = pulumi.String("latest")
} else {
args.Tag = pulumix.Apply(args.Tag, func(tag string) string {
if tag == "" {
return "latest"
}
return tag
})
}
}
2 changes: 1 addition & 1 deletion deployments/pulumi/pkg/worker/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func createDeployment(ctx *pulumi.Context, args ComponentArgs, resourceOptions .
Containers: corev1.ContainerArray{
corev1.ContainerArgs{
Name: pulumi.String("worker"),
Image: utils.GetMainImage(args.Tag),
Image: utils.GetMainImage(args.ImageConfiguration),
ImagePullPolicy: args.ImagePullPolicy.ToOutput(ctx.Context()).Untyped().(pulumi.StringOutput),
Args: pulumi.StringArray{
pulumi.String("worker"),
Expand Down
6 changes: 5 additions & 1 deletion internal/replication/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,11 @@ func (m *Manager) synchronizePipelines(ctx context.Context) error {
for _, pipeline := range pipelines {
m.logger.Debugf("restoring pipeline %s", pipeline.ID)
if _, err := m.startPipeline(ctx, pipeline); err != nil {
return err
switch {
case errors.Is(err, ledger.ErrAlreadyStarted("")):
default:
return err
}
}
}

Expand Down
Loading
Loading