Skip to content

Commit

Permalink
[installer] Add support for workspace classes
Browse files Browse the repository at this point in the history
  • Loading branch information
csweichel committed Apr 27, 2022
1 parent fdd3800 commit 3c1dd5f
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 27 deletions.
86 changes: 64 additions & 22 deletions install/installer/pkg/components/ws-manager/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
storageconfig "github.com/gitpod-io/gitpod/content-service/api/config"
"github.com/gitpod-io/gitpod/installer/pkg/common"
configv1 "github.com/gitpod-io/gitpod/installer/pkg/config/v1"
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
"github.com/gitpod-io/gitpod/ws-manager/api/config"

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

func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
templatesCfg, tpls, err := buildWorkspaceTemplates(ctx)
cfgTpls := ctx.Config.Workspace.Templates
if cfgTpls == nil {
cfgTpls = &configv1.WorkspaceTemplates{}
}
templatesCfg, tpls, err := buildWorkspaceTemplates(ctx, cfgTpls, "")
if err != nil {
return nil, err
}
Expand All @@ -48,6 +53,60 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
customCASecret = ctx.Config.CustomCACert.Name
}

classes := map[string]*config.WorkspaceClass{
"": {
Container: config.ContainerConfiguration{
Requests: &config.ResourceConfiguration{
CPU: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceCPU),
Memory: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceMemory),
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
},
Limits: &config.ResourceConfiguration{
CPU: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceCPU),
Memory: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceMemory),
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceEphemeralStorage),
},
},
Templates: templatesCfg,
},
}
err = ctx.WithExperimental(func(ucfg *experimental.Config) error {
if ucfg.Workspace == nil {
return nil
}
for k, c := range ucfg.Workspace.WorkspaceClasses {
tplsCfg, ctpls, err := buildWorkspaceTemplates(ctx, &configv1.WorkspaceTemplates{
Default: c.Templates.Default,
Prebuild: c.Templates.Prebuild,
ImageBuild: c.Templates.ImageBuild,
Regular: c.Templates.Regular,
}, k)
if err != nil {
return err
}
classes[k] = &config.WorkspaceClass{
Container: config.ContainerConfiguration{
Requests: &config.ResourceConfiguration{
CPU: quantityString(c.Resources.Requests, corev1.ResourceCPU),
Memory: quantityString(c.Resources.Requests, corev1.ResourceMemory),
EphemeralStorage: quantityString(c.Resources.Requests, corev1.ResourceEphemeralStorage),
},
Limits: &config.ResourceConfiguration{
CPU: quantityString(c.Resources.Limits, corev1.ResourceCPU),
Memory: quantityString(c.Resources.Limits, corev1.ResourceMemory),
EphemeralStorage: quantityString(c.Resources.Limits, corev1.ResourceEphemeralStorage),
},
},
Templates: tplsCfg,
}
tpls = append(tpls, ctpls...)
}
return nil
})
if err != nil {
return nil, err
}

wsmcfg := config.ServiceConfiguration{
Manager: config.Configuration{
Namespace: ctx.Namespace,
Expand All @@ -65,21 +124,7 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
PrivateKey: "/ws-daemon-tls-certs/tls.key",
},
},
Container: config.AllContainerConfiguration{
Workspace: config.ContainerConfiguration{
Requests: config.ResourceConfiguration{
CPU: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceCPU),
Memory: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceMemory),
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
},
Limits: config.ResourceConfiguration{
CPU: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceCPU),
Memory: quantityString(ctx.Config.Workspace.Resources.Limits, corev1.ResourceMemory),
EphemeralStorage: quantityString(ctx.Config.Workspace.Resources.Requests, corev1.ResourceEphemeralStorage),
},
Image: "OVERWRITTEN-IN-REQUEST",
},
},
WorkspaceClasses: classes,
HeartbeatInterval: util.Duration(30 * time.Second),
GitpodHostURL: "https://" + ctx.Config.Domain,
WorkspaceClusterHost: fmt.Sprintf("ws.%s", ctx.Config.Domain),
Expand All @@ -89,7 +134,6 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
WorkspaceURLTemplate: fmt.Sprintf("https://{{ .Prefix }}.ws.%s", ctx.Config.Domain),
WorkspacePortURLTemplate: fmt.Sprintf("https://{{ .WorkspacePort }}-{{ .Prefix }}.ws.%s", ctx.Config.Domain),
WorkspaceHostPath: wsdaemon.HostWorkingArea,
WorkspacePodTemplate: templatesCfg,
Timeouts: config.WorkspaceTimeoutConfiguration{
AfterClose: timeoutAfterClose,
HeadlessWorkspace: util.Duration(1 * time.Hour),
Expand Down Expand Up @@ -165,14 +209,13 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
return res, nil
}

