create capsul is working
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
|
||||
import sys
|
||||
import json
|
||||
import aiohttp
|
||||
from flask import Blueprint
|
||||
from flask import current_app
|
||||
@ -32,10 +33,19 @@ def heartbeat():
|
||||
current_app.logger.info(f"/hosts/heartbeat returned 401: invalid hub token")
|
||||
return abort(401, "invalid hub token")
|
||||
|
||||
@bp.route("/operation/<int:operation_id>", methods=("POST",))
|
||||
def operation_with_id(operation_id: int):
|
||||
return operation_impl(operation_id)
|
||||
|
||||
@bp.route("/operation", methods=("POST",))
|
||||
def operation():
|
||||
def operation_without_id():
|
||||
return operation_impl(None)
|
||||
|
||||
def operation_impl(operation_id: int):
|
||||
if authorized_as_hub(request.headers):
|
||||
request_body = request.json()
|
||||
request_body_json = request.json
|
||||
request_body = json.loads(request_body_json)
|
||||
current_app.logger.info(f"request.json: {request_body}")
|
||||
handlers = {
|
||||
"capacity_avaliable": handle_capacity_avaliable,
|
||||
"get": handle_get,
|
||||
@ -49,7 +59,7 @@ def operation():
|
||||
if isinstance(request_body, dict) and 'type' in request_body:
|
||||
if request_body['type'] in handlers:
|
||||
try:
|
||||
return handlers[request_body['type']](request_body)
|
||||
return handlers[request_body['type']](operation_id, request_body)
|
||||
except:
|
||||
error_message = my_exec_info_message(sys.exc_info())
|
||||
current_app.logger.error(f"unhandled exception in {request_body['type']} handler: {error_message}")
|
||||
@ -66,7 +76,7 @@ def operation():
|
||||
current_app.logger.info(f"/hosts/operation returned 401: invalid hub token")
|
||||
return abort(401, "invalid hub token")
|
||||
|
||||
def handle_capacity_avaliable(request_body):
|
||||
def handle_capacity_avaliable(operation_id, request_body):
|
||||
if 'additional_ram_bytes' not in request_body:
|
||||
current_app.logger.info(f"/hosts/operation returned 400: additional_ram_bytes is required for capacity_avaliable")
|
||||
return abort(400, f"bad request; additional_ram_bytes is required for capacity_avaliable")
|
||||
@ -74,7 +84,7 @@ def handle_capacity_avaliable(request_body):
|
||||
has_capacity = current_app.config['SPOKE_MODEL'].capacity_avaliable(request_body['additional_ram_bytes'])
|
||||
return jsonify(dict(assignment_status="assigned", capacity_avaliable=has_capacity))
|
||||
|
||||
def handle_get(request_body):
|
||||
def handle_get(operation_id, request_body):
|
||||
if 'id' not in request_body:
|
||||
current_app.logger.info(f"/hosts/operation returned 400: id is required for get")
|
||||
return abort(400, f"bad request; id is required for get")
|
||||
@ -83,24 +93,28 @@ def handle_get(request_body):
|
||||
|
||||
return jsonify(dict(assignment_status="assigned", id=vm.id, host=vm.host, ipv4=vm.ipv4, ipv6=vm.ipv6))
|
||||
|
||||
def handle_list_ids(request_body):
|
||||
def handle_list_ids(operation_id, request_body):
|
||||
return jsonify(dict(assignment_status="assigned", ids=current_app.config['SPOKE_MODEL'].list_ids()))
|
||||
|
||||
def handle_create(request_body):
|
||||
parameters = ["operation_id", "email", "id", "template_image_file_name", "vcpus", "memory_mb", "ssh_public_keys"]
|
||||
def handle_create(operation_id, request_body):
|
||||
if not operation_id:
|
||||
current_app.logger.info(f"/hosts/operation returned 400: operation_id is required for create ")
|
||||
return abort(400, f"bad request; operation_id is required. try POST /spoke/operation/<id>")
|
||||
|
||||
parameters = ["email", "id", "template_image_file_name", "vcpus", "memory_mb", "ssh_public_keys"]
|
||||
error_message = ""
|
||||
for parameter in parameters:
|
||||
if parameter not in request_body:
|
||||
error_message = f"{error_message}\n{parameter} is required for create"
|
||||
|
||||
if error_message != "":
|
||||
current_app.logger.info(f"/hosts/operation returned 400: {error_message}")
|
||||
current_app.logger.info(f"/hosts/opasdascasderation returned 400: {error_message}")
|
||||
return abort(400, f"bad request; {error_message}")
|
||||
|
||||
# only one host should create the vm, so we first race to assign this create operation to ourselves.
|
||||
# only one host will win this race
|
||||
authorization_header = f"Bearer {current_app.config['SPOKE_HOST_TOKEN']}"
|
||||
url = f"{current_app.config['HUB_URL']}/hub/claim-operation/{request_body['operation_id']}/{current_app.config['SPOKE_HOST_ID']}"
|
||||
url = f"{current_app.config['HUB_URL']}/hub/claim-operation/{operation_id}/{current_app.config['SPOKE_HOST_ID']}"
|
||||
result = current_app.config['HTTP_CLIENT'].post_json_sync(url, body=None, authorization_header=authorization_header)
|
||||
|
||||
assignment_status = ""
|
||||
@ -132,7 +146,7 @@ def handle_create(request_body):
|
||||
|
||||
return jsonify(dict(assignment_status=assignment_status))
|
||||
|
||||
def handle_destroy(request_body):
|
||||
def handle_destroy(operation_id, request_body):
|
||||
if 'id' not in request_body:
|
||||
current_app.logger.info(f"/hosts/operation returned 400: id is required for destroy")
|
||||
return abort(400, f"bad request; id is required for destroy")
|
||||
|
Reference in New Issue
Block a user