@@ -126,7 +126,7 @@ func (admitter *SecretAdmitter) validateProviderSecret() *admissionv1.AdmissionR
126
126
func (admitter * SecretAdmitter ) validateHostSecret () * admissionv1.AdmissionResponse {
127
127
if hostName , ok := admitter .secret .GetLabels ()["createdForResource" ]; ok {
128
128
if _ , ok := admitter .secret .Data ["user" ]; ! ok {
129
- err := errors .New ("Missing credentials on Host secret" )
129
+ err := errors .New ("missing credentials on Host secret" )
130
130
return webhookutils .ToAdmissionResponseError (err )
131
131
}
132
132
tested , err := admitter .testConnectionToHost (hostName )
@@ -171,6 +171,27 @@ func (admitter *SecretAdmitter) buildProviderCollector(providerType *api.Provide
171
171
}
172
172
}
173
173
174
+ func (admitter * SecretAdmitter ) ensureEsxiCredentials (provider * api.Provider ) (* core.Secret , error ) {
175
+ updatedSecret := admitter .secret .DeepCopy ()
176
+ user , ok := updatedSecret .Data ["user" ]
177
+
178
+ // if the user is not set and the api type is ESXi, we need to copy the credentials from the provider
179
+ if provider .Spec .Settings [api .SDK ] == api .ESXI && (! ok || string (user ) == "" ) {
180
+ ref := provider .Spec .Secret
181
+ providerSecret := & core.Secret {}
182
+ if err := admitter .Client .Get (context .TODO (), client.ObjectKey {Namespace : ref .Namespace , Name : ref .Name }, providerSecret ); err != nil {
183
+ log .Error (err , "failed to get provider secret for Host secret without credentials" )
184
+ return nil , err
185
+ }
186
+
187
+ // update the deep copy with user and password
188
+ updatedSecret .Data ["user" ] = providerSecret .Data ["user" ]
189
+ updatedSecret .Data ["password" ] = providerSecret .Data ["password" ]
190
+ }
191
+
192
+ return updatedSecret , nil
193
+ }
194
+
174
195
func (admitter * SecretAdmitter ) testConnectionToHost (hostName string ) (tested bool , err error ) {
175
196
provider := & api.Provider {}
176
197
providerName := string (admitter .secret .Data ["provider" ])
@@ -203,8 +224,14 @@ func (admitter *SecretAdmitter) testConnectionToHost(hostName string) (tested bo
203
224
}
204
225
admitter .secret .Data ["thumbprint" ] = []byte (hostModel .Thumbprint )
205
226
url := fmt .Sprintf ("https://%s/sdk" , admitter .secret .Data ["ip" ])
227
+
228
+ updatedSecret , err := admitter .ensureEsxiCredentials (provider )
229
+ if err != nil {
230
+ return false , err
231
+ }
232
+
206
233
h := adapter.EsxHost {
207
- Secret : & admitter . secret ,
234
+ Secret : updatedSecret ,
208
235
URL : url ,
209
236
}
210
237
log .Info ("Testing provider connection" )
0 commit comments