chore: move pxc into ansible role
diff --git a/atmosphere/flows.py b/atmosphere/flows.py
index 6fd57ab..d05a3e1 100644
--- a/atmosphere/flows.py
+++ b/atmosphere/flows.py
@@ -183,43 +183,6 @@
     objects.HelmRepository(
         api=api,
         metadata=types.NamespacedObjectMeta(
-            name=constants.HELM_REPOSITORY_PERCONA,
-            namespace=constants.NAMESPACE_OPENSTACK,
-        ),
-        spec=types.HelmRepositorySpec(
-            url="https://percona.github.io/percona-helm-charts/",
-        ),
-    ).apply()
-    objects.HelmRelease(
-        api=api,
-        metadata=types.NamespacedObjectMeta(
-            name=constants.HELM_RELEASE_PXC_OPERATOR_NAME,
-            namespace=constants.NAMESPACE_OPENSTACK,
-        ),
-        spec=types.HelmReleaseSpec(
-            chart=types.HelmChartTemplate(
-                spec=types.HelmChartTemplateSpec(
-                    chart=constants.HELM_RELEASE_PXC_OPERATOR_NAME,
-                    version=constants.HELM_RELEASE_PXC_OPERATOR_VERSION,
-                    source_ref=types.CrossNamespaceObjectReference(
-                        kind="HelmRepository",
-                        name=constants.HELM_REPOSITORY_PERCONA,
-                        namespace=constants.NAMESPACE_OPENSTACK,
-                    ),
-                )
-            ),
-            depends_on=[
-                types.NamespacedObjectReference(
-                    name=constants.HELM_RELEASE_CERT_MANAGER_NAME,
-                    namespace=constants.NAMESPACE_CERT_MANAGER,
-                )
-            ],
-            values=constants.HELM_RELEASE_PXC_OPERATOR_VALUES,
-        ),
-    ).apply()
-    objects.HelmRepository(
-        api=api,
-        metadata=types.NamespacedObjectMeta(
             name=constants.HELM_REPOSITORY_OPENSTACK_HELM_INFRA,
             namespace=constants.NAMESPACE_OPENSTACK,
         ),
@@ -281,10 +244,6 @@
                         namespace=constants.NAMESPACE_OPENSTACK,
                     ),
                     types.NamespacedObjectReference(
-                        name=constants.HELM_RELEASE_PXC_OPERATOR_NAME,
-                        namespace=constants.NAMESPACE_OPENSTACK,
-                    ),
-                    types.NamespacedObjectReference(
                         name="node-feature-discovery",
                         namespace=constants.NAMESPACE_MONITORING,
                     ),
diff --git a/atmosphere/tasks/constants.py b/atmosphere/tasks/constants.py
index 5e99700..8999e60 100644
--- a/atmosphere/tasks/constants.py
+++ b/atmosphere/tasks/constants.py
@@ -594,15 +594,6 @@
     "useCertManager": True,
 }
 
-HELM_RELEASE_PXC_OPERATOR_NAME = "pxc-operator"
-HELM_RELEASE_PXC_OPERATOR_VERSION = "1.10.0"
-HELM_RELEASE_PXC_OPERATOR_VALUES = {
-    "image": utils.get_image_ref_using_legacy_image_repository(
-        "percona_xtradb_cluster_operator"
-    ).string(),
-    "nodeSelector": NODE_SELECTOR_CONTROL_PLANE,
-}
-
 HELM_RELEASE_KEYSTONE_NAME = "keystone"
 
 HELM_RELEASE_BARBICAN_NAME = "barbican"
diff --git a/roles/atmosphere/meta/main.yml b/roles/atmosphere/meta/main.yml
index 4d898e5..e676cd4 100644
--- a/roles/atmosphere/meta/main.yml
+++ b/roles/atmosphere/meta/main.yml
@@ -22,3 +22,6 @@
     - name: Ubuntu
       versions:
         - focal
