Skip to content

Commit 948ae51

Browse files
Simon Emmsroboquat
Simon Emms
authored andcommitted
[installer]: add DropImageRepo functionality to RepoName
This moves the ImageName and RepoName functions to the RenderContext struct.
1 parent aa5b624 commit 948ae51

File tree

36 files changed

+223
-149
lines changed

36 files changed

+223
-149
lines changed

install/installer/pkg/common/ca.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func InternalCAContainer(ctx *RenderContext, mod ...func(*corev1.Container)) *co
3939
res := &corev1.Container{
4040
Name: "update-ca-certificates",
4141
// It's not possible to use images based on alpine due to errors running update-ca-certificates
42-
Image: ImageName(ctx.Config.Repository, "ca-updater", ctx.VersionManifest.Components.CAUpdater.Version),
42+
Image: ctx.ImageName(ctx.Config.Repository, "ca-updater", ctx.VersionManifest.Components.CAUpdater.Version),
4343
ImagePullPolicy: corev1.PullIfNotPresent,
4444
Command: []string{
4545
"bash", "-c",

install/installer/pkg/common/common.go

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
config "github.com/gitpod-io/gitpod/installer/pkg/config/v1"
1717
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
1818

19-
"github.com/docker/distribution/reference"
2019
appsv1 "k8s.io/api/apps/v1"
2120
corev1 "k8s.io/api/core/v1"
2221
networkingv1 "k8s.io/api/networking/v1"
@@ -247,7 +246,7 @@ func DatabaseEnv(cfg *config.Config) (res []corev1.EnvVar) {
247246
func DatabaseWaiterContainer(ctx *RenderContext) *corev1.Container {
248247
return &corev1.Container{
249248
Name: "database-waiter",
250-
Image: ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
249+
Image: ctx.ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
251250
Args: []string{
252251
"-v",
253252
"database",
@@ -265,7 +264,7 @@ func DatabaseWaiterContainer(ctx *RenderContext) *corev1.Container {
265264
func MessageBusWaiterContainer(ctx *RenderContext) *corev1.Container {
266265
return &corev1.Container{
267266
Name: "msgbus-waiter",
268-
Image: ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
267+
Image: ctx.ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
269268
Args: []string{
270269
"-v",
271270
"messagebus",
@@ -283,7 +282,7 @@ func MessageBusWaiterContainer(ctx *RenderContext) *corev1.Container {
283282
func KubeRBACProxyContainer(ctx *RenderContext) *corev1.Container {
284283
return &corev1.Container{
285284
Name: "kube-rbac-proxy",
286-
Image: ImageName(ThirdPartyContainerRepo(ctx.Config.Repository, KubeRBACProxyRepo), KubeRBACProxyImage, KubeRBACProxyTag),
285+
Image: ctx.ImageName(ThirdPartyContainerRepo(ctx.Config.Repository, KubeRBACProxyRepo), KubeRBACProxyImage, KubeRBACProxyTag),
287286
Args: []string{
288287
"--v=5",
289288
"--logtostderr",
@@ -338,33 +337,6 @@ func NodeAffinity(orLabels ...string) *corev1.Affinity {
338337
}
339338
}
340339

341-
func RepoName(repo, name string) string {
342-
var ref string
343-
if repo == "" {
344-
ref = name
345-
} else {
346-
ref = fmt.Sprintf("%s/%s", strings.TrimSuffix(repo, "/"), name)
347-
}
348-
pref, err := reference.ParseNormalizedNamed(ref)
349-
if err != nil {
350-
panic(fmt.Sprintf("cannot parse image repo %s: %v", ref, err))
351-
}
352-
return pref.String()
353-
}
354-
355-
func ImageName(repo, name, tag string) string {
356-
ref := fmt.Sprintf("%s:%s", RepoName(repo, name), tag)
357-
pref, err := reference.ParseNamed(ref)
358-
if err != nil {
359-
panic(fmt.Sprintf("cannot parse image ref %s: %v", ref, err))
360-
}
361-
if _, ok := pref.(reference.Tagged); !ok {
362-
panic(fmt.Sprintf("image ref %s has no tag: %v", ref, err))
363-
}
364-
365-
return ref
366-
}
367-
368340
// ObjectHash marshals the objects to YAML and produces a sha256 hash of the output.
369341
// This function is useful for restarting pods when the config changes.
370342
// Takes an error as argument to make calling it more conventient. If that error is not nil,

install/installer/pkg/common/common_test.go

Lines changed: 0 additions & 63 deletions
This file was deleted.

install/installer/pkg/common/render.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@
55
package common
66

77
import (
8+
"fmt"
9+
"strings"
10+
11+
"github.com/docker/distribution/reference"
812
"github.com/gitpod-io/gitpod/installer/pkg/config/v1"
913
"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"
1014
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
1115

1216
"helm.sh/helm/v3/pkg/cli/values"
1317
"k8s.io/apimachinery/pkg/runtime"
18+
"k8s.io/utils/pointer"
1419
)
1520

1621
// Renderable turns the config into a set of Kubernetes runtime objects
@@ -85,6 +90,39 @@ func (r *RenderContext) WithExperimental(mod func(ucfg *experimental.Config) err
8590
return mod(r.experimentalConfig)
8691
}
8792

93+
func (r *RenderContext) RepoName(repo, name string) string {
94+
var ref string
95+
if repo == "" {
96+
ref = name
97+
} else {
98+
ref = fmt.Sprintf("%s/%s", strings.TrimSuffix(repo, "/"), name)
99+
}
100+
pref, err := reference.ParseNormalizedNamed(ref)
101+
if err != nil {
102+
panic(fmt.Sprintf("cannot parse image repo %s: %v", ref, err))
103+
}
104+
105+
if pointer.BoolDeref(r.Config.DropImageRepo, false) {
106+
segs := strings.Split(reference.Path(pref), "/")
107+
return fmt.Sprintf("%s/%s", r.Config.Repository, segs[len(segs)-1])
108+
}
109+
110+
return pref.String()
111+
}
112+
113+
func (r *RenderContext) ImageName(repo, name, tag string) string {
114+
ref := fmt.Sprintf("%s:%s", r.RepoName(repo, name), tag)
115+
pref, err := reference.ParseNamed(ref)
116+
if err != nil {
117+
panic(fmt.Sprintf("cannot parse image ref %s: %v", ref, err))
118+
}
119+
if _, ok := pref.(reference.Tagged); !ok {
120+
panic(fmt.Sprintf("image ref %s has no tag: %v", ref, err))
121+
}
122+
123+
return ref
124+
}
125+
88126
// generateValues generates the random values used throughout the context
89127
// todo(sje): find a way of persisting these values for updates
90128
func (r *RenderContext) generateValues() error {

install/installer/pkg/common/render_test.go

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
package common
55

66
import (
7+
"testing"
8+
79
"github.com/gitpod-io/gitpod/installer/pkg/config/v1"
810
"github.com/gitpod-io/gitpod/installer/pkg/config/versions"
11+
"github.com/google/go-cmp/cmp"
912
"github.com/stretchr/testify/require"
1013
"k8s.io/apimachinery/pkg/runtime"
11-
"testing"
14+
"k8s.io/utils/pointer"
1215
)
1316

1417
func TestCompositeRenderFunc_NilObjectsNilError(t *testing.T) {
@@ -24,3 +27,117 @@ func TestCompositeRenderFunc_NilObjectsNilError(t *testing.T) {
2427
require.NoError(t, err)
2528
require.Len(t, objects, 0)
2629
}
30+
31+
func TestRepoName(t *testing.T) {
32+
type Expectation struct {
33+
Result string
34+
Panics bool
35+
}
36+
tests := []struct {
37+
Repo string
38+
Name string
39+
Expectation Expectation
40+
CfgRepo string
41+
DropImageRepo *bool
42+
}{
43+
{
44+
Name: "gitpod-io/workspace-full",
45+
Expectation: Expectation{
46+
Result: "docker.io/gitpod-io/workspace-full",
47+
},
48+
},
49+
{
50+
Repo: "some-repo.com",
51+
Name: "some-image",
52+
Expectation: Expectation{
53+
Result: "some-repo.com/some-image",
54+
},
55+
},
56+
{
57+
Repo: "some-repo",
58+
Name: "not@avalid#image-name",
59+
Expectation: Expectation{
60+
Panics: true,
61+
},
62+
},
63+
// Drop repo, no namespace
64+
{
65+
Name: "gitpod-io/workspace-full",
66+
Expectation: Expectation{
67+
Result: "some.registry.com/workspace-full",
68+
},
69+
CfgRepo: "some.registry.com",
70+
DropImageRepo: pointer.Bool(true),
71+
},
72+
{
73+
Repo: "some-repo.com",
74+
Name: "some-image",
75+
Expectation: Expectation{
76+
Result: "some.registry.com/some-image",
77+
},
78+
CfgRepo: "some.registry.com",
79+
DropImageRepo: pointer.Bool(true),
80+
},
81+
{
82+
Repo: "some-repo",
83+
Name: "not@avalid#image-name",
84+
Expectation: Expectation{
85+
Panics: true,
86+
},
87+
CfgRepo: "some.registry.com",
88+
DropImageRepo: pointer.Bool(true),
89+
},
90+
// Drop repo, namespace
91+
{
92+
Name: "gitpod-io/workspace-full",
93+
Expectation: Expectation{
94+
Result: "some.registry.com/gitpod/workspace-full",
95+
},
96+
CfgRepo: "some.registry.com/gitpod",
97+
DropImageRepo: pointer.Bool(true),
98+
},
99+
{
100+
Repo: "some-repo.com",
101+
Name: "some-image",
102+
Expectation: Expectation{
103+
Result: "some.registry.com/gitpod/some-image",
104+
},
105+
CfgRepo: "some.registry.com/gitpod",
106+
DropImageRepo: pointer.Bool(true),
107+
},
108+
{
109+
Repo: "some-repo",
110+
Name: "not@avalid#image-name",
111+
Expectation: Expectation{
112+
Panics: true,
113+
},
114+
CfgRepo: "some.registry.com/gitpod",
115+
DropImageRepo: pointer.Bool(true),
116+
},
117+
}
118+
119+
for _, test := range tests {
120+
t.Run(test.Repo+"/"+test.Name, func(t *testing.T) {
121+
var act Expectation
122+
func() {
123+
defer func() {
124+
if recover() != nil {
125+
act.Panics = true
126+
}
127+
}()
128+
129+
ctx, err := NewRenderContext(config.Config{
130+
DropImageRepo: test.DropImageRepo,
131+
Repository: test.CfgRepo,
132+
}, versions.Manifest{}, "test_namespace")
133+
require.NoError(t, err)
134+
135+
act.Result = ctx.RepoName(test.Repo, test.Name)
136+
}()
137+
138+
if diff := cmp.Diff(test.Expectation, act); diff != "" {
139+
t.Errorf("RepoName() mismatch (-want +got):\n%s", diff)
140+
}
141+
})
142+
}
143+
}

install/installer/pkg/components/agent-smith/daemonset.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func daemonset(ctx *common.RenderContext) ([]runtime.Object, error) {
5151
TerminationGracePeriodSeconds: pointer.Int64(30),
5252
Containers: []corev1.Container{{
5353
Name: Component,
54-
Image: common.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.AgentSmith.Version),
54+
Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.AgentSmith.Version),
5555
ImagePullPolicy: corev1.PullIfNotPresent,
5656
Args: []string{"run", "--config", "/config/config.json"},
5757
Resources: corev1.ResourceRequirements{

install/installer/pkg/components/blobserve/configmap.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
3535
Port: ContainerPort,
3636
Timeout: util.Duration(time.Second * 5),
3737
Repos: map[string]blobserve.Repo{
38-
common.RepoName(ctx.Config.Repository, ide.CodeIDEImage): {
38+
ctx.RepoName(ctx.Config.Repository, ide.CodeIDEImage): {
3939
PrePull: []string{},
4040
Workdir: "/ide",
4141
Replacements: []blobserve.StringReplacement{{
@@ -88,7 +88,7 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) {
8888
Replacement: "${supervisor}",
8989
}},
9090
},
91-
common.RepoName(ctx.Config.Repository, workspace.SupervisorImage): {
91+
ctx.RepoName(ctx.Config.Repository, workspace.SupervisorImage): {
9292
PrePull: []string{},
9393
Workdir: "/.supervisor/frontend",
9494
},

install/installer/pkg/components/blobserve/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
9494
Containers: []corev1.Container{{
9595
Name: Component,
9696
Args: []string{"run", "/mnt/config/config.json"},
97-
Image: common.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Blobserve.Version),
97+
Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Blobserve.Version),
9898
ImagePullPolicy: corev1.PullIfNotPresent,
9999
Ports: []corev1.ContainerPort{{
100100
Name: ServicePortName,

install/installer/pkg/components/content-service/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
4141
}},
4242
Containers: []corev1.Container{{
4343
Name: Component,
44-
Image: common.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.ContentService.Version),
44+
Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.ContentService.Version),
4545
ImagePullPolicy: corev1.PullIfNotPresent,
4646
Args: []string{
4747
"run",

install/installer/pkg/components/dashboard/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
4848
TerminationGracePeriodSeconds: pointer.Int64(30),
4949
Containers: []corev1.Container{{
5050
Name: Component,
51-
Image: common.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Dashboard.Version),
51+
Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Dashboard.Version),
5252
ImagePullPolicy: corev1.PullIfNotPresent,
5353
Resources: corev1.ResourceRequirements{
5454
Requests: corev1.ResourceList{

install/installer/pkg/components/database/cloudsql/deployment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {
6565
Privileged: pointer.Bool(false),
6666
RunAsNonRoot: pointer.Bool(false),
6767
},
68-
Image: common.ImageName(ImageRepo, ImageName, ImageVersion),
68+
Image: ctx.ImageName(ImageRepo, ImageName, ImageVersion),
6969
Command: []string{
7070
"/cloud_sql_proxy",
7171
"-dir=/cloudsql",

0 commit comments

Comments
 (0)