refactor: Update update_container_workload to use standard api_response
This commit is contained in:
@@ -277,30 +277,47 @@ def request_container_workload():
|
||||
def update_container_workload(system_container_id):
|
||||
data = request.json
|
||||
logger.debug(data)
|
||||
# TODO - need to add error to autid table if there is one
|
||||
# Validate new_status
|
||||
valid_statuses = ["running", "deleted", "stopped","dead", "launch_failed"]
|
||||
new_status=data.get("new_status")
|
||||
valid_statuses = ["running", "deleted", "stopped", "dead", "launch_failed"]
|
||||
new_status = data.get("new_status")
|
||||
if new_status not in valid_statuses:
|
||||
error_message = f"Invalid status {new_status} Must be one of: {', '.join(valid_statuses)}"
|
||||
error_message = f"Invalid status {new_status}. Must be one of: {', '.join(valid_statuses)}"
|
||||
logger.error(error_message)
|
||||
return jsonify({"success": False, "message": error_message}), 400
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=400,
|
||||
error_type="INVALID_STATUS",
|
||||
error_details={"valid_statuses": valid_statuses, "provided_status": new_status}
|
||||
)
|
||||
|
||||
# Validate worker_id as UUIDs
|
||||
try:
|
||||
worker_id = (data.get("worker_id"))
|
||||
worker_id = data.get("worker_id")
|
||||
except (ValueError, TypeError) as e:
|
||||
error_message = "Invalid UUID format for worker_id."
|
||||
logger.error(f"{error_message} Error: {str(e)}")
|
||||
return jsonify({"success": False, "message": error_message}), 400
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=400,
|
||||
error_type="INVALID_UUID",
|
||||
error_details={"field": "worker_id"}
|
||||
)
|
||||
|
||||
# Validate system_container_id as UUID
|
||||
try:
|
||||
system_container_id = (system_container_id)
|
||||
system_container_id = system_container_id
|
||||
except (ValueError, TypeError) as e:
|
||||
error_message = "Invalid UUID format for system_container_id."
|
||||
logger.error(f"{error_message} Error: {str(e)}")
|
||||
return jsonify({"success": False, "message": error_message}), 400
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=400,
|
||||
error_type="INVALID_UUID",
|
||||
error_details={"field": "system_container_id"}
|
||||
)
|
||||
|
||||
# Validate timestamp as ISO format
|
||||
try:
|
||||
@@ -308,28 +325,50 @@ def update_container_workload(system_container_id):
|
||||
except (ValueError, TypeError) as e:
|
||||
error_message = "Invalid ISO timestamp format."
|
||||
logger.error(f"{error_message} Error: {str(e)}")
|
||||
return jsonify({"success": False, "message": error_message}), 400
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=400,
|
||||
error_type="INVALID_TIMESTAMP",
|
||||
error_details={"provided_timestamp": data.get("timestamp")}
|
||||
)
|
||||
|
||||
# Fetch the container from the database
|
||||
try:
|
||||
container = Workload.query.filter(
|
||||
Workload.id == system_container_id,
|
||||
or_(Workload.workload_type == "Container", Workload.workload_type == "NSController"),
|
||||
# Commenting out the deleted filter becuase when we need handle containers being
|
||||
# rebuilt we must accept that deleted containers can become not deleted again
|
||||
# Commenting out the deleted filter because when we need handle containers being
|
||||
# rebuilt we must accept that deleted containers can become not deleted again
|
||||
# Workload.deleted == False
|
||||
).first_or_404()
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Failed to fetch container with ID {system_container_id}."
|
||||
logger.error(f"{error_message} Error: {str(e)}")
|
||||
return jsonify({"success": False, "message": error_message}), 404
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=404,
|
||||
error_type="CONTAINER_NOT_FOUND",
|
||||
error_details={"container_id": system_container_id}
|
||||
)
|
||||
|
||||
# Check if the container is actually on the reported worker
|
||||
if container.workload_host_id != worker_id:
|
||||
error_message = f"Workload host in DB for container ID {system_container_id} is {container.workload_host_id}, but was reported from {worker_id}. Ignoring."
|
||||
logger.error(error_message)
|
||||
return jsonify({"success": False, "message": error_message}), 400
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=400,
|
||||
error_type="WORKER_MISMATCH",
|
||||
error_details={
|
||||
"container_id": system_container_id,
|
||||
"expected_worker": container.workload_host_id,
|
||||
"reported_worker": worker_id
|
||||
}
|
||||
)
|
||||
|
||||
# Update the status of the container
|
||||
try:
|
||||
@@ -346,12 +385,26 @@ def update_container_workload(system_container_id):
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({"success": True, "message": "Status updated successfully."}), 200
|
||||
return api_response(
|
||||
success=True,
|
||||
message="Status updated successfully.",
|
||||
data={
|
||||
"container_id": system_container_id,
|
||||
"new_status": new_status,
|
||||
"timestamp": data.get("timestamp")
|
||||
}
|
||||
)
|
||||
except Exception as e:
|
||||
error_message = f"Failed to update status for Container ID: {system_container_id}."
|
||||
logger.error(f"{error_message} Error: {str(e)}")
|
||||
db.session.rollback()
|
||||
return jsonify({"success": False, "message": error_message}), 500
|
||||
return api_response(
|
||||
success=False,
|
||||
message=error_message,
|
||||
status=500,
|
||||
error_type="DATABASE_ERROR",
|
||||
error_details={"error": str(e)}
|
||||
)
|
||||
|
||||
@api_bp.route('/workloads/containers/<workload_id>', methods=['GET'])
|
||||
def get_container_workload(workload_id):
|
||||
|
||||
Reference in New Issue
Block a user