From 7abdeac8b70081321613e0c40595533068da2a51 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Fri, 17 Jun 2022 10:56:49 +0000 Subject: [PATCH 1/3] Make installer render usage configmap --- .../pkg/components/usage/configmap.go | 38 +++++++++++++++++++ .../installer/pkg/components/usage/objects.go | 1 + 2 files changed, 39 insertions(+) create mode 100644 install/installer/pkg/components/usage/configmap.go diff --git a/install/installer/pkg/components/usage/configmap.go b/install/installer/pkg/components/usage/configmap.go new file mode 100644 index 00000000000000..ec01a37788f9a0 --- /dev/null +++ b/install/installer/pkg/components/usage/configmap.go @@ -0,0 +1,38 @@ +// Copyright (c) 2022 Gitpod GmbH. All rights reserved. +// Licensed under the MIT License. See License-MIT.txt in the project root for license information. + +package usage + +import ( + "fmt" + + "github.com/gitpod-io/gitpod/installer/pkg/common" + "github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { + schedule := "1h" + _ = ctx.WithExperimental(func(ucfg *experimental.Config) error { + if ucfg.WebApp != nil && ucfg.WebApp.Usage != nil && ucfg.WebApp.Usage.Schedule != "" { + schedule = ucfg.WebApp.Usage.Schedule + } + return nil + }) + + return []runtime.Object{ + &corev1.ConfigMap{ + TypeMeta: common.TypeMetaConfigmap, + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-config", Component), + Namespace: ctx.Namespace, + Labels: common.DefaultLabels(Component), + }, + Data: map[string]string{ + "schedule": schedule, + }, + }, + }, nil +} diff --git a/install/installer/pkg/components/usage/objects.go b/install/installer/pkg/components/usage/objects.go index 1abb7ab404f0ed..db2d2a281ea709 100644 --- a/install/installer/pkg/components/usage/objects.go +++ b/install/installer/pkg/components/usage/objects.go @@ -20,6 +20,7 @@ func Objects(ctx *common.RenderContext) ([]runtime.Object, error) { return common.CompositeRenderFunc( deployment, rolebinding, + configmap, common.DefaultServiceAccount(Component), )(ctx) } From 0a303d800cb1f54228a53bff2f3a333b45d99785 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Fri, 17 Jun 2022 10:57:04 +0000 Subject: [PATCH 2/3] Add tests for usage configmap rendering Refactor tests to allow arbitrary UsageConfig structs when setting up the render context. --- .../pkg/components/usage/configmap_test.go | 24 +++++++++++++++++++ .../pkg/components/usage/objects_test.go | 12 ++++++---- .../config/v1/experimental/experimental.go | 3 ++- 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 install/installer/pkg/components/usage/configmap_test.go diff --git a/install/installer/pkg/components/usage/configmap_test.go b/install/installer/pkg/components/usage/configmap_test.go new file mode 100644 index 00000000000000..d20ad4e95e5556 --- /dev/null +++ b/install/installer/pkg/components/usage/configmap_test.go @@ -0,0 +1,24 @@ +// Copyright (c) 2022 Gitpod GmbH. All rights reserved. +// Licensed under the MIT License. See License-MIT.txt in the project root for license information. + +package usage + +import ( + "testing" + + "github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" +) + +func TestConfigMap_ContainsSchedule(t *testing.T) { + ctx := renderContextWithUsageConfig(t, &experimental.UsageConfig{Enabled: true, Schedule: "2m"}) + + objs, err := configmap(ctx) + require.NoError(t, err) + + cfgmap, ok := objs[0].(*corev1.ConfigMap) + require.True(t, ok) + + require.Equal(t, cfgmap.Data["schedule"], "2m") +} diff --git a/install/installer/pkg/components/usage/objects_test.go b/install/installer/pkg/components/usage/objects_test.go index f6914fc050f0f1..623e5b00775fda 100644 --- a/install/installer/pkg/components/usage/objects_test.go +++ b/install/installer/pkg/components/usage/objects_test.go @@ -27,16 +27,14 @@ func TestObjects_RenderedWhenExperimentalConfigSet(t *testing.T) { objects, err := Objects(ctx) require.NoError(t, err) require.NotEmpty(t, objects, "must render objects because experimental config is specified") - require.Len(t, objects, 4, "should render expected k8s objects") + require.Len(t, objects, 5, "should render expected k8s objects") } -func renderContextWithUsageEnabled(t *testing.T) *common.RenderContext { +func renderContextWithUsageConfig(t *testing.T, usage *experimental.UsageConfig) *common.RenderContext { ctx, err := common.NewRenderContext(config.Config{ Domain: "test.domain.everything.awesome.is", Experimental: &experimental.Config{ - WebApp: &experimental.WebAppConfig{ - Usage: &experimental.UsageConfig{Enabled: true}, - }, + WebApp: &experimental.WebAppConfig{Usage: usage}, }, Database: config.Database{ CloudSQL: &config.DatabaseCloudSQL{ @@ -59,3 +57,7 @@ func renderContextWithUsageEnabled(t *testing.T) *common.RenderContext { return ctx } + +func renderContextWithUsageEnabled(t *testing.T) *common.RenderContext { + return renderContextWithUsageConfig(t, &experimental.UsageConfig{Enabled: true}) +} diff --git a/install/installer/pkg/config/v1/experimental/experimental.go b/install/installer/pkg/config/v1/experimental/experimental.go index 38d87c766d7514..3856365fac8254 100644 --- a/install/installer/pkg/config/v1/experimental/experimental.go +++ b/install/installer/pkg/config/v1/experimental/experimental.go @@ -164,7 +164,8 @@ type PublicAPIConfig struct { } type UsageConfig struct { - Enabled bool `json:"enabled"` + Enabled bool `json:"enabled"` + Schedule string `json:"schedule"` } type IDEConfig struct { From 015090a42d2b7d55e43daa309860eb2ff7459d3f Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Fri, 17 Jun 2022 10:49:47 +0000 Subject: [PATCH 3/3] Pass command line flag to `usage run` Set the value of `--schedule` to the value from the configmap. --- .../installer/pkg/components/usage/deployment.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/install/installer/pkg/components/usage/deployment.go b/install/installer/pkg/components/usage/deployment.go index 744fd843a74206..87114bbedc2e27 100644 --- a/install/installer/pkg/components/usage/deployment.go +++ b/install/installer/pkg/components/usage/deployment.go @@ -4,6 +4,8 @@ package usage import ( + "fmt" + "github.com/gitpod-io/gitpod/common-go/baseserver" "github.com/gitpod-io/gitpod/installer/pkg/cluster" "github.com/gitpod-io/gitpod/installer/pkg/common" @@ -77,6 +79,8 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Usage.Version), Args: []string{ "run", + "--schedule", + "$(RECONCILER_SCHEDULE)", }, ImagePullPolicy: corev1.PullIfNotPresent, Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{ @@ -92,6 +96,15 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { Env: common.MergeEnv( common.DefaultEnv(&ctx.Config), common.DatabaseEnv(&ctx.Config), + []corev1.EnvVar{{ + Name: "RECONCILER_SCHEDULE", + ValueFrom: &corev1.EnvVarSource{ + ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{Name: fmt.Sprintf("%s-config", Component)}, + Key: "schedule", + }, + }, + }}, ), VolumeMounts: volumeMounts, LivenessProbe: &corev1.Probe{