Skip to content

Commit 5b28386

Browse files
authored
Merge branch 'main' into K8SPG-837
2 parents 121e8bb + be4001f commit 5b28386

File tree

8 files changed

+139
-14
lines changed

8 files changed

+139
-14
lines changed

.github/workflows/reviewdog.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ jobs:
55
name: runner / suggester / golangci-lint
66
runs-on: ubuntu-latest
77
steps:
8-
- uses: actions/setup-go@v5
8+
- uses: actions/setup-go@v6
99
with:
1010
go-version: '^1.25.1'
1111
- uses: actions/checkout@v5
@@ -21,7 +21,7 @@ jobs:
2121
runs-on: ubuntu-latest
2222
steps:
2323
- uses: actions/checkout@v5
24-
- uses: actions/setup-go@v5
24+
- uses: actions/setup-go@v6
2525
with:
2626
go-version: '^1.25.1'
2727
- run: go install -v github.com/incu6us/goimports-reviser/v3@latest
@@ -45,7 +45,7 @@ jobs:
4545
runs-on: ubuntu-latest
4646
steps:
4747
- uses: actions/checkout@v5
48-
- uses: actions/setup-go@v5
48+
- uses: actions/setup-go@v6
4949
with:
5050
go-version: '^1.25.1'
5151
- run: go install mvdan.cc/sh/v3/cmd/shfmt@latest

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
- name: Clone the code
99
uses: actions/checkout@v5
1010
- name: Setup Go
11-
uses: actions/setup-go@v5
11+
uses: actions/setup-go@v6
1212
with:
1313
go-version: '^1.25.1'
1414
- uses: actions/checkout@v5

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)

percona/watcher/wal.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ func getLatestBackup(ctx context.Context, cli client.Client, cr *pgv2.PerconaPGC
162162
return latest, nil
163163
}
164164

165+
// GetLatestCommitTimestamp gets the timestamp of the latest commit.
165166
func GetLatestCommitTimestamp(ctx context.Context, cli client.Client, execCli *clientcmd.Client, cr *pgv2.PerconaPGCluster, backup *pgv2.PerconaPGBackup) (*metav1.Time, error) {
166167
log := logging.FromContext(ctx)
167168

percona/watcher/wal_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package watcher
22

33
import (
44
"context"
5+
"errors"
56
"testing"
67
"time"
78

@@ -310,3 +311,49 @@ func TestGetLatestBackup(t *testing.T) {
310311
})
311312
}
312313
}
314+
315+
func TestGetLatestCommitTimestamp(t *testing.T) {
316+
ctx := context.Background()
317+
318+
tests := map[string]struct {
319+
pods []client.Object
320+
backup *pgv2.PerconaPGBackup
321+
cluster *pgv2.PerconaPGCluster
322+
expectedErr error
323+
}{
324+
"primary pod not found due to invalid patroni version": {
325+
pods: []client.Object{},
326+
backup: &pgv2.PerconaPGBackup{
327+
ObjectMeta: metav1.ObjectMeta{
328+
Name: "backup1",
329+
Namespace: "test-ns",
330+
},
331+
Spec: pgv2.PerconaPGBackupSpec{
332+
PGCluster: "test-cluster",
333+
RepoName: "repo1",
334+
},
335+
},
336+
cluster: &pgv2.PerconaPGCluster{
337+
ObjectMeta: metav1.ObjectMeta{
338+
Name: "test-cluster",
339+
Namespace: "test-ns",
340+
},
341+
Status: pgv2.PerconaPGClusterStatus{
342+
Patroni: pgv2.Patroni{
343+
Version: "error",
344+
},
345+
},
346+
},
347+
expectedErr: errors.New("failed to get patroni version: Malformed version: error: primary pod not found"),
348+
},
349+
}
350+
for name, tt := range tests {
351+
t.Run(name, func(t *testing.T) {
352+
c := testutils.BuildFakeClient(tt.pods...)
353+
354+
_, err := GetLatestCommitTimestamp(ctx, c, nil, tt.cluster, tt.backup)
355+
356+
assert.EqualError(t, err, tt.expectedErr.Error())
357+
})
358+
}
359+
}

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)