Merge "Revert "Bump helm-toolkit to 0.2.78 (#2264)"" into main
diff --git a/build/lint-jobs.py b/build/lint-jobs.py
index 3edfe12..7233dd3 100644
--- a/build/lint-jobs.py
+++ b/build/lint-jobs.py
@@ -14,11 +14,8 @@
             if "job" in config:
                 job = config["job"]
 
-                # Check if build or upload jobs are missing 'atmosphere-buildset-registry' dependency
-                if (
-                    "build-container-image-" in job["name"]
-                    or "upload-container-image-" in job["name"]
-                ):
+                # Check if build jobs are missing 'atmosphere-buildset-registry' dependency
+                if "build-container-image-" in job["name"]:
                     deps = job.get("dependencies", [])
                     if not any(
                         dep.get("name") == "atmosphere-buildset-registry"
@@ -30,9 +27,7 @@
                         passed = False
 
     if passed:
-        print(
-            "All build and upload jobs have 'atmosphere-buildset-registry' dependency."
-        )
+        print("All build jobs have 'atmosphere-buildset-registry' dependency.")
     else:
         print("Jobs missing 'atmosphere-buildset-registry' dependency.")
         sys.exit(1)
diff --git a/build/pin-images.py b/build/pin-images.py
index f7485da..30700c3 100755
--- a/build/pin-images.py
+++ b/build/pin-images.py
@@ -22,7 +22,7 @@
     if token:
         headers["Authorization"] = f"Bearer {token}"
     else:
-        r = requests.get(url, timeout=5, verify=False)
+        r = requests.get(url, timeout=5)
         auth_header = r.headers.get("Www-Authenticate")
         if auth_header:
             realm = auth_header.split(",")[0].split("=")[1].strip('"')
@@ -31,7 +31,6 @@
                 realm,
                 timeout=5,
                 params={"scope": f"repository:{image_ref.path()}:pull"},
-                verify=False,
             )
             r.raise_for_status()
 
@@ -44,7 +43,6 @@
             f"https://{image_ref.domain()}/v2/{image_ref.path()}/manifests/{image_ref['tag']}",
             timeout=5,
             headers=headers,
-            verify=False,
         )
         r.raise_for_status()
         return r.headers["Docker-Content-Digest"]
@@ -55,7 +53,6 @@
             f"https://{image_ref.domain()}/v2/{image_ref.path()}/manifests/{image_ref['tag']}",
             timeout=5,
             headers=headers,
-            verify=False,
         )
         r.raise_for_status()
         return r.headers["Docker-Content-Digest"]
@@ -64,6 +61,8 @@
 @functools.cache
 def get_pinned_image(image_src):
     image_ref = reference.Reference.parse(image_src)
