Skip to content

Commit a466cb6

Browse files
authored
K8SPSMDB-1347 When password does not exist, properly update it and set the boolean to true (#1889)
1 parent 5710ffc commit a466cb6

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

pkg/controller/perconaservermongodb/custom_users.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ func getCustomUserSecret(ctx context.Context, cl client.Client, cr *api.PerconaS
505505
if err != nil {
506506
return nil, errors.Wrap(err, "failed to update user secret")
507507
}
508+
// given that the secret was updated, the password now exists
509+
hasPass = true
508510
}
509511

510512
// pass key should be present in the user provided secret

pkg/controller/perconaservermongodb/custom_users_test.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package perconaservermongodb
22

33
import (
4+
"context"
45
"testing"
56

67
"github.com/pkg/errors"
78
"github.com/stretchr/testify/assert"
9+
corev1 "k8s.io/api/core/v1"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
13+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
814

915
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1016
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/mongo"
@@ -299,3 +305,109 @@ func TestValidateUser(t *testing.T) {
299305
})
300306
}
301307
}
308+
309+
func TestGetCustomUserSecret(t *testing.T) {
310+
ctx := context.Background()
311+
scheme := runtime.NewScheme()
312+
err := corev1.AddToScheme(scheme)
313+
assert.NoError(t, err)
314+
err = api.SchemeBuilder.AddToScheme(scheme)
315+
assert.NoError(t, err)
316+
317+
ns := "test-ns"
318+
passKey := "password"
319+
320+
tests := map[string]struct {
321+
crName string
322+
client func() client.Client
323+
user *api.User
324+
hasExistingSecret bool
325+
errMsg string
326+
}{
327+
"create default secret if not exists": {
328+
crName: "my-cluster-create-default-secret",
329+
client: func() client.Client {
330+
return fake.NewClientBuilder().WithScheme(scheme).Build()
331+
},
332+
user: &api.User{},
333+
},
334+
"user has custom secret reference that exists": {
335+
crName: "my-cluster-user-has-secret",
336+
client: func() client.Client {
337+
existingSecret := &corev1.Secret{
338+
ObjectMeta: metav1.ObjectMeta{
339+
Name: "custom-secret",
340+
Namespace: ns,
341+
},
342+
Data: map[string][]byte{
343+
passKey: []byte("existing-password"),
344+
},
345+
}
346+
347+
return fake.NewClientBuilder().WithScheme(scheme).WithObjects(existingSecret).Build()
348+
},
349+
user: &api.User{
350+
PasswordSecretRef: &api.SecretKeySelector{
351+
Name: "custom-secret",
352+
},
353+
},
354+
hasExistingSecret: true,
355+
},
356+
"user has custom secret reference but secret does not exist": {
357+
crName: "my-cluster-has-missing-secret",
358+
client: func() client.Client {
359+
return fake.NewClientBuilder().WithScheme(scheme).Build()
360+
},
361+
user: &api.User{
362+
PasswordSecretRef: &api.SecretKeySelector{
363+
Name: "missing-secret",
364+
},
365+
},
366+
errMsg: "failed to get user secret",
367+
},
368+
"existing default secret missing password key, create new": {
369+
crName: "my-cluster-existing-secret-missing-password",
370+
client: func() client.Client {
371+
defaultSecret := &corev1.Secret{
372+
ObjectMeta: metav1.ObjectMeta{
373+
Name: "my-cluster-existing-secret-missing-password-custom-user-secret",
374+
Namespace: ns,
375+
},
376+
Data: map[string][]byte{},
377+
}
378+
379+
return fake.NewClientBuilder().WithScheme(scheme).WithObjects(defaultSecret).Build()
380+
},
381+
user: &api.User{},
382+
},
383+
}
384+
for name, tt := range tests {
385+
t.Run(name, func(t *testing.T) {
386+
cr := &api.PerconaServerMongoDB{
387+
ObjectMeta: metav1.ObjectMeta{
388+
Name: tt.crName,
389+
Namespace: ns,
390+
},
391+
}
392+
393+
secret, err := getCustomUserSecret(ctx, tt.client(), cr, tt.user, passKey)
394+
if tt.hasExistingSecret && tt.errMsg == "" {
395+
assert.NoError(t, err)
396+
assert.Equal(t, secret.Name, "custom-secret")
397+
assert.Equal(t, string(secret.Data[passKey]), "existing-password")
398+
return
399+
}
400+
if !tt.hasExistingSecret && tt.errMsg == "" {
401+
assert.NoError(t, err)
402+
assert.Equal(t, secret.Name, tt.crName+"-custom-user-secret")
403+
assert.NotEmpty(t, string(secret.Data[passKey]))
404+
}
405+
if tt.errMsg != "" {
406+
assert.Nil(t, secret)
407+
assert.Error(t, err)
408+
assert.Contains(t, err.Error(), tt.errMsg)
409+
}
410+
411+
})
412+
}
413+
}

0 commit comments

Comments
 (0)