Skip to content

Commit b4d9542

Browse files
committed
Add HotStack-OS containerized OpenStack
Introduce HotStack-OS, a minimal containerized OpenStack deployment for rapid HotStack scenario testing on developer workstations. Provides a complete OpenStack cloud running in containers via podman-compose with host integration for compute and networking. Features: - Fast deployment: ~10 minutes first build, ~3 minutes subsequent starts - Full OpenStack services: Keystone, Nova, Neutron, Cinder, Glance, Heat, Placement - Host integration: Uses host libvirt/KVM, OpenvSwitch/OVN, and NFS - HotStack-ready: Supports Heat orchestration, trunk ports, VLANs, boot from volume, NoVNC console, and serial console logging - Self-contained: File-backed storage with isolated networking Architecture: - Hybrid design: Containerized control plane with host compute/networking - OpenStack stable/2025.1 (Epoxy) release - Base containerfile with service-specific layers - Shared common.sh library for entrypoint standardization - Python-based post-setup automation for cloud initialization - Unified load balancer and DNS for service access - Health checks and dependency management Management: - Makefile-driven workflow (build, setup, start, stop, status) - Automated smoke testing with Heat stack validation - Configurable via .env file (passwords, networks, storage, quotas) Target users: Developers needing quick OpenStack environments for HotStack scenario testing without dedicated hardware or lengthy installation processes. Assisted-By: Claude Code - claude-4.5-sonnet Signed-off-by: Harald Jensås <hjensas@redhat.com>
1 parent 7ecdff1 commit b4d9542

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+8637
-5
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ to install OCP.
9090

9191
## Pre-requisites
9292

93+
### OpenStack Cloud
94+
95+
HotStack requires an OpenStack cloud to deploy on. See [devsetup](devsetup/) for options:
96+
97+
- **[HotStack-OS](devsetup/hotstack-os/)** - NEW! Containerized OpenStack using podman-compose (2-5 min setup)
98+
- **[Packstack](devsetup/packstack.md)** - Single-node OpenStack on CentOS Stream 9 (30-60 min setup)
99+
- **[OpenStack-Ansible](devsetup/osa.md)** - Production-like AIO deployment (60-120 min setup)
100+
93101
### iPXE image
94102

95103
The ocp_agent_installer is using the "PXE bootstrap-artifacts", so the OCP

devsetup/README.md

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,39 @@ development and testing.
66

77
## Available Setup Guides
88

9+
### [HotStack-OS - Containerized Setup](hotstack-os/)
10+
11+
A containerized OpenStack deployment using podman-compose that runs on your
12+
local workstation. Uses host libvirt and OpenvSwitch with all OpenStack
13+
services in containers.
14+
15+
**Recommended for:**
16+
17+
- **Quick development and testing** (10-15 minutes setup, 2-5 minutes to start)
18+
- Users who want reproducible, self-contained environments
19+
- Limited resources (no dedicated machine needed)
20+
21+
**Getting Started:**
22+
23+
1. See [hotstack-os/QUICKSTART.md](hotstack-os/QUICKSTART.md) for step-by-step setup
24+
2. See [hotstack-os/README.md](hotstack-os/README.md) for architecture and reference
25+
26+
**Requirements:**
27+
28+
- Linux workstation (Fedora/RHEL/CentOS) with libvirt and OpenvSwitch
29+
- 16GB+ RAM recommended, 50-200GB disk for VM instances
30+
931
### [Packstack Setup](packstack.md)
1032

1133
A quick and straightforward way to deploy OpenStack on CentOS Stream 9 using
1234
RDO Packstack. This is the fastest option for getting a working OpenStack
13-
environment.
35+
environment on a dedicated machine.
1436

1537
**Recommended for:**
1638

1739
- CentOS Stream 9 / RHEL-based systems
1840
- Users familiar with RDO/Packstack
41+
- Dedicated test machines or VMs
1942

2043
### [OpenStack-Ansible AIO Setup](osa.md)
2144

@@ -27,13 +50,18 @@ deployment in a single node.
2750

2851
- CentOS Stream 9 or 10 / RHEL-based systems
2952
- Users familiar with Openstack-Ansible
53+
- More production-like testing
3054

