File size: 5,155 Bytes
48ae4e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
"""
Initialize Default Source Pools
Creates intelligent source pools based on provider categories
"""

import sys
import os

# Add parent directory to path
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)

    # Initialize database
    db_manager.init_database()

    # Get database session
    session = db_manager.get_session()
    pool_manager = SourcePoolManager(session)

    # Define pool configurations
    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:
            # Check if pool already exists
            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

            # Create pool
            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}")

            # Add providers to pool
            added_count = 0
            for provider_config in config["providers"]:
                # Find provider by name
                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()

    # Summary
    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()