|
|
""" |
|
|
Initialize Default Source Pools |
|
|
Creates intelligent source pools based on provider categories |
|
|
""" |
|
|
|
|
|
import sys |
|
|
import os |
|
|
|
|
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
|
|
|
|
|
from database.db_manager import db_manager |
|
|
from monitoring.source_pool_manager import SourcePoolManager |
|
|
from utils.logger import setup_logger |
|
|
|
|
|
logger = setup_logger("init_pools") |
|
|
|
|
|
|
|
|
def init_default_pools(): |
|
|
""" |
|
|
Initialize default source pools for all categories |
|
|
""" |
|
|
logger.info("=" * 60) |
|
|
logger.info("Initializing Default Source Pools") |
|
|
logger.info("=" * 60) |
|
|
|
|
|
|
|
|
db_manager.init_database() |
|
|
|
|
|
|
|
|
session = db_manager.get_session() |
|
|
pool_manager = SourcePoolManager(session) |
|
|
|
|
|
|
|
|
pool_configs = [ |
|
|
{ |
|
|
"name": "Market Data Pool", |
|
|
"category": "market_data", |
|
|
"description": "Pool for market data APIs (CoinGecko, CoinMarketCap, etc.)", |
|
|
"rotation_strategy": "priority", |
|
|
"providers": [ |
|
|
{"name": "CoinGecko", "priority": 3, "weight": 1}, |
|
|
{"name": "CoinMarketCap", "priority": 2, "weight": 1}, |
|
|
{"name": "Binance", "priority": 1, "weight": 1}, |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"name": "Blockchain Explorers Pool", |
|
|
"category": "blockchain_explorers", |
|
|
"description": "Pool for blockchain explorer APIs", |
|
|
"rotation_strategy": "round_robin", |
|
|
"providers": [ |
|
|
{"name": "Etherscan", "priority": 1, "weight": 1}, |
|
|
{"name": "BscScan", "priority": 1, "weight": 1}, |
|
|
{"name": "TronScan", "priority": 1, "weight": 1}, |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"name": "News Sources Pool", |
|
|
"category": "news", |
|
|
"description": "Pool for news and media APIs", |
|
|
"rotation_strategy": "round_robin", |
|
|
"providers": [ |
|
|
{"name": "CryptoPanic", "priority": 2, "weight": 1}, |
|
|
{"name": "NewsAPI", "priority": 1, "weight": 1}, |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"name": "Sentiment Analysis Pool", |
|
|
"category": "sentiment", |
|
|
"description": "Pool for sentiment analysis APIs", |
|
|
"rotation_strategy": "least_used", |
|
|
"providers": [ |
|
|
{"name": "AlternativeMe", "priority": 1, "weight": 1}, |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"name": "RPC Nodes Pool", |
|
|
"category": "rpc_nodes", |
|
|
"description": "Pool for RPC node providers", |
|
|
"rotation_strategy": "priority", |
|
|
"providers": [ |
|
|
{"name": "Infura", "priority": 2, "weight": 1}, |
|
|
{"name": "Alchemy", "priority": 1, "weight": 1}, |
|
|
] |
|
|
}, |
|
|
] |
|
|
|
|
|
created_pools = [] |
|
|
|
|
|
for config in pool_configs: |
|
|
try: |
|
|
|
|
|
from database.models import SourcePool |
|
|
existing_pool = session.query(SourcePool).filter_by(name=config["name"]).first() |
|
|
|
|
|
if existing_pool: |
|
|
logger.info(f"Pool '{config['name']}' already exists, skipping") |
|
|
continue |
|
|
|
|
|
|
|
|
pool = pool_manager.create_pool( |
|
|
name=config["name"], |
|
|
category=config["category"], |
|
|
description=config["description"], |
|
|
rotation_strategy=config["rotation_strategy"] |
|
|
) |
|
|
|
|
|
logger.info(f"Created pool: {pool.name}") |
|
|
|
|
|
|
|
|
added_count = 0 |
|
|
for provider_config in config["providers"]: |
|
|
|
|
|
provider = db_manager.get_provider(name=provider_config["name"]) |
|
|
|
|
|
if provider: |
|
|
pool_manager.add_to_pool( |
|
|
pool_id=pool.id, |
|
|
provider_id=provider.id, |
|
|
priority=provider_config["priority"], |
|
|
weight=provider_config["weight"] |
|
|
) |
|
|
logger.info( |
|
|
f" Added {provider.name} to pool " |
|
|
f"(priority: {provider_config['priority']})" |
|
|
) |
|
|
added_count += 1 |
|
|
else: |
|
|
logger.warning( |
|
|
f" Provider '{provider_config['name']}' not found, skipping" |
|
|
) |
|
|
|
|
|
created_pools.append({ |
|
|
"name": pool.name, |
|
|
"members": added_count |
|
|
}) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"Error creating pool '{config['name']}': {e}", exc_info=True) |
|
|
|
|
|
session.close() |
|
|
|
|
|
|
|
|
logger.info("=" * 60) |
|
|
logger.info("Pool Initialization Complete") |
|
|
logger.info(f"Created {len(created_pools)} pools:") |
|
|
for pool in created_pools: |
|
|
logger.info(f" - {pool['name']}: {pool['members']} members") |
|
|
logger.info("=" * 60) |
|
|
|
|
|
return created_pools |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
init_default_pools() |
|
|
|