**Language / Язык:** [English](README.md) | [Русский](README.ru.md) # vmware-api-simulator Stateful-асинхронный симулятор API [VMware vSphere](https://www.vmware.com/products/vsphere.html) для тестирования API-клиентов и инфраструктурных инструментов без реального кластера ESXi/vCenter. Симулятор работает на PostgreSQL и предоставляет нативные поверхности vCenter: **REST** Automation API (`/api`, legacy `/rest`) и **SOAP** VIM/PBM (`/sdk`). Семантические обработчики сохраняют инвентарь, сессии, задачи, теги, content library и права доступа; операции power/clone/relocate/snapshot выполняются как устойчивые CIS-задачи с реальными id задач. ## Проверенное покрытие API Покрытие отслеживается относительно публичного [vSphere Automation API operations index](https://developer.broadcom.com/xapis/vsphere-automation-api/latest/operation-index/) (~1037 уникальных маршрутов verb+path в registry симулятора). **Два слоя (прочитайте до таблицы):** | Слой | Доля (major 9) | Смысл | |---|---:|---| | Core deep handlers | ~104 маршрута (~10%) | Инвентарь, lifecycle ВМ, tasks, tagging, content library, appliance, authz — реальная семантика в PostgreSQL | | DB-backed stub surface | остальной registry (~90%) | Засеянный non-empty JSON по остальной таблице Broadcom (lab stand-in, не production parity) | | Catalog major | Метка vSphere | Catalog floor / universe | Floor coverage | |---|---|---:|---:| | 6 | 7.0 | 31 / 1077 | 2.9% | | 7 | 7.0 U3 | 77 / 1077 | 7.2% | | 8 | 8.0 | 103 / 1077 | 9.6% | | 9 | 8.0 U2 (Automation 9.1 surface) | **1077 / 1077** | **100% route registry** | На major 9 обслуживается **полный route registry** (нет известных path 501): deep handlers плюс stubs. Hot-swap (`POST /ui/api/contract/apply?major=N`) меняет только **catalog** major для Web UI / evidence-отчётов. См. [Совместимость](docs/ru/compatibility.md), [compatibility 0.1.0](docs/ru/compatibility-0.1.0.md) и [Покрытие API](docs/ru/api-coverage.md). > Это измеримое покрытие route-registry и обработчиков лабораторного симулятора — > не утверждение, что каждый краевой случай vSphere или поведение ESXi-железа > воспроизводится идентично продакшен-vCenter. ## Быстрый старт (опубликованный образ) Образ: [`inecs/vmware-api-simulator`](https://hub.docker.com/r/inecs/vmware-api-simulator) Нужен git checkout этого репозитория (Compose монтирует `docker/gateway/` и `docker/tls/` рядом с compose-файлом). ### Docker Compose ```bash docker compose -f docker-compose.release.yml up -d --wait # seed выполняется автоматически; при очистке БД: # docker compose -f docker-compose.release.yml run --rm --entrypoint python \ # simulator -m app.simulation.seed_cli curl -sk https://localhost/health/ready SID=$(curl -sk -u 'administrator@vsphere.local:VMware1!' -X POST \ https://localhost/api/session | tr -d '"') curl -sk -H "vmware-api-session-id: $SID" https://localhost/api/vcenter/vm ``` Или: `make release-up` (seed входит в release-стек) ### Helm (Kubernetes + Ingress + Let's Encrypt) ```bash helm upgrade --install vmware-sim ./helm/vmware-api-simulator \ -n vmware-sim --create-namespace \ -f ./helm/vmware-api-simulator/values-ingress-example.yaml \ --set certManager.email=you@example.com \ --set ingress.hosts[0].host=vmware-sim.example.com \ --set ingress.tls[0].hosts[0]=vmware-sim.example.com \ --set secret.ticketSigningKey="$(openssl rand -hex 32)" ``` Нужны Ingress-контроллер и cert-manager. Подробности: [Kubernetes / Helm](docs/ru/kubernetes.md). - Lab UI + REST (Compose gateway): [https://localhost/](https://localhost/) - Схема FastAPI: [https://localhost/docs](https://localhost/docs) - Админ по умолчанию после seed: `administrator@vsphere.local` / `VMware1!` ## Быстрый старт (разработка из репозитория) Сборка и запуск development-стека с bind-mount из этого репозитория: ```bash make install make up make seed PROFILE=small curl -sk https://localhost/health/ready curl -sk https://localhost/api/appliance/system/version ``` - HTTPS gateway (основная точка входа vCenter): `https://localhost` - HTTP lab face: `http://localhost` - PostgreSQL (только localhost): `5434` - Внутренний процесс FastAPI (не публикуется на хост): `8080` - Вшитый `docker/tls/server.key` — **только для лаборатории** localhost-сертификат; не используйте его вне локального Compose. - Схема FastAPI: [https://localhost/docs](https://localhost/docs) ### Web UI Интерактивная консоль со светлой/тёмной темой, каталог эндпоинтов для vSphere majors 6–9, редактирование request/response и runtime contract hot-swap. ![Главная консоль Web UI](docs/images/web-ui-main.png) Полный обзор и дополнительные скриншоты: [Web UI](docs/ru/web-ui.md). ## Учётные данные (seed) Пароль `VMware1!` для всех засеянных principals: | User | Role | |---|---| | `administrator@vsphere.local` | Administrator | | `readonly@vsphere.local` | ReadOnly | | `operator@vsphere.local` | VirtualMachinePowerUser | | `vmadmin@vsphere.local` | VirtualMachineAdministrator | ## Документация Документация двуязычная. Используйте переключатель **Language / Язык** в начале каждой страницы или откройте русский корень [README.ru.md](README.ru.md). Индекс: [docs/README.md](docs/README.md) · [docs/ru/README.md](docs/ru/README.md). | Руководство | Описание | |---|---| | [Быстрый старт](docs/ru/getting-started.md) | Первая успешная лабораторная сессия | | [Конфигурация](docs/ru/configuration.md) | Переменные окружения и Compose | | [Аутентификация](docs/ru/authentication.md) | Сессии, `vmware-api-session-id`, привилегии | | [Версии API](docs/ru/api-versions.md) | Catalog majors 6–9 и hot-swap | | [Поверхность API](docs/ru/api-surface.md) | Маршрутизация REST/SOAP, coverage registry, stubs | | [Покрытие API](docs/ru/api-coverage.md) | Broadcom universe vs реализованная поверхность | | [Клиенты и примеры](docs/ru/clients.md) | Python, Go, Java, Perl, Ansible, Terraform, Pulumi | | [Профили seed](docs/ru/seed-profiles.md) | Детерминированные фикстуры инвентаря | | [Домены](docs/ru/domains/README.md) | Session, inventory, VM, storage, networking, tagging, SOAP, tasks, … | | [Web UI](docs/ru/web-ui.md) | Интерактивная консоль и каталоги | | [Эксплуатация](docs/ru/operations.md) | Reseed, migrate, release, upgrade | | [Kubernetes / Helm](docs/ru/kubernetes.md) | Образ Hub + Ingress + Let's Encrypt | | [Безопасность](docs/ru/security.md) | Модель угроз лаборатории и учётные данные | | [Наблюдаемость](docs/ru/observability.md) | Эндпоинты health и логирование | | [Порты](docs/ru/ports.md) | Опубликованные порты хоста и внутренние сервисы | | [Устранение неполадок](docs/ru/troubleshooting.md) | Типичные сбои | | [FAQ](docs/ru/faq.md) | Краткие ответы | | [Архитектура](docs/ru/architecture.md) | Границы компонентов | | [Совместимость](docs/ru/compatibility.md) | Модель evidence и матрица релизов | Исполняемые cookbook'и находятся в [`examples/`](examples/README.ru.md). Lab-набор на официальном [`pulumi-vsphere`](https://www.pulumi.com/registry/packages/vsphere/) (проверки непустых export'ов, HTML-отчёт) — в [`pulumi-tests/`](pulumi-tests/README.ru.md); запуск: `make pulumi-tests`. Последний lab-прогон (**2026-07-18**): offline **161 passed**; probes `test-vsphere` зелёные; полный `pulumi-tests` **7/7**, REST-матрица **1987/1987** (`critical=0`). См. [pulumi-tests/README.ru.md](pulumi-tests/README.ru.md#последний-lab-прогон-2026-07-18). ## Python (requests) через HTTPS gateway ```python import requests requests.packages.urllib3.disable_warnings() session = requests.post( "https://localhost/api/session", auth=("administrator@vsphere.local", "VMware1!"), verify=False, # local self-signed development certificate only ) headers = {"vmware-api-session-id": session.json()} vms = requests.get("https://localhost/api/vcenter/vm", headers=headers, verify=False) print(vms.json()) ``` SOAP / VIM клиенты (pyvmomi, govmomi, Terraform provider `hashicorp/vsphere`, Pulumi) указывают на `https://localhost/sdk` с теми же учётными данными. ## Основные Make-цели ```bash make up / make down / make logs / make dev make seed # large vSphere seed (10 hosts / 1000 VMs) VSPHERE_PROFILE=small make seed # compact inventory (3 hosts / 5 VMs) make test # unit + contract (offline) make test-vsphere # native vSphere unit + integration + surface + matrix make vsphere-surface # probe REST coverage registry against the running gateway make vsphere-matrix # full REST matrix: all verbs × majors 6-9 (no 5xx) make evidence # regenerate evidence/vsphere-*.json ledgers make db-migrate make shell make ci # ruff + mypy + offline pytest + surface probe make release # build + push runtime image to Docker Hub make release-up # pull/start docker-compose.release.yml make release-seed PROFILE=small ``` Docker Hub release (нужен `docker login` как владелец Hub; см. [Эксплуатация](docs/ru/operations.md)): ```bash make release # inecs/vmware-api-simulator: + :latest make release VERSION=0.2.0 # override tag make release-build # build/tag only, no push make release-up && make release-seed # run the published stack locally ``` ## Чем это не является - Не гипервизор: нет выполнения ESXi/KVM на bare metal или nested hosts. - Не drop-in multi-tenant production vCenter replacement. - Нет Supervisor/Tanzu control plane, NSX Manager, deep vSAN, SAML/OIDC federation, VECS certificate store — для некоторых из них есть lab-shaped stand-ins (засеянные, non-binary-compatible данные). Handshake HttpNfcLease / content-library transfer реализован на `/nfc` и связанных REST/SOAP-путях, но не production-binary-compatible NFC uploads; см. [docs/ru/api-coverage.md](docs/ru/api-coverage.md). - Удалённые IdP / LDAP / live NSX / live ACME directories симулируются локально; они не обращаются к реальным внешним системам. - Опциональная legacy Proxmox VE stub-плоскость доступна за `ENABLE_PVE_STUB` (**выключена** по умолчанию) из общей platform lineage; это не основная поверхность проекта. ## Лицензия Apache-2.0 — см. [LICENSE](LICENSE). Руководство по Web UI: [docs/ru/web-ui.md](docs/ru/web-ui.md).