3155
## Choosing a Setup Method
3256

33-
| Feature | Packstack | OpenStack-Ansible AIO |
34-
|---------|-----------|----------------------|
35-
| Base OS | CentOS Stream 9 | CentOS Stream 9 or 10 |
36-
| OpenStack Release | Dalmatian | Epoxy or later |
57+
| Feature | HotStack-OS | Packstack | OpenStack-Ansible AIO |
58+
|---------|-------------|-----------|------------------------|
59+
| **Deployment Time** | 2-5 minutes | 30-60 minutes | 60-120 minutes |
60+
| **Host OS** | Fedora/RHEL/CentOS | CentOS Stream 9 | CentOS Stream 9 or 10 |
61+
| **OpenStack Release** | stable/2025.1 (Epoxy) | Dalmatian | Epoxy or later |
62+
| **Resource Overhead** | Low (containers) | Medium | High |
63+
| **Requires Dedicated Machine** | No | Yes | Yes |
64+
| **Production-like** | No | Yes | Yes |
3765

3866
## Common Post-Installation Steps
3967

devsetup/hotstack-os/.env.example

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# =============================================================================
2+
# HotStack-OS Configuration
3+
# =============================================================================
4+
# Copy this file to .env and customize as needed
5+
# Most defaults are fine for a single-node development environment
6+
# =============================================================================
7+
8+
# -----------------------------------------------------------------------------
9+
# OpenStack Release
10+
# -----------------------------------------------------------------------------
11+
# stable/2025.1 = Epoxy (latest stable)
12+
# stable/2024.2 = Dalmatian (previous stable)
13+
# master = development (not recommended for stability)
14+
OPENSTACK_BRANCH=stable/2025.1
15+
16+
# -----------------------------------------------------------------------------
17+
# Authentication & Passwords
18+
# -----------------------------------------------------------------------------
19+
# SECURITY: Change these passwords for production use!
20+
# For development, simple passwords are fine
21+
22+
# Admin password for Keystone (user: admin)
23+
KEYSTONE_ADMIN_PASSWORD=admin
24+
25+
# Root password for MariaDB
26+
MYSQL_ROOT_PASSWORD=rootpass
27+
28+
# OpenStack services database password (user: openstack)
29+
DB_PASSWORD=openstack
30+
31+
# Password for inter-service API authentication
32+
SERVICE_PASSWORD=openstack
33+
34+
# RabbitMQ message broker credentials (required for OpenStack RPC)
35+
RABBITMQ_DEFAULT_USER=openstack
36+
RABBITMQ_DEFAULT_PASS=openstack
37+
38+
# -----------------------------------------------------------------------------
39+
# Logging Configuration
40+
# -----------------------------------------------------------------------------
41+
# Enable debug logging for all OpenStack services
42+
# When false: Only INFO, WARNING, and ERROR messages are logged
43+
# When true: Verbose DEBUG messages are included (useful for troubleshooting)
44+
# Default: false (debug logging disabled)
45+
DEBUG_LOGGING=false
46+
47+
# -----------------------------------------------------------------------------
48+
# Region & Networking
49+
# -----------------------------------------------------------------------------
50+
# OpenStack region name (affects service catalog endpoints)
51+
REGION_NAME=RegionOne
52+
53+
# -----------------------------------------------------------------------------
54+
# Network Configuration
55+
# -----------------------------------------------------------------------------
56+
# HotStack-OS uses a dedicated address space split into two subnets:
57+
# 1. Container Network: For podman-managed OpenStack service containers
58+
# 2. Provider Network: For OVS hot-ex bridge (VM external/floating IPs)
59+
#
60+
# REQUIRED: These must be set (defaults work for most users)
61+
# Change ONLY if the default 172.31.0.0/24 range conflicts with existing networks
62+
# If changed, ensure all IPs below are within the new CONTAINER_NETWORK range
63+
# Also update podman-compose.yml networks section to match CONTAINER_NETWORK
64+
65+
# Container network subnet (podman bridge for service containers)
66+
# Range: 172.31.0.0 - .127 (128 IPs)
67+
CONTAINER_NETWORK=172.31.0.0/25
68+
69+
# Provider network subnet (hot-ex for VM external connectivity)
70+
# Range: 172.31.0.128 - .255 (128 IPs)
71+
PROVIDER_NETWORK=172.31.0.128/25
72+
73+
# IP address for hot-ex bridge (host connectivity to provider network)
74+
# Must be within PROVIDER_NETWORK range
75+
BREX_IP=172.31.0.129
76+
77+
# OVN chassis hostname (must match the compute node hostname for Neutron agent registration)
78+
# Auto-detected at runtime - override only if needed
79+
# CHASSIS_HOSTNAME=your-hostname.example.com
80+
81+
# Static IP addresses for OpenStack service containers
82+
# All IPs must be within CONTAINER_NETWORK range (172.31.0.0/25 = .0 to .127)
83+
# Organized by service group for clarity
84+
85+
# Infrastructure Services
86+
MARIADB_IP=172.31.0.3
87+
RABBITMQ_IP=172.31.0.4
88+
MEMCACHED_IP=172.31.0.5
89+
90+
# Identity & Core Services
91+
KEYSTONE_IP=172.31.0.11
92+
GLANCE_IP=172.31.0.12
93+
PLACEMENT_IP=172.31.0.13
94+
95+
# Compute Services (Nova)
96+
NOVA_API_IP=172.31.0.21
97+
NOVA_CONDUCTOR_IP=172.31.0.22
98+
NOVA_SCHEDULER_IP=172.31.0.23
99+
NOVA_COMPUTE_IP=172.31.0.24
100+
NOVA_NOVNCPROXY_IP=172.31.0.26
101+
102+
# Networking Services (OVN/Neutron)
103+
OVN_NORTHD_IP=172.31.0.31
104+
NEUTRON_SERVER_IP=172.31.0.32
105+
106+
# Block Storage Services (Cinder)
107+
CINDER_API_IP=172.31.0.41
108+
CINDER_SCHEDULER_IP=172.31.0.42
109+
CINDER_VOLUME_IP=172.31.0.43
110+
111+
# Orchestration Services (Heat)
112+
HEAT_API_IP=172.31.0.51
113+
HEAT_ENGINE_IP=172.31.0.53
114+
115+
# -----------------------------------------------------------------------------
116+
# Storage Paths
117+
# -----------------------------------------------------------------------------
118+
# Data directory for all persistent storage (databases, logs, images, volumes)
119+
# Default: /var/lib/hotstack-os (system path, created with user ownership by setup)
120+
# Override only if you need a custom location (use absolute paths)
121+
# HOTSTACK_DATA_DIR=/custom/absolute/path
122+
123+
# Nova VM instances directory on host (requires libvirt access)
124+
# Default: ${HOTSTACK_DATA_DIR}/nova-instances (isolated from system Nova)
125+
# Maps to Nova's instances_path configuration option
126+
# IMPORTANT: This path must be identical in both host and container for libvirt compatibility
127+
# For custom paths, set correct SELinux context:
128+
# sudo semanage fcontext -a -t svirt_image_t "/custom/path(/.*)?"
129+
# sudo restorecon -Rv /custom/path
130+
# NOVA_INSTANCES_PATH=${HOTSTACK_DATA_DIR}/nova-instances
131+
132+
# Nova NFS mount directory on host (for Cinder volume attachments)
133+
# Default: ${HOTSTACK_DATA_DIR}/nova-mnt (isolated from system Nova)
134+
# Maps to Nova's libvirt.nfs_mount_point_base configuration option
135+
# IMPORTANT: This path must be identical in both host and container for libvirt compatibility
136+
# For custom paths, set correct SELinux context:
137+
# sudo semanage fcontext -a -t virt_var_lib_t "/custom/path(/.*)?"
138+
# sudo restorecon -Rv /custom/path
139+
# NOVA_NFS_MOUNT_POINT_BASE=${HOTSTACK_DATA_DIR}/nova-mnt
140+
141+
# Cinder volumes configuration (NFS-based)
142+
# Directory for Cinder NFS export on host
143+
# This directory will be exported via NFS and mounted by cinder-volume and nova-compute
144+
# Default: /var/lib/hotstack-os/cinder-nfs (created by setup)
145+
# Override only if you need a custom location (use absolute paths)
146+
# CINDER_NFS_EXPORT_DIR=/custom/path/cinder-nfs
147+
148+
# -----------------------------------------------------------------------------
149+
# HotStack Project Quotas
150+
# -----------------------------------------------------------------------------
151+
# Quotas for the hotstack project created by 'make post-setup'
152+
# Override these to adjust resource limits for HotStack development/testing
153+
# Defaults are generous for development purposes
154+
# HOTSTACK_QUOTA_COMPUTE_CORES=40
155+
# HOTSTACK_QUOTA_COMPUTE_RAM=102400 # 100GB RAM in MB
156+
# HOTSTACK_QUOTA_COMPUTE_INSTANCES=20
157+
# HOTSTACK_QUOTA_COMPUTE_KEY_PAIRS=10
158+
# HOTSTACK_QUOTA_COMPUTE_SERVER_GROUPS=10
159+
# HOTSTACK_QUOTA_COMPUTE_SERVER_GROUP_MEMBERS=10
160+
# HOTSTACK_QUOTA_NETWORK_NETWORKS=20
161+
# HOTSTACK_QUOTA_NETWORK_SUBNETS=20
162+
# HOTSTACK_QUOTA_NETWORK_PORTS=100
163+
# HOTSTACK_QUOTA_NETWORK_ROUTERS=10
164+
# HOTSTACK_QUOTA_NETWORK_FLOATINGIPS=20
165+
# HOTSTACK_QUOTA_NETWORK_SECURITY_GROUPS=20
166+
# HOTSTACK_QUOTA_NETWORK_SECURITY_GROUP_RULES=100
167+
# HOTSTACK_QUOTA_VOLUME_VOLUMES=20
168+
# HOTSTACK_QUOTA_VOLUME_SNAPSHOTS=20
169+
# HOTSTACK_QUOTA_VOLUME_GIGABYTES=1000 # 1TB
170+
# HOTSTACK_QUOTA_VOLUME_PER_VOLUME_GIGABYTES=500
171+
172+
# -----------------------------------------------------------------------------
173+
# Post-Setup Network Configuration
174+
# -----------------------------------------------------------------------------
175+
# Network settings for 'make post-setup' (private and provider networks)
176+
# Defaults match the HotStack-OS container network configuration
177+
# HOTSTACK_PRIVATE_CIDR=192.168.100.0/24
178+
# HOTSTACK_PROVIDER_CIDR=172.31.0.128/25
179+
# HOTSTACK_PROVIDER_GATEWAY=172.31.0.129
180+
181+
# -----------------------------------------------------------------------------
182+
# Post-Setup Image URLs
183+
# -----------------------------------------------------------------------------
184+
# Image URLs for 'make post-setup' - download and upload to Glance
185+
# Defaults use GitHub releases (latest builds)
186+
# Override to use custom HTTP/HTTPS mirrors (local files not supported)
187+
# Downloaded images are cached in ~/.cache/hotstack-os/images/
188+
# HOTSTACK_CIRROS_URL=http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img
189+
# HOTSTACK_CENTOS_STREAM_9_URL=https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-x86_64-9-latest.x86_64.qcow2
190+
# HOTSTACK_CONTROLLER_IMAGE_URL=https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-controller/controller-latest.qcow2
191+
# HOTSTACK_BLANK_IMAGE_URL=https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-blank/blank-image-latest.qcow2
192+
# HOTSTACK_IPXE_BIOS_URL=https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-ipxe/ipxe-bios-latest.img
193+
# HOTSTACK_IPXE_EFI_URL=https://github.com/openstack-k8s-operators/hotstack/releases/download/latest-ipxe/ipxe-efi-latest.img
194+
# HOTSTACK_NAT64_IMAGE_URL=https://github.com/openstack-k8s-operators/openstack-k8s-operators-ci/releases/download/latest/nat64-appliance-latest.qcow2

devsetup/hotstack-os/.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Environment file with passwords
2+
.env
3+
4+
# OpenStack credentials
5+
clouds.yaml
6+
7+
# Temporary files
8+
*.log
9+
*.pid
10+
*.sock
11+
12+
# Python cache
13+
__pycache__/
14+
*.pyc
15+
*.pyo

0 commit comments

Comments
 (0)