chore: Upgrade pxc-operator version (#729)

Co-authored-by: okozachenko1203 <okozachenko1203@users.noreply.github.com>
diff --git a/roles/defaults/vars/main.yml b/roles/defaults/vars/main.yml
index d14443b..c34cf2e 100644
--- a/roles/defaults/vars/main.yml
+++ b/roles/defaults/vars/main.yml
@@ -159,9 +159,10 @@
   ovn_ovsdb_nb: quay.io/vexxhost/ovn-central:23.03.0
   ovn_ovsdb_sb: quay.io/vexxhost/ovn-central:23.03.0
   pause: registry.k8s.io/pause:3.8
-  percona_xtradb_cluster_haproxy: docker.io/percona/percona-xtradb-cluster-operator:1.12.0-haproxy
-  percona_xtradb_cluster_operator: docker.io/percona/percona-xtradb-cluster-operator:1.12.0
-  percona_xtradb_cluster: docker.io/percona/percona-xtradb-cluster:5.7.39-31.61
+  percona_xtradb_cluster_haproxy: docker.io/percona/percona-xtradb-cluster-operator:1.13.0-haproxy
+  percona_xtradb_cluster_operator: docker.io/percona/percona-xtradb-cluster-operator:1.13.0
+  percona_xtradb_cluster: docker.io/percona/percona-xtradb-cluster:8.0.32-24.2
+  percona_version_service: docker.io/perconalab/version-service:main-3325140
   placement_db_sync: quay.io/vexxhost/placement@sha256:ae9a7567e3619440b3a7a58b5ab407c5efad372627c06fb0ab0193a85c9d1c70 # image-source: quay.io/vexxhost/placement:zed
   placement: quay.io/vexxhost/placement@sha256:ae9a7567e3619440b3a7a58b5ab407c5efad372627c06fb0ab0193a85c9d1c70 # image-source: quay.io/vexxhost/placement:zed
   prometheus_config_reloader: quay.io/prometheus-operator/prometheus-config-reloader:v0.67.1
diff --git a/roles/percona_xtradb_cluster/tasks/main.yml b/roles/percona_xtradb_cluster/tasks/main.yml
index 384b701..647a24a 100644
--- a/roles/percona_xtradb_cluster/tasks/main.yml
+++ b/roles/percona_xtradb_cluster/tasks/main.yml
@@ -30,7 +30,100 @@
             namespace: openstack
           type: Opaque
 
-- name: Create Percona XtraDB cluster
+- name: Check if the Percona XtraDB cluster exists
+  run_once: true
+  block:
+    - name: Check if the Percona XtraDB cluster exists
+      kubernetes.core.k8s_info:
+        api_version: pxc.percona.com/v1
+        kind: PerconaXtraDBCluster
+        name: percona-xtradb
+        namespace: openstack
+      register: _pxc_cluster
+      ignore_errors: true
+
+    - name: Get current status of the cluster
+      ansible.builtin.set_fact:
+        _pxc_version: "{{ _pxc_cluster.resources[0].status.pxc.version }}"
+        _pxc_status: "{{ _pxc_cluster.resources[0].status.state }}"
+      when: ( _pxc_cluster.resources | length==1 )
+
+- name: Do version upgrade
+  run_once: true
+  when:
+    - _pxc_version is defined
+    - _pxc_status is defined
+    - _pxc_version.startswith('5.7')
+    - (atmosphere_images['percona_xtradb_cluster'] | vexxhost.kubernetes.docker_image('tag')).startswith('8.')
+  block:
+    - name: Assert that the cluster is healthy before upgrade
+      run_once: true
+      ansible.builtin.assert:
+        that:
+          - _pxc_status == 'ready'
+        fail_msg: >-
+          The Percona XtraDB Cluster is not healthy. Please fix the cluster manually first before upgrade.
+
+    - name: Stop PXC-operator
+      kubernetes.core.k8s_scale:
+        api_version: v1
+        kind: Deployment
+        name: pxc-operator
+        namespace: openstack
+        replicas: 0
+        wait_timeout: 60
+
+    - name: Change the cluster Statefulset image to 8.0
+      kubernetes.core.k8s_json_patch:
+        api_version: apps/v1
+        kind: StatefulSet
+        namespace: openstack
+        name: percona-xtradb-pxc
+        patch:
+          - op: replace
+            path: /spec/template/spec/containers/0/image
+            value: "{{ atmosphere_images['percona_xtradb_cluster'] | vexxhost.kubernetes.docker_image('ref') }}"
+
+    - name: Wait until the cluster Statefulset rollout
+      kubernetes.core.k8s_info:
+        api_version: apps/v1
+        kind: StatefulSet
+        name: percona-xtradb-pxc
+        namespace: openstack
+      register: _pxc_cluster_sts
+      retries: 120
+      delay: 5
+      until:
+        - _pxc_cluster_sts.resources[0].status.replicas == _pxc_cluster_sts.resources[0].status.readyReplicas
+
+    - name: Update pxc cluster spec
+      kubernetes.core.k8s:
+        definition:
+          apiVersion: pxc.percona.com/v1
+          kind: PerconaXtraDBCluster
+          metadata:
+            name: percona-xtradb
+            namespace: openstack
+          spec:
+            pxc:
+              image: "{{ atmosphere_images['percona_xtradb_cluster'] | vexxhost.kubernetes.docker_image('ref') }}"
+        wait_sleep: 1
+        wait_timeout: 600
+        wait: true
+        wait_condition:
+          type: ready
+          status: true
+
+    - name: Start PXC-operator
+      kubernetes.core.k8s_scale:
+        api_version: v1
+        kind: Deployment
+        name: pxc-operator
+        namespace: openstack
+        replicas: 1
+        wait_timeout: 60
+
+- name: Apply Percona XtraDB cluster
   run_once: true
   kubernetes.core.k8s:
     state: present
diff --git a/roles/percona_xtradb_cluster/vars/main.yml b/roles/percona_xtradb_cluster/vars/main.yml
index 7836fdb..5a99be1 100644
--- a/roles/percona_xtradb_cluster/vars/main.yml
+++ b/roles/percona_xtradb_cluster/vars/main.yml
@@ -1,5 +1,5 @@
 _percona_xtradb_cluster_spec:
-  crVersion: "1.12.0"
+  crVersion: "1.13.0"
   secretsName: percona-xtradb
   pxc:
     size: 3
diff --git a/roles/percona_xtradb_cluster/vars_test.go b/roles/percona_xtradb_cluster/vars_test.go
index 9b0deda..f085563 100644
--- a/roles/percona_xtradb_cluster/vars_test.go
+++ b/roles/percona_xtradb_cluster/vars_test.go
@@ -53,7 +53,7 @@
 func TestPerconaXtraDBClusterPXCSpec(t *testing.T) {
 	assert.Equal(t, int32(3), vars.PerconaXtraDBClusterSpec.PXC.Size)
 	assert.Equal(t, true, *vars.PerconaXtraDBClusterSpec.PXC.AutoRecovery)
-	defaults.AssertAtmosphereImage(t, "docker.io/percona/percona-xtradb-cluster:5.7.39-31.61", vars.PerconaXtraDBClusterSpec.PXC.Image)
+	defaults.AssertAtmosphereImage(t, "docker.io/percona/percona-xtradb-cluster:8.0.32-24.2", vars.PerconaXtraDBClusterSpec.PXC.Image)
 
 	assert.Equal(t, map[string]string{
 		"openstack-control-plane": "enabled",