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
4651func (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