Path: blob/main/components/ws-proxy/pkg/proxy/config.go
2500 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package proxy56import (7"os"8"path/filepath"910validation "github.com/go-ozzo/ozzo-validation"11"golang.org/x/xerrors"1213"github.com/gitpod-io/gitpod/common-go/log"14"github.com/gitpod-io/gitpod/common-go/util"15)1617// Config is the configuration for a WorkspaceProxy.18type Config struct {19HTTPS struct {20Key string `json:"key"`21Certificate string `json:"crt"`22} `json:"https,omitempty"`2324TransportConfig *TransportConfig `json:"transportConfig"`25BlobServer *BlobServerConfig `json:"blobServer"`26GitpodInstallation *GitpodInstallation `json:"gitpodInstallation"`27WorkspacePodConfig *WorkspacePodConfig `json:"workspacePodConfig"`2829BuiltinPages BuiltinPagesConfig `json:"builtinPages"`30SSHGatewayCAKeyFile string `json:"sshCAKeyFile"`31}3233// Validate validates the configuration to catch issues during startup and not at runtime.34func (c *Config) Validate() error {35type validatable interface {36Validate() error37}38for _, v := range []validatable{39c.TransportConfig,40c.BlobServer,41c.GitpodInstallation,42c.WorkspacePodConfig,43} {44err := v.Validate()45if err != nil {46return err47}48}4950return nil51}5253// HostBasedIngressConfig configures the host-based ingress.54type HostBasedIngressConfig struct {55HTTPAddress string `json:"httpAddress"`56HTTPSAddress string `json:"httpsAddress"`57Header string `json:"header"`58}5960// Validate validates this config.61func (c *HostBasedIngressConfig) Validate() error {62if c == nil {63return xerrors.Errorf("host based ingress config is mandatory")64}65return validation.ValidateStruct(c,66validation.Field(&c.HTTPAddress, validation.Required),67validation.Field(&c.HTTPSAddress, validation.Required),68validation.Field(&c.Header, validation.Required),69)70}7172// WorkspacePodConfig contains config around the workspace pod.73type WorkspacePodConfig struct {74TheiaPort uint16 `json:"theiaPort"`75IDEDebugPort uint16 `json:"ideDebugPort"`76SupervisorPort uint16 `json:"supervisorPort"`77SupervisorDebugPort uint16 `json:"supervisorDebugPort"`78DebugWorkspaceProxyPort uint16 `json:"debugWorkspaceProxyPort"`79// SupervisorImage is deprecated80SupervisorImage string `json:"supervisorImage"`81}8283// Validate validates the configuration to catch issues during startup and not at runtime.84func (c *WorkspacePodConfig) Validate() error {85if c == nil {86return xerrors.Errorf("WorkspacePodConfig not configured")87}8889err := validation.ValidateStruct(c,90validation.Field(&c.TheiaPort, validation.Required),91validation.Field(&c.IDEDebugPort, validation.Required),92validation.Field(&c.SupervisorPort, validation.Required),93validation.Field(&c.SupervisorDebugPort, validation.Required),94validation.Field(&c.DebugWorkspaceProxyPort, validation.Required),95)96if len(c.SupervisorImage) > 0 {97log.Warn("config value 'workspacePodConfig.supervisorImage' is deprected, use it only to be backwards compatible")98}99if err != nil {100return err101}102103return nil104}105106// GitpodInstallation contains config regarding the Gitpod installation.107type GitpodInstallation struct {108Scheme string `json:"scheme"`109HostName string `json:"hostName"`110WorkspaceHostSuffix string `json:"workspaceHostSuffix"`111WorkspaceHostSuffixRegex string `json:"workspaceHostSuffixRegex"`112}113114// Validate validates the configuration to catch issues during startup and not at runtime.115func (c *GitpodInstallation) Validate() error {116if c == nil {117return xerrors.Errorf("GitpodInstallation not configured")118}119120return validation.ValidateStruct(c,121validation.Field(&c.Scheme, validation.Required),122validation.Field(&c.HostName, validation.Required), // TODO IP ONLY: Check if there is any dependency. If yes, remove it.123validation.Field(&c.WorkspaceHostSuffix, validation.Required),124)125}126127// BlobServerConfig configures where to serve the IDE from.128type BlobServerConfig struct {129Scheme string `json:"scheme"`130Host string `json:"host"`131PathPrefix string `json:"pathPrefix"`132}133134// Validate validates the configuration to catch issues during startup and not at runtime.135func (c *BlobServerConfig) Validate() error {136if c == nil {137return xerrors.Errorf("BlobServer not configured")138}139140err := validation.ValidateStruct(c,141validation.Field(&c.Scheme, validation.Required, validation.In("http", "https")),142validation.Field(&c.Host, validation.Required),143)144if err != nil {145return xerrors.Errorf("invalid blobserver config: %w", err)146}147return nil148}149150// TransportConfig configures the way how ws-proxy connects to it's backend services.151type TransportConfig struct {152ConnectTimeout util.Duration `json:"connectTimeout"`153IdleConnTimeout util.Duration `json:"idleConnTimeout"`154MaxIdleConns int `json:"maxIdleConns"`155MaxIdleConnsPerHost int `json:"maxIdleConnsPerHost"`156}157158// Validate validates the configuration to catch issues during startup and not at runtime.159func (c *TransportConfig) Validate() error {160if c == nil {161return xerrors.Errorf("TransportConfig not configured")162}163164return validation.ValidateStruct(c,165validation.Field(&c.ConnectTimeout, validation.Required),166validation.Field(&c.IdleConnTimeout, validation.Required),167validation.Field(&c.MaxIdleConns, validation.Min(0)),168validation.Field(&c.MaxIdleConnsPerHost, validation.Required, validation.Min(1)),169)170}171172// BuiltinPagesConfig configures pages served directly by ws-proxy.173type BuiltinPagesConfig struct {174Location string `json:"location"`175}176177// Validate validates the configuration to catch issues during startup and not at runtime.178func (c *BuiltinPagesConfig) Validate() error {179if c == nil {180return xerrors.Errorf("BuiltinPagesConfig not configured")181}182183return validation.ValidateStruct(c,184validation.Field(&c.Location,185validation.Required,186validation.By(validateFileExists("")),187validation.By(validateFileExists(builtinPagePortNotFound)),188),189)190}191192func validateFileExists(addition string) validation.RuleFunc {193tpRoot := os.Getenv("TELEPRESENCE_ROOT")194195return func(value interface{}) error {196pth, ok := value.(string)197if !ok {198return xerrors.Errorf("validateFileExists: value must be a string")199}200201fn := filepath.Join(pth, addition)202if tpRoot != "" {203fn = filepath.Join(tpRoot, fn)204}205206_, err := os.Stat(fn)207if err != nil {208return err209}210211return nil212}213}214215216