Skip to content

Commit 8916e77

Browse files
authored
fix: fix the registry functionality (#542)
Signed-off-by: Caleb Boylan <[email protected]>
1 parent 67b4b08 commit 8916e77

File tree

5 files changed

+90
-26
lines changed

5 files changed

+90
-26
lines changed

pkg/kind/cluster.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,20 @@ type IProvider interface {
5555

5656
func (c *Cluster) getConfig() ([]byte, error) {
5757
rawConfigTempl, err := loadConfig(c.kindConfigPath, c.httpClient)
58+
if err != nil {
59+
return nil, fmt.Errorf("loading config template: %w", err)
60+
}
5861

5962
portMappingPairs := parsePortMappings(c.extraPortsMapping)
6063

6164
registryConfig := findRegistryConfig(c.registryConfig)
6265

66+
registryCertsDir, err := renderRegistryCertsDir(c.cfg)
67+
68+
if err != nil {
69+
return nil, fmt.Errorf("rendering insecure registry config: %w", err)
70+
}
71+
6372
if len(c.registryConfig) > 0 && registryConfig == "" {
6473
return nil, errors.New("--registry-config flag used but no registry config was found")
6574
}
@@ -70,6 +79,7 @@ func (c *Cluster) getConfig() ([]byte, error) {
7079
KubernetesVersion: c.kubeVersion,
7180
ExtraPortsMapping: portMappingPairs,
7281
RegistryConfig: registryConfig,
82+
RegistryCertsDir: registryCertsDir,
7383
}); err != nil {
7484
return nil, err
7585
}

pkg/kind/cluster_test.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ import (
1212
"github.com/go-logr/logr"
1313
"github.com/stretchr/testify/assert"
1414
"github.com/stretchr/testify/mock"
15+
"regexp"
1516
"sigs.k8s.io/kind/pkg/cluster/nodes"
1617
"sigs.k8s.io/kind/pkg/exec"
1718
)
1819

20+
var re = regexp.MustCompile(`(.*?)hostPath: /tmp/idpbuilder-registry-certs.d-.*(.*?)`)
21+
1922
func TestGetConfig(t *testing.T) {
2023

2124
type tc struct {
@@ -47,12 +50,12 @@ nodes:
4750
- containerPort: 32222
4851
hostPort: 32222
4952
protocol: TCP
53+
extraMounts:
54+
- containerPath: /etc/containerd/certs.d
5055
containerdConfigPatches:
5156
- |-
52-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gitea.cnoe.localtest.me:8443"]
53-
endpoint = ["https://gitea.cnoe.localtest.me"]
54-
[plugins."io.containerd.grpc.v1.cri".registry.configs."gitea.cnoe.localtest.me".tls]
55-
insecure_skip_verify = true`,
57+
[plugins."io.containerd.grpc.v1.cri".registry]
58+
config_path = "/etc/containerd/certs.d"`,
5659
},
5760
{
5861
host: "cnoe.localtest.me",
@@ -75,14 +78,13 @@ nodes:
7578
hostPort: 32222
7679
protocol: TCP
7780
extraMounts:
81+
- containerPath: /etc/containerd/certs.d
7882
- containerPath: /var/lib/kubelet/config.json
7983
hostPath: testdata/empty.json
8084
containerdConfigPatches:
8185
- |-
82-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."cnoe.localtest.me:8443"]
83-
endpoint = ["https://cnoe.localtest.me"]
84-
[plugins."io.containerd.grpc.v1.cri".registry.configs."cnoe.localtest.me".tls]
85-
insecure_skip_verify = true`,
86+
[plugins."io.containerd.grpc.v1.cri".registry]
87+
config_path = "/etc/containerd/certs.d"`,
8688
},
8789
}
8890

@@ -97,7 +99,9 @@ containerdConfigPatches:
9799

98100
cfg, err := cluster.getConfig()
99101
assert.NoError(t, err)
100-
assert.YAMLEq(t, c.expectConfig, string(cfg))
102+
expectStripped := re.ReplaceAllString(c.expectConfig, `$1$2`)
103+
cfgStripped := re.ReplaceAllString(string(cfg), `$1$2`)
104+
assert.YAMLEq(t, expectStripped, cfgStripped)
101105
}
102106
}
103107

@@ -134,14 +138,16 @@ nodes:
134138
- containerPort: 32222
135139
hostPort: 22
136140
protocol: TCP
141+
extraMounts:
142+
- containerPath: /etc/containerd/certs.d
137143
containerdConfigPatches:
138144
- |-
139-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gitea.cnoe.localtest.me:8443"]
140-
endpoint = ["https://gitea.cnoe.localtest.me"]
141-
[plugins."io.containerd.grpc.v1.cri".registry.configs."gitea.cnoe.localtest.me".tls]
142-
insecure_skip_verify = true`
145+
[plugins."io.containerd.grpc.v1.cri".registry]
146+
config_path = "/etc/containerd/certs.d"`
143147

