Skip to content

Commit 10d459c

Browse files
committed
ci: adds a unit test for the registry preflight check
1 parent 9bb9335 commit 10d459c

File tree

2 files changed

+442
-28
lines changed

2 files changed

+442
-28
lines changed

pkg/webhook/preflight/generic/registry.go

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/regclient/regclient"
1212
"github.com/regclient/regclient/config"
13+
"github.com/regclient/regclient/types/ping"
1314
"github.com/regclient/regclient/types/ref"
1415
corev1 "k8s.io/api/core/v1"
1516
"k8s.io/apimachinery/pkg/types"
@@ -28,43 +29,62 @@ var (
2829
// this regex allows us to strip it so we can verify connectivity for this test.
2930
)
3031

31-
type registyCheck struct {
32-
registryMirror *carenv1.GlobalImageRegistryMirror
33-
imageRegistry *carenv1.ImageRegistry
34-
field string
35-
kclient ctrlclient.Client
36-
cluster *clusterv1.Cluster
32+
type registryCheck struct {
33+
registryMirror *carenv1.GlobalImageRegistryMirror
34+
imageRegistry *carenv1.ImageRegistry
35+
field string
36+
kclient ctrlclient.Client
37+
cluster *clusterv1.Cluster
38+
regClientPingerGetter regClientPingerFactory
3739
}
3840

39-
func (r *registyCheck) Name() string {
41+
func (r *registryCheck) Name() string {
4042
return "RegistryCredentials"
4143
}
4244

43-
func (r *registyCheck) Run(ctx context.Context) preflight.CheckResult {
45+
func (r *registryCheck) Run(ctx context.Context) preflight.CheckResult {
4446
if r.registryMirror != nil {
4547
return r.checkRegistry(
4648
ctx,
47-
mirrorURLValidationRegex.ReplaceAllString(r.registryMirror.URL, ""),
49+
r.registryMirror.URL,
4850
r.registryMirror.Credentials,
51+
r.regClientPingerGetter,
4952
)
5053
}
5154
if r.imageRegistry != nil {
5255
return r.checkRegistry(
5356
ctx,
54-
mirrorURLValidationRegex.ReplaceAllString(r.imageRegistry.URL, ""),
57+
r.imageRegistry.URL,
5558
r.imageRegistry.Credentials,
59+
r.regClientPingerGetter,
5660
)
5761
}
5862
return preflight.CheckResult{
5963
Allowed: true,
6064
}
6165
}
6266

63-
func (r *registyCheck) checkRegistry(
67+
type regClientPinger interface {
68+
Ping(context.Context, ref.Ref) (ping.Result, error)
69+
}
70+
71+
type regClientPingerFactory func(...regclient.Opt) regClientPinger
72+
73+
func defaultRegClientGetter(opts ...regclient.Opt) regClientPinger {
74+
return regclient.New(opts...)
75+
}
76+
77+
func pingFailedReasonString(registryURL string, err error) string {
78+
return fmt.Sprintf("failed to ping registry %s with err: %s", registryURL, err.Error())
79+
}
80+
81+
func (r *registryCheck) checkRegistry(
6482
ctx context.Context,
6583
registryURL string,
6684
credentials *carenv1.RegistryCredentials,
85+
regClientGetter regClientPingerFactory,
6786
) preflight.CheckResult {
87+
registryURL = mirrorURLValidationRegex.ReplaceAllString(registryURL, "")
6888
result := preflight.CheckResult{
6989
Allowed: false,
7090
}
@@ -77,7 +97,7 @@ func (r *registyCheck) checkRegistry(
7797
ctx,
7898
types.NamespacedName{
7999
Namespace: r.cluster.Namespace,
80-
Name: r.registryMirror.Credentials.SecretRef.Name,
100+
Name: credentials.SecretRef.Name,
81101
},
82102
mirrorCredentialsSecret,
83103
)
@@ -110,7 +130,7 @@ func (r *registyCheck) checkRegistry(
110130
result.Error = true
111131
result.Causes = append(result.Causes,
112132
preflight.Cause{
113-
Message: "failed to get username from Registry credentials Secret. secret must have field password.",
133+
Message: "failed to get password from Registry credentials Secret. secret must have field password.",
114134
Field: fmt.Sprintf("%s.credentials.secretRef", registryMirrorVarPath),
115135
},
116136
)
@@ -122,17 +142,17 @@ func (r *registyCheck) checkRegistry(
122142
mirrorHost.RegCert = string(caCert)
123143
}
124144
}
125-
rc := regclient.New(
145+
rc := regClientGetter(
126146
regclient.WithConfigHost(mirrorHost),
127147
regclient.WithUserAgent("regclient/example"),
128148
)
129-
mirrorRef, err := ref.NewHost(mirrorHost.Hostname)
149+
mirrorRef, err := ref.NewHost(registryURL)
130150
if err != nil {
131151
result.Allowed = false
132152
result.Error = true
133153
result.Causes = append(result.Causes,
134154
preflight.Cause{
135-
Message: "failed to create a client to verify registry configuration",
155+
Message: fmt.Sprintf("failed to create a client to verify registry configuration %s", err.Error()),
136156
Field: registryMirrorVarPath,
137157
},
138158
)
@@ -141,10 +161,9 @@ func (r *registyCheck) checkRegistry(
141161
_, err = rc.Ping(ctx, mirrorRef) // ping will return an error for anything that's not 200
142162
if err != nil {
143163
result.Allowed = false
144-
result.Error = true
145164
result.Causes = append(result.Causes,
146165
preflight.Cause{
147-
Message: fmt.Sprintf("failed to ping registry %s with err: %s", mirrorHost.Hostname, err.Error()),
166+
Message: pingFailedReasonString(registryURL, err),
148167
Field: registryMirrorVarPath,
149168
},
150169
)
@@ -161,23 +180,26 @@ func newRegistryCheck(
161180
checks := []preflight.Check{}
162181
if cd.genericClusterConfigSpec != nil &&
163182
cd.genericClusterConfigSpec.GlobalImageRegistryMirror != nil {
164-
checks = append(checks, &registyCheck{
165-
field: "cluster.spec.topology.variables[.name=clusterConfig].value.globalImageRegistryMirror",
166-
kclient: cd.kclient,
167-
registryMirror: cd.genericClusterConfigSpec.GlobalImageRegistryMirror,
168-
cluster: cd.cluster,
183+
checks = append(checks, &registryCheck{
184+
field: "cluster.spec.topology.variables[.name=clusterConfig].value.globalImageRegistryMirror",
185+
kclient: cd.kclient,
186+
registryMirror: cd.genericClusterConfigSpec.GlobalImageRegistryMirror.DeepCopy(),
187+
cluster: cd.cluster,
188+
regClientPingerGetter: defaultRegClientGetter,
169189
})
170190
}
171191
if cd.genericClusterConfigSpec != nil && len(cd.genericClusterConfigSpec.ImageRegistries) > 0 {
172-
for i, registry := range cd.genericClusterConfigSpec.ImageRegistries {
173-
checks = append(checks, &registyCheck{
192+
for i := range cd.genericClusterConfigSpec.ImageRegistries {
193+
registry := cd.genericClusterConfigSpec.ImageRegistries[i]
194+
checks = append(checks, &registryCheck{
174195
field: fmt.Sprintf(
175196
"cluster.spec.topology.variables[.name=clusterConfig].value.imageRegistries[%d]",
176197
i,
177198
),
178-
kclient: cd.kclient,
179-
imageRegistry: &registry,
180-
cluster: cd.cluster,
199+
kclient: cd.kclient,
200+
imageRegistry: registry.DeepCopy(),
201+
cluster: cd.cluster,
202+
regClientPingerGetter: defaultRegClientGetter,
181203
})
182204
}
183205
}

0 commit comments

Comments
 (0)