Merge "Revert "Bump helm-toolkit to 0.2.78 (#2264)"" into stable/zed
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 b6ad4af..bd80c40 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 cd3889b..d76b375 100644
--- a/charts/neutron/values.yaml
+++ b/charts/neutron/values.yaml
@@ -45,6 +45,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:v1.0.0
@@ -643,6 +644,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/molecule/aio/group_vars/all/molecule.yml b/molecule/aio/group_vars/all/molecule.yml
index 9d8942a..bf39267 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/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/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/roles/defaults/defaults/main.yml b/roles/defaults/defaults/main.yml
index af44fa8..41bb43b 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 e0b11cd..3752633 100644
--- a/roles/defaults/vars/main.yml
+++ b/roles/defaults/vars/main.yml
@@ -15,219 +15,220 @@
 atmosphere_release: zed
 
 _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.1
-  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.4.0
-  csi_rbd_attacher: registry.k8s.io/sig-storage/csi-attacher:v3.4.0
-  csi_rbd_plugin: quay.io/cephcsi/cephcsi:v3.5.1
-  csi_rbd_provisioner: registry.k8s.io/sig-storage/csi-provisioner:v3.1.0
-  csi_rbd_resizer: registry.k8s.io/sig-storage/csi-resizer:v1.3.0
-  csi_rbd_snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v4.2.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:10.4.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.1.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.1.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:22.0.1-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:2.9.6
-  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.17
-  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.9.3
-  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_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.11.2
-  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.13.0-haproxy
-  percona_xtradb_cluster_operator: docker.io/percona/percona-xtradb-cluster-operator:1.13.0
-  percona_xtradb_cluster: docker.io/percona/percona-xtradb-cluster:8.0.32-24.2
-  percona_version_service: docker.io/perconalab/version-service:main-3325140
-  placement_db_sync: "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.10.0
-  prometheus_mysqld_exporter: quay.io/prometheus/mysqld-exporter:v0.14.0
-  prometheus_node_exporter: quay.io/prometheus/node-exporter:v1.7.0
-  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.73.1
-  prometheus_pushgateway: docker.io/prom/pushgateway:v1.4.2
-  prometheus: quay.io/prometheus/prometheus:v2.51.2
-  rabbit_init: docker.io/library/rabbitmq:3.10.2-management
-  rabbitmq_cluster_operator: docker.io/rabbitmqoperator/cluster-operator:1.13.1
-  rabbitmq_credential_updater: docker.io/rabbitmqoperator/default-user-credential-updater:1.0.2
-  rabbitmq_server: docker.io/library/rabbitmq:3.10.2-management
-  rabbitmq_topology_operator: docker.io/rabbitmqoperator/messaging-topology-operator:1.6.0
-  rook_ceph: docker.io/rook/ceph:v1.10.10
-  secretgen_controller: ghcr.io/carvel-dev/secretgen-controller@sha256:59ec05ce5847bfd70c8e04f08b5195e918c8f6fbb947ffc91b456494a2958fd5
-  senlin_api: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  senlin_conductor: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  senlin_db_sync: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  senlin_engine_cleaner: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  senlin_engine: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  senlin_health_manager: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
-  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.37.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.1"
+  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.4.0"
+  csi_rbd_attacher: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-attacher:v3.4.0"
+  csi_rbd_plugin: "{{ atmosphere_image_prefix }}quay.io/cephcsi/cephcsi:v3.5.1"
+  csi_rbd_provisioner: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-provisioner:v3.1.0"
+  csi_rbd_resizer: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-resizer:v1.3.0"
+  csi_rbd_snapshotter: "{{ atmosphere_image_prefix }}registry.k8s.io/sig-storage/csi-snapshotter:v4.2.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:10.4.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.1.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.1.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:22.0.1-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:2.9.6"
+  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.17"
+  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.9.3"
+  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.11.2"
+  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.13.0-haproxy"
+  percona_xtradb_cluster_operator: "{{ atmosphere_image_prefix }}docker.io/percona/percona-xtradb-cluster-operator:1.13.0"
+  percona_xtradb_cluster: "{{ atmosphere_image_prefix }}docker.io/percona/percona-xtradb-cluster:8.0.32-24.2"
+  percona_version_service: "{{ atmosphere_image_prefix }}docker.io/perconalab/version-service:main-3325140"
+  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.10.0"
+  prometheus_mysqld_exporter: "{{ atmosphere_image_prefix }}quay.io/prometheus/mysqld-exporter:v0.14.0"
+  prometheus_node_exporter: "{{ atmosphere_image_prefix }}quay.io/prometheus/node-exporter:v1.7.0"
+  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.73.1"
+  prometheus_pushgateway: "{{ atmosphere_image_prefix }}docker.io/prom/pushgateway:v1.4.2"
+  prometheus: "{{ atmosphere_image_prefix }}quay.io/prometheus/prometheus:v2.51.2"
+  rabbit_init: "{{ atmosphere_image_prefix }}docker.io/library/rabbitmq:3.10.2-management"
+  rabbitmq_cluster_operator: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/cluster-operator:1.13.1"
+  rabbitmq_credential_updater: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/default-user-credential-updater:1.0.2"
+  rabbitmq_server: "{{ atmosphere_image_prefix }}docker.io/library/rabbitmq:3.10.2-management"
+  rabbitmq_topology_operator: "{{ atmosphere_image_prefix }}docker.io/rabbitmqoperator/messaging-topology-operator:1.6.0"
+  rook_ceph: "{{ atmosphere_image_prefix }}docker.io/rook/ceph:v1.10.10"
+  secretgen_controller: "{{ atmosphere_image_prefix }}ghcr.io/carvel-dev/secretgen-controller@sha256:59ec05ce5847bfd70c8e04f08b5195e918c8f6fbb947ffc91b456494a2958fd5"
+  senlin_api: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_conductor: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_db_sync: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_engine_cleaner: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_engine: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_health_manager: "{{ atmosphere_image_prefix }}registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  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.37.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/tox.ini b/tox.ini
index 44a886c..0673da3 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/base.yaml b/zuul.d/container-images/base.yaml
index ae2991e..988a2a9 100644
--- a/zuul.d/container-images/base.yaml
+++ b/zuul.d/container-images/base.yaml
@@ -24,6 +24,7 @@
     name: atmosphere-buildset-registry
     parent: ci-buildset-registry
     irrelevant-files:
+      - ^build/
       - ^doc/
       - ^releasenotes/
 
@@ -32,6 +33,7 @@
     parent: ci-build-container-image
     abstract: true
     irrelevant-files:
+      - ^build/
       - ^doc/
       - ^releasenotes/
     vars: &image_vars
@@ -56,6 +58,7 @@
     name: atmosphere-promote-container-image
     parent: ci-promote-container-image
     irrelevant-files:
+      - ^build/
       - ^doc/
       - ^releasenotes/
     nodeset:
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 4390d06..2659902 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
 
@@ -73,8 +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: |