# ERRORS_SOLUTIONS - Все ошибки и как их решил ## Ошибка #1: Неправильный API endpoint ### Симптомы ``` HTTP 404 Not Found Response: ... API Documentation... ``` ### Диагностика ``` Попробовал: ❌ /api/v1/instances ❌ /api/v1/me ❌ /api/v1/catalog ❌ /api/v1/services Все вернули 404 HTML страницу ``` ### Корневая причина API требует специальный путь `/index.cfm` для всех запросов к ресурсам. ### Решение ```bash # Было: curl ... /api/v1/instances # Стало: curl ... /api/v1/index.cfm/instances?page=1&size=100 ``` ### Как это открыл 1. Посмотрел terraform provider код на VM 2. Нашёл `client_impl.go` с функцией `GetInstances()` 3. Там явно указан путь: `/index.cfm/instances` ### Урок ✅ Всегда проверяй исходный код провайдера, если API документация не ясна --- ## Ошибка #2: Параметры в списке инстансов ### Симптомы ``` AttributeError: 'dict' object has no attribute 'resourceCPU' ``` ### Диагностика ```json // Ожидал в response['results'][0]: { "resourceCPU": 1000, "resourceMemory": 2048, ... } // Получил: { "instanceUid": "...", "displayName": "...", "svc": "...", "explainedStatus": "running" } ``` ### Корневая причина Список инстансов содержит только базовую информацию. Полные параметры находятся в отдельном endpoint'е для каждого инстанса. ### Решение ```python # Было неправильно: instances = GET("/instances?page=1&size=100") for inst in instances['results']: cpu = inst['resourceCPU'] # ❌ не существует # Стало правильно: instances = GET("/instances?page=1&size=100") for inst in instances['results']: detail = GET(f"/instances/{inst['instanceUid']}") # ✅ cpu = detail['instance']['state']['params']['resourceCPU'] ``` ### Урок ✅ Проверяй структуру API response перед обработкой данных --- ## Ошибка #3: Токен не подходит ### Симптомы ```json { "message": "invalid token format: JWT must consist of exactly three parts separated by dots", "requestId": "4c86f7321aaa4ed509b9205ece64e2d3" } ``` ### Диагностика Token находился в файле, но при передаче через shell происходило: - Неправильный grep (regex не совпадал) - Экранирование символов - Передача неполного токена ### Решение вариант 1 (неправильно): ```bash TOKEN=$(grep api_token file | cut -d' ' -f3) # ❌ Не работает: cut выделяет неправильное поле ``` ### Решение вариант 2 (правильно): ```bash TOKEN=$(grep 'api_token' file | grep -oP '(?<=")[^"]+(?=")') # ✅ Использовать grep с -oP (Perl regex) ``` ### Решение вариант 3 (ещё правильнее): ```python import re with open('terraform.tfvars') as f: content = f.read() match = re.search(r'api_token\s*=\s*"([^"]+)"', content) token = match.group(1) # ✅ Python regex более надёжнее ``` ### Урок ✅ Для сложного парсинга используй Python вместо bash --- ## Ошибка #4: VM в SSH не может найти токен ### Симптомы ``` cat: /home/naeel/.deck_token: No such file or directory ``` ### Диагностика Токен хранится на локальной машине, но на VM его нет. ### Решение неправильное: ```bash # ❌ Искал токен на VM ssh naeel@vm "cat ~/.deck_token" ``` ### Решение правильное: ```bash # ✅ Передать токен через SSH как переменную TOKEN=$(cat terraform.tfvars | grep api_token | ...) ssh -i key naeel@vm "curl -H 'Authorization: Bearer $TOKEN' ..." ``` ### Урок ✅ Передавай sensitive данные через переменные, а не файлы --- ## Ошибка #5: Диаграмма слишком маленькая ### Симптомы ``` Диаграмма видна как точка на экране Невозможно прочитать текст Нельзя увеличить в браузере ``` ### Попытка решения 1: ```html
...
``` ### Результат попытки 1: - ✅ Диаграмма увеличена - ❌ Но скролл не работает! - ❌ И появились полосы прокрутки, но пусто ### Корневая причина `transform: scale()` — это CSS трансформация, которая не влияет на layout. Она визуально меняет размер, но скролл остаётся для оригинального размера. ### Попытка решения 2: ```html
...
``` ### Результат попытки 2: - ✅ Диаграмма увеличена - ✅ Скролл работает! - ✅ Layout корректный ### Почему zoom работает `zoom` — это CSS свойство, которое масштабирует всё содержимое внутри элемента, включая влияние на layout и скролл. ### Урок ✅ `transform` для визуальных трансформаций, `zoom` для масштабирования с влиянием на layout --- ## Ошибка #6: file:// протокол в WSL ### Симптомы ``` ERR_FILE_NOT_FOUND (-6) URL-адрес: file:///home/naeel/remote_dev/sless/doc/api/architecture_diagram.html ``` ### Диагностика file:// протокол работает на обычной Linux, но на WSL имеет проблемы с файловой системой. ### Попытка решения 1: ``` Открыть файл через файловый менеджер Windows ``` ❌ Слишком сложно и ненадёжно ### Попытка решения 2: ```bash # Преобразовать путь WSL в Windows # ls /home/naeel → \\wsl$\Ubuntu\home\naeel file:///\\wsl$\Ubuntu\home\naeel\... ``` ❌ Не работает ### Решение правильное: ```bash # Запустить HTTP server cd /home/naeel/remote_dev/sless/doc/api python3 -m http.server 8080 # Открыть http://localhost:8080/architecture_diagram.html ``` ✅ Всегда работает ### Урок ✅ В WSL используй HTTP localhost вместо file:// для локальных файлов --- ## Ошибка #7: Неправильная пейджинация ### Симптомы ``` API вернул 100 инстансов Но было ещё что-то, потому что хотелось больше ``` ### Диагностика ```json { "results": [100 instances], // Нет дополнительной информации о total или hasMore } ``` ### Решение неправильное: ```python # Запросить просто большой size GET("...?page=1&size=1000") # ❌ API не поддерживает size > 200 ``` ### Решение правильное: ```python # Итерировать по page page = 1 all_results = [] while True: response = GET(f"...?page={page}&size=200") all_results.extend(response['results']) if len(response['results']) < 200: break # Достигли конца page += 1 ``` ### Урок ✅ Проверяй документацию API на максимальный размер page --- ## Ошибка #8: Timeout при запросе деталей ### Симптомы ``` Скрипт зависает на инстансе curl: (28) Operation timeout was reached ``` ### Корневая причина Некоторые инстансы (особенно с много параметрами) медленно отвечают на запрос деталей. ### Решение неправильное: ```bash curl ... # без timeout # ❌ Может повесить весь скрипт ``` ### Решение правильное: ```python # С timeout subprocess.check_output( cmd, shell=True, text=True, stderr=subprocess.DEVNULL, timeout=10 # ✅ Добавить timeout ) ``` ### Урок ✅ Всегда устанавливай timeout для HTTP запросов --- ## Ошибка #9: Неправильное группирование платформ ### Симптомы ``` N/A платформа смешана с реальными платформами Невозможно понять архитектуру в диаграмме ``` ### Решение неправильное: ```python by_platform['N/A'].append(inst) # ❌ смешивать с другими ``` ### Решение правильное: ```python # Сначала вывести платформы с известными значениями for platform in sorted(all_platforms.keys()): if platform != 'N/A': render_subgraph(platform) # Потом N/A отдельно if 'N/A' in all_platforms: render_subgraph('N/A') ``` ### Урок ✅ Группируй данные логически, неизвестные отдельно --- ## Ошибка #10: Дублирующиеся инстансы в output ### Симптомы ``` ✓ 0fcbae6c | naeel-wheel ✓ 0fcbae6c | naeel-wheel <- дублирование! ``` ### Диагностика ```python for inst in running: # running list содержит дубли ``` ### Корневая причина Один инстанс был посчитан несколько раз в цикле (ошибка в фильтрации). ### Решение: ```python # Использовать set для дедупликации running_uids = set() # ✅ for inst in all_results: if inst['explainedStatus'] == 'running': uid = inst['instanceUid'] if uid not in running_uids: running_uids.add(uid) ``` ### Урок ✅ Дедуплицируй данные при обработке списков --- ## Ошибка #11: JavaScript зум без скролла ### Симптомы ```javascript container.style.transform = `scale(${zoom})`; // ❌ Скролл не работает ``` ### Решение: ```javascript container.style.zoom = zoom; // ✅ Скролл работает! ``` ### Урок ✅ Используй `zoom` вместо `transform` для масштабирования с скроллом --- ## Ошибка #12: Случайный порядок инстансов ### Симптомы ``` Каждый запуск выводит инстансы в другом порядке Сложно отследить специфический инстанс ``` ### Решение: ```python # Было: for inst in all_instances: # ❌ неопределённый порядок # Стало: for inst in sorted(all_instances, key=lambda x: x['uid']): # ✅ ``` ### Урок ✅ Всегда сортируй при выводе для воспроизводимости --- ## Общие уроки ✅ **Исследование перед действием** — изучи код, если docs не ясны ✅ **Итеративное улучшение** — не делай сложное с первого раза ✅ **Контроль данных** — всегда проверяй структуру перед обработкой ✅ **Обработка ошибок** — timeout, retries, fallbacks ✅ **Логирование** — печать промежуточных данных помогла найти ошибки ✅ **Тестирование** — проверяй каждую часть отдельно --- **Итого ошибок решено**: 12 **Время на отладку**: ~4 часа из 5-часовой сессии **Результат**: 100% рабочее решение ✅