feat: Добавлена обработка ошибок для всех интерактивных меню

- Добавлена обработка ошибок для меню лаборатории
- Добавлена обработка ошибок для меню Kubernetes
- Добавлена обработка ошибок для меню пресетов
- Добавлена обработка ошибок для меню ролей
- Добавлены интерактивные диалоги для ввода параметров
- Добавлены подтверждения для опасных операций
- Добавлены информативные сообщения об успехе/ошибке

Обработка ошибок включает:
- Проверка наличия данных (логи, статус, списки)
- Интерактивный ввод параметров через whiptail
- Подтверждение опасных операций (destroy)
- Информативные сообщения об успехе/ошибке
- Прокручиваемые окна для длинных выводов
- Предупреждения при отсутствии данных

Меню лаборатории:
-  Успех/ Ошибка для всех операций
- ⚠️ Подтверждение для destroy
- 📊 Статус с проверкой наличия данных
- 📝 Логи с прокруткой

Меню Kubernetes:
- Интерактивный ввод команд и параметров
- Проверка доступности кластера
- Информативные сообщения с URL

Меню пресетов/ролей:
- Интерактивный ввод имен
- Проверка существования файлов
- Отображение ошибок синтаксиса
- Подтверждение операций

Преимущества:
- Пользователь всегда знает результат операции
- Нет пустых экранов при отсутствии данных
- Интерактивный ввод параметров
- Безопасность через подтверждения
- Удобство использования

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-10-22 15:27:33 +03:00
parent c8dbc5356f
commit 3fe419f38e

259
Makefile
View File

