File size: 6,546 Bytes
815b2e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
"""
oracle_endpoints.py β€” Endpoint API per Gestione Nodo E (Oracle Cloud)

Endpoint:
  GET  /api/oracle/health          β€” Health check Nodo E
  GET  /api/oracle/metrics         β€” Metriche Nodo E
  POST /api/oracle/sync            β€” Sincronizzazione cluster
  POST /api/oracle/restart         β€” Riavvio servizi
  GET  /api/oracle/logs            β€” Log backend remoto
"""

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional
import logging

# Import oracle manager
try:
    from backend.api.oracle_node_manager import (
        initialize_oracle_node,
        get_oracle_health,
        sync_oracle_cluster,
        get_oracle_metrics,
        restart_oracle_services,
        ORACLE_NODE_E_ENABLED,
        ORACLE_NODE_E_IP,
    )
except ImportError:
    from oracle_node_manager import (
        initialize_oracle_node,
        get_oracle_health,
        sync_oracle_cluster,
        get_oracle_metrics,
        restart_oracle_services,
        ORACLE_NODE_E_ENABLED,
        ORACLE_NODE_E_IP,
    )

_logger = logging.getLogger("oracle_endpoints")

router = APIRouter(prefix="/api/oracle", tags=["oracle"])


# ── Modelli Pydantic ──────────────────────────────────────────────────────
class OracleHealthResponse(BaseModel):
    ok: bool
    status: str
    metrics: Optional[dict] = None
    error: Optional[str] = None


class OracleSyncResponse(BaseModel):
    ok: bool
    message: Optional[str] = None
    error: Optional[str] = None


# ── Endpoint: Health Check ────────────────────────────────────────────────
@router.get("/health", response_model=OracleHealthResponse)
async def oracle_health():
    """Ritorna lo stato di salute del Nodo E."""
    if not ORACLE_NODE_E_ENABLED:
        return OracleHealthResponse(
            ok=False,
            status="disabled",
            error="Oracle Node E Γ¨ disabilitato",
        )
    
    try:
        health = await get_oracle_health()
        return OracleHealthResponse(**health)
    except Exception as exc:
        _logger.error(f"Error getting oracle health: {exc}")
        raise HTTPException(500, "Error getting oracle health")


# ── Endpoint: Metriche ────────────────────────────────────────────────────
@router.get("/metrics")
async def oracle_metrics():
    """Ritorna le metriche del Nodo E."""
    if not ORACLE_NODE_E_ENABLED:
        return {
            "ok": False,
            "error": "Oracle Node E Γ¨ disabilitato",
        }
    
    try:
        metrics = await get_oracle_metrics()
        return {
            "ok": True,
            "data": metrics,
        }
    except Exception as exc:
        _logger.error(f"Error getting oracle metrics: {exc}")
        raise HTTPException(500, "Error getting oracle metrics")


# ── Endpoint: Sincronizzazione ───────────────────────────────────────────
@router.post("/sync", response_model=OracleSyncResponse)
async def oracle_sync():
    """Sincronizza il Nodo E con il cluster principale."""
    if not ORACLE_NODE_E_ENABLED:
        return OracleSyncResponse(
            ok=False,
            error="Oracle Node E Γ¨ disabilitato",
        )
    
    try:
        result = await sync_oracle_cluster()
        return OracleSyncResponse(
            ok=result.get("ok", False),
            message=result.get("message", result.get("output", "")),
            error=result.get("error"),
        )
    except Exception as exc:
        _logger.error(f"Error syncing oracle cluster: {exc}")
        raise HTTPException(500, "Error syncing oracle cluster")


# ── Endpoint: Riavvio Servizi ────────────────────────────────────────────
@router.post("/restart")
async def oracle_restart():
    """Riavvia i servizi sul Nodo E."""
    if not ORACLE_NODE_E_ENABLED:
        return {
            "ok": False,
            "error": "Oracle Node E Γ¨ disabilitato",
        }
    
    try:
        result = await restart_oracle_services()
        return {
            "ok": result.get("ok", False),
            "message": result.get("message"),
            "health": result.get("health"),
            "error": result.get("error"),
        }
    except Exception as exc:
        _logger.error(f"Error restarting oracle services: {exc}")
        raise HTTPException(500, "Error restarting oracle services")


# ── Endpoint: Log ────────────────────────────────────────────────────────
@router.get("/logs")
async def oracle_logs(lines: int = 100):
    """Ritorna i log del backend remoto."""
    if not ORACLE_NODE_E_ENABLED:
        return {
            "ok": False,
            "error": "Oracle Node E Γ¨ disabilitato",
        }
    
    try:
        from backend.api.oracle_node_manager import _oracle_manager
        
        logs = await _oracle_manager.get_logs(lines)
        return {
            "ok": True,
            "logs": logs,
            "lines": lines,
        }
    except Exception as exc:
        _logger.error(f"Error getting oracle logs: {exc}")
        raise HTTPException(500, "Error getting oracle logs")


# ── Endpoint: Info ────────────────────────────────────────────────────────
@router.get("/info")
async def oracle_info():
    """Ritorna informazioni sul Nodo E."""
    try:
        from backend.api.oracle_node_manager import (
            ORACLE_NODE_E_ROLE,
            ORACLE_NODE_E_REGION,
            ORACLE_NODE_E_PORT,
        )
        
        return {
            "enabled": ORACLE_NODE_E_ENABLED,
            "ip": ORACLE_NODE_E_IP,
            "role": ORACLE_NODE_E_ROLE,
            "region": ORACLE_NODE_E_REGION,
            "port": ORACLE_NODE_E_PORT,
            "node_id": "E",
            "type": "Oracle Cloud (OCI)",
        }
    except Exception as exc:
        _logger.error(f"Error getting oracle info: {exc}")
        raise HTTPException(500, "Error getting oracle info")