build: build all images + run tests using them (#1069)

TODO

 Add patches
 Figure out why cache misses for Git clone (or something else)
diff --git a/zuul.d/container-images/barbican.yaml b/zuul.d/container-images/barbican.yaml
new file mode 100644
index 0000000..15c371c
--- /dev/null
+++ b/zuul.d/container-images/barbican.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-barbican
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-barbican
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-barbican
+
+- job:
+    name: atmosphere-build-container-image-barbican
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-barbican
+      container_images:
+        - context: images/barbican
+          repository: registry.atmosphere.dev/library/barbican
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=barbican
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/barbican/.*
+
+- job:
+    name: atmosphere-upload-container-image-barbican
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/base.yaml b/zuul.d/container-images/base.yaml
new file mode 100644
index 0000000..6e33526
--- /dev/null
+++ b/zuul.d/container-images/base.yaml
@@ -0,0 +1,65 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-buildset-registry
+    gate:
+      jobs:
+        - atmosphere-buildset-registry
+
+- job:
+    name: atmosphere-buildset-registry
+    parent: ci-buildset-registry
+
+- job:
+    name: atmosphere-build-container-image
+    parent: ci-build-container-image
+    abstract: true
+    dependencies:
+      - name: atmosphere-buildset-registry
+        soft: false
+    vars: &image_vars
+      container_command: docker
+      promote_container_image_method: intermediate-registry
+      buildset_registry_namespaces:
+        - ['docker.io', 'https://registry-1.docker.io']
+        - ['quay.io', 'https://quay.io']
+        - ['gcr.io', 'https://gcr.io']
+        - ['registry.atmosphere.dev', 'https://registry.atmosphere.dev']
+
+- job:
+    name: atmosphere-upload-container-image
+    parent: ci-upload-container-image
+    abstract: true
+    dependencies:
+      - name: atmosphere-buildset-registry
+        soft: false
+    secrets:
+      name: container_registry_credentials
+      secret: atmosphere-registry-credentials
+      pass-to-parent: true
+    vars: *image_vars
+
+- job:
+    name: atmosphere-promote-container-image
+    parent: ci-promote-container-image
+    secrets:
+      name: container_registry_credentials
+      secret: atmosphere-registry-credentials
+      pass-to-parent: true
+    nodeset:
+      nodes: []
+    vars: *image_vars
diff --git a/zuul.d/container-images/cinder.yaml b/zuul.d/container-images/cinder.yaml
new file mode 100644
index 0000000..3878407
--- /dev/null
+++ b/zuul.d/container-images/cinder.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-cinder
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-cinder
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-cinder
+
+- job:
+    name: atmosphere-build-container-image-cinder
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-cinder
+      container_images:
+        - context: images/cinder
+          repository: registry.atmosphere.dev/library/cinder
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=cinder
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/cinder/.*
+
+- job:
+    name: atmosphere-upload-container-image-cinder
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/cluster-api-provider-openstack.yaml b/zuul.d/container-images/cluster-api-provider-openstack.yaml
new file mode 100644
index 0000000..5788c88
--- /dev/null
+++ b/zuul.d/container-images/cluster-api-provider-openstack.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-cluster-api-provider-openstack
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-cluster-api-provider-openstack
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-cluster-api-provider-openstack
+
+- job:
+    name: atmosphere-build-container-image-cluster-api-provider-openstack
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-cluster-api-provider-openstack
+      container_images:
+        - context: images/cluster-api-provider-openstack
+          repository: registry.atmosphere.dev/library/capi-openstack-controller
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/cluster-api-provider-openstack/.*
+
+- job:
+    name: atmosphere-upload-container-image-cluster-api-provider-openstack
+    parent: atmosphere-upload-container-image
+    vars: *container_image_vars
+    files: *container_image_files
+
+- job:
+    name: atmosphere-promote-container-image-cluster-api-provider-openstack
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/container-images/designate.yaml b/zuul.d/container-images/designate.yaml
new file mode 100644
index 0000000..eeb2fd1
--- /dev/null
+++ b/zuul.d/container-images/designate.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-designate
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-designate
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-designate
+
+- job:
+    name: atmosphere-build-container-image-designate
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-designate
+      container_images:
+        - context: images/designate
+          repository: registry.atmosphere.dev/library/designate
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=designate
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/designate/.*
+
+- job:
+    name: atmosphere-upload-container-image-designate
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/glance.yaml b/zuul.d/container-images/glance.yaml
new file mode 100644
index 0000000..e2ec62c
--- /dev/null
+++ b/zuul.d/container-images/glance.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-glance
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-glance
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-glance
+
+- job:
+    name: atmosphere-build-container-image-glance
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-glance
+      container_images:
+        - context: images/glance
+          repository: registry.atmosphere.dev/library/glance
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=glance
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/glance/.*
+
+- job:
+    name: atmosphere-upload-container-image-glance
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/heat.yaml b/zuul.d/container-images/heat.yaml
new file mode 100644
index 0000000..5490356
--- /dev/null
+++ b/zuul.d/container-images/heat.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-heat
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-heat
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-heat
+
+- job:
+    name: atmosphere-build-container-image-heat
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-heat
+      container_images:
+        - context: images/heat
+          repository: registry.atmosphere.dev/library/heat
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=heat
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/heat/.*
+
+- job:
+    name: atmosphere-upload-container-image-heat
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/horizon.yaml b/zuul.d/container-images/horizon.yaml
new file mode 100644
index 0000000..096d510
--- /dev/null
+++ b/zuul.d/container-images/horizon.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-horizon
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-horizon
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-horizon
+
+- job:
+    name: atmosphere-build-container-image-horizon
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-horizon
+      container_images:
+        - context: images/horizon
+          repository: registry.atmosphere.dev/library/horizon
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=horizon
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/horizon/.*
+
+- job:
+    name: atmosphere-upload-container-image-horizon
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/ironic.yaml b/zuul.d/container-images/ironic.yaml
new file mode 100644
index 0000000..8727807
--- /dev/null
+++ b/zuul.d/container-images/ironic.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-ironic
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-ironic
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-ironic
+
+- job:
+    name: atmosphere-build-container-image-ironic
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-ironic
+      container_images:
+        - context: images/ironic
+          repository: registry.atmosphere.dev/library/ironic
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=ironic
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/ironic/.*
+
+- job:
+    name: atmosphere-upload-container-image-ironic
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/keystone.yaml b/zuul.d/container-images/keystone.yaml
new file mode 100644
index 0000000..2c83223
--- /dev/null
+++ b/zuul.d/container-images/keystone.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-keystone
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-keystone
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-keystone
+
+- job:
+    name: atmosphere-build-container-image-keystone
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-keystone
+      container_images:
+        - context: images/keystone
+          repository: registry.atmosphere.dev/library/keystone
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=keystone
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/keystone/.*
+
+- job:
+    name: atmosphere-upload-container-image-keystone
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/kubernetes-entrypoint.yaml b/zuul.d/container-images/kubernetes-entrypoint.yaml
new file mode 100644
index 0000000..40ec23a
--- /dev/null
+++ b/zuul.d/container-images/kubernetes-entrypoint.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-kubernetes-entrypoint
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-kubernetes-entrypoint
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-kubernetes-entrypoint
+
+- job:
+    name: atmosphere-build-container-image-kubernetes-entrypoint
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-kubernetes-entrypoint
+      container_images:
+        - context: images/kubernetes-entrypoint
+          repository: registry.atmosphere.dev/library/kubernetes-entrypoint
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/kubernetes-entrypoint/.*
+
+- job:
+    name: atmosphere-upload-container-image-kubernetes-entrypoint
+    parent: atmosphere-upload-container-image
+    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
+    files: *container_image_files
diff --git a/zuul.d/container-images/libvirt-tls-sidecar.yaml b/zuul.d/container-images/libvirt-tls-sidecar.yaml
new file mode 100644
index 0000000..a3e4757
--- /dev/null
+++ b/zuul.d/container-images/libvirt-tls-sidecar.yaml
@@ -0,0 +1,56 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-libvirt-tls-sidecar
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-libvirt-tls-sidecar
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-libvirt-tls-sidecar
+
+- job:
+    name: atmosphere-build-container-image-libvirt-tls-sidecar
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-libvirt-tls-sidecar
+      container_images:
+        - context: .
+          target: libvirt-tls-sidecar
+          repository: registry.atmosphere.dev/library/libvirt-tls-sidecar
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - go.mod
+      - go.sum
+      - cmd/.*
+      - internal/.*
+      - Dockerfile
+
+- job:
+    name: atmosphere-upload-container-image-libvirt-tls-sidecar
+    parent: atmosphere-upload-container-image
+    vars: *container_image_vars
+    files: *container_image_files
+
+- job:
+    name: atmosphere-promote-container-image-libvirt-tls-sidecar
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/container-images/libvirtd.yaml b/zuul.d/container-images/libvirtd.yaml
new file mode 100644
index 0000000..6713e4b
--- /dev/null
+++ b/zuul.d/container-images/libvirtd.yaml
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-libvirtd
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-libvirtd
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-libvirtd
+
+- job:
+    name: atmosphere-build-container-image-libvirtd
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-openstack-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-libvirtd
+      container_images:
+        - context: images/libvirtd
+          repository: registry.atmosphere.dev/library/libvirtd
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/openstack-runtime/.*
+
+- job:
+    name: atmosphere-upload-container-image-libvirtd
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/magnum.yaml b/zuul.d/container-images/magnum.yaml
new file mode 100644
index 0000000..96eb257
--- /dev/null
+++ b/zuul.d/container-images/magnum.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-magnum
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-magnum
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-magnum
+
+- job:
+    name: atmosphere-build-container-image-magnum
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-magnum
+      container_images:
+        - context: images/magnum
+          repository: registry.atmosphere.dev/library/magnum
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=magnum
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/magnum/.*
+
+- job:
+    name: atmosphere-upload-container-image-magnum
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/manila.yaml b/zuul.d/container-images/manila.yaml
new file mode 100644
index 0000000..11bca93
--- /dev/null
+++ b/zuul.d/container-images/manila.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-manila
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-manila
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-manila
+
+- job:
+    name: atmosphere-build-container-image-manila
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-manila
+      container_images:
+        - context: images/manila
+          repository: registry.atmosphere.dev/library/manila
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=manila
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/manila/.*
+
+- job:
+    name: atmosphere-upload-container-image-manila
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/netoffload.yaml b/zuul.d/container-images/netoffload.yaml
new file mode 100644
index 0000000..0d8fde1
--- /dev/null
+++ b/zuul.d/container-images/netoffload.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-netoffload
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-netoffload
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-netoffload
+
+- job:
+    name: atmosphere-build-container-image-netoffload
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-netoffload
+      container_images:
+        - context: images/netoffload
+          repository: registry.atmosphere.dev/library/netoffload
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/netoffload/.*
+
+- job:
+    name: atmosphere-upload-container-image-netoffload
+    parent: atmosphere-upload-container-image
+    vars: *container_image_vars
+    files: *container_image_files
+
+- job:
+    name: atmosphere-promote-container-image-netoffload
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/container-images/neutron.yaml b/zuul.d/container-images/neutron.yaml
new file mode 100644
index 0000000..2c46f2a
--- /dev/null
+++ b/zuul.d/container-images/neutron.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-neutron
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-neutron
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-neutron
+
+- job:
+    name: atmosphere-build-container-image-neutron
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-neutron
+      container_images:
+        - context: images/neutron
+          repository: registry.atmosphere.dev/library/neutron
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=neutron
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/neutron/.*
+
+- job:
+    name: atmosphere-upload-container-image-neutron
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/nova-ssh.yaml b/zuul.d/container-images/nova-ssh.yaml
new file mode 100644
index 0000000..68a40c7
--- /dev/null
+++ b/zuul.d/container-images/nova-ssh.yaml
@@ -0,0 +1,70 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-nova-ssh
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-nova-ssh
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-nova-ssh
+
+- job:
+    name: atmosphere-build-container-image-nova-ssh
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-openstack-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-nova-ssh
+      container_images:
+        - context: images/nova-ssh
+          repository: registry.atmosphere.dev/library/nova-ssh
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/openstack-runtime/.*
+      - images/nova-ssh/.*
+
+- job:
+    name: atmosphere-upload-container-image-nova-ssh
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/nova.yaml b/zuul.d/container-images/nova.yaml
new file mode 100644
index 0000000..b78c251
--- /dev/null
+++ b/zuul.d/container-images/nova.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-nova
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-nova
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-nova
+
+- job:
+    name: atmosphere-build-container-image-nova
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-nova
+      container_images:
+        - context: images/nova
+          repository: registry.atmosphere.dev/library/nova
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/nova/.*
+
+- job:
+    name: atmosphere-upload-container-image-nova
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/octavia.yaml b/zuul.d/container-images/octavia.yaml
new file mode 100644
index 0000000..1fc3a46
--- /dev/null
+++ b/zuul.d/container-images/octavia.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-octavia
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-octavia
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-octavia
+
+- job:
+    name: atmosphere-build-container-image-octavia
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-octavia
+      container_images:
+        - context: images/octavia
+          repository: registry.atmosphere.dev/library/octavia
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=octavia
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/octavia/.*
+
+- job:
+    name: atmosphere-upload-container-image-octavia
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/openstack-python-runtime.yaml b/zuul.d/container-images/openstack-python-runtime.yaml
new file mode 100644
index 0000000..efb1efa
--- /dev/null
+++ b/zuul.d/container-images/openstack-python-runtime.yaml
@@ -0,0 +1,70 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-openstack-python-runtime
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-openstack-python-runtime
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-openstack-python-runtime
+
+- job:
+    name: atmosphere-build-container-image-openstack-python-runtime
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-openstack-python-runtime
+      container_images:
+        - context: images/openstack-runtime
+          repository: registry.atmosphere.dev/library/openstack-python-runtime
+          arch:
+            - linux/amd64
+          build_args:
+            - FROM=registry.atmosphere.dev/library/python-base:zed
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-runtime/.*
+
+- job:
+    name: atmosphere-upload-container-image-openstack-python-runtime
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/openstack-runtime.yaml b/zuul.d/container-images/openstack-runtime.yaml
new file mode 100644
index 0000000..379074a
--- /dev/null
+++ b/zuul.d/container-images/openstack-runtime.yaml
@@ -0,0 +1,63 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-openstack-runtime
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-openstack-runtime
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-openstack-runtime
+
+- job:
+    name: atmosphere-build-container-image-openstack-runtime
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-openstack-runtime
+      container_images:
+        - context: images/openstack-runtime
+          repository: registry.atmosphere.dev/library/openstack-runtime
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/openstack-runtime/.*
+
+- job:
+    name: atmosphere-upload-container-image-openstack-runtime
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/openstack-venv-builder.yaml b/zuul.d/container-images/openstack-venv-builder.yaml
new file mode 100644
index 0000000..376d68e
--- /dev/null
+++ b/zuul.d/container-images/openstack-venv-builder.yaml
@@ -0,0 +1,68 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-openstack-venv-builder
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-openstack-venv-builder
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-openstack-venv-builder
+
+- job:
+    name: atmosphere-build-container-image-openstack-venv-builder
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-openstack-venv-builder
+      container_images:
+        - context: images/openstack-venv-builder
+          repository: registry.atmosphere.dev/library/openstack-venv-builder
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+
+- job:
+    name: atmosphere-upload-container-image-openstack-venv-builder
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/openvswitch.yaml b/zuul.d/container-images/openvswitch.yaml
new file mode 100644
index 0000000..2938381
--- /dev/null
+++ b/zuul.d/container-images/openvswitch.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-openvswitch
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-openvswitch
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-openvswitch
+
+- job:
+    name: atmosphere-build-container-image-openvswitch
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-openvswitch
+      container_images:
+        - context: images/openvswitch
+          repository: registry.atmosphere.dev/library/openvswitch
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/openvswitch/.*
+
+- job:
+    name: atmosphere-upload-container-image-openvswitch
+    parent: atmosphere-upload-container-image
+    vars: *container_image_vars
+    files: *container_image_files
+
+- job:
+    name: atmosphere-promote-container-image-openvswitch
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/container-images/ovn.yaml b/zuul.d/container-images/ovn.yaml
new file mode 100644
index 0000000..6650af8
--- /dev/null
+++ b/zuul.d/container-images/ovn.yaml
@@ -0,0 +1,68 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-ovn
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-ovn
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-ovn
+
+- job:
+    name: atmosphere-build-container-image-ovn
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-openvswitch
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-ovn
+      container_images:
+        - context: images/ovn
+          repository: registry.atmosphere.dev/library/ovn-central
+          arch:
+            - linux/amd64
+          build_args:
+            - OVN_COMPONENT=central
+          tags:
+            - zed
+        - context: images/ovn
+          repository: registry.atmosphere.dev/library/ovn-host
+          arch:
+            - linux/amd64
+          build_args:
+            - OVN_COMPONENT=host
+          tags:
+            - zed
+    files: &container_image_files
+      - images/openvswitch/.*
+      - images/ovn/.*
+
+- job:
+    name: atmosphere-upload-container-image-ovn
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/placement.yaml b/zuul.d/container-images/placement.yaml
new file mode 100644
index 0000000..f4fbd80
--- /dev/null
+++ b/zuul.d/container-images/placement.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-placement
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-placement
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-placement
+
+- job:
+    name: atmosphere-build-container-image-placement
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-placement
+      container_images:
+        - context: images/placement
+          repository: registry.atmosphere.dev/library/placement
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=placement
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/placement/.*
+
+- job:
+    name: atmosphere-upload-container-image-placement
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/python-base.yaml b/zuul.d/container-images/python-base.yaml
new file mode 100644
index 0000000..22fef49
--- /dev/null
+++ b/zuul.d/container-images/python-base.yaml
@@ -0,0 +1,63 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-python-base
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-python-base
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-python-base
+
+- job:
+    name: atmosphere-build-container-image-python-base
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-python-base
+      container_images:
+        - context: images/python-base
+          repository: registry.atmosphere.dev/library/python-base
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+
+- job:
+    name: atmosphere-upload-container-image-python-base
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/senlin.yaml b/zuul.d/container-images/senlin.yaml
new file mode 100644
index 0000000..fb77c5d
--- /dev/null
+++ b/zuul.d/container-images/senlin.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-senlin
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-senlin
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-senlin
+
+- job:
+    name: atmosphere-build-container-image-senlin
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-senlin
+      container_images:
+        - context: images/senlin
+          repository: registry.atmosphere.dev/library/senlin
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=senlin
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/senlin/.*
+
+- job:
+    name: atmosphere-upload-container-image-senlin
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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-senlin
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/container-images/staffeln.yaml b/zuul.d/container-images/staffeln.yaml
new file mode 100644
index 0000000..5cf8dee
--- /dev/null
+++ b/zuul.d/container-images/staffeln.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-staffeln
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-staffeln
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-staffeln
+
+- job:
+    name: atmosphere-build-container-image-staffeln
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-staffeln
+      container_images:
+        - context: images/staffeln
+          repository: registry.atmosphere.dev/library/staffeln
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=staffeln
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/staffeln/.*
+
+- job:
+    name: atmosphere-upload-container-image-staffeln
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/tempest.yaml b/zuul.d/container-images/tempest.yaml
new file mode 100644
index 0000000..86cf038
--- /dev/null
+++ b/zuul.d/container-images/tempest.yaml
@@ -0,0 +1,80 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-tempest
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-tempest
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-tempest
+
+- job:
+    name: atmosphere-build-container-image-tempest
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+      - name: atmosphere-build-container-image-ubuntu-cloud-archive
+        soft: true
+      - name: atmosphere-build-container-image-python-base
+        soft: true
+      - name: atmosphere-build-container-image-openstack-venv-builder
+        soft: true
+      - name: atmosphere-build-container-image-openstack-python-runtime
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-tempest
+      container_images:
+        - context: images/tempest
+          repository: registry.atmosphere.dev/library/tempest
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=tempest
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+      - images/python-base/.*
+      - images/openstack-venv-builder/.*
+      - images/openstack-python-runtime/.*
+      - images/tempest/.*
+
+- job:
+    name: atmosphere-upload-container-image-tempest
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/ubuntu-cloud-archive.yaml b/zuul.d/container-images/ubuntu-cloud-archive.yaml
new file mode 100644
index 0000000..fc10eab
--- /dev/null
+++ b/zuul.d/container-images/ubuntu-cloud-archive.yaml
@@ -0,0 +1,58 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-ubuntu-cloud-archive
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-ubuntu-cloud-archive
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-ubuntu-cloud-archive
+
+- job:
+    name: atmosphere-build-container-image-ubuntu-cloud-archive
+    parent: atmosphere-build-container-image
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-ubuntu-cloud-archive
+      container_images:
+        - context: images/ubuntu-cloud-archive
+          repository: registry.atmosphere.dev/library/ubuntu-cloud-archive
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/ubuntu-cloud-archive/.*
+
+- job:
+    name: atmosphere-upload-container-image-ubuntu-cloud-archive
+    parent: atmosphere-upload-container-image
+    dependencies:
+      - 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
+    files: *container_image_files
diff --git a/zuul.d/container-images/ubuntu.yaml b/zuul.d/container-images/ubuntu.yaml
new file mode 100644
index 0000000..466079a
--- /dev/null
+++ b/zuul.d/container-images/ubuntu.yaml
@@ -0,0 +1,51 @@
+# Copyright (c) 2024 VEXXHOST, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+- project:
+    check:
+      jobs:
+        - atmosphere-build-container-image-ubuntu
+    gate:
+      jobs:
+        - atmosphere-upload-container-image-ubuntu
+    promote:
+      jobs:
+        - atmosphere-promote-container-image-ubuntu
+
+- job:
+    name: atmosphere-build-container-image-ubuntu
+    parent: atmosphere-build-container-image
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-ubuntu
+      container_images:
+        - context: images/ubuntu
+          repository: registry.atmosphere.dev/library/ubuntu
+          arch:
+            - linux/amd64
+          tags:
+            - zed
+    files: &container_image_files
+      - images/ubuntu/.*
+
+- job:
+    name: atmosphere-upload-container-image-ubuntu
+    parent: atmosphere-upload-container-image
+    vars: *container_image_vars
+    files: *container_image_files
+
+- job:
+    name: atmosphere-promote-container-image-ubuntu
+    parent: atmosphere-promote-container-image
+    vars: *container_image_vars
+    files: *container_image_files
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 9a33828..0ba4adb 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -13,35 +13,12 @@
 # under the License.
 
 - job:
-    name: atmosphere-buildset-registry
-    pre-run: zuul.d/playbooks/buildset-registry/pre.yml
-    run: zuul.d/playbooks/buildset-registry/run.yml
-    ansible-split-streams: true
-
-- job:
-    name: atmosphere-upload-images
-    parent: atmosphere-buildset-registry
-    run: zuul.d/playbooks/buildset-registry/run.yml
-    secrets:
-      - registry_credentials
-      - cosign_key
-
-- job:
     name: atmosphere-molecule
     parent: tox
     abstract: true
     pre-run: zuul.d/playbooks/molecule/pre.yml
     run: zuul.d/playbooks/molecule/run.yml
     post-run: zuul.d/playbooks/molecule/post.yml
-    dependencies:
-      - atmosphere-buildset-registry
-
-- job:
-    name: atmosphere-molecule-keycloak
-    parent: atmosphere-molecule
-    pre-run: zuul.d/playbooks/molecule-keycloak/pre.yml
-    vars:
-      tox_envlist: molecule-keycloak
 
 - job:
     name: atmosphere-molecule-csi
@@ -64,11 +41,22 @@
     name: atmosphere-molecule-aio
     parent: atmosphere-molecule
     abstract: true
-    timeout: 7200
     pre-run: zuul.d/playbooks/molecule-aio/pre.yml
     post-run: zuul.d/playbooks/molecule-aio/post.yml
     roles:
       - zuul: openstack/openstack-helm-infra
+
+- job:
+    name: atmosphere-molecule-aio-keycloak
+    parent: atmosphere-molecule-aio
+    vars:
+      tox_envlist: molecule-keycloak
+
+- job:
+    name: atmosphere-molecule-aio-full
+    parent: atmosphere-molecule-aio
+    abstract: true
+    timeout: 7200
     nodeset:
       nodes:
         - name: ubuntu-jammy
@@ -76,13 +64,13 @@
 
 - job:
     name: atmosphere-molecule-aio-openvswitch
-    parent: atmosphere-molecule-aio
+    parent: atmosphere-molecule-aio-full
     vars:
       tox_envlist: molecule-aio-openvswitch
 
 - job:
     name: atmosphere-molecule-aio-ovn
-    parent: atmosphere-molecule-aio
+    parent: atmosphere-molecule-aio-full
     # NOTE(mnaser): https://github.com/vexxhost/atmosphere/issues/662
     voting: false
     vars:
diff --git a/zuul.d/playbooks/buildset-registry/pre.yml b/zuul.d/playbooks/buildset-registry/pre.yml
deleted file mode 100644
index 81304bb..0000000
--- a/zuul.d/playbooks/buildset-registry/pre.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2024 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-- name: Prepare host for building images
-  hosts: all
-  roles:
-    - ensure-docker
-    - run-buildset-registry
-    - use-buildset-registry
diff --git a/zuul.d/playbooks/buildset-registry/run.yml b/zuul.d/playbooks/buildset-registry/run.yml
deleted file mode 100644
index 7f8118c..0000000
--- a/zuul.d/playbooks/buildset-registry/run.yml
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright (c) 2024 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-- name: Build images
-  hosts: all
-  tasks:
-    # NOTE(mnaser): This can be removed once the following merges
-    #               https://review.opendev.org/c/zuul/zuul-jobs/+/915025
-    - name: Load "buildset_registry" fact
-      block:
-        - name: Check for results.json
-          stat:
-            path: "{{ zuul.executor.result_data_file }}"
-          register: result_json_stat
-          delegate_to: localhost
-        - name: Load information from zuul_return
-          no_log: true
-          set_fact:
-            buildset_registry: "{{ (lookup('file', zuul.executor.result_data_file) | from_json)['secret_data']['buildset_registry'] }}"
-          when:
-            - buildset_registry is not defined
-            - result_json_stat.stat.exists
-            - result_json_stat.stat.size > 0
-            - "'buildset_registry' in (lookup('file', zuul.executor.result_data_file) | from_json).get('secret_data')"
-
-    - name: Configure Buildkit certificates
-      when: buildset_registry is defined and buildset_registry.cert
-      become: true
-      block:
-        - name: Create a folder for the certificates
-          ansible.builtin.file:
-            path: "/etc/docker/certs.d/{{ buildset_registry.host }}:{{ buildset_registry.port }}"
-            state: directory
-        - name: Copy the certificate
-          ansible.builtin.copy:
-            content: "{{ buildset_registry.cert }}"
-            dest: "/etc/docker/certs.d/{{ buildset_registry.host }}:{{ buildset_registry.port }}/ca.crt"
-        - name: Create a buildkitd.toml file
-          ansible.builtin.copy:
-            dest: /etc/buildkitd.toml
-            content: |
-              [registry."{{ buildset_registry.host }}:{{ buildset_registry.port }}"]
-                ca=["/etc/docker/certs.d/{{ buildset_registry.host }}:{{ buildset_registry.port }}/ca.crt"]
-
-    - name: Create builder
-      ansible.builtin.shell: docker buildx create --name=atmosphere --driver=docker-container {% if buildset_registry.cert %}--config /etc/buildkitd.toml{% endif %}
-
-    - name: Point registry to Atmosphere if in post pipeline
-      when: zuul.pipeline == 'post'
-      no_log: true
-      ansible.builtin.set_fact:
-        buildset_registry:
-          host: registry.atmosphere.dev
-          port: 443
-          username: "{{ registry_credentials.username }}"
-          password: "{{ registry_credentials.password }}"
-
-    - name: Log into registry
-      docker_login:
-        registry: "{{ buildset_registry.host }}{% if buildset_registry.port != 443 %}:{{ buildset_registry.port }}{% endif %}"
-        username: "{{ buildset_registry.username }}"
-        password: "{{ buildset_registry.password }}"
-
-    - name: Build images
-      ansible.builtin.shell: |
-        docker buildx bake --builder=atmosphere --provenance --sbom=true --push
-      args:
-        chdir: "{{ zuul.project.src_dir }}"
-      environment:
-        REGISTRY: "{{ buildset_registry.host }}{% if buildset_registry.port != 443 %}:{{ buildset_registry.port }}{% endif %}/library"
-        PUSH_TO_CACHE: "{{ zuul.pipeline == 'post' }}"
-
-    - name: Get list of images built
-      ansible.builtin.shell: docker buildx bake --print
-      args:
-        chdir: "{{ zuul.project.src_dir }}"
-      environment:
-        REGISTRY: "{{ buildset_registry.host }}{% if buildset_registry.port != 443 %}:{{ buildset_registry.port }}{% endif %}/library"
-      register: images_built_json
-
-    - name: Set fact with list of images
-      set_fact:
-        images_built: "{{ images_built_json.stdout | from_json | json_query('target.*.tags[?@] | []') }}"
-
-    - name: Sign images
-      when: zuul.pipeline == 'post'
-      block:
-        - name: Download cosign binary
-          become: true
-          ansible.builtin.get_url:
-            url: https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64
-            dest: /usr/local/bin/cosign
-            mode: 0755
-
-        - name: Determine the digest for the images
-          ansible.builtin.shell: |
-            cosign triangulate --type=digest {{ item }}
-          loop: "{{ images_built }}"
-          register: cosign_digest
-
-        - name: Copy the cosign public key
-          copy:
-            content: "{{ cosign_key.public }}"
-            dest: cosign.pub
-
-        - name: Verify which images are signed
-          ignore_errors: true
-          ansible.builtin.shell: |
-            cosign verify --key cosign.pub --output json {{ item }}
-          loop: "{{ cosign_digest.results | map(attribute='stdout') | list | unique }}"
-          register: cosign_verify
-
-        - name: Copy the cosign private key
-          copy:
-            content: "{{ cosign_key.private }}"
-            dest: cosign.key
-
-        - name: Sign images
-          ansible.builtin.shell: |
-            cosign sign -y --recursive --key cosign.key {{ item }}
-          loop: "{{ cosign_verify.results | selectattr('failed', 'equalto', true) | map(attribute='item') | list }}"
-
-        - name: Delete the cosign private key
-          file:
-            path: cosign.key
-            state: absent
-
-    - name: Return Zuul artifacts for images
-      zuul_return:
-        data:
-          zuul:
-            artifacts:
-              - name: "{{ item }}"
-                url: "docker://{{ item }}"
-                metadata:
-                  type: container_image
-                  repository: "{{ item.split(':')[0] }}"
-                  tag: "{{ item.split(':')[1] }}"
-      loop: "{{ images_built }}"
-
-- name: Yield to other jobs
-  hosts: localhost
-  tasks:
-    - name: Pause the job
-      zuul_return:
-        data:
-          zuul:
-            pause: true
diff --git a/zuul.d/playbooks/molecule-keycloak/pre.yml b/zuul.d/playbooks/molecule-keycloak/pre.yml
deleted file mode 100644
index ab0c6e1..0000000
--- a/zuul.d/playbooks/molecule-keycloak/pre.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2024 VEXXHOST, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-- name: Prepare host for Keycloak tests
-  hosts: all
-  roles:
-    - ensure-docker
diff --git a/zuul.d/playbooks/molecule/pre.yml b/zuul.d/playbooks/molecule/pre.yml
index f9f2213..a4bc692 100644
--- a/zuul.d/playbooks/molecule/pre.yml
+++ b/zuul.d/playbooks/molecule/pre.yml
@@ -59,8 +59,15 @@
         - name: Replace the registry in image manifest
           ansible.builtin.replace:
             path: "{{ zuul.project.src_dir }}/roles/defaults/vars/main.yml"
-            regexp: "registry.atmosphere.dev/library/([^@]*)@sha256:[a-fA-F0-9]{64}"
-            replace: '{{ buildset_registry.host }}:{{ buildset_registry.port }}/library/\1'
+            regexp: "{{ repo }}:{{ tag }}"
+            replace: '{{ buildset_registry.host }}:{{ buildset_registry.port }}/{{ repo }}:{{ tag }}'
+          loop: "{{ zuul.artifacts | default([]) }}"
+          loop_control:
+            loop_var: zj_zuul_artifact
+          when: "'metadata' in zj_zuul_artifact and zj_zuul_artifact.metadata.type | default('') == 'container_image'"
+          vars:
+            repo: "{{ zj_zuul_artifact.metadata.repository }}"
+            tag: "{{ zj_zuul_artifact.metadata.tag }}"
 
     # TODO(mnaser): Drop this when we move to PBR
     - name: Add current folder to Git's safe directories
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 55e21fa..51aba1a 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -13,14 +13,128 @@
 # under the License.
 
 - project:
+    merge-mode: squash-merge
     check:
       jobs:
-        - atmosphere-buildset-registry
-        - atmosphere-molecule-aio-openvswitch
-        - atmosphere-molecule-aio-ovn
-        - atmosphere-molecule-csi-local-path-provisioner
-        - atmosphere-molecule-csi-rbd
-        - atmosphere-molecule-keycloak
-    post:
+        - atmosphere-molecule-aio-keycloak:
+            dependencies: &molecule_check_dependencies
+              - name: atmosphere-build-container-image-barbican
+                soft: true
+              - name: atmosphere-build-container-image-cinder
+                soft: true
+              - name: atmosphere-build-container-image-cluster-api-provider-openstack
+                soft: true
+              - name: atmosphere-build-container-image-designate
+                soft: true
+              - name: atmosphere-build-container-image-glance
+                soft: true
+              - name: atmosphere-build-container-image-heat
+                soft: true
+              - name: atmosphere-build-container-image-horizon
+                soft: true
+              - name: atmosphere-build-container-image-ironic
+                soft: true
+              - name: atmosphere-build-container-image-keystone
+                soft: true
+              - name: atmosphere-build-container-image-kubernetes-entrypoint
+                soft: true
+              - name: atmosphere-build-container-image-libvirt-tls-sidecar
+                soft: true
+              - name: atmosphere-build-container-image-libvirtd
+                soft: true
+              - name: atmosphere-build-container-image-magnum
+                soft: true
+              - name: atmosphere-build-container-image-manila
+                soft: true
+              - name: atmosphere-build-container-image-netoffload
+                soft: true
+              - name: atmosphere-build-container-image-neutron
+                soft: true
+              - name: atmosphere-build-container-image-nova
+                soft: true
+              - name: atmosphere-build-container-image-nova-ssh
+                soft: true
+              - name: atmosphere-build-container-image-octavia
+                soft: true
+              - name: atmosphere-build-container-image-openvswitch
+                soft: true
+              - name: atmosphere-build-container-image-ovn
+                soft: true
+              - name: atmosphere-build-container-image-placement
+                soft: true
+              - name: atmosphere-build-container-image-senlin
+                soft: true
+              - name: atmosphere-build-container-image-staffeln
+                soft: true
+              - name: atmosphere-build-container-image-tempest
+                soft: true
+        - atmosphere-molecule-aio-openvswitch:
+            dependencies: *molecule_check_dependencies
+        - atmosphere-molecule-aio-ovn:
+            dependencies: *molecule_check_dependencies
+        - atmosphere-molecule-csi-local-path-provisioner:
+            dependencies: *molecule_check_dependencies
+        - atmosphere-molecule-csi-rbd:
+            dependencies: *molecule_check_dependencies
+    gate:
       jobs:
-        - atmosphere-upload-images
+        - atmosphere-molecule-aio-keycloak:
+            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-cluster-api-provider-openstack
+                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-keystone
+                soft: true
+              - name: atmosphere-upload-container-image-kubernetes-entrypoint
+                soft: true
+              - name: atmosphere-upload-container-image-libvirt-tls-sidecar
+                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-senlin
+                soft: true
+              - name: atmosphere-upload-container-image-staffeln
+                soft: true
+              - name: atmosphere-upload-container-image-tempest
+                soft: true
+        - atmosphere-molecule-aio-openvswitch:
+            dependencies: *molecule_gate_dependencies
+        - atmosphere-molecule-aio-ovn:
+            dependencies: *molecule_gate_dependencies
+        - atmosphere-molecule-csi-local-path-provisioner:
+            dependencies: *molecule_gate_dependencies
+        - atmosphere-molecule-csi-rbd:
+            dependencies: *molecule_gate_dependencies
diff --git a/zuul.d/secrets.yaml b/zuul.d/secrets.yaml
index 9cbc362..5208efb 100644
--- a/zuul.d/secrets.yaml
+++ b/zuul.d/secrets.yaml
@@ -13,20 +13,21 @@
 # under the License.
 
 - secret:
-    name: registry_credentials
+    name: atmosphere-registry-credentials
     data:
-      username: robot$zuul
-      password: !encrypted/pkcs1-oaep
-        - OOykjodZE21qsYYLpzplp+PV0QbsKQ1B3+kI7bY97VQI/d5RlewqlNABc10eQnyYFSDvq
-          z2gSigSHxaVcV5qKJLTNVDgzSBHBj349OaTh6dXsxplvoArehfYMMZGuNmFlucoeN8K6w
-          yLRViN7tCS39CAYdjeNX1X7mQ7gBC61jUQ++JB+R5MhXmALJxzPfQRl9jsYmjx9ZXjEwE
-          tjKLSyQifQU20eXbhZOUW2nr+ItTikS3AOSo6Ja6jCI1c9lj6mJtUOorGsuxfdhEigPws
-          Qnz539imGcyqySSxvbJvgoEYxhE3dHFV5cJkomoHHHwLH0wbjAgBQtCMX3CvpxNX8sBfJ
-          MxvUkxY8VWt3CtJkdq+/eaCovCRn6GN5enI5tlUJgpAyV+PO6PvkTan6yC8lHMM5pD4jX
-          Hdo6gt6m9WyA5VxUHdoYYMaDO/rvCxxrUevzPn8do5I96madr9S9lFARqw74mgXG5I6pZ
-          M7zDXnorUFyv9dUIB2rOZrp7o0OC2thujjDTKXb4qfmfXGOwlkNmtCLo6BaDo9pSdRN8p
-          k0YnUAItZ64qUR7paEUKGy4rzsZjDYvIj7DrCFvLL2CXcyjPGcmcblpSHe5vJ15CFVH8X
-          o39FIIhSmehvrYJziGYUgf4JY1B6ktBtFc9l78WeoJRHNce+viSSkBj1fhbUaI=
+      registry.atmosphere.dev:
+        username: robot$zuul
+        password: !encrypted/pkcs1-oaep
+          - OOykjodZE21qsYYLpzplp+PV0QbsKQ1B3+kI7bY97VQI/d5RlewqlNABc10eQnyYFSDvq
+            z2gSigSHxaVcV5qKJLTNVDgzSBHBj349OaTh6dXsxplvoArehfYMMZGuNmFlucoeN8K6w
+            yLRViN7tCS39CAYdjeNX1X7mQ7gBC61jUQ++JB+R5MhXmALJxzPfQRl9jsYmjx9ZXjEwE
+            tjKLSyQifQU20eXbhZOUW2nr+ItTikS3AOSo6Ja6jCI1c9lj6mJtUOorGsuxfdhEigPws
+            Qnz539imGcyqySSxvbJvgoEYxhE3dHFV5cJkomoHHHwLH0wbjAgBQtCMX3CvpxNX8sBfJ
+            MxvUkxY8VWt3CtJkdq+/eaCovCRn6GN5enI5tlUJgpAyV+PO6PvkTan6yC8lHMM5pD4jX
+            Hdo6gt6m9WyA5VxUHdoYYMaDO/rvCxxrUevzPn8do5I96madr9S9lFARqw74mgXG5I6pZ
+            M7zDXnorUFyv9dUIB2rOZrp7o0OC2thujjDTKXb4qfmfXGOwlkNmtCLo6BaDo9pSdRN8p
+            k0YnUAItZ64qUR7paEUKGy4rzsZjDYvIj7DrCFvLL2CXcyjPGcmcblpSHe5vJ15CFVH8X
+            o39FIIhSmehvrYJziGYUgf4JY1B6ktBtFc9l78WeoJRHNce+viSSkBj1fhbUaI=
 
 - secret:
     name: cosign_key