v0.5.0: 3 стенда — изоляция состояния, WSGI middleware, OpenAPI server selector, POLYGON_STANDS env

- loader.py: STANDS dict, get_services/get_ops_index per stand, POLYGON_STANDS env
- mock_state.py: get_state(stand_id) — ленивая инициализация
- app.py: StandMiddleware — перезапись PATH_INFO до Flask-роутинга
- Все роуты: LocalProxy(state), LocalProxy(SERVICES/OPS_INDEX) через g.stand_id
- openapi.py: _build_servers() — по одному серверу на стенд
- services/stand{1,2,3}/ — 37 YAML на стенд из STANDS/dev и STANDS/test
- tests/test_api.py: +4 multi-stand теста (изоляция, fail-next, OpenAPI servers)
- Обратная совместимость: /api/v1/svc/... → стенд по умолчанию
This commit is contained in:
2026-08-01 20:10:19 +04:00
parent 11f98738d0
commit 58d54f2a95
122 changed files with 25223 additions and 76 deletions
+298
View File
@@ -0,0 +1,298 @@
name: vc_vm_v3
service_id: 28
service_display_name: Виртуальная машина
service_short_name: vc_vm_v3
service_man: '# Документация по разворачиванию ВМ в Личном кабинете<br/><br/>Данный сервис позволяет разворачивать виртуальные машины (ВМ) непосредственно из Личного кабинета (ЛК).<br/><br/>## Доступные
операции<br/>- **create** — Создание виртуальной машины<br/>- **delete** — Удаление виртуальной машины<br/>- **resume** — Запуск виртуальной машины<br/>- **suspend** — Остановка виртуальной машины<br/><br/>---<br/><br/>##
Параметры для развёртывания ВМ<br/><br/>### Обязательные параметры:<br/><br/>**vappUid**<br/>UUID vApp, в которой будет создаваться виртуальная машина.<br/>*Пример: WZ00400*<br/><br/>**vmName**<br/>Уникальное
имя виртуальной машины.<br/>*Пример: test-vm*<br/><br/>**vmCpu**<br/>Количество ядер процессора. Должно быть больше 0.<br/>*Пример: 1*<br/><br/>**vmRam**<br/>Объем оперативной памяти в гигабайтах. Должно
быть больше 0.<br/>*Пример: 1*<br/><br/><br/>**accessPortList**<br/>Белый список портов для доступа к виртуальной машине извне в формате JSON.<br/>*Пример: ["22","10050]*<br/><br/>**imageVm**<br/>Образ
операционной системы для развёртывания.<br/>*Доступные значения: RockyLinux_9-16G-cloudinit, Ubuntu_22-20G, Debian_13-20G*<br/><br/>**userLogin**<br/>Логин пользователя для SSH-доступа.<br/>*По умолчанию:
myuser*<br/><br/>**userPublicKey**<br/>Публичный SSH-ключ пользователя в формате OpenSSH.<br/>*Пример: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...*<br/><br/>**needAddZabbixTemplate**<br/>Значение истина\ложь,
определяющее будет ли добавлен хост в zabbix.<br/>*Пример: true*<br/><br/>### Опциональные параметры:<br/><br/>**accessIpList**<br/>Белый список IP-адресов для доступа к виртуальной машине в формате JSON.
Если оставить пустым, вм будет доступена со всех адресов.<br/>*Пример: ["192.168.1.1", "10.0.0.5"]*<br/><br/>**vmDisk**<br/>Размер дополнительного диска в гигабайтах. Должно быть больше 0.<br/>*Пример:
50*<br/><br/>**ipSpaceName**<br/>Внешний IP-адрес. Если не требуется — укажите значение "no-needed" (В нем не будет работать сбор метрик zabbix). <br/><br/>**cloudInit**<br/>YAML-скрипт для кастомизации
системы через cloud-init.<br/><br/>---<br/><br/>## Доступные образы операционных систем<br/><br/>### RockyLinux_9-16G-cloudinit<br/>Базовый образ на основе Rocky Linux 9 (Rocky-9.6-x86_64-minimal) для
серверных задач.<br/>- Размер системного диска: 16 ГБ<br/>- Поддержка cloud-init<br/>- Минимальные требования: 1 vCPU, 1 ГБ RAM<br/><br/>### Ubuntu_22-20G<br/>Образ на основе Ubuntu Server 22.04 LTS для
облачного окружения.<br/>- Размер системного диска: 20 ГБ<br/>- Поддержка cloud-init<br/>- Минимальные требования: 1 vCPU, 1 ГБ RAM<br/><br/>### Debian_13-20G<br/>Образ на основе Debian 13 (Trixie) для
стабильной серверной работы.<br/>- Размер системного диска: 20 ГБ<br/>- Поддержка cloud-init<br/>- Минимальные требования: 1 vCPU, 1 ГБ RAM<br/><br/>---<br/><br/>## Пример использования Cloud-init<br/><br/>```yaml<br/>users:<br/> -
name: myuser<br/> sudo: ALL=(ALL) NOPASSWD:ALL<br/> groups: sudo<br/> shell: /bin/bash<br/> ssh-authorized-keys:<br/> - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...<br/><br/>packages:<br/> -
nginx<br/><br/>runcmd:<br/> - systemctl enable --now nginx<br/> - systemctl restart nginx<br/>```<br/><br/>---<br/><br/>## Результат выполнения<br/><br/>После успешного развёртывания в Личном кабинете
появится новая виртуальная машина с заданными характеристиками. SSH-доступ осуществляется с использованием указанных логина и публичного ключа.<br/><br/>---<br/><br/>## Важные примечания<br/><br/>###
Особенности работы:<br/>- Для отключения внешнего IP укажите значение "no-needed" в параметре ipSpaceName<br/>- Параметр cloudInit является опциональным<br/><br/>### Ограничения:<br/>- Не рекомендуется
использовать продолжительные инструкции в cloud-init (таймаут 5 минут)<br/>- Не поддерживается запись файлов через cloud-init<br/>- Не реализовано создание резервных копий ВМ<br/><br/>---<br/><br/>##
Диагностика проблем с cloud-init<br/><br/>### Основной лог-файл:<br/>```bash<br/>/var/log/cloud-init.log<br/>```<br/><br/>### Пакет не устанавливается:<br/>- Проверьте доступность пакета в репозитории<br/>-
Убедитесь в правильности написания имени пакета<br/>- Попробуйте установить вручную: `apt install <имя_пакета>` (Debian/Ubuntu) или `dnf install <имя_пакета>` (Rocky Linux)<br/><br/>### Команда не выполняется:<br/>-
Проверьте наличие требуемой утилиты в системе<br/>- Убедитесь в правильности синтаксиса команды<br/>- Попробуйте выполнить команду вручную для диагностики'
lifecycle:
suspendOnDestroyDefault: true
adoptExistingOnCreateDefault: false
operations:
- svcOperationId: 132
operation: create
kind: instance
action: create
- svcOperationId: 133
operation: delete
kind: instance
action: delete
- svcOperationId: 159
operation: modify
kind: instance
action: modify
- svcOperationId: 286
operation: reconcile
kind: action
action: reconcile
- svcOperationId: 164
operation: redeploy
kind: action
action: redeploy
- svcOperationId: 135
operation: resume
kind: instance
action: resume
- svcOperationId: 134
operation: suspend
kind: instance
action: suspend
stateOut: {}
cfsParams:
- svcOperationCfsParamId: 407
svcOperationCfsParam: vappUid
dataType: uuid
isRequired: true
defaultValue: ''
isModifiable: false
- svcOperationCfsParamId: 408
svcOperationCfsParam: vmName
dataType: string
isRequired: true
defaultValue: web01
isModifiable: false
- svcOperationCfsParamId: 409
svcOperationCfsParam: vmCpu
dataType: integer > 0
isRequired: true
defaultValue: '1'
isModifiable: true
- svcOperationCfsParamId: 410
svcOperationCfsParam: vmRam
dataType: integer > 0
isRequired: true
defaultValue: '1'
isModifiable: true
- svcOperationCfsParamId: 411
svcOperationCfsParam: vmDisk
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 412
svcOperationCfsParam: ipSpaceName
dataType: string
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 413
svcOperationCfsParam: accessIpList
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 414
svcOperationCfsParam: imageVm
dataType: string
isRequired: true
defaultValue: ''
isModifiable: false
- svcOperationCfsParamId: 415
svcOperationCfsParam: cloudInit
dataType: yaml
isRequired: false
defaultValue: ''
isModifiable: false
- svcOperationCfsParamId: 416
svcOperationCfsParam: userLogin
dataType: string
isRequired: true
defaultValue: myuser
isModifiable: false
- svcOperationCfsParamId: 417
svcOperationCfsParam: userPublicKey
dataType: string
isRequired: true
defaultValue: ''
isModifiable: false
- svcOperationCfsParamId: 448
svcOperationCfsParam: accessPortList
dataType: string
isRequired: true
defaultValue: '["22"]'
isModifiable: true
- svcOperationCfsParamId: 493
svcOperationCfsParam: vmCpu
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 494
svcOperationCfsParam: vmRam
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 495
svcOperationCfsParam: vmDisk
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 496
svcOperationCfsParam: ipSpaceName
dataType: string
isRequired: false
defaultValue: ''
isModifiable: true
valueList:
- no-needed
- internet-antiddos-v1
- internet-no-antiddos-v1
- internet-ipv4-v1
- svcOperationCfsParamId: 497
svcOperationCfsParam: accessIpList
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 498
svcOperationCfsParam: accessPortList
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 509
svcOperationCfsParam: vmName
dataType: string
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 510
svcOperationCfsParam: vmCpu
dataType: integer > 0
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 511
svcOperationCfsParam: vmRam
dataType: integer > 0
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 512
svcOperationCfsParam: vmDisk
dataType: integer > 0
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 513
svcOperationCfsParam: ipSpaceName
dataType: string
isRequired: false
defaultValue: ''
isModifiable: true
valueList:
- no-needed
- internet-antiddos-v1
- internet-no-antiddos-v1
- internet-ipv4-v1
- svcOperationCfsParamId: 514
svcOperationCfsParam: accessIpList
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 515
svcOperationCfsParam: imageVm
dataType: string
isRequired: true
defaultValue: ''
isModifiable: true
valueList:
- RockyLinux_9-16G-cloudinit
- Ubuntu_22-20G
- Debian_13-20G
- svcOperationCfsParamId: 516
svcOperationCfsParam: userLogin
dataType: string
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 517
svcOperationCfsParam: userPublicKey
dataType: string
isRequired: true
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 518
svcOperationCfsParam: cloudInit
dataType: yaml
isRequired: false
defaultValue: ''
isModifiable: true
- svcOperationCfsParamId: 520
svcOperationCfsParam: accessPortList
dataType: json
isRequired: false
defaultValue: ''
isModifiable: true
cfsParamsByOp:
132:
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 448
133: []
159:
- 493
- 494
- 495
- 496
- 497
- 498
286: []
164:
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 520
135: []
134: []
stateParams:
vappUid: ''
vmName: web01
vmCpu: '1'
vmRam: '1'
vmDisk: ''
ipSpaceName: ''
accessIpList: ''
imageVm: ''
cloudInit: ''
userLogin: myuser
userPublicKey: ''
accessPortList: '["22"]'