feat: pre-pull ovn-controller image

Closes-Bug: ATMOSPHERE-634
Depends-On: I0b15142aabab38fafab829a16cee0297b749e6e8
Change-Id: I2661648efde71b38be3c2ed32ef3375e8c7dae51
(cherry picked from commit bc6a06bfbb4133f6e8295ad5953bd2fe8c3d86d6)
diff --git a/playbooks/openstack.yml b/playbooks/openstack.yml
index ffd5322..abd5843 100644
--- a/playbooks/openstack.yml
+++ b/playbooks/openstack.yml
@@ -79,7 +79,7 @@
       tags:
         - iscsi
 
-- name: Deploy Open vSwitch
+- name: Deploy SDN
   hosts: controllers:computes
   become: true
   gather_facts: false
@@ -88,13 +88,13 @@
       tags:
         - openvswitch
 
-- hosts: controllers[0]
-  become: true
-  roles:
     - role: ovn
       tags:
         - ovn
 
+- hosts: controllers[0]
+  become: true
+  roles:
     - role: libvirt
       tags:
         - libvirt
diff --git a/releasenotes/notes/prepull-ovn-controller-62f8a216e8b41c9f.yaml b/releasenotes/notes/prepull-ovn-controller-62f8a216e8b41c9f.yaml
new file mode 100644
index 0000000..6d01476
--- /dev/null
+++ b/releasenotes/notes/prepull-ovn-controller-62f8a216e8b41c9f.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - The ``ovn-controller`` image is now being pre-pulled on the nodes prior
+    to the Helm chart being deployed.  This will help reduce the time it takes
+    to switch over to the new version of the ``ovn-controller`` image.
diff --git a/roles/ovn/tasks/main.yml b/roles/ovn/tasks/main.yml
index b3d8f76..69430e8 100644
--- a/roles/ovn/tasks/main.yml
+++ b/roles/ovn/tasks/main.yml
@@ -38,6 +38,21 @@
         - _ovn_controller_ds_info.resources | length > 0
         - "'type' in _ovn_controller_ds_info.resources[0].spec.selector.matchLabels"
 
+- name: Cache ovn-controller image before install or upgrade
+  block:
+    - name: Pull ovn-controller image
+      ansible.builtin.command: crictl pull {{ atmosphere_images['ovn_controller'] }}
+      register: pull_result
+      changed_when: false
+
+    - name: Verify ovn-controller image pull
+      ansible.builtin.assert:
+        that:
+          - pull_result.rc == 0
+          - "'Image is up to date' in pull_result.stdout or 'Image pulled' in pull_result.stdout"
+        fail_msg: "Failed to pull ovn-controller image"
+        success_msg: "Successfully pulled ovn-controller image"
+
 - name: Deploy Helm chart
   run_once: true
   when: atmosphere_network_backend == 'ovn'