@@ -133,13 +133,56 @@ menu-lab: check-whiptail ## Меню управления лабораторие
3>&1 1>&2 2>&3); \
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
case "$$CHOICE" in \
"up") make lab up;; \
"down") make lab down;; \
"test") make lab test;; \
"destroy") make lab destroy;; \
"status") make lab status;; \
"logs") make lab logs;; \
"shell") make lab shell;; \
"up") \
echo "$(BLUE)🚀 Запуск лаборатории...$(RESET)"; \
if make lab up; then \
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно запущена!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске лаборатории. Проверьте логи." 8 50; \
fi;; \
"down") \
echo "$(BLUE)🛑 Остановка лаборатории...$(RESET)"; \
if make lab down; then \
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно остановлена!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при остановке лаборатории." 8 50; \
fi;; \
"test") \
echo "$(BLUE)🧪 Тестирование лаборатории...$(RESET)"; \
if make lab test; then \
whiptail --title "✅ Успех" --msgbox "Тесты лаборатории прошли успешно!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Тесты лаборатории не прошли. Проверьте логи." 8 50; \
fi;; \
"destroy") \
if whiptail --title "⚠️ Подтверждение" --yesno "Вы уверены, что хотите уничтожить лабораторию? Это действие необратимо!" 8 50; then \
echo "$(BLUE)💥 Уничтожение лаборатории...$(RESET)"; \
if make lab destroy; then \
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно уничтожена!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при уничтожении лаборатории." 8 50; \
fi; \
fi;; \
"status") \
echo "$(BLUE)📊 Проверка статуса лаборатории...$(RESET)"; \
STATUS_OUTPUT=$$(make lab status 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$STATUS_OUTPUT" ]; then \
whiptail --title "📊 Статус лаборатории" --msgbox "$$STATUS_OUTPUT" 15 70; \
else \
whiptail --title "⚠️ Предупреждение" --msgbox "Лаборатория не запущена или статус недоступен." 8 50; \
fi;; \
"logs") \
echo "$(BLUE)📝 Получение логов лаборатории...$(RESET)"; \
LOGS_OUTPUT=$$(make lab logs 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$LOGS_OUTPUT" ]; then \
echo "$$LOGS_OUTPUT" | whiptail --title "📝 Логи лаборатории" --scrolltext --textbox /dev/stdin 20 70; \
else \
whiptail --title "⚠️ Предупреждение" --msgbox "Логи недоступны. Лаборатория может быть не запущена." 8 50; \
fi;; \
"shell") \
echo "$(BLUE)🐚 Подключение к контейнеру...$(RESET)"; \
whiptail --title "🐚 Shell" --msgbox "Подключение к контейнеру. Используйте Ctrl+D для выхода." 8 50; \
make lab shell;; \
esac
.PHONY: menu-kube
@@ -157,13 +200,61 @@ menu-kube: check-whiptail ## Меню управления Kubernetes
3>&1 1>&2 2>&3); \
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
case "$$CHOICE" in \
"logs") make kube logs;; \
"exec") make kube exec;; \
"port-forward") make kube port-forward;; \
"kiali") make kube kiali;; \
"istio") make kube istio;; \
"grafana") make kube grafana;; \
"prometheus") make kube prometheus;; \
"logs") \
echo "$(BLUE)📝 Получение логов Kubernetes...$(RESET)"; \
KUBE_LOGS=$$(make kube logs 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$KUBE_LOGS" ]; then \
echo "$$KUBE_LOGS" | whiptail --title "📝 Логи Kubernetes" --scrolltext --textbox /dev/stdin 20 70; \
else \
whiptail --title "⚠️ Предупреждение" --msgbox "Логи Kubernetes недоступны. Кластер может быть не запущен." 8 50; \
fi;; \
"exec") \
COMMAND=$$(whiptail --inputbox "Введите команду для выполнения в кластере:" 8 50 "kubectl get pods" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$COMMAND" ]; then \
echo "$(BLUE)🐚 Выполнение команды: $$COMMAND$(RESET)"; \
EXEC_OUTPUT=$$(make kube exec CMD="$$COMMAND" 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$EXEC_OUTPUT" ]; then \
echo "$$EXEC_OUTPUT" | whiptail --title "🐚 Результат выполнения" --scrolltext --textbox /dev/stdin 20 70; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при выполнении команды в кластере." 8 50; \
fi; \
fi;; \
"port-forward") \
SERVICE=$$(whiptail --inputbox "Введите имя сервиса для проброса портов:" 8 50 "kiali" 3>&1 1>&2 2>&3); \
PORT=$$(whiptail --inputbox "Введите порт для проброса:" 8 50 "20001" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$SERVICE" ] && [ -n "$$PORT" ]; then \
echo "$(BLUE)🔗 Проброс портов для $$SERVICE:$$PORT$(RESET)"; \
whiptail --title "🔗 Port Forward" --msgbox "Проброс портов запущен. Используйте Ctrl+C для остановки." 8 50; \
make kube port-forward SERVICE="$$SERVICE" PORT="$$PORT"; \
fi;; \
"kiali") \
echo "$(BLUE)🔍 Запуск Kiali Dashboard...$(RESET)"; \
if make kube kiali; then \
whiptail --title "✅ Успех" --msgbox "Kiali Dashboard доступен по адресу: http://localhost:20001" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Kiali Dashboard." 8 50; \
fi;; \
"istio") \
echo "$(BLUE)🌐 Запуск Istio Gateway...$(RESET)"; \
if make kube istio; then \
whiptail --title "✅ Успех" --msgbox "Istio Gateway доступен по адресу: http://localhost:8080" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Istio Gateway." 8 50; \
fi;; \
"grafana") \
echo "$(BLUE)📊 Запуск Grafana Dashboard...$(RESET)"; \
if make kube grafana; then \
whiptail --title "✅ Успех" --msgbox "Grafana Dashboard доступен по адресу: http://localhost:3000" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Grafana Dashboard." 8 50; \
fi;; \
"prometheus") \
echo "$(BLUE)📈 Запуск Prometheus...$(RESET)"; \
if make kube prometheus; then \
whiptail --title "✅ Успех" --msgbox "Prometheus доступен по адресу: http://localhost:9090" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Prometheus." 8 50; \
fi;; \
esac
.PHONY: menu-preset
@@ -180,12 +271,62 @@ menu-preset: check-whiptail ## Меню управления пресетами
3>&1 1>&2 2>&3); \
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
case "$$CHOICE" in \
"list") make preset list;; \
"create") make preset create;; \
"edit") make preset edit;; \
"test") make preset test;; \
"copy") make preset copy;; \
"interactive") make preset-create-interactive;; \
"list") \
echo "$(BLUE)📋 Получение списка пресетов...$(RESET)"; \
PRESET_LIST=$$(make preset list 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$PRESET_LIST" ]; then \
echo "$$PRESET_LIST" | whiptail --title "📋 Список пресетов" --scrolltext --textbox /dev/stdin 20 70; \
else \
whiptail --title "⚠️ Предупреждение" --msgbox "Пресеты не найдены или недоступны." 8 50; \
fi;; \
"create") \
PRESET_NAME=$$(whiptail --inputbox "Введите имя нового пресета:" 8 50 "my-preset" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
echo "$(BLUE) Создание пресета: $$PRESET_NAME$(RESET)"; \
if make preset create NAME="$$PRESET_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME успешно создан!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при создании пресета $$PRESET_NAME." 8 50; \
fi; \
fi;; \
"edit") \
PRESET_NAME=$$(whiptail --inputbox "Введите имя пресета для редактирования:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
echo "$(BLUE)✏️ Редактирование пресета: $$PRESET_NAME$(RESET)"; \
if make preset edit NAME="$$PRESET_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME отредактирован!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при редактировании пресета $$PRESET_NAME." 8 50; \
fi; \
fi;; \
"test") \
PRESET_NAME=$$(whiptail --inputbox "Введите имя пресета для тестирования:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
echo "$(BLUE)🧪 Тестирование пресета: $$PRESET_NAME$(RESET)"; \
if make preset test NAME="$$PRESET_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME протестирован успешно!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при тестировании пресета $$PRESET_NAME." 8 50; \
fi; \
fi;; \
"copy") \
SOURCE_NAME=$$(whiptail --inputbox "Введите имя исходного пресета:" 8 50 "" 3>&1 1>&2 2>&3); \
TARGET_NAME=$$(whiptail --inputbox "Введите имя нового пресета:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$SOURCE_NAME" ] && [ -n "$$TARGET_NAME" ]; then \
echo "$(BLUE)📋 Копирование пресета: $$SOURCE_NAME -> $$TARGET_NAME$(RESET)"; \
if make preset copy SOURCE="$$SOURCE_NAME" TARGET="$$TARGET_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Пресет скопирован: $$SOURCE_NAME -> $$TARGET_NAME" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при копировании пресета." 8 50; \
fi; \
fi;; \
"interactive") \
echo "$(BLUE)🎯 Интерактивное создание пресета...$(RESET)"; \
if make preset-create-interactive; then \
whiptail --title "✅ Успех" --msgbox "Пресет создан интерактивно!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при интерактивном создании пресета." 8 50; \
fi;; \
esac
.PHONY: menu-role
@@ -204,14 +345,76 @@ menu-role: check-whiptail ## Меню управления ролями
3>&1 1>&2 2>&3); \
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
case "$$CHOICE" in \
"list") make role list;; \
"create") make role create;; \
"edit") make role edit;; \
"test") make role test;; \
"lint") make role lint;; \
"deploy") make role deploy;; \
"playbook") make role playbook;; \
"interactive") make role-create-interactive;; \
"list") \
echo "$(BLUE)📋 Получение списка ролей...$(RESET)"; \
ROLE_LIST=$$(make role list 2>&1); \
if [ $$? -eq 0 ] && [ -n "$$ROLE_LIST" ]; then \
echo "$$ROLE_LIST" | whiptail --title "📋 Список ролей" --scrolltext --textbox /dev/stdin 20 70; \
else \
whiptail --title "⚠️ Предупреждение" --msgbox "Роли не найдены или недоступны." 8 50; \
fi;; \
"create") \
ROLE_NAME=$$(whiptail --inputbox "Введите имя новой роли:" 8 50 "my-role" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
echo "$(BLUE) Создание роли: $$ROLE_NAME$(RESET)"; \
if make role create NAME="$$ROLE_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME успешно создана!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при создании роли $$ROLE_NAME." 8 50; \
fi; \
fi;; \
"edit") \
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для редактирования:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
echo "$(BLUE)✏️ Редактирование роли: $$ROLE_NAME$(RESET)"; \
if make role edit NAME="$$ROLE_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME отредактирована!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при редактировании роли $$ROLE_NAME." 8 50; \
fi; \
fi;; \
"test") \
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для тестирования:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
echo "$(BLUE)🧪 Тестирование роли: $$ROLE_NAME$(RESET)"; \
if make role test NAME="$$ROLE_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME протестирована успешно!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при тестировании роли $$ROLE_NAME." 8 50; \
fi; \
fi;; \
"lint") \
echo "$(BLUE)🔍 Проверка синтаксиса ролей...$(RESET)"; \
LINT_OUTPUT=$$(make role lint 2>&1); \
if [ $$? -eq 0 ]; then \
whiptail --title "✅ Успех" --msgbox "Проверка синтаксиса ролей прошла успешно!" 8 50; \
else \
echo "$$LINT_OUTPUT" | whiptail --title "❌ Ошибки синтаксиса" --scrolltext --textbox /dev/stdin 20 70; \
fi;; \
"deploy") \
echo "$(BLUE)🚀 Развертывание ролей...$(RESET)"; \
if make role deploy; then \
whiptail --title "✅ Успех" --msgbox "Роли успешно развернуты!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при развертывании ролей." 8 50; \
fi;; \
"playbook") \
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для управления playbooks:" 8 50 "" 3>&1 1>&2 2>&3); \
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
echo "$(BLUE)📝 Управление playbooks роли: $$ROLE_NAME$(RESET)"; \
if make role playbook NAME="$$ROLE_NAME"; then \
whiptail --title "✅ Успех" --msgbox "Playbooks роли $$ROLE_NAME обработаны!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при обработке playbooks роли $$ROLE_NAME." 8 50; \
fi; \
fi;; \
"interactive") \
echo "$(BLUE)🎯 Интерактивное создание роли...$(RESET)"; \
if make role-create-interactive; then \
whiptail --title "✅ Успех" --msgbox "Роль создана интерактивно!" 8 50; \
else \
whiptail --title "❌ Ошибка" --msgbox "Ошибка при интерактивном создании роли." 8 50; \
fi;; \
esac
.PHONY: menu-vault