+    if image_ref.domain() != "harbor.atmosphere.dev":
+        image_ref = reference.Reference.parse("harbor.atmosphere.dev/" + image_src)
 
     if (
         image_ref.domain() == "registry.atmosphere.dev"
@@ -130,7 +129,10 @@
     else:
         digest = get_digest(image_ref)
 
-    return f"{image_ref.domain()}/{image_ref.path()}:{image_ref['tag']}@{digest}"
+    original_ref = reference.Reference.parse(image_src)
+    return (
+        f"{original_ref.domain()}/{original_ref.path()}:{original_ref['tag']}@{digest}"
+    )
 
 
 def main():
@@ -154,13 +156,19 @@
         if image in SKIP_IMAGE_LIST:
             continue
 
-        image_src = data["_atmosphere_images"][image].replace(
-            "{{ atmosphere_release }}", data["atmosphere_release"]
+        image_src = (
+            data["_atmosphere_images"][image]
+            .replace("{{ atmosphere_release }}", data["atmosphere_release"])
+            .replace("{{ atmosphere_image_prefix }}", "")
         )
-        pinned_image = get_pinned_image(image_src)
+        pinned_image = get_pinned_image(image_src).replace(
+            "harbor.atmosphere.dev", "registry.atmosphere.dev"
+        )
 
         LOG.info("Pinning image %s from %s to %s", image, image_src, pinned_image)
-        data["_atmosphere_images"][image] = pinned_image
+        data["_atmosphere_images"][image] = "{{ atmosphere_image_prefix }}%s" % (
+            pinned_image,
+        )
 
     yaml.dump(data, args.dst)
 
diff --git a/charts/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl b/charts/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl
new file mode 100644
index 0000000..3df3315
--- /dev/null
+++ b/charts/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+{{/*
+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.
+*/}}
+
+set -ex
+
+{{- if and ( empty .Values.conf.neutron.DEFAULT.host ) ( .Values.pod.use_fqdn.neutron_agent ) }}
+mkdir -p /tmp/pod-shared
+tee > /tmp/pod-shared/neutron-agent.ini << EOF
+[DEFAULT]
+host = $(hostname --fqdn)
+EOF
+{{- end }}
diff --git a/charts/neutron/templates/configmap-bin.yaml b/charts/neutron/templates/configmap-bin.yaml
index 2032b15..87b2b79 100644
--- a/charts/neutron/templates/configmap-bin.yaml
+++ b/charts/neutron/templates/configmap-bin.yaml
@@ -95,6 +95,8 @@
 {{ tuple "bin/_neutron-policy-server.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
   neutron-rpc-server.sh: |
 {{ tuple "bin/_neutron-rpc-server.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
+  neutron-ironic-agent-init.sh: |
+{{ tuple "bin/_neutron-ironic-agent-init.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
   neutron-ironic-agent.sh: |
 {{ tuple "bin/_neutron-ironic-agent.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
   neutron-netns-cleanup-cron.sh: |
diff --git a/charts/neutron/templates/deployment-ironic-agent.yaml b/charts/neutron/templates/deployment-ironic-agent.yaml
index 014c9ad..1b468e2 100644
--- a/charts/neutron/templates/deployment-ironic-agent.yaml
+++ b/charts/neutron/templates/deployment-ironic-agent.yaml
@@ -60,6 +60,19 @@
       terminationGracePeriodSeconds: {{ .Values.pod.lifecycle.termination_grace_period.ironic_agent.timeout | default "30" }}
       initContainers:
 {{ tuple $envAll "pod_dependency" $mounts_neutron_ironic_agent_init | include "helm-toolkit.snippets.kubernetes_entrypoint_init_container" | indent 8 }}
+        - name: neutron-ironic-agent-init
+{{ tuple $envAll "neutron_ironic_agent_init" | include "helm-toolkit.snippets.image" | indent 10 }}
+{{ tuple $envAll $envAll.Values.pod.resources.ironic_agent | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
+{{ dict "envAll" $envAll "application" "neutron_ironic_agent" "container" "neutron_ironic_agent_init" | include "helm-toolkit.snippets.kubernetes_container_security_context" | indent 10 }}
+          command:
+            - /tmp/neutron-ironic-agent-init.sh
+          volumeMounts:
+            - name: pod-shared
+              mountPath: /tmp/pod-shared
+            - name: neutron-bin
+              mountPath: /tmp/neutron-ironic-agent-init.sh
+              subPath: neutron-ironic-agent-init.sh
+              readOnly: true
       containers:
         - name: neutron-ironic-agent
 {{ tuple $envAll "neutron_ironic_agent" | include "helm-toolkit.snippets.image" | indent 10 }}
@@ -79,6 +92,8 @@
               mountPath: /tmp
             - name: pod-var-neutron
               mountPath: {{ .Values.conf.neutron.DEFAULT.state_path }}
+            - name: pod-shared
+              mountPath: /tmp/pod-shared
             - name: neutron-bin
               mountPath: /tmp/neutron-ironic-agent.sh
               subPath: neutron-ironic-agent.sh
@@ -104,6 +119,8 @@
           emptyDir: {}
         - name: pod-var-neutron
           emptyDir: {}
+        - name: pod-shared
+          mountPath: /tmp/pod-shared
         - name: neutron-bin
           configMap:
             name: neutron-bin
diff --git a/charts/neutron/values.yaml b/charts/neutron/values.yaml
index 819d785..b1ff456 100644
--- a/charts/neutron/values.yaml
+++ b/charts/neutron/values.yaml
@@ -46,6 +46,7 @@
     neutron_sriov_agent_init: docker.io/openstackhelm/neutron:stein-18.04-sriov
     neutron_bagpipe_bgp: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
     neutron_bgp_dragent: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
+    neutron_ironic_agent_init: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
     neutron_ironic_agent: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
     neutron_netns_cleanup_cron: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
     dep_check: quay.io/airshipit/kubernetes-entrypoint:latest-ubuntu_focal
@@ -679,6 +680,9 @@
       pod:
         runAsUser: 42424
       container:
+        neutron_ironic_agent_init:
+          runAsUser: 0
+          readOnlyRootFilesystem: true
         neutron_ironic_agent:
           allowPrivilegeEscalation: false
           readOnlyRootFilesystem: true
diff --git a/charts/patches/neutron/0003-fix-neutron-ironic-agent.patch b/charts/patches/neutron/0003-fix-neutron-ironic-agent.patch
new file mode 100644
index 0000000..c112239
--- /dev/null
+++ b/charts/patches/neutron/0003-fix-neutron-ironic-agent.patch
@@ -0,0 +1,108 @@
+diff --git a/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl b/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl
+new file mode 100644
+index 00000000..3df3315b
+--- /dev/null
++++ b/neutron/templates/bin/_neutron-ironic-agent-init.sh.tpl
+@@ -0,0 +1,25 @@
++#!/bin/bash
++
++{{/*
++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.
++*/}}
++
++set -ex
++
++{{- if and ( empty .Values.conf.neutron.DEFAULT.host ) ( .Values.pod.use_fqdn.neutron_agent ) }}
++mkdir -p /tmp/pod-shared
++tee > /tmp/pod-shared/neutron-agent.ini << EOF
++[DEFAULT]
++host = $(hostname --fqdn)
++EOF
++{{- end }}
+diff --git a/neutron/templates/configmap-bin.yaml b/neutron/templates/configmap-bin.yaml
+index 2032b156..87b2b798 100644
+--- a/neutron/templates/configmap-bin.yaml
++++ b/neutron/templates/configmap-bin.yaml
+@@ -95,6 +95,8 @@ data:
+ {{ tuple "bin/_neutron-policy-server.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
+   neutron-rpc-server.sh: |
+ {{ tuple "bin/_neutron-rpc-server.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
++  neutron-ironic-agent-init.sh: |
++{{ tuple "bin/_neutron-ironic-agent-init.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
+   neutron-ironic-agent.sh: |
+ {{ tuple "bin/_neutron-ironic-agent.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }}
+   neutron-netns-cleanup-cron.sh: |
+diff --git a/neutron/templates/deployment-ironic-agent.yaml b/neutron/templates/deployment-ironic-agent.yaml
+index 014c9adf..1b468e2b 100644
+--- a/neutron/templates/deployment-ironic-agent.yaml
++++ b/neutron/templates/deployment-ironic-agent.yaml
+@@ -60,6 +60,19 @@ spec:
+       terminationGracePeriodSeconds: {{ .Values.pod.lifecycle.termination_grace_period.ironic_agent.timeout | default "30" }}
+       initContainers:
+ {{ tuple $envAll "pod_dependency" $mounts_neutron_ironic_agent_init | include "helm-toolkit.snippets.kubernetes_entrypoint_init_container" | indent 8 }}
++        - name: neutron-ironic-agent-init
++{{ tuple $envAll "neutron_ironic_agent_init" | include "helm-toolkit.snippets.image" | indent 10 }}
++{{ tuple $envAll $envAll.Values.pod.resources.ironic_agent | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
++{{ dict "envAll" $envAll "application" "neutron_ironic_agent" "container" "neutron_ironic_agent_init" | include "helm-toolkit.snippets.kubernetes_container_security_context" | indent 10 }}
++          command:
++            - /tmp/neutron-ironic-agent-init.sh
++          volumeMounts:
++            - name: pod-shared
++              mountPath: /tmp/pod-shared
++            - name: neutron-bin
++              mountPath: /tmp/neutron-ironic-agent-init.sh
++              subPath: neutron-ironic-agent-init.sh
++              readOnly: true
+       containers:
+         - name: neutron-ironic-agent
+ {{ tuple $envAll "neutron_ironic_agent" | include "helm-toolkit.snippets.image" | indent 10 }}
+@@ -79,6 +92,8 @@ spec:
+               mountPath: /tmp
+             - name: pod-var-neutron
+               mountPath: {{ .Values.conf.neutron.DEFAULT.state_path }}
++            - name: pod-shared
++              mountPath: /tmp/pod-shared
+             - name: neutron-bin
+               mountPath: /tmp/neutron-ironic-agent.sh
+               subPath: neutron-ironic-agent.sh
+@@ -104,6 +119,8 @@ spec:
+           emptyDir: {}
+         - name: pod-var-neutron
+           emptyDir: {}
++        - name: pod-shared
++          mountPath: /tmp/pod-shared
+         - name: neutron-bin
+           configMap:
+             name: neutron-bin
+diff --git a/neutron/values.yaml b/neutron/values.yaml
+index 819d7853..b1ff4569 100644
+--- a/neutron/values.yaml
++++ b/neutron/values.yaml
+@@ -46,6 +46,7 @@ images:
+     neutron_sriov_agent_init: docker.io/openstackhelm/neutron:stein-18.04-sriov
+     neutron_bagpipe_bgp: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
+     neutron_bgp_dragent: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
++    neutron_ironic_agent_init: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
+     neutron_ironic_agent: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
+     neutron_netns_cleanup_cron: docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy
+     dep_check: quay.io/airshipit/kubernetes-entrypoint:latest-ubuntu_focal
+@@ -679,6 +680,9 @@ pod:
+       pod:
+         runAsUser: 42424
+       container:
++        neutron_ironic_agent_init:
++          runAsUser: 0
++          readOnlyRootFilesystem: true
+         neutron_ironic_agent:
+           allowPrivilegeEscalation: false
+           readOnlyRootFilesystem: true
diff --git a/doc/source/admin/emulated-tpm.rst b/doc/source/admin/emulated-tpm.rst
index 5c1ea34..58f836d 100644
--- a/doc/source/admin/emulated-tpm.rst
+++ b/doc/source/admin/emulated-tpm.rst
@@ -59,14 +59,15 @@
 Image configuration
 -------------------
 
-You can also configure the vTPM on an image using the same properties. For example,
-to configure an image to use the TPM 2.0 with CRB model:
+You can also configure the vTPM on an image using the ``hw_tpm_version`` and
+``hw_tpm_model`` image metadata properties. For example, to configure an image
+to use the TPM 2.0 with CRB model:
 
 .. code-block:: console
 
  $ openstack image set <image-name-or-uuid> \
-     --property hw:tpm_version=2.0 \
-     --property hw:tpm_model=tpm-crb
+     --property hw_tpm_version=2.0 \
+     --property hw_tpm_model=tpm-crb
 
 This can be useful if you need to enable the vTPM feature without having operator
 access to the cloud or for specific images such as Windows versions that require
diff --git a/doc/source/release-notes.rst b/doc/source/release-notes.rst
index ec77acc..c8fc6d0 100644
--- a/doc/source/release-notes.rst
+++ b/doc/source/release-notes.rst
@@ -1 +1,18 @@
-.. release-notes:: Release Notes
+#############
+Release Notes
+#############
+
+.. release-notes:: Development Release
+   :branch: main
+
+.. release-notes:: OpenStack Caracal (2024.1)
+   :branch: stable/2024.1
+
+.. release-notes:: OpenStack Bobcat (2023.2)
+   :branch: stable/2023.2
+
+.. release-notes:: OpenStack Antelope (2023.1)
+   :branch: stable/2023.1
+
+.. release-notes:: OpenStack Zed
+   :branch: stable/zed
diff --git a/molecule/aio/group_vars/all/molecule.yml b/molecule/aio/group_vars/all/molecule.yml
index 74f9925..ac81243 100644
--- a/molecule/aio/group_vars/all/molecule.yml
+++ b/molecule/aio/group_vars/all/molecule.yml
@@ -1,3 +1,5 @@
+atmosphere_image_prefix: "{{ lookup('env', 'ATMOSPHERE_IMAGE_PREFIX') | default('', True) }}"
+
 ceph_conf_overrides:
   - section: global
     option: mon allow pool size one
diff --git a/playbooks/openstack.yml b/playbooks/openstack.yml
index e82693a..12c35e7 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/add-releasenotes-for-all-branches-a035b599afb29401.yaml b/releasenotes/notes/add-releasenotes-for-all-branches-a035b599afb29401.yaml
new file mode 100644
index 0000000..385400d
--- /dev/null
+++ b/releasenotes/notes/add-releasenotes-for-all-branches-a035b599afb29401.yaml
@@ -0,0 +1,4 @@
+---
+other:
+  - The documentation has been updated to include release notes for all of the
+    current supported Atmosphere releases.
diff --git a/releasenotes/notes/allow-prefix-to-image-names-4a795e9ff805b8b0.yaml b/releasenotes/notes/allow-prefix-to-image-names-4a795e9ff805b8b0.yaml
new file mode 100644
index 0000000..1c8a4ea
--- /dev/null
+++ b/releasenotes/notes/allow-prefix-to-image-names-4a795e9ff805b8b0.yaml
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    Introduced the ability to specify a prefix for image names. This allows for
+    easier integration with image proxies and caching mechanisms, eliminating
+    the need to maintain separate inventory overrides for each image.
diff --git a/releasenotes/notes/drop-extra-jobs-9d885e9f951c0f3f.yaml b/releasenotes/notes/drop-extra-jobs-9d885e9f951c0f3f.yaml
new file mode 100644
index 0000000..0a5131a
--- /dev/null
+++ b/releasenotes/notes/drop-extra-jobs-9d885e9f951c0f3f.yaml
@@ -0,0 +1,5 @@
+---
+other:
+  - The ``upload`` jobs have been removed from the ``gate`` pipeline and
+    replaced by the same ``build`` jobs since we use the intermediate
+    registry to store the images.
diff --git a/releasenotes/notes/fix-neutron-ironic-agent-f3eedbcec84b0478.yaml b/releasenotes/notes/fix-neutron-ironic-agent-f3eedbcec84b0478.yaml
new file mode 100644
index 0000000..773ef1b
--- /dev/null
+++ b/releasenotes/notes/fix-neutron-ironic-agent-f3eedbcec84b0478.yaml
@@ -0,0 +1,4 @@
+---
+fixes:
+  - |
+    Fixed an issue where the ``neutron-ironic-agent`` service failed to start.
diff --git a/releasenotes/notes/fix-pin-images-473f8e1cf4a81afc.yaml b/releasenotes/notes/fix-pin-images-473f8e1cf4a81afc.yaml
new file mode 100644
index 0000000..d3dc373
--- /dev/null
+++ b/releasenotes/notes/fix-pin-images-473f8e1cf4a81afc.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+  - The CI tooling for pinning images has been fixed to properly work after a
+    regression caused by the introduction of the ``atmosphere_image_prefix``
+    variable.
diff --git a/releasenotes/notes/fix-tpm-docs-d4cc722764f61032.yaml b/releasenotes/notes/fix-tpm-docs-d4cc722764f61032.yaml
new file mode 100644
index 0000000..59861b8
--- /dev/null
+++ b/releasenotes/notes/fix-tpm-docs-d4cc722764f61032.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+  - The documentation for using the vTPM was pointing to the incorrect
+    metadata properties for images.  This has been corrected to point to the
+    correct metadata properties.
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/releasenotes/notes/skip-releasenotes-acb170de807b80bc.yaml b/releasenotes/notes/skip-releasenotes-acb170de807b80bc.yaml
new file mode 100644
index 0000000..bd4f4e8
--- /dev/null
+++ b/releasenotes/notes/skip-releasenotes-acb170de807b80bc.yaml
@@ -0,0 +1,3 @@
+---
+other:
+  - The heavy CI jobs are now skipped when release notes are changed.
diff --git a/roles/defaults/defaults/main.yml b/roles/defaults/defaults/main.yml
index ba672af..cd54fc9 100644
--- a/roles/defaults/defaults/main.yml
+++ b/roles/defaults/defaults/main.yml
@@ -18,6 +18,7 @@
 atmosphere_ingress_class_name: atmosphere
 atmosphere_ingress_cluster_issuer: atmosphere
 atmosphere_ingress_annotations: {}
+atmosphere_image_prefix: ""
 
 # Network backend
 atmosphere_network_backend: openvswitch
diff --git a/roles/defaults/vars.go b/roles/defaults/vars.go
index 0799e7d..38b6b22 100644
--- a/roles/defaults/vars.go
+++ b/roles/defaults/vars.go
@@ -16,14 +16,13 @@
 // Define a global variable for the release value.
 var release = "main"
 
-// Function to replace the {{ release }} placeholders
-func replaceReleaseInYAML(yamlContent []byte, release string) []byte {
-	return []byte(strings.ReplaceAll(string(yamlContent), "{{ atmosphere_release }}", release))
-}
-
 func GetImages() (map[string]string, error) {
 	// Replace {{ release }} with the actual release value
-	modifiedVarsFile := replaceReleaseInYAML(varsFile, release)
+	modifiedVarsFile := []byte(strings.ReplaceAll(string(varsFile), "{{ atmosphere_release }}", release))
+
+	// Fix prefixes for images to allow tests to run
+	modifiedVarsFile = []byte(strings.ReplaceAll(string(modifiedVarsFile), "{{ atmosphere_image_prefix }}registry.atmosphere.dev", "harbor.atmosphere.dev"))
+	modifiedVarsFile = []byte(strings.ReplaceAll(string(modifiedVarsFile), "{{ atmosphere_image_prefix }}", "harbor.atmosphere.dev/"))
 
 	path, err := yaml.PathString("$._atmosphere_images")
 	if err != nil {
diff --git a/roles/defaults/vars/main.yml b/roles/defaults/vars/main.yml
index 93fad33..cf83407 100644
--- a/roles/defaults/vars/main.yml
+++ b/roles/defaults/vars/main.yml
@@ -15,214 +15,214 @@
 atmosphere_release: main
 
 _atmosphere_images:
-  alertmanager: quay.io/prometheus/alertmanager:v0.27.0
-  barbican_api: "registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
-  barbican_db_sync: "registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
-  bootstrap: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  ceph_config_helper: "registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
-  ceph: quay.io/ceph/ceph:v18.2.2
-  cert_manager_cainjector: quay.io/jetstack/cert-manager-cainjector:v1.12.10
-  cert_manager_cli: quay.io/jetstack/cert-manager-ctl:v1.12.10
-  cert_manager_controller: quay.io/jetstack/cert-manager-controller:v1.12.10
-  cert_manager_webhook: quay.io/jetstack/cert-manager-webhook:v1.12.10
-  cert_manager_acmesolver: quay.io/jetstack/cert-manager-acmesolver:v1.12.10
-  cilium_node: quay.io/cilium/cilium:v1.14.8
-  cilium_operator: quay.io/cilium/operator-generic:v1.14.8
-  cinder_api: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_backup_storage_init: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_backup: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_db_sync: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_scheduler: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_storage_init: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_volume_usage_audit: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cinder_volume: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
-  cluster_api_controller: registry.k8s.io/cluster-api/cluster-api-controller:v1.8.4
-  cluster_api_kubeadm_bootstrap_controller: registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:v1.8.4
-  cluster_api_kubeadm_control_plane_controller: registry.k8s.io/cluster-api/kubeadm-control-plane-controller:v1.8.4
-  cluster_api_openstack_controller: registry.k8s.io/capi-openstack/capi-openstack-controller:v0.11.2
-  csi_node_driver_registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0
-  csi_rbd_attacher: registry.k8s.io/sig-storage/csi-attacher:v4.5.0
-  csi_rbd_plugin: quay.io/cephcsi/cephcsi:v3.11.0
-  csi_rbd_provisioner: registry.k8s.io/sig-storage/csi-provisioner:v4.0.0
-  csi_rbd_resizer: registry.k8s.io/sig-storage/csi-resizer:v1.10.0
-  csi_rbd_snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v7.0.0
-  db_drop: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  db_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  dep_check: "registry.atmosphere.dev/library/kubernetes-entrypoint:{{ atmosphere_release }}"
-  designate_api: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_central: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_db_sync: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_mdns: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_producer: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_sink: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  designate_worker: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
-  glance_api: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
-  glance_db_sync: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
-  glance_metadefs_load: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
-  glance_registry: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
-  glance_storage_init: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
-  grafana_sidecar: quay.io/kiwigrid/k8s-sidecar:1.26.1
-  grafana: docker.io/grafana/grafana:11.0.0
-  goldpinger: docker.io/bloomberg/goldpinger:3.10.1
-  haproxy: docker.io/library/haproxy:2.5
-  heat_api: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_cfn: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_cloudwatch: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_db_sync: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_engine_cleaner: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_engine: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  heat_purge_deleted: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  horizon_db_sync: "registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
-  horizon: "registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
-  ibm_block_csi_addons_replicator: quay.io/ibmcsiblock/csi-block-volumereplication-operator:v0.9.0
-  ibm_block_csi_attacher: registry.k8s.io/sig-storage/csi-attacher:v4.2.0
-  ibm_block_csi_driver_controller: quay.io/ibmcsiblock/ibm-block-csi-driver-controller:1.11.2
-  ibm_block_csi_driver_node: quay.io/ibmcsiblock/ibm-block-csi-driver-node:1.11.2
-  ibm_block_csi_node_driver_registrar: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.6.3
-  ibm_block_csi_livenessprobe: registry.k8s.io/sig-storage/livenessprobe:v2.9.0
-  ibm_block_csi_operator: quay.io/ibmcsiblock/ibm-block-csi-operator:1.11.2
-  ibm_block_csi_provisioner: registry.k8s.io/sig-storage/csi-provisioner:v3.4.0
-  ibm_block_csi_resizer: registry.k8s.io/sig-storage/csi-resizer:v1.7.0
-  ibm_block_csi_snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v6.2.1
-  ibm_block_csi_volume_group: quay.io/ibmcsiblock/csi-volume-group-operator:v0.9.1
-  ingress_nginx_controller: registry.k8s.io/ingress-nginx/controller:v1.10.1
-  ingress_nginx_default_backend: registry.k8s.io/defaultbackend-amd64:1.5
-  ingress_nginx_kube_webhook_certgen: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1
-  ironic_api: "registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
-  ironic_conductor: "registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
-  ironic_db_sync: "registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
-  ironic_manage_cleaning_network: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  ironic_pxe_http: docker.io/library/nginx:1.25
-  ironic_pxe_init: "registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
-  ironic_pxe: "registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
-  ironic_retrive_cleaning_network: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  ironic_retrive_swift_config: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  keepalived: "registry.atmosphere.dev/library/keepalived:{{ atmosphere_release }}"
-  keycloak: quay.io/keycloak/keycloak:24.0.5-0
-  keystone_api: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  keystone_credential_cleanup: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  keystone_credential_rotate: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  keystone_credential_setup: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  keystone_db_sync: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  keystone_domain_manage: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  keystone_fernet_rotate: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  keystone_fernet_setup: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
-  ks_endpoints: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  ks_service: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  ks_user: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  kube_apiserver: registry.k8s.io/kube-apiserver:v1.22.17
-  kube_controller_manager: registry.k8s.io/kube-controller-manager:v1.22.17
-  kube_coredns: registry.k8s.io/coredns/coredns:v1.8.4
-  kube_etcd: registry.k8s.io/etcd:3.5.6-0
-  kube_proxy: registry.k8s.io/kube-proxy:v1.22.17
-  kube_scheduler: registry.k8s.io/kube-scheduler:v1.22.17
-  kube_state_metrics: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0
-  kube_vip: ghcr.io/kube-vip/kube-vip:v0.6.4
-  kubectl: docker.io/bitnami/kubectl:1.27.3
-  libvirt: "registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
-  libvirt_tls_sidecar: registry.atmosphere.dev/library/libvirt-tls-sidecar:latest
-  libvirt_exporter: registry.atmosphere.dev/library/libvirtd-exporter:latest
-  local_path_provisioner_helper: docker.io/library/busybox:1.36.0
-  local_path_provisioner: docker.io/rancher/local-path-provisioner:v0.0.24
-  loki_gateway: docker.io/nginxinc/nginx-unprivileged:1.24-alpine
-  loki: docker.io/grafana/loki:3.0.0
-  magnum_api: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
-  magnum_cluster_api_proxy: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
-  magnum_conductor: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
-  magnum_db_sync: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
-  magnum_registry: quay.io/vexxhost/magnum-cluster-api-registry:latest
-  manila_api: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
-  manila_data: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
-  manila_db_sync: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
-  manila_scheduler: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
-  manila_share: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
-  memcached: docker.io/library/memcached:1.6.26
-  netoffload: "registry.atmosphere.dev/library/netoffload:{{ atmosphere_release }}"
-  neutron_bagpipe_bgp: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_bgp_dragent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_coredns: docker.io/coredns/coredns:1.11.1
-  neutron_db_sync: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_dhcp: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_ironic_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_l2gw: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_l3: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_linuxbridge_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_metadata: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_netns_cleanup_cron: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_openvswitch_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_ovn_metadata: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_ovn_vpn: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_server: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_rpc_server: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_sriov_agent_init: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_sriov_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  neutron_policy_server: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  node_feature_discovery: registry.k8s.io/nfd/node-feature-discovery:v0.15.4
-  nova_api: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_archive_deleted_rows: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_cell_setup_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  nova_cell_setup: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_compute_ironic: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_compute_ssh: "registry.atmosphere.dev/library/nova-ssh:{{ atmosphere_release }}"
-  nova_compute: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_conductor: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_consoleauth: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_db_sync: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_novncproxy_assets: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_novncproxy: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_placement: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_scheduler: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_service_cleaner: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  nova_spiceproxy_assets: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_spiceproxy: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
-  nova_storage_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  oauth2_proxy: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
-  octavia_api: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
-  octavia_db_sync: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
-  octavia_health_manager_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
-  octavia_health_manager: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
-  octavia_housekeeping: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
-  octavia_worker: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
-  openstack_cli: "registry.atmosphere.dev/library/python-openstackclient:{{ atmosphere_release }}"
-  openvswitch_db_server: "registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
-  openvswitch_vswitchd: "registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
-  ovn_controller: "registry.atmosphere.dev/library/ovn-host:{{ atmosphere_release }}"
-  ovn_controller_kubectl: "registry.atmosphere.dev/library/ovn-host:{{ atmosphere_release }}"
-  ovn_logging_parser: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
-  ovn_northd: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
-  ovn_ovsdb_nb: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
-  ovn_ovsdb_sb: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
-  pause: registry.k8s.io/pause:3.9
-  percona_xtradb_cluster_haproxy: docker.io/percona/percona-xtradb-cluster-operator:1.14.0-haproxy
-  percona_xtradb_cluster_operator: docker.io/percona/percona-xtradb-cluster-operator:1.14.0
-  percona_xtradb_cluster: docker.io/percona/percona-xtradb-cluster:8.0.36-28.1
-  percona_version_service: docker.io/perconalab/version-service:production-2048c1f
-  placement_db_sync: "registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
-  placement: "registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
-  pod_tls_sidecar: registry.atmosphere.dev/library/pod-tls-sidecar:latest
-  prometheus_config_reloader: quay.io/prometheus-operator/prometheus-config-reloader:v0.73.0
-  prometheus_ipmi_exporter: us-docker.pkg.dev/vexxhost-infra/openstack/ipmi-exporter:1.4.0
-  prometheus_memcached_exporter: quay.io/prometheus/memcached-exporter:v0.14.3
-  prometheus_mysqld_exporter: quay.io/prometheus/mysqld-exporter:v0.15.1
-  prometheus_node_exporter: quay.io/prometheus/node-exporter:v1.8.1
-  prometheus_openstack_database_exporter: ghcr.io/vexxhost/openstack-database-exporter:v0.4.2
-  prometheus_openstack_exporter: ghcr.io/openstack-exporter/openstack-exporter:1.7.0
-  prometheus_operator_kube_webhook_certgen: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20221220-controller-v1.5.1-58-g787ea74b6
-  prometheus_operator: quay.io/prometheus-operator/prometheus-operator:v0.74.0
-  prometheus_pushgateway: docker.io/prom/pushgateway:v1.8.0
-  prometheus: quay.io/prometheus/prometheus:v2.51.2
-  rabbit_init: docker.io/library/rabbitmq:3.13.3-management
-  rabbitmq_cluster_operator: docker.io/rabbitmqoperator/cluster-operator:2.9.0
-  rabbitmq_credential_updater: docker.io/rabbitmqoperator/default-user-credential-updater:1.0.4
-  rabbitmq_server: docker.io/library/rabbitmq:3.13.3-management
-  rabbitmq_topology_operator: docker.io/rabbitmqoperator/messaging-topology-operator:1.14.1
-  rook_ceph: docker.io/rook/ceph:v1.14.5
-  secretgen_controller: ghcr.io/carvel-dev/secretgen-controller@sha256:59ec05ce5847bfd70c8e04f08b5195e918c8f6fbb947ffc91b456494a2958fd5
-  staffeln_db_sync: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
-  staffeln_conductor: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
-  staffeln_api: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
-  tempest_run_tests: "registry.atmosphere.dev/library/tempest:{{ atmosphere_release }}"
-  vector: docker.io/timberio/vector:0.38.0-debian
+  alertmanager: "{{ atmosphere_image_prefix }}quay.io/prometheus/alertmanager:v0.27.0"
+  barbican_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
+  barbican_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
+  bootstrap: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ceph_config_helper: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
+  ceph: "{{ atmosphere_image_prefix }}quay.io/ceph/ceph:v18.2.2"
+  cert_manager_cainjector: "{{ atmosphere_image_prefix }}quay.io/jetstack/cert-manager-cainjector:v1.12.10"
+  cert_manager_cli: "{{ atmosphere_image_prefix }}quay.io/jetstack/cert-manager-ctl:v1.12.10"
+  cert_manager_controller: "{{ atmosphere_image_prefix }}quay.io/jetstack/cert-manager-controller:v1.12.10"
+  cert_manager_webhook: "{{ atmosphere_image_prefix }}quay.io/jetstack/cert-manager-webhook:v1.12.10"
+  cert_manager_acmesolver: "{{ atmosphere_image_prefix }}quay.io/jetstack/cert-manager-acmesolver:v1.12.10"
+  cilium_node: "{{ atmosphere_image_prefix }}quay.io/cilium/cilium:v1.14.8"
+  cilium_operator: "{{ atmosphere_image_prefix }}quay.io/cilium/operator-generic:v1.14.8"
+  cinder_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_backup_storage_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_backup: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_scheduler: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_storage_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_volume_usage_audit: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_volume: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cluster_api_controller: "{{ atmosphere_image_prefix }}registry.k8s.io/cluster-api/cluster-api-controller:v1.8.4"
+  cluster_api_kubeadm_bootstrap_controller: "{{ atmosphere_image_prefix }}registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:v1.8.4"
+  cluster_api_kubeadm_control_plane_controller: "{{ atmosphere_image_prefix }}registry.k8s.io/cluster-api/kubeadm-control-plane-controller:v1.8.4"
+  cluster_api_openstack_controller: "{{ atmosphere_image_prefix }}registry.k8s.io/capi-openstack/capi-openstack-controller:v0.11.2"
+  csi_node_driver_registrar: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.10.0"
+  csi_rbd_attacher: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-attacher:v4.5.0"
+  csi_rbd_plugin: "{{ atmosphere_image_prefix }}quay.io/cephcsi/cephcsi:v3.11.0"
+  csi_rbd_provisioner: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-provisioner:v4.0.0"
+  csi_rbd_resizer: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-resizer:v1.10.0"
+  csi_rbd_snapshotter: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-snapshotter:v7.0.0"
+  db_drop: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  db_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  dep_check: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/kubernetes-entrypoint:{{ atmosphere_release }}"
+  designate_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_central: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_mdns: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_producer: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_sink: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_worker: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  glance_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_metadefs_load: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_registry: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_storage_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  grafana_sidecar: "{{ atmosphere_image_prefix }}quay.io/kiwigrid/k8s-sidecar:1.26.1"
+  grafana: "{{ atmosphere_image_prefix }}docker.io/grafana/grafana:11.0.0"
+  goldpinger: "{{ atmosphere_image_prefix }}docker.io/bloomberg/goldpinger:3.10.1"
+  haproxy: "{{ atmosphere_image_prefix }}docker.io/library/haproxy:2.5"
+  heat_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_cfn: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_cloudwatch: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_engine_cleaner: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_engine: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_purge_deleted: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  horizon_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
+  horizon: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
+  ibm_block_csi_addons_replicator: "{{ atmosphere_image_prefix }}quay.io/ibmcsiblock/csi-block-volumereplication-operator:v0.9.0"
+  ibm_block_csi_attacher: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-attacher:v4.2.0"
+  ibm_block_csi_driver_controller: "{{ atmosphere_image_prefix }}quay.io/ibmcsiblock/ibm-block-csi-driver-controller:1.11.2"
+  ibm_block_csi_driver_node: "{{ atmosphere_image_prefix }}quay.io/ibmcsiblock/ibm-block-csi-driver-node:1.11.2"
+  ibm_block_csi_node_driver_registrar: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.6.3"
+  ibm_block_csi_livenessprobe: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/livenessprobe:v2.9.0"
+  ibm_block_csi_operator: "{{ atmosphere_image_prefix }}quay.io/ibmcsiblock/ibm-block-csi-operator:1.11.2"
+  ibm_block_csi_provisioner: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-provisioner:v3.4.0"
+  ibm_block_csi_resizer: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-resizer:v1.7.0"
+  ibm_block_csi_snapshotter: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-snapshotter:v6.2.1"
+  ibm_block_csi_volume_group: "{{ atmosphere_image_prefix }}quay.io/ibmcsiblock/csi-volume-group-operator:v0.9.1"
+  ingress_nginx_controller: "{{ atmosphere_image_prefix }}registry.k8s.io/ingress-nginx/controller:v1.10.1"
+  ingress_nginx_default_backend: "{{ atmosphere_image_prefix }}registry.k8s.io/defaultbackend-amd64:1.5"
+  ingress_nginx_kube_webhook_certgen: "{{ atmosphere_image_prefix }}registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1"
+  ironic_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
+  ironic_conductor: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
+  ironic_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
+  ironic_manage_cleaning_network: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ironic_pxe_http: "{{ atmosphere_image_prefix }}docker.io/library/nginx:1.25"
+  ironic_pxe_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
+  ironic_pxe: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ironic:{{ atmosphere_release }}"
+  ironic_retrive_cleaning_network: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ironic_retrive_swift_config: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  keepalived: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keepalived:{{ atmosphere_release }}"
+  keycloak: "{{ atmosphere_image_prefix }}quay.io/keycloak/keycloak:24.0.5-0"
+  keystone_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_credential_cleanup: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  keystone_credential_rotate: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_credential_setup: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_domain_manage: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  keystone_fernet_rotate: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_fernet_setup: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  ks_endpoints: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ks_service: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ks_user: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  kube_apiserver: "{{ atmosphere_image_prefix }}registry.k8s.io/kube-apiserver:v1.22.17"
+  kube_controller_manager: "{{ atmosphere_image_prefix }}registry.k8s.io/kube-controller-manager:v1.22.17"
+  kube_coredns: "{{ atmosphere_image_prefix }}registry.k8s.io/coredns/coredns:v1.8.4"
+  kube_etcd: "{{ atmosphere_image_prefix }}registry.k8s.io/etcd:3.5.6-0"
+  kube_proxy: "{{ atmosphere_image_prefix }}registry.k8s.io/kube-proxy:v1.22.17"
+  kube_scheduler: "{{ atmosphere_image_prefix }}registry.k8s.io/kube-scheduler:v1.22.17"
+  kube_state_metrics: "{{ atmosphere_image_prefix }}registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0"
+  kube_vip: "{{ atmosphere_image_prefix }}ghcr.io/kube-vip/kube-vip:v0.6.4"
+  kubectl: "{{ atmosphere_image_prefix }}docker.io/bitnami/kubectl:1.27.3"
+  libvirt: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
+  libvirt_tls_sidecar: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/libvirt-tls-sidecar:latest"
+  libvirt_exporter: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/libvirtd-exporter:latest"
+  local_path_provisioner_helper: "{{ atmosphere_image_prefix }}docker.io/library/busybox:1.36.0"
+  local_path_provisioner: "{{ atmosphere_image_prefix }}docker.io/rancher/local-path-provisioner:v0.0.24"
+  loki_gateway: "{{ atmosphere_image_prefix }}docker.io/nginxinc/nginx-unprivileged:1.24-alpine"
+  loki: "{{ atmosphere_image_prefix }}docker.io/grafana/loki:3.0.0"
+  magnum_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_cluster_api_proxy: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_conductor: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_registry: "{{ atmosphere_image_prefix }}quay.io/vexxhost/magnum-cluster-api-registry:latest"
+  manila_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_data: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_scheduler: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_share: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  memcached: "{{ atmosphere_image_prefix }}docker.io/library/memcached:1.6.26"
+  netoffload: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/netoffload:{{ atmosphere_release }}"
+  neutron_bagpipe_bgp: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_bgp_dragent: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_coredns: "{{ atmosphere_image_prefix }}docker.io/coredns/coredns:1.11.1"
+  neutron_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_dhcp: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ironic_agent_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ironic_agent: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_l2gw: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_l3: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_linuxbridge_agent: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_metadata: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_netns_cleanup_cron: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_openvswitch_agent: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ovn_metadata: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ovn_vpn: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_server: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_rpc_server: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_sriov_agent_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_sriov_agent: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_policy_server: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  node_feature_discovery: "{{ atmosphere_image_prefix }}registry.k8s.io/nfd/node-feature-discovery:v0.15.4"
+  nova_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_archive_deleted_rows: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_cell_setup_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  nova_cell_setup: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_compute_ironic: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_compute_ssh: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova-ssh:{{ atmosphere_release }}"
+  nova_compute: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_conductor: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_consoleauth: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_novncproxy_assets: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_novncproxy: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_placement: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_scheduler: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_service_cleaner: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  nova_spiceproxy_assets: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_spiceproxy: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_storage_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  oauth2_proxy: "{{ atmosphere_image_prefix }}quay.io/oauth2-proxy/oauth2-proxy:v7.6.0"
+  octavia_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_health_manager_init: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  octavia_health_manager: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_housekeeping: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_worker: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  openstack_cli: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/python-openstackclient:{{ atmosphere_release }}"
+  openvswitch_db_server: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
+  openvswitch_vswitchd: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
+  ovn_controller: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ovn-host:{{ atmosphere_release }}"
+  ovn_controller_kubectl: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ovn-host:{{ atmosphere_release }}"
+  ovn_logging_parser: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  ovn_northd: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
+  ovn_ovsdb_nb: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
+  ovn_ovsdb_sb: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
+  pause: "{{ atmosphere_image_prefix }}registry.k8s.io/pause:3.9"
+  percona_xtradb_cluster_haproxy: "{{ atmosphere_image_prefix }}docker.io/percona/percona-xtradb-cluster-operator:1.14.0-haproxy"
+  percona_xtradb_cluster_operator: "{{ atmosphere_image_prefix }}docker.io/percona/percona-xtradb-cluster-operator:1.14.0"
+  percona_xtradb_cluster: "{{ atmosphere_image_prefix }}docker.io/percona/percona-xtradb-cluster:8.0.36-28.1"
+  percona_version_service: "{{ atmosphere_image_prefix }}docker.io/perconalab/version-service:production-2048c1f"
+  placement_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
+  placement: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
+  pod_tls_sidecar: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/pod-tls-sidecar:latest"
+  prometheus_config_reloader: "{{ atmosphere_image_prefix }}quay.io/prometheus-operator/prometheus-config-reloader:v0.73.0"
+  prometheus_ipmi_exporter: "{{ atmosphere_image_prefix }}us-docker.pkg.dev/vexxhost-infra/openstack/ipmi-exporter:1.4.0"
+  prometheus_memcached_exporter: "{{ atmosphere_image_prefix }}quay.io/prometheus/memcached-exporter:v0.14.3"
+  prometheus_mysqld_exporter: "{{ atmosphere_image_prefix }}quay.io/prometheus/mysqld-exporter:v0.15.1"
+  prometheus_node_exporter: "{{ atmosphere_image_prefix }}quay.io/prometheus/node-exporter:v1.8.1"
+  prometheus_openstack_database_exporter: "{{ atmosphere_image_prefix }}ghcr.io/vexxhost/openstack-database-exporter:v0.4.2"
+  prometheus_openstack_exporter: "{{ atmosphere_image_prefix }}ghcr.io/openstack-exporter/openstack-exporter:1.7.0"
+  prometheus_operator_kube_webhook_certgen: "{{ atmosphere_image_prefix }}registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20221220-controller-v1.5.1-58-g787ea74b6"
+  prometheus_operator: "{{ atmosphere_image_prefix }}quay.io/prometheus-operator/prometheus-operator:v0.74.0"
+  prometheus_pushgateway: "{{ atmosphere_image_prefix }}docker.io/prom/pushgateway:v1.8.0"
+  prometheus: "{{ atmosphere_image_prefix }}quay.io/prometheus/prometheus:v2.51.2"
+  rabbit_init: "{{ atmosphere_image_prefix }}docker.io/library/rabbitmq:3.13.3-management"
+  rabbitmq_cluster_operator: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/cluster-operator:2.9.0"
+  rabbitmq_credential_updater: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/default-user-credential-updater:1.0.4"
+  rabbitmq_server: "{{ atmosphere_image_prefix }}docker.io/library/rabbitmq:3.13.3-management"
+  rabbitmq_topology_operator: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/messaging-topology-operator:1.14.1"
+  rook_ceph: "{{ atmosphere_image_prefix }}docker.io/rook/ceph:v1.14.5"
+  secretgen_controller: "{{ atmosphere_image_prefix }}ghcr.io/carvel-dev/secretgen-controller@sha256:59ec05ce5847bfd70c8e04f08b5195e918c8f6fbb947ffc91b456494a2958fd5"
+  staffeln_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  staffeln_conductor: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  staffeln_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  tempest_run_tests: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/tempest:{{ atmosphere_release }}"
+  vector: "{{ atmosphere_image_prefix }}docker.io/timberio/vector:0.38.0-debian"
 
-atmosphere_images: '{{ _atmosphere_images | combine(atmosphere_image_overrides, recursive=True)
-  }}'
+atmosphere_images: '{{ _atmosphere_images | combine(atmosphere_image_overrides, recursive=True) }}'
diff --git a/roles/defaults/vars_test.go b/roles/defaults/vars_test.go
index 44e022d..3a8d231 100644
--- a/roles/defaults/vars_test.go
+++ b/roles/defaults/vars_test.go
@@ -1,6 +1,7 @@
 package defaults
 
 import (
+	"bytes"
 	"context"
 	"fmt"
 	"slices"
@@ -8,9 +9,30 @@
 	"testing"
 
 	"github.com/containers/image/v5/docker"
+	"github.com/goccy/go-yaml"
+	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
 
+func TestImageHasPrefix(t *testing.T) {
+	path, err := yaml.PathString("$._atmosphere_images")
+	require.NoError(t, err)
+
+	var images map[string]string
+	err = path.Read(bytes.NewReader(varsFile), &images)
+	require.NoError(t, err)
+
+	prefix := "{{ atmosphere_image_prefix }}"
+
+	for _, image := range images {
+		testName := strings.ReplaceAll(image, prefix, "")
+
+		t.Run(testName, func(t *testing.T) {
+			assert.True(t, strings.HasPrefix(image, prefix))
+		})
+	}
+}
+
 func TestImageExist(t *testing.T) {
 	images, err := GetImages()
 	require.NoError(t, err)
diff --git a/roles/ovn/tasks/main.yml b/roles/ovn/tasks/main.yml
index ea16a01..b0e7399 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'
diff --git a/tox.ini b/tox.ini
index c1051ce..daf186c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -21,7 +21,9 @@
   {posargs}
 
 [testenv:pin-digests]
+skip_install = true
 deps =
+  docker-image-py>=0.1.12
   oslo_config
   oslo_log
   ruyaml
diff --git a/zuul.d/container-images/barbican.yaml b/zuul.d/container-images/barbican.yaml
index e2ecc40..ca1f0c0 100644
--- a/zuul.d/container-images/barbican.yaml
+++ b/zuul.d/container-images/barbican.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-barbican
     gate:
       jobs:
-        - atmosphere-upload-container-image-barbican
+        - atmosphere-build-container-image-barbican
     promote:
       jobs:
         - atmosphere-promote-container-image-barbican
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-barbican
+      promote_container_image_job: atmosphere-build-container-image-barbican
       container_images:
         - context: images/barbican
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/barbican/.*
 
 - job:
-    name: atmosphere-upload-container-image-barbican
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-barbican
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/base.yaml b/zuul.d/container-images/base.yaml
index 7ff6bbb..5be0310 100644
--- a/zuul.d/container-images/base.yaml
+++ b/zuul.d/container-images/base.yaml
@@ -24,14 +24,18 @@
     name: atmosphere-buildset-registry
     parent: ci-buildset-registry
     irrelevant-files:
+      - ^build/
       - ^doc/
+      - ^releasenotes/
 
 - job:
     name: atmosphere-build-container-image
     parent: ci-build-container-image
     abstract: true
     irrelevant-files:
+      - ^build/
       - ^doc/
+      - ^releasenotes/
     vars: &image_vars
       container_command: docker
       promote_container_image_method: intermediate-registry
@@ -42,18 +46,12 @@
         - ['harbor.atmosphere.dev', 'https://harbor.atmosphere.dev']
 
 - job:
-    name: atmosphere-upload-container-image
-    parent: ci-upload-container-image
-    abstract: true
-    irrelevant-files:
-      - ^doc/
-    vars: *image_vars
-
-- job:
     name: atmosphere-promote-container-image
     parent: ci-promote-container-image
     irrelevant-files:
+      - ^build/
       - ^doc/
+      - ^releasenotes/
     nodeset:
       nodes: []
     vars: *image_vars
diff --git a/zuul.d/container-images/cinder.yaml b/zuul.d/container-images/cinder.yaml
index e039bda..e5393ba 100644
--- a/zuul.d/container-images/cinder.yaml
+++ b/zuul.d/container-images/cinder.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-cinder
     gate:
       jobs:
-        - atmosphere-upload-container-image-cinder
+        - atmosphere-build-container-image-cinder
     promote:
       jobs:
         - atmosphere-promote-container-image-cinder
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-cinder
+      promote_container_image_job: atmosphere-build-container-image-cinder
       container_images:
         - context: images/cinder
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/cinder/.*
 
 - job:
-    name: atmosphere-upload-container-image-cinder
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-cinder
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/designate.yaml b/zuul.d/container-images/designate.yaml
index fd02908..1f4b19b 100644
--- a/zuul.d/container-images/designate.yaml
+++ b/zuul.d/container-images/designate.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-designate
     gate:
       jobs:
-        - atmosphere-upload-container-image-designate
+        - atmosphere-build-container-image-designate
     promote:
       jobs:
         - atmosphere-promote-container-image-designate
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-designate
+      promote_container_image_job: atmosphere-build-container-image-designate
       container_images:
         - context: images/designate
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/designate/.*
 
 - job:
-    name: atmosphere-upload-container-image-designate
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-designate
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/glance.yaml b/zuul.d/container-images/glance.yaml
index 411b5a4..5cfc43c 100644
--- a/zuul.d/container-images/glance.yaml
+++ b/zuul.d/container-images/glance.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-glance
     gate:
       jobs:
-        - atmosphere-upload-container-image-glance
+        - atmosphere-build-container-image-glance
     promote:
       jobs:
         - atmosphere-promote-container-image-glance
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-glance
+      promote_container_image_job: atmosphere-build-container-image-glance
       container_images:
         - context: images/glance
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/glance/.*
 
 - job:
-    name: atmosphere-upload-container-image-glance
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-glance
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/heat.yaml b/zuul.d/container-images/heat.yaml
index 98b3d2c..c6970eb 100644
--- a/zuul.d/container-images/heat.yaml
+++ b/zuul.d/container-images/heat.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-heat
     gate:
       jobs:
-        - atmosphere-upload-container-image-heat
+        - atmosphere-build-container-image-heat
     promote:
       jobs:
         - atmosphere-promote-container-image-heat
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-heat
+      promote_container_image_job: atmosphere-build-container-image-heat
       container_images:
         - context: images/heat
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/heat/.*
 
 - job:
-    name: atmosphere-upload-container-image-heat
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-heat
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/horizon.yaml b/zuul.d/container-images/horizon.yaml
index eb8872b..d1f65ad 100644
--- a/zuul.d/container-images/horizon.yaml
+++ b/zuul.d/container-images/horizon.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-horizon
     gate:
       jobs:
-        - atmosphere-upload-container-image-horizon
+        - atmosphere-build-container-image-horizon
     promote:
       jobs:
         - atmosphere-promote-container-image-horizon
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-horizon
+      promote_container_image_job: atmosphere-build-container-image-horizon
       container_images:
         - context: images/horizon
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/horizon/.*
 
 - job:
-    name: atmosphere-upload-container-image-horizon
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-horizon
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/ironic.yaml b/zuul.d/container-images/ironic.yaml
index 33a0d4d..0a93e62 100644
--- a/zuul.d/container-images/ironic.yaml
+++ b/zuul.d/container-images/ironic.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-ironic
     gate:
       jobs:
-        - atmosphere-upload-container-image-ironic
+        - atmosphere-build-container-image-ironic
     promote:
       jobs:
         - atmosphere-promote-container-image-ironic
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-ironic
+      promote_container_image_job: atmosphere-build-container-image-ironic
       container_images:
         - context: images/ironic
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/ironic/.*
 
 - job:
-    name: atmosphere-upload-container-image-ironic
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-ironic
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/keepalived.yaml b/zuul.d/container-images/keepalived.yaml
index 31e4a6c..28677be 100644
--- a/zuul.d/container-images/keepalived.yaml
+++ b/zuul.d/container-images/keepalived.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-keepalived
     gate:
       jobs:
-        - atmosphere-upload-container-image-keepalived
+        - atmosphere-build-container-image-keepalived
     promote:
       jobs:
         - atmosphere-promote-container-image-keepalived
@@ -32,7 +32,7 @@
       - name: atmosphere-build-container-image-ubuntu
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-keepalived
+      promote_container_image_job: atmosphere-build-container-image-keepalived
       container_images:
         - context: images/keepalived
           registry: harbor.atmosphere.dev
@@ -49,17 +49,6 @@
       - images/keepalived/.*
 
 - job:
-    name: atmosphere-upload-container-image-keepalived
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-keepalived
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/keystone.yaml b/zuul.d/container-images/keystone.yaml
index 39d9d10..555a980 100644
--- a/zuul.d/container-images/keystone.yaml
+++ b/zuul.d/container-images/keystone.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-keystone
     gate:
       jobs:
-        - atmosphere-upload-container-image-keystone
+        - atmosphere-build-container-image-keystone
     promote:
       jobs:
         - atmosphere-promote-container-image-keystone
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-keystone
+      promote_container_image_job: atmosphere-build-container-image-keystone
       container_images:
         - context: images/keystone
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/keystone/.*
 
 - job:
-    name: atmosphere-upload-container-image-keystone
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-keystone
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/kubernetes-entrypoint.yaml b/zuul.d/container-images/kubernetes-entrypoint.yaml
index 8a1132f..593e1ca 100644
--- a/zuul.d/container-images/kubernetes-entrypoint.yaml
+++ b/zuul.d/container-images/kubernetes-entrypoint.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-kubernetes-entrypoint
     gate:
       jobs:
-        - atmosphere-upload-container-image-kubernetes-entrypoint
+        - atmosphere-build-container-image-kubernetes-entrypoint
     promote:
       jobs:
         - atmosphere-promote-container-image-kubernetes-entrypoint
@@ -30,7 +30,7 @@
       - name: atmosphere-buildset-registry
         soft: false
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-kubernetes-entrypoint
+      promote_container_image_job: atmosphere-build-container-image-kubernetes-entrypoint
       container_images:
         - context: images/kubernetes-entrypoint
           registry: harbor.atmosphere.dev
@@ -44,15 +44,6 @@
       - images/kubernetes-entrypoint/.*
 
 - job:
-    name: atmosphere-upload-container-image-kubernetes-entrypoint
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-kubernetes-entrypoint
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/libvirtd.yaml b/zuul.d/container-images/libvirtd.yaml
index 9b2596b..ac0e1ba 100644
--- a/zuul.d/container-images/libvirtd.yaml
+++ b/zuul.d/container-images/libvirtd.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-libvirtd
     gate:
       jobs:
-        - atmosphere-upload-container-image-libvirtd
+        - atmosphere-build-container-image-libvirtd
     promote:
       jobs:
         - atmosphere-promote-container-image-libvirtd
@@ -36,7 +36,7 @@
       - name: atmosphere-build-container-image-openstack-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-libvirtd
+      promote_container_image_job: atmosphere-build-container-image-libvirtd
       container_images:
         - context: images/libvirtd
           registry: harbor.atmosphere.dev
@@ -57,21 +57,6 @@
       - images/libvirtd/.*
 
 - job:
-    name: atmosphere-upload-container-image-libvirtd
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-libvirtd
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/magnum.yaml b/zuul.d/container-images/magnum.yaml
index 71001a5..34f400e 100644
--- a/zuul.d/container-images/magnum.yaml
+++ b/zuul.d/container-images/magnum.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-magnum
     gate:
       jobs:
-        - atmosphere-upload-container-image-magnum
+        - atmosphere-build-container-image-magnum
     promote:
       jobs:
         - atmosphere-promote-container-image-magnum
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-magnum
+      promote_container_image_job: atmosphere-build-container-image-magnum
       container_images:
         - context: images/magnum
           registry: harbor.atmosphere.dev
@@ -63,25 +63,6 @@
       - images/magnum/.*
 
 - job:
-    name: atmosphere-upload-container-image-magnum
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-magnum
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/manila.yaml b/zuul.d/container-images/manila.yaml
index f82fdea..7ce412c 100644
--- a/zuul.d/container-images/manila.yaml
+++ b/zuul.d/container-images/manila.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-manila
     gate:
       jobs:
-        - atmosphere-upload-container-image-manila
+        - atmosphere-build-container-image-manila
     promote:
       jobs:
         - atmosphere-promote-container-image-manila
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-manila
+      promote_container_image_job: atmosphere-build-container-image-manila
       container_images:
         - context: images/manila
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/manila/.*
 
 - job:
-    name: atmosphere-upload-container-image-manila
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-manila
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/netoffload.yaml b/zuul.d/container-images/netoffload.yaml
index 4494d44..7236c12 100644
--- a/zuul.d/container-images/netoffload.yaml
+++ b/zuul.d/container-images/netoffload.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-netoffload
     gate:
       jobs:
-        - atmosphere-upload-container-image-netoffload
+        - atmosphere-build-container-image-netoffload
     promote:
       jobs:
         - atmosphere-promote-container-image-netoffload
@@ -32,7 +32,7 @@
       - name: atmosphere-build-container-image-ubuntu
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-netoffload
+      promote_container_image_job: atmosphere-build-container-image-netoffload
       container_images:
         - context: images/netoffload
           registry: harbor.atmosphere.dev
@@ -49,17 +49,6 @@
       - images/netoffload/.*
 
 - job:
-    name: atmosphere-upload-container-image-netoffload
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-netoffload
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/neutron.yaml b/zuul.d/container-images/neutron.yaml
index b8dabca..ee2113a 100644
--- a/zuul.d/container-images/neutron.yaml
+++ b/zuul.d/container-images/neutron.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-neutron
     gate:
       jobs:
-        - atmosphere-upload-container-image-neutron
+        - atmosphere-build-container-image-neutron
     promote:
       jobs:
         - atmosphere-promote-container-image-neutron
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-neutron
+      promote_container_image_job: atmosphere-build-container-image-neutron
       container_images:
         - context: images/neutron
           registry: harbor.atmosphere.dev
@@ -63,25 +63,6 @@
       - images/neutron/.*
 
 - job:
-    name: atmosphere-upload-container-image-neutron
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-neutron
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/nova-ssh.yaml b/zuul.d/container-images/nova-ssh.yaml
index d60275d..e60df3e 100644
--- a/zuul.d/container-images/nova-ssh.yaml
+++ b/zuul.d/container-images/nova-ssh.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-nova-ssh
     gate:
       jobs:
-        - atmosphere-upload-container-image-nova-ssh
+        - atmosphere-build-container-image-nova-ssh
     promote:
       jobs:
         - atmosphere-promote-container-image-nova-ssh
@@ -36,7 +36,7 @@
       - name: atmosphere-build-container-image-openstack-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-nova-ssh
+      promote_container_image_job: atmosphere-build-container-image-nova-ssh
       container_images:
         - context: images/nova-ssh
           registry: harbor.atmosphere.dev
@@ -58,21 +58,6 @@
       - images/nova-ssh/.*
 
 - job:
-    name: atmosphere-upload-container-image-nova-ssh
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-nova-ssh
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/nova.yaml b/zuul.d/container-images/nova.yaml
index b037875..eca6875 100644
--- a/zuul.d/container-images/nova.yaml
+++ b/zuul.d/container-images/nova.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-nova
     gate:
       jobs:
-        - atmosphere-upload-container-image-nova
+        - atmosphere-build-container-image-nova
     promote:
       jobs:
         - atmosphere-promote-container-image-nova
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-nova
+      promote_container_image_job: atmosphere-build-container-image-nova
       container_images:
         - context: images/nova
           registry: harbor.atmosphere.dev
@@ -64,25 +64,6 @@
       - images/nova/.*
 
 - job:
-    name: atmosphere-upload-container-image-nova
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-nova
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/octavia.yaml b/zuul.d/container-images/octavia.yaml
index 6710cb8..5089cd9 100644
--- a/zuul.d/container-images/octavia.yaml
+++ b/zuul.d/container-images/octavia.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-octavia
     gate:
       jobs:
-        - atmosphere-upload-container-image-octavia
+        - atmosphere-build-container-image-octavia
     promote:
       jobs:
         - atmosphere-promote-container-image-octavia
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-octavia
+      promote_container_image_job: atmosphere-build-container-image-octavia
       container_images:
         - context: images/octavia
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/octavia/.*
 
 - job:
-    name: atmosphere-upload-container-image-octavia
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-octavia
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/openstack-python-runtime.yaml b/zuul.d/container-images/openstack-python-runtime.yaml
index 6256cb5..7d4302b 100644
--- a/zuul.d/container-images/openstack-python-runtime.yaml
+++ b/zuul.d/container-images/openstack-python-runtime.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-openstack-python-runtime
     gate:
       jobs:
-        - atmosphere-upload-container-image-openstack-python-runtime
+        - atmosphere-build-container-image-openstack-python-runtime
     promote:
       jobs:
         - atmosphere-promote-container-image-openstack-python-runtime
@@ -36,7 +36,7 @@
       - name: atmosphere-build-container-image-python-base
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-openstack-python-runtime
+      promote_container_image_job: atmosphere-build-container-image-openstack-python-runtime
       container_images:
         - context: images/openstack-runtime
           registry: harbor.atmosphere.dev
@@ -57,21 +57,6 @@
       - images/openstack-runtime/.*
 
 - job:
-    name: atmosphere-upload-container-image-openstack-python-runtime
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-openstack-python-runtime
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/openstack-runtime.yaml b/zuul.d/container-images/openstack-runtime.yaml
index 35a1b06..21b0de0 100644
--- a/zuul.d/container-images/openstack-runtime.yaml
+++ b/zuul.d/container-images/openstack-runtime.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-openstack-runtime
     gate:
       jobs:
-        - atmosphere-upload-container-image-openstack-runtime
+        - atmosphere-build-container-image-openstack-runtime
     promote:
       jobs:
         - atmosphere-promote-container-image-openstack-runtime
@@ -34,7 +34,7 @@
       - name: atmosphere-build-container-image-ubuntu-cloud-archive
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-openstack-runtime
+      promote_container_image_job: atmosphere-build-container-image-openstack-runtime
       container_images:
         - context: images/openstack-runtime
           registry: harbor.atmosphere.dev
@@ -53,19 +53,6 @@
       - images/openstack-runtime/.*
 
 - job:
-    name: atmosphere-upload-container-image-openstack-runtime
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-openstack-runtime
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/openstack-venv-builder.yaml b/zuul.d/container-images/openstack-venv-builder.yaml
index c042bf8..68bae33 100644
--- a/zuul.d/container-images/openstack-venv-builder.yaml
+++ b/zuul.d/container-images/openstack-venv-builder.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-openstack-venv-builder
     gate:
       jobs:
-        - atmosphere-upload-container-image-openstack-venv-builder
+        - atmosphere-build-container-image-openstack-venv-builder
     promote:
       jobs:
         - atmosphere-promote-container-image-openstack-venv-builder
@@ -36,7 +36,7 @@
       - name: atmosphere-build-container-image-python-base
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-openstack-venv-builder
+      promote_container_image_job: atmosphere-build-container-image-openstack-venv-builder
       container_images:
         - context: images/openstack-venv-builder
           registry: harbor.atmosphere.dev
@@ -56,21 +56,6 @@
       - images/openstack-venv-builder/.*
 
 - job:
-    name: atmosphere-upload-container-image-openstack-venv-builder
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-openstack-venv-builder
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/openvswitch.yaml b/zuul.d/container-images/openvswitch.yaml
index 2ebec04..0d8edfd 100644
--- a/zuul.d/container-images/openvswitch.yaml
+++ b/zuul.d/container-images/openvswitch.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-openvswitch
     gate:
       jobs:
-        - atmosphere-upload-container-image-openvswitch
+        - atmosphere-build-container-image-openvswitch
     promote:
       jobs:
         - atmosphere-promote-container-image-openvswitch
@@ -30,7 +30,7 @@
       - name: atmosphere-buildset-registry
         soft: false
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-openvswitch
+      promote_container_image_job: atmosphere-build-container-image-openvswitch
       container_images:
         - context: images/openvswitch
           registry: harbor.atmosphere.dev
@@ -44,15 +44,6 @@
       - images/openvswitch/.*
 
 - job:
-    name: atmosphere-upload-container-image-openvswitch
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-openvswitch
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/ovn.yaml b/zuul.d/container-images/ovn.yaml
index 07fa151..882b0d5 100644
--- a/zuul.d/container-images/ovn.yaml
+++ b/zuul.d/container-images/ovn.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-ovn
     gate:
       jobs:
-        - atmosphere-upload-container-image-ovn
+        - atmosphere-build-container-image-ovn
     promote:
       jobs:
         - atmosphere-promote-container-image-ovn
@@ -32,7 +32,7 @@
       - name: atmosphere-build-container-image-openvswitch
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-ovn
+      promote_container_image_job: atmosphere-build-container-image-ovn
       container_images:
         - context: images/ovn
           registry: harbor.atmosphere.dev
@@ -62,17 +62,6 @@
       - images/ovn/.*
 
 - job:
-    name: atmosphere-upload-container-image-ovn
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-openvswitch
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-ovn
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/placement.yaml b/zuul.d/container-images/placement.yaml
index 945f341..fe491d4 100644
--- a/zuul.d/container-images/placement.yaml
+++ b/zuul.d/container-images/placement.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-placement
     gate:
       jobs:
-        - atmosphere-upload-container-image-placement
+        - atmosphere-build-container-image-placement
     promote:
       jobs:
         - atmosphere-promote-container-image-placement
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-placement
+      promote_container_image_job: atmosphere-build-container-image-placement
       container_images:
         - context: images/placement
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/placement/.*
 
 - job:
-    name: atmosphere-upload-container-image-placement
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-placement
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/python-base.yaml b/zuul.d/container-images/python-base.yaml
index 90e5acf..2b2bb0a 100644
--- a/zuul.d/container-images/python-base.yaml
+++ b/zuul.d/container-images/python-base.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-python-base
     gate:
       jobs:
-        - atmosphere-upload-container-image-python-base
+        - atmosphere-build-container-image-python-base
     promote:
       jobs:
         - atmosphere-promote-container-image-python-base
@@ -34,7 +34,7 @@
       - name: atmosphere-build-container-image-ubuntu-cloud-archive
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-python-base
+      promote_container_image_job: atmosphere-build-container-image-python-base
       container_images:
         - context: images/python-base
           registry: harbor.atmosphere.dev
@@ -53,19 +53,6 @@
       - images/python-base/.*
 
 - job:
-    name: atmosphere-upload-container-image-python-base
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-python-base
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/python-openstackclient.yaml b/zuul.d/container-images/python-openstackclient.yaml
index cfb9826..435bcfb 100644
--- a/zuul.d/container-images/python-openstackclient.yaml
+++ b/zuul.d/container-images/python-openstackclient.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-python-openstackclient
     gate:
       jobs:
-        - atmosphere-upload-container-image-python-openstackclient
+        - atmosphere-build-container-image-python-openstackclient
     promote:
       jobs:
         - atmosphere-promote-container-image-python-openstackclient
@@ -38,7 +38,7 @@
       - name: atmosphere-build-container-image-openstack-venv-builder
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-python-openstackclient
+      promote_container_image_job: atmosphere-build-container-image-python-openstackclient
       container_images:
         - context: images/python-openstackclient
           registry: harbor.atmosphere.dev
@@ -58,23 +58,6 @@
       - images/python-openstackclient/.*
 
 - job:
-    name: atmosphere-upload-container-image-python-openstackclient
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-python-openstackclient
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/staffeln.yaml b/zuul.d/container-images/staffeln.yaml
index 77200c2..67070dd 100644
--- a/zuul.d/container-images/staffeln.yaml
+++ b/zuul.d/container-images/staffeln.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-staffeln
     gate:
       jobs:
-        - atmosphere-upload-container-image-staffeln
+        - atmosphere-build-container-image-staffeln
     promote:
       jobs:
         - atmosphere-promote-container-image-staffeln
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-staffeln
+      promote_container_image_job: atmosphere-build-container-image-staffeln
       container_images:
         - context: images/staffeln
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/staffeln/.*
 
 - job:
-    name: atmosphere-upload-container-image-staffeln
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-staffeln
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/tempest.yaml b/zuul.d/container-images/tempest.yaml
index 22dd426..af9bafe 100644
--- a/zuul.d/container-images/tempest.yaml
+++ b/zuul.d/container-images/tempest.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-tempest
     gate:
       jobs:
-        - atmosphere-upload-container-image-tempest
+        - atmosphere-build-container-image-tempest
     promote:
       jobs:
         - atmosphere-promote-container-image-tempest
@@ -40,7 +40,7 @@
       - name: atmosphere-build-container-image-openstack-python-runtime
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-tempest
+      promote_container_image_job: atmosphere-build-container-image-tempest
       container_images:
         - context: images/tempest
           registry: harbor.atmosphere.dev
@@ -62,25 +62,6 @@
       - images/tempest/.*
 
 - job:
-    name: atmosphere-upload-container-image-tempest
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-      - name: atmosphere-upload-container-image-ubuntu-cloud-archive
-        soft: true
-      - name: atmosphere-upload-container-image-python-base
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-venv-builder
-        soft: true
-      - name: atmosphere-upload-container-image-openstack-python-runtime
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-tempest
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/ubuntu-cloud-archive.yaml b/zuul.d/container-images/ubuntu-cloud-archive.yaml
index 69e826e..2e7431b 100644
--- a/zuul.d/container-images/ubuntu-cloud-archive.yaml
+++ b/zuul.d/container-images/ubuntu-cloud-archive.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-ubuntu-cloud-archive
     gate:
       jobs:
-        - atmosphere-upload-container-image-ubuntu-cloud-archive
+        - atmosphere-build-container-image-ubuntu-cloud-archive
     promote:
       jobs:
         - atmosphere-promote-container-image-ubuntu-cloud-archive
@@ -32,7 +32,7 @@
       - name: atmosphere-build-container-image-ubuntu
         soft: true
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-ubuntu-cloud-archive
+      promote_container_image_job: atmosphere-build-container-image-ubuntu-cloud-archive
       container_images:
         - context: images/ubuntu-cloud-archive
           registry: harbor.atmosphere.dev
@@ -50,17 +50,6 @@
       - images/ubuntu-cloud-archive/.*
 
 - job:
-    name: atmosphere-upload-container-image-ubuntu-cloud-archive
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-      - name: atmosphere-upload-container-image-ubuntu
-        soft: true
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-ubuntu-cloud-archive
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/container-images/ubuntu.yaml b/zuul.d/container-images/ubuntu.yaml
index 2b54f92..886aa64 100644
--- a/zuul.d/container-images/ubuntu.yaml
+++ b/zuul.d/container-images/ubuntu.yaml
@@ -18,7 +18,7 @@
         - atmosphere-build-container-image-ubuntu
     gate:
       jobs:
-        - atmosphere-upload-container-image-ubuntu
+        - atmosphere-build-container-image-ubuntu
     promote:
       jobs:
         - atmosphere-promote-container-image-ubuntu
@@ -30,7 +30,7 @@
       - name: atmosphere-buildset-registry
         soft: false
     vars: &container_image_vars
-      promote_container_image_job: atmosphere-upload-container-image-ubuntu
+      promote_container_image_job: atmosphere-build-container-image-ubuntu
       container_images:
         - context: images/ubuntu
           registry: harbor.atmosphere.dev
@@ -47,15 +47,6 @@
       - images/ubuntu/.*
 
 - job:
-    name: atmosphere-upload-container-image-ubuntu
-    parent: atmosphere-upload-container-image
-    dependencies:
-      - name: atmosphere-buildset-registry
-        soft: false
-    vars: *container_image_vars
-    files: *container_image_files
-
-- job:
     name: atmosphere-promote-container-image-ubuntu
     parent: atmosphere-promote-container-image
     vars: *container_image_vars
diff --git a/zuul.d/docs.yaml b/zuul.d/docs.yaml
index fe627e2..ff03a51 100644
--- a/zuul.d/docs.yaml
+++ b/zuul.d/docs.yaml
@@ -25,3 +25,4 @@
     parent: tox-docs
     files:
       - ^doc/
+      - ^releasenotes/
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 52515e6..ce8ba97 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -8,8 +8,6 @@
 - job:
     name: atmosphere-golang-go-test
     parent: atmosphere-golang-go
-    pre-run:
-      - zuul.d/playbooks/common/switch-to-atmosphere-mirror.yml
     vars:
       go_command: test ./... -v
 
@@ -55,6 +53,7 @@
       - zuul.d/playbooks/build-collection/pre.yml
     irrelevant-files:
       - ^doc/
+      - ^releasenotes/
 
 - job:
     name: atmosphere-publish-collection
@@ -72,7 +71,12 @@
     run: zuul.d/playbooks/molecule/run.yml
     post-run: zuul.d/playbooks/molecule/post.yml
     irrelevant-files:
+      - ^build/
       - ^doc/
+      - ^releasenotes/
+    vars:
+      tox_environment:
+        ATMOSPHERE_IMAGE_PREFIX: "harbor.atmosphere.dev/"
 
 - job:
     name: atmosphere-molecule-csi
diff --git a/zuul.d/playbooks/common/switch-to-atmosphere-mirror.yml b/zuul.d/playbooks/common/switch-to-atmosphere-mirror.yml
index 839841b..1f71dc4 100644
--- a/zuul.d/playbooks/common/switch-to-atmosphere-mirror.yml
+++ b/zuul.d/playbooks/common/switch-to-atmosphere-mirror.yml
@@ -4,15 +4,8 @@
     - name: Switch all images out of the CDN
       ansible.builtin.replace:
         path: "{{ zuul.project.src_dir }}/roles/defaults/vars/main.yml"
-        regexp: 'registry.atmosphere.dev'
-        replace: 'harbor.atmosphere.dev'
-
-    # TODO(mnaser): Drop this when we can use https://github.com/vexxhost/atmosphere/pull/977
-    - name: Prefix all images for the job to point to mirror
-      ansible.builtin.shell: |
-        sed -i '/harbor.atmosphere.dev/!s/  \(.*\): \(.*\)$/  \1: harbor.atmosphere.dev\/\2/' roles/defaults/vars/main.yml
-      args:
-        chdir: "{{ zuul.project.src_dir }}"
+        regexp: "{{ '{{' }} atmosphere_image_prefix {{ '}}' }}registry.atmosphere.dev"
+        replace: harbor.atmosphere.dev
 
     - name: Print out the image list
       ansible.builtin.shell: |
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index f5f357a..415ab66 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -13,7 +13,6 @@
 # under the License.
 
 - project:
-    merge-mode: squash-merge
     check:
       jobs:
         - atmosphere-chart-vendor
@@ -24,7 +23,7 @@
         - atmosphere-tox-helm-unittest
         - atmosphere-tox-py3
         - atmosphere-build-collection:
-            dependencies: &molecule_check_dependencies
+            dependencies: &image_build_jobs
               - name: atmosphere-build-container-image-barbican
                 soft: true
               - name: atmosphere-build-container-image-cinder
@@ -74,15 +73,15 @@
               - name: atmosphere-build-container-image-tempest
                 soft: true
         - atmosphere-molecule-aio-keycloak:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-openvswitch:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-ovn:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-csi-local-path-provisioner:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-csi-rbd:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
     gate:
       jobs:
         - atmosphere-chart-vendor
@@ -91,73 +90,25 @@
         - atmosphere-linters
         - atmosphere-tox-py3
         - atmosphere-build-collection:
-            dependencies: &molecule_gate_dependencies
-              - name: atmosphere-upload-container-image-barbican
-                soft: true
-              - name: atmosphere-upload-container-image-cinder
-                soft: true
-              - name: atmosphere-upload-container-image-designate
-                soft: true
-              - name: atmosphere-upload-container-image-glance
-                soft: true
-              - name: atmosphere-upload-container-image-heat
-                soft: true
-              - name: atmosphere-upload-container-image-horizon
-                soft: true
-              - name: atmosphere-upload-container-image-ironic
-                soft: true
-              - name: atmosphere-upload-container-image-keepalived
-                soft: true
-              - name: atmosphere-upload-container-image-keystone
-                soft: true
-              - name: atmosphere-upload-container-image-kubernetes-entrypoint
-                soft: true
-              - name: atmosphere-upload-container-image-libvirtd
-                soft: true
-              - name: atmosphere-upload-container-image-magnum
-                soft: true
-              - name: atmosphere-upload-container-image-manila
-                soft: true
-              - name: atmosphere-upload-container-image-netoffload
-                soft: true
-              - name: atmosphere-upload-container-image-neutron
-                soft: true
-              - name: atmosphere-upload-container-image-nova
-                soft: true
-              - name: atmosphere-upload-container-image-nova-ssh
-                soft: true
-              - name: atmosphere-upload-container-image-octavia
-                soft: true
-              - name: atmosphere-upload-container-image-openvswitch
-                soft: true
-              - name: atmosphere-upload-container-image-ovn
-                soft: true
-              - name: atmosphere-upload-container-image-placement
-                soft: true
-              - name: atmosphere-upload-container-image-python-openstackclient
-                soft: true
-              - name: atmosphere-upload-container-image-staffeln
-                soft: true
-              - name: atmosphere-upload-container-image-tempest
-                soft: true
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-keycloak:
-            dependencies: *molecule_gate_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-openvswitch:
-            dependencies: *molecule_gate_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-ovn:
-            dependencies: *molecule_gate_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-csi-local-path-provisioner:
-            dependencies: *molecule_gate_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-csi-rbd:
-            dependencies: *molecule_gate_dependencies
+            dependencies: *image_build_jobs
     release:
       jobs:
         - atmosphere-publish-collection
     periodic:
       jobs:
         - atmosphere-molecule-aio-upgrade-openvswitch:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
         - atmosphere-molecule-aio-upgrade-ovn:
-            dependencies: *molecule_check_dependencies
+            dependencies: *image_build_jobs
     vars:
       container_registry: harbor.atmosphere.dev/library