mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-06 15:21:13 +02:00
Drop Python 3.4 and switch to async / await syntax for asyncio. Fixes #1425
This commit is contained in:
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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user