Path: blob/main/install/installer/pkg/components/ide-service/ide_config_configmap.go
2501 views
// Copyright (c) 2021 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 ide_service56import (7"bytes"8_ "embed"9"encoding/json"10"fmt"11"html/template"1213"github.com/gitpod-io/gitpod/installer/pkg/common"14"github.com/gitpod-io/gitpod/installer/pkg/components/workspace/ide"15"github.com/gitpod-io/gitpod/installer/pkg/config/versions"1617ide_config "github.com/gitpod-io/gitpod/ide-service-api/config"1819corev1 "k8s.io/api/core/v1"20metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"21"k8s.io/apimachinery/pkg/runtime"22)2324//go:embed ide-configmap.json25var ideConfigFile string2627func GenerateIDEConfigmap(ctx *common.RenderContext) (*ide_config.IDEConfig, error) {28resolveLatestImage := func(name string, tag string, bundledLatest versions.Versioned) string {29resolveLatest := true30if ctx.Config.Components != nil && ctx.Config.Components.IDE != nil && ctx.Config.Components.IDE.ResolveLatest != nil {31resolveLatest = *ctx.Config.Components.IDE.ResolveLatest32}33if resolveLatest {34return ctx.ImageName(ctx.Config.Repository, name, tag)35}36return ctx.ImageName(ctx.Config.Repository, name, bundledLatest.Version)37}3839type JBImages struct {40IntelliJ string41GoLand string42PyCharm string43PhpStorm string44RubyMine string45WebStorm string46Rider string47CLion string48RustRover string49}5051type ConfigTemplate struct {52Repository string53IdeLogoBase string5455ResolvedCodeBrowserImageLatest string56CodeHelperImage string57CodeWebExtensionImage string5859JetBrainsPluginImage string60JetBrainsPluginLatestImage string61JetBrainsPluginRiderImage string62JetBrainsPluginLatestRiderImage string63JetBrainsLauncherImage string64ResolvedJBImageLatest JBImages6566WorkspaceVersions versions.Components67}6869configTmpl := ConfigTemplate{70Repository: ctx.Config.Repository,71IdeLogoBase: fmt.Sprintf("https://ide.%s/image/ide-logo", ctx.Config.Domain),7273ResolvedCodeBrowserImageLatest: resolveLatestImage(ide.CodeIDEImage, "nightly", ctx.VersionManifest.Components.Workspace.CodeImage),74CodeHelperImage: ctx.ImageName(ctx.Config.Repository, ide.CodeHelperIDEImage, ctx.VersionManifest.Components.Workspace.CodeHelperImage.Version),75CodeWebExtensionImage: ctx.ImageName(ctx.Config.Repository, ide.CodeWebExtensionImage, ctx.VersionManifest.Components.Workspace.CodeWebExtensionImage.Version),7677JetBrainsPluginImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginImage.Version),78JetBrainsPluginLatestImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginLatestImage.Version),79JetBrainsPluginRiderImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginRiderImage.Version),80JetBrainsPluginLatestRiderImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginLatestRiderImage.Version),81JetBrainsLauncherImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsLauncherImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsLauncherImage.Version),82ResolvedJBImageLatest: JBImages{83IntelliJ: resolveLatestImage(ide.IntelliJDesktopIDEImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJLatestImage),84GoLand: resolveLatestImage(ide.GoLandDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandLatestImage),85PyCharm: resolveLatestImage(ide.PyCharmDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmLatestImage),86PhpStorm: resolveLatestImage(ide.PhpStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormLatestImage),87RubyMine: resolveLatestImage(ide.RubyMineDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RubyMineLatestImage),88WebStorm: resolveLatestImage(ide.WebStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.WebStormLatestImage),89Rider: resolveLatestImage(ide.RiderDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RiderLatestImage),90CLion: resolveLatestImage(ide.CLionDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.CLionLatestImage),91RustRover: resolveLatestImage(ide.RustRoverDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RustRoverLatestImage),92},9394WorkspaceVersions: ctx.VersionManifest.Components,95}9697tmpl, err := template.New("configmap").Parse(ideConfigFile)98if err != nil {99return nil, fmt.Errorf("failed to parse ide-config config: %w", err)100}101102result := &bytes.Buffer{}103err = tmpl.Execute(result, configTmpl)104if err != nil {105return nil, fmt.Errorf("failed to execute ide-config config: %w", err)106}107108idecfg := ide_config.IDEConfig{}109err = json.Unmarshal(result.Bytes(), &idecfg)110if err != nil {111return nil, fmt.Errorf("failed to unmarshal ide-config config: %w", err)112}113114if idecfg.IdeOptions.Options[idecfg.IdeOptions.DefaultIde].Type != ide_config.IDETypeBrowser {115return nil, fmt.Errorf("editor '%s' does not point to a browser IDE option", idecfg.IdeOptions.DefaultIde)116}117118if idecfg.IdeOptions.Options[idecfg.IdeOptions.DefaultDesktopIde].Type != ide_config.IDETypeDesktop {119return nil, fmt.Errorf("default desktop IDE '%s' does not point to a desktop IDE option", idecfg.IdeOptions.DefaultIde)120}121return &idecfg, nil122}123124func ideConfigConfigmap(ctx *common.RenderContext) ([]runtime.Object, error) {125idecfg, err := GenerateIDEConfigmap(ctx)126if err != nil {127return nil, fmt.Errorf("failed to generate ide-config config: %w", err)128}129fc, err := common.ToJSONString(idecfg)130if err != nil {131return nil, fmt.Errorf("failed to marshal ide-config config: %w", err)132}133134return []runtime.Object{135&corev1.ConfigMap{136TypeMeta: common.TypeMetaConfigmap,137ObjectMeta: metav1.ObjectMeta{138Name: "ide-config",139Namespace: ctx.Namespace,140Labels: common.CustomizeLabel(ctx, Component, common.TypeMetaConfigmap),141Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaConfigmap),142},143Data: map[string]string{144"config.json": string(fc),145},146},147}, nil148}149150151