@@ -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