quickstarts/jobs/python/http/job-service/app.py

66 lines
2.2 KiB
Python

import os
import json
import traceback
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
class DroidJob:
def __init__(self, droid: str, task: str):
self.droid = droid
self.task = task
def set_droid_job(decoded_value: str) -> DroidJob:
# Remove newlines from decoded value and split into droid and task
droid_str = decoded_value.replace('\n', '')
droid_array = droid_str.split(':')
return DroidJob(droid_array[0], droid_array[1])
class JobHandler(BaseHTTPRequestHandler):
def _send_response(self, status_code: int, message: str = ""):
self.send_response(status_code)
self.send_header('Content-type', 'application/json')
self.end_headers()
if message:
self.wfile.write(json.dumps({"message": message}).encode('utf-8'))
def do_POST(self):
print('Received job request...', flush=True)
try:
# Check if path starts with /job/
if not self.path.startswith('/job/'):
self._send_response(404, "Not Found")
return
# Read request body
content_length = int(self.headers.get('Content-Length', 0))
raw_data = self.rfile.read(content_length).decode('utf-8')
# Parse outer JSON data
job_data = json.loads(raw_data)
# Extract value directly from the job data
value = job_data.get('value', '')
# Create DroidJob from value
droid_job = set_droid_job(value)
print("Starting droid: " + droid_job.droid, flush=True)
print("Executing maintenance job: " + droid_job.task, flush=True)
self._send_response(200)
except Exception as e:
print("Error processing job request:", flush= True)
print(traceback.format_exc())
self._send_response(400, f"Error processing job: {str(e)}")
def run_server(port: int):
server_address = ('', port)
httpd = HTTPServer(server_address, JobHandler)
print("Server started on port " + str(port), flush=True)
httpd.serve_forever()
if __name__ == '__main__':
app_port = int(os.getenv('APP_PORT', '6200'))
run_server(app_port)