- Добавлена функция сворачивания/разворачивания секций локальных и удаленных контейнеров - Реализовано периодическое обновление списка контейнеров каждые 30 секунд - Добавлена автоматическая фильтрация остановленных контейнеров - Обновлены обработчики событий для корректной работы в свернутом sidebar - Добавлены функции обновления счетчиков контейнеров - Обновлена документация с описанием новых функций - Добавлены тестовые скрипты для проверки функциональности Автор: Сергей Антропов Сайт: https://devops.org.ru
148 lines
7.0 KiB
Python
148 lines
7.0 KiB
Python
#!/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()
|