/
dievavar
/
lab10_cloud_testing
Обзор
Документация
Войти
/
dievavar
/
lab10_cloud_testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
start_localstack.py
260 строк
8 KB
dievavar
upload files
06 дек 2025, 11:50
06 дек 2025, 11:50
85ccbcc
Код
Авторство
О чём код?
import subprocess import time import requests import os from pathlib import Path def check_docker_available(): """Проверка доступности Docker""" try: result = subprocess.run(["docker", "version"], capture_output=True, text=True) return result.returncode == 0 except FileNotFoundError: return False def start_localstack(): """Запуск через docker-compose""" print("🚀 Запуск LocalStack через Docker Compose...") # Проверяем наличие docker-compose.yml compose_file = "docker-compose.yml" if not Path(compose_file).exists(): print(f"❌ Файл {compose_file} не найден") return False # Останавливаем старые контейнеры subprocess.run(["docker-compose", "down", "-v"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # Запускаем print("🐳 Запускаем контейнеры...") result = subprocess.run(["docker-compose", "up", "-d"], capture_output=True, text=True) if result.returncode != 0: print(f"❌ Ошибка: {result.stderr}") return False return True def stop_localstack(): """Остановка LocalStack""" print("\n🛑 Останавливаем LocalStack...") if os.path.exists("docker-compose.yml"): result = subprocess.run(["docker-compose", "down", "-v"], capture_output=True, text=True) if result.returncode == 0: print("✅ LocalStack остановлен") else: print(f"⚠️ Ошибка остановки: {result.stderr}") else: print("⚠️ Файл docker-compose.yml не найден") # Очищаем контейнеры если остались subprocess.run(["docker", "rm", "-f", "localstack"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) def wait_for_localstack(timeout=60): """Ожидание запуска LocalStack""" print("⏳ Ожидаем запуск LocalStack...") health_url = "http://localhost:4566/_localstack/health" start_time = time.time() while time.time() - start_time < timeout: try: response = requests.get(health_url, timeout=2) if response.status_code == 200: health_data = response.json() # Проверяем статусы сервисов services_status = health_data.get("services", {}) ready_services = [s for s, status in services_status.items() if status == "running"] print(f"✅ Сервисы готовы: {', '.join(ready_services)}") if all(status == "running" for status in services_status.values()): print("🎉 Все сервисы запущены!") return True except requests.exceptions.ConnectionError: elapsed = int(time.time() - start_time) print(f" Ждем... ({elapsed}/{timeout} сек)", end="\r") except Exception as e: print(f" ⚠️ Ошибка: {e}") time.sleep(1) print(f"\n❌ Timeout: LocalStack не запустился за {timeout} секунд") return False def check_container_status(): """Проверка статуса контейнера""" try: result = subprocess.run( ["docker", "ps", "--filter", "name=localstack", "--format", "table {{.Names}}\t{{.Status}}"], capture_output=True, text=True ) print("📦 Статус контейнеров:") print(result.stdout) # Проверяем логи print("\n📋 Последние логи:") logs = subprocess.run( ["docker", "logs", "--tail=10", "localstack"], capture_output=True, text=True ) print(logs.stdout) except Exception as e: print(f"Ошибка проверки статуса: {e}") def create_minimal_test(): """Создание минимального тестового скрипта""" test_script = '''import boto3 import json print("🧪 Тест LocalStack") # Настройки config = { 'endpoint_url': 'http://localhost:4566', 'region_name': 'us-east-1', 'aws_access_key_id': 'test', 'aws_secret_access_key': 'test', 'use_ssl': False } # 1. Тест S3 print("\\n1. Тестируем S3...") s3 = boto3.client('s3', **config) try: # Создаем bucket bucket_name = 'test-bucket-localstack' s3.create_bucket(Bucket=bucket_name) print(f" ✅ Bucket '{bucket_name}' создан") # Загружаем тестовый объект s3.put_object( Bucket=bucket_name, Key='test.txt', Body=b'Hello LocalStack!' ) print(" ✅ Объект загружен") # Читаем объект response = s3.get_object(Bucket=bucket_name, Key='test.txt') print(f" ✅ Данные прочитаны: {response['Body'].read().decode()}") except Exception as e: print(f" ❌ Ошибка S3: {e}") # 2. Тест SQS (если включен) print("\\n2. Тестируем SQS...") try: sqs = boto3.client('sqs', **config) # Создаем очередь queue = sqs.create_queue(QueueName='test-queue') queue_url = queue['QueueUrl'] print(f" ✅ Очередь создана: {queue_url}") # Отправляем сообщение sqs.send_message( QueueUrl=queue_url, MessageBody='Test message' ) print(" ✅ Сообщение отправлено") except Exception as e: print(f" ❌ Ошибка SQS: {e}") print("\\n✅ Тест завершен!") ''' with open("test_localstack.py", "w") as f: f.write(test_script) print("📝 Тестовый скрипт создан: test_localstack.py") print(" Запустите: python test_localstack.py") def main(): print("=" * 60) print("LocalStack Manager для Mac") print("=" * 60) # Проверяем Docker if not check_docker_available(): print("❌ Docker не доступен. Убедитесь что Docker Desktop запущен.") return # Создаем docker-compose.yml если его нет if not Path("docker-compose.yml").exists(): print("📝 Создаю docker-compose.yml...") compose_content = '''version: '3.8' services: localstack: image: localstack/localstack:3.0 container_name: localstack ports: - "4566:4566" - "4510-4559:4510-4559" environment: - SERVICES=s3,sqs - DEBUG=${DEBUG:-1} - PERSISTENCE=${PERSISTENCE:-0} - DEFAULT_REGION=us-east-1 - LAMBDA_EXECUTOR=local - DOCKER_HOST=unix:// volumes: - "./.localstack:/var/lib/localstack" - "/tmp/localstack:/tmp/localstack" networks: - localstack-network networks: localstack-network: driver: bridge ''' with open("docker-compose.yml", "w") as f: f.write(compose_content) # Запускаем if start_localstack(): if wait_for_localstack(): print("\n✅ LocalStack успешно запущен!") create_minimal_test() print("\n" + "=" * 60) print("📋 Команды для работы:") print("=" * 60) print("Проверить статус: docker ps | grep localstack") print("Посмотреть логи: docker logs -f localstack") print("Остановить: docker-compose down") print("Тест: python test_localstack.py") print("\n🌐 Dashboard: http://localhost:4566/_aws/health") else: print("\n⚠️ Проблемы с запуском. Проверяем...") check_container_status() else: print("\n❌ Не удалось запустить LocalStack") print("\n" + "=" * 60) if __name__ == "__main__": main()