2022-12-08 13:05:19 -03:00

101 lines
3.1 KiB
Go

// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package proxy
import (
"fmt"
"github.com/gitpod-io/gitpod/common-go/baseserver"
"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"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
)
var allowedServiceTypes = map[corev1.ServiceType]struct{}{
corev1.ServiceTypeLoadBalancer: {},
corev1.ServiceTypeClusterIP: {},
corev1.ServiceTypeNodePort: {},
corev1.ServiceTypeExternalName: {},
}
func service(ctx *common.RenderContext) ([]runtime.Object, error) {
loadBalancerIP := ""
_ = ctx.WithExperimental(func(cfg *experimental.Config) error {
if cfg.WebApp != nil && cfg.WebApp.ProxyConfig != nil {
if cfg.WebApp.ProxyConfig.StaticIP != "" {
loadBalancerIP = cfg.WebApp.ProxyConfig.StaticIP
}
}
return nil
})
serviceType := corev1.ServiceTypeLoadBalancer
if ctx.Config.Components != nil && ctx.Config.Components.Proxy != nil && ctx.Config.Components.Proxy.Service != nil {
st := ctx.Config.Components.Proxy.Service.ServiceType
if st != nil {
_, allowed := allowedServiceTypes[corev1.ServiceType(*st)]
if allowed {
serviceType = *st
}
}
}
var annotations map[string]string
_ = ctx.WithExperimental(func(cfg *experimental.Config) error {
if cfg.WebApp != nil && cfg.WebApp.ProxyConfig != nil {
annotations = cfg.WebApp.ProxyConfig.ServiceAnnotations
}
return nil
})
ports := []common.ServicePort{
{
Name: ContainerHTTPName,
ContainerPort: ContainerHTTPPort,
ServicePort: ContainerHTTPPort,
},
{
Name: ContainerHTTPSName,
ContainerPort: ContainerHTTPSPort,
ServicePort: ContainerHTTPSPort,
},
{
Name: baseserver.BuiltinMetricsPortName,
ContainerPort: baseserver.BuiltinMetricsPort,
ServicePort: baseserver.BuiltinMetricsPort,
},
}
if ctx.Config.SSHGatewayHostKey != nil {
ports = append(ports, common.ServicePort{
Name: ContainerSSHName,
ContainerPort: ContainerSSHPort,
ServicePort: ContainerSSHPort,
})
}
return common.GenerateService(Component, ports, func(service *corev1.Service) {
service.Spec.Type = serviceType
if serviceType == corev1.ServiceTypeLoadBalancer {
service.Spec.LoadBalancerIP = loadBalancerIP
installationShortNameSuffix := ""
if ctx.Config.Metadata.InstallationShortname != "" && ctx.Config.Metadata.InstallationShortname != configv1.InstallationShortNameOldDefault {
installationShortNameSuffix = "-" + ctx.Config.Metadata.InstallationShortname
}
service.Annotations["external-dns.alpha.kubernetes.io/hostname"] = fmt.Sprintf("%s,*.%s,*.ws%s.%s", ctx.Config.Domain, ctx.Config.Domain, installationShortNameSuffix, ctx.Config.Domain)
service.Annotations["cloud.google.com/neg"] = `{"exposed_ports": {"80":{},"443": {}}}`
}
for k, v := range annotations {
service.Annotations[k] = v
}
})(ctx)
}