Initial commit: stateful OpenStack API laboratory simulator.

Ship Keystone auth, multi-service handlers (Yoga→Dalmatian), Compose/Helm
packaging, API contract packs, and pytest/Pulumi coverage labs.
This commit is contained in:
2026-07-18 04:26:48 +03:00
commit 6033967e6a
509 changed files with 464404 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
**Language / Язык:** [English](../../examples/ansible.md) | [Русский](ansible.md)
# Ansible (openstack.cloud)
## Cookbook (один stack)
[`examples/ansible/playbook.yml`](../../../examples/ansible/playbook.yml) —
`ansible.builtin.uri` против Keystone/Nova/Neutron/Glance.
```bash
make up && make seed-demo
cd examples/ansible
ansible-playbook -i inventory.ini playbook.yml
```
Auth: `http://127.0.0.1:5000/v3`, `admin` / `secret`, проект `demo`.
Интеграционное покрытие API теперь в [`pulumi-tests/`](../../../pulumi-tests/)
(Pulumi / `pulumi_openstack`). См. [hypervisor-lab.md](../hypervisor-lab.md).
+21
View File
@@ -0,0 +1,21 @@
**Language / Язык:** [English](../../examples/openstack-cli.md) | [Русский](openstack-cli.md)
# OpenStack CLI
Типовой набор переменных окружения и команд против локального gateway:
```bash
export OS_AUTH_URL=http://127.0.0.1:5000/v3
export OS_USERNAME=admin
export OS_PASSWORD=secret
export OS_PROJECT_NAME=demo
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3
openstack token issue
openstack server list
openstack network list
openstack volume list
openstack stack list
```
+53
View File
@@ -0,0 +1,53 @@
**Language / Язык:** [English](../../examples/overview.md) | [Русский](overview.md)
# Обзор примеров клиентов
Исполняемые скрипты — в [`examples/`](../../../examples/).
Лаборатория покрытия API на Pulumi — в [`pulumi-tests/`](../../../pulumi-tests/).
## Краткая справка
| Path | Tool | Purpose |
|---|---|---|
| `examples/python/openstacksdk_cookbook.py` | openstacksdk | net + server + volume lifecycle |
| `examples/ansible/playbook.yml` | Ansible `uri` | минимальный Keystone/Nova/Neutron |
| `examples/terraform/main.tf` | Terraform | `openstack_compute_instance_v2` + volume |
| `examples/pulumi/` | Pulumi | `pulumi_openstack` Instance + Network |
| `examples/run_iac_stack.sh` | все четыре | последовательный smoke cookbook'ов |
| `pulumi-tests/` | Pulumi | каждая pack-операция × yoga→dalmatian + HTML-отчёт |
## Auth
1. `POST /v3/auth/tokens``X-Subject-Token`
2. Вызовы сервисов с `X-Auth-Token` на нужном [порту](../ports.md)
Лаборатория по умолчанию: `admin` / `secret`, проект `demo`, домен `Default`.
## Cookbook'и
- [Python (requests)](python-requests.md)
- [Python (openstacksdk)](python-openstacksdk.md)
- [Ansible](ansible.md)
- [Terraform](terraform.md)
- [Pulumi](pulumi.md)
- [CLI](openstack-cli.md)
- [Troubleshooting](troubleshooting-clients.md)
## Лаборатория покрытия API (Pulumi)
Полное руководство: [hypervisor-lab.md](../hypervisor-lab.md)
```bash
cd pulumi-tests
make up
make test-pulumi-smoke
make test-pulumi
open reports/pulumi-report.html
```
Probe-скрипты:
| Script | Purpose |
|---|---|
| `examples/python/openstack_smoke.py` | Multi-port GET smoke |
| `examples/python/openstack_surface_probe.py` | Pack operation probe (также используется Pulumi-лабой) |
+30
View File
@@ -0,0 +1,30 @@
**Language / Язык:** [English](../../examples/pulumi.md) | [Русский](pulumi.md)
# Pulumi (pulumi_openstack)
## Cookbook (один stack)
[`examples/pulumi/`](../../../examples/pulumi/) — `pulumi_openstack` Instance,
Network, Subnet.
```bash
make up && make seed-demo
cd examples/pulumi
pulumi stack init dev --secrets-provider passphrase
export PULUMI_CONFIG_PASSPHRASE=lab
pulumi up
pulumi destroy
```
## Лаборатория покрытия (`pulumi-tests`)
[`pulumi-tests/`](../../../pulumi-tests/) — стеки `pulumi_openstack` на каждую
серию, проверка непустых export'ов, затем HTTP-probe pack-операций с
непустыми телами.
```bash
make pulumi-tests
open pulumi-tests/reports/pulumi-report.html
```
См. [hypervisor-lab.md](../hypervisor-lab.md).
+24
View File
@@ -0,0 +1,24 @@
**Language / Язык:** [English](../../examples/python-openstacksdk.md) | [Русский](python-openstacksdk.md)
# Python + openstacksdk
```python
import openstack
conn = openstack.connect(
auth_url="http://127.0.0.1:5000/v3",
project_name="demo",
username="admin",
password="secret",
user_domain_name="Default",
project_domain_name="Default",
)
for server in conn.compute.servers():
print(server.name, server.status)
for network in conn.network.networks():
print(network.name)
```
Убедитесь, что порты из service catalog доступны (Compose gateway или Helm
port-forward). См. [clients.md](../clients.md).
+37
View File
@@ -0,0 +1,37 @@
**Language / Язык:** [English](../../examples/python-requests.md) | [Русский](python-requests.md)
# Python + requests
Минимальный пример password-auth и списка серверов Nova:
```python
import requests
AUTH = "http://127.0.0.1:5000/v3/auth/tokens"
r = requests.post(
AUTH,
json={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": {"name": "Default"},
"password": "secret",
}
},
},
"scope": {
"project": {"name": "demo", "domain": {"name": "Default"}}
},
}
},
)
r.raise_for_status()
token = r.headers["X-Subject-Token"]
headers = {"X-Auth-Token": token}
servers = requests.get("http://127.0.0.1:8774/v2.1/servers", headers=headers)
print(servers.status_code, len(servers.json().get("servers", [])))
```
+21
View File
@@ -0,0 +1,21 @@
**Language / Язык:** [English](../../examples/terraform.md) | [Русский](terraform.md)
# Terraform (openstack provider)
## Cookbook (один stack)
[`examples/terraform/main.tf`](../../../examples/terraform/main.tf) —
**`terraform-provider-openstack/openstack`**.
```bash
make up && make seed-demo
cd examples/terraform
terraform init
terraform apply
terraform destroy
```
По умолчанию: `auth_url = http://127.0.0.1:5000/v3`, `admin` / `secret`, проект `demo`.
Интеграционное покрытие API — в [`pulumi-tests/`](../../../pulumi-tests/)
(Pulumi / `pulumi_openstack`). См. [hypervisor-lab.md](../hypervisor-lab.md).
@@ -0,0 +1,27 @@
**Language / Язык:** [English](../../examples/troubleshooting-clients.md) | [Русский](troubleshooting-clients.md)
# Устранение неполадок клиентов
## Каталог указывает на недоступные хосты
Seed-каталог в некоторых конфигурациях использует `host.docker.internal` или
имена compose-сервисов. Переопределите endpoints или используйте host gateway,
который вы реально публикуете (`127.0.0.1` с port-forward).
## SSL-ошибки против Ingress
Staging-issuers лаборатории не доверенные — используйте `curl -k` /
`OS_INSECURE=true` только в lab.
## Пустой список серверов
Неверный project scope или demo не загружен. Проверьте:
```bash
openstack project list
make seed-demo
```
## Microversion отклонён
Понизьте запрошенную compute microversion или сбросьте переопределения в Web UI.