| """
|
| 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()
|
|
|