fix(rabbitmq): stop/warn if spec is changed
diff --git a/galaxy.yml b/galaxy.yml
index 82b4ded..cf6dd31 100644
--- a/galaxy.yml
+++ b/galaxy.yml
@@ -10,6 +10,7 @@
 dependencies:
   ansible.netcommon: 1.2.0
   ansible.posix: 1.3.0
+  ansible.utils: 2.9.0
   community.crypto: 2.2.3
   community.general: 4.5.0
   kubernetes.core: 2.3.2
diff --git a/roles/rabbitmq/defaults/main.yml b/roles/rabbitmq/defaults/main.yml
new file mode 100644
index 0000000..c630933
--- /dev/null
+++ b/roles/rabbitmq/defaults/main.yml
@@ -0,0 +1,18 @@
+# Copyright (c) 2022 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Skip printing a diff of the RabbitMQ cluster spec and accept all changes.
+rabbitmq_skip_spec_diff: false
+
+rabbitmq_spec: {}
diff --git a/roles/rabbitmq/tasks/main.yml b/roles/rabbitmq/tasks/main.yml
index 2cc5468..6e0872d 100644
--- a/roles/rabbitmq/tasks/main.yml
+++ b/roles/rabbitmq/tasks/main.yml
@@ -12,6 +12,30 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+- name: Verify state of current RabbitMQ cluster
+  kubernetes.core.k8s_info:
+    api_version: rabbitmq.com/v1beta1
+    kind: RabbitmqCluster
+    name: "rabbitmq-{{ rabbitmq_cluster_name }}"
+    namespace: openstack
+  register: _rabbitmq_cluster
+
+- name: Wait for confirmation if RabbitMQ cluster spec doesn't match
+  when:
+    - not rabbitmq_skip_spec_diff | bool
+    - _rabbitmq_cluster.resources | length > 0
+    - _rabbitmq_cluster.resources[0].spec != _rabbitmq_merged_spec
+  vars:
+    _rabbitmq_merged_spec: "{{ _rabbitmq_spec | combine(rabbitmq_spec, recursive=True) }}"
+  block:
+    - name: Print diff of RabbitMQ cluster spec
+      ansible.utils.fact_diff:
+        before: "{{ _rabbitmq_cluster.resources[0].spec }}"
+        after: "{{ _rabbitmq_merged_spec }}"
+
+    - name: Wait for confirmation of RabbitMQ cluster spec
+      ansible.builtin.pause:
+
 - name: Deploy cluster
   kubernetes.core.k8s:
     state: present
@@ -21,28 +45,7 @@
       metadata:
         name: "rabbitmq-{{ rabbitmq_cluster_name }}"
         namespace: openstack
-      spec:
-        image: "{{ atmosphere_images['rabbitmq_server'] | vexxhost.atmosphere.docker_image('ref') }}"
-        affinity:
-          nodeAffinity:
-            requiredDuringSchedulingIgnoredDuringExecution:
-              nodeSelectorTerms:
-                - matchExpressions:
-                    - key: openstack-control-plane
-                      operator: In
-                      values:
-                        - enabled
-        rabbitmq:
-          additionalConfig: |
-            vm_memory_high_watermark.relative = 0.9
-        resources:
-          limits:
-            cpu: "1"
-            memory: 2Gi
-          requests:
-            cpu: 500m
-            memory: 1Gi
-        terminationGracePeriodSeconds: 15
+      spec: "{{ _rabbitmq_spec | combine(rabbitmq_spec, recursive=True) }}"
     wait: true
     wait_timeout: 600
     wait_condition:
diff --git a/roles/rabbitmq/vars/main.yml b/roles/rabbitmq/vars/main.yml
new file mode 100644
index 0000000..616d069
--- /dev/null
+++ b/roles/rabbitmq/vars/main.yml
@@ -0,0 +1,44 @@
+# Copyright (c) 2022 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+_rabbitmq_spec:
+  image: "{{ atmosphere_images['rabbitmq_server'] | vexxhost.atmosphere.docker_image('ref') }}"
+  affinity:
+    nodeAffinity:
+      requiredDuringSchedulingIgnoredDuringExecution:
+        nodeSelectorTerms:
+          - matchExpressions:
+              - key: openstack-control-plane
+                operator: In
+                values:
+                  - enabled
+  override: {}
+  persistence:
+    storage: 10Gi
+  rabbitmq:
+    additionalConfig: |
+      vm_memory_high_watermark.relative = 0.9
+  replicas: 1
+  resources:
+    limits:
+      cpu: "1"
+      memory: 2Gi
+    requests:
+      cpu: 500m
+      memory: 1Gi
+  secretBackend: {}
+  service:
+    type: ClusterIP
+  terminationGracePeriodSeconds: 15
+  tls: {}