Skip to content

Commit 1fab3d4

Browse files
author
Simon Emms
committed
[installer]: add DropImageRepo functionality to RepoName
This moves the ImageName and RepoName functions to the RenderContext struct.
1 parent 6f7798c commit 1fab3d4

File tree

31 files changed

+220
-141
lines changed

31 files changed

+220
-141
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"
@@ -248,7 +247,7 @@ func DatabaseEnv(cfg *config.Config) (res []corev1.EnvVar) {
248247
func DatabaseWaiterContainer(ctx *RenderContext) *corev1.Container {
249248
return &corev1.Container{
250249
Name: "database-waiter",
251-
Image: ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
250+
Image: ctx.ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
252251
Args: []string{
253252
"-v",
254253
"database",
@@ -266,7 +265,7 @@ func DatabaseWaiterContainer(ctx *RenderContext) *corev1.Container {
266265
func MessageBusWaiterContainer(ctx *RenderContext) *corev1.Container {
267266
return &corev1.Container{
268267
Name: "msgbus-waiter",
269-
Image: ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
268+
Image: ctx.ImageName(ctx.Config.Repository, "service-waiter", ctx.VersionManifest.Components.ServiceWaiter.Version),
270269
Args: []string{
271270
"-v",
272271
"messagebus",
@@ -284,7 +283,7 @@ func MessageBusWaiterContainer(ctx *RenderContext) *corev1.Container {
284283
func KubeRBACProxyContainer(ctx *RenderContext) *corev1.Container {
285284
return &corev1.Container{
286285
Name: "kube-rbac-proxy",
287-
Image: ImageName(ThirdPartyContainerRepo(ctx.Config.Repository, KubeRBACProxyRepo), KubeRBACProxyImage, KubeRBACProxyTag),
286+
Image: ctx.ImageName(ThirdPartyContainerRepo(ctx.Config.Repository, KubeRBACProxyRepo), KubeRBACProxyImage, KubeRBACProxyTag),
288287
Args: []string{
289288
"--v=5",
290289
"--logtostderr",
@@ -339,33 +338,6 @@ func Affinity(orLabels ...string) *corev1.Affinity {
339338
}
340339
}
341340

342-
func RepoName(repo, name string) string {
343-
var ref string
344-
if repo == "" {
345-
ref = name
346-
} else {
347-
ref = fmt.Sprintf("%s/%s", strings.TrimSuffix(repo, "/"), name)
348-
}
349-
pref, err := reference.ParseNormalizedNamed(ref)
350-
if err != nil {
351-
panic(fmt.Sprintf("cannot parse image repo %s: %v", ref, err))
352-
}
353-
return pref.String()
354-
}
355-
356-
func ImageName(repo, name, tag string) string {
357-
ref := fmt.Sprintf("%s:%s", RepoName(repo, name), tag)
358-
pref, err := reference.ParseNamed(ref)
359-
if err != nil {
360-
panic(fmt.Sprintf("cannot parse image ref %s: %v", ref, err))
361-
}
362-
if _, ok := pref.(reference.Tagged); !ok {
363-
panic(fmt.Sprintf("image ref %s has no tag: %v", ref, err))
364-
}
365-
366-
return ref
367-
}
368-
369341
// ObjectHash marshals the objects to YAML and produces a sha256 hash of the output.
370342
// This function is useful for restarting pods when the config changes.
371343
// 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: 42 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,43 @@ 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+
if r.Config.Repository == GitpodContainerRegistry {
107+
panic(fmt.Errorf("cannot remove image repo whilst using the default repository"))
108+
}
109+
110+
segs := strings.Split(reference.Path(pref), "/")
111+
return fmt.Sprintf("%s/%s", r.Config.Repository, segs[len(segs)-1])
112+
}
113+
114+
return pref.String()
115+
}
116+
117+
func (r *RenderContext) ImageName(repo, name, tag string) string {
118+
ref := fmt.Sprintf("%s:%s", r.RepoName(repo, name), tag)
119+
pref, err := reference.ParseNamed(ref)
120+
if err != nil {
121+
panic(fmt.Sprintf("cannot parse image ref %s: %v", ref, err))
122+
}
123+
if _, ok := pref.(reference.Tagged); !ok {
124+
panic(fmt.Sprintf("image ref %s has no tag: %v", ref, err))
125+
}
126+
127+
return ref
128+
}
129+
88130
// generateValues generates the random values used throughout the context
89131
// todo(sje): find a way of persisting these values for updates
90132
func (r *RenderContext) generateValues() error {

install/installer/pkg/common/render_test.go

Lines changed: 127 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,126 @@ 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+
{
64+
Repo: "some-repo.com",
65+
Name: "some-image",
66+
Expectation: Expectation{
67+
Panics: true,
68+
},
69+
CfgRepo: GitpodContainerRegistry,
70+
DropImageRepo: pointer.Bool(true),
71+
},
72+
// Drop repo, no namespace
73+
{
74+
Name: "gitpod-io/workspace-full",
75+
Expectation: Expectation{
76+
Result: "some.registry.com/workspace-full",
77+
},
78+
CfgRepo: "some.registry.com",
79+
DropImageRepo: pointer.Bool(true),
80+
},
81+
{
82+
Repo: "some-repo.com",
83+
Name: "some-image",
84+
Expectation: Expectation{
85+
Result: "some.registry.com/some-image",
86+
},
87+
CfgRepo: "some.registry.com",
88+
DropImageRepo: pointer.Bool(true),
89+
},
90+
{
91+
Repo: "some-repo",
92+
Name: "not@avalid#image-name",
93+
Expectation: Expectation{
94+
Panics: true,
95+
},
96+
CfgRepo: "some.registry.com",
97+
DropImageRepo: pointer.Bool(true),
98+
},
99+
// Drop repo, namespace
100+
{
101+
Name: "gitpod-io/workspace-full",
102+
Expectation: Expectation{
103+
Result: "some.registry.com/gitpod/workspace-full",
104+
},
105+
CfgRepo: "some.registry.com/gitpod",
106+
DropImageRepo: pointer.Bool(true),
107+
},
108+
{
109+
Repo: "some-repo.com",
110+
Name: "some-image",
111+
Expectation: Expectation{
112+
Result: "some.registry.com/gitpod/some-image",
113+
},
114+
CfgRepo: "some.registry.com/gitpod",
115+
DropImageRepo: pointer.Bool(true),
116+
},
117+
{
118+
Repo: "some-repo",
119+
Name: "not@avalid#image-name",
120+
Expectation: Expectation{
121+
Panics: true,
122+
},
123+
CfgRepo: "some.registry.com/gitpod",
124+
DropImageRepo: pointer.Bool(true),
125+
},
126+
}
127+
128+
for _, test := range tests {
129+
t.Run(test.Repo+"/"+test.Name, func(t *testing.T) {
130+
var act Expectation
131+
func() {
132+
defer func() {
133+
if recover() != nil {
134+
act.Panics = true
135+
}
136+
}()
137+
138+
ctx, err := NewRenderContext(config.Config{
139+
DropImageRepo: test.DropImageRepo,
140+
Repository: test.CfgRepo,
141+
}, versions.Manifest{}, "test_namespace")
142+
require.NoError(t, err)
143+
144+
act.Result = ctx.RepoName(test.Repo, test.Name)
145+
}()
146+
147+
if diff := cmp.Diff(test.Expectation, act); diff != "" {
148+
t.Errorf("RepoName() mismatch (-want +got):\n%s", diff)
149+
}
150+
})
151+
}
152+
}

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",

0 commit comments

Comments
 (0)