Skip to content

Commit cd3bd06

Browse files
committed
feat: spec.secrets must be existing secrets
Signed-off-by: Alex Szakaly <alex.szakaly@gmail.com>
1 parent 3db09f5 commit cd3bd06

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

pkg/controller/perconaservermongodb/psmdb_controller.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,12 @@ func (r *ReconcilePerconaServerMongoDB) Reconcile(ctx context.Context, request r
276276
return reconcile.Result{}, errors.Wrap(err, "set CR version")
277277
}
278278

279+
// Make sure that secrets specified in the manifest are preserved and not overwritten by the operator.
280+
err = r.ensureSecretExistence(ctx, cr)
281+
if err != nil {
282+
return reconcile.Result{}, err
283+
}
284+
279285
err = cr.CheckNSetDefaults(ctx, r.serverVersion.Platform)
280286
if err != nil {
281287
// If the user created a cluster with finalizers and wrong options, it would be impossible to delete a cluster.

pkg/controller/perconaservermongodb/secrets.go

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@ import (
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1212
"k8s.io/apimachinery/pkg/types"
1313
"sigs.k8s.io/controller-runtime/pkg/client"
14+
logf "sigs.k8s.io/controller-runtime/pkg/log"
1415

1516
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1617
"github.com/percona/percona-server-mongodb-operator/pkg/naming"
1718
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb"
1819
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/secret"
1920
)
2021

21-
func getUserSecret(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, name string) (corev1.Secret, error) {
22+
func getSecret(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, name string) (corev1.Secret, error) {
2223
secrets := corev1.Secret{}
2324
err := cl.Get(ctx, types.NamespacedName{Name: name, Namespace: cr.Namespace}, &secrets)
24-
return secrets, errors.Wrap(err, "get user secrets")
25+
return secrets, err
2526
}
2627

2728
func getInternalCredentials(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, role api.SystemUserRole) (psmdb.Credentials, error) {
@@ -30,7 +31,7 @@ func getInternalCredentials(ctx context.Context, cl client.Reader, cr *api.Perco
3031

3132
func getCredentials(ctx context.Context, cl client.Reader, cr *api.PerconaServerMongoDB, name string, role api.SystemUserRole) (psmdb.Credentials, error) {
3233
creds := psmdb.Credentials{}
33-
usersSecret, err := getUserSecret(ctx, cl, cr, name)
34+
usersSecret, err := getSecret(ctx, cl, cr, name)
3435
if err != nil {
3536
return creds, errors.Wrap(err, "failed to get user secret")
3637
}
@@ -62,7 +63,65 @@ func getCredentials(ctx context.Context, cl client.Reader, cr *api.PerconaServer
6263
return creds, nil
6364
}
6465

66+
func (r *ReconcilePerconaServerMongoDB) ensureSecretExistence(ctx context.Context, cr *api.PerconaServerMongoDB) error {
67+
if cr.Spec.Secrets == nil {
68+
return nil
69+
}
70+
71+
if cr.Spec.Secrets.Users != "" {
72+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.Users); err != nil {
73+
return fmt.Errorf("users '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.Users, err)
74+
}
75+
}
76+
77+
if cr.Spec.Secrets.SSL != "" {
78+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.SSL); err != nil {
79+
return fmt.Errorf("ssl '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.SSL, err)
80+
}
81+
}
82+
83+
if cr.Spec.Secrets.SSLInternal != "" {
84+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.SSLInternal); err != nil {
85+
return fmt.Errorf("ssl internal '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.SSLInternal, err)
86+
}
87+
}
88+
89+
if cr.Spec.Secrets.InternalKey != "" {
90+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.InternalKey); err != nil {
91+
return fmt.Errorf("internal key '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.InternalKey, err)
92+
}
93+
}
94+
95+
if cr.Spec.Secrets.EncryptionKey != "" {
96+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.EncryptionKey); err != nil {
97+
return fmt.Errorf("encryption key '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.EncryptionKey, err)
98+
}
99+
}
100+
101+
if cr.Spec.Secrets.Vault != "" {
102+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.Vault); err != nil {
103+
return fmt.Errorf("vault '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.Vault, err)
104+
}
105+
}
106+
107+
if cr.Spec.Secrets.SSE != "" {
108+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.SSE); err != nil {
109+
return fmt.Errorf("sse '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.SSE, err)
110+
}
111+
}
112+
113+
if cr.Spec.Secrets.LDAPSecret != "" {
114+
if _, err := getSecret(ctx, r.client, cr, cr.Spec.Secrets.LDAPSecret); err != nil {
115+
return fmt.Errorf("ldap '%s' secret must exist if specified in the in the manifest: %w", cr.Spec.Secrets.LDAPSecret, err)
116+
}
117+
}
118+
119+
return nil
120+
}
121+
65122
func (r *ReconcilePerconaServerMongoDB) reconcileUsersSecret(ctx context.Context, cr *api.PerconaServerMongoDB) error {
123+
log := logf.FromContext(ctx).WithName("reconcileUsersSecret")
124+
66125
secretObj := corev1.Secret{}
67126
err := r.client.Get(ctx,
68127
types.NamespacedName{
@@ -117,6 +176,8 @@ func (r *ReconcilePerconaServerMongoDB) reconcileUsersSecret(ctx context.Context
117176
return fmt.Errorf("create Users secret: %v", err)
118177
}
119178

179+
log.Info("Created user secrets", "secret", cr.Spec.Secrets.Users)
180+
120181
return nil
121182
}
122183

0 commit comments

Comments
 (0)