Skip to content

Commit 760381f

Browse files
committed
fix triggered perconapgupgrade after operator upgrade
1 parent f0658aa commit 760381f

7 files changed

Lines changed: 64 additions & 0 deletions

File tree

config/rbac/cluster/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ rules:
194194
- apiGroups:
195195
- postgres-operator.crunchydata.com
196196
resources:
197+
- pgupgrades
197198
- postgresclusters
198199
verbs:
199200
- get

config/rbac/namespace/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ rules:
194194
- apiGroups:
195195
- postgres-operator.crunchydata.com
196196
resources:
197+
- pgupgrades
197198
- postgresclusters
198199
verbs:
199200
- get

deploy/bundle.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69415,6 +69415,7 @@ rules:
6941569415
- apiGroups:
6941669416
- postgres-operator.crunchydata.com
6941769417
resources:
69418+
- pgupgrades
6941869419
- postgresclusters
6941969420
verbs:
6942069421
- get

deploy/cw-bundle.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69415,6 +69415,7 @@ rules:
6941569415
- apiGroups:
6941669416
- postgres-operator.crunchydata.com
6941769417
resources:
69418+
- pgupgrades
6941869419
- postgresclusters
6941969420
verbs:
6942069421
- get

deploy/cw-rbac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ rules:
198198
- apiGroups:
199199
- postgres-operator.crunchydata.com
200200
resources:
201+
- pgupgrades
201202
- postgresclusters
202203
verbs:
203204
- get

deploy/rbac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ rules:
198198
- apiGroups:
199199
- postgres-operator.crunchydata.com
200200
resources:
201+
- pgupgrades
201202
- postgresclusters
202203
verbs:
203204
- get

percona/controller/pgupgrade/controller.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1010
"k8s.io/apimachinery/pkg/api/meta"
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13+
"k8s.io/apimachinery/pkg/runtime/schema"
1214
"k8s.io/client-go/util/retry"
1315
"sigs.k8s.io/controller-runtime/pkg/builder"
1416
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -42,6 +44,9 @@ func (r *PGUpgradeReconciler) SetupWithManager(mgr manager.Manager) error {
4244
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgupgrades/finalizers,verbs=patch;update
4345
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgclusters,verbs=get;list;watch;patch;update
4446
// +kubebuilder:rbac:groups=upstream.pgv2.percona.com,resources=pgupgrades,verbs=get;list;create;update;patch;delete;watch
47+
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={get,list,watch}
48+
49+
var errLegacyUpgradeFinalized = errors.New("legacy upgrade is already finished")
4550

4651
func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
4752
log := logging.FromContext(ctx).WithValues("request", request)
@@ -57,6 +62,14 @@ func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, request reconcile.R
5762
return reconcile.Result{}, err
5863
}
5964

65+
if err := r.checkLegacyUpgrade(ctx, request); err != nil {
66+
if errors.Is(err, errLegacyUpgradeFinalized) {
67+
return reconcile.Result{}, nil
68+
}
69+
70+
return reconcile.Result{}, errors.Wrap(err, "check legacy upgrade")
71+
}
72+
6073
pgCluster := &pgv2.PerconaPGCluster{
6174
ObjectMeta: metav1.ObjectMeta{
6275
Name: perconaPGUpgrade.Spec.PostgresClusterName,
@@ -250,3 +263,48 @@ func (r *PGUpgradeReconciler) finalizeUpgrade(ctx context.Context, pgCluster *pg
250263

251264
return r.Client.Patch(ctx, pgCluster.DeepCopy(), client.MergeFrom(orig))
252265
}
266+
267+
func (r *PGUpgradeReconciler) checkLegacyUpgrade(ctx context.Context, request reconcile.Request) error {
268+
legacyGVK := schema.GroupVersionKind{
269+
Group: "postgres-operator.crunchydata.com",
270+
Version: "v1beta1",
271+
Kind: "PGUpgrade",
272+
}
273+
274+
mapper := r.Client.RESTMapper()
275+
if _, err := mapper.RESTMapping(legacyGVK.GroupKind(), legacyGVK.Version); err != nil {
276+
if meta.IsNoMatchError(err) {
277+
return nil
278+
}
279+
return errors.Wrap(err, "discover legacy PGUpgrade GVK")
280+
}
281+
282+
legacy := &unstructured.Unstructured{}
283+
legacy.SetGroupVersionKind(legacyGVK)
284+
if err := r.Client.Get(ctx, request.NamespacedName, legacy); err != nil {
285+
if k8serrors.IsNotFound(err) {
286+
return nil
287+
}
288+
return errors.Wrap(err, "get legacy PGUpgrade")
289+
}
290+
291+
conditions, found, err := unstructured.NestedSlice(legacy.Object, "status", "conditions")
292+
if err != nil {
293+
return errors.Wrap(err, "read legacy PGUpgrade status conditions")
294+
}
295+
if !found {
296+
return nil
297+
}
298+
for _, c := range conditions {
299+
cm, ok := c.(map[string]any)
300+
if !ok {
301+
continue
302+
}
303+
t, _, _ := unstructured.NestedString(cm, "type")
304+
if t == "Succeeded" {
305+
return errLegacyUpgradeFinalized
306+
}
307+
}
308+
309+
return nil
310+
}

0 commit comments

Comments
 (0)