144-
assert.YAMLEq(t, expectConfig, string(cfg))
148+
expectStripped := re.ReplaceAllString(expectConfig, `$1$2`)
149+
cfgStripped := re.ReplaceAllString(string(cfg), `$1$2`)
150+
assert.YAMLEq(t, expectStripped, cfgStripped)
145151
}
146152

147153
func TestGetConfigCustom(t *testing.T) {

pkg/kind/config.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import (
66
"io"
77
"io/fs"
88
"os"
9+
"path/filepath"
910
"strings"
1011

1112
"github.com/cnoe-io/idpbuilder/api/v1alpha1"
13+
"github.com/cnoe-io/idpbuilder/pkg/util/files"
1214
)
1315

1416
type PortMapping struct {
@@ -21,6 +23,7 @@ type TemplateConfig struct {
2123
KubernetesVersion string
2224
ExtraPortsMapping []PortMapping
2325
RegistryConfig string
26+
RegistryCertsDir string
2427
}
2528

2629
//go:embed resources/* testdata/custom-kind.yaml.tmpl
@@ -83,3 +86,42 @@ func findRegistryConfig(registryConfigPaths []string) string {
8386
}
8487
return ""
8588
}
89+
90+
func renderRegistryCertsDir(cfg v1alpha1.BuildCustomizationSpec) (string, error) {
91+
// Render out the template
92+
rawConfigTempl, err := fs.ReadFile(configFS, "resources/hosts.toml.tmpl")
93+
if err != nil {
94+
return "", fmt.Errorf("reading insecure registry config %w", err)
95+
}
96+
97+
var retBuff []byte
98+
if retBuff, err = files.ApplyTemplate(rawConfigTempl, cfg); err != nil {
99+
return "", fmt.Errorf("templating insecure registry config %w", err)
100+
}
101+
102+
// Generate the directory structure and write the file to hosts.toml
103+
dir, err := os.MkdirTemp("", "idpbuilder-registry-certs.d-*")
104+
if err != nil {
105+
return "", fmt.Errorf("creating temp dir %w", err)
106+
}
107+
108+
var hostAndPort string
109+
if cfg.UsePathRouting {
110+
hostAndPort = fmt.Sprintf("%s:%s", cfg.Host, cfg.Port)
111+
} else {
112+
hostAndPort = fmt.Sprintf("gitea.%s:%s", cfg.Host, cfg.Port)
113+
}
114+
hostCertsDir := filepath.Join(dir, hostAndPort)
115+
err = os.Mkdir(hostCertsDir, 0700)
116+
if err != nil {
117+
return "", fmt.Errorf("creating temp dir for host %w", err)
118+
}
119+
hostsFile := filepath.Join(hostCertsDir, "hosts.toml")
120+
121+
err = os.WriteFile(hostsFile, retBuff, 0700)
122+
if err != nil {
123+
return "", fmt.Errorf("writing insecure registry config %w", err)
124+
}
125+
126+
return dir, nil
127+
}

pkg/kind/resources/hosts.toml.tmpl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{{ if .UsePathRouting -}}
2+
server = "https://{{ .Host }}:{{ .Port }}"
3+
4+
[host."https://{{ .Host }}"]
5+
capabilities = ["pull", "resolve"]
6+
skip_verify = true
7+
{{ else -}}
8+
server = "https://gitea.{{ .Host }}:{{ .Port }}"
9+
10+
[host."https://gitea.{{ .Host }}"]
11+
capabilities = ["pull", "resolve"]
12+
skip_verify = true
13+
{{ end -}}

pkg/kind/resources/kind.yaml.tmpl

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,14 @@ nodes:
2020
hostPort: {{ .HostPort }}
2121
protocol: TCP
2222
{{- end }}
23-
{{- if .RegistryConfig }}
2423
extraMounts:
24+
- containerPath: /etc/containerd/certs.d
25+
hostPath: {{ .RegistryCertsDir }}
26+
{{- if .RegistryConfig }}
2527
- containerPath: /var/lib/kubelet/config.json
2628
hostPath: {{ .RegistryConfig }}
2729
{{- end }}
2830
containerdConfigPatches:
2931
- |-
30-
{{ if .UsePathRouting -}}
31-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."{{ .Host }}:{{ .Port }}"]
32-
endpoint = ["https://{{ .Host }}"]
33-
[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .Host }}".tls]
34-
insecure_skip_verify = true
35-
{{- else -}}
36-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gitea.{{ .Host }}:{{ .Port }}"]
37-
endpoint = ["https://gitea.{{ .Host }}"]
38-
[plugins."io.containerd.grpc.v1.cri".registry.configs."gitea.{{ .Host }}".tls]
39-
insecure_skip_verify = true
40-
{{- end -}}
32+
[plugins."io.containerd.grpc.v1.cri".registry]
33+
config_path = "/etc/containerd/certs.d"

0 commit comments

Comments
 (0)