+
+dependencies:
+  - role: percona_xtradb_cluster_operator
diff --git a/roles/percona_xtradb_cluster_operator/README.md b/roles/percona_xtradb_cluster_operator/README.md
new file mode 100644
index 0000000..4f54747
--- /dev/null
+++ b/roles/percona_xtradb_cluster_operator/README.md
@@ -0,0 +1,6 @@
+# percona_xtradb_cluster_operator
+
+ This is a role which will deploy `pxc-operator` using Helm against a Kubernetes
+ cluster.
+
+ _NOTE_: This role is temporary until we add support for OLM.
diff --git a/roles/percona_xtradb_cluster_operator/defaults/main.yml b/roles/percona_xtradb_cluster_operator/defaults/main.yml
new file mode 100644
index 0000000..740006e
--- /dev/null
+++ b/roles/percona_xtradb_cluster_operator/defaults/main.yml
@@ -0,0 +1,9 @@
+percona_xtradb_cluster_operator_helm_repository_name: percona
+percona_xtradb_cluster_operator_helm_repository_url: https://percona.github.io/percona-helm-charts
+
+percona_xtradb_cluster_operator_helm_release_name: pxc-operator
+percona_xtradb_cluster_operator_helm_chart_name: pxc-operator
+percona_xtradb_cluster_operator_helm_chart_version: 1.10.0
+
+percona_xtradb_cluster_operator_helm_release_namespace: openstack
+percona_xtradb_cluster_operator_helm_values: {}
diff --git a/roles/percona_xtradb_cluster_operator/tasks/main.yml b/roles/percona_xtradb_cluster_operator/tasks/main.yml
new file mode 100644
index 0000000..136a86b
--- /dev/null
+++ b/roles/percona_xtradb_cluster_operator/tasks/main.yml
@@ -0,0 +1,41 @@
+- name: Configure Helm repository
+  run_once: true
+  kubernetes.core.helm_repository:
+    name: "{{ percona_xtradb_cluster_operator_helm_repository_name }}"
+    repo_url: "{{ percona_xtradb_cluster_operator_helm_repository_url }}"
+
+# NOTE(mnaser): We should get rid of this task eventually as it is suspending
+#               the old HelmRelease and removing it to avoid uninstalling the
+#               Helm chart.
+- name: Uninstall the legacy HelmRelease
+  run_once: true
+  block:
+    - name: Suspend the existing HelmRelease
+      kubernetes.core.k8s:
+        state: patched
+        api_version: helm.toolkit.fluxcd.io/v2beta1
+        kind: HelmRelease
+        name: pxc-operator
+        namespace: openstack
+        definition:
+          spec:
+            suspend: true
+
+    - name: Remove the existing HelmRelease
+      kubernetes.core.k8s:
+        state: absent
+        api_version: helm.toolkit.fluxcd.io/v2beta1
+        kind: HelmRelease
+        name: pxc-operator
+        namespace: openstack
+
+- name: Deploy Helm chart
+  run_once: true
+  kubernetes.core.helm:
+    name: "{{ percona_xtradb_cluster_operator_helm_release_name }}"
+    chart_ref: "{{ percona_xtradb_cluster_operator_helm_repository_name }}/{{ percona_xtradb_cluster_operator_helm_chart_name }}"
+    chart_version: "{{ percona_xtradb_cluster_operator_helm_chart_version }}"
+    release_namespace: "{{ percona_xtradb_cluster_operator_helm_release_namespace }}"
+    create_namespace: true
+    kubeconfig: /etc/kubernetes/admin.conf
+    values: "{{ _percona_xtradb_cluster_operator_helm_values | combine(percona_xtradb_cluster_operator_helm_values, recursive=True) }}"
diff --git a/roles/percona_xtradb_cluster_operator/vars/main.yml b/roles/percona_xtradb_cluster_operator/vars/main.yml
new file mode 100644
index 0000000..957706d
--- /dev/null
+++ b/roles/percona_xtradb_cluster_operator/vars/main.yml
@@ -0,0 +1,4 @@
+_percona_xtradb_cluster_operator_helm_values:
+  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'percona_xtradb_cluster_operator', output='ref') }}"
+  nodeSelector:
+    openstack-control-plane: enabled