For development an OpenStack cloud is required. This directory contains guides for setting up a single-node OpenStack deployment suitable for HotStack development and testing.
A containerized OpenStack deployment that runs on your local workstation.
Uses host libvirt, OpenvSwitch, and NFS. All OpenStack services in containers
managed by systemd. Includes automated setup via make post-setup that
creates the HotStack project, user, quotas, flavors, and uploads required
images.
Recommended for:
- Quick development and testing (~10 minutes first-time setup, ~3 minutes to start)
- Users who want reproducible, self-contained environments
- Limited resources (no dedicated machine needed)
- Coexistence with other libvirt VMs (isolation via session mode)
Getting Started:
- See hotstack-os/README.md for architecture and reference
- See hotstack-os/INSTALL.md for installation guide
- See hotstack-os/QUICKSTART.md for quick reference
Requirements:
- Linux workstation (Fedora/RHEL/CentOS) with libvirt and OpenvSwitch
Deploy OpenStack using OpenStack-Ansible's All-In-One (AIO) configuration with Flamingo or later releases. This provides a more production-like deployment in a single node.
Recommended for:
- CentOS Stream 9 or 10 / RHEL-based systems
- Users familiar with Openstack-Ansible
- More production-like testing
| Feature | HotsTac(k)os | OpenStack-Ansible AIO |
|---|---|---|
| Deployment Time | ~10 minutes | 60-120 minutes |
| Host OS | Fedora/RHEL/CentOS | CentOS Stream 9 or 10 |
| OpenStack Release | stable/2025.2 (Flamingo) | Epoxy or later |
| Resource Overhead | Low (containers) | High |
| Requires Dedicated Machine | No | Yes |
After completing either installation method, perform the following configuration steps to prepare your OpenStack cloud for HotStack scenarios.
First, source the OpenStack credentials:
For OpenStack-Ansible:
source /root/openrcCreate flavors sized appropriately for HotStack scenarios:
openstack flavor create hotstack.small --public --vcpus 1 --ram 2048 --disk 20
openstack flavor create hotstack.medium --public --vcpus 2 --ram 4096 --disk 40
openstack flavor create hotstack.mlarge --public --vcpus 2 --ram 6144 --disk 40
openstack flavor create hotstack.large --public --vcpus 4 --ram 8192 --disk 80
openstack flavor create hotstack.xlarge --public --vcpus 8 --ram 16384 --disk 160
openstack flavor create hotstack.xxlarge --public --vcpus 12 --ram 32768 --disk 160
openstack flavor create hotstack.xxxlarge --public --vcpus 12 --ram 49152 --disk 160Create a dedicated project and user for HotStack:
NOTE: The project name "hotstack" used in these examples can be replaced with any name you prefer. Just ensure you use the same name consistently throughout all commands.
openstack project create hotstack \
--description "HotStack Project" --domain default
openstack user create hotstack --project hotstack --password 12345678
openstack role add member --user hotstack --project hotstackSet appropriate quotas for the HotStack project:
openstack quota set hotstack \
--volumes 50 \
--ram 307200 \
--cores 96 \
--instances 50 \
--routers 20Add security group rules to the hotstack project's default security group:
# Get the UUID of the hotstack project's default security group
HOTSTACK_SG=$(openstack security group list --project hotstack \
-f value -c ID -c Name | grep default | awk '{print $1}')
# Add SSH and ICMP rules
openstack security group rule create ${HOTSTACK_SG} \
--protocol tcp \
--dst-port 22 \
--remote-ip 0.0.0.0/0
openstack security group rule create ${HOTSTACK_SG} \
--protocol icmp \
--remote-ip 0.0.0.0/0Download and upload the CentOS Stream 9 cloud image:
curl -L -O https://cloud.centos.org/centos/9-stream/x86_64/images/\
CentOS-Stream-GenericCloud-x86_64-9-latest.x86_64.qcow2
openstack image create CentOS-Stream-GenericCloud-9 \
--property hw_firmware_type=uefi \
--property hw_machine_type=q35 \
--disk-format qcow2 \
--file CentOS-Stream-GenericCloud-x86_64-9-latest.x86_64.qcow2 \
--publicDownload and upload the HotStack controller image:
curl -L -O https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-controller/controller-latest.qcow2
openstack image create hotstack-controller \
--disk-format qcow2 \
--file controller-latest.qcow2 \
--publicDownload and upload the iPXE boot images for network booting:
# Download iPXE images
curl -L -O https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-ipxe/ipxe-bios-latest.img
curl -L -O https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-ipxe/ipxe-efi-latest.img
# Upload BIOS boot image (used for OCP nodes)
openstack image create ipxe-boot-usb \
--disk-format raw \
--file ipxe-bios-latest.img \
--property os_shutdown_timeout=5 \
--public
# Upload UEFI rescue image
openstack image create ipxe-rescue-uefi \
--disk-format raw \
--file ipxe-efi-latest.img \
--property os_shutdown_timeout=5 \
--property hw_firmware_type=uefi \
--property hw_machine_type=q35 \
--public
# Upload BIOS rescue image
openstack image create ipxe-rescue-bios \
--disk-format raw \
--file ipxe-bios-latest.img \
--property os_shutdown_timeout=5 \
--publicIf using virtual baremetal with sushy-emulator, download and upload the blank image:
curl -L -O https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-blank/blank-image-latest.qcow2
openstack image create sushy-tools-blank-image \
--disk-format qcow2 \
--file blank-image-latest.qcow2 \
--property hw_firmware_type=uefi \
--property hw_machine_type=q35 \
--property os_shutdown_timeout=5 \
--publicIf using IPv6-only networks, download and upload the NAT64 appliance image:
curl -L -O https://github.com/openstack-k8s-operators/openstack-k8s-operators-ci/releases/download/latest/nat64-appliance-latest.qcow2
openstack image create nat64-appliance \
--disk-format qcow2 \
--file nat64-appliance-latest.qcow2 \
--property hw_firmware_type=uefi \
--property hw_machine_type=q35 \
--publicFor building images locally or for more details, see:
For OpenStack-Ansible AIO:
Create a shared network named "private", subnet, and router:
# Create a shared network
openstack network create private --share
# Create a subnet on the private network
openstack subnet create private-subnet \
--network private \
--subnet-range 192.168.100.0/24 \
--dns-nameserver 8.8.8.8
# Create a router and connect it to the external network
openstack router create private-router
openstack router set private-router --external-gateway public
openstack router add subnet private-router private-subnetCreate an application credential for HotStack automation:
openstack application credential create hotstack-app-credential --unrestrictedSave the output, as you'll need the application credential ID and secret for HotStack deployments.