Skip to content

Commit 9f3d741

Browse files
easyCZroboquat
authored andcommitted
[usage] Initial installer configuration
1 parent 5b8c8d3 commit 9f3d741

File tree

9 files changed

+269
-0
lines changed

9 files changed

+269
-0
lines changed

.werft/jobs/build/installer/installer.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export class Installer {
6767
this.configureAuthProviders(slice)
6868
this.configureSSHGateway(slice)
6969
this.configurePublicAPIServer(slice)
70+
this.configureUsage(slice)
7071

7172
if (this.options.analytics) {
7273
this.includeAnalytics(slice)
@@ -164,6 +165,10 @@ export class Installer {
164165
exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.publicApi.enabled true`, { slice: slice })
165166
}
166167

168+
private configureUsage(slice: string) {
169+
exec(`yq w -i ${this.options.installerConfigPath} experimental.webapp.usage.enabled true`, { slice: slice })
170+
}
171+
167172
private includeAnalytics(slice: string): void {
168173
exec(`yq w -i ${this.options.installerConfigPath} analytics.writer segment`, { slice: slice });
169174
exec(`yq w -i ${this.options.installerConfigPath} analytics.segmentKey ${this.options.analytics.token}`, { slice: slice });

install/installer/pkg/components/components-webapp/components.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
public_api_server "github.com/gitpod-io/gitpod/installer/pkg/components/public-api-server"
1818
"github.com/gitpod-io/gitpod/installer/pkg/components/rabbitmq"
1919
"github.com/gitpod-io/gitpod/installer/pkg/components/server"
20+
"github.com/gitpod-io/gitpod/installer/pkg/components/usage"
2021
wsmanagerbridge "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager-bridge"
2122
)
2223

@@ -33,6 +34,7 @@ var Objects = common.CompositeRenderFunc(
3334
server.Objects,
3435
wsmanagerbridge.Objects,
3536
public_api_server.Objects,
37+
usage.Objects,
3638
)
3739

3840
var Helm = common.CompositeHelmFunc(
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package usage
6+
7+
const (
8+
Component = "usage"
9+
)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the MIT License. See License-MIT.txt in the project root for license information.
3+
4+
package usage
5+
6+
import (
7+
"fmt"
8+
9+
"github.com/gitpod-io/gitpod/common-go/baseserver"
10+
"github.com/gitpod-io/gitpod/installer/pkg/cluster"
11+
"github.com/gitpod-io/gitpod/installer/pkg/common"
12+
appsv1 "k8s.io/api/apps/v1"
13+
corev1 "k8s.io/api/core/v1"
14+
"k8s.io/apimachinery/pkg/api/resource"
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/apimachinery/pkg/runtime"
17+
"k8s.io/apimachinery/pkg/util/intstr"
18+
"k8s.io/utils/pointer"
19+
)
20+
21+
func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
22+
labels := common.DefaultLabels(Component)
23+
return []runtime.Object{
24+
&appsv1.Deployment{
25+
TypeMeta: common.TypeMetaDeployment,
26+
ObjectMeta: metav1.ObjectMeta{
27+
Name: Component,
28+
Namespace: ctx.Namespace,
29+
Labels: labels,
30+
},
31+
Spec: appsv1.DeploymentSpec{
32+
Selector: &metav1.LabelSelector{MatchLabels: labels},
33+
Replicas: common.Replicas(ctx, Component),
34+
Strategy: common.DeploymentStrategy,
35+
Template: corev1.PodTemplateSpec{
36+
ObjectMeta: metav1.ObjectMeta{
37+
Name: Component,
38+
Namespace: ctx.Namespace,
39+
Labels: labels,
40+
},
41+
Spec: corev1.PodSpec{
42+
Affinity: common.NodeAffinity(cluster.AffinityLabelMeta),
43+
ServiceAccountName: Component,
44+
EnableServiceLinks: pointer.Bool(false),
45+
DNSPolicy: "ClusterFirst",
46+
RestartPolicy: "Always",
47+
TerminationGracePeriodSeconds: pointer.Int64(30),
48+
Containers: []corev1.Container{{
49+
Name: Component,
50+
Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Usage.Version),
51+
Args: []string{
52+
"run",
53+
},
54+
ImagePullPolicy: corev1.PullIfNotPresent,
55+
Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{
56+
Requests: corev1.ResourceList{
57+
"cpu": resource.MustParse("100m"),
58+
"memory": resource.MustParse("64Mi"),
59+
},
60+
}),
61+
Ports: []corev1.ContainerPort{},
62+
SecurityContext: &corev1.SecurityContext{
63+
Privileged: pointer.Bool(false),
64+
},
65+
Env: common.MergeEnv(
66+
common.DefaultEnv(&ctx.Config),
67+
),
68+
LivenessProbe: &corev1.Probe{
69+
ProbeHandler: corev1.ProbeHandler{
70+
HTTPGet: &corev1.HTTPGetAction{
71+
Path: "/live",
72+
Port: intstr.IntOrString{IntVal: baseserver.BuiltinHealthPort},
73+
Scheme: corev1.URISchemeHTTP,
74+
},
75+
},
76+
FailureThreshold: 3,
77+
SuccessThreshold: 1,
78+
TimeoutSeconds: 1,
79+
},
80+
ReadinessProbe: &corev1.Probe{
81+
ProbeHandler: corev1.ProbeHandler{
82+
HTTPGet: &corev1.HTTPGetAction{
83+
Path: "/ready",
84+
Port: intstr.IntOrString{IntVal: baseserver.BuiltinHealthPort},
85+
Scheme: corev1.URISchemeHTTP,
86+
},
87+
},
88+
FailureThreshold: 3,
89+
SuccessThreshold: 1,
90+
TimeoutSeconds: 1,
91+
},
92+
},
93+
*common.KubeRBACProxyContainerWithConfig(ctx, 9500, fmt.Sprintf("http://127.0.0.1:%d/", baseserver.BuiltinMetricsPort)),
94+
},
95+
},
96+
},
97+
},
98+
},
99+
}, nil
100+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the MIT License. See License-MIT.txt in the project root for license information.
3+
4+
package usage
5+
6+
import (
7+
"github.com/gitpod-io/gitpod/common-go/log"
8+
"github.com/gitpod-io/gitpod/installer/pkg/common"
9+
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
10+
"k8s.io/apimachinery/pkg/runtime"
11+
)
12+
13+
func Objects(ctx *common.RenderContext) ([]runtime.Object, error) {
14+
cfg := getExperimentalConfig(ctx)
15+
if cfg == nil {
16+
return nil, nil
17+
}
18+
19+
log.Debug("Detected experimental.WebApp.Usage configuration", cfg)
20+
return common.CompositeRenderFunc(
21+
deployment,
22+
rolebinding,
23+
common.DefaultServiceAccount(Component),
24+
)(ctx)
25+
}
26+
27+
func getExperimentalConfig(ctx *common.RenderContext) *experimental.UsageConfig {
28+
var experimentalCfg *experimental.Config
29+
30+
_ = ctx.WithExperimental(func(ucfg *experimental.Config) error {
31+
experimentalCfg = ucfg
32+
return nil
33+
})
34+
35+
if experimentalCfg == nil || experimentalCfg.WebApp == nil || experimentalCfg.WebApp.Usage == nil {
36+
return nil
37+
}
38+
39+
return experimentalCfg.WebApp.Usage
40+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the MIT License. See License-MIT.txt in the project root for license information.
3+
4+
package usage
5+
6+
import (
7+
"github.com/gitpod-io/gitpod/installer/pkg/common"
8+
"github.com/gitpod-io/gitpod/installer/pkg/config/v1"
9+
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
10+
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
11+
"github.com/stretchr/testify/require"
12+
"testing"
13+
)
14+
15+
func TestObjects_NotRenderedByDefault(t *testing.T) {
16+
ctx, err := common.NewRenderContext(config.Config{}, versions.Manifest{}, "test-namespace")
17+
require.NoError(t, err)
18+
19+
objects, err := Objects(ctx)
20+
require.NoError(t, err)
21+
require.Empty(t, objects, "no objects should be rendered with default config")
22+
}
23+
24+
func TestObjects_RenderedWhenExperimentalConfigSet(t *testing.T) {
25+
ctx := renderContextWithUsageEnabled(t)
26+
27+
objects, err := Objects(ctx)
28+
require.NoError(t, err)
29+
require.NotEmpty(t, objects, "must render objects because experimental config is specified")
30+
require.Len(t, objects, 4, "should render expected k8s objects")
31+
}
32+
33+
func renderContextWithUsageEnabled(t *testing.T) *common.RenderContext {
34+
ctx, err := common.NewRenderContext(config.Config{
35+
Domain: "test.domain.everything.awesome.is",
36+
Experimental: &experimental.Config{
37+
WebApp: &experimental.WebAppConfig{
38+
Usage: &experimental.UsageConfig{Enabled: true},
39+
},
40+
},
41+
}, versions.Manifest{
42+
Components: versions.Components{
43+
Usage: versions.Versioned{
44+
Version: "commit-test-latest",
45+
},
46+
},
47+
}, "test-namespace")
48+
require.NoError(t, err)
49+
50+
return ctx
51+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package usage
6+
7+
import (
8+
"fmt"
9+
10+
"github.com/gitpod-io/gitpod/installer/pkg/common"
11+
12+
rbacv1 "k8s.io/api/rbac/v1"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/runtime"
15+
)
16+
17+
func rolebinding(ctx *common.RenderContext) ([]runtime.Object, error) {
18+
labels := common.DefaultLabels(Component)
19+
20+
return []runtime.Object{
21+
&rbacv1.ClusterRoleBinding{
22+
TypeMeta: common.TypeMetaClusterRoleBinding,
23+
ObjectMeta: metav1.ObjectMeta{
24+
Name: fmt.Sprintf("%s-%s-rb-kube-rbac-proxy", ctx.Namespace, Component),
25+
Labels: labels,
26+
},
27+
RoleRef: rbacv1.RoleRef{
28+
Kind: "ClusterRole",
29+
Name: fmt.Sprintf("%s-kube-rbac-proxy", ctx.Namespace),
30+
APIGroup: "rbac.authorization.k8s.io",
31+
},
32+
Subjects: []rbacv1.Subject{{
33+
Kind: "ServiceAccount",
34+
Name: Component,
35+
Namespace: ctx.Namespace,
36+
}},
37+
},
38+
&rbacv1.RoleBinding{
39+
TypeMeta: common.TypeMetaRoleBinding,
40+
ObjectMeta: metav1.ObjectMeta{
41+
Name: Component,
42+
Namespace: ctx.Namespace,
43+
Labels: common.DefaultLabels(Component),
44+
},
45+
RoleRef: rbacv1.RoleRef{
46+
Kind: "ClusterRole",
47+
Name: fmt.Sprintf("%s-ns-psp:restricted-root-user", ctx.Namespace),
48+
APIGroup: "rbac.authorization.k8s.io",
49+
},
50+
Subjects: []rbacv1.Subject{{
51+
Kind: "ServiceAccount",
52+
Name: Component,
53+
}},
54+
},
55+
}, nil
56+
}

install/installer/pkg/config/v1/experimental/experimental.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ type WebAppConfig struct {
102102
Tracing *Tracing `json:"tracing,omitempty"`
103103
UsePodAntiAffinity bool `json:"usePodAntiAffinity"`
104104
DisableMigration bool `json:"disableMigration"`
105+
Usage *UsageConfig `json:"usage,omitempty"`
105106
}
106107

107108
type WorkspaceDefaults struct {
@@ -160,6 +161,10 @@ type PublicAPIConfig struct {
160161
Enabled bool `json:"enabled"`
161162
}
162163

164+
type UsageConfig struct {
165+
Enabled bool `json:"enabled"`
166+
}
167+
163168
type IDEConfig struct {
164169
// Disable resolution of latest images and use bundled latest versions instead
165170
ResolveLatest *bool `json:"resolveLatest,omitempty"`

install/installer/pkg/config/versions/versions.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type Components struct {
3737
RegistryFacade Versioned `json:"registryFacade"`
3838
Server Versioned `json:"server"`
3939
ServiceWaiter Versioned `json:"serviceWaiter"`
40+
Usage Versioned `json:"usage"`
4041
Workspace struct {
4142
CodeImage Versioned `json:"codeImage"`
4243
DockerUp Versioned `json:"dockerUp"`

0 commit comments

Comments
 (0)