Build "master" images in "main" (#1090)

Signed-off-by: Mohammed Naser <mnaser@vexxhost.com>
diff --git a/zuul.d/container-images/barbican.yaml b/zuul.d/container-images/barbican.yaml
new file mode 100644
index 0000000..e1059da
--- /dev/null
+++ b/zuul.d/container-images/barbican.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/barbican
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=barbican
+          tags:
+            - main
+    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..ec6dd7f
--- /dev/null
+++ b/zuul.d/container-images/cinder.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/cinder
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=cinder
+          tags:
+            - main
+    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..16777dd
--- /dev/null
+++ b/zuul.d/container-images/cluster-api-provider-openstack.yaml
@@ -0,0 +1,52 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/capi-openstack-controller
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..be2943c
--- /dev/null
+++ b/zuul.d/container-images/designate.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/designate
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=designate
+          tags:
+            - main
+    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..d59f887
--- /dev/null
+++ b/zuul.d/container-images/glance.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/glance
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=glance
+          tags:
+            - main
+    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..61b462d
--- /dev/null
+++ b/zuul.d/container-images/heat.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/heat
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=heat
+          tags:
+            - main
+    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..1db9b83
--- /dev/null
+++ b/zuul.d/container-images/horizon.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/horizon
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=horizon
+          tags:
+            - main
+    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..8e1cbe7
--- /dev/null
+++ b/zuul.d/container-images/ironic.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/ironic
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=ironic
+          tags:
+            - main
+    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..e65eaa4
--- /dev/null
+++ b/zuul.d/container-images/keystone.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/keystone
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=keystone
+          tags:
+            - main
+    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..3b3e147
--- /dev/null
+++ b/zuul.d/container-images/kubernetes-entrypoint.yaml
@@ -0,0 +1,52 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/kubernetes-entrypoint
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..eae34a9
--- /dev/null
+++ b/zuul.d/container-images/libvirt-tls-sidecar.yaml
@@ -0,0 +1,64 @@
+# 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
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-libvirt-tls-sidecar
+      container_images:
+        - context: .
+          target: libvirt-tls-sidecar
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/libvirt-tls-sidecar
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    files: &container_image_files
+      - images/ubuntu/.*
+      - cmd/.*
+      - internal/.*
+      - Dockerfile
+      - go.mod
+      - go.sum
+
+- job:
+    name: atmosphere-upload-container-image-libvirt-tls-sidecar
+    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-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..23f53d0
--- /dev/null
+++ b/zuul.d/container-images/libvirtd.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-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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/libvirtd
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - main
+    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..b1f9c88
--- /dev/null
+++ b/zuul.d/container-images/magnum.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/magnum
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=magnum
+          tags:
+            - main
+    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..b907129
--- /dev/null
+++ b/zuul.d/container-images/manila.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/manila
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=manila
+          tags:
+            - main
+    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..40aa81f
--- /dev/null
+++ b/zuul.d/container-images/netoffload.yaml
@@ -0,0 +1,59 @@
+# 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
+    dependencies:
+      - name: atmosphere-build-container-image-ubuntu
+        soft: true
+    vars: &container_image_vars
+      promote_container_image_job: atmosphere-upload-container-image-netoffload
+      container_images:
+        - context: images/netoffload
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/netoffload
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    files: &container_image_files
+      - images/ubuntu/.*
+      - images/netoffload/.*
+
+- job:
+    name: atmosphere-upload-container-image-netoffload
+    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-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..101490a
--- /dev/null
+++ b/zuul.d/container-images/neutron.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/neutron
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=neutron
+          tags:
+            - main
+    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..4b5502d
--- /dev/null
+++ b/zuul.d/container-images/nova-ssh.yaml
@@ -0,0 +1,71 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/nova-ssh
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - main
+    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..35f7e0a
--- /dev/null
+++ b/zuul.d/container-images/nova.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/nova
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=nova
+          tags:
+            - main
+    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..4cb7f6b
--- /dev/null
+++ b/zuul.d/container-images/octavia.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/octavia
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=octavia
+          tags:
+            - main
+    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..d4119ef
--- /dev/null
+++ b/zuul.d/container-images/openstack-python-runtime.yaml
@@ -0,0 +1,71 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/openstack-python-runtime
+          arch:
+            - linux/amd64
+          build_args:
+            - FROM=registry.atmosphere.dev/library/python-base:main
+          tags:
+            - main
+    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..8b6be30
--- /dev/null
+++ b/zuul.d/container-images/openstack-runtime.yaml
@@ -0,0 +1,64 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/openstack-runtime
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..ad0792b
--- /dev/null
+++ b/zuul.d/container-images/openstack-venv-builder.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-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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/openstack-venv-builder
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..090f51c
--- /dev/null
+++ b/zuul.d/container-images/openvswitch.yaml
@@ -0,0 +1,52 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/openvswitch
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..67eaaec
--- /dev/null
+++ b/zuul.d/container-images/ovn.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-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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/ovn-central
+          arch:
+            - linux/amd64
+          build_args:
+            - OVN_COMPONENT=central
+          tags:
+            - main
+        - context: images/ovn
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/ovn-host
+          arch:
+            - linux/amd64
+          build_args:
+            - OVN_COMPONENT=host
+          tags:
+            - main
+    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..1902aa5
--- /dev/null
+++ b/zuul.d/container-images/placement.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/placement
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=placement
+          tags:
+            - main
+    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..8eb63c4
--- /dev/null
+++ b/zuul.d/container-images/python-base.yaml
@@ -0,0 +1,64 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/python-base
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..225823a
--- /dev/null
+++ b/zuul.d/container-images/senlin.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/senlin
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=senlin
+          tags:
+            - main
+    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..93e6845
--- /dev/null
+++ b/zuul.d/container-images/staffeln.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/staffeln
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=staffeln
+          tags:
+            - main
+    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..a9f5dc6
--- /dev/null
+++ b/zuul.d/container-images/tempest.yaml
@@ -0,0 +1,81 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/tempest
+          arch:
+            - linux/amd64
+          build_args:
+            - PROJECT=tempest
+          tags:
+            - main
+    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..1f0a4ef
--- /dev/null
+++ b/zuul.d/container-images/ubuntu-cloud-archive.yaml
@@ -0,0 +1,59 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/ubuntu-cloud-archive
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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..e7966a0
--- /dev/null
+++ b/zuul.d/container-images/ubuntu.yaml
@@ -0,0 +1,52 @@
+# 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
+          registry: registry.atmosphere.dev
+          repository: registry.atmosphere.dev/library/ubuntu
+          arch:
+            - linux/amd64
+          tags:
+            - main
+    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