Skip to content

Commit a1852ac

Browse files
authored
K8SPG-833: watch envFrom secrets (#1306)
1 parent a679457 commit a1852ac

File tree

4 files changed

+87
-10
lines changed

4 files changed

+87
-10
lines changed

cmd/postgres-operator/main.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,15 @@ func addControllersToManager(ctx context.Context, mgr manager.Manager) error {
163163
return errors.New("missing controller in manager")
164164
}
165165

166+
if err := mgr.GetFieldIndexer().IndexField(
167+
context.Background(),
168+
&v2.PerconaPGCluster{},
169+
v2.IndexFieldEnvFromSecrets,
170+
v2.EnvFromSecretsIndexerFunc,
171+
); err != nil {
172+
return err
173+
}
174+
166175
externalEvents := make(chan event.GenericEvent)
167176
stopChan := make(chan event.DeleteEvent)
168177

percona/controller/pgcluster/controller.go

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func (r *PGClusterReconciler) SetupWithManager(mgr manager.Manager) error {
106106
For(&v2.PerconaPGCluster{}).
107107
Owns(&v1beta1.PostgresCluster{}).
108108
WatchesRawSource(source.Kind(mgr.GetCache(), &corev1.Service{}, r.watchServices())).
109+
Watches(&corev1.Secret{}, r.watchEnvFromSecrets()).
109110
WatchesRawSource(source.Kind(mgr.GetCache(), &corev1.Secret{}, r.watchSecrets())).
110111
WatchesRawSource(source.Kind(mgr.GetCache(), &batchv1.Job{}, r.watchBackupJobs())).
111112
WatchesRawSource(source.Kind(mgr.GetCache(), &v2.PerconaPGBackup{}, r.watchPGBackups())).
@@ -165,6 +166,33 @@ func (r *PGClusterReconciler) watchPGBackups() handler.TypedFuncs[*v2.PerconaPGB
165166
}
166167
}
167168

169+
func (r *PGClusterReconciler) watchEnvFromSecrets() handler.TypedEventHandler[client.Object, reconcile.Request] {
170+
return handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
171+
log := logf.FromContext(ctx).WithName("watchEnvFromSecrets")
172+
173+
secret, ok := obj.(*corev1.Secret)
174+
if !ok {
175+
return nil
176+
}
177+
178+
var clusters v2.PerconaPGClusterList
179+
if err := r.Client.List(ctx, &clusters, client.MatchingFields{
180+
v2.IndexFieldEnvFromSecrets: secret.Name,
181+
}, client.InNamespace(secret.Namespace)); err != nil {
182+
log.Error(err, "Failed to list clusters by env from secrets index failed", "key", client.ObjectKeyFromObject(secret).String())
183+
return nil
184+
}
185+
186+
reqs := make([]reconcile.Request, 0, len(clusters.Items))
187+
for _, cr := range clusters.Items {
188+
reqs = append(reqs, reconcile.Request{
189+
NamespacedName: client.ObjectKeyFromObject(&cr),
190+
})
191+
}
192+
return reqs
193+
})
194+
}
195+
168196
func (r *PGClusterReconciler) watchSecrets() handler.TypedFuncs[*corev1.Secret, reconcile.Request] {
169197
return handler.TypedFuncs[*corev1.Secret, reconcile.Request]{
170198
UpdateFunc: func(ctx context.Context, e event.TypedUpdateEvent[*corev1.Secret], q workqueue.TypedRateLimitingInterface[reconcile.Request]) {
@@ -281,7 +309,7 @@ func (r *PGClusterReconciler) Reconcile(ctx context.Context, request reconcile.R
281309
return reconcile.Result{}, errors.Wrap(err, "failed to handle monitor user password change")
282310
}
283311

284-
if err := r.handleEnvFromSecrets(ctx, cr); err != nil {
312+
if err := r.reconcileEnvFromSecrets(ctx, cr); err != nil {
285313
return reconcile.Result{}, errors.Wrap(err, "failed to handle envFrom secrets")
286314
}
287315

@@ -721,7 +749,7 @@ func (r *PGClusterReconciler) reconcilePMM(ctx context.Context, cr *v2.PerconaPG
721749
return nil
722750
}
723751

724-
func (r *PGClusterReconciler) handleEnvFromSecrets(ctx context.Context, cr *v2.PerconaPGCluster) error {
752+
func (r *PGClusterReconciler) reconcileEnvFromSecrets(ctx context.Context, cr *v2.PerconaPGCluster) error {
725753
m := make(map[*[]corev1.EnvFromSource]*v1beta1.Metadata)
726754

727755
for i := 0; i < len(cr.Spec.InstanceSets); i++ {
@@ -759,7 +787,7 @@ func (r *PGClusterReconciler) handleEnvFromSecrets(ctx context.Context, cr *v2.P
759787
metadata.Annotations = make(map[string]string)
760788
}
761789

762-
// If the currentHash is the same is the on the STS, restart will not happen
790+
// If the currentHash is the same on the STS, restart will not happen
763791
metadata.Annotations[pNaming.AnnotationEnvVarsSecretHash] = getSecretHash(secrets...)
764792
}
765793

percona/controller/pgcluster/secret.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,20 @@ import (
66
"fmt"
77

88
corev1 "k8s.io/api/core/v1"
9-
k8serrors "k8s.io/apimachinery/pkg/api/errors"
109
"k8s.io/apimachinery/pkg/types"
1110
"sigs.k8s.io/controller-runtime/pkg/client"
1211

13-
"github.com/percona/percona-postgresql-operator/internal/logging"
1412
v2 "github.com/percona/percona-postgresql-operator/pkg/apis/pgv2.percona.com/v2"
1513
)
1614

1715
func getEnvFromSecrets(ctx context.Context, cl client.Client, cr *v2.PerconaPGCluster, envFromSource []corev1.EnvFromSource) ([]corev1.Secret, error) {
18-
log := logging.FromContext(ctx)
1916
var secrets []corev1.Secret
2017
for _, source := range envFromSource {
2118
var secret corev1.Secret
2219
if err := cl.Get(ctx, types.NamespacedName{
2320
Name: source.SecretRef.Name,
2421
Namespace: cr.Namespace,
2522
}, &secret); err != nil {
26-
if k8serrors.IsNotFound(err) {
27-
log.V(1).Info(fmt.Sprintf("Secret %s not found", secret.Name))
28-
continue
29-
}
3023
return nil, err
3124
}
3225
secrets = append(secrets, secret)

pkg/apis/pgv2.percona.com/v2/perconapgcluster_types.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
99
runtime "k8s.io/apimachinery/pkg/runtime"
1010
"k8s.io/apimachinery/pkg/util/intstr"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
1112
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1213

1314
"github.com/percona/percona-postgresql-operator/internal/config"
@@ -1080,3 +1081,49 @@ const (
10801081
func (pgc PerconaPGCluster) UserMonitoring() string {
10811082
return pgc.Name + "-" + naming.RolePostgresUser + "-" + UserMonitoring
10821083
}
1084+
1085+
func (cr *PerconaPGCluster) EnvFromSecrets() []string {
1086+
secrets := []string{}
1087+
1088+
for i := 0; i < len(cr.Spec.InstanceSets); i++ {
1089+
set := &cr.Spec.InstanceSets[i]
1090+
if len(set.EnvFrom) == 0 {
1091+
continue
1092+
}
1093+
for _, envFrom := range set.EnvFrom {
1094+
if envFrom.SecretRef == nil {
1095+
continue
1096+
}
1097+
secrets = append(secrets, envFrom.SecretRef.Name)
1098+
}
1099+
}
1100+
1101+
if len(cr.Spec.Proxy.PGBouncer.EnvFrom) > 0 {
1102+
for _, envFrom := range cr.Spec.Proxy.PGBouncer.EnvFrom {
1103+
if envFrom.SecretRef == nil {
1104+
continue
1105+
}
1106+
secrets = append(secrets, envFrom.SecretRef.Name)
1107+
}
1108+
}
1109+
1110+
if len(cr.Spec.Backups.PGBackRest.EnvFrom) > 0 {
1111+
for _, envFrom := range cr.Spec.Backups.PGBackRest.EnvFrom {
1112+
if envFrom.SecretRef == nil {
1113+
continue
1114+
}
1115+
secrets = append(secrets, envFrom.SecretRef.Name)
1116+
}
1117+
}
1118+
return secrets
1119+
}
1120+
1121+
const IndexFieldEnvFromSecrets = "pgCluster.envFromSecrets" //nolint:gosec
1122+
1123+
var EnvFromSecretsIndexerFunc client.IndexerFunc = func(obj client.Object) []string {
1124+
cr, ok := obj.(*PerconaPGCluster)
1125+
if !ok {
1126+
return nil
1127+
}
1128+
return cr.EnvFromSecrets()
1129+
}

0 commit comments

Comments
 (0)