4.8 KiB
4.8 KiB
Ссылки: генератор YAML (tf_provider)
Репозиторий Terraform-провайдера Nubes: ~/tf_provider
Как генерируются STANDS YAML
| Файл | Описание |
|---|---|
~/tf_provider/README.md |
Общий пайплайн: 4 шага генерации провайдера |
~/tf_provider/docs/README.md |
Главный индекс документации. Формат токенов (не протухают), DDoS-Guard заголовки, Gateway URL |
~/tf_provider/docs/HOWTO_ADD_NEW_SERVICE.md |
Как добавить сервис: services_list.txt → 01_generate_yamls.sh → API → YAML |
~/tf_provider/docs/ARCHITECTURE_NEW.md |
Архитектура: слои (core/provider/resources_gen/yaml), метод Виталия без instanceUid |
~/tf_provider/docs/70_api/api-discovery-algorithms.md |
Ключевой документ. Алгоритм получения параметров: /instanceOperations/default/{id} → cfsParams с dataDescriptor, valueList, isModifiable |
Критические API-эндпоинты (метод Виталия)
Цепочка из 3 запросов — получение ВСЕХ параметров сервиса без создания инстанса:
GET /api/v1/svc/services→ найтиsvcIdпо имениGET /api/v1/svc/services/{svcId}→ найтиsvcOperationIdоперации (create:{svc.operations[?operation=="create"].svcOperationId})GET /api/v1/svc/instanceOperations/default/{svcOperationId}→ все cfsParams:dataDescriptor(подполя map-fixed),valueList,isModifiable,isSensitive,regex, ...
Почему /instanceOperations/default/{id} а не /serviceOperation/{id}:
| Данные | /serviceOperation/{id} |
/instanceOperations/default/{id} |
|---|---|---|
| ID, code, тип, isRequired | ✅ | ✅ |
valueList (допустимые значения) |
❌ | ✅ |
dataDescriptor (подполя map-fixed) |
❌ | ✅ |
isModifiable |
❌ | ✅ |
regex, maxLength, minValue... |
❌ | ✅ |
isSensitive |
❌ | ✅ |
Формат valueList:
- Для верхнеуровневых параметров: JSON-массив
["false", "true"] - Для подполей dataDescriptor: comma-separated строка
"1,3,5,7"
Где взять реальные ответы API (для сверки мока)
# Токены (НЕ протухают до декабря 2026):
~/tf_provider/secrets/test.token
~/tf_provider/secrets/dev.token
~/tf_provider/secrets/prod.token
# Проверить дату токена:
python3 -c "
import json,base64
t=open('$HOME/tf_provider/secrets/test.token').read().split('.')
d=json.loads(base64.urlsafe_b64decode(t[1]+'=='))
from datetime import datetime,timezone
print(datetime.fromtimestamp(d['exp'],tz=timezone.utc))
"
# Пример curl (test стенд):
curl -s --max-time 10 \
-H "Authorization: Bearer $(cat ~/tf_provider/secrets/test.token)" \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
-H "Referer: https://deck-test.ngcloud.ru/" \
"https://lk-api-gateway-test.ngcloud.ru/api/v1/svc/instanceOperations/default/<opId>"
⛔ DDoS-Guard: ВСЕГДА нужны 3 заголовка
Без них — 403 Forbidden даже с валидным токеном.
-H "Authorization: Bearer $TOKEN"
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
-H "Referer: https://deck-{stand}.ngcloud.ru/"
URL стендов (Gateway)
| Стенд | Gateway URL | Referer |
|---|---|---|
| test | https://lk-api-gateway-test.ngcloud.ru/api/v1/svc |
https://deck-test.ngcloud.ru/ |
| dev | https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc |
https://deck-dev.ngcloud.ru/ |
| prod | https://lk-api-gateway.ngcloud.ru/api/v1/svc |
https://deck.ngcloud.ru/ |
Сгенерированные YAML (все стенды)
| Стенд | Сервисов | Путь |
|---|---|---|
| dev | 50 | ~/tf_provider/generated/dev/resources_yaml/ |
| test | 48 | ~/tf_provider/generated/test/resources_yaml/ |
| prod | 46 | ~/tf_provider/generated/prod/resources_yaml/ |
44 сервиса идентичны на всех трёх стендах.
Поток данных: API → polygon
API Nubes (реальный)
→ 01_generate_yamls.sh
→ ~/tf_provider/generated/test/resources_yaml/*.yaml
→ копируются в STANDS/test/resources_yaml/ (autotest)
→ from_stands.py конвертирует
→ polygon/site/services/*.yaml
→ config_loader.py загружает при старте
→ polygon эмулирует /instanceOperations/default/{id}