Drop Python 3.4 and switch to async / await syntax for asyncio. Fixes #1425

This commit is contained in:
grossmj committed 2018-10-15 17:05:49 +07:00
1 parent 8baa480b79
commit 76af98404a
119 files changed
+2432 -3084

No files matched your search

@@ -48,11 +48,11 @@ class ATMSwitchHandler:
description="Create a new ATM switch instance",
input=ATM_SWITCH_CREATE_SCHEMA,
output=ATM_SWITCH_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
# Use the Dynamips ATM switch to simulate this node
dynamips_manager = Dynamips.instance()
node = yield from dynamips_manager.create_node(request.json.pop("name"),
node = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
node_type="atm_switch",
@@ -90,9 +90,9 @@ class ATMSwitchHandler:
404: "Instance doesn't exist"
},
description="Duplicate an atm switch instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Dynamips.instance().duplicate_node(
new_node = await Dynamips.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -114,12 +114,12 @@ class ATMSwitchHandler:
description="Update an ATM switch instance",
input=ATM_SWITCH_UPDATE_SCHEMA,
output=ATM_SWITCH_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
if "name" in request.json and node.name != request.json["name"]:
yield from node.set_name(request.json["name"])
await node.set_name(request.json["name"])
if "mappings" in request.json:
node.mappings = request.json["mappings"]
node.updated()
@@ -137,10 +137,10 @@ class ATMSwitchHandler:
404: "Instance doesn't exist"
},
description="Delete an ATM switch instance")
def delete(request, response):
async def delete(request, response):
dynamips_manager = Dynamips.instance()
yield from dynamips_manager.delete_node(request.match_info["node_id"])
await dynamips_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -210,13 +210,13 @@ class ATMSwitchHandler:
description="Add a NIO to an ATM switch instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = yield from dynamips_manager.create_nio(node, request.json)
nio = await dynamips_manager.create_nio(node, request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
response.set_status(201)
response.json(nio)
@@ -234,13 +234,13 @@ class ATMSwitchHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from an ATM switch instance")
def delete_nio(request, response):
async def delete_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
nio = yield from node.remove_nio(port_number)
yield from nio.delete()
nio = await node.remove_nio(port_number)
await nio.delete()
response.set_status(204)
@Route.post(
@@ -258,13 +258,13 @@ class ATMSwitchHandler:
},
description="Start a packet capture on an ATM switch instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -281,10 +281,10 @@ class ATMSwitchHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on an ATM switch instance")
def stop_capture(request, response):
async def stop_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
@@ -49,10 +49,10 @@ class CloudHandler:
description="Create a new cloud instance",
input=CLOUD_CREATE_SCHEMA,
output=CLOUD_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
builtin_manager = Builtin.instance()
node = yield from builtin_manager.create_node(request.json.pop("name"),
node = await builtin_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
node_type="cloud",
@@ -123,10 +123,10 @@ class CloudHandler:
404: "Instance doesn't exist"
},
description="Delete a cloud instance")
def delete(request, response):
async def delete(request, response):
builtin_manager = Builtin.instance()
yield from builtin_manager.delete_node(request.match_info["node_id"])
await builtin_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -141,10 +141,10 @@ class CloudHandler:
404: "Instance doesn't exist"
},
description="Start a cloud")
def start(request, response):
async def start(request, response):
node = Builtin.instance().get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from node.start()
await node.start()
response.set_status(204)
@Route.post(
@@ -197,13 +197,13 @@ class CloudHandler:
description="Add a NIO to a cloud instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = builtin_manager.create_nio(request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
response.set_status(201)
response.json(nio)
@@ -223,7 +223,7 @@ class CloudHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Cloud instance")
def update_nio(request, response):
async def update_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -236,7 +236,7 @@ class CloudHandler:
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from node.update_nio(int(request.match_info["port_number"]), nio)
await node.update_nio(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -254,12 +254,12 @@ class CloudHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a cloud instance")
def delete_nio(request, response):
async def delete_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.remove_nio(port_number)
await node.remove_nio(port_number)
response.set_status(204)
@Route.post(
@@ -277,13 +277,13 @@ class CloudHandler:
},
description="Start a packet capture on a cloud instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -300,10 +300,10 @@ class CloudHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on a cloud instance")
def stop_capture(request, response):
async def stop_capture(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
@@ -46,9 +46,9 @@ class DockerHandler:
description="Create a new Docker container",
input=DOCKER_CREATE_SCHEMA,
output=DOCKER_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
docker_manager = Docker.instance()
container = yield from docker_manager.create_node(request.json.pop("name"),
container = await docker_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
image=request.json.pop("image"),
@@ -82,10 +82,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Start a Docker container")
def start(request, response):
async def start(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.start()
await container.start()
response.set_status(204)
@Route.post(
@@ -100,10 +100,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Stop a Docker container")
def stop(request, response):
async def stop(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.stop()
await container.stop()
response.set_status(204)
@Route.post(
@@ -118,10 +118,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Suspend a Docker container")
def suspend(request, response):
async def suspend(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.pause()
await container.pause()
response.set_status(204)
@Route.post(
@@ -136,10 +136,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Restart a Docker container")
def reload(request, response):
async def reload(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.restart()
await container.restart()
response.set_status(204)
@Route.delete(
@@ -154,10 +154,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Delete a Docker container")
def delete(request, response):
async def delete(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.delete()
await container.delete()
response.set_status(204)
@Route.post(
@@ -171,9 +171,9 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Duplicate a Docker instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Docker.instance().duplicate_node(
new_node = await Docker.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -192,10 +192,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Pause a Docker container")
def pause(request, response):
async def pause(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.pause()
await container.pause()
response.set_status(204)
@Route.post(
@@ -210,10 +210,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Unpause a Docker container")
def unpause(request, response):
async def unpause(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.unpause()
await container.unpause()
response.set_status(204)
@Route.post(
@@ -232,14 +232,14 @@ class DockerHandler:
description="Add a NIO to a Docker container",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio_type = request.json["type"]
if nio_type != "nio_udp":
raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = docker_manager.create_nio(request.json)
yield from container.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
await container.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -259,14 +259,14 @@ class DockerHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Docker instance")
def update_nio(request, response):
async def update_nio(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = container.ethernet_adapters[int(request.match_info["adapter_number"])].get_nio(0)
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from container.adapter_update_nio_binding(int(request.match_info["port_number"]), nio)
await container.adapter_update_nio_binding(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -284,10 +284,10 @@ class DockerHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a Docker container")
def delete_nio(request, response):
async def delete_nio(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from container.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
await container.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
response.set_status(204)
@Route.put(
@@ -305,7 +305,7 @@ class DockerHandler:
description="Update a Docker instance",
input=DOCKER_OBJECT_SCHEMA,
output=DOCKER_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -323,7 +323,7 @@ class DockerHandler:
changed = True
# We don't call container.update for nothing because it will restart the container
if changed:
yield from container.update()
await container.update()
container.updated()
response.json(container)
@@ -343,14 +343,14 @@ class DockerHandler:
},
description="Start a packet capture on a Docker container instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
pcap_file_path = os.path.join(container.project.capture_working_directory(), request.json["capture_file_name"])
yield from container.start_capture(adapter_number, pcap_file_path)
await container.start_capture(adapter_number, pcap_file_path)
response.json({"pcap_file_path": str(pcap_file_path)})
@Route.post(
@@ -368,13 +368,13 @@ class DockerHandler:
409: "Container not started"
},
description="Stop a packet capture on a Docker container instance")
def stop_capture(request, response):
async def stop_capture(request, response):
docker_manager = Docker.instance()
container = docker_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
yield from container.stop_capture(adapter_number)
await container.stop_capture(adapter_number)
response.set_status(204)
@Route.get(
@@ -384,7 +384,7 @@ class DockerHandler:
},
output=DOCKER_LIST_IMAGES_SCHEMA,
description="Get all available Docker images")
def show(request, response):
async def show(request, response):
docker_manager = Docker.instance()
images = yield from docker_manager.list_images()
images = await docker_manager.list_images()
response.json(images)
@@ -62,14 +62,14 @@ class DynamipsVMHandler:
description="Create a new Dynamips VM instance",
input=VM_CREATE_SCHEMA,
output=VM_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
dynamips_manager = Dynamips.instance()
platform = request.json.pop("platform")
default_chassis = None
if platform in DEFAULT_CHASSIS:
default_chassis = DEFAULT_CHASSIS[platform]
vm = yield from dynamips_manager.create_node(request.json.pop("name"),
vm = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
dynamips_id=request.json.get("dynamips_id"),
@@ -79,7 +79,7 @@ class DynamipsVMHandler:
aux=request.json.get("aux"),
chassis=request.json.pop("chassis", default_chassis),
node_type="dynamips")
yield from dynamips_manager.update_vm_settings(vm, request.json)
await dynamips_manager.update_vm_settings(vm, request.json)
response.set_status(201)
response.json(vm)
@@ -117,11 +117,11 @@ class DynamipsVMHandler:
description="Update a Dynamips VM instance",
input=VM_UPDATE_SCHEMA,
output=VM_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from dynamips_manager.update_vm_settings(vm, request.json)
await dynamips_manager.update_vm_settings(vm, request.json)
vm.updated()
response.json(vm)
@@ -137,11 +137,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Delete a Dynamips VM instance")
def delete(request, response):
async def delete(request, response):
# check the project_id exists
ProjectManager.instance().get_project(request.match_info["project_id"])
yield from Dynamips.instance().delete_node(request.match_info["node_id"])
await Dynamips.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -156,15 +156,15 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Start a Dynamips VM instance")
def start(request, response):
async def start(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
try:
yield from dynamips_manager.ghost_ios_support(vm)
await dynamips_manager.ghost_ios_support(vm)
except GeneratorExit:
pass
yield from vm.start()
await vm.start()
response.set_status(204)
@Route.post(
@@ -179,11 +179,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Stop a Dynamips VM instance")
def stop(request, response):
async def stop(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -198,11 +198,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Suspend a Dynamips VM instance")
def suspend(request, response):
async def suspend(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.suspend()
await vm.suspend()
response.set_status(204)
@Route.post(
@@ -217,11 +217,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Resume a suspended Dynamips VM instance")
def resume(request, response):
async def resume(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.resume()
await vm.resume()
response.set_status(204)
@Route.post(
@@ -236,11 +236,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Reload a Dynamips VM instance")
def reload(request, response):
async def reload(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -259,14 +259,14 @@ class DynamipsVMHandler:
description="Add a NIO to a Dynamips VM instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = yield from dynamips_manager.create_nio(vm, request.json)
nio = await dynamips_manager.create_nio(vm, request.json)
slot_number = int(request.match_info["adapter_number"])
port_number = int(request.match_info["port_number"])
yield from vm.slot_add_nio_binding(slot_number, port_number, nio)
await vm.slot_add_nio_binding(slot_number, port_number, nio)
response.set_status(201)
response.json(nio)
@@ -286,7 +286,7 @@ class DynamipsVMHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Dynamips instance")
def update_nio(request, response):
async def update_nio(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -295,7 +295,7 @@ class DynamipsVMHandler:
nio = vm.slots[slot_number].get_nio(port_number)
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from vm.slot_update_nio_binding(slot_number, port_number, nio)
await vm.slot_update_nio_binding(slot_number, port_number, nio)
response.set_status(201)
response.json(request.json)
@@ -313,14 +313,14 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a Dynamips VM instance")
def delete_nio(request, response):
async def delete_nio(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
slot_number = int(request.match_info["adapter_number"])
port_number = int(request.match_info["port_number"])
nio = yield from vm.slot_remove_nio_binding(slot_number, port_number)
yield from nio.delete()
nio = await vm.slot_remove_nio_binding(slot_number, port_number)
await nio.delete()
response.set_status(204)
@Route.post(
@@ -338,7 +338,7 @@ class DynamipsVMHandler:
},
description="Start a packet capture on a Dynamips VM instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -353,7 +353,7 @@ class DynamipsVMHandler:
except UnicodeEncodeError:
raise DynamipsError('The capture file path "{}" must only contain ASCII (English) characters'.format(pcap_file_path))
yield from vm.start_capture(slot_number, port_number, pcap_file_path, request.json["data_link_type"])
await vm.start_capture(slot_number, port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -370,13 +370,13 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on a Dynamips VM instance")
def stop_capture(request, response):
async def stop_capture(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
slot_number = int(request.match_info["adapter_number"])
port_number = int(request.match_info["port_number"])
yield from vm.stop_capture(slot_number, port_number)
await vm.stop_capture(slot_number, port_number)
response.set_status(204)
@Route.get(
@@ -391,12 +391,12 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Retrieve the idlepc proposals")
def get_idlepcs(request, response):
async def get_idlepcs(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.set_idlepc("0x0")
idlepcs = yield from vm.get_idle_pc_prop()
await vm.set_idlepc("0x0")
idlepcs = await vm.get_idle_pc_prop()
response.set_status(200)
response.json(idlepcs)
@@ -412,11 +412,11 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Retrieve the idlepc proposals")
def get_auto_idlepc(request, response):
async def get_auto_idlepc(request, response):
dynamips_manager = Dynamips.instance()
vm = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
idlepc = yield from dynamips_manager.auto_idlepc(vm)
idlepc = await dynamips_manager.auto_idlepc(vm)
response.set_status(200)
response.json({"idlepc": idlepc})
@@ -427,10 +427,10 @@ class DynamipsVMHandler:
},
description="Retrieve the list of Dynamips IOS images",
output=NODE_LIST_IMAGES_SCHEMA)
def list_images(request, response):
async def list_images(request, response):
dynamips_manager = Dynamips.instance()
images = yield from dynamips_manager.list_images()
images = await dynamips_manager.list_images()
response.set_status(200)
response.json(images)
@@ -444,10 +444,10 @@ class DynamipsVMHandler:
},
raw=True,
description="Upload a Dynamips IOS image")
def upload_image(request, response):
async def upload_image(request, response):
dynamips_manager = Dynamips.instance()
yield from dynamips_manager.write_image(request.match_info["filename"], request.content)
await dynamips_manager.write_image(request.match_info["filename"], request.content)
response.set_status(204)
@Route.get(
@@ -460,7 +460,7 @@ class DynamipsVMHandler:
},
raw=True,
description="Download a Dynamips IOS image")
def download_image(request, response):
async def download_image(request, response):
filename = request.match_info["filename"]
dynamips_manager = Dynamips.instance()
@@ -470,7 +470,7 @@ class DynamipsVMHandler:
if filename[0] == ".":
raise aiohttp.web.HTTPForbidden()
yield from response.file(image_path)
await response.file(image_path)
@Route.post(
r"/projects/{project_id}/dynamips/nodes/{node_id}/duplicate",
@@ -483,9 +483,9 @@ class DynamipsVMHandler:
404: "Instance doesn't exist"
},
description="Duplicate a dynamips instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Dynamips.instance().duplicate_node(
new_node = await Dynamips.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -48,11 +48,11 @@ class EthernetHubHandler:
description="Create a new Ethernet hub instance",
input=ETHERNET_HUB_CREATE_SCHEMA,
output=ETHERNET_HUB_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
# Use the Dynamips Ethernet hub to simulate this node
dynamips_manager = Dynamips.instance()
node = yield from dynamips_manager.create_node(request.json.pop("name"),
node = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
node_type="ethernet_hub",
@@ -92,9 +92,9 @@ class EthernetHubHandler:
404: "Instance doesn't exist"
},
description="Duplicate an ethernet hub instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Dynamips.instance().duplicate_node(
new_node = await Dynamips.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -116,12 +116,12 @@ class EthernetHubHandler:
description="Update an Ethernet hub instance",
input=ETHERNET_HUB_UPDATE_SCHEMA,
output=ETHERNET_HUB_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
if "name" in request.json and node.name != request.json["name"]:
yield from node.set_name(request.json["name"])
await node.set_name(request.json["name"])
if "ports_mapping" in request.json:
node.ports_mapping = request.json["ports_mapping"]
@@ -140,10 +140,10 @@ class EthernetHubHandler:
404: "Instance doesn't exist"
},
description="Delete an Ethernet hub instance")
def delete(request, response):
async def delete(request, response):
dynamips_manager = Dynamips.instance()
yield from dynamips_manager.delete_node(request.match_info["node_id"])
await dynamips_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -213,13 +213,13 @@ class EthernetHubHandler:
description="Add a NIO to an Ethernet hub instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = yield from dynamips_manager.create_nio(node, request.json)
nio = await dynamips_manager.create_nio(node, request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
response.set_status(201)
response.json(nio)
@@ -238,13 +238,13 @@ class EthernetHubHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from an Ethernet hub instance")
def delete_nio(request, response):
async def delete_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
nio = yield from node.remove_nio(port_number)
yield from nio.delete()
nio = await node.remove_nio(port_number)
await nio.delete()
response.set_status(204)
@Route.post(
@@ -262,13 +262,13 @@ class EthernetHubHandler:
},
description="Start a packet capture on an Ethernet hub instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -285,10 +285,10 @@ class EthernetHubHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on an Ethernet hub instance")
def stop_capture(request, response):
async def stop_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
@@ -48,11 +48,11 @@ class EthernetSwitchHandler:
description="Create a new Ethernet switch instance",
input=ETHERNET_SWITCH_CREATE_SCHEMA,
output=ETHERNET_SWITCH_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
# Use the Dynamips Ethernet switch to simulate this node
dynamips_manager = Dynamips.instance()
node = yield from dynamips_manager.create_node(request.json.pop("name"),
node = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
console=request.json.get("console"),
@@ -62,7 +62,7 @@ class EthernetSwitchHandler:
# On Linux, use the generic switch
# builtin_manager = Builtin.instance()
# node = yield from builtin_manager.create_node(request.json.pop("name"),
# node = await builtin_manager.create_node(request.json.pop("name"),
# request.match_info["project_id"],
# request.json.get("node_id"),
# node_type="ethernet_switch")
@@ -103,9 +103,9 @@ class EthernetSwitchHandler:
404: "Instance doesn't exist"
},
description="Duplicate an ethernet switch instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Dynamips.instance().duplicate_node(
new_node = await Dynamips.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -127,15 +127,15 @@ class EthernetSwitchHandler:
description="Update an Ethernet switch instance",
input=ETHERNET_SWITCH_UPDATE_SCHEMA,
output=ETHERNET_SWITCH_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
if "name" in request.json and node.name != request.json["name"]:
yield from node.set_name(request.json["name"])
await node.set_name(request.json["name"])
if "ports_mapping" in request.json:
node.ports_mapping = request.json["ports_mapping"]
yield from node.update_port_settings()
await node.update_port_settings()
if "console_type" in request.json:
node.console_type = request.json["console_type"]
@@ -157,10 +157,10 @@ class EthernetSwitchHandler:
404: "Instance doesn't exist"
},
description="Delete an Ethernet switch instance")
def delete(request, response):
async def delete(request, response):
dynamips_manager = Dynamips.instance()
yield from dynamips_manager.delete_node(request.match_info["node_id"])
await dynamips_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -230,17 +230,17 @@ class EthernetSwitchHandler:
description="Add a NIO to an Ethernet switch instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = yield from dynamips_manager.create_nio(node, request.json)
nio = await dynamips_manager.create_nio(node, request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
#builtin_manager = Builtin.instance()
#node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
#nio = yield from builtin_manager.create_nio(request.json["nio"])
#nio = await builtin_manager.create_nio(request.json["nio"])
response.set_status(201)
response.json(nio)
@@ -259,15 +259,15 @@ class EthernetSwitchHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from an Ethernet switch instance")
def delete_nio(request, response):
async def delete_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
#builtin_manager = Builtin.instance()
#node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
nio = yield from node.remove_nio(port_number)
yield from nio.delete()
nio = await node.remove_nio(port_number)
await nio.delete()
response.set_status(204)
@Route.post(
@@ -285,7 +285,7 @@ class EthernetSwitchHandler:
},
description="Start a packet capture on an Ethernet switch instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -293,7 +293,7 @@ class EthernetSwitchHandler:
#node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -310,12 +310,12 @@ class EthernetSwitchHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on an Ethernet switch instance")
def stop_capture(request, response):
async def stop_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
#builtin_manager = Builtin.instance()
#node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
@@ -48,11 +48,11 @@ class FrameRelaySwitchHandler:
description="Create a new Frame Relay switch instance",
input=FRAME_RELAY_SWITCH_CREATE_SCHEMA,
output=FRAME_RELAY_SWITCH_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
# Use the Dynamips Frame Relay switch to simulate this node
dynamips_manager = Dynamips.instance()
node = yield from dynamips_manager.create_node(request.json.pop("name"),
node = await dynamips_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
node_type="frame_relay_switch",
@@ -90,9 +90,9 @@ class FrameRelaySwitchHandler:
404: "Instance doesn't exist"
},
description="Duplicate a frame relay switch instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Dynamips.instance().duplicate_node(
new_node = await Dynamips.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -114,12 +114,12 @@ class FrameRelaySwitchHandler:
description="Update a Frame Relay switch instance",
input=FRAME_RELAY_SWITCH_UPDATE_SCHEMA,
output=FRAME_RELAY_SWITCH_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
if "name" in request.json and node.name != request.json["name"]:
yield from node.set_name(request.json["name"])
await node.set_name(request.json["name"])
if "mappings" in request.json:
node.mappings = request.json["mappings"]
node.updated()
@@ -137,10 +137,10 @@ class FrameRelaySwitchHandler:
404: "Instance doesn't exist"
},
description="Delete a Frame Relay switch instance")
def delete(request, response):
async def delete(request, response):
dynamips_manager = Dynamips.instance()
yield from dynamips_manager.delete_node(request.match_info["node_id"])
await dynamips_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -210,13 +210,13 @@ class FrameRelaySwitchHandler:
description="Add a NIO to a Frame Relay switch instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = yield from dynamips_manager.create_nio(node, request.json)
nio = await dynamips_manager.create_nio(node, request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
response.set_status(201)
response.json(nio)
@@ -234,13 +234,13 @@ class FrameRelaySwitchHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a Frame Relay switch instance")
def delete_nio(request, response):
async def delete_nio(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
nio = yield from node.remove_nio(port_number)
yield from nio.delete()
nio = await node.remove_nio(port_number)
await nio.delete()
response.set_status(204)
@Route.post(
@@ -258,13 +258,13 @@ class FrameRelaySwitchHandler:
},
description="Start a packet capture on a Frame Relay switch instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -281,10 +281,10 @@ class FrameRelaySwitchHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on a Frame Relay switch instance")
def stop_capture(request, response):
async def stop_capture(request, response):
dynamips_manager = Dynamips.instance()
node = dynamips_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
+30 -30
View File
@@ -54,10 +54,10 @@ class IOUHandler:
description="Create a new IOU instance",
input=IOU_CREATE_SCHEMA,
output=IOU_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
iou = IOU.instance()
vm = yield from iou.create_node(request.json.pop("name"),
vm = await iou.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
path=request.json.get("path"),
@@ -112,7 +112,7 @@ class IOUHandler:
description="Update an IOU instance",
input=IOU_OBJECT_SCHEMA,
output=IOU_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -126,7 +126,7 @@ class IOUHandler:
if vm.use_default_iou_values:
# update the default IOU values in case the image or use_default_iou_values have changed
# this is important to have the correct NVRAM amount in order to correctly push the configs to the NVRAM
yield from vm.update_default_iou_values()
await vm.update_default_iou_values()
vm.updated()
response.json(vm)
@@ -142,9 +142,9 @@ class IOUHandler:
404: "Instance doesn't exist"
},
description="Delete an IOU instance")
def delete(request, response):
async def delete(request, response):
yield from IOU.instance().delete_node(request.match_info["node_id"])
await IOU.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -158,9 +158,9 @@ class IOUHandler:
404: "Instance doesn't exist"
},
description="Duplicate a IOU instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from IOU.instance().duplicate_node(
new_node = await IOU.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -181,7 +181,7 @@ class IOUHandler:
input=IOU_START_SCHEMA,
output=IOU_OBJECT_SCHEMA,
description="Start an IOU instance")
def start(request, response):
async def start(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -190,7 +190,7 @@ class IOUHandler:
if hasattr(vm, name) and getattr(vm, name) != value:
setattr(vm, name, value)
yield from vm.start()
await vm.start()
response.json(vm)
@Route.post(
@@ -205,11 +205,11 @@ class IOUHandler:
404: "Instance doesn't exist"
},
description="Stop an IOU instance")
def stop(request, response):
async def stop(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -242,11 +242,11 @@ class IOUHandler:
404: "Instance doesn't exist"
},
description="Reload an IOU instance")
def reload(request, response):
async def reload(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -265,7 +265,7 @@ class IOUHandler:
description="Add a NIO to a IOU instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -273,7 +273,7 @@ class IOUHandler:
if nio_type not in ("nio_udp", "nio_tap", "nio_ethernet", "nio_generic_ethernet"):
raise aiohttp.web.HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = iou_manager.create_nio(request.json)
yield from vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), int(request.match_info["port_number"]), nio)
await vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -293,7 +293,7 @@ class IOUHandler:
description="Update a NIO from a IOU instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def update_nio(request, response):
async def update_nio(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -302,7 +302,7 @@ class IOUHandler:
nio = vm.adapters[adapter_number].get_nio(port_number)
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from vm.adapter_update_nio_binding(
await vm.adapter_update_nio_binding(
adapter_number,
port_number,
nio)
@@ -323,11 +323,11 @@ class IOUHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a IOU instance")
def delete_nio(request, response):
async def delete_nio(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]), int(request.match_info["port_number"]))
await vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]), int(request.match_info["port_number"]))
response.set_status(204)
@Route.post(
@@ -346,14 +346,14 @@ class IOUHandler:
},
description="Start a packet capture on an IOU VM instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(adapter_number, port_number, pcap_file_path, request.json["data_link_type"])
await vm.start_capture(adapter_number, port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": str(pcap_file_path)})
@Route.post(
@@ -371,14 +371,14 @@ class IOUHandler:
409: "VM not started"
},
description="Stop a packet capture on an IOU VM instance")
def stop_capture(request, response):
async def stop_capture(request, response):
iou_manager = IOU.instance()
vm = iou_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
port_number = int(request.match_info["port_number"])
yield from vm.stop_capture(adapter_number, port_number)
await vm.stop_capture(adapter_number, port_number)
response.set_status(204)
@Route.get(
@@ -388,10 +388,10 @@ class IOUHandler:
},
description="Retrieve the list of IOU images",
output=NODE_LIST_IMAGES_SCHEMA)
def list_iou_images(request, response):
async def list_iou_images(request, response):
iou_manager = IOU.instance()
images = yield from iou_manager.list_images()
images = await iou_manager.list_images()
response.set_status(200)
response.json(images)
@@ -405,10 +405,10 @@ class IOUHandler:
},
raw=True,
description="Upload an IOU image")
def upload_image(request, response):
async def upload_image(request, response):
iou_manager = IOU.instance()
yield from iou_manager.write_image(request.match_info["filename"], request.content)
await iou_manager.write_image(request.match_info["filename"], request.content)
response.set_status(204)
@@ -422,7 +422,7 @@ class IOUHandler:
},
raw=True,
description="Download an IOU image")
def download_image(request, response):
async def download_image(request, response):
filename = request.match_info["filename"]
iou_manager = IOU.instance()
@@ -432,4 +432,4 @@ class IOUHandler:
if filename[0] == ".":
raise aiohttp.web.HTTPForbidden()
yield from response.file(image_path)
await response.file(image_path)
+14 -14
View File
@@ -48,10 +48,10 @@ class NatHandler:
description="Create a new nat instance",
input=NAT_CREATE_SCHEMA,
output=NAT_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
builtin_manager = Builtin.instance()
node = yield from builtin_manager.create_node(request.json.pop("name"),
node = await builtin_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
node_type="nat",
@@ -115,10 +115,10 @@ class NatHandler:
404: "Instance doesn't exist"
},
description="Delete a nat instance")
def delete(request, response):
async def delete(request, response):
builtin_manager = Builtin.instance()
yield from builtin_manager.delete_node(request.match_info["node_id"])
await builtin_manager.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -188,13 +188,13 @@ class NatHandler:
description="Add a NIO to a nat instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = builtin_manager.create_nio(request.json)
port_number = int(request.match_info["port_number"])
yield from node.add_nio(nio, port_number)
await node.add_nio(nio, port_number)
response.set_status(201)
response.json(nio)
@@ -214,14 +214,14 @@ class NatHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a NAT instance")
def update_nio(request, response):
async def update_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = node.nios[int(request.match_info["adapter_number"])]
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from node.update_nio(int(request.match_info["port_number"]), nio)
await node.update_nio(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -239,12 +239,12 @@ class NatHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a nat instance")
def delete_nio(request, response):
async def delete_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.remove_nio(port_number)
await node.remove_nio(port_number)
response.set_status(204)
@Route.post(
@@ -262,13 +262,13 @@ class NatHandler:
},
description="Start a packet capture on a nat instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(node.project.capture_working_directory(), request.json["capture_file_name"])
yield from node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
await node.start_capture(port_number, pcap_file_path, request.json["data_link_type"])
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -285,10 +285,10 @@ class NatHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on a nat instance")
def stop_capture(request, response):
async def stop_capture(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from node.stop_capture(port_number)
await node.stop_capture(port_number)
response.set_status(204)
@@ -20,16 +20,14 @@ import aiohttp
from aiohttp.web import WebSocketResponse
from gns3server.web.route import Route
from gns3server.compute.notification_manager import NotificationManager
from gns3server.utils.asyncio import asyncio_ensure_future
@asyncio.coroutine
def process_websocket(ws):
async def process_websocket(ws):
"""
Process ping / pong and close message
"""
try:
yield from ws.receive()
await ws.receive()
except aiohttp.WSServerHandshakeError:
pass
@@ -39,17 +37,17 @@ class NotificationHandler:
@Route.get(
r"/notifications/ws",
description="Send notifications using Websockets")
def notifications(request, response):
async def notifications(request, response):
notifications = NotificationManager.instance()
ws = WebSocketResponse()
yield from ws.prepare(request)
await ws.prepare(request)
asyncio_ensure_future(process_websocket(ws))
asyncio.ensure_future(process_websocket(ws))
with notifications.queue() as queue:
while True:
try:
notification = yield from queue.get_json(1)
notification = await queue.get_json(1)
except asyncio.futures.CancelledError:
break
if ws.closed:
@@ -88,11 +88,11 @@ class ProjectHandler:
},
output=PROJECT_OBJECT_SCHEMA,
input=PROJECT_UPDATE_SCHEMA)
def update_project(request, response):
async def update_project(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
yield from project.update(
await project.update(
variables=request.json.get("variables", None)
)
response.set_status(200)
@@ -125,12 +125,12 @@ class ProjectHandler:
204: "Project closed",
404: "The project doesn't exist"
})
def close(request, response):
async def close(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
if ProjectHandler._notifications_listening.setdefault(project.id, 0) <= 1:
yield from project.close()
await project.close()
pm.remove_project(project.id)
try:
del ProjectHandler._notifications_listening[project.id]
@@ -150,11 +150,11 @@ class ProjectHandler:
204: "Changes have been written on disk",
404: "The project doesn't exist"
})
def delete(request, response):
async def delete(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
yield from project.delete()
await project.delete()
pm.remove_project(project.id)
response.set_status(204)
@@ -168,7 +168,7 @@ class ProjectHandler:
200: "End of stream",
404: "The project doesn't exist"
})
def notification(request, response):
async def notification(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
@@ -184,7 +184,7 @@ class ProjectHandler:
response.write("{}\n".format(json.dumps(ProjectHandler._getPingMessage())).encode("utf-8"))
while True:
try:
(action, msg) = yield from asyncio.wait_for(queue.get(), 5)
(action, msg) = await asyncio.wait_for(queue.get(), 5)
if hasattr(msg, "__json__"):
msg = json.dumps({"action": action, "event": msg.__json__()}, sort_keys=True)
else:
@@ -219,11 +219,11 @@ class ProjectHandler:
404: "The project doesn't exist"
},
output=PROJECT_FILE_LIST_SCHEMA)
def list_files(request, response):
async def list_files(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
files = yield from project.list_files()
files = await project.list_files()
response.json(files)
response.set_status(200)
@@ -238,7 +238,7 @@ class ProjectHandler:
403: "Permission denied",
404: "The file doesn't exist"
})
def get_file(request, response):
async def get_file(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
@@ -256,12 +256,12 @@ class ProjectHandler:
try:
with open(path, "rb") as f:
yield from response.prepare(request)
await response.prepare(request)
while True:
data = f.read(4096)
if not data:
break
yield from response.write(data)
await response.write(data)
except FileNotFoundError:
raise aiohttp.web.HTTPNotFound()
@@ -279,7 +279,7 @@ class ProjectHandler:
403: "Permission denied",
404: "The file doesn't exist"
})
def stream_file(request, response):
async def stream_file(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
@@ -297,12 +297,12 @@ class ProjectHandler:
try:
with open(path, "rb") as f:
yield from response.prepare(request)
await response.prepare(request)
while True:
data = f.read(4096)
if not data:
yield from asyncio.sleep(0.1)
yield from response.write(data)
await asyncio.sleep(0.1)
await response.write(data)
except FileNotFoundError:
raise aiohttp.web.HTTPNotFound()
@@ -321,7 +321,7 @@ class ProjectHandler:
403: "Permission denied",
404: "The path doesn't exist"
})
def write_file(request, response):
async def write_file(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
@@ -340,7 +340,7 @@ class ProjectHandler:
with open(path, 'wb+') as f:
while True:
try:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
except asyncio.TimeoutError:
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when writing to file '{}'".format(path))
if not chunk:
@@ -363,21 +363,21 @@ class ProjectHandler:
200: "File returned",
404: "The project doesn't exist"
})
def export_project(request, response):
async def export_project(request, response):
pm = ProjectManager.instance()
project = pm.get_project(request.match_info["project_id"])
response.content_type = 'application/gns3project'
response.headers['CONTENT-DISPOSITION'] = 'attachment; filename="{}.gns3project"'.format(project.name)
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
include_images = bool(int(request.json.get("include_images", "0")))
for data in project.export(include_images=include_images):
response.write(data)
yield from response.drain()
await response.drain()
yield from response.write_eof()
await response.write_eof()
@Route.post(
r"/projects/{project_id}/import",
@@ -391,7 +391,7 @@ class ProjectHandler:
200: "Project imported",
403: "Forbidden to import project"
})
def import_project(request, response):
async def import_project(request, response):
pm = ProjectManager.instance()
project_id = request.match_info["project_id"]
@@ -403,7 +403,7 @@ class ProjectHandler:
try:
with tempfile.SpooledTemporaryFile(max_size=10000) as temp:
while True:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
if not chunk:
break
temp.write(chunk)
+44 -44
View File
@@ -63,10 +63,10 @@ class QEMUHandler:
description="Create a new Qemu VM instance",
input=QEMU_CREATE_SCHEMA,
output=QEMU_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
qemu = Qemu.instance()
vm = yield from qemu.create_node(request.json.pop("name"),
vm = await qemu.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.pop("node_id", None),
linked_clone=request.json.get("linked_clone", True),
@@ -141,9 +141,9 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Delete a Qemu VM instance")
def delete(request, response):
async def delete(request, response):
yield from Qemu.instance().delete_node(request.match_info["node_id"])
await Qemu.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -157,9 +157,9 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Duplicate a Qemu instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from Qemu.instance().duplicate_node(
new_node = await Qemu.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -178,11 +178,11 @@ class QEMUHandler:
},
description="Resize a Qemu VM disk image",
input=QEMU_RESIZE_SCHEMA)
def resize_disk(request, response):
async def resize_disk(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.resize_disk(request.json["drive_name"], request.json["extend"])
await vm.resize_disk(request.json["drive_name"], request.json["extend"])
response.set_status(201)
@Route.post(
@@ -198,7 +198,7 @@ class QEMUHandler:
},
description="Start a Qemu VM instance",
output=QEMU_OBJECT_SCHEMA)
def start(request, response):
async def start(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -212,7 +212,7 @@ class QEMUHandler:
pm = ProjectManager.instance()
if pm.check_hardware_virtualization(vm) is False:
raise aiohttp.web.HTTPConflict(text="Cannot start VM with hardware acceleration (KVM/HAX) enabled because hardware virtualization (VT-x/AMD-V) is already used by another software like VMware or VirtualBox")
yield from vm.start()
await vm.start()
response.json(vm)
@Route.post(
@@ -227,11 +227,11 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Stop a Qemu VM instance")
def stop(request, response):
async def stop(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -246,11 +246,11 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Reload a Qemu VM instance")
def reload(request, response):
async def reload(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -265,11 +265,11 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Suspend a Qemu VM instance")
def suspend(request, response):
async def suspend(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.suspend()
await vm.suspend()
response.set_status(204)
@Route.post(
@@ -284,11 +284,11 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Resume a Qemu VM instance")
def resume(request, response):
async def resume(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.resume()
await vm.resume()
response.set_status(204)
@Route.post(
@@ -307,7 +307,7 @@ class QEMUHandler:
description="Add a NIO to a Qemu VM instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -315,7 +315,7 @@ class QEMUHandler:
if nio_type not in ("nio_udp"):
raise aiohttp.web.HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = qemu_manager.create_nio(request.json)
yield from vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -335,7 +335,7 @@ class QEMUHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Qemu instance")
def update_nio(request, response):
async def update_nio(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -344,7 +344,7 @@ class QEMUHandler:
nio.filters = request.json["filters"]
if "suspend" in request.json and nio:
nio.suspend = request.json["suspend"]
yield from vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -362,11 +362,11 @@ class QEMUHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a Qemu VM instance")
def delete_nio(request, response):
async def delete_nio(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
await vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
response.set_status(204)
@Route.post(
@@ -384,13 +384,13 @@ class QEMUHandler:
},
description="Start a packet capture on a Qemu VM instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(adapter_number, pcap_file_path)
await vm.start_capture(adapter_number, pcap_file_path)
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -407,12 +407,12 @@ class QEMUHandler:
404: "Instance doesn't exist",
},
description="Stop a packet capture on a Qemu VM instance")
def stop_capture(request, response):
async def stop_capture(request, response):
qemu_manager = Qemu.instance()
vm = qemu_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
yield from vm.stop_capture(adapter_number)
await vm.stop_capture(adapter_number)
response.set_status(204)
@Route.get(
@@ -425,9 +425,9 @@ class QEMUHandler:
description="Get a list of available Qemu binaries",
input=QEMU_BINARY_FILTER_SCHEMA,
output=QEMU_BINARY_LIST_SCHEMA)
def list_binaries(request, response):
async def list_binaries(request, response):
binaries = yield from Qemu.binary_list(request.json.get("archs", None))
binaries = await Qemu.binary_list(request.json.get("archs", None))
response.json(binaries)
@Route.get(
@@ -439,9 +439,9 @@ class QEMUHandler:
},
description="Get a list of available Qemu-img binaries",
output=QEMU_BINARY_LIST_SCHEMA)
def list_img_binaries(request, response):
async def list_img_binaries(request, response):
binaries = yield from Qemu.img_binary_list()
binaries = await Qemu.img_binary_list()
response.json(binaries)
@Route.get(
@@ -452,9 +452,9 @@ class QEMUHandler:
description="Get a list of Qemu capabilities on this server",
output=QEMU_CAPABILITY_LIST_SCHEMA
)
def get_capabilities(request, response):
async def get_capabilities(request, response):
capabilities = {"kvm": []}
kvms = yield from Qemu.get_kvm_archs()
kvms = await Qemu.get_kvm_archs()
if kvms:
capabilities["kvm"] = kvms
response.json(capabilities)
@@ -467,7 +467,7 @@ class QEMUHandler:
description="Create a Qemu image",
input=QEMU_IMAGE_CREATE_SCHEMA
)
def create_img(request, response):
async def create_img(request, response):
qemu_img = request.json.pop("qemu_img")
path = request.json.pop("path")
@@ -477,7 +477,7 @@ class QEMUHandler:
response.set_status(403)
return
yield from Qemu.instance().create_disk(qemu_img, path, request.json)
await Qemu.instance().create_disk(qemu_img, path, request.json)
response.set_status(201)
@Route.put(
@@ -488,7 +488,7 @@ class QEMUHandler:
description="Update a Qemu image",
input=QEMU_IMAGE_UPDATE_SCHEMA
)
def update_img(request, response):
async def update_img(request, response):
qemu_img = request.json.pop("qemu_img")
path = request.json.pop("path")
@@ -499,7 +499,7 @@ class QEMUHandler:
return
if "extend" in request.json:
yield from Qemu.instance().resize_disk(qemu_img, path, request.json.pop("extend"))
await Qemu.instance().resize_disk(qemu_img, path, request.json.pop("extend"))
response.set_status(201)
@Route.get(
@@ -509,10 +509,10 @@ class QEMUHandler:
},
description="Retrieve the list of Qemu images",
output=NODE_LIST_IMAGES_SCHEMA)
def list_qemu_images(request, response):
async def list_qemu_images(request, response):
qemu_manager = Qemu.instance()
images = yield from qemu_manager.list_images()
images = await qemu_manager.list_images()
response.set_status(200)
response.json(images)
@@ -526,10 +526,10 @@ class QEMUHandler:
},
raw=True,
description="Upload Qemu image")
def upload_image(request, response):
async def upload_image(request, response):
qemu_manager = Qemu.instance()
yield from qemu_manager.write_image(request.match_info["filename"], request.content)
await qemu_manager.write_image(request.match_info["filename"], request.content)
response.set_status(204)
@Route.get(
@@ -542,7 +542,7 @@ class QEMUHandler:
},
raw=True,
description="Download Qemu image")
def download_image(request, response):
async def download_image(request, response):
filename = request.match_info["filename"]
qemu_manager = Qemu.instance()
@@ -552,4 +552,4 @@ class QEMUHandler:
if filename[0] == ".":
raise aiohttp.web.HTTPForbidden()
yield from response.file(image_path)
await response.file(image_path)
@@ -48,10 +48,10 @@ class TraceNGHandler:
description="Create a new TraceNG instance",
input=TRACENG_CREATE_SCHEMA,
output=TRACENG_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
traceng = TraceNG.instance()
vm = yield from traceng.create_node(request.json["name"],
vm = await traceng.create_node(request.json["name"],
request.match_info["project_id"],
request.json.get("node_id"),
console=request.json.get("console"))
@@ -116,9 +116,9 @@ class TraceNGHandler:
404: "Instance doesn't exist"
},
description="Delete a TraceNG instance")
def delete(request, response):
async def delete(request, response):
yield from TraceNG.instance().delete_node(request.match_info["node_id"])
await TraceNG.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -132,9 +132,9 @@ class TraceNGHandler:
404: "Instance doesn't exist"
},
description="Duplicate a TraceNG instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from TraceNG.instance().duplicate_node(
new_node = await TraceNG.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -155,11 +155,11 @@ class TraceNGHandler:
description="Start a TraceNG instance",
input=TRACENG_START_SCHEMA,
output=TRACENG_OBJECT_SCHEMA)
def start(request, response):
async def start(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.start(request.get("destination"))
await vm.start(request.get("destination"))
response.json(vm)
@Route.post(
@@ -174,11 +174,11 @@ class TraceNGHandler:
404: "Instance doesn't exist"
},
description="Stop a TraceNG instance")
def stop(request, response):
async def stop(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -211,11 +211,11 @@ class TraceNGHandler:
404: "Instance doesn't exist"
},
description="Reload a TraceNG instance")
def reload(request, response):
async def reload(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -234,7 +234,7 @@ class TraceNGHandler:
description="Add a NIO to a TraceNG instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -242,7 +242,7 @@ class TraceNGHandler:
if nio_type not in ("nio_udp"):
raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = traceng_manager.create_nio(request.json)
yield from vm.port_add_nio_binding(int(request.match_info["port_number"]), nio)
await vm.port_add_nio_binding(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -262,14 +262,14 @@ class TraceNGHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a TraceNG instance")
def update_nio(request, response):
async def update_nio(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = vm.ethernet_adapter.get_nio(int(request.match_info["port_number"]))
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from vm.port_update_nio_binding(int(request.match_info["port_number"]), nio)
await vm.port_update_nio_binding(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -287,11 +287,11 @@ class TraceNGHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a TraceNG instance")
def delete_nio(request, response):
async def delete_nio(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.port_remove_nio_binding(int(request.match_info["port_number"]))
await vm.port_remove_nio_binding(int(request.match_info["port_number"]))
response.set_status(204)
@Route.post(
@@ -309,13 +309,13 @@ class TraceNGHandler:
},
description="Start a packet capture on a TraceNG instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(port_number, pcap_file_path)
await vm.start_capture(port_number, pcap_file_path)
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -332,10 +332,10 @@ class TraceNGHandler:
404: "Instance doesn't exist",
},
description="Stop a packet capture on a TraceNG instance")
def stop_capture(request, response):
async def stop_capture(request, response):
traceng_manager = TraceNG.instance()
vm = traceng_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from vm.stop_capture(port_number)
await vm.stop_capture(port_number)
response.set_status(204)
@@ -50,10 +50,10 @@ class VirtualBoxHandler:
description="Create a new VirtualBox VM instance",
input=VBOX_CREATE_SCHEMA,
output=VBOX_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
vbox_manager = VirtualBox.instance()
vm = yield from vbox_manager.create_node(request.json.pop("name"),
vm = await vbox_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
request.json.pop("vmname"),
@@ -65,7 +65,7 @@ class VirtualBoxHandler:
if "ram" in request.json:
ram = request.json.pop("ram")
if ram != vm.ram:
yield from vm.set_ram(ram)
await vm.set_ram(ram)
for name, value in request.json.items():
if name != "node_id":
@@ -109,7 +109,7 @@ class VirtualBoxHandler:
description="Update a VirtualBox VM instance",
input=VBOX_OBJECT_SCHEMA,
output=VBOX_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -122,7 +122,7 @@ class VirtualBoxHandler:
vm.name = name
if vm.linked_clone:
try:
yield from vm.set_vmname(vm.name)
await vm.set_vmname(vm.name)
except VirtualBoxError as e: # In case of error we rollback (we can't change the name when running)
vm.name = oldname
vm.updated()
@@ -131,12 +131,12 @@ class VirtualBoxHandler:
if "adapters" in request.json:
adapters = int(request.json.pop("adapters"))
if adapters != vm.adapters:
yield from vm.set_adapters(adapters)
await vm.set_adapters(adapters)
if "ram" in request.json:
ram = request.json.pop("ram")
if ram != vm.ram:
yield from vm.set_ram(ram)
await vm.set_ram(ram)
# update the console first to avoid issue if updating console type
vm.console = request.json.pop("console", vm.console)
@@ -160,11 +160,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Delete a VirtualBox VM instance")
def delete(request, response):
async def delete(request, response):
# check the project_id exists
ProjectManager.instance().get_project(request.match_info["project_id"])
yield from VirtualBox.instance().delete_node(request.match_info["node_id"])
await VirtualBox.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -179,15 +179,15 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Start a VirtualBox VM instance")
def start(request, response):
async def start(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
if (yield from vm.check_hw_virtualization()):
if (await vm.check_hw_virtualization()):
pm = ProjectManager.instance()
if pm.check_hardware_virtualization(vm) is False:
raise HTTPConflict(text="Cannot start VM because hardware virtualization (VT-x/AMD-V) is already used by another software like VMware or KVM (on Linux)")
yield from vm.start()
await vm.start()
response.set_status(204)
@Route.post(
@@ -202,11 +202,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Stop a VirtualBox VM instance")
def stop(request, response):
async def stop(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -221,11 +221,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Suspend a VirtualBox VM instance")
def suspend(request, response):
async def suspend(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.suspend()
await vm.suspend()
response.set_status(204)
@Route.post(
@@ -240,11 +240,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Resume a suspended VirtualBox VM instance")
def resume(request, response):
async def resume(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.resume()
await vm.resume()
response.set_status(204)
@Route.post(
@@ -259,11 +259,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Reload a VirtualBox VM instance")
def reload(request, response):
async def reload(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -282,7 +282,7 @@ class VirtualBoxHandler:
description="Add a NIO to a VirtualBox VM instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -290,7 +290,7 @@ class VirtualBoxHandler:
if nio_type not in ("nio_udp", "nio_nat"):
raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = vbox_manager.create_nio(request.json)
yield from vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -310,7 +310,7 @@ class VirtualBoxHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Virtualbox instance")
def update_nio(request, response):
async def update_nio(request, response):
virtualbox_manager = VirtualBox.instance()
vm = virtualbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -319,7 +319,7 @@ class VirtualBoxHandler:
nio.filters = request.json["filters"]
if "suspend" in request.json and nio:
nio.suspend = request.json["suspend"]
yield from vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -337,11 +337,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a VirtualBox VM instance")
def delete_nio(request, response):
async def delete_nio(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
await vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
response.set_status(204)
@Route.post(
@@ -359,13 +359,13 @@ class VirtualBoxHandler:
},
description="Start a packet capture on a VirtualBox VM instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(adapter_number, pcap_file_path)
await vm.start_capture(adapter_number, pcap_file_path)
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -382,11 +382,11 @@ class VirtualBoxHandler:
404: "Instance doesn't exist"
},
description="Stop a packet capture on a VirtualBox VM instance")
def stop_capture(request, response):
async def stop_capture(request, response):
vbox_manager = VirtualBox.instance()
vm = vbox_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
vm.stop_capture(int(request.match_info["adapter_number"]))
await vm.stop_capture(int(request.match_info["adapter_number"]))
response.set_status(204)
@Route.get(
@@ -395,7 +395,7 @@ class VirtualBoxHandler:
200: "Success",
},
description="Get all available VirtualBox VMs")
def get_vms(request, response):
async def get_vms(request, response):
vbox_manager = VirtualBox.instance()
vms = yield from vbox_manager.list_vms()
vms = await vbox_manager.list_vms()
response.json(vms)
@@ -49,10 +49,10 @@ class VMwareHandler:
description="Create a new VMware VM instance",
input=VMWARE_CREATE_SCHEMA,
output=VMWARE_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
vmware_manager = VMware.instance()
vm = yield from vmware_manager.create_node(request.json.pop("name"),
vm = await vmware_manager.create_node(request.json.pop("name"),
request.match_info["project_id"],
request.json.get("node_id"),
request.json.pop("vmx_path"),
@@ -127,11 +127,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Delete a VMware VM instance")
def delete(request, response):
async def delete(request, response):
# check the project_id exists
ProjectManager.instance().get_project(request.match_info["project_id"])
yield from VMware.instance().delete_node(request.match_info["node_id"])
await VMware.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -146,7 +146,7 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Start a VMware VM instance")
def start(request, response):
async def start(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -154,7 +154,7 @@ class VMwareHandler:
pm = ProjectManager.instance()
if pm.check_hardware_virtualization(vm) is False:
raise HTTPConflict(text="Cannot start VM because hardware virtualization (VT-x/AMD-V) is already used by another software like VirtualBox or KVM (on Linux)")
yield from vm.start()
await vm.start()
response.set_status(204)
@Route.post(
@@ -169,11 +169,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Stop a VMware VM instance")
def stop(request, response):
async def stop(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -188,11 +188,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Suspend a VMware VM instance")
def suspend(request, response):
async def suspend(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.suspend()
await vm.suspend()
response.set_status(204)
@Route.post(
@@ -207,11 +207,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Resume a suspended VMware VM instance")
def resume(request, response):
async def resume(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.resume()
await vm.resume()
response.set_status(204)
@Route.post(
@@ -226,11 +226,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Reload a VMware VM instance")
def reload(request, response):
async def reload(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -249,7 +249,7 @@ class VMwareHandler:
description="Add a NIO to a VMware VM instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -257,7 +257,7 @@ class VMwareHandler:
if nio_type not in ("nio_udp", "nio_vmnet", "nio_nat", "nio_tap"):
raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = vmware_manager.create_nio(request.json)
yield from vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_add_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -277,14 +277,14 @@ class VMwareHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Virtualbox instance")
def update_nio(request, response):
async def update_nio(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = vm.ethernet_adapters[int(request.match_info["adapter_number"])]
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
await vm.adapter_update_nio_binding(int(request.match_info["adapter_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -302,11 +302,11 @@ class VMwareHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a VMware VM instance")
def delete_nio(request, response):
async def delete_nio(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
await vm.adapter_remove_nio_binding(int(request.match_info["adapter_number"]))
response.set_status(204)
@Route.post(
@@ -324,13 +324,13 @@ class VMwareHandler:
},
description="Start a packet capture on a VMware VM instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(adapter_number, pcap_file_path)
await vm.start_capture(adapter_number, pcap_file_path)
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -347,12 +347,12 @@ class VMwareHandler:
404: "Instance doesn't exist",
},
description="Stop a packet capture on a VMware VM instance")
def stop_capture(request, response):
async def stop_capture(request, response):
vmware_manager = VMware.instance()
vm = vmware_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
adapter_number = int(request.match_info["adapter_number"])
yield from vm.stop_capture(adapter_number)
await vm.stop_capture(adapter_number)
response.set_status(204)
@Route.post(
@@ -381,7 +381,7 @@ class VMwareHandler:
200: "Success",
},
description="Get all VMware VMs available")
def get_vms(request, response):
async def get_vms(request, response):
vmware_manager = VMware.instance()
vms = yield from vmware_manager.list_vms()
vms = await vmware_manager.list_vms()
response.json(vms)
+22 -22
View File
@@ -47,10 +47,10 @@ class VPCSHandler:
description="Create a new VPCS instance",
input=VPCS_CREATE_SCHEMA,
output=VPCS_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
vpcs = VPCS.instance()
vm = yield from vpcs.create_node(request.json["name"],
vm = await vpcs.create_node(request.json["name"],
request.match_info["project_id"],
request.json.get("node_id"),
console=request.json.get("console"),
@@ -115,9 +115,9 @@ class VPCSHandler:
404: "Instance doesn't exist"
},
description="Delete a VPCS instance")
def delete(request, response):
async def delete(request, response):
yield from VPCS.instance().delete_node(request.match_info["node_id"])
await VPCS.instance().delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.post(
@@ -131,9 +131,9 @@ class VPCSHandler:
404: "Instance doesn't exist"
},
description="Duplicate a VPCS instance")
def duplicate(request, response):
async def duplicate(request, response):
new_node = yield from VPCS.instance().duplicate_node(
new_node = await VPCS.instance().duplicate_node(
request.match_info["node_id"],
request.json["destination_node_id"]
)
@@ -153,11 +153,11 @@ class VPCSHandler:
},
description="Start a VPCS instance",
output=VPCS_OBJECT_SCHEMA)
def start(request, response):
async def start(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.start()
await vm.start()
response.json(vm)
@Route.post(
@@ -172,11 +172,11 @@ class VPCSHandler:
404: "Instance doesn't exist"
},
description="Stop a VPCS instance")
def stop(request, response):
async def stop(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.stop()
await vm.stop()
response.set_status(204)
@Route.post(
@@ -209,11 +209,11 @@ class VPCSHandler:
404: "Instance doesn't exist"
},
description="Reload a VPCS instance")
def reload(request, response):
async def reload(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.reload()
await vm.reload()
response.set_status(204)
@Route.post(
@@ -232,7 +232,7 @@ class VPCSHandler:
description="Add a NIO to a VPCS instance",
input=NIO_SCHEMA,
output=NIO_SCHEMA)
def create_nio(request, response):
async def create_nio(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
@@ -240,7 +240,7 @@ class VPCSHandler:
if nio_type not in ("nio_udp", "nio_tap"):
raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type))
nio = vpcs_manager.create_nio(request.json)
yield from vm.port_add_nio_binding(int(request.match_info["port_number"]), nio)
await vm.port_add_nio_binding(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(nio)
@@ -260,14 +260,14 @@ class VPCSHandler:
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a VPCS instance")
def update_nio(request, response):
async def update_nio(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = vm.ethernet_adapter.get_nio(int(request.match_info["port_number"]))
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from vm.port_update_nio_binding(int(request.match_info["port_number"]), nio)
await vm.port_update_nio_binding(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@@ -285,11 +285,11 @@ class VPCSHandler:
404: "Instance doesn't exist"
},
description="Remove a NIO from a VPCS instance")
def delete_nio(request, response):
async def delete_nio(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
yield from vm.port_remove_nio_binding(int(request.match_info["port_number"]))
await vm.port_remove_nio_binding(int(request.match_info["port_number"]))
response.set_status(204)
@Route.post(
@@ -307,13 +307,13 @@ class VPCSHandler:
},
description="Start a packet capture on a VPCS instance",
input=NODE_CAPTURE_SCHEMA)
def start_capture(request, response):
async def start_capture(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"])
yield from vm.start_capture(port_number, pcap_file_path)
await vm.start_capture(port_number, pcap_file_path)
response.json({"pcap_file_path": pcap_file_path})
@Route.post(
@@ -330,10 +330,10 @@ class VPCSHandler:
404: "Instance doesn't exist",
},
description="Stop a packet capture on a VPCS instance")
def stop_capture(request, response):
async def stop_capture(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
port_number = int(request.match_info["port_number"])
yield from vm.stop_capture(port_number)
await vm.stop_capture(port_number)
response.set_status(204)
@@ -34,11 +34,11 @@ class ApplianceHandler:
status_codes={
200: "Appliance template list returned"
})
def list_templates(request, response):
async def list_templates(request, response):
controller = Controller.instance()
if request.query.get("update", "no") == "yes":
yield from controller.download_appliance_templates()
await controller.download_appliance_templates()
controller.load_appliance_templates()
response.json([c for c in controller.appliance_templates.values()])
@@ -66,11 +66,11 @@ class ApplianceHandler:
},
input=APPLIANCE_USAGE_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def create_node_from_appliance(request, response):
async def create_node_from_appliance(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.add_node_from_appliance(request.match_info["appliance_id"],
await project.add_node_from_appliance(request.match_info["appliance_id"],
x=request.json["x"],
y=request.json["y"],
compute_id=request.json.get("compute_id"))
@@ -41,9 +41,9 @@ class ComputeHandler:
},
input=COMPUTE_CREATE_SCHEMA,
output=COMPUTE_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
compute = yield from Controller.instance().add_compute(**request.json)
compute = await Controller.instance().add_compute(**request.json)
response.set_status(201)
response.json(compute)
@@ -68,14 +68,14 @@ class ComputeHandler:
},
input=COMPUTE_UPDATE_SCHEMA,
output=COMPUTE_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.match_info["compute_id"])
# Ignore these because we only use them when creating a node
request.json.pop("compute_id", None)
yield from compute.update(**request.json)
await compute.update(**request.json)
response.set_status(200)
response.json(compute)
@@ -89,10 +89,10 @@ class ComputeHandler:
404: "Instance doesn't exist"
},
description="Return the list of images available on compute and controller for this emulator type")
def images(request, response):
async def images(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.match_info["compute_id"])
res = yield from compute.images(request.match_info["emulator"])
res = await compute.images(request.match_info["emulator"])
response.json(res)
@Route.get(
@@ -133,10 +133,10 @@ class ComputeHandler:
404: "Instance doesn't exist"
},
description="Forward call specific to compute node. Read the full compute API for available actions")
def get_forward(request, response):
async def get_forward(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.match_info["compute_id"])
res = yield from compute.forward("GET", request.match_info["emulator"], request.match_info["action"])
res = await compute.forward("GET", request.match_info["emulator"], request.match_info["action"])
response.json(res)
@Route.post(
@@ -150,10 +150,10 @@ class ComputeHandler:
},
raw=True,
description="Forward call specific to compute node. Read the full compute API for available actions")
def post_forward(request, response):
async def post_forward(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.match_info["compute_id"])
res = yield from compute.forward("POST", request.match_info["emulator"], request.match_info["action"], data=request.content)
res = await compute.forward("POST", request.match_info["emulator"], request.match_info["action"], data=request.content)
response.json(res)
@Route.put(
@@ -167,10 +167,10 @@ class ComputeHandler:
},
raw=True,
description="Forward call specific to compute node. Read the full compute API for available actions")
def put_forward(request, response):
async def put_forward(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.match_info["compute_id"])
res = yield from compute.forward("PUT", request.match_info["emulator"], request.match_info["action"], data=request.content)
res = await compute.forward("PUT", request.match_info["emulator"], request.match_info["action"], data=request.content)
response.json(res)
@Route.get(
@@ -197,9 +197,9 @@ class ComputeHandler:
404: "Instance doesn't exist"
},
description="Delete a compute instance")
def delete(request, response):
async def delete(request, response):
controller = Controller.instance()
yield from controller.delete_compute(request.match_info["compute_id"])
await controller.delete_compute(request.match_info["compute_id"])
response.set_status(204)
@Route.post(
@@ -211,9 +211,9 @@ class ComputeHandler:
200: "Idle PC computed",
},
description="Compute IDLE PC value")
def autoidlepc(request, response):
async def autoidlepc(request, response):
controller = Controller.instance()
res = yield from controller.autoidlepc(request.match_info["compute_id"], request.json["platform"], request.json["image"], request.json["ram"])
res = await controller.autoidlepc(request.match_info["compute_id"], request.json["platform"], request.json["image"], request.json["ram"])
response.json(res)
@Route.get(
@@ -226,8 +226,8 @@ class ComputeHandler:
},
description="Get ports used by a compute",
output=COMPUTE_PORTS_OBJECT_SCHEMA)
def ports(request, response):
async def ports(request, response):
controller = Controller.instance()
res = yield from controller.compute_ports(request.match_info["compute_id"])
res = await controller.compute_ports(request.match_info["compute_id"])
response.json(res)
@@ -37,9 +37,9 @@ class DrawingHandler:
200: "List of drawings returned",
},
description="List drawings of a project")
def list_drawings(request, response):
async def list_drawings(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
response.json([v for v in project.drawings.values()])
@Route.post(
@@ -54,10 +54,10 @@ class DrawingHandler:
description="Create a new drawing instance",
input=DRAWING_OBJECT_SCHEMA,
output=DRAWING_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
drawing = yield from project.add_drawing(**request.json)
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
drawing = await project.add_drawing(**request.json)
response.set_status(201)
response.json(drawing)
@@ -74,9 +74,9 @@ class DrawingHandler:
},
description="Get a drawing instance",
output=DRAWING_OBJECT_SCHEMA)
def get_drawing(request, response):
async def get_drawing(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
drawing = project.get_drawing(request.match_info["drawing_id"])
response.set_status(200)
response.json(drawing)
@@ -94,11 +94,11 @@ class DrawingHandler:
description="Update a drawing instance",
input=DRAWING_OBJECT_SCHEMA,
output=DRAWING_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
drawing = project.get_drawing(request.match_info["drawing_id"])
yield from drawing.update(**request.json)
await drawing.update(**request.json)
response.set_status(201)
response.json(drawing)
@@ -113,8 +113,8 @@ class DrawingHandler:
400: "Invalid request"
},
description="Delete a drawing instance")
def delete(request, response):
async def delete(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.delete_drawing(request.match_info["drawing_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.delete_drawing(request.match_info["drawing_id"])
response.set_status(204)
@@ -49,9 +49,9 @@ class GNS3VMHandler:
400: "Invalid request",
},
description="Get all the available VMs for a specific virtualization engine")
def get_vms(request, response):
async def get_vms(request, response):
vms = yield from Controller.instance().gns3vm.list(request.match_info["engine"])
vms = await Controller.instance().gns3vm.list(request.match_info["engine"])
response.json(vms)
@Route.get(
@@ -72,9 +72,9 @@ class GNS3VMHandler:
status_codes={
201: "GNS3 VM updated"
})
def update(request, response):
async def update(request, response):
gns3_vm = Controller().instance().gns3vm
yield from gns3_vm.update_settings(request.json)
await gns3_vm.update_settings(request.json)
response.json(gns3_vm)
response.set_status(201)
@@ -42,9 +42,9 @@ class LinkHandler:
200: "List of links returned",
},
description="List links of a project")
def list_links(request, response):
async def list_links(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
response.json([v for v in project.links.values()])
@Route.post(
@@ -59,22 +59,22 @@ class LinkHandler:
description="Create a new link instance",
input=LINK_OBJECT_SCHEMA,
output=LINK_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
link = yield from project.add_link()
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = await project.add_link()
if "filters" in request.json:
yield from link.update_filters(request.json["filters"])
await link.update_filters(request.json["filters"])
if "suspend" in request.json:
yield from link.update_suspend(request.json["suspend"])
await link.update_suspend(request.json["suspend"])
try:
for node in request.json["nodes"]:
yield from link.add_node(project.get_node(node["node_id"]),
await link.add_node(project.get_node(node["node_id"]),
node.get("adapter_number", 0),
node.get("port_number", 0),
label=node.get("label"))
except aiohttp.web.HTTPException as e:
yield from project.delete_link(link.id)
await project.delete_link(link.id)
raise e
response.set_status(201)
response.json(link)
@@ -90,9 +90,9 @@ class LinkHandler:
400: "Invalid request"
},
description="Return the list of filters available for this link")
def list_filters(request, response):
async def list_filters(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
response.set_status(200)
response.json(link.available_filters())
@@ -110,9 +110,9 @@ class LinkHandler:
},
description="Get a link instance",
output=LINK_OBJECT_SCHEMA)
def get_link(request, response):
async def get_link(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
response.set_status(200)
response.json(link)
@@ -130,16 +130,16 @@ class LinkHandler:
description="Update a link instance",
input=LINK_OBJECT_SCHEMA,
output=LINK_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
if "filters" in request.json:
yield from link.update_filters(request.json["filters"])
await link.update_filters(request.json["filters"])
if "suspend" in request.json:
yield from link.update_suspend(request.json["suspend"])
await link.update_suspend(request.json["suspend"])
if "nodes" in request.json:
yield from link.update_nodes(request.json["nodes"])
await link.update_nodes(request.json["nodes"])
response.set_status(201)
response.json(link)
@@ -156,11 +156,11 @@ class LinkHandler:
input=LINK_CAPTURE_SCHEMA,
output=LINK_OBJECT_SCHEMA,
description="Start capture on a link instance. By default we consider it as an Ethernet link")
def start_capture(request, response):
async def start_capture(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
yield from link.start_capture(data_link_type=request.json.get("data_link_type", "DLT_EN10MB"), capture_file_name=request.json.get("capture_file_name"))
await link.start_capture(data_link_type=request.json.get("data_link_type", "DLT_EN10MB"), capture_file_name=request.json.get("capture_file_name"))
response.set_status(201)
response.json(link)
@@ -175,11 +175,11 @@ class LinkHandler:
400: "Invalid request"
},
description="Stop capture on a link instance")
def stop_capture(request, response):
async def stop_capture(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
yield from link.stop_capture()
await link.stop_capture()
response.set_status(201)
response.json(link)
@@ -194,10 +194,10 @@ class LinkHandler:
400: "Invalid request"
},
description="Delete a link instance")
def delete(request, response):
async def delete(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.delete_link(request.match_info["link_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.delete_link(request.match_info["link_id"])
response.set_status(204)
@Route.get(
@@ -212,16 +212,16 @@ class LinkHandler:
403: "Permission denied",
404: "The file doesn't exist"
})
def pcap(request, response):
async def pcap(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
while link.capture_file_path is None:
raise aiohttp.web.HTTPNotFound(text="pcap file not found")
while not os.path.isfile(link.capture_file_path):
yield from asyncio.sleep(0.5)
await asyncio.sleep(0.5)
try:
with open(link.capture_file_path, "rb") as f:
@@ -229,12 +229,12 @@ class LinkHandler:
response.content_type = "application/vnd.tcpdump.pcap"
response.set_status(200)
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
while True:
chunk = f.read(4096)
if not chunk:
yield from asyncio.sleep(0.1)
yield from response.write(chunk)
await asyncio.sleep(0.1)
await response.write(chunk)
except OSError:
raise aiohttp.web.HTTPNotFound(text="pcap file {} not found or not accessible".format(link.capture_file_path))
@@ -46,12 +46,12 @@ class NodeHandler:
description="Create a new node instance",
input=NODE_CREATE_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def create(request, response):
async def create(request, response):
controller = Controller.instance()
compute = controller.get_compute(request.json.pop("compute_id"))
project = yield from controller.get_loaded_project(request.match_info["project_id"])
node = yield from project.add_node(compute, request.json.pop("name"), request.json.pop("node_id", None), **request.json)
project = await controller.get_loaded_project(request.match_info["project_id"])
node = await project.add_node(compute, request.json.pop("name"), request.json.pop("node_id", None), **request.json)
response.set_status(201)
response.json(node)
@@ -79,9 +79,9 @@ class NodeHandler:
200: "List of nodes returned",
},
description="List nodes of a project")
def list_nodes(request, response):
async def list_nodes(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
response.json([v for v in project.nodes.values()])
@Route.put(
@@ -94,8 +94,8 @@ class NodeHandler:
description="Update a node instance",
input=NODE_UPDATE_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def update(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
async def update(request, response):
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
# Ignore these because we only use them when creating a node
@@ -103,7 +103,7 @@ class NodeHandler:
request.json.pop("node_type", None)
request.json.pop("compute_id", None)
yield from node.update(**request.json)
await node.update(**request.json)
response.set_status(200)
response.json(node)
@@ -119,10 +119,10 @@ class NodeHandler:
},
description="Start all nodes belonging to the project",
output=NODE_OBJECT_SCHEMA)
def start_all(request, response):
async def start_all(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.start_all()
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.start_all()
response.set_status(204)
@Route.post(
@@ -137,10 +137,10 @@ class NodeHandler:
},
description="Stop all nodes belonging to the project",
output=NODE_OBJECT_SCHEMA)
def stop_all(request, response):
async def stop_all(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.stop_all()
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.stop_all()
response.set_status(204)
@Route.post(
@@ -155,10 +155,10 @@ class NodeHandler:
},
description="Suspend all nodes belonging to the project",
output=NODE_OBJECT_SCHEMA)
def suspend_all(request, response):
async def suspend_all(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.suspend_all()
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.suspend_all()
response.set_status(204)
@Route.post(
@@ -173,11 +173,11 @@ class NodeHandler:
},
description="Reload all nodes belonging to the project",
output=NODE_OBJECT_SCHEMA)
def reload_all(request, response):
async def reload_all(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.stop_all()
yield from project.start_all()
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.stop_all()
await project.start_all()
response.set_status(204)
@Route.post(
@@ -194,11 +194,11 @@ class NodeHandler:
description="Duplicate a node instance",
input=NODE_DUPLICATE_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def duplicate(request, response):
async def duplicate(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
new_node = yield from project.duplicate_node(
new_node = await project.duplicate_node(
node,
request.json["x"],
request.json["y"],
@@ -219,11 +219,11 @@ class NodeHandler:
},
description="Start a node instance",
output=NODE_OBJECT_SCHEMA)
def start(request, response):
async def start(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.start(data=request.json)
await node.start(data=request.json)
response.json(node)
response.set_status(200)
@@ -240,11 +240,11 @@ class NodeHandler:
},
description="Stop a node instance",
output=NODE_OBJECT_SCHEMA)
def stop(request, response):
async def stop(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.stop()
await node.stop()
response.json(node)
response.set_status(200)
@@ -261,11 +261,11 @@ class NodeHandler:
},
description="Suspend a node instance",
output=NODE_OBJECT_SCHEMA)
def suspend(request, response):
async def suspend(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.suspend()
await node.suspend()
response.json(node)
response.set_status(200)
@@ -282,11 +282,11 @@ class NodeHandler:
},
description="Reload a node instance",
output=NODE_OBJECT_SCHEMA)
def reload(request, response):
async def reload(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
#yield from node.reload()
#await node.reload()
response.json(node)
response.set_status(200)
@@ -302,9 +302,9 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Delete a node instance")
def delete(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
yield from project.delete_node(request.match_info["node_id"])
async def delete(request, response):
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
await project.delete_node(request.match_info["node_id"])
response.set_status(204)
@Route.get(
@@ -319,9 +319,9 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Return all the links connected to this node")
def links(request, response):
async def links(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
links = []
for link in node.links:
@@ -341,11 +341,11 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Compute the IDLE PC for a Dynamips node")
def auto_idlepc(request, response):
async def auto_idlepc(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
idle = yield from node.dynamips_auto_idlepc()
idle = await node.dynamips_auto_idlepc()
response.json(idle)
response.set_status(200)
@@ -361,11 +361,11 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Compute a list of potential idle PC for a node")
def idlepc_proposals(request, response):
async def idlepc_proposals(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
idle = yield from node.dynamips_idlepc_proposals()
idle = await node.dynamips_idlepc_proposals()
response.json(idle)
response.set_status(200)
@@ -381,11 +381,11 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Reload a node instance")
def resize_disk(request, response):
async def resize_disk(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.post("/resize_disk", request.json)
await node.post("/resize_disk", request.json)
response.set_status(201)
@Route.get(
@@ -400,9 +400,9 @@ class NodeHandler:
404: "Instance doesn't exist"
},
description="Get a file in the node directory")
def get_file(request, response):
async def get_file(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
path = request.match_info["path"]
path = force_unix_path(path)
@@ -415,14 +415,14 @@ class NodeHandler:
node_type = node.node_type
path = "/project-files/{}/{}/{}".format(node_type, node.id, path)
res = yield from node.compute.http_query("GET", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), timeout=None, raw=True)
res = await node.compute.http_query("GET", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), timeout=None, raw=True)
response.set_status(200)
response.content_type = "application/octet-stream"
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
response.write(res.body)
yield from response.write_eof()
await response.write_eof()
@Route.post(
r"/projects/{project_id}/nodes/{node_id}/files/{path:.+}",
@@ -437,9 +437,9 @@ class NodeHandler:
},
raw=True,
description="Write a file in the node directory")
def post_file(request, response):
async def post_file(request, response):
project = yield from Controller.instance().get_loaded_project(request.match_info["project_id"])
project = await Controller.instance().get_loaded_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
path = request.match_info["path"]
path = force_unix_path(path)
@@ -450,6 +450,6 @@ class NodeHandler:
node_type = node.node_type
path = "/project-files/{}/{}/{}".format(node_type, node.id, path)
data = yield from request.content.read() #FIXME: are we handling timeout or large files correctly?
yield from node.compute.http_query("POST", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), data=data, timeout=None, raw=True)
data = await request.content.read() #FIXME: are we handling timeout or large files correctly?
await node.compute.http_query("POST", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), data=data, timeout=None, raw=True)
response.set_status(201)
@@ -20,16 +20,14 @@ import aiohttp
from aiohttp.web import WebSocketResponse
from gns3server.web.route import Route
from gns3server.controller import Controller
from gns3server.utils.asyncio import asyncio_ensure_future
@asyncio.coroutine
def process_websocket(ws):
async def process_websocket(ws):
"""
Process ping / pong and close message
"""
try:
yield from ws.receive()
await ws.receive()
except aiohttp.WSServerHandshakeError:
pass
@@ -42,22 +40,22 @@ class NotificationHandler:
status_codes={
200: "End of stream"
})
def notification(request, response):
async def notification(request, response):
controller = Controller.instance()
response.content_type = "application/json"
response.set_status(200)
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
with controller.notification.controller_queue() as queue:
while True:
try:
msg = yield from queue.get_json(5)
msg = await queue.get_json(5)
response.write(("{}\n".format(msg)).encode("utf-8"))
except asyncio.futures.CancelledError:
break
yield from response.drain()
await response.drain()
@Route.get(
r"/notifications/ws",
@@ -65,17 +63,17 @@ class NotificationHandler:
status_codes={
200: "End of stream"
})
def notification_ws(request, response):
async def notification_ws(request, response):
controller = Controller.instance()
ws = aiohttp.web.WebSocketResponse()
yield from ws.prepare(request)
await ws.prepare(request)
asyncio_ensure_future(process_websocket(ws))
asyncio.ensure_future(process_websocket(ws))
with controller.notification.controller_queue() as queue:
while True:
try:
notification = yield from queue.get_json(5)
notification = await queue.get_json(5)
except asyncio.futures.CancelledError:
break
if ws.closed:
@@ -26,7 +26,6 @@ from gns3server.controller import Controller
from gns3server.controller.import_project import import_project
from gns3server.controller.export_project import export_project
from gns3server.config import Config
from gns3server.utils.asyncio import asyncio_ensure_future
from gns3server.schemas.project import (
@@ -40,13 +39,12 @@ import logging
log = logging.getLogger()
@asyncio.coroutine
def process_websocket(ws):
async def process_websocket(ws):
"""
Process ping / pong and close message
"""
try:
yield from ws.receive()
await ws.receive()
except aiohttp.WSServerHandshakeError:
pass
@@ -62,10 +60,10 @@ class ProjectHandler:
},
output=PROJECT_OBJECT_SCHEMA,
input=PROJECT_CREATE_SCHEMA)
def create_project(request, response):
async def create_project(request, response):
controller = Controller.instance()
project = yield from controller.add_project(**request.json)
project = await controller.add_project(**request.json)
response.set_status(201)
response.json(project)
@@ -119,13 +117,13 @@ class ProjectHandler:
description="Update a project instance",
input=PROJECT_UPDATE_SCHEMA,
output=PROJECT_OBJECT_SCHEMA)
def update(request, response):
async def update(request, response):
project = Controller.instance().get_project(request.match_info["project_id"])
# Ignore these because we only use them when creating a project
request.json.pop("project_id", None)
yield from project.update(**request.json)
await project.update(**request.json)
response.set_status(200)
response.json(project)
@@ -140,11 +138,11 @@ class ProjectHandler:
404: "The project doesn't exist"
},
output=PROJECT_OBJECT_SCHEMA)
def close(request, response):
async def close(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.close()
await project.close()
response.set_status(201)
response.json(project)
@@ -159,11 +157,11 @@ class ProjectHandler:
404: "The project doesn't exist"
},
output=PROJECT_OBJECT_SCHEMA)
def open(request, response):
async def open(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.open()
await project.open()
response.set_status(201)
response.json(project)
@@ -179,7 +177,7 @@ class ProjectHandler:
},
input=PROJECT_LOAD_SCHEMA,
output=PROJECT_OBJECT_SCHEMA)
def load(request, response):
async def load(request, response):
controller = Controller.instance()
config = Config.instance()
@@ -187,7 +185,7 @@ class ProjectHandler:
log.error("Can't load the project the server is not started with --local")
response.set_status(403)
return
project = yield from controller.load_project(request.json.get("path"),)
project = await controller.load_project(request.json.get("path"),)
response.set_status(201)
response.json(project)
@@ -201,11 +199,11 @@ class ProjectHandler:
204: "Changes have been written on disk",
404: "The project doesn't exist"
})
def delete(request, response):
async def delete(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.delete()
await project.delete()
controller.remove_project(project)
response.set_status(204)
@@ -219,7 +217,7 @@ class ProjectHandler:
200: "End of stream",
404: "The project doesn't exist"
})
def notification(request, response):
async def notification(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
@@ -228,22 +226,22 @@ class ProjectHandler:
response.set_status(200)
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
with controller.notification.project_queue(project) as queue:
while True:
try:
msg = yield from queue.get_json(5)
msg = await queue.get_json(5)
response.write(("{}\n".format(msg)).encode("utf-8"))
except asyncio.futures.CancelledError as e:
break
yield from response.drain()
await response.drain()
if project.auto_close:
# To avoid trouble with client connecting disconnecting we sleep few seconds before checking
# if someone else is not connected
yield from asyncio.sleep(5)
await asyncio.sleep(5)
if not controller.notification.project_has_listeners(project):
yield from project.close()
await project.close()
@Route.get(
r"/projects/{project_id}/notifications/ws",
@@ -255,20 +253,20 @@ class ProjectHandler:
200: "End of stream",
404: "The project doesn't exist"
})
def notification_ws(request, response):
async def notification_ws(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
ws = aiohttp.web.WebSocketResponse()
yield from ws.prepare(request)
await ws.prepare(request)
asyncio_ensure_future(process_websocket(ws))
asyncio.ensure_future(process_websocket(ws))
with controller.notification.project_queue(project) as queue:
while True:
try:
notification = yield from queue.get_json(5)
notification = await queue.get_json(5)
except asyncio.futures.CancelledError as e:
break
if ws.closed:
@@ -278,9 +276,9 @@ class ProjectHandler:
if project.auto_close:
# To avoid trouble with client connecting disconnecting we sleep few seconds before checking
# if someone else is not connected
yield from asyncio.sleep(5)
await asyncio.sleep(5)
if not controller.notification.project_has_listeners(project):
yield from project.close()
await project.close()
return ws
@@ -295,14 +293,14 @@ class ProjectHandler:
200: "File returned",
404: "The project doesn't exist"
})
def export_project(request, response):
async def export_project(request, response):
controller = Controller.instance()
project = yield from controller.get_loaded_project(request.match_info["project_id"])
project = await controller.get_loaded_project(request.match_info["project_id"])
try:
with tempfile.TemporaryDirectory() as tmp_dir:
stream = yield from export_project(project,
stream = await export_project(project,
tmp_dir,
include_images=bool(int(request.query.get("include_images", "0"))))
# We need to do that now because export could failed and raise an HTTP error
@@ -310,13 +308,13 @@ class ProjectHandler:
response.content_type = 'application/gns3project'
response.headers['CONTENT-DISPOSITION'] = 'attachment; filename="{}.gns3project"'.format(project.name)
response.enable_chunked_encoding()
yield from response.prepare(request)
await response.prepare(request)
for data in stream:
response.write(data)
yield from response.drain()
await response.drain()
yield from response.write_eof()
await response.write_eof()
# Will be raise if you have no space left or permission issue on your temporary directory
# RuntimeError: something was wrong during the zip process
except (ValueError, OSError, RuntimeError) as e:
@@ -334,7 +332,7 @@ class ProjectHandler:
200: "Project imported",
403: "Forbidden to import project"
})
def import_project(request, response):
async def import_project(request, response):
controller = Controller.instance()
@@ -355,19 +353,19 @@ class ProjectHandler:
if sys.version_info >= (3, 7) and sys.version_info < (3, 8):
with tempfile.TemporaryFile() as temp:
while True:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
if not chunk:
break
temp.write(chunk)
project = yield from import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
project = await import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
else:
with tempfile.SpooledTemporaryFile(max_size=10000) as temp:
while True:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
if not chunk:
break
temp.write(chunk)
project = yield from import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
project = await import_project(controller, request.match_info["project_id"], temp, location=path, name=name)
except OSError as e:
raise aiohttp.web.HTTPInternalServerError(text="Could not import the project: {}".format(e))
@@ -387,10 +385,10 @@ class ProjectHandler:
403: "The server is not the local server",
404: "The project doesn't exist"
})
def duplicate(request, response):
async def duplicate(request, response):
controller = Controller.instance()
project = yield from controller.get_loaded_project(request.match_info["project_id"])
project = await controller.get_loaded_project(request.match_info["project_id"])
if request.json.get("path"):
config = Config.instance()
@@ -401,7 +399,7 @@ class ProjectHandler:
else:
location = None
new_project = yield from project.duplicate(name=request.json.get("name"), location=location)
new_project = await project.duplicate(name=request.json.get("name"), location=location)
response.json(new_project)
response.set_status(201)
@@ -417,10 +415,10 @@ class ProjectHandler:
403: "Permission denied",
404: "The file doesn't exist"
})
def get_file(request, response):
async def get_file(request, response):
controller = Controller.instance()
project = yield from controller.get_loaded_project(request.match_info["project_id"])
project = await controller.get_loaded_project(request.match_info["project_id"])
path = request.match_info["path"]
path = os.path.normpath(path).strip('/')
@@ -435,12 +433,12 @@ class ProjectHandler:
try:
with open(path, "rb") as f:
yield from response.prepare(request)
await response.prepare(request)
while True:
data = f.read(4096)
if not data:
break
yield from response.write(data)
await response.write(data)
except FileNotFoundError:
raise aiohttp.web.HTTPNotFound()
@@ -459,10 +457,10 @@ class ProjectHandler:
403: "Permission denied",
404: "The path doesn't exist"
})
def write_file(request, response):
async def write_file(request, response):
controller = Controller.instance()
project = yield from controller.get_loaded_project(request.match_info["project_id"])
project = await controller.get_loaded_project(request.match_info["project_id"])
path = request.match_info["path"]
path = os.path.normpath(path).strip("/")
@@ -477,7 +475,7 @@ class ProjectHandler:
with open(path, 'wb+') as f:
while True:
try:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
except asyncio.TimeoutError:
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when writing to file '{}'".format(path))
if not chunk:
@@ -20,7 +20,6 @@ from gns3server.config import Config
from gns3server.controller import Controller
from gns3server.schemas.version import VERSION_SCHEMA
from gns3server.version import __version__
from gns3server.utils.asyncio import asyncio_ensure_future
from aiohttp.web import HTTPConflict, HTTPForbidden
@@ -44,7 +43,7 @@ class ServerHandler:
201: "Server is shutting down",
403: "Server shutdown refused"
})
def shutdown(request, response):
async def shutdown(request, response):
config = Config.instance()
if config.get_section_config("Server").getboolean("local", False) is False:
@@ -58,10 +57,10 @@ class ServerHandler:
tasks = []
for project in projects:
tasks.append(asyncio_ensure_future(project.close()))
tasks.append(asyncio.ensure_future(project.close()))
if tasks:
done, _ = yield from asyncio.wait(tasks)
done, _ = await asyncio.wait(tasks)
for future in done:
try:
future.result()
@@ -73,7 +72,7 @@ class ServerHandler:
from gns3server.web.web_server import WebServer
server = WebServer.instance()
try:
asyncio_ensure_future(server.shutdown_server())
asyncio.ensure_future(server.shutdown_server())
except asyncio.CancelledError:
pass
response.set_status(201)
@@ -105,7 +104,7 @@ class ServerHandler:
@Route.get(
r"/settings",
description="Retrieve gui settings from the server. Temporary will we removed in later release")
def read_settings(request, response):
async def read_settings(request, response):
settings = None
while True:
@@ -115,7 +114,7 @@ class ServerHandler:
if settings is not None:
break
yield from asyncio.sleep(0.5)
await asyncio.sleep(0.5)
response.json(settings)
@Route.post(
@@ -142,7 +141,7 @@ class ServerHandler:
status_codes={
201: "Written"
})
def debug(request, response):
async def debug(request, response):
config = Config.instance()
if config.get_section_config("Server").getboolean("local", False) is False:
@@ -170,7 +169,7 @@ class ServerHandler:
for compute in list(Controller.instance().computes.values()):
try:
r = yield from compute.get("/debug", raw=True)
r = await compute.get("/debug", raw=True)
data = r.body.decode("utf-8")
except Exception as e:
data = str(e)
@@ -43,10 +43,10 @@ class SnapshotHandler:
201: "Snasphot created",
404: "The project doesn't exist"
})
def create(request, response):
async def create(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
snapshot = yield from project.snapshot(request.json["name"])
snapshot = await project.snapshot(request.json["name"])
response.json(snapshot)
response.set_status(201)
@@ -77,11 +77,11 @@ class SnapshotHandler:
204: "Changes have been written on disk",
404: "The project or snapshot doesn't exist"
})
def delete(request, response):
async def delete(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
yield from project.delete_snapshot(request.match_info["snapshot_id"])
await project.delete_snapshot(request.match_info["snapshot_id"])
response.set_status(204)
@Route.post(
@@ -96,11 +96,11 @@ class SnapshotHandler:
201: "The snapshot has been restored",
404: "The project or snapshot doesn't exist"
})
def restore(request, response):
async def restore(request, response):
controller = Controller.instance()
project = controller.get_project(request.match_info["project_id"])
snapshot = project.get_snapshot(request.match_info["snapshot_id"])
project = yield from snapshot.restore()
project = await snapshot.restore()
response.set_status(201)
response.json(project)
@@ -47,11 +47,11 @@ class SymbolHandler:
status_codes={
200: "Symbol returned"
})
def raw(request, response):
async def raw(request, response):
controller = Controller.instance()
try:
yield from response.file(controller.symbols.get_path(request.match_info["symbol_id"]))
await response.file(controller.symbols.get_path(request.match_info["symbol_id"]))
except (KeyError, OSError) as e:
log.warning("Could not get symbol file: {}".format(e))
response.set_status(404)
@@ -63,14 +63,14 @@ class SymbolHandler:
200: "Symbol returned"
},
raw=True)
def upload(request, response):
async def upload(request, response):
controller = Controller.instance()
path = os.path.join(controller.symbols.symbols_path(), os.path.basename(request.match_info["symbol_id"]))
try:
with open(path, "wb") as f:
while True:
try:
chunk = yield from request.content.read(1024)
chunk = await request.content.read(1024)
except asyncio.TimeoutError:
raise aiohttp.web.HTTPRequestTimeout(text="Timeout when writing to symbol '{}'".format(path))
if not chunk: