Skip to content

Commit 3170c6f

Browse files
committed
[installer] Add support for workspace classes
1 parent fa24cf3 commit 3170c6f

File tree

4 files changed

+84
-29
lines changed

4 files changed

+84
-29
lines changed

install/installer/pkg/components/ws-manager/configmap.go

Lines changed: 63 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
storageconfig "github.com/gitpod-io/gitpod/content-service/api/config"
1818
"github.com/gitpod-io/gitpod/installer/pkg/common"
1919
configv1 "github.com/gitpod-io/gitpod/installer/pkg/config/v1"
20+
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
2021
"github.com/gitpod-io/gitpod/ws-manager/api/config"
2122

2223
corev1 "k8s.io/api/core/v1"
@@ -25,7 +26,11 @@ import (
2526
)
2627

2728
func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
28-
templatesCfg, tpls, err := buildWorkspaceTemplates(ctx)
29+
cfgTpls := ctx.Config.Workspace.Templates
30+
if cfgTpls == nil {
31+
cfgTpls = &configv1.WorkspaceTemplates{}
32+
}
33+
templatesCfg, tpls, err := buildWorkspaceTemplates(ctx, cfgTpls, "")
2934
if err != nil {
3035
return nil, err
3136
}
@@ -43,6 +48,60 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
4348
timeoutAfterClose = *ctx.Config.Workspace.TimeoutAfterClose
4449
}
4550

51+
classes := map[string]*config.WorkspaceClass{
52+
"": {
53+
Container: config.ContainerConfiguration{
54+
Requests: &config.ResourceConfiguration{
55+
CPU: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceCPU),
56+
Memory: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceMemory),
57+
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
58+
},
59+
Limits: &config.ResourceConfiguration{
60+
CPU: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceCPU),
61+
Memory: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceMemory),
62+
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceEphemeralStorage),
63+
},
64+
},
65+
Templates: templatesCfg,
66+
},
67+
}
68+
err = ctx.WithExperimental(func(ucfg *experimental.Config) error {
69+
if ucfg.Workspace == nil {
70+
return nil
71+
}
72+
for k, c := range ucfg.Workspace.WorkspaceClasses {
73+
tplsCfg, ctpls, err := buildWorkspaceTemplates(ctx, &configv1.WorkspaceTemplates{
74+
Default: c.Templates.Default,
75+
Prebuild: c.Templates.Prebuild,
76+
ImageBuild: c.Templates.ImageBuild,
77+
Regular: c.Templates.Regular,
78+
}, k)
79+
if err != nil {
80+
return err
81+
}
82+
classes[k] = &config.WorkspaceClass{
83+
Container: config.ContainerConfiguration{
84+
Requests: &config.ResourceConfiguration{
85+
CPU: quantityString(c.Resources.Requests, corev1.ResourceCPU),
86+
Memory: quantityString(c.Resources.Requests, corev1.ResourceMemory),
87+
EphemeralStorage: quantityString(c.Resources.Requests, corev1.ResourceEphemeralStorage),
88+
},
89+
Limits: &config.ResourceConfiguration{
90+
CPU: quantityString(c.Resources.Limits, corev1.ResourceCPU),
91+
Memory: quantityString(c.Resources.Limits, corev1.ResourceMemory),
92+
EphemeralStorage: quantityString(c.Resources.Limits, corev1.ResourceEphemeralStorage),
93+
},
94+
},
95+
Templates: tplsCfg,
96+
}
97+
tpls = append(tpls, ctpls...)
98+
}
99+
return nil
100+
})
101+
if err != nil {
102+
return nil, err
103+
}
104+
46105
wsmcfg := config.ServiceConfiguration{
47106
Manager: config.Configuration{
48107
Namespace: ctx.Namespace,
@@ -60,21 +119,7 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
60119
PrivateKey: "/ws-daemon-tls-certs/tls.key",
61120
},
62121
},
63-
Container: config.AllContainerConfiguration{
64-
Workspace: config.ContainerConfiguration{
65-
Requests: config.ResourceConfiguration{
66-
CPU: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceCPU),
67-
Memory: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceMemory),
68-
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
69-
},
70-
Limits: config.ResourceConfiguration{
71-
CPU: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceCPU),
72-
Memory: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceMemory),
73-
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
74-
},
75-
Image: "OVERWRITTEN-IN-REQUEST",
76-
},
77-
},
122+
WorkspaceClasses: classes,
78123
HeartbeatInterval: util.Duration(30 * time.Second),
79124
GitpodHostURL: "https://" + ctx.Config.Domain,
80125
WorkspaceClusterHost: fmt.Sprintf("ws.%s", ctx.Config.Domain),
@@ -84,7 +129,6 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
84129
WorkspaceURLTemplate: fmt.Sprintf("https://{{ .Prefix }}.ws.%s", ctx.Config.Domain),
85130
WorkspacePortURLTemplate: fmt.Sprintf("https://{{ .WorkspacePort }}-{{ .Prefix }}.ws.%s", ctx.Config.Domain),
86131
WorkspaceHostPath: wsdaemon.HostWorkingArea,
87-
WorkspacePodTemplate: templatesCfg,
88132
Timeouts: config.WorkspaceTimeoutConfiguration{
89133
AfterClose: timeoutAfterClose,
90134
HeadlessWorkspace: util.Duration(1 * time.Hour),
@@ -154,15 +198,11 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
154198
return res, nil
155199
}
156200