func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemplateConfiguration, []runtime.Object, error) {
func buildWorkspaceTemplates(ctx *common.RenderContext, cfgTpls *configv1.WorkspaceTemplates, className string) (config.WorkspacePodTemplateConfiguration, []runtime.Object, error) {
var (
cfg config.WorkspacePodTemplateConfiguration
tpls = make(map[string]string)
)
cfgTpls := ctx.Config.Workspace.Templates
if cfgTpls == nil {
cfgTpls = &configv1.WorkspaceTemplates{}
cfgTpls = new(configv1.WorkspaceTemplates)
}

ops := []struct {
Expand All @@ -184,7 +227,6 @@ func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemp
{Name: "imagebuild", Path: &cfg.ImagebuildPath, Tpl: cfgTpls.ImageBuild},
{Name: "prebuild", Path: &cfg.PrebuildPath, Tpl: cfgTpls.Prebuild},
{Name: "regular", Path: &cfg.RegularPath, Tpl: cfgTpls.Regular},
{Name: "probe", Path: &cfg.ProbePath, Tpl: cfgTpls.Probe},
}
for _, op := range ops {
if op.Tpl == nil {
Expand All @@ -194,7 +236,7 @@ func buildWorkspaceTemplates(ctx *common.RenderContext) (config.WorkspacePodTemp
if err != nil {
return cfg, nil, fmt.Errorf("unable to marshal %s workspace template: %w", op.Name, err)
}
fn := op.Name + ".yaml"
fn := filepath.Join(className, op.Name+".yaml")
*op.Path = filepath.Join(WorkspaceTemplatePath, fn)
tpls[fn] = string(fc)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,7 @@ func TestBuildWorkspaceTemplates(t *testing.T) {

act.TplConfig, objs, err = buildWorkspaceTemplates(&common.RenderContext{Config: configv1.Config{
ContainerRegistry: *test.ContainerRegistry,
Workspace: configv1.Workspace{Templates: test.Config},
}})
}}, test.Config, "")
if err != nil {
t.Error(err)
}
Expand Down
2 changes: 0 additions & 2 deletions install/installer/pkg/config/v1/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,10 +234,8 @@ type WorkspaceRuntime struct {
type WorkspaceTemplates struct {
Default *corev1.Pod `json:"default"`
Prebuild *corev1.Pod `json:"prebuild"`
Ghost *corev1.Pod `json:"ghost"`
ImageBuild *corev1.Pod `json:"imagebuild"`
Regular *corev1.Pod `json:"regular"`
Probe *corev1.Pod `json:"probe"`
}

type Workspace struct {
Expand Down
21 changes: 20 additions & 1 deletion install/installer/pkg/config/v1/experimental/experimental.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
// If you use any setting herein, you forfeit support from Gitpod.
package experimental

import "k8s.io/apimachinery/pkg/api/resource"
import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
)

// Config contains all experimental configuration.
type Config struct {
Expand Down Expand Up @@ -58,6 +61,22 @@ type WorkspaceConfig struct {
PasswordSecret string `json:"passwordSecret"`
} `json:"redisCache"`
} `json:"registryFacade"`

WorkspaceClasses map[string]WorkspaceClass `json:"classes,omitempty"`
}

type WorkspaceClass struct {
Resources struct {
Requests corev1.ResourceList `json:"requests" validate:"required"`
Limits corev1.ResourceList `json:"limits,omitempty"`
} `json:"resources" validate:"required"`
Templates WorkspaceTemplates `json:"templates,omitempty"`
}
type WorkspaceTemplates struct {
Default *corev1.Pod `json:"default"`
Prebuild *corev1.Pod `json:"prebuild"`
ImageBuild *corev1.Pod `json:"imagebuild"`
Regular *corev1.Pod `json:"regular"`
}

type WebAppConfig struct {
Expand Down

0 comments on commit 3c1dd5f

Please sign in to comment.