Some checks failed
Deploy WiFi-ETL Prod / deploy (push) Failing after 0s
- Adicionado suporte para extração de dados do Ruijie e WiFeed, incluindo autenticação e tratamento de erros. - Adicionado suporte para watermarking em ambas as fontes para extração incremental. - Criado script de transformação para mesclagem de MAC addresses. - Implementado Backfill para WiFeed, permitindo extração histórica com controle de taxa. - Adicionado script de depuração para testes de transformação do WiFeed. - Desenvolvido scripts de implantação e configurações do Docker para setup de produção. - Criado script de inicialização do schema do PostgreSQL em infra/init.sql. - Adicionado teste automatizado para lógica de transformação e carregamento em test_transform_load.py. - Atualizado documentation para implantação e setup de produção.
174 lines
4.9 KiB
Python
174 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Script para testar transform + load com dados mockados Ruijie e WiFeed.
|
||
Não precisa de API externas, testa apenas a lógica de transformação e persistência.
|
||
"""
|
||
|
||
import sys
|
||
import psycopg2
|
||
from datetime import datetime, timezone
|
||
|
||
from app.core.config import DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
|
||
from app.transform.merge_mac import transform_ruijie, transform_wifeed
|
||
from app.load.load_database import load
|
||
|
||
print("=" * 80)
|
||
print("TEST: Transform + Load")
|
||
print("=" * 80)
|
||
|
||
# Dados mock Ruijie (sessões)
|
||
mock_ruijie_records = [
|
||
{
|
||
"mac": "AA:BB:CC:DD:EE:FF",
|
||
"deviceAliasName": "AP-01",
|
||
"buildingName": "Prédio A",
|
||
"band": "5GHz",
|
||
"channel": 36,
|
||
"rssiInt": -45,
|
||
"userIp": "192.168.1.100",
|
||
"wifiUp": 1000000,
|
||
"wifiDown": 5000000,
|
||
"wifiUpDown": 6000000,
|
||
"sn": "SN001",
|
||
"onlineTime": 1640000000000, # epoch ms
|
||
"offlineTime": 1640001000000, # epoch ms
|
||
"activeTime": 500000,
|
||
},
|
||
{
|
||
"mac": "11:22:33:44:55:66",
|
||
"deviceAliasName": "AP-02",
|
||
"buildingName": "Prédio B",
|
||
"band": "2.4GHz",
|
||
"channel": 6,
|
||
"rssiInt": -60,
|
||
"userIp": "192.168.1.101",
|
||
"wifiUp": 2000000,
|
||
"wifiDown": 10000000,
|
||
"wifiUpDown": 12000000,
|
||
"sn": "SN002",
|
||
"onlineTime": 1640100000000,
|
||
"offlineTime": 1640101000000,
|
||
"activeTime": 600000,
|
||
}
|
||
]
|
||
|
||
# Dados mock WiFeed (usuários)
|
||
mock_wifeed_records = [
|
||
{
|
||
"hostMacAddress": "AA:BB:CC:DD:EE:FF",
|
||
"clientName": "João Silva",
|
||
"clientEmail": "joao@example.com",
|
||
"clientExtraFields": {"CPF": "12345678901"},
|
||
"clientGender": "M",
|
||
"clientBirthdate": "1990-01-15",
|
||
"clientPhoneNumber": "1198765432",
|
||
"clientId": 1001,
|
||
"hostType": "mobile",
|
||
"localName": "João Mobile",
|
||
},
|
||
{
|
||
"hostMacAddress": "11:22:33:44:55:66",
|
||
"clientName": "Maria Santos",
|
||
"clientEmail": "maria@example.com",
|
||
"clientExtraFields": {"CPF": "98765432101"},
|
||
"clientGender": "F",
|
||
"clientBirthdate": "1985-05-20",
|
||
"clientPhoneNumber": "1187654321",
|
||
"clientId": 1002,
|
||
"hostType": "desktop",
|
||
"localName": "Maria Desktop",
|
||
}
|
||
]
|
||
|
||
print("\n1️⃣ Transformando dados Ruijie...")
|
||
sessions = []
|
||
for record in mock_ruijie_records:
|
||
transformed = transform_ruijie(record)
|
||
if transformed:
|
||
sessions.append(transformed)
|
||
print(f" ✓ MAC {transformed['mac_address']} → {len(sessions)} sessões")
|
||
|
||
print(f"\n Total sessões: {len(sessions)}")
|
||
print(f" Exemplo: {sessions[0] if sessions else 'N/A'}")
|
||
|
||
print("\n2️⃣ Transformando dados WiFeed...")
|
||
users = []
|
||
for record in mock_wifeed_records:
|
||
transformed = transform_wifeed(record)
|
||
if transformed:
|
||
users.append(transformed)
|
||
print(f" ✓ MAC {transformed['mac_address']} → {len(users)} usuários")
|
||
|
||
print(f"\n Total usuários: {len(users)}")
|
||
print(f" Exemplo: {users[0] if users else 'N/A'}")
|
||
|
||
print("\n3️⃣ Conectando ao banco de dados...")
|
||
try:
|
||
conn = psycopg2.connect(
|
||
host=DB_HOST,
|
||
port=DB_PORT,
|
||
dbname=DB_NAME,
|
||
user=DB_USER,
|
||
password=DB_PASSWORD
|
||
)
|
||
conn.autocommit = False
|
||
print(f" ✓ Conectado a {DB_HOST}:{DB_PORT}/{DB_NAME}")
|
||
except Exception as e:
|
||
print(f" ✗ Erro de conexão: {e}")
|
||
sys.exit(1)
|
||
|
||
print("\n4️⃣ Carregando dados no banco (transform + load)...")
|
||
try:
|
||
load(conn, users, sessions)
|
||
print(" ✓ Load concluído com sucesso")
|
||
except Exception as e:
|
||
conn.rollback()
|
||
print(f" ✗ Erro no load: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
sys.exit(1)
|
||
finally:
|
||
conn.close()
|
||
|
||
print("\n5️⃣ Verific ando dados no banco...")
|
||
try:
|
||
conn = psycopg2.connect(
|
||
host=DB_HOST,
|
||
port=DB_PORT,
|
||
dbname=DB_NAME,
|
||
user=DB_USER,
|
||
password=DB_PASSWORD
|
||
)
|
||
cur = conn.cursor()
|
||
|
||
cur.execute("SELECT COUNT(*) FROM users;")
|
||
user_count = cur.fetchone()[0]
|
||
print(f" ✓ Users: {user_count} registros")
|
||
|
||
cur.execute("SELECT COUNT(*) FROM sessions;")
|
||
session_count = cur.fetchone()[0]
|
||
print(f" ✓ Sessions: {session_count} registros")
|
||
|
||
cur.execute("SELECT mac_address, name FROM users LIMIT 3;")
|
||
rows = cur.fetchall()
|
||
print(f" ✓ Amostra Users:")
|
||
for mac, name in rows:
|
||
print(f" - {mac}: {name}")
|
||
|
||
cur.execute("SELECT mac_address, access_point_name FROM sessions LIMIT 3;")
|
||
rows = cur.fetchall()
|
||
print(f" ✓ Amostra Sessions:")
|
||
for mac, ap in rows:
|
||
print(f" - {mac}: {ap}")
|
||
|
||
conn.close()
|
||
except Exception as e:
|
||
print(f" ✗ Erro ao verificar: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
sys.exit(1)
|
||
|
||
print("\n" + "=" * 80)
|
||
print("✅ TEST PASSED: Transform + Load funcionando corretamente!")
|
||
print("=" * 80)
|