Create /hypervisor and /controller namespace

This commit is contained in:
Julien Duponchelle committed 2016-03-07 15:01:35 +01:00
1 parent e4b12f49d1
commit 664cec97ba
231 files changed
+1576 -1480

No files matched your search

+18 -14
View File
@@ -17,23 +17,27 @@
import sys
import os
from gns3server.handlers.api.version_handler import VersionHandler
from gns3server.handlers.api.network_handler import NetworkHandler
from gns3server.handlers.api.project_handler import ProjectHandler
from gns3server.handlers.api.dynamips_device_handler import DynamipsDeviceHandler
from gns3server.handlers.api.dynamips_vm_handler import DynamipsVMHandler
from gns3server.handlers.api.qemu_handler import QEMUHandler
from gns3server.handlers.api.virtualbox_handler import VirtualBoxHandler
from gns3server.handlers.api.docker_handler import DockerHandler
from gns3server.handlers.api.vpcs_handler import VPCSHandler
from gns3server.handlers.api.vmware_handler import VMwareHandler
from gns3server.handlers.api.config_handler import ConfigHandler
from gns3server.handlers.api.server_handler import ServerHandler
from gns3server.handlers.api.file_handler import FileHandler
from gns3server.handlers.upload_handler import UploadHandler
from gns3server.handlers.index_handler import IndexHandler
from gns3server.handlers.api.version_handler import VersionHandler
# TODO: Do not load if controller is off
from gns3server.handlers.api.controller.server_handler import ServerHandler
from gns3server.handlers.api.hypervisor.network_handler import NetworkHandler
from gns3server.handlers.api.hypervisor.project_handler import ProjectHandler
from gns3server.handlers.api.hypervisor.dynamips_device_handler import DynamipsDeviceHandler
from gns3server.handlers.api.hypervisor.dynamips_vm_handler import DynamipsVMHandler
from gns3server.handlers.api.hypervisor.qemu_handler import QEMUHandler
from gns3server.handlers.api.hypervisor.virtualbox_handler import VirtualBoxHandler
from gns3server.handlers.api.hypervisor.docker_handler import DockerHandler
from gns3server.handlers.api.hypervisor.vpcs_handler import VPCSHandler
from gns3server.handlers.api.hypervisor.vmware_handler import VMwareHandler
from gns3server.handlers.api.hypervisor.config_handler import ConfigHandler
from gns3server.handlers.api.hypervisor.file_handler import FileHandler
if sys.platform.startswith("linux") or hasattr(sys, "_called_from_test") or os.environ.get("PYTEST_BUILD_DOCUMENTATION") == "1":
# IOU runs only on Linux but testsuite work on UNIX platform
if not sys.platform.startswith("win"):
from gns3server.handlers.api.iou_handler import IOUHandler
from gns3server.handlers.api.hypervisor.iou_handler import IOUHandler
Whitespace-only changes.
@@ -18,12 +18,12 @@
import asyncio
from aiohttp.web import HTTPForbidden
from ...web.route import Route
from ...config import Config
from ...modules.project_manager import ProjectManager
from ...schemas.server import SERVER_CREATE_SCHEMA, SERVER_OBJECT_SCHEMA
from ...controller import Controller
from ...controller.server import Server
from ....web.route import Route
from ....config import Config
from ....modules.project_manager import ProjectManager
from ....schemas.server import SERVER_CREATE_SCHEMA, SERVER_OBJECT_SCHEMA
from ....controller import Controller
from ....controller.server import Server
import logging
@@ -40,7 +40,6 @@ class ServerHandler:
status_codes={
201: "Server added"
},
controller=True,
input=SERVER_CREATE_SCHEMA,
output=SERVER_OBJECT_SCHEMA)
def create(request, response):
Whitespace-only changes.
@@ -15,10 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from ...web.route import Route
from ...config import Config
from aiohttp.web import HTTPForbidden
from ....web.route import Route
from ....config import Config
class ConfigHandler:
@@ -18,17 +18,17 @@
import os
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...modules.docker import Docker
from ....web.route import Route
from ....modules.docker import Docker
from ...schemas.docker import (
from ....schemas.docker import (
DOCKER_CREATE_SCHEMA,
DOCKER_OBJECT_SCHEMA,
DOCKER_UPDATE_SCHEMA,
DOCKER_LIST_IMAGES_SCHEMA
)
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...schemas.nio import NIO_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....schemas.nio import NIO_SCHEMA
class DockerHandler:
@@ -17,13 +17,13 @@
import os
import asyncio
from ...web.route import Route
from ...schemas.dynamips_device import DEVICE_CREATE_SCHEMA
from ...schemas.dynamips_device import DEVICE_UPDATE_SCHEMA
from ...schemas.dynamips_device import DEVICE_OBJECT_SCHEMA
from ...schemas.dynamips_device import DEVICE_NIO_SCHEMA
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...modules.dynamips import Dynamips
from ....web.route import Route
from ....schemas.dynamips_device import DEVICE_CREATE_SCHEMA
from ....schemas.dynamips_device import DEVICE_UPDATE_SCHEMA
from ....schemas.dynamips_device import DEVICE_OBJECT_SCHEMA
from ....schemas.dynamips_device import DEVICE_NIO_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....modules.dynamips import Dynamips
class DynamipsDeviceHandler:
@@ -19,17 +19,17 @@ import os
import sys
import base64
from ...web.route import Route
from ...schemas.nio import NIO_SCHEMA
from ...schemas.vm import VM_LIST_IMAGES_SCHEMA
from ...schemas.dynamips_vm import VM_CREATE_SCHEMA
from ...schemas.dynamips_vm import VM_UPDATE_SCHEMA
from ...schemas.dynamips_vm import VM_OBJECT_SCHEMA
from ...schemas.dynamips_vm import VM_CONFIGS_SCHEMA
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...modules.dynamips import Dynamips
from ...modules.dynamips.dynamips_error import DynamipsError
from ...modules.project_manager import ProjectManager
from ....web.route import Route
from ....schemas.nio import NIO_SCHEMA
from ....schemas.vm import VM_LIST_IMAGES_SCHEMA
from ....schemas.dynamips_vm import VM_CREATE_SCHEMA
from ....schemas.dynamips_vm import VM_UPDATE_SCHEMA
from ....schemas.dynamips_vm import VM_OBJECT_SCHEMA
from ....schemas.dynamips_vm import VM_CONFIGS_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....modules.dynamips import Dynamips
from ....modules.dynamips.dynamips_error import DynamipsError
from ....modules.project_manager import ProjectManager
DEFAULT_CHASSIS = {
"c1700": "1720",
@@ -17,8 +17,8 @@
import asyncio
import aiohttp
from ...web.route import Route
from ...schemas.file import FILE_STREAM_SCHEMA
from ....web.route import Route
from ....schemas.file import FILE_STREAM_SCHEMA
class FileHandler:
@@ -18,16 +18,16 @@
import os
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...schemas.nio import NIO_SCHEMA
from ...schemas.iou import IOU_CREATE_SCHEMA
from ...schemas.iou import IOU_START_SCHEMA
from ...schemas.iou import IOU_UPDATE_SCHEMA
from ...schemas.iou import IOU_OBJECT_SCHEMA
from ...schemas.iou import IOU_CONFIGS_SCHEMA
from ...schemas.vm import VM_LIST_IMAGES_SCHEMA
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...modules.iou import IOU
from ....web.route import Route
from ....schemas.nio import NIO_SCHEMA
from ....schemas.iou import IOU_CREATE_SCHEMA
from ....schemas.iou import IOU_START_SCHEMA
from ....schemas.iou import IOU_UPDATE_SCHEMA
from ....schemas.iou import IOU_OBJECT_SCHEMA
from ....schemas.iou import IOU_CONFIGS_SCHEMA
from ....schemas.vm import VM_LIST_IMAGES_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....modules.iou import IOU
class IOUHandler:
@@ -15,10 +15,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from ...web.route import Route
from ...modules.port_manager import PortManager
from ...modules.project_manager import ProjectManager
from ...utils.interfaces import interfaces
from ....web.route import Route
from ....modules.port_manager import PortManager
from ....modules.project_manager import ProjectManager
from ....utils.interfaces import interfaces
class NetworkHandler:
@@ -21,10 +21,10 @@ import json
import os
import psutil
from ...web.route import Route
from ...schemas.project import PROJECT_OBJECT_SCHEMA, PROJECT_CREATE_SCHEMA, PROJECT_UPDATE_SCHEMA, PROJECT_FILE_LIST_SCHEMA, PROJECT_LIST_SCHEMA
from ...modules.project_manager import ProjectManager
from ...modules import MODULES
from ....web.route import Route
from ....schemas.project import PROJECT_OBJECT_SCHEMA, PROJECT_CREATE_SCHEMA, PROJECT_UPDATE_SCHEMA, PROJECT_FILE_LIST_SCHEMA, PROJECT_LIST_SCHEMA
from ....modules.project_manager import ProjectManager
from ....modules import MODULES
import logging
log = logging.getLogger()
@@ -19,19 +19,19 @@ import sys
import os.path
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...modules.project_manager import ProjectManager
from ...schemas.nio import NIO_SCHEMA
from ...schemas.qemu import QEMU_CREATE_SCHEMA
from ...schemas.qemu import QEMU_UPDATE_SCHEMA
from ...schemas.qemu import QEMU_OBJECT_SCHEMA
from ...schemas.qemu import QEMU_BINARY_FILTER_SCHEMA
from ...schemas.qemu import QEMU_BINARY_LIST_SCHEMA
from ...schemas.qemu import QEMU_CAPABILITY_LIST_SCHEMA
from ...schemas.qemu import QEMU_IMAGE_CREATE_SCHEMA
from ...schemas.vm import VM_LIST_IMAGES_SCHEMA
from ...modules.qemu import Qemu
from ...config import Config
from ....web.route import Route
from ....modules.project_manager import ProjectManager
from ....schemas.nio import NIO_SCHEMA
from ....schemas.qemu import QEMU_CREATE_SCHEMA
from ....schemas.qemu import QEMU_UPDATE_SCHEMA
from ....schemas.qemu import QEMU_OBJECT_SCHEMA
from ....schemas.qemu import QEMU_BINARY_FILTER_SCHEMA
from ....schemas.qemu import QEMU_BINARY_LIST_SCHEMA
from ....schemas.qemu import QEMU_CAPABILITY_LIST_SCHEMA
from ....schemas.qemu import QEMU_IMAGE_CREATE_SCHEMA
from ....schemas.vm import VM_LIST_IMAGES_SCHEMA
from ....modules.qemu import Qemu
from ....config import Config
class QEMUHandler:
@@ -18,14 +18,14 @@
import os
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...schemas.nio import NIO_SCHEMA
from ...schemas.virtualbox import VBOX_CREATE_SCHEMA
from ...schemas.virtualbox import VBOX_UPDATE_SCHEMA
from ...schemas.virtualbox import VBOX_OBJECT_SCHEMA
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...modules.virtualbox import VirtualBox
from ...modules.project_manager import ProjectManager
from ....web.route import Route
from ....schemas.nio import NIO_SCHEMA
from ....schemas.virtualbox import VBOX_CREATE_SCHEMA
from ....schemas.virtualbox import VBOX_UPDATE_SCHEMA
from ....schemas.virtualbox import VBOX_OBJECT_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....modules.virtualbox import VirtualBox
from ....modules.project_manager import ProjectManager
class VirtualBoxHandler:
@@ -18,14 +18,14 @@
import os
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...schemas.vmware import VMWARE_CREATE_SCHEMA
from ...schemas.vmware import VMWARE_UPDATE_SCHEMA
from ...schemas.vmware import VMWARE_OBJECT_SCHEMA
from ...schemas.vm import VM_CAPTURE_SCHEMA
from ...schemas.nio import NIO_SCHEMA
from ...modules.vmware import VMware
from ...modules.project_manager import ProjectManager
from ....web.route import Route
from ....schemas.vmware import VMWARE_CREATE_SCHEMA
from ....schemas.vmware import VMWARE_UPDATE_SCHEMA
from ....schemas.vmware import VMWARE_OBJECT_SCHEMA
from ....schemas.vm import VM_CAPTURE_SCHEMA
from ....schemas.nio import NIO_SCHEMA
from ....modules.vmware import VMware
from ....modules.project_manager import ProjectManager
class VMwareHandler:
@@ -16,12 +16,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from aiohttp.web import HTTPConflict
from ...web.route import Route
from ...schemas.nio import NIO_SCHEMA
from ...schemas.vpcs import VPCS_CREATE_SCHEMA
from ...schemas.vpcs import VPCS_UPDATE_SCHEMA
from ...schemas.vpcs import VPCS_OBJECT_SCHEMA
from ...modules.vpcs import VPCS
from ....web.route import Route
from ....schemas.nio import NIO_SCHEMA
from ....schemas.vpcs import VPCS_CREATE_SCHEMA
from ....schemas.vpcs import VPCS_UPDATE_SCHEMA
from ....schemas.vpcs import VPCS_OBJECT_SCHEMA
from ....modules.vpcs import VPCS
class VPCSHandler:
+28 -17
View File
@@ -36,11 +36,18 @@ class Documentation(object):
self._directory = directory
def write(self):
self.write_documentation(False)
self.write_documentation("hypervisor")
# Controller documentation
self.write_documentation(True)
self.write_documentation("controller")
# Write doc common to both
self.write_documentation("common")
def write_documentation(self, controller):
def write_documentation(self, doc_type):
"""
Build all the doc page for handlers
:param doc_type: Type of doc to generate (controller, hypervisor or common)
"""
for handler_name in sorted(self._documentation):
print("Build {}".format(handler_name))
@@ -50,25 +57,27 @@ class Documentation(object):
if api_version is None:
continue
if self._documentation[handler_name][path].get("controller", False):
if "controller." in handler_name:
server_type = "controller"
if not controller:
continue
elif "hypervisor." in handler_name:
server_type = "hypervisor"
else:
server_type = "server"
if controller:
continue
server_type = "common"
self._create_handler_directory(handler_name, api_version, server_type)
if doc_type != server_type:
continue
filename = self._file_path(path)
handler_doc = self._documentation[handler_name][path]
with open("{}/api/v{}/{}/{}/{}.rst".format(self._directory, api_version, server_type, handler_name, filename), 'w+') as f:
f.write('{}\n----------------------------------------------------------------------------------------------------------------------\n\n'.format(path))
handler = handler_name.replace(server_type + ".", "")
self._create_handler_directory(handler, api_version, server_type)
with open("{}/api/v{}/{}/{}/{}.rst".format(self._directory, api_version, server_type, handler, filename), 'w+') as f:
f.write('{}\n------------------------------------------------------------------------------------------------------------------------------------------\n\n'.format(path))
f.write('.. contents::\n')
for method in handler_doc["methods"]:
f.write('\n{} {}\n'.format(method["method"], path.replace("{", '**{').replace("}", "}**")))
f.write('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n')
f.write('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n')
f.write('{}\n\n'.format(method["description"]))
if len(method["parameters"]) > 0:
@@ -93,7 +102,7 @@ class Documentation(object):
f.write("Output\n*******\n")
self._write_json_schema(f, method["output_schema"])
self._include_query_example(f, method, path, api_version)
self._include_query_example(f, method, path, api_version, server_type)
def _create_handler_directory(self, handler_name, api_version, server_type):
"""Create a directory for the handler and add an index inside"""
@@ -103,18 +112,20 @@ class Documentation(object):
with open("{}/api/v{}/{}/{}.rst".format(self._directory, api_version, server_type, handler_name), "w+") as f:
f.write(handler_name.replace("api.", "").replace("_", " ", ).capitalize())
f.write("\n---------------------\n\n")
f.write("\n-----------------------------\n\n")
f.write(".. toctree::\n :glob:\n :maxdepth: 2\n\n {}/*\n".format(handler_name))
def _include_query_example(self, f, method, path, api_version):
def _include_query_example(self, f, method, path, api_version, server_type):
"""If a sample session is available we include it in documentation"""
m = method["method"].lower()
query_path = "{}_{}.txt".format(m, self._file_path(path))
query_path = "{}_{}_{}.txt".format(server_type, m, self._file_path(path))
if os.path.isfile(os.path.join(self._directory, "api", "examples", query_path)):
f.write("Sample session\n***************\n")
f.write("\n\n.. literalinclude:: ../../../examples/{}\n\n".format(query_path))
def _file_path(self, path):
path = path.replace("hypervisor", "")
path = path.replace("controller", "")
return re.sub("^v1", "", re.sub("[^a-z0-9]", "", path))
def _write_definitions(self, f, schema):
+26 -21
View File
@@ -123,29 +123,34 @@ class Route(object):
api_version = kw.get("api_version", 1)
raw = kw.get("raw", False)
# If it's a JSON api endpoint just register the endpoint an do nothing
if api_version is None:
cls._path = path
else:
cls._path = "/v{version}{path}".format(path=path, version=api_version)
def register(func):
route = cls._path
# Add the type of server to the route
if "controller" in func.__module__:
route = "/v{version}/controller{path}".format(path=path, version=api_version)
elif "hypervisor" in func.__module__:
route = "/v{version}/hypervisor{path}".format(path=path, version=api_version)
elif "handlers.api" in func.__module__:
route = "/v{version}{path}".format(path=path, version=api_version)
else:
route = path
handler = func.__module__.replace("_handler", "").replace("gns3server.handlers.api.", "")
cls._documentation.setdefault(handler, {})
cls._documentation[handler].setdefault(route, {"api_version": api_version,
"controller": kw.get("controller", False),
"methods": []})
# Compute metadata for the documentation
if api_version:
handler = func.__module__.replace("_handler", "").replace("gns3server.handlers.api.", "")
cls._documentation.setdefault(handler, {})
cls._documentation[handler].setdefault(route, {"api_version": api_version,
"controller": kw.get("controller", False),
"methods": []})
cls._documentation[handler][route]["methods"].append({
"method": method,
"status_codes": kw.get("status_codes", {200: "OK"}),
"parameters": kw.get("parameters", {}),
"output_schema": output_schema,
"input_schema": input_schema,
"description": kw.get("description", ""),
})
cls._documentation[handler][route]["methods"].append({
"method": method,
"status_codes": kw.get("status_codes", {200: "OK"}),
"parameters": kw.get("parameters", {}),
"output_schema": output_schema,
"input_schema": input_schema,
"description": kw.get("description", ""),
})
func = asyncio.coroutine(func)
@asyncio.coroutine
@@ -253,7 +258,7 @@ class Route(object):
response = yield from control_schema(request)
return response
cls._routes.append((method, cls._path, vm_concurrency))
cls._routes.append((method, route, vm_concurrency))
return vm_concurrency
return register