157-
func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemplateConfiguration, []runtime.Object, error) {
201+
func buildWorkspaceTemplates(ctx *common.RenderContext, cfgTpls *configv1.WorkspaceTemplates, className string) (config.WorkspacePodTemplateConfiguration, []runtime.Object, error) {
158202
var (
159203
cfg config.WorkspacePodTemplateConfiguration
160204
tpls = make(map[string]string)
161205
)
162-
cfgTpls := ctx.Config.Workspace.Templates
163-
if cfgTpls == nil {
164-
cfgTpls = &configv1.WorkspaceTemplates{}
165-
}
166206

167207
ops := []struct {
168208
Name string
@@ -173,7 +213,6 @@ func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemp
173213
{Name: "imagebuild", Path: &cfg.ImagebuildPath, Tpl: cfgTpls.ImageBuild},
174214
{Name: "prebuild", Path: &cfg.PrebuildPath, Tpl: cfgTpls.Prebuild},
175215
{Name: "regular", Path: &cfg.RegularPath, Tpl: cfgTpls.Regular},
176-
{Name: "probe", Path: &cfg.ProbePath, Tpl: cfgTpls.Probe},
177216
}
178217
for _, op := range ops {
179218
if op.Tpl == nil {
@@ -183,7 +222,7 @@ func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemp
183222
if err != nil {
184223
return cfg, nil, fmt.Errorf("unable to marshal %s workspace template: %w", op.Name, err)
185224
}
186-
fn := op.Name + ".yaml"
225+
fn := filepath.Join(className, op.Name+".yaml")
187226
*op.Path = filepath.Join(WorkspaceTemplatePath, fn)
188227
tpls[fn] = string(fc)
189228
}

install/installer/pkg/components/ws-manager/configmap_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ func TestBuildWorkspaceTemplates(t *testing.T) {
105105

106106
act.TplConfig, objs, err = buildWorkspaceTemplates(&common.RenderContext{Config: configv1.Config{
107107
ContainerRegistry: *test.ContainerRegistry,
108-
Workspace: configv1.Workspace{Templates: test.Config},
109-
}})
108+
}}, test.Config, "")
110109
if err != nil {
111110
t.Error(err)
112111
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,8 @@ type WorkspaceRuntime struct {
218218
type WorkspaceTemplates struct {
219219
Default *corev1.Pod `json:"default"`
220220
Prebuild *corev1.Pod `json:"prebuild"`
221-
Ghost *corev1.Pod `json:"ghost"`
222221
ImageBuild *corev1.Pod `json:"imagebuild"`
223222
Regular *corev1.Pod `json:"regular"`
224-
Probe *corev1.Pod `json:"probe"`
225223
}
226224

227225
type Workspace struct {

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
// If you use any setting herein, you forfeit support from Gitpod.
1111
package experimental
1212

13-
import "k8s.io/apimachinery/pkg/api/resource"
13+
import (
14+
corev1 "k8s.io/api/core/v1"
15+
"k8s.io/apimachinery/pkg/api/resource"
16+
)
1417

1518
// Config contains all experimental configuration.
1619
type Config struct {
@@ -43,6 +46,22 @@ type WorkspaceConfig struct {
4346
PasswordSecret string `json:"passwordSecret"`
4447
} `json:"redisCache"`
4548
} `json:"registryFacade"`
49+
50+
WorkspaceClasses map[string]WorkspaceClass `json:"classes,omitempty"`
51+
}
52+
53+
type WorkspaceClass struct {
54+
Resources struct {
55+
Requests corev1.ResourceList `json:"requests" validate:"required"`
56+
Limits corev1.ResourceList `json:"limits,omitempty"`
57+
} `json:"resources" validate:"required"`
58+
Templates WorkspaceTemplates `json:"templates,omitempty"`
59+
}
60+
type WorkspaceTemplates struct {
61+
Default *corev1.Pod `json:"default"`
62+
Prebuild *corev1.Pod `json:"prebuild"`
63+
ImageBuild *corev1.Pod `json:"imagebuild"`
64+
Regular *corev1.Pod `json:"regular"`
4665
}
4766

4867
type WebAppConfig struct {

0 commit comments

Comments
 (0)