Initial commit
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..1230149
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "daily"
diff --git a/hack/generate-github-workflows b/hack/generate-github-workflows
new file mode 100755
index 0000000..b327278
--- /dev/null
+++ b/hack/generate-github-workflows
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+
+import yaml
+
+PROJECTS = ["nova"]
+
+RELEASES = ["wallaby"]
+
+
+def get_ref_for_project(project, release):
+    return (
+        open(f"images/openstack/projects/{project}/{release}/ref", "r").read().strip()
+    )
+
+
+def get_profiles_for_project(project):
+    try:
+        return open(f"images/openstack/projects/{project}/profiles", "r").read().strip()
+    except FileNotFoundError:
+        return ""
+
+
+def get_dist_packages_for_project(project):
+    try:
+        return (
+            open(f"images/openstack/projects/{project}/dist-packages", "r")
+            .read()
+            .strip()
+        )
+    except FileNotFoundError:
+        return ""
+
+
+def get_pip_packages_for_project(project):
+    try:
+        return (
+            open(f"images/openstack/projects/{project}/pip-packages", "r")
+            .read()
+            .strip()
+        )
+    except FileNotFoundError:
+        return ""
+
+
+def get_build_args_for_project(project, release):
+    return {
+        "RELEASE": release,
+        "PROJECT": project,
+        "PROJECT_REF": get_ref_for_project(project, release),
+        "PROFILES": get_profiles_for_project(project),
+        "DIST_PACKAGES": get_dist_packages_for_project(project),
+        "PIP_PACKAGES": get_pip_packages_for_project(project),
+    }
+
+
+def get_platforms_for_project(project):
+    try:
+        return (
+            open(f"images/openstack/projects/{project}/platforms", "r").read().strip()
+        )
+    except FileNotFoundError:
+        return "linux/amd64"
+
+
+def get_job_for_project(project, release):
+    build_args = get_build_args_for_project(project, release)
+    ref = get_ref_for_project(project, release)
+
+    return {
+        "uses": "docker/build-push-action@v3.1.1",
+        "with": {
+            "context": "images/openstack",
+            "cache-from": f"type=registry,ref=quay.io/vexxhost/{project}:{release}",
+            "cache-to": "type=inline",
+            "push": True,
+            "platforms": get_platforms_for_project(project),
+            "build-args": "\n".join([f"{k}={v}" for k, v in build_args.items()]),
+            "tags": f"quay.io/vexxhost/{project}:{ref}",
+        },
+    }
+
+
+for release in RELEASES:
+    # - uses: docker/build-push-action@v3
+    #   with:
+    #     context: .
+    #     cache-from: type=registry,ref=quay.io/vexxhost/${{ matrix.project }}:${{ matrix.release }}
+    #     cache-to: type=inline
+    #     push: ${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}
+    #     platforms: ${{ env.PLATFORMS }}
+    #     build-args: |
+    #       RELEASE=${{ matrix.release }}
+    #       PROJECT=${{ matrix.project }}
+    #       PROJECT_REF=${{ env.PROJECT_REF }}
+    #       PROFILES=${{ env.PROFILES }}
+    #       DIST_PACKAGES=${{ env.DIST_PACKAGES }}
+    #       PIP_PACKAGES=${{ env.PIP_PACKAGES }}
+    #     tags: |
+    #       quay.io/vexxhost/${{ matrix.project }}:${{ env.PROJECT_REF }}
+
+    build_openstack_images_steps = (
+        [
+            {"uses": "actions/checkout@v3.0.2"},
+            {"uses": "docker/setup-qemu-action@v2.0.0"},
+            {"uses": "docker/setup-buildx-action@v2.0.0"},
+            {
+                "uses": "docker/login-action@v2.0.0",
+                "with": {
+                    "registry": "quay.io",
+                    "username": "${{ secrets.QUAY_USERNAME }}",
+                    "password": "${{ secrets.QUAY_ROBOT_TOKEN }}",
+                },
+            },
+        ]
+        + [get_job_for_project(project, release) for project in PROJECTS]
+        + [
+            # molecule
+            # promote image if it is the default branch
+        ]
+    )
+
+    workflow = {
+        "name": f"test-{release}",
+        "on": {
+            "pull_request": {},
+            "push": {"branches": ["main"]},
+        },
+        "jobs": {
+            "build-images": {
+                "runs-on": "ubuntu-latest",
+                "steps": build_openstack_images_steps,
+            }
+        },
+    }
+
+    print(yaml.dump(workflow, sort_keys=False))
diff --git a/images/master.yml b/images/master.yml
deleted file mode 100644
index 80357aa..0000000
--- a/images/master.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2022 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.
-
-registry: us-docker.pkg.dev/vexxhost-infra/openstack
-
-projects:
-  tempest:
-    branch: master
-    revision: 44dac69eb77d78a0de8e68e63617099249345578
-    tag: 30.1.0-5
-    dist_packages:
-      - iputils-ping
-    pip_packages:
-      - keystone-tempest-plugin
-      - cinder-tempest-plugin
-      - neutron-tempest-plugin
-      - heat-tempest-plugin
\ No newline at end of file
diff --git a/images/openstack/.dockerignore b/images/openstack/.dockerignore
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/images/openstack/.dockerignore
@@ -0,0 +1 @@
+*
diff --git a/images/openstack/Dockerfile b/images/openstack/Dockerfile
new file mode 100644
index 0000000..4c0ca15
--- /dev/null
+++ b/images/openstack/Dockerfile
@@ -0,0 +1,10 @@
+# syntax=docker/dockerfile:1.4
+
+FROM quay.io/vexxhost/bindep-loci:latest AS bindep
+
+FROM quay.io/vexxhost/openstack-builder-focal:latest AS builder
+COPY --from=bindep --link /runtime-pip-packages /runtime-pip-packages
+
+FROM quay.io/vexxhost/openstack-runtime-focal:latest AS runtime
+COPY --from=bindep --link /runtime-dist-packages /runtime-dist-packages
+COPY --from=builder --link /var/lib/openstack /var/lib/openstack
diff --git a/images/openstack/projects/barbican/master/ref b/images/openstack/projects/barbican/master/ref
new file mode 100644
index 0000000..9cc360b
--- /dev/null
+++ b/images/openstack/projects/barbican/master/ref
@@ -0,0 +1 @@
+ff7fef62116bf5e128da1207752fb69a6193e606
diff --git a/images/openstack/projects/barbican/wallaby/ref b/images/openstack/projects/barbican/wallaby/ref
new file mode 100644
index 0000000..3b38cab
--- /dev/null
+++ b/images/openstack/projects/barbican/wallaby/ref
@@ -0,0 +1 @@
+486e60723f1f635b8e1843bccaf144d85556a9f6
diff --git a/images/openstack/projects/barbican/xena/ref b/images/openstack/projects/barbican/xena/ref
new file mode 100644
index 0000000..9887204
--- /dev/null
+++ b/images/openstack/projects/barbican/xena/ref
@@ -0,0 +1 @@
+bb2779473f786f3bb7b84bc4f445089da8cbfe88
diff --git a/images/openstack/projects/barbican/yoga/ref b/images/openstack/projects/barbican/yoga/ref
new file mode 100644
index 0000000..b94b5c2
--- /dev/null
+++ b/images/openstack/projects/barbican/yoga/ref
@@ -0,0 +1 @@
+29e8fd054dbee79be2403e81fbe864aef8773ffe
diff --git a/images/openstack/projects/cinder/master/ref b/images/openstack/projects/cinder/master/ref
new file mode 100644
index 0000000..2735487
--- /dev/null
+++ b/images/openstack/projects/cinder/master/ref
@@ -0,0 +1 @@
+cf2b3005aa39b5700f51be0140c61ad9f8ec47db
diff --git a/images/openstack/projects/cinder/profiles b/images/openstack/projects/cinder/profiles
new file mode 100644
index 0000000..8f01a6e
--- /dev/null
+++ b/images/openstack/projects/cinder/profiles
@@ -0,0 +1 @@
+ceph qemu
diff --git a/images/openstack/projects/cinder/wallaby/ref b/images/openstack/projects/cinder/wallaby/ref
new file mode 100644
index 0000000..b78405b
--- /dev/null
+++ b/images/openstack/projects/cinder/wallaby/ref
@@ -0,0 +1 @@
+70164132dcc590c944fee36c58e93056a3447142
diff --git a/images/openstack/projects/cinder/xena/ref b/images/openstack/projects/cinder/xena/ref
new file mode 100644
index 0000000..1d7eb52
--- /dev/null
+++ b/images/openstack/projects/cinder/xena/ref
@@ -0,0 +1 @@
+b2caec7696817e02b0763d8b0d4f5d1b7f0b903e
diff --git a/images/openstack/projects/cinder/yoga/ref b/images/openstack/projects/cinder/yoga/ref
new file mode 100644
index 0000000..fe69f0c
--- /dev/null
+++ b/images/openstack/projects/cinder/yoga/ref
@@ -0,0 +1 @@
+9b583401adfd63d3d311bb9515f9a27b9b679a6f
diff --git a/images/openstack/projects/designate/dist-packages b/images/openstack/projects/designate/dist-packages
new file mode 100644
index 0000000..ed4a9d8
--- /dev/null
+++ b/images/openstack/projects/designate/dist-packages
@@ -0,0 +1 @@
+bind9utils
diff --git a/images/openstack/projects/designate/master/ref b/images/openstack/projects/designate/master/ref
new file mode 100644
index 0000000..e78e34e
--- /dev/null
+++ b/images/openstack/projects/designate/master/ref
@@ -0,0 +1 @@
+927e34ee5a53771530e78bcbbd74549c632b539a
diff --git a/images/openstack/projects/designate/wallaby/ref b/images/openstack/projects/designate/wallaby/ref
new file mode 100644
index 0000000..5c408d5
--- /dev/null
+++ b/images/openstack/projects/designate/wallaby/ref
@@ -0,0 +1 @@
+8cef906600117b71903b54c4d7c1e072902f7a46
diff --git a/images/openstack/projects/designate/xena/ref b/images/openstack/projects/designate/xena/ref
new file mode 100644
index 0000000..1fb9ce3
--- /dev/null
+++ b/images/openstack/projects/designate/xena/ref
@@ -0,0 +1 @@
+410c1e8d60a6b3844050dd4d3ecc46f640356bfb
diff --git a/images/openstack/projects/designate/yoga/ref b/images/openstack/projects/designate/yoga/ref
new file mode 100644
index 0000000..5767de4
--- /dev/null
+++ b/images/openstack/projects/designate/yoga/ref
@@ -0,0 +1 @@
+2dc40a15894d2c2010b7176ff6f1dff0c8621503
diff --git a/images/openstack/projects/glance/master/ref b/images/openstack/projects/glance/master/ref
new file mode 100644
index 0000000..92942be
--- /dev/null
+++ b/images/openstack/projects/glance/master/ref
@@ -0,0 +1 @@
+cb60c1d2facde2f318ec30c8b9cf63844eaccf92
diff --git a/images/openstack/projects/glance/profiles b/images/openstack/projects/glance/profiles
new file mode 100644
index 0000000..06b72b2
--- /dev/null
+++ b/images/openstack/projects/glance/profiles
@@ -0,0 +1 @@
+ceph
diff --git a/images/openstack/projects/glance/wallaby/ref b/images/openstack/projects/glance/wallaby/ref
new file mode 100644
index 0000000..6c9b70e
--- /dev/null
+++ b/images/openstack/projects/glance/wallaby/ref
@@ -0,0 +1 @@
+677c89c23631e9083261a1a18ed438d8966e0de2
diff --git a/images/openstack/projects/glance/xena/ref b/images/openstack/projects/glance/xena/ref
new file mode 100644
index 0000000..9dd5ee1
--- /dev/null
+++ b/images/openstack/projects/glance/xena/ref
@@ -0,0 +1 @@
+cbe6522e67c2e437e600b4fb153a1d048a310282
diff --git a/images/openstack/projects/glance/yoga/ref b/images/openstack/projects/glance/yoga/ref
new file mode 100644
index 0000000..f5dca06
--- /dev/null
+++ b/images/openstack/projects/glance/yoga/ref
@@ -0,0 +1 @@
+20110a7d0c310eac81635d1f8c60bce423418820
diff --git a/images/openstack/projects/heat/dist-packages b/images/openstack/projects/heat/dist-packages
new file mode 100644
index 0000000..13368f8
--- /dev/null
+++ b/images/openstack/projects/heat/dist-packages
@@ -0,0 +1 @@
+curl
diff --git a/images/openstack/projects/heat/master/ref b/images/openstack/projects/heat/master/ref
new file mode 100644
index 0000000..10c33bf
--- /dev/null
+++ b/images/openstack/projects/heat/master/ref
@@ -0,0 +1 @@
+f98d164be9c7fecd390b3e4822b33ad4054fcfca
diff --git a/images/openstack/projects/heat/wallaby/ref b/images/openstack/projects/heat/wallaby/ref
new file mode 100644
index 0000000..25e6527
--- /dev/null
+++ b/images/openstack/projects/heat/wallaby/ref
@@ -0,0 +1 @@
+d0e2ded71374cffab41499e75efb81782bf83ffa
diff --git a/images/openstack/projects/heat/xena/ref b/images/openstack/projects/heat/xena/ref
new file mode 100644
index 0000000..4f988ed
--- /dev/null
+++ b/images/openstack/projects/heat/xena/ref
@@ -0,0 +1 @@
+ead7cd61bd685ea46dd21c4ef3ea6b3fde273c10
diff --git a/images/openstack/projects/heat/yoga/ref b/images/openstack/projects/heat/yoga/ref
new file mode 100644
index 0000000..039247a
--- /dev/null
+++ b/images/openstack/projects/heat/yoga/ref
@@ -0,0 +1 @@
+a406dff43d2f057674da9e564071e78c533006e0
diff --git a/images/openstack/projects/horizon/master/ref b/images/openstack/projects/horizon/master/ref
new file mode 100644
index 0000000..7264682
--- /dev/null
+++ b/images/openstack/projects/horizon/master/ref
@@ -0,0 +1 @@
+857d17467adca804fab70c0d8a88f2bf89234ae5
diff --git a/images/openstack/projects/horizon/pip-packages b/images/openstack/projects/horizon/pip-packages
new file mode 100644
index 0000000..371088f
--- /dev/null
+++ b/images/openstack/projects/horizon/pip-packages
@@ -0,0 +1 @@
+designate-dashboard heat-dashboard ironic-ui magnum-ui neutron-vpnaas-dashboard octavia-dashboard senlin-dashboard monasca-ui
diff --git a/images/openstack/projects/horizon/profiles b/images/openstack/projects/horizon/profiles
new file mode 100644
index 0000000..a6b6519
--- /dev/null
+++ b/images/openstack/projects/horizon/profiles
@@ -0,0 +1 @@
+apache
diff --git a/images/openstack/projects/horizon/wallaby/ref b/images/openstack/projects/horizon/wallaby/ref
new file mode 100644
index 0000000..5ec72eb
--- /dev/null
+++ b/images/openstack/projects/horizon/wallaby/ref
@@ -0,0 +1 @@
+82698aa8901b0533f2e62868fabbf5ef4c36cea0
diff --git a/images/openstack/projects/horizon/xena/ref b/images/openstack/projects/horizon/xena/ref
new file mode 100644
index 0000000..c2467d5
--- /dev/null
+++ b/images/openstack/projects/horizon/xena/ref
@@ -0,0 +1 @@
+48b702adf75b7f19420df578d2bf9bf813099af5
diff --git a/images/openstack/projects/horizon/yoga/ref b/images/openstack/projects/horizon/yoga/ref
new file mode 100644
index 0000000..0e49067
--- /dev/null
+++ b/images/openstack/projects/horizon/yoga/ref
@@ -0,0 +1 @@
+a9ae00b16453b4d0ff1803651fe726da55a3f08d
diff --git a/images/openstack/projects/ironic/dist-packages b/images/openstack/projects/ironic/dist-packages
new file mode 100644
index 0000000..b2e234b
--- /dev/null
+++ b/images/openstack/projects/ironic/dist-packages
@@ -0,0 +1 @@
+ethtool lshw iproute2
diff --git a/images/openstack/projects/ironic/master/ref b/images/openstack/projects/ironic/master/ref
new file mode 100644
index 0000000..e237dc9
--- /dev/null
+++ b/images/openstack/projects/ironic/master/ref
@@ -0,0 +1 @@
+4a347b3069498d0f2b49105014e6e118b5972c0f
diff --git a/images/openstack/projects/ironic/pip-packages b/images/openstack/projects/ironic/pip-packages
new file mode 100644
index 0000000..38a3197
--- /dev/null
+++ b/images/openstack/projects/ironic/pip-packages
@@ -0,0 +1 @@
+python-dracclient sushy
diff --git a/images/openstack/projects/ironic/profiles b/images/openstack/projects/ironic/profiles
new file mode 100644
index 0000000..afa6dd3
--- /dev/null
+++ b/images/openstack/projects/ironic/profiles
@@ -0,0 +1 @@
+ipxe ipmi qemu tftp
diff --git a/images/openstack/projects/ironic/wallaby/ref b/images/openstack/projects/ironic/wallaby/ref
new file mode 100644
index 0000000..ca8374e
--- /dev/null
+++ b/images/openstack/projects/ironic/wallaby/ref
@@ -0,0 +1 @@
+35e20b62de1a867534d54de844496072ae291eac
diff --git a/images/openstack/projects/ironic/xena/ref b/images/openstack/projects/ironic/xena/ref
new file mode 100644
index 0000000..3f87750
--- /dev/null
+++ b/images/openstack/projects/ironic/xena/ref
@@ -0,0 +1 @@
+3f624e5caa83acf9b98443cf32cb0cd69143c6e2
diff --git a/images/openstack/projects/ironic/yoga/ref b/images/openstack/projects/ironic/yoga/ref
new file mode 100644
index 0000000..1072951
--- /dev/null
+++ b/images/openstack/projects/ironic/yoga/ref
@@ -0,0 +1 @@
+8034242c225f3293c08ca46dc588d00c5ad0e10a
diff --git a/images/openstack/projects/keystone/master/ref b/images/openstack/projects/keystone/master/ref
new file mode 100644
index 0000000..eeedcbf
--- /dev/null
+++ b/images/openstack/projects/keystone/master/ref
@@ -0,0 +1 @@
+1dd6993d7b9b647810e6f495b62c37627c6e8658
diff --git a/images/openstack/projects/keystone/profiles b/images/openstack/projects/keystone/profiles
new file mode 100644
index 0000000..a17f9a0
--- /dev/null
+++ b/images/openstack/projects/keystone/profiles
@@ -0,0 +1 @@
+apache ldap openidc
diff --git a/images/openstack/projects/keystone/wallaby/ref b/images/openstack/projects/keystone/wallaby/ref
new file mode 100644
index 0000000..35738a7
--- /dev/null
+++ b/images/openstack/projects/keystone/wallaby/ref
@@ -0,0 +1 @@
+6c75b657352a86e50e63aec44d28784d8863df99
diff --git a/images/openstack/projects/keystone/xena/ref b/images/openstack/projects/keystone/xena/ref
new file mode 100644
index 0000000..e2eb959
--- /dev/null
+++ b/images/openstack/projects/keystone/xena/ref
@@ -0,0 +1 @@
+e772caa58ec7afdef4bd5fb58e44dc21a78c237b
diff --git a/images/openstack/projects/keystone/yoga/ref b/images/openstack/projects/keystone/yoga/ref
new file mode 100644
index 0000000..5e2bc9e
--- /dev/null
+++ b/images/openstack/projects/keystone/yoga/ref
@@ -0,0 +1 @@
+74be2e2465277aa93932fb9cabb3781451fcbe8a
diff --git a/images/openstack/projects/magnum/master/ref b/images/openstack/projects/magnum/master/ref
new file mode 100644
index 0000000..2996ab5
--- /dev/null
+++ b/images/openstack/projects/magnum/master/ref
@@ -0,0 +1 @@
+60b338126601be3db42ba65d71649c4e3878b4f3
diff --git a/images/openstack/projects/magnum/wallaby/ref b/images/openstack/projects/magnum/wallaby/ref
new file mode 100644
index 0000000..b059a38
--- /dev/null
+++ b/images/openstack/projects/magnum/wallaby/ref
@@ -0,0 +1 @@
+a35f48e4357bf5f2601fbdaf62d2074719db1dd9
diff --git a/images/openstack/projects/magnum/xena/ref b/images/openstack/projects/magnum/xena/ref
new file mode 100644
index 0000000..fedd69f
--- /dev/null
+++ b/images/openstack/projects/magnum/xena/ref
@@ -0,0 +1 @@
+82a22387b91bb3c77261f42535be9c9d6b53a853
diff --git a/images/openstack/projects/magnum/yoga/ref b/images/openstack/projects/magnum/yoga/ref
new file mode 100644
index 0000000..0fbcdc2
--- /dev/null
+++ b/images/openstack/projects/magnum/yoga/ref
@@ -0,0 +1 @@
+2ae6cd95f18a1675ec6059e6434ee58a1868b07f
diff --git a/images/openstack/projects/monasca-agent/dist-packages b/images/openstack/projects/monasca-agent/dist-packages
new file mode 100644
index 0000000..0c67790
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/dist-packages
@@ -0,0 +1 @@
+iproute2 libvirt-clients lshw
diff --git a/images/openstack/projects/monasca-agent/master/ref b/images/openstack/projects/monasca-agent/master/ref
new file mode 100644
index 0000000..b9cf9f2
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/master/ref
@@ -0,0 +1 @@
+29be6e96a6c590221e7d2fd1e30dffc7aec519a9
diff --git a/images/openstack/projects/monasca-agent/pip-packages b/images/openstack/projects/monasca-agent/pip-packages
new file mode 100644
index 0000000..cf0b63a
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/pip-packages
@@ -0,0 +1 @@
+libvirt-python python-glanceclient python-neutronclient python-novaclient py3nvml
diff --git a/images/openstack/projects/monasca-agent/wallaby/ref b/images/openstack/projects/monasca-agent/wallaby/ref
new file mode 100644
index 0000000..a53326f
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/wallaby/ref
@@ -0,0 +1 @@
+8547772515174ec785ba2bb2dcc88965e0b094f9
diff --git a/images/openstack/projects/monasca-agent/xena/ref b/images/openstack/projects/monasca-agent/xena/ref
new file mode 100644
index 0000000..9dc60f3
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/xena/ref
@@ -0,0 +1 @@
+284233aa9e53601548ae2ec435331b59974aa5a7
diff --git a/images/openstack/projects/monasca-agent/yoga/ref b/images/openstack/projects/monasca-agent/yoga/ref
new file mode 100644
index 0000000..e94cfca
--- /dev/null
+++ b/images/openstack/projects/monasca-agent/yoga/ref
@@ -0,0 +1 @@
+f0b09bec09883680390d61860f91dc4322a9f084
diff --git a/images/openstack/projects/monasca-api/master/ref b/images/openstack/projects/monasca-api/master/ref
new file mode 100644
index 0000000..2ce81b6
--- /dev/null
+++ b/images/openstack/projects/monasca-api/master/ref
@@ -0,0 +1 @@
+658c68b593a4d83f59143dc6c7df81860d3f57cb
diff --git a/images/openstack/projects/monasca-api/profiles b/images/openstack/projects/monasca-api/profiles
new file mode 100644
index 0000000..b55b685
--- /dev/null
+++ b/images/openstack/projects/monasca-api/profiles
@@ -0,0 +1 @@
+apache influxdb
diff --git a/images/openstack/projects/monasca-api/wallaby/ref b/images/openstack/projects/monasca-api/wallaby/ref
new file mode 100644
index 0000000..ab7ce98
--- /dev/null
+++ b/images/openstack/projects/monasca-api/wallaby/ref
@@ -0,0 +1 @@
+6a18732f771dd299b9375ad0cf56aacfc0d1d156
diff --git a/images/openstack/projects/monasca-api/xena/ref b/images/openstack/projects/monasca-api/xena/ref
new file mode 100644
index 0000000..e6a1b08
--- /dev/null
+++ b/images/openstack/projects/monasca-api/xena/ref
@@ -0,0 +1 @@
+44956801556b79c14373aa533df4debbd1da0ad9
diff --git a/images/openstack/projects/monasca-api/yoga/ref b/images/openstack/projects/monasca-api/yoga/ref
new file mode 100644
index 0000000..30e1246
--- /dev/null
+++ b/images/openstack/projects/monasca-api/yoga/ref
@@ -0,0 +1 @@
+0b7851cab47c8e7484e3ce669c5d485bd180c504
diff --git a/images/openstack/projects/monasca-notification/master/ref b/images/openstack/projects/monasca-notification/master/ref
new file mode 100644
index 0000000..583d533
--- /dev/null
+++ b/images/openstack/projects/monasca-notification/master/ref
@@ -0,0 +1 @@
+5225304a268fbd7e5edc30ab6d2b0cbf3b92b565
diff --git a/images/openstack/projects/monasca-notification/wallaby/ref b/images/openstack/projects/monasca-notification/wallaby/ref
new file mode 100644
index 0000000..7fe25e1
--- /dev/null
+++ b/images/openstack/projects/monasca-notification/wallaby/ref
@@ -0,0 +1 @@
+b7f87925990f7f816a9b61ed542322d544d30265
diff --git a/images/openstack/projects/monasca-notification/xena/ref b/images/openstack/projects/monasca-notification/xena/ref
new file mode 100644
index 0000000..8ffa2de
--- /dev/null
+++ b/images/openstack/projects/monasca-notification/xena/ref
@@ -0,0 +1 @@
+a94f013ff4addceb93ab556b666f63da7ea820e5
diff --git a/images/openstack/projects/monasca-notification/yoga/ref b/images/openstack/projects/monasca-notification/yoga/ref
new file mode 100644
index 0000000..5625514
--- /dev/null
+++ b/images/openstack/projects/monasca-notification/yoga/ref
@@ -0,0 +1 @@
+50dac47ff801b784b9ad3cb701f6c9b04d0fa350
diff --git a/images/openstack/projects/monasca-persister/master/ref b/images/openstack/projects/monasca-persister/master/ref
new file mode 100644
index 0000000..d8fb047
--- /dev/null
+++ b/images/openstack/projects/monasca-persister/master/ref
@@ -0,0 +1 @@
+1ea4e21eb231e4fe193e62f1b03b957c9d4281c8
diff --git a/images/openstack/projects/monasca-persister/profiles b/images/openstack/projects/monasca-persister/profiles
new file mode 100644
index 0000000..30775bb
--- /dev/null
+++ b/images/openstack/projects/monasca-persister/profiles
@@ -0,0 +1 @@
+influxdb
diff --git a/images/openstack/projects/monasca-persister/wallaby/ref b/images/openstack/projects/monasca-persister/wallaby/ref
new file mode 100644
index 0000000..3f75aa2
--- /dev/null
+++ b/images/openstack/projects/monasca-persister/wallaby/ref
@@ -0,0 +1 @@
+0d1cdd567ab030266d59240b80ee405d5a123fbc
diff --git a/images/openstack/projects/monasca-persister/xena/ref b/images/openstack/projects/monasca-persister/xena/ref
new file mode 100644
index 0000000..3921420
--- /dev/null
+++ b/images/openstack/projects/monasca-persister/xena/ref
@@ -0,0 +1 @@
+19d29bfab93206a7d7652037465d449895b7d8ce
diff --git a/images/openstack/projects/monasca-persister/yoga/ref b/images/openstack/projects/monasca-persister/yoga/ref
new file mode 100644
index 0000000..6209a0d
--- /dev/null
+++ b/images/openstack/projects/monasca-persister/yoga/ref
@@ -0,0 +1 @@
+21e6581b44f70bd2464921c389fd44dad10d460f
diff --git a/images/openstack/projects/neutron/dist-packages b/images/openstack/projects/neutron/dist-packages
new file mode 100644
index 0000000..ec326ff
--- /dev/null
+++ b/images/openstack/projects/neutron/dist-packages
@@ -0,0 +1 @@
+jq ethtool lshw
diff --git a/images/openstack/projects/neutron/master/ref b/images/openstack/projects/neutron/master/ref
new file mode 100644
index 0000000..6f5a67f
--- /dev/null
+++ b/images/openstack/projects/neutron/master/ref
@@ -0,0 +1 @@
+3e8f2325d626a695a812a093907a6f3fd2e1315f
diff --git a/images/openstack/projects/neutron/pip-packages b/images/openstack/projects/neutron/pip-packages
new file mode 100644
index 0000000..bedb2f5
--- /dev/null
+++ b/images/openstack/projects/neutron/pip-packages
@@ -0,0 +1 @@
+neutron-vpnaas
diff --git a/images/openstack/projects/neutron/platforms b/images/openstack/projects/neutron/platforms
new file mode 100644
index 0000000..aaba0ef
--- /dev/null
+++ b/images/openstack/projects/neutron/platforms
@@ -0,0 +1 @@
+linux/amd64,linux/arm64
diff --git a/images/openstack/projects/neutron/profiles b/images/openstack/projects/neutron/profiles
new file mode 100644
index 0000000..8a0345d
--- /dev/null
+++ b/images/openstack/projects/neutron/profiles
@@ -0,0 +1 @@
+openvswitch vpn
diff --git a/images/openstack/projects/neutron/wallaby/ref b/images/openstack/projects/neutron/wallaby/ref
new file mode 100644
index 0000000..43800b4
--- /dev/null
+++ b/images/openstack/projects/neutron/wallaby/ref
@@ -0,0 +1 @@
+ce82edb2db9cd0dbc640e1fa709540bfd876bb58
diff --git a/images/openstack/projects/neutron/xena/ref b/images/openstack/projects/neutron/xena/ref
new file mode 100644
index 0000000..3677c31
--- /dev/null
+++ b/images/openstack/projects/neutron/xena/ref
@@ -0,0 +1 @@
+74f127973831c9c5f889017b3b627bd9940e37a6
diff --git a/images/openstack/projects/neutron/yoga/ref b/images/openstack/projects/neutron/yoga/ref
new file mode 100644
index 0000000..bc5f932
--- /dev/null
+++ b/images/openstack/projects/neutron/yoga/ref
@@ -0,0 +1 @@
+0836d57199a9fa337fe3bb9a5d2ad5e4cd814586
diff --git a/images/openstack/projects/nova/dist-packages b/images/openstack/projects/nova/dist-packages
new file mode 100644
index 0000000..658f1b2
--- /dev/null
+++ b/images/openstack/projects/nova/dist-packages
@@ -0,0 +1 @@
+ovmf qemu-efi-aarch64
diff --git a/images/openstack/projects/nova/master/ref b/images/openstack/projects/nova/master/ref
new file mode 100644
index 0000000..6151866
--- /dev/null
+++ b/images/openstack/projects/nova/master/ref
@@ -0,0 +1 @@
+69bc4c38d1c5b98fcbbe8b16a7dfeb654e3b8173
diff --git a/images/openstack/projects/nova/platforms b/images/openstack/projects/nova/platforms
new file mode 100644
index 0000000..aaba0ef
--- /dev/null
+++ b/images/openstack/projects/nova/platforms
@@ -0,0 +1 @@
+linux/amd64,linux/arm64
diff --git a/images/openstack/projects/nova/profiles b/images/openstack/projects/nova/profiles
new file mode 100644
index 0000000..919c309
--- /dev/null
+++ b/images/openstack/projects/nova/profiles
@@ -0,0 +1 @@
+ceph openvswitch configdrive qemu migration
diff --git a/images/openstack/projects/nova/wallaby/ref b/images/openstack/projects/nova/wallaby/ref
new file mode 100644
index 0000000..df3c70e
--- /dev/null
+++ b/images/openstack/projects/nova/wallaby/ref
@@ -0,0 +1 @@
+2f7f4cc0babbda80946d9b56eae8f988b39a4d9d
diff --git a/images/openstack/projects/nova/xena/ref b/images/openstack/projects/nova/xena/ref
new file mode 100644
index 0000000..22ace96
--- /dev/null
+++ b/images/openstack/projects/nova/xena/ref
@@ -0,0 +1 @@
+62e1a621d19e8833a18afdba86de7f8334171c63
diff --git a/images/openstack/projects/nova/yoga/ref b/images/openstack/projects/nova/yoga/ref
new file mode 100644
index 0000000..ff58ba8
--- /dev/null
+++ b/images/openstack/projects/nova/yoga/ref
@@ -0,0 +1 @@
+6d61fccb8455367aaa37ae7bddf3b8befd3c3d88
diff --git a/images/openstack/projects/octavia/master/ref b/images/openstack/projects/octavia/master/ref
new file mode 100644
index 0000000..33fdd9f
--- /dev/null
+++ b/images/openstack/projects/octavia/master/ref
@@ -0,0 +1 @@
+98ec46b8073bda426316235f743e9af004172389
diff --git a/images/openstack/projects/octavia/wallaby/ref b/images/openstack/projects/octavia/wallaby/ref
new file mode 100644
index 0000000..d4b4396
--- /dev/null
+++ b/images/openstack/projects/octavia/wallaby/ref
@@ -0,0 +1 @@
+8abf181448190ea272225ae4415586cbc0e24c6a
diff --git a/images/openstack/projects/octavia/xena/ref b/images/openstack/projects/octavia/xena/ref
new file mode 100644
index 0000000..1589bdf
--- /dev/null
+++ b/images/openstack/projects/octavia/xena/ref
@@ -0,0 +1 @@
+bda4d7160aebf7549d72b049c8dca53f7d4dedb5
diff --git a/images/openstack/projects/octavia/yoga/ref b/images/openstack/projects/octavia/yoga/ref
new file mode 100644
index 0000000..41ccca8
--- /dev/null
+++ b/images/openstack/projects/octavia/yoga/ref
@@ -0,0 +1 @@
+9c30758dfbdc4d0dc5ff9a942ffece64e5cde325
diff --git a/images/openstack/projects/placement/master/ref b/images/openstack/projects/placement/master/ref
new file mode 100644
index 0000000..cbac6fe
--- /dev/null
+++ b/images/openstack/projects/placement/master/ref
@@ -0,0 +1 @@
+d0e05e89ac4a57b6489007ed46e86357f11e5b23
diff --git a/images/openstack/projects/placement/pip-packages b/images/openstack/projects/placement/pip-packages
new file mode 100644
index 0000000..fb881ec
--- /dev/null
+++ b/images/openstack/projects/placement/pip-packages
@@ -0,0 +1 @@
+httplib2
diff --git a/images/openstack/projects/placement/profiles b/images/openstack/projects/placement/profiles
new file mode 100644
index 0000000..a6b6519
--- /dev/null
+++ b/images/openstack/projects/placement/profiles
@@ -0,0 +1 @@
+apache
diff --git a/images/openstack/projects/placement/wallaby/ref b/images/openstack/projects/placement/wallaby/ref
new file mode 100644
index 0000000..caf71dd
--- /dev/null
+++ b/images/openstack/projects/placement/wallaby/ref
@@ -0,0 +1 @@
+716b947c479e36ce2e9ec6d9e0bbab882f391892
diff --git a/images/openstack/projects/placement/xena/ref b/images/openstack/projects/placement/xena/ref
new file mode 100644
index 0000000..6200f48
--- /dev/null
+++ b/images/openstack/projects/placement/xena/ref
@@ -0,0 +1 @@
+f96984abd48f4d938d0fff0bab9b12ed933e320e
diff --git a/images/openstack/projects/placement/yoga/ref b/images/openstack/projects/placement/yoga/ref
new file mode 100644
index 0000000..39794d2
--- /dev/null
+++ b/images/openstack/projects/placement/yoga/ref
@@ -0,0 +1 @@
+4d3df47ee3e394e3178d58c15306620809ad2806
diff --git a/images/openstack/projects/senlin/master/ref b/images/openstack/projects/senlin/master/ref
new file mode 100644
index 0000000..d6c0115
--- /dev/null
+++ b/images/openstack/projects/senlin/master/ref
@@ -0,0 +1 @@
+5d3bc56e01f163b62b6e5d53c53ec1bdcf792cc7
diff --git a/images/openstack/projects/senlin/wallaby/ref b/images/openstack/projects/senlin/wallaby/ref
new file mode 100644
index 0000000..ab82e8e
--- /dev/null
+++ b/images/openstack/projects/senlin/wallaby/ref
@@ -0,0 +1 @@
+ac8245b582376b460a2494ad23ff9e2d83d228cb
diff --git a/images/openstack/projects/senlin/xena/ref b/images/openstack/projects/senlin/xena/ref
new file mode 100644
index 0000000..b882620
--- /dev/null
+++ b/images/openstack/projects/senlin/xena/ref
@@ -0,0 +1 @@
+28f8abc29a966d41f8b4502d1fc7432f86b14bea
diff --git a/images/openstack/projects/senlin/yoga/ref b/images/openstack/projects/senlin/yoga/ref
new file mode 100644
index 0000000..a0be81e
--- /dev/null
+++ b/images/openstack/projects/senlin/yoga/ref
@@ -0,0 +1 @@
+804056e856fb80bc881f6ef22eb57bc4adf7a287
diff --git a/images/openstack/releases/master/branch b/images/openstack/releases/master/branch
new file mode 100644
index 0000000..1f7391f
--- /dev/null
+++ b/images/openstack/releases/master/branch
@@ -0,0 +1 @@
+master
diff --git a/images/openstack/releases/wallaby/branch b/images/openstack/releases/wallaby/branch
new file mode 100644
index 0000000..7cab8b8
--- /dev/null
+++ b/images/openstack/releases/wallaby/branch
@@ -0,0 +1 @@
+stable/wallaby
diff --git a/images/openstack/releases/xena/branch b/images/openstack/releases/xena/branch
new file mode 100644
index 0000000..9a08293
--- /dev/null
+++ b/images/openstack/releases/xena/branch
@@ -0,0 +1 @@
+stable/xena
diff --git a/images/openstack/releases/yoga/branch b/images/openstack/releases/yoga/branch
new file mode 100644
index 0000000..5367bd7
--- /dev/null
+++ b/images/openstack/releases/yoga/branch
@@ -0,0 +1 @@
+stable/yoga
diff --git a/images/openstack/tools/generate-data.sh b/images/openstack/tools/generate-data.sh
new file mode 100755
index 0000000..1d424a6
--- /dev/null
+++ b/images/openstack/tools/generate-data.sh
@@ -0,0 +1,10 @@
+#!/bin/bash -xe
+
+for RELEASE in $(ls -1 releases); do
+  BRANCH=$(cat releases/${RELEASE}/branch)
+
+  for PROJECT in $(ls projects); do
+    mkdir -p projects/${PROJECT}/${RELEASE}
+    curl -s https://opendev.org/api/v1/repos/openstack/${PROJECT}/branches/${BRANCH} | jq -r '.commit.id' > projects/${PROJECT}/${RELEASE}/ref
+  done
+done
diff --git a/images/openstack/tools/generate-env.sh b/images/openstack/tools/generate-env.sh
new file mode 100755
index 0000000..f51481d
--- /dev/null
+++ b/images/openstack/tools/generate-env.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+PROJECT=$1
+RELEASE=$2
+
+echo PROJECT_REF=$(cat projects/${PROJECT}/${RELEASE}/ref)
+
+# Check if platforms file exists
+if [ -f projects/${PROJECT}/platforms ]; then
+  echo PLATFORMS=$(cat projects/${PROJECT}/platforms 2>/dev/null)
+else
+  echo PLATFORMS=linux/amd64
+fi
+
+echo PROFILES=$(cat projects/${PROJECT}/profiles 2> /dev/null)
+echo DIST_PACKAGES=$(cat projects/${PROJECT}/dist-packages 2> /dev/null)
+echo PIP_PACKAGES=$(cat projects/${PROJECT}/pip-packages 2> /dev/null)
diff --git a/images/openstack/tools/purge-github-cache.sh b/images/openstack/tools/purge-github-cache.sh
new file mode 100755
index 0000000..bf88bf0
--- /dev/null
+++ b/images/openstack/tools/purge-github-cache.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+gh api \
+  --header "Accept: application/vnd.github+json" \
+  --jq '.actions_caches[].id' \
+  --paginate \
+  /repos/vexxhost/atmosphere-images/actions/caches |
+    xargs -P10 -I {} /bin/bash -xec "gh api --method DELETE /repos/vexxhost/atmosphere-images/actions/caches/{} 2>&1 >/dev/null"