logboard/test_interface.py
Сергей Антропов 011d460a38 feat: добавлено сворачивание секций и периодическое обновление контейнеров
- Добавлена функция сворачивания/разворачивания секций локальных и удаленных контейнеров
- Реализовано периодическое обновление списка контейнеров каждые 30 секунд
- Добавлена автоматическая фильтрация остановленных контейнеров
- Обновлены обработчики событий для корректной работы в свернутом sidebar
- Добавлены функции обновления счетчиков контейнеров
- Обновлена документация с описанием новых функций
- Добавлены тестовые скрипты для проверки функциональности

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-08-20 20:06:33 +03:00

148 lines
7.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Тестовый скрипт для проверки нового интерфейса LogBoard+
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import requests
import json
from datetime import datetime
def test_interface():
"""Тестирование нового интерфейса с разделением локальных и удаленных контейнеров"""
base_url = "http://localhost:9001"
# 1. Вход в систему
print("🔐 Вход в систему...")
login_data = {"username": "admin", "password": "admin"}
response = requests.post(f"{base_url}/api/auth/login", json=login_data)
if response.status_code != 200:
print(f"❌ Ошибка входа: {response.status_code}")
return
token = response.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}
print("✅ Вход выполнен успешно")
# 2. Получение проектов
print("\n📋 Получение проектов...")
response = requests.get(f"{base_url}/api/containers/projects", headers=headers)
if response.status_code != 200:
print(f"❌ Ошибка получения проектов: {response.status_code}")
return
projects = response.json()
print(f"✅ Проектов получено: {len(projects)}")
# Показываем удаленные проекты
remote_projects = [p for p in projects if p.startswith('remote-')]
local_projects = [p for p in projects if not p.startswith('remote-')]
print(f" 📍 Локальные проекты: {len(local_projects)}")
for project in local_projects[:5]: # Показываем первые 5
print(f"{project}")
if len(local_projects) > 5:
print(f" ... и еще {len(local_projects) - 5}")
print(f" 🌐 Удаленные проекты: {len(remote_projects)}")
for project in remote_projects:
hostname = project.replace('remote-', '')
print(f"{project} (хост: {hostname})")
# 3. Получение контейнеров
print("\n🐳 Получение контейнеров...")
response = requests.get(f"{base_url}/api/containers/services", headers=headers)
if response.status_code != 200:
print(f"❌ Ошибка получения контейнеров: {response.status_code}")
return
containers = response.json()
print(f"✅ Контейнеров получено: {len(containers)}")
# Анализируем контейнеры
local_containers = [c for c in containers if not c.get('is_remote', False)]
remote_containers = [c for c in containers if c.get('is_remote', False)]
print(f"\n📊 Статистика контейнеров:")
print(f" 📍 Локальные контейнеры: {len(local_containers)}")
for container in local_containers[:3]: # Показываем первые 3
print(f"{container['name']} ({container['status']}) - {container.get('project', 'standalone')}")
if len(local_containers) > 3:
print(f" ... и еще {len(local_containers) - 3}")
print(f"\n 🌐 Удаленные контейнеры: {len(remote_containers)}")
# Группируем удаленные контейнеры по хостам
containers_by_host = {}
for container in remote_containers:
hostname = container.get('hostname', 'unknown')
if hostname not in containers_by_host:
containers_by_host[hostname] = []
containers_by_host[hostname].append(container)
for hostname, host_containers in containers_by_host.items():
print(f" 🖥️ Хост: {hostname} ({len(host_containers)} контейнеров)")
for container in host_containers[:2]: # Показываем первые 2 с каждого хоста
last_update = ""
if container.get('last_modified'):
last_update = f" (обновлено: {datetime.fromtimestamp(container['last_modified']).strftime('%H:%M:%S')})"
print(f"{container['name']} ({container['status']}){last_update}")
if len(host_containers) > 2:
print(f" ... и еще {len(host_containers) - 2}")
# 4. Тестирование получения логов удаленного контейнера
if remote_containers:
print(f"\n📝 Тестирование получения логов удаленного контейнера...")
test_container = remote_containers[0]
container_id = test_container['id']
response = requests.get(f"{base_url}/api/logs/{container_id}?tail=3", headers=headers)
if response.status_code == 200:
logs_data = response.json()
print(f"✅ Логи получены для {test_container['name']} (хост: {test_container['hostname']})")
print(f" Количество строк: {len(logs_data.get('logs', []))}")
print(f" Флаг is_remote: {logs_data.get('is_remote', False)}")
# Показываем последние логи
logs = logs_data.get('logs', [])
if logs:
print(f" Последние логи:")
for log in logs[-2:]: # Показываем последние 2 строки
timestamp = log.get('timestamp', '')[:19] # Обрезаем до секунд
message = log.get('message', '')[:80] # Обрезаем длинные сообщения
print(f" [{timestamp}] {message}")
else:
print(f"❌ Ошибка получения логов: {response.status_code}")
# 5. Тестирование статистики логов
if remote_containers:
print(f"\n📊 Тестирование статистики логов...")
test_container = remote_containers[0]
container_id = test_container['id']
response = requests.get(f"{base_url}/api/logs/stats/{container_id}", headers=headers)
if response.status_code == 200:
stats = response.json()
print(f"✅ Статистика получена для {test_container['name']}:")
print(f" DEBUG: {stats.get('debug', 0)}")
print(f" INFO: {stats.get('info', 0)}")
print(f" WARN: {stats.get('warn', 0)}")
print(f" ERROR: {stats.get('error', 0)}")
else:
print(f"❌ Ошибка получения статистики: {response.status_code}")
print(f"\n🎉 Тестирование завершено!")
print(f"🌐 Откройте http://localhost:9001 в браузере для просмотра нового интерфейса")
if __name__ == "__main__":
test_interface()