Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/install/installer/pkg/components/ide-service/ide_config_configmap.go
2501 views
1
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package ide_service
6
7
import (
8
"bytes"
9
_ "embed"
10
"encoding/json"
11
"fmt"
12
"html/template"
13
14
"github.com/gitpod-io/gitpod/installer/pkg/common"
15
"github.com/gitpod-io/gitpod/installer/pkg/components/workspace/ide"
16
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
17
18
ide_config "github.com/gitpod-io/gitpod/ide-service-api/config"
19
20
corev1 "k8s.io/api/core/v1"
21
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22
"k8s.io/apimachinery/pkg/runtime"
23
)
24
25
//go:embed ide-configmap.json
26
var ideConfigFile string
27
28
func GenerateIDEConfigmap(ctx *common.RenderContext) (*ide_config.IDEConfig, error) {
29
resolveLatestImage := func(name string, tag string, bundledLatest versions.Versioned) string {
30
resolveLatest := true
31
if ctx.Config.Components != nil && ctx.Config.Components.IDE != nil && ctx.Config.Components.IDE.ResolveLatest != nil {
32
resolveLatest = *ctx.Config.Components.IDE.ResolveLatest
33
}
34
if resolveLatest {
35
return ctx.ImageName(ctx.Config.Repository, name, tag)
36
}
37
return ctx.ImageName(ctx.Config.Repository, name, bundledLatest.Version)
38
}
39
40
type JBImages struct {
41
IntelliJ string
42
GoLand string
43
PyCharm string
44
PhpStorm string
45
RubyMine string
46
WebStorm string
47
Rider string
48
CLion string
49
RustRover string
50
}
51
52
type ConfigTemplate struct {
53
Repository string
54
IdeLogoBase string
55
56
ResolvedCodeBrowserImageLatest string
57
CodeHelperImage string
58
CodeWebExtensionImage string
59
60
JetBrainsPluginImage string
61
JetBrainsPluginLatestImage string
62
JetBrainsPluginRiderImage string
63
JetBrainsPluginLatestRiderImage string
64
JetBrainsLauncherImage string
65
ResolvedJBImageLatest JBImages
66
67
WorkspaceVersions versions.Components
68
}
69
70
configTmpl := ConfigTemplate{
71
Repository: ctx.Config.Repository,
72
IdeLogoBase: fmt.Sprintf("https://ide.%s/image/ide-logo", ctx.Config.Domain),
73
74
ResolvedCodeBrowserImageLatest: resolveLatestImage(ide.CodeIDEImage, "nightly", ctx.VersionManifest.Components.Workspace.CodeImage),
75
CodeHelperImage: ctx.ImageName(ctx.Config.Repository, ide.CodeHelperIDEImage, ctx.VersionManifest.Components.Workspace.CodeHelperImage.Version),
76
CodeWebExtensionImage: ctx.ImageName(ctx.Config.Repository, ide.CodeWebExtensionImage, ctx.VersionManifest.Components.Workspace.CodeWebExtensionImage.Version),
77
78
JetBrainsPluginImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginImage.Version),
79
JetBrainsPluginLatestImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginLatestImage.Version),
80
JetBrainsPluginRiderImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginRiderImage.Version),
81
JetBrainsPluginLatestRiderImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsBackendPluginImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsBackendPluginLatestRiderImage.Version),
82
JetBrainsLauncherImage: ctx.ImageName(ctx.Config.Repository, ide.JetBrainsLauncherImage, ctx.VersionManifest.Components.Workspace.DesktopIdeImages.JetBrainsLauncherImage.Version),
83
ResolvedJBImageLatest: JBImages{
84
IntelliJ: resolveLatestImage(ide.IntelliJDesktopIDEImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.IntelliJLatestImage),
85
GoLand: resolveLatestImage(ide.GoLandDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.GoLandLatestImage),
86
PyCharm: resolveLatestImage(ide.PyCharmDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PyCharmLatestImage),
87
PhpStorm: resolveLatestImage(ide.PhpStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.PhpStormLatestImage),
88
RubyMine: resolveLatestImage(ide.RubyMineDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RubyMineLatestImage),
89
WebStorm: resolveLatestImage(ide.WebStormDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.WebStormLatestImage),
90
Rider: resolveLatestImage(ide.RiderDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RiderLatestImage),
91
CLion: resolveLatestImage(ide.CLionDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.CLionLatestImage),
92
RustRover: resolveLatestImage(ide.RustRoverDesktopIdeImage, "latest", ctx.VersionManifest.Components.Workspace.DesktopIdeImages.RustRoverLatestImage),
93
},
94
95
WorkspaceVersions: ctx.VersionManifest.Components,
96
}
97
98
tmpl, err := template.New("configmap").Parse(ideConfigFile)
99
if err != nil {
100
return nil, fmt.Errorf("failed to parse ide-config config: %w", err)
101
}
102
103
result := &bytes.Buffer{}
104
err = tmpl.Execute(result, configTmpl)
105
if err != nil {
106
return nil, fmt.Errorf("failed to execute ide-config config: %w", err)
107
}
108
109
idecfg := ide_config.IDEConfig{}
110
err = json.Unmarshal(result.Bytes(), &idecfg)
111
if err != nil {
112
return nil, fmt.Errorf("failed to unmarshal ide-config config: %w", err)
113
}
114
115
if idecfg.IdeOptions.Options[idecfg.IdeOptions.DefaultIde].Type != ide_config.IDETypeBrowser {
116
return nil, fmt.Errorf("editor '%s' does not point to a browser IDE option", idecfg.IdeOptions.DefaultIde)
117
}
118
119
if idecfg.IdeOptions.Options[idecfg.IdeOptions.DefaultDesktopIde].Type != ide_config.IDETypeDesktop {
120
return nil, fmt.Errorf("default desktop IDE '%s' does not point to a desktop IDE option", idecfg.IdeOptions.DefaultIde)
121
}
122
return &idecfg, nil
123
}
124
125
func ideConfigConfigmap(ctx *common.RenderContext) ([]runtime.Object, error) {
126
idecfg, err := GenerateIDEConfigmap(ctx)
127
if err != nil {
128
return nil, fmt.Errorf("failed to generate ide-config config: %w", err)
129
}
130
fc, err := common.ToJSONString(idecfg)
131
if err != nil {
132
return nil, fmt.Errorf("failed to marshal ide-config config: %w", err)
133
}
134
135
return []runtime.Object{
136
&corev1.ConfigMap{
137
TypeMeta: common.TypeMetaConfigmap,
138
ObjectMeta: metav1.ObjectMeta{
139
Name: "ide-config",
140
Namespace: ctx.Namespace,
141
Labels: common.CustomizeLabel(ctx, Component, common.TypeMetaConfigmap),
142
Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaConfigmap),
143
},
144
Data: map[string]string{
145
"config.json": string(fc),
146
},
147
},
148
}, nil
149
}
150
151