Refactoring to use a common node class for all VMs and other (future) objects.

This commit is contained in:
grossmj committed 2016-05-11 11:35:36 -06:00
1 parent 9dca7dfe4a
commit 5a76f81271
102 files changed
+1654 -1672

No files matched your search

@@ -18,5 +18,5 @@
from .compute_handler import ComputeHandler
from .project_handler import ProjectHandler
from .version_handler import VersionHandler
from .vm_handler import VMHandler
from .node_handler import NodeHandler
from .link_handler import LinkHandler
@@ -44,7 +44,7 @@ class ComputeHandler:
output=COMPUTE_OBJECT_SCHEMA)
def create(request, response):
compute = yield from Controller.instance().addCompute(**request.json)
compute = yield from Controller.instance().add_compute(**request.json)
response.set_status(201)
response.json(compute)
@@ -16,11 +16,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import aiohttp
import asyncio
from ....web.route import Route
from ....schemas.link import LINK_OBJECT_SCHEMA, LINK_CAPTURE_SCHEMA
from ....controller.project import Project
from ....controller import Controller
@@ -45,12 +43,10 @@ class LinkHandler:
def create(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
link = yield from project.addLink()
for vm in request.json["vms"]:
yield from link.addVM(project.getVM(vm["vm_id"]),
vm["adapter_number"],
vm["port_number"])
project = controller.get_project(request.match_info["project_id"])
link = yield from project.add_link()
for node in request.json["nodes"]:
yield from link.add_node(project.get_node(node["node_id"]), node["adapter_number"], node["port_number"])
yield from link.create()
response.set_status(201)
response.json(link)
@@ -72,8 +68,8 @@ class LinkHandler:
def start_capture(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
link = project.getLink(request.match_info["link_id"])
project = controller.get_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"))
response.set_status(201)
response.json(link)
@@ -93,8 +89,8 @@ class LinkHandler:
def stop_capture(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
link = project.getLink(request.match_info["link_id"])
project = controller.get_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
yield from link.stop_capture()
response.set_status(201)
response.json(link)
@@ -114,8 +110,8 @@ class LinkHandler:
def delete(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
link = project.getLink(request.match_info["link_id"])
project = controller.get_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
yield from link.delete()
response.set_status(204)
response.json(link)
@@ -136,8 +132,8 @@ class LinkHandler:
def pcap(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
link = project.getLink(request.match_info["link_id"])
project = controller.get_project(request.match_info["project_id"])
link = project.get_link(request.match_info["link_id"])
if link.capture_file_path is None:
raise aiohttp.web.HTTPNotFound(text="pcap file not found")
@@ -16,19 +16,18 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from ....web.route import Route
from ....schemas.vm import VM_OBJECT_SCHEMA, VM_UPDATE_SCHEMA
from ....controller.project import Project
from ....schemas.node import NODE_OBJECT_SCHEMA, NODE_UPDATE_SCHEMA
from ....controller import Controller
class VMHandler:
class NodeHandler:
"""
API entry point for VM
API entry point for node
"""
@classmethod
@Route.post(
r"/projects/{project_id}/vms",
r"/projects/{project_id}/nodes",
parameters={
"project_id": "UUID for the project"
},
@@ -36,155 +35,155 @@ class VMHandler:
201: "Instance created",
400: "Invalid request"
},
description="Create a new VM instance",
input=VM_OBJECT_SCHEMA,
output=VM_OBJECT_SCHEMA)
description="Create a new node instance",
input=NODE_OBJECT_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def create(request, response):
controller = Controller.instance()
compute = controller.getCompute(request.json.pop("compute_id"))
project = controller.getProject(request.match_info["project_id"])
vm = yield from project.addVM(compute, request.json.pop("vm_id", None), **request.json)
project = controller.get_project(request.match_info["project_id"])
node = yield from project.add_node(compute, request.json.pop("node_id", None), **request.json)
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.get(
r"/projects/{project_id}/vms",
r"/projects/{project_id}/nodes",
parameters={
"project_id": "UUID for the project"
},
status_codes={
200: "List of VMS",
200: "List of nodes",
},
description="List VMs of a project")
def list_vms(request, response):
description="List nodes of a project")
def list_nodes(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
response.json([ v for v in project.vms.values() ])
project = controller.get_project(request.match_info["project_id"])
response.json([ v for v in project.nodes.values() ])
@classmethod
@Route.put(
r"/projects/{project_id}/vms/{vm_id}",
r"/projects/{project_id}/nodes/{node_id}",
status_codes={
201: "Instance created",
400: "Invalid request"
},
description="Update a VM instance",
input=VM_UPDATE_SCHEMA,
output=VM_OBJECT_SCHEMA)
description="Update a node instance",
input=NODE_UPDATE_SCHEMA,
output=NODE_OBJECT_SCHEMA)
def update(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
# Ignore this, because we use it only in create
request.json.pop("vm_id", None)
request.json.pop("vm_type", None)
request.json.pop("node_id", None)
request.json.pop("node_type", None)
request.json.pop("compute_id", None)
yield from vm.update(**request.json)
yield from node.update(**request.json)
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.post(
r"/projects/{project_id}/vms/{vm_id}/start",
r"/projects/{project_id}/nodes/{node_id}/start",
parameters={
"project_id": "UUID for the project",
"vm_id": "UUID for the VM"
"node_id": "UUID for the node"
},
status_codes={
201: "Instance created",
400: "Invalid request"
},
description="Start a VM instance",
output=VM_OBJECT_SCHEMA)
description="Start a node instance",
output=NODE_OBJECT_SCHEMA)
def start(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
yield from vm.start()
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.start()
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.post(
r"/projects/{project_id}/vms/{vm_id}/stop",
r"/projects/{project_id}/nodes/{node_id}/stop",
parameters={
"project_id": "UUID for the project",
"vm_id": "UUID for the VM"
"node_id": "UUID for the node"
},
status_codes={
201: "Instance created",
400: "Invalid request"
},
description="Start a VM instance",
output=VM_OBJECT_SCHEMA)
description="Start a node instance",
output=NODE_OBJECT_SCHEMA)
def stop(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
yield from vm.stop()
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.stop()
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.post(
r"/projects/{project_id}/vms/{vm_id}/suspend",
r"/projects/{project_id}/nodes/{node_id}/suspend",
parameters={
"project_id": "UUID for the project",
"vm_id": "UUID for the VM"
"node_id": "UUID for the node"
},
status_codes={
201: "Instance created",
400: "Invalid request"
},
description="Start a VM instance",
output=VM_OBJECT_SCHEMA)
description="Start a node instance",
output=NODE_OBJECT_SCHEMA)
def suspend(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
yield from vm.suspend()
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.suspend()
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.post(
r"/projects/{project_id}/vms/{vm_id}/reload",
r"/projects/{project_id}/nodes/{node_id}/reload",
parameters={
"project_id": "UUID for the project",
"vm_id": "UUID for the VM"
"node_id": "UUID for the node"
},
status_codes={
201: "Instance created",
400: "Invalid request"
},
description="Reload a VM instance",
output=VM_OBJECT_SCHEMA)
description="Reload a node instance",
output=NODE_OBJECT_SCHEMA)
def reload(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
yield from vm.reload()
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.reload()
response.set_status(201)
response.json(vm)
response.json(node)
@classmethod
@Route.delete(
r"/projects/{project_id}/vms/{vm_id}",
r"/projects/{project_id}/nodes/{node_id}",
parameters={
"project_id": "UUID for the project",
"vm_id": "UUID for the VM"
"node_id": "UUID for the node"
},
status_codes={
201: "Instance deleted",
400: "Invalid request"
},
description="Delete a VM instance")
description="Delete a node instance")
def delete(request, response):
project = Controller.instance().getProject(request.match_info["project_id"])
vm = project.getVM(request.match_info["vm_id"])
yield from vm.destroy()
project = Controller.instance().get_project(request.match_info["project_id"])
node = project.get_node(request.match_info["node_id"])
yield from node.destroy()
response.set_status(201)
@@ -75,7 +75,7 @@ class ProjectHandler:
})
def get(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
response.json(project)
@classmethod
@@ -92,7 +92,7 @@ class ProjectHandler:
def commit(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
yield from project.commit()
response.set_status(204)
@@ -110,7 +110,7 @@ class ProjectHandler:
def close(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
yield from project.close()
controller.removeProject(project)
response.set_status(204)
@@ -129,7 +129,7 @@ class ProjectHandler:
def delete(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
yield from project.delete()
controller.removeProject(project)
response.set_status(204)
@@ -148,7 +148,7 @@ class ProjectHandler:
def notification(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
response.content_type = "application/json"
response.set_status(200)
@@ -179,7 +179,7 @@ class ProjectHandler:
def notification_ws(request, response):
controller = Controller.instance()
project = controller.getProject(request.match_info["project_id"])
project = controller.get_project(request.match_info["project_id"])
ws = aiohttp.web.WebSocketResponse()
yield from ws.prepare(request)