-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathapp.py
145 lines (121 loc) · 4.94 KB
/
app.py
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
from flask import Flask, request, jsonify
from flask_cors import CORS
import docker
import git
import os
import socket
import uuid
import zipfile
from werkzeug.utils import secure_filename
from prometheus_client import start_http_server, Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
import time
from config import Config
from logger import setup_logger
from queue_service import DeploymentQueue
from mongodb_service import MongoDBService
# Configure logging
logger = setup_logger(__name__)
app = Flask(__name__)
CORS(app, origins=['https://shurulls.pro'])
# Initialize services
deployment_queue = DeploymentQueue()
mongodb_service = MongoDBService()
# Prometheus metrics
REQUEST_COUNT = Counter('api_requests_total', 'Total API requests', ['method', 'endpoint'])
REQUEST_LATENCY = Histogram('api_request_latency_seconds', 'API request latency')
@app.route('/metrics')
def metrics():
"""Expose Prometheus metrics."""
return generate_latest(), 200, {'Content-Type': CONTENT_TYPE_LATEST}
@app.route('/deploy', methods=['POST'])
@REQUEST_LATENCY.time()
def deploy():
REQUEST_COUNT.labels(method='POST', endpoint='/deploy').inc()
try:
# Validate request
if not request.json or 'email' not in request.json:
return jsonify({'error': 'Email is required'}), 400
email = request.json['email']
deployment_id = str(uuid.uuid4())
logger.info(f"Received deployment request with ID: {deployment_id} for user: {email}")
deployment_data = {
'deployment_id': deployment_id,
'email': email,
'request_data': request.files if request.files else request.json
}
# Add deployment to queue
deployment_queue.add_deployment(deployment_data)
# Save initial deployment data to MongoDB
mongodb_service.save_deployment({
'deployment_id': deployment_id,
'email': email,
'status': 'queued',
'created_at': time.time(),
'request_data': str(deployment_data['request_data'])
})
logger.info(f"Deployment {deployment_id} queued successfully")
return jsonify({
'message': 'Deployment request received and queued',
'deployment_id': deployment_id,
'status': 'queued'
})
except Exception as e:
logger.error(f"Error processing deployment request: {str(e)}")
return jsonify({'error': str(e)}), 500
@app.route('/deployments', methods=['GET'])
@REQUEST_LATENCY.time()
def list_all_deployments():
"""List all deployments with optional filtering"""
REQUEST_COUNT.labels(method='GET', endpoint='/deployments').inc()
try:
# Get optional email filter from query params
email = request.args.get('email')
# Get deployments from MongoDB
deployments = mongodb_service.get_all_deployments(email)
return jsonify({
'deployments': deployments,
'count': len(deployments)
})
except Exception as e:
logger.error(f"Error retrieving deployments: {str(e)}")
return jsonify({'error': str(e)}), 500
@app.route('/deployments/user/<email>', methods=['GET'])
@REQUEST_LATENCY.time()
def get_user_deployments(email):
"""Get all deployments for a specific user"""
REQUEST_COUNT.labels(method='GET', endpoint='/deployments/user').inc()
try:
deployments = mongodb_service.get_user_deployments(email)
return jsonify({
'email': email,
'deployments': deployments,
'count': len(deployments)
})
except Exception as e:
logger.error(f"Error retrieving user deployments: {str(e)}")
return jsonify({'error': str(e)}), 500
@app.route('/deployment/<deployment_id>/status', methods=['GET'])
@REQUEST_LATENCY.time()
def get_deployment_status(deployment_id):
REQUEST_COUNT.labels(method='GET', endpoint='/deployment/status').inc()
try:
# Get status from queue service
queue_status = deployment_queue.get_deployment_status(deployment_id)
# Get detailed status from MongoDB
db_status = mongodb_service.get_deployment(deployment_id)
if queue_status['status'] == 'not_found' and not db_status:
logger.warning(f"Deployment not found: {deployment_id}")
return jsonify({'error': 'Deployment not found'}), 404
# Combine status information
status = {**queue_status, **(db_status or {})}
logger.info(f"Retrieved status for deployment {deployment_id}: {status['status']}")
return jsonify(status)
except Exception as e:
logger.error(f"Error retrieving deployment status: {str(e)}")
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
# Start Prometheus metrics server on port 8000
start_http_server(8000)
# Start Flask app on port 5000
logger.info("Starting Flask app on http://0.0.0.0:5000")
app.run(host='0.0.0.0', port=5000, debug=False)