diff --git a/.werft/jobs/build/installer/installer.ts b/.werft/jobs/build/installer/installer.ts index a923e6cf2e4f0e..9d83b75cda222b 100644 --- a/.werft/jobs/build/installer/installer.ts +++ b/.werft/jobs/build/installer/installer.ts @@ -277,6 +277,12 @@ EOF`); exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.usage.defaultSpendingLimit.minForUsersOnStripe 1000`, { slice: slice }) exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.usage.creditsPerMinuteByWorkspaceClass['default'] 0.1666666667`, { slice: slice }) exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.usage.creditsPerMinuteByWorkspaceClass['gitpodio-internal-xl'] 0.3333333333`, { slice: slice }) + + // Configure Price IDs + exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.stripe.individualUsagePriceIds['EUR'] price_1LmYVxGadRXm50o3AiLq0Qmo`, { slice: slice }) + exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.stripe.individualUsagePriceIds['USD'] price_1LmYWRGadRXm50o3Ym8PLqnG`, { slice: slice }) + exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.stripe.teamUsagePriceIds['EUR'] price_1LiId7GadRXm50o3OayAS2y4`, { slice: slice }) + exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.stripe.teamUsagePriceIds['USD'] price_1LiIdbGadRXm50o3ylg5S44r`, { slice: slice }) } private configureConfigCat(slice: string) { diff --git a/components/usage/pkg/server/server.go b/components/usage/pkg/server/server.go index f295b9c0c547ed..59d5ee5973d031 100644 --- a/components/usage/pkg/server/server.go +++ b/components/usage/pkg/server/server.go @@ -38,6 +38,19 @@ type Config struct { Server *baseserver.Configuration `json:"server,omitempty"` DefaultSpendingLimit db.DefaultSpendingLimit `json:"defaultSpendingLimit"` + + // StripePrices configure which Stripe Price IDs should be used + StripePrices StripePrices `json:"stripePrices"` +} + +type PriceConfig struct { + EUR string `json:"eur"` + USD string `json:"usd"` +} + +type StripePrices struct { + IndividualUsagePriceIDs PriceConfig `json:"individualUsagePriceIds"` + TeamUsagePriceIDs PriceConfig `json:"teamUsagePriceIds"` } func Start(cfg Config, version string) error { diff --git a/install/installer/pkg/components/usage/configmap.go b/install/installer/pkg/components/usage/configmap.go index cedd872dcc383e..777f35f7a6994f 100644 --- a/install/installer/pkg/components/usage/configmap.go +++ b/install/installer/pkg/components/usage/configmap.go @@ -34,16 +34,31 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { MinForUsersOnStripe: 0, }, } - expConfig := getExperimentalConfig(ctx) - if expConfig != nil { - if expConfig.Schedule != "" { - cfg.ControllerSchedule = expConfig.Schedule + expWebAppConfig := getExperimentalWebAppConfig(ctx) + if expWebAppConfig != nil && expWebAppConfig.Stripe != nil { + cfg.StripePrices = server.StripePrices{ + IndividualUsagePriceIDs: server.PriceConfig{ + EUR: expWebAppConfig.Stripe.IndividualUsagePriceIDs.EUR, + USD: expWebAppConfig.Stripe.IndividualUsagePriceIDs.USD, + }, + TeamUsagePriceIDs: server.PriceConfig{ + EUR: expWebAppConfig.Stripe.TeamUsagePriceIDs.EUR, + USD: expWebAppConfig.Stripe.TeamUsagePriceIDs.USD, + }, + } + } + + expUsageConfig := getExperimentalUsageConfig(ctx) + + if expUsageConfig != nil { + if expUsageConfig.Schedule != "" { + cfg.ControllerSchedule = expUsageConfig.Schedule } - if expConfig.DefaultSpendingLimit != nil { - cfg.DefaultSpendingLimit = *expConfig.DefaultSpendingLimit + if expUsageConfig.DefaultSpendingLimit != nil { + cfg.DefaultSpendingLimit = *expUsageConfig.DefaultSpendingLimit } - cfg.CreditsPerMinuteByWorkspaceClass = expConfig.CreditsPerMinuteByWorkspaceClass + cfg.CreditsPerMinuteByWorkspaceClass = expUsageConfig.CreditsPerMinuteByWorkspaceClass } _ = ctx.WithExperimental(func(ucfg *experimental.Config) error { diff --git a/install/installer/pkg/components/usage/configmap_test.go b/install/installer/pkg/components/usage/configmap_test.go index a90d19cbe545d1..80bacc1ae12513 100644 --- a/install/installer/pkg/components/usage/configmap_test.go +++ b/install/installer/pkg/components/usage/configmap_test.go @@ -29,6 +29,16 @@ func TestConfigMap_ContainsSchedule(t *testing.T) { "forTeams": 1000000000, "minForUsersOnStripe": 0 }, + "stripePrices": { + "individualUsagePriceIds": { + "eur": "", + "usd": "" + }, + "teamUsagePriceIds": { + "eur": "", + "usd": "" + } + }, "server": { "services": { "grpc": { diff --git a/install/installer/pkg/components/usage/objects.go b/install/installer/pkg/components/usage/objects.go index bc3712cd29ec58..e3d639e5d41af2 100644 --- a/install/installer/pkg/components/usage/objects.go +++ b/install/installer/pkg/components/usage/objects.go @@ -11,7 +11,7 @@ import ( ) func Objects(ctx *common.RenderContext) ([]runtime.Object, error) { - cfg := getExperimentalConfig(ctx) + cfg := getExperimentalUsageConfig(ctx) if cfg == nil { return nil, nil } @@ -27,7 +27,7 @@ func Objects(ctx *common.RenderContext) ([]runtime.Object, error) { )(ctx) } -func getExperimentalConfig(ctx *common.RenderContext) *experimental.UsageConfig { +func getExperimentalWebAppConfig(ctx *common.RenderContext) *experimental.WebAppConfig { var experimentalCfg *experimental.Config _ = ctx.WithExperimental(func(ucfg *experimental.Config) error { @@ -35,9 +35,19 @@ func getExperimentalConfig(ctx *common.RenderContext) *experimental.UsageConfig return nil }) - if experimentalCfg == nil || experimentalCfg.WebApp == nil || experimentalCfg.WebApp.Usage == nil { + if experimentalCfg == nil || experimentalCfg.WebApp == nil { return nil } - return experimentalCfg.WebApp.Usage + return experimentalCfg.WebApp +} + +func getExperimentalUsageConfig(ctx *common.RenderContext) *experimental.UsageConfig { + experimentalWebAppCfg := getExperimentalWebAppConfig(ctx) + if experimentalWebAppCfg == nil || experimentalWebAppCfg.Usage == nil { + + return nil + } + + return experimentalWebAppCfg.Usage } diff --git a/install/installer/pkg/config/v1/experimental/experimental.go b/install/installer/pkg/config/v1/experimental/experimental.go index ac5db245a39930..1930e845bde405 100644 --- a/install/installer/pkg/config/v1/experimental/experimental.go +++ b/install/installer/pkg/config/v1/experimental/experimental.go @@ -167,6 +167,16 @@ type WorkspaceTemplates struct { Regular *corev1.Pod `json:"regular"` } +type StripePriceIDs struct { + EUR string `json:"eur"` + USD string `json:"usd"` +} + +type StripeConfig struct { + IndividualUsagePriceIDs StripePriceIDs `json:"individualUsagePriceIds"` + TeamUsagePriceIDs StripePriceIDs `json:"teamUsagePriceIds"` +} + type WebAppConfig struct { PublicAPI *PublicAPIConfig `json:"publicApi,omitempty"` Server *ServerConfig `json:"server,omitempty"` @@ -178,6 +188,7 @@ type WebAppConfig struct { Usage *UsageConfig `json:"usage,omitempty"` ConfigcatKey string `json:"configcatKey"` WorkspaceClasses []WebAppWorkspaceClass `json:"workspaceClasses"` + Stripe *StripeConfig `json:"stripe,omitempty"` } type WorkspaceDefaults struct {