Skip to content

Commit df2e92c

Browse files
committed
Mutate ESXi secret before testing connection
Signed-off-by: yaacov <kobi.zamir@gmail.com>
1 parent bfb0a81 commit df2e92c

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

pkg/forklift-api/webhooks/mutating-webhook/mutators/secret-mutator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (mutator *SecretMutator) patchSecret() *admissionv1.AdmissionResponse {
159159
func (mutator *SecretMutator) mutateHostSecret() *admissionv1.AdmissionResponse {
160160
if _, ok := mutator.secret.GetLabels()["createdForResource"]; ok { // checking this just because there's no point in mutating an invalid secret
161161
var secretChanged bool
162-
if _, ok := mutator.secret.Data["user"]; !ok {
162+
if user, ok := mutator.secret.Data["user"]; !ok || string(user) == "" {
163163
provider := &api.Provider{}
164164
providerName := string(mutator.secret.Data["provider"])
165165
providerNamespace := mutator.secret.Namespace

pkg/forklift-api/webhooks/validating-webhook/admitters/secret-admitter.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (admitter *SecretAdmitter) validateProviderSecret() *admissionv1.AdmissionR
126126
func (admitter *SecretAdmitter) validateHostSecret() *admissionv1.AdmissionResponse {
127127
if hostName, ok := admitter.secret.GetLabels()["createdForResource"]; ok {
128128
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")
130130
return webhookutils.ToAdmissionResponseError(err)
131131
}
132132
tested, err := admitter.testConnectionToHost(hostName)
@@ -171,6 +171,27 @@ func (admitter *SecretAdmitter) buildProviderCollector(providerType *api.Provide
171171
}
172172
}
173173

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+
174195
func (admitter *SecretAdmitter) testConnectionToHost(hostName string) (tested bool, err error) {
175196
provider := &api.Provider{}
176197
providerName := string(admitter.secret.Data["provider"])
@@ -203,8 +224,14 @@ func (admitter *SecretAdmitter) testConnectionToHost(hostName string) (tested bo
203224
}
204225
admitter.secret.Data["thumbprint"] = []byte(hostModel.Thumbprint)
205226
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+
206233
h := adapter.EsxHost{
207-
Secret: &admitter.secret,
234+
Secret: updatedSecret,
208235
URL: url,
209236
}
210237
log.Info("Testing provider connection")

0 commit comments

Comments
 (0)