Skip to content

Commit 0840b9f

Browse files
authored
feat: Add configuration for image registries (#1172)
1 parent 7837d2a commit 0840b9f

File tree

7 files changed

+142
-45
lines changed

7 files changed

+142
-45
lines changed

deployments/pulumi/pkg/api/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func createDeployment(ctx *pulumi.Context, args createDeploymentArgs, resourceOp
153153
Containers: corev1.ContainerArray{
154154
corev1.ContainerArgs{
155155
Name: pulumi.String("ledger-api"),
156-
Image: utils.GetMainImage(args.Tag),
156+
Image: utils.GetMainImage(args.ImageConfiguration),
157157
ImagePullPolicy: args.ImagePullPolicy.ToOutput(ctx.Context()).Untyped().(pulumi.StringOutput),
158158
Args: pulumi.StringArray{
159159
pulumi.String("serve"),

deployments/pulumi/pkg/common/common.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package common
22

33
import (
44
"github.com/formancehq/ledger/deployments/pulumi/pkg/monitoring"
5+
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
56
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
67
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
78
)
89

910
type CommonArgs struct {
11+
utils.ImageConfiguration
1012
Namespace pulumix.Input[string]
1113
Monitoring *monitoring.Args
12-
Tag pulumix.Input[string]
1314
ImagePullPolicy pulumix.Input[string]
1415
Debug pulumix.Input[bool]
1516
}
@@ -37,4 +38,5 @@ func (args *CommonArgs) SetDefaults() {
3738
if args.Monitoring != nil {
3839
args.Monitoring.SetDefaults()
3940
}
41+
args.ImageConfiguration.SetDefaults()
4042
}

deployments/pulumi/pkg/config/config.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package config
33
import (
44
"errors"
55
"fmt"
6+
"time"
7+
68
. "github.com/formancehq/go-libs/v2/collectionutils"
79
pulumi_ledger "github.com/formancehq/ledger/deployments/pulumi/pkg"
810
"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
@@ -11,11 +13,11 @@ import (
1113
"github.com/formancehq/ledger/deployments/pulumi/pkg/monitoring"
1214
"github.com/formancehq/ledger/deployments/pulumi/pkg/provision"
1315
"github.com/formancehq/ledger/deployments/pulumi/pkg/storage"
16+
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
1417
"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/rds"
1518
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1619
"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config"
1720
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
18-
"time"
1921
)
2022

2123
type Ingress struct {
@@ -181,8 +183,8 @@ func (a *PostgresDatabase) toInput() *storage.PostgresDatabaseArgs {
181183

182184
return &storage.PostgresDatabaseArgs{
183185
Install: &storage.PostgresInstallArgs{
184-
Username: pulumix.Val(a.Install.Username),
185-
Password: pulumix.Val(a.Install.Password),
186+
Username: pulumix.Val(a.Install.Username),
187+
Password: pulumix.Val(a.Install.Password),
186188
ChartVersion: pulumix.Val(a.Install.ChartVersion),
187189
},
188190
}
@@ -460,8 +462,12 @@ type Common struct {
460462
Monitoring *Monitoring `json:"monitoring" yaml:"monitoring"`
461463

462464
// Tag is the version tag for the ledger
465+
// deprecated
463466
Tag string `json:"version" yaml:"version"`
464467

468+
// Image configuration
469+
Image *ImageConfiguration `json:"image"`
470+
465471
// ImagePullPolicy is the image pull policy for the ledger
466472
ImagePullPolicy string `json:"image-pull-policy" yaml:"image-pull-policy"`
467473

@@ -471,11 +477,11 @@ type Common struct {
471477

472478
func (c Common) toInput() common.CommonArgs {
473479
return common.CommonArgs{
474-
Namespace: pulumix.Val(c.Namespace),
475-
Monitoring: c.Monitoring.ToInput(),
476-
Tag: pulumix.Val(c.Tag),
477-
ImagePullPolicy: pulumix.Val(c.ImagePullPolicy),
478-
Debug: pulumix.Val(c.Debug),
480+
Namespace: pulumix.Val(c.Namespace),
481+
Monitoring: c.Monitoring.ToInput(),
482+
ImageConfiguration: imageConfigurationOrTag(c.Image, c.Tag),
483+
ImagePullPolicy: pulumix.Val(c.ImagePullPolicy),
484+
Debug: pulumix.Val(c.Debug),
479485
}
480486
}
481487

@@ -546,6 +552,7 @@ func (g GeneratorLedgerConfiguration) toInput() generator.LedgerConfiguration {
546552

547553
type Generator struct {
548554
// GeneratorVersion is the version of the generator
555+
// deprecated
549556
GeneratorVersion string `json:"generator-version" yaml:"generator-version"`
550557

551558
// Ledgers are the ledgers to run the generator against
@@ -601,6 +608,12 @@ func (cfg Config) ToInput() pulumi_ledger.ComponentArgs {
601608
}
602609
}
603610

611+
type ImageConfiguration struct {
612+
Registry string `json:"registry" yaml:"registry"`
613+
Repository string `json:"repository" yaml:"repository"`
614+
Tag string `json:"version" yaml:"version"`
615+
}
616+
604617
func Load(ctx *pulumi.Context) (*Config, error) {
605618
cfg := config.New(ctx, "")
606619

@@ -657,6 +670,13 @@ func Load(ctx *pulumi.Context) (*Config, error) {
657670
generator = nil
658671
}
659672

673+
image := &ImageConfiguration{}
674+
if err := cfg.TryObject("image", image); err != nil {
675+
if !errors.Is(err, config.ErrMissingVar) {
676+
return nil, fmt.Errorf("error reading generator config: %w", err)
677+
}
678+
}
679+
660680
namespace := cfg.Get("namespace")
661681
if namespace == "" {
662682
namespace = ctx.Stack()
@@ -669,6 +689,7 @@ func Load(ctx *pulumi.Context) (*Config, error) {
669689
Namespace: namespace,
670690
Tag: cfg.Get("version"),
671691
Monitoring: monitoring,
692+
Image: image,
672693
ImagePullPolicy: cfg.Get("image-pull-policy"),
673694
},
674695
InstallDevBox: cfg.GetBool("install-dev-box"),
@@ -679,3 +700,21 @@ func Load(ctx *pulumi.Context) (*Config, error) {
679700
Generator: generator,
680701
}, nil
681702
}
703+
704+
func imageConfigurationOrTag(configuration *ImageConfiguration, tag string) utils.ImageConfiguration {
705+
if configuration == nil {
706+
return utils.ImageConfiguration{
707+
Tag: pulumix.Val(tag),
708+
}
709+
}
710+
711+
if configuration.Tag != "" {
712+
tag = configuration.Tag
713+
}
714+
715+
return utils.ImageConfiguration{
716+
Registry: pulumix.Val(configuration.Registry),
717+
Repository: pulumix.Val(configuration.Repository),
718+
Tag: pulumix.Val(tag),
719+
}
720+
}

deployments/pulumi/pkg/generator/component.go

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package generator
33
import (
44
"errors"
55
"fmt"
6+
"os"
7+
"path/filepath"
8+
"time"
9+
610
"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
711
"github.com/formancehq/ledger/deployments/pulumi/pkg/common"
812
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
@@ -12,9 +16,6 @@ import (
1216
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
1317
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1418
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
15-
"os"
16-
"path/filepath"
17-
"time"
1819
)
1920

2021
type Component struct {
@@ -48,15 +49,6 @@ type Args struct {
4849
}
4950

5051
func (a *Args) SetDefaults() {
51-
if a.GeneratorVersion == nil {
52-
a.GeneratorVersion = pulumix.Val("")
53-
}
54-
a.GeneratorVersion = pulumix.Apply(a.GeneratorVersion, func(generatorVersion string) string {
55-
if generatorVersion == "" {
56-
return "latest"
57-
}
58-
return generatorVersion
59-
})
6052
if a.Ledgers == nil {
6153
a.Ledgers = make(map[string]LedgerConfiguration)
6254
}
@@ -149,12 +141,10 @@ func NewComponent(ctx *pulumi.Context, name string, args ComponentArgs, opts ...
149141
corev1.ContainerArgs{
150142
Name: pulumi.String("generator"),
151143
Args: generatorArgs.ToOutput(ctx.Context()).Untyped().(pulumi.StringArrayOutput),
152-
Image: utils.GetImage(pulumi.String("ledger-generator"), pulumix.Apply2(args.GeneratorVersion, args.Tag, func(generatorVersion string, ledgerVersion string) string {
153-
if generatorVersion == "" {
154-
return ledgerVersion
155-
}
156-
return generatorVersion
157-
})),
144+
Image: utils.GetImage(
145+
args.ImageConfiguration.WithFallbackTag(args.GeneratorVersion),
146+
pulumi.String("ledger-generator"),
147+
),
158148
ImagePullPolicy: pulumi.String("Always"),
159149
VolumeMounts: corev1.VolumeMountArray{
160150
corev1.VolumeMountArgs{

deployments/pulumi/pkg/provision/component.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package provision
22

33
import (
44
"fmt"
5+
56
"github.com/formancehq/ledger/deployments/pulumi/pkg/api"
67
"github.com/formancehq/ledger/deployments/pulumi/pkg/common"
78
"github.com/formancehq/ledger/deployments/pulumi/pkg/utils"
@@ -24,7 +25,7 @@ type LedgerConfigArgs struct {
2425
}
2526

2627
type Args struct {
27-
ProvisionerVersion pulumi.String
28+
ProvisionerVersion pulumix.Input[string]
2829
Ledgers map[string]LedgerConfigArgs `json:"ledgers"`
2930
}
3031

@@ -126,12 +127,10 @@ func NewComponent(ctx *pulumi.Context, name string, args ComponentArgs, opts ...
126127
pulumi.String("--state-store"),
127128
pulumi.Sprintf("k8s:///%s/provisioner", args.Namespace),
128129
},
129-
Image: utils.GetImage(pulumi.String("ledger-provisioner"), pulumix.Apply2(args.Tag, args.ProvisionerVersion, func(ledgerVersion, provisionerVersion string) string {
130-
if provisionerVersion != "" {
131-
return provisionerVersion
132-
}
133-
return ledgerVersion
134-
})),
130+
Image: utils.GetImage(
131+
args.ImageConfiguration.WithFallbackTag(args.ProvisionerVersion),
132+
pulumi.String("ledger-provisioner"),
133+
),
135134
VolumeMounts: corev1.VolumeMountArray{
136135
corev1.VolumeMountArgs{
137136
Name: pulumi.String("config"),

deployments/pulumi/pkg/storage/migrate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func runMigrateJob(ctx *pulumi.Context, args migrationArgs, opts ...pulumi.Resou
3838
Args: pulumi.StringArray{
3939
pulumi.String("migrate"),
4040
},
41-
Image: utils.GetMainImage(args.Tag),
41+
Image: utils.GetMainImage(args.ImageConfiguration),
4242
ImagePullPolicy: args.ImagePullPolicy.ToOutput(ctx.Context()).Untyped().(pulumi.StringOutput),
4343
Env: envVars,
4444
},

deployments/pulumi/pkg/utils/convert.go

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,33 @@ import (
55
"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
66
)
77

8-
func GetMainImage(tag pulumix.Input[string]) pulumi.StringOutput {
9-
return GetImage(pulumi.String("ledger"), tag)
8+
func GetMainImage(imageConfiguration ImageConfiguration) pulumi.StringOutput {
9+
return GetImage(imageConfiguration, pulumi.String("ledger"))
1010
}
1111

12-
func GetImage(component, tag pulumix.Input[string]) pulumi.StringOutput {
13-
return pulumi.Sprintf("ghcr.io/formancehq/%s:%s", component, pulumix.Apply(tag, func(version string) string {
14-
if version == "" {
15-
return "latest"
16-
}
17-
return version
18-
}))
12+
func GetImage(imageConfiguration ImageConfiguration, component pulumix.Input[string]) pulumi.StringOutput {
13+
return pulumi.Sprintf(
14+
"%s/%s/%s:%s",
15+
pulumix.Apply(imageConfiguration.Registry, func(registry string) string {
16+
if registry == "" {
17+
return "ghcr.io"
18+
}
19+
return registry
20+
}),
21+
pulumix.Apply(imageConfiguration.Repository, func(repository string) string {
22+
if repository == "" {
23+
return "formancehq"
24+
}
25+
return repository
26+
}),
27+
component,
28+
pulumix.Apply(imageConfiguration.Tag, func(version string) string {
29+
if version == "" {
30+
return "latest"
31+
}
32+
return version
33+
}),
34+
)
1935
}
2036

2137
func BoolToString(output pulumix.Input[bool]) pulumix.Output[string] {
@@ -26,3 +42,54 @@ func BoolToString(output pulumix.Input[bool]) pulumix.Output[string] {
2642
return "false"
2743
})
2844
}
45+
46+
type ImageConfiguration struct {
47+
Registry pulumix.Input[string]
48+
Repository pulumix.Input[string]
49+
Tag pulumix.Input[string]
50+
}
51+
52+
func (args ImageConfiguration) WithFallbackTag(input pulumix.Input[string]) ImageConfiguration {
53+
args.Tag = pulumix.Apply2(args.Tag, input, func(providedVersion, fallbackVersion string) string {
54+
if providedVersion == "" {
55+
return fallbackVersion
56+
}
57+
return providedVersion
58+
})
59+
return args
60+
}
61+
62+
func (args *ImageConfiguration) SetDefaults() {
63+
if args.Registry == nil {
64+
args.Registry = pulumi.String("ghcr.io")
65+
} else {
66+
args.Registry = pulumix.Apply(args.Registry, func(registry string) string {
67+
if registry == "" {
68+
return "ghcr.io"
69+
}
70+
return registry
71+
})
72+
}
73+
74+
if args.Repository == nil {
75+
args.Repository = pulumi.String("formancehq")
76+
} else {
77+
args.Repository = pulumix.Apply(args.Repository, func(repository string) string {
78+
if repository == "" {
79+
return "formancehq"
80+
}
81+
return repository
82+
})
83+
}
84+
85+
if args.Tag == nil {
86+
args.Tag = pulumi.String("latest")
87+
} else {
88+
args.Tag = pulumix.Apply(args.Tag, func(tag string) string {
89+
if tag == "" {
90+
return "latest"
91+
}
92+
return tag
93+
})
94+
}
95+
}

0 commit comments

Comments
 (0)