From 58d4a529d42150c99cf9eff4dc49a3ba4ecf2208 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle <julien@duponchelle.info> Date: Fri, 15 Apr 2016 17:57:06 +0200 Subject: [PATCH] Rename hypervisor to compute Fix #487 --- .../{hypervisor => compute}/__init__.py | 0 .../adapters/__init__.py | 0 .../adapters/adapter.py | 0 .../adapters/ethernet_adapter.py | 0 .../adapters/serial_adapter.py | 0 .../{hypervisor => compute}/base_manager.py | 0 gns3server/{hypervisor => compute}/base_vm.py | 0 .../docker/__init__.py | 0 .../docker/docker_error.py | 0 .../docker/docker_vm.py | 0 .../resources/etc/udhcpc/default.script | 0 .../docker/resources/init.sh | 0 .../dynamips/__init__.py | 0 .../dynamips/adapters/__init__.py | 0 .../dynamips/adapters/adapter.py | 0 .../dynamips/adapters/c1700_mb_1fe.py | 0 .../dynamips/adapters/c1700_mb_wic1.py | 0 .../dynamips/adapters/c2600_mb_1e.py | 0 .../dynamips/adapters/c2600_mb_1fe.py | 0 .../dynamips/adapters/c2600_mb_2e.py | 0 .../dynamips/adapters/c2600_mb_2fe.py | 0 .../dynamips/adapters/c7200_io_2fe.py | 0 .../dynamips/adapters/c7200_io_fe.py | 0 .../dynamips/adapters/c7200_io_ge_e.py | 0 .../dynamips/adapters/gt96100_fe.py | 0 .../dynamips/adapters/leopard_2fe.py | 0 .../dynamips/adapters/nm_16esw.py | 0 .../dynamips/adapters/nm_1e.py | 0 .../dynamips/adapters/nm_1fe_tx.py | 0 .../dynamips/adapters/nm_4e.py | 0 .../dynamips/adapters/nm_4t.py | 0 .../dynamips/adapters/pa_2fe_tx.py | 0 .../dynamips/adapters/pa_4e.py | 0 .../dynamips/adapters/pa_4t.py | 0 .../dynamips/adapters/pa_8e.py | 0 .../dynamips/adapters/pa_8t.py | 0 .../dynamips/adapters/pa_a1.py | 0 .../dynamips/adapters/pa_fe_tx.py | 0 .../dynamips/adapters/pa_ge.py | 0 .../dynamips/adapters/pa_pos_oc3.py | 0 .../dynamips/adapters/wic_1enet.py | 0 .../dynamips/adapters/wic_1t.py | 0 .../dynamips/adapters/wic_2t.py | 0 .../dynamips/dynamips_device.py | 0 .../dynamips/dynamips_error.py | 0 .../dynamips/dynamips_hypervisor.py | 0 .../dynamips/dynamips_vm.py | 0 .../dynamips/hypervisor.py | 0 .../dynamips/nios/__init__.py | 0 .../dynamips/nios/nio.py | 0 .../dynamips/nios/nio_generic_ethernet.py | 0 .../dynamips/nios/nio_linux_ethernet.py | 0 .../dynamips/nios/nio_null.py | 0 .../dynamips/nios/nio_tap.py | 0 .../dynamips/nios/nio_udp.py | 0 .../dynamips/nios/nio_unix.py | 0 .../dynamips/nios/nio_vde.py | 0 .../dynamips/nodes/__init__.py | 0 .../dynamips/nodes/atm_switch.py | 0 .../dynamips/nodes/bridge.py | 0 .../dynamips/nodes/c1700.py | 0 .../dynamips/nodes/c2600.py | 0 .../dynamips/nodes/c2691.py | 0 .../dynamips/nodes/c3600.py | 0 .../dynamips/nodes/c3725.py | 0 .../dynamips/nodes/c3745.py | 0 .../dynamips/nodes/c7200.py | 0 .../dynamips/nodes/device.py | 0 .../dynamips/nodes/ethernet_hub.py | 0 .../dynamips/nodes/ethernet_switch.py | 0 .../dynamips/nodes/frame_relay_switch.py | 0 .../dynamips/nodes/router.py | 0 .../{hypervisor => compute}/iou/__init__.py | 0 .../{hypervisor => compute}/iou/iou_error.py | 0 .../{hypervisor => compute}/iou/iou_vm.py | 0 .../{hypervisor => compute}/iou/ioucon.py | 0 .../iou/utils/__init__.py | 0 .../iou/utils/iou_export.py | 0 .../iou/utils/iou_import.py | 0 .../{hypervisor => compute}/nios/__init__.py | 0 .../{hypervisor => compute}/nios/nio.py | 0 .../nios/nio_generic_ethernet.py | 0 .../{hypervisor => compute}/nios/nio_nat.py | 0 .../{hypervisor => compute}/nios/nio_tap.py | 0 .../{hypervisor => compute}/nios/nio_udp.py | 0 .../notification_manager.py | 2 +- .../{hypervisor => compute}/port_manager.py | 0 gns3server/{hypervisor => compute}/project.py | 18 +- .../project_manager.py | 0 .../{hypervisor => compute}/qemu/__init__.py | 0 .../{hypervisor => compute}/qemu/qcow2.py | 0 .../qemu/qemu_error.py | 0 .../{hypervisor => compute}/qemu/qemu_vm.py | 0 .../virtualbox/__init__.py | 0 .../virtualbox/virtualbox_error.py | 0 .../virtualbox/virtualbox_vm.py | 0 .../{hypervisor => compute}/vm_error.py | 0 .../vmware/__init__.py | 8 +- .../vmware/nio_vmnet.py | 0 .../vmware/vmware_error.py | 0 .../vmware/vmware_vm.py | 0 .../{hypervisor => compute}/vpcs/__init__.py | 0 .../vpcs/vpcs_error.py | 0 .../{hypervisor => compute}/vpcs/vpcs_vm.py | 0 gns3server/config.py | 2 +- gns3server/controller/__init__.py | 40 ++-- .../controller/{hypervisor.py => compute.py} | 36 ++-- gns3server/controller/project.py | 24 +-- gns3server/controller/udp_link.py | 8 +- gns3server/controller/vm.py | 25 +-- gns3server/handlers/__init__.py | 2 +- .../api/{hypervisor => compute}/__init__.py | 0 .../{hypervisor => compute}/config_handler.py | 0 .../{hypervisor => compute}/docker_handler.py | 2 +- .../dynamips_device_handler.py | 2 +- .../dynamips_vm_handler.py | 6 +- .../{hypervisor => compute}/file_handler.py | 0 .../{hypervisor => compute}/iou_handler.py | 2 +- .../network_handler.py | 4 +- .../notification_handler.py | 2 +- .../project_handler.py | 4 +- .../{hypervisor => compute}/qemu_handler.py | 4 +- .../version_handler.py | 0 .../virtualbox_handler.py | 4 +- .../{hypervisor => compute}/vmware_handler.py | 4 +- .../{hypervisor => compute}/vpcs_handler.py | 2 +- .../handlers/api/controller/__init__.py | 2 +- ...pervisor_handler.py => compute_handler.py} | 38 ++-- .../handlers/api/controller/vm_handler.py | 4 +- gns3server/handlers/index_handler.py | 11 +- gns3server/main.py | 2 +- gns3server/run.py | 5 +- .../schemas/{hypervisor.py => compute.py} | 20 +- gns3server/schemas/vm.py | 4 +- .../{hypervisor.html => compute.html} | 0 gns3server/templates/controller.html | 11 +- gns3server/web/documentation.py | 8 +- gns3server/web/route.py | 8 +- gns3server/web/web_server.py | 36 +--- .../docker/test_docker.py | 6 +- .../docker/test_docker_vm.py | 126 ++++++------ .../dynamips/test_dynamips_manager.py | 4 +- .../dynamips/test_dynamips_router.py | 6 +- .../iou/test_iou_manager.py | 6 +- .../iou/test_iou_vm.py | 36 ++-- .../qemu/test_qemu_manager.py | 14 +- .../qemu/test_qemu_vm.py | 20 +- tests/{hypervisor => compute}/test_base_vm.py | 10 +- tests/{hypervisor => compute}/test_manager.py | 16 +- .../test_notification_manager.py | 2 +- .../test_port_manager.py | 16 +- tests/{hypervisor => compute}/test_project.py | 24 +-- .../test_project_manager.py | 2 +- .../virtualbox/test_virtualbox_manager.py | 6 +- .../virtualbox/test_virtualbox_vm.py | 10 +- .../vmware/test_vmware_manager.py | 2 +- .../vmware/test_vmware_vm.py | 6 +- .../vpcs/test_vpcs_manager.py | 6 +- .../vpcs/test_vpcs_vm.py | 30 +-- tests/conftest.py | 14 +- .../{test_hypervisor.py => test_compute.py} | 114 +++++------ tests/controller/test_controller.py | 34 ++-- tests/controller/test_link.py | 16 +- tests/controller/test_project.py | 34 ++-- tests/controller/test_udp_link.py | 42 ++-- tests/controller/test_vm.py | 52 ++--- tests/handlers/api/base.py | 8 +- .../api/{hypervisor => compute}/__init__.py | 0 .../{hypervisor => compute}/test_config.py | 8 +- tests/handlers/api/compute/test_docker.py | 185 ++++++++++++++++++ .../{hypervisor => compute}/test_dynamips.py | 76 +++---- .../api/{hypervisor => compute}/test_file.py | 8 +- .../api/{hypervisor => compute}/test_iou.py | 166 ++++++++-------- .../{hypervisor => compute}/test_network.py | 8 +- .../test_notification.py | 8 +- .../{hypervisor => compute}/test_project.py | 123 ++++++------ .../api/{hypervisor => compute}/test_qemu.py | 164 ++++++++-------- .../{hypervisor => compute}/test_version.py | 20 +- tests/handlers/api/compute/test_virtualbox.py | 133 +++++++++++++ .../api/{hypervisor => compute}/test_vpcs.py | 86 ++++---- .../{test_hypervisor.py => test_compute.py} | 12 +- tests/handlers/api/controller/test_vm.py | 32 +-- tests/handlers/api/hypervisor/test_docker.py | 185 ------------------ .../api/hypervisor/test_virtualbox.py | 133 ------------- tests/handlers/test_index.py | 4 +- tests/web/test_documentation.py | 16 +- 186 files changed, 1173 insertions(+), 1206 deletions(-) rename gns3server/{hypervisor => compute}/__init__.py (100%) rename gns3server/{hypervisor => compute}/adapters/__init__.py (100%) rename gns3server/{hypervisor => compute}/adapters/adapter.py (100%) rename gns3server/{hypervisor => compute}/adapters/ethernet_adapter.py (100%) rename gns3server/{hypervisor => compute}/adapters/serial_adapter.py (100%) rename gns3server/{hypervisor => compute}/base_manager.py (100%) rename gns3server/{hypervisor => compute}/base_vm.py (100%) rename gns3server/{hypervisor => compute}/docker/__init__.py (100%) rename gns3server/{hypervisor => compute}/docker/docker_error.py (100%) rename gns3server/{hypervisor => compute}/docker/docker_vm.py (100%) rename gns3server/{hypervisor => compute}/docker/resources/etc/udhcpc/default.script (100%) rename gns3server/{hypervisor => compute}/docker/resources/init.sh (100%) rename gns3server/{hypervisor => compute}/dynamips/__init__.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/__init__.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/adapter.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c1700_mb_1fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c1700_mb_wic1.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c2600_mb_1e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c2600_mb_1fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c2600_mb_2e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c2600_mb_2fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c7200_io_2fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c7200_io_fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/c7200_io_ge_e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/gt96100_fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/leopard_2fe.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/nm_16esw.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/nm_1e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/nm_1fe_tx.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/nm_4e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/nm_4t.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_2fe_tx.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_4e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_4t.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_8e.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_8t.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_a1.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_fe_tx.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_ge.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/pa_pos_oc3.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/wic_1enet.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/wic_1t.py (100%) rename gns3server/{hypervisor => compute}/dynamips/adapters/wic_2t.py (100%) rename gns3server/{hypervisor => compute}/dynamips/dynamips_device.py (100%) rename gns3server/{hypervisor => compute}/dynamips/dynamips_error.py (100%) rename gns3server/{hypervisor => compute}/dynamips/dynamips_hypervisor.py (100%) rename gns3server/{hypervisor => compute}/dynamips/dynamips_vm.py (100%) rename gns3server/{hypervisor => compute}/dynamips/hypervisor.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/__init__.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_generic_ethernet.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_linux_ethernet.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_null.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_tap.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_udp.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_unix.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nios/nio_vde.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/__init__.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/atm_switch.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/bridge.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c1700.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c2600.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c2691.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c3600.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c3725.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c3745.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/c7200.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/device.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/ethernet_hub.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/ethernet_switch.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/frame_relay_switch.py (100%) rename gns3server/{hypervisor => compute}/dynamips/nodes/router.py (100%) rename gns3server/{hypervisor => compute}/iou/__init__.py (100%) rename gns3server/{hypervisor => compute}/iou/iou_error.py (100%) rename gns3server/{hypervisor => compute}/iou/iou_vm.py (100%) rename gns3server/{hypervisor => compute}/iou/ioucon.py (100%) rename gns3server/{hypervisor => compute}/iou/utils/__init__.py (100%) rename gns3server/{hypervisor => compute}/iou/utils/iou_export.py (100%) rename gns3server/{hypervisor => compute}/iou/utils/iou_import.py (100%) rename gns3server/{hypervisor => compute}/nios/__init__.py (100%) rename gns3server/{hypervisor => compute}/nios/nio.py (100%) rename gns3server/{hypervisor => compute}/nios/nio_generic_ethernet.py (100%) rename gns3server/{hypervisor => compute}/nios/nio_nat.py (100%) rename gns3server/{hypervisor => compute}/nios/nio_tap.py (100%) rename gns3server/{hypervisor => compute}/nios/nio_udp.py (100%) rename gns3server/{hypervisor => compute}/notification_manager.py (97%) rename gns3server/{hypervisor => compute}/port_manager.py (100%) rename gns3server/{hypervisor => compute}/project.py (98%) rename gns3server/{hypervisor => compute}/project_manager.py (100%) rename gns3server/{hypervisor => compute}/qemu/__init__.py (100%) rename gns3server/{hypervisor => compute}/qemu/qcow2.py (100%) rename gns3server/{hypervisor => compute}/qemu/qemu_error.py (100%) rename gns3server/{hypervisor => compute}/qemu/qemu_vm.py (100%) rename gns3server/{hypervisor => compute}/virtualbox/__init__.py (100%) rename gns3server/{hypervisor => compute}/virtualbox/virtualbox_error.py (100%) rename gns3server/{hypervisor => compute}/virtualbox/virtualbox_vm.py (100%) rename gns3server/{hypervisor => compute}/vm_error.py (100%) rename gns3server/{hypervisor => compute}/vmware/__init__.py (99%) rename gns3server/{hypervisor => compute}/vmware/nio_vmnet.py (100%) rename gns3server/{hypervisor => compute}/vmware/vmware_error.py (100%) rename gns3server/{hypervisor => compute}/vmware/vmware_vm.py (100%) rename gns3server/{hypervisor => compute}/vpcs/__init__.py (100%) rename gns3server/{hypervisor => compute}/vpcs/vpcs_error.py (100%) rename gns3server/{hypervisor => compute}/vpcs/vpcs_vm.py (100%) rename gns3server/controller/{hypervisor.py => compute.py} (85%) rename gns3server/handlers/api/{hypervisor => compute}/__init__.py (100%) rename gns3server/handlers/api/{hypervisor => compute}/config_handler.py (100%) rename gns3server/handlers/api/{hypervisor => compute}/docker_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/dynamips_device_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/dynamips_vm_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/file_handler.py (100%) rename gns3server/handlers/api/{hypervisor => compute}/iou_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/network_handler.py (94%) rename gns3server/handlers/api/{hypervisor => compute}/notification_handler.py (95%) rename gns3server/handlers/api/{hypervisor => compute}/project_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/qemu_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/version_handler.py (100%) rename gns3server/handlers/api/{hypervisor => compute}/virtualbox_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/vmware_handler.py (99%) rename gns3server/handlers/api/{hypervisor => compute}/vpcs_handler.py (99%) rename gns3server/handlers/api/controller/{hypervisor_handler.py => compute_handler.py} (68%) rename gns3server/schemas/{hypervisor.py => compute.py} (82%) rename gns3server/templates/{hypervisor.html => compute.html} (100%) rename tests/{hypervisor => compute}/docker/test_docker.py (95%) rename tests/{hypervisor => compute}/docker/test_docker_vm.py (79%) rename tests/{hypervisor => compute}/dynamips/test_dynamips_manager.py (96%) rename tests/{hypervisor => compute}/dynamips/test_dynamips_router.py (90%) rename tests/{hypervisor => compute}/iou/test_iou_manager.py (94%) rename tests/{hypervisor => compute}/iou/test_iou_vm.py (89%) rename tests/{hypervisor => compute}/qemu/test_qemu_manager.py (89%) rename tests/{hypervisor => compute}/qemu/test_qemu_vm.py (96%) rename tests/{hypervisor => compute}/test_base_vm.py (93%) rename tests/{hypervisor => compute}/test_manager.py (92%) rename tests/{hypervisor => compute}/test_notification_manager.py (97%) rename tests/{hypervisor => compute}/test_port_manager.py (84%) rename tests/{hypervisor => compute}/test_project.py (94%) rename tests/{hypervisor => compute}/test_project_manager.py (94%) rename tests/{hypervisor => compute}/virtualbox/test_virtualbox_manager.py (93%) rename tests/{hypervisor => compute}/virtualbox/test_virtualbox_vm.py (84%) rename tests/{hypervisor => compute}/vmware/test_vmware_manager.py (96%) rename tests/{hypervisor => compute}/vmware/test_vmware_vm.py (93%) rename tests/{hypervisor => compute}/vpcs/test_vpcs_manager.py (93%) rename tests/{hypervisor => compute}/vpcs/test_vpcs_vm.py (87%) rename tests/controller/{test_hypervisor.py => test_compute.py} (52%) rename tests/handlers/api/{hypervisor => compute}/__init__.py (100%) rename tests/handlers/api/{hypervisor => compute}/test_config.py (85%) create mode 100644 tests/handlers/api/compute/test_docker.py rename tests/handlers/api/{hypervisor => compute}/test_dynamips.py (57%) rename tests/handlers/api/{hypervisor => compute}/test_file.py (83%) rename tests/handlers/api/{hypervisor => compute}/test_iou.py (55%) rename tests/handlers/api/{hypervisor => compute}/test_network.py (80%) rename tests/handlers/api/{hypervisor => compute}/test_notification.py (81%) rename tests/handlers/api/{hypervisor => compute}/test_project.py (54%) rename tests/handlers/api/{hypervisor => compute}/test_qemu.py (53%) rename tests/handlers/api/{hypervisor => compute}/test_version.py (74%) create mode 100644 tests/handlers/api/compute/test_virtualbox.py rename tests/handlers/api/{hypervisor => compute}/test_vpcs.py (53%) rename tests/handlers/api/controller/{test_hypervisor.py => test_compute.py} (74%) delete mode 100644 tests/handlers/api/hypervisor/test_docker.py delete mode 100644 tests/handlers/api/hypervisor/test_virtualbox.py diff --git a/gns3server/hypervisor/__init__.py b/gns3server/compute/__init__.py similarity index 100% rename from gns3server/hypervisor/__init__.py rename to gns3server/compute/__init__.py diff --git a/gns3server/hypervisor/adapters/__init__.py b/gns3server/compute/adapters/__init__.py similarity index 100% rename from gns3server/hypervisor/adapters/__init__.py rename to gns3server/compute/adapters/__init__.py diff --git a/gns3server/hypervisor/adapters/adapter.py b/gns3server/compute/adapters/adapter.py similarity index 100% rename from gns3server/hypervisor/adapters/adapter.py rename to gns3server/compute/adapters/adapter.py diff --git a/gns3server/hypervisor/adapters/ethernet_adapter.py b/gns3server/compute/adapters/ethernet_adapter.py similarity index 100% rename from gns3server/hypervisor/adapters/ethernet_adapter.py rename to gns3server/compute/adapters/ethernet_adapter.py diff --git a/gns3server/hypervisor/adapters/serial_adapter.py b/gns3server/compute/adapters/serial_adapter.py similarity index 100% rename from gns3server/hypervisor/adapters/serial_adapter.py rename to gns3server/compute/adapters/serial_adapter.py diff --git a/gns3server/hypervisor/base_manager.py b/gns3server/compute/base_manager.py similarity index 100% rename from gns3server/hypervisor/base_manager.py rename to gns3server/compute/base_manager.py diff --git a/gns3server/hypervisor/base_vm.py b/gns3server/compute/base_vm.py similarity index 100% rename from gns3server/hypervisor/base_vm.py rename to gns3server/compute/base_vm.py diff --git a/gns3server/hypervisor/docker/__init__.py b/gns3server/compute/docker/__init__.py similarity index 100% rename from gns3server/hypervisor/docker/__init__.py rename to gns3server/compute/docker/__init__.py diff --git a/gns3server/hypervisor/docker/docker_error.py b/gns3server/compute/docker/docker_error.py similarity index 100% rename from gns3server/hypervisor/docker/docker_error.py rename to gns3server/compute/docker/docker_error.py diff --git a/gns3server/hypervisor/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py similarity index 100% rename from gns3server/hypervisor/docker/docker_vm.py rename to gns3server/compute/docker/docker_vm.py diff --git a/gns3server/hypervisor/docker/resources/etc/udhcpc/default.script b/gns3server/compute/docker/resources/etc/udhcpc/default.script similarity index 100% rename from gns3server/hypervisor/docker/resources/etc/udhcpc/default.script rename to gns3server/compute/docker/resources/etc/udhcpc/default.script diff --git a/gns3server/hypervisor/docker/resources/init.sh b/gns3server/compute/docker/resources/init.sh similarity index 100% rename from gns3server/hypervisor/docker/resources/init.sh rename to gns3server/compute/docker/resources/init.sh diff --git a/gns3server/hypervisor/dynamips/__init__.py b/gns3server/compute/dynamips/__init__.py similarity index 100% rename from gns3server/hypervisor/dynamips/__init__.py rename to gns3server/compute/dynamips/__init__.py diff --git a/gns3server/hypervisor/dynamips/adapters/__init__.py b/gns3server/compute/dynamips/adapters/__init__.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/__init__.py rename to gns3server/compute/dynamips/adapters/__init__.py diff --git a/gns3server/hypervisor/dynamips/adapters/adapter.py b/gns3server/compute/dynamips/adapters/adapter.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/adapter.py rename to gns3server/compute/dynamips/adapters/adapter.py diff --git a/gns3server/hypervisor/dynamips/adapters/c1700_mb_1fe.py b/gns3server/compute/dynamips/adapters/c1700_mb_1fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c1700_mb_1fe.py rename to gns3server/compute/dynamips/adapters/c1700_mb_1fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/c1700_mb_wic1.py b/gns3server/compute/dynamips/adapters/c1700_mb_wic1.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c1700_mb_wic1.py rename to gns3server/compute/dynamips/adapters/c1700_mb_wic1.py diff --git a/gns3server/hypervisor/dynamips/adapters/c2600_mb_1e.py b/gns3server/compute/dynamips/adapters/c2600_mb_1e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c2600_mb_1e.py rename to gns3server/compute/dynamips/adapters/c2600_mb_1e.py diff --git a/gns3server/hypervisor/dynamips/adapters/c2600_mb_1fe.py b/gns3server/compute/dynamips/adapters/c2600_mb_1fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c2600_mb_1fe.py rename to gns3server/compute/dynamips/adapters/c2600_mb_1fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/c2600_mb_2e.py b/gns3server/compute/dynamips/adapters/c2600_mb_2e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c2600_mb_2e.py rename to gns3server/compute/dynamips/adapters/c2600_mb_2e.py diff --git a/gns3server/hypervisor/dynamips/adapters/c2600_mb_2fe.py b/gns3server/compute/dynamips/adapters/c2600_mb_2fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c2600_mb_2fe.py rename to gns3server/compute/dynamips/adapters/c2600_mb_2fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/c7200_io_2fe.py b/gns3server/compute/dynamips/adapters/c7200_io_2fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c7200_io_2fe.py rename to gns3server/compute/dynamips/adapters/c7200_io_2fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/c7200_io_fe.py b/gns3server/compute/dynamips/adapters/c7200_io_fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c7200_io_fe.py rename to gns3server/compute/dynamips/adapters/c7200_io_fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/c7200_io_ge_e.py b/gns3server/compute/dynamips/adapters/c7200_io_ge_e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/c7200_io_ge_e.py rename to gns3server/compute/dynamips/adapters/c7200_io_ge_e.py diff --git a/gns3server/hypervisor/dynamips/adapters/gt96100_fe.py b/gns3server/compute/dynamips/adapters/gt96100_fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/gt96100_fe.py rename to gns3server/compute/dynamips/adapters/gt96100_fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/leopard_2fe.py b/gns3server/compute/dynamips/adapters/leopard_2fe.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/leopard_2fe.py rename to gns3server/compute/dynamips/adapters/leopard_2fe.py diff --git a/gns3server/hypervisor/dynamips/adapters/nm_16esw.py b/gns3server/compute/dynamips/adapters/nm_16esw.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/nm_16esw.py rename to gns3server/compute/dynamips/adapters/nm_16esw.py diff --git a/gns3server/hypervisor/dynamips/adapters/nm_1e.py b/gns3server/compute/dynamips/adapters/nm_1e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/nm_1e.py rename to gns3server/compute/dynamips/adapters/nm_1e.py diff --git a/gns3server/hypervisor/dynamips/adapters/nm_1fe_tx.py b/gns3server/compute/dynamips/adapters/nm_1fe_tx.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/nm_1fe_tx.py rename to gns3server/compute/dynamips/adapters/nm_1fe_tx.py diff --git a/gns3server/hypervisor/dynamips/adapters/nm_4e.py b/gns3server/compute/dynamips/adapters/nm_4e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/nm_4e.py rename to gns3server/compute/dynamips/adapters/nm_4e.py diff --git a/gns3server/hypervisor/dynamips/adapters/nm_4t.py b/gns3server/compute/dynamips/adapters/nm_4t.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/nm_4t.py rename to gns3server/compute/dynamips/adapters/nm_4t.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_2fe_tx.py b/gns3server/compute/dynamips/adapters/pa_2fe_tx.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_2fe_tx.py rename to gns3server/compute/dynamips/adapters/pa_2fe_tx.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_4e.py b/gns3server/compute/dynamips/adapters/pa_4e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_4e.py rename to gns3server/compute/dynamips/adapters/pa_4e.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_4t.py b/gns3server/compute/dynamips/adapters/pa_4t.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_4t.py rename to gns3server/compute/dynamips/adapters/pa_4t.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_8e.py b/gns3server/compute/dynamips/adapters/pa_8e.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_8e.py rename to gns3server/compute/dynamips/adapters/pa_8e.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_8t.py b/gns3server/compute/dynamips/adapters/pa_8t.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_8t.py rename to gns3server/compute/dynamips/adapters/pa_8t.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_a1.py b/gns3server/compute/dynamips/adapters/pa_a1.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_a1.py rename to gns3server/compute/dynamips/adapters/pa_a1.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_fe_tx.py b/gns3server/compute/dynamips/adapters/pa_fe_tx.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_fe_tx.py rename to gns3server/compute/dynamips/adapters/pa_fe_tx.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_ge.py b/gns3server/compute/dynamips/adapters/pa_ge.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_ge.py rename to gns3server/compute/dynamips/adapters/pa_ge.py diff --git a/gns3server/hypervisor/dynamips/adapters/pa_pos_oc3.py b/gns3server/compute/dynamips/adapters/pa_pos_oc3.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/pa_pos_oc3.py rename to gns3server/compute/dynamips/adapters/pa_pos_oc3.py diff --git a/gns3server/hypervisor/dynamips/adapters/wic_1enet.py b/gns3server/compute/dynamips/adapters/wic_1enet.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/wic_1enet.py rename to gns3server/compute/dynamips/adapters/wic_1enet.py diff --git a/gns3server/hypervisor/dynamips/adapters/wic_1t.py b/gns3server/compute/dynamips/adapters/wic_1t.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/wic_1t.py rename to gns3server/compute/dynamips/adapters/wic_1t.py diff --git a/gns3server/hypervisor/dynamips/adapters/wic_2t.py b/gns3server/compute/dynamips/adapters/wic_2t.py similarity index 100% rename from gns3server/hypervisor/dynamips/adapters/wic_2t.py rename to gns3server/compute/dynamips/adapters/wic_2t.py diff --git a/gns3server/hypervisor/dynamips/dynamips_device.py b/gns3server/compute/dynamips/dynamips_device.py similarity index 100% rename from gns3server/hypervisor/dynamips/dynamips_device.py rename to gns3server/compute/dynamips/dynamips_device.py diff --git a/gns3server/hypervisor/dynamips/dynamips_error.py b/gns3server/compute/dynamips/dynamips_error.py similarity index 100% rename from gns3server/hypervisor/dynamips/dynamips_error.py rename to gns3server/compute/dynamips/dynamips_error.py diff --git a/gns3server/hypervisor/dynamips/dynamips_hypervisor.py b/gns3server/compute/dynamips/dynamips_hypervisor.py similarity index 100% rename from gns3server/hypervisor/dynamips/dynamips_hypervisor.py rename to gns3server/compute/dynamips/dynamips_hypervisor.py diff --git a/gns3server/hypervisor/dynamips/dynamips_vm.py b/gns3server/compute/dynamips/dynamips_vm.py similarity index 100% rename from gns3server/hypervisor/dynamips/dynamips_vm.py rename to gns3server/compute/dynamips/dynamips_vm.py diff --git a/gns3server/hypervisor/dynamips/hypervisor.py b/gns3server/compute/dynamips/hypervisor.py similarity index 100% rename from gns3server/hypervisor/dynamips/hypervisor.py rename to gns3server/compute/dynamips/hypervisor.py diff --git a/gns3server/hypervisor/dynamips/nios/__init__.py b/gns3server/compute/dynamips/nios/__init__.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/__init__.py rename to gns3server/compute/dynamips/nios/__init__.py diff --git a/gns3server/hypervisor/dynamips/nios/nio.py b/gns3server/compute/dynamips/nios/nio.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio.py rename to gns3server/compute/dynamips/nios/nio.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_generic_ethernet.py b/gns3server/compute/dynamips/nios/nio_generic_ethernet.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_generic_ethernet.py rename to gns3server/compute/dynamips/nios/nio_generic_ethernet.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_linux_ethernet.py b/gns3server/compute/dynamips/nios/nio_linux_ethernet.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_linux_ethernet.py rename to gns3server/compute/dynamips/nios/nio_linux_ethernet.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_null.py b/gns3server/compute/dynamips/nios/nio_null.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_null.py rename to gns3server/compute/dynamips/nios/nio_null.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_tap.py b/gns3server/compute/dynamips/nios/nio_tap.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_tap.py rename to gns3server/compute/dynamips/nios/nio_tap.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_udp.py b/gns3server/compute/dynamips/nios/nio_udp.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_udp.py rename to gns3server/compute/dynamips/nios/nio_udp.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_unix.py b/gns3server/compute/dynamips/nios/nio_unix.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_unix.py rename to gns3server/compute/dynamips/nios/nio_unix.py diff --git a/gns3server/hypervisor/dynamips/nios/nio_vde.py b/gns3server/compute/dynamips/nios/nio_vde.py similarity index 100% rename from gns3server/hypervisor/dynamips/nios/nio_vde.py rename to gns3server/compute/dynamips/nios/nio_vde.py diff --git a/gns3server/hypervisor/dynamips/nodes/__init__.py b/gns3server/compute/dynamips/nodes/__init__.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/__init__.py rename to gns3server/compute/dynamips/nodes/__init__.py diff --git a/gns3server/hypervisor/dynamips/nodes/atm_switch.py b/gns3server/compute/dynamips/nodes/atm_switch.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/atm_switch.py rename to gns3server/compute/dynamips/nodes/atm_switch.py diff --git a/gns3server/hypervisor/dynamips/nodes/bridge.py b/gns3server/compute/dynamips/nodes/bridge.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/bridge.py rename to gns3server/compute/dynamips/nodes/bridge.py diff --git a/gns3server/hypervisor/dynamips/nodes/c1700.py b/gns3server/compute/dynamips/nodes/c1700.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c1700.py rename to gns3server/compute/dynamips/nodes/c1700.py diff --git a/gns3server/hypervisor/dynamips/nodes/c2600.py b/gns3server/compute/dynamips/nodes/c2600.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c2600.py rename to gns3server/compute/dynamips/nodes/c2600.py diff --git a/gns3server/hypervisor/dynamips/nodes/c2691.py b/gns3server/compute/dynamips/nodes/c2691.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c2691.py rename to gns3server/compute/dynamips/nodes/c2691.py diff --git a/gns3server/hypervisor/dynamips/nodes/c3600.py b/gns3server/compute/dynamips/nodes/c3600.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c3600.py rename to gns3server/compute/dynamips/nodes/c3600.py diff --git a/gns3server/hypervisor/dynamips/nodes/c3725.py b/gns3server/compute/dynamips/nodes/c3725.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c3725.py rename to gns3server/compute/dynamips/nodes/c3725.py diff --git a/gns3server/hypervisor/dynamips/nodes/c3745.py b/gns3server/compute/dynamips/nodes/c3745.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c3745.py rename to gns3server/compute/dynamips/nodes/c3745.py diff --git a/gns3server/hypervisor/dynamips/nodes/c7200.py b/gns3server/compute/dynamips/nodes/c7200.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/c7200.py rename to gns3server/compute/dynamips/nodes/c7200.py diff --git a/gns3server/hypervisor/dynamips/nodes/device.py b/gns3server/compute/dynamips/nodes/device.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/device.py rename to gns3server/compute/dynamips/nodes/device.py diff --git a/gns3server/hypervisor/dynamips/nodes/ethernet_hub.py b/gns3server/compute/dynamips/nodes/ethernet_hub.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/ethernet_hub.py rename to gns3server/compute/dynamips/nodes/ethernet_hub.py diff --git a/gns3server/hypervisor/dynamips/nodes/ethernet_switch.py b/gns3server/compute/dynamips/nodes/ethernet_switch.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/ethernet_switch.py rename to gns3server/compute/dynamips/nodes/ethernet_switch.py diff --git a/gns3server/hypervisor/dynamips/nodes/frame_relay_switch.py b/gns3server/compute/dynamips/nodes/frame_relay_switch.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/frame_relay_switch.py rename to gns3server/compute/dynamips/nodes/frame_relay_switch.py diff --git a/gns3server/hypervisor/dynamips/nodes/router.py b/gns3server/compute/dynamips/nodes/router.py similarity index 100% rename from gns3server/hypervisor/dynamips/nodes/router.py rename to gns3server/compute/dynamips/nodes/router.py diff --git a/gns3server/hypervisor/iou/__init__.py b/gns3server/compute/iou/__init__.py similarity index 100% rename from gns3server/hypervisor/iou/__init__.py rename to gns3server/compute/iou/__init__.py diff --git a/gns3server/hypervisor/iou/iou_error.py b/gns3server/compute/iou/iou_error.py similarity index 100% rename from gns3server/hypervisor/iou/iou_error.py rename to gns3server/compute/iou/iou_error.py diff --git a/gns3server/hypervisor/iou/iou_vm.py b/gns3server/compute/iou/iou_vm.py similarity index 100% rename from gns3server/hypervisor/iou/iou_vm.py rename to gns3server/compute/iou/iou_vm.py diff --git a/gns3server/hypervisor/iou/ioucon.py b/gns3server/compute/iou/ioucon.py similarity index 100% rename from gns3server/hypervisor/iou/ioucon.py rename to gns3server/compute/iou/ioucon.py diff --git a/gns3server/hypervisor/iou/utils/__init__.py b/gns3server/compute/iou/utils/__init__.py similarity index 100% rename from gns3server/hypervisor/iou/utils/__init__.py rename to gns3server/compute/iou/utils/__init__.py diff --git a/gns3server/hypervisor/iou/utils/iou_export.py b/gns3server/compute/iou/utils/iou_export.py similarity index 100% rename from gns3server/hypervisor/iou/utils/iou_export.py rename to gns3server/compute/iou/utils/iou_export.py diff --git a/gns3server/hypervisor/iou/utils/iou_import.py b/gns3server/compute/iou/utils/iou_import.py similarity index 100% rename from gns3server/hypervisor/iou/utils/iou_import.py rename to gns3server/compute/iou/utils/iou_import.py diff --git a/gns3server/hypervisor/nios/__init__.py b/gns3server/compute/nios/__init__.py similarity index 100% rename from gns3server/hypervisor/nios/__init__.py rename to gns3server/compute/nios/__init__.py diff --git a/gns3server/hypervisor/nios/nio.py b/gns3server/compute/nios/nio.py similarity index 100% rename from gns3server/hypervisor/nios/nio.py rename to gns3server/compute/nios/nio.py diff --git a/gns3server/hypervisor/nios/nio_generic_ethernet.py b/gns3server/compute/nios/nio_generic_ethernet.py similarity index 100% rename from gns3server/hypervisor/nios/nio_generic_ethernet.py rename to gns3server/compute/nios/nio_generic_ethernet.py diff --git a/gns3server/hypervisor/nios/nio_nat.py b/gns3server/compute/nios/nio_nat.py similarity index 100% rename from gns3server/hypervisor/nios/nio_nat.py rename to gns3server/compute/nios/nio_nat.py diff --git a/gns3server/hypervisor/nios/nio_tap.py b/gns3server/compute/nios/nio_tap.py similarity index 100% rename from gns3server/hypervisor/nios/nio_tap.py rename to gns3server/compute/nios/nio_tap.py diff --git a/gns3server/hypervisor/nios/nio_udp.py b/gns3server/compute/nios/nio_udp.py similarity index 100% rename from gns3server/hypervisor/nios/nio_udp.py rename to gns3server/compute/nios/nio_udp.py diff --git a/gns3server/hypervisor/notification_manager.py b/gns3server/compute/notification_manager.py similarity index 97% rename from gns3server/hypervisor/notification_manager.py rename to gns3server/compute/notification_manager.py index d412b27d..35336623 100644 --- a/gns3server/hypervisor/notification_manager.py +++ b/gns3server/compute/notification_manager.py @@ -24,7 +24,7 @@ from ..notification_queue import NotificationQueue class NotificationManager: """ Manage the notification queue where the controller - will connect to get notifications from hypervisors + will connect to get notifications from computes """ def __init__(self): diff --git a/gns3server/hypervisor/port_manager.py b/gns3server/compute/port_manager.py similarity index 100% rename from gns3server/hypervisor/port_manager.py rename to gns3server/compute/port_manager.py diff --git a/gns3server/hypervisor/project.py b/gns3server/compute/project.py similarity index 98% rename from gns3server/hypervisor/project.py rename to gns3server/compute/project.py index 75817d46..3e7f5d9a 100644 --- a/gns3server/hypervisor/project.py +++ b/gns3server/compute/project.py @@ -130,7 +130,7 @@ class Project: @asyncio.coroutine def clean_old_path(self, old_path): """ - Called after a project location change. All the hypervisor should + Called after a project location change. All the compute should have been notified before """ if self._temporary: @@ -323,10 +323,10 @@ class Project: Closes the project, but keep information on disk """ - for module in self.hypervisor(): + for module in self.compute(): yield from module.instance().project_closing(self) yield from self._close_and_clean(self._temporary) - for module in self.hypervisor(): + for module in self.compute(): yield from module.instance().project_closed(self) @asyncio.coroutine @@ -380,7 +380,7 @@ class Project: vm = self._vms_to_destroy.pop() yield from vm.delete() self.remove_vm(vm) - for module in self.hypervisor(): + for module in self.compute(): yield from module.instance().project_committed(self) @asyncio.coroutine @@ -389,10 +389,10 @@ class Project: Removes project from disk """ - for module in self.hypervisor(): + for module in self.compute(): yield from module.instance().project_closing(self) yield from self._close_and_clean(True) - for module in self.hypervisor(): + for module in self.compute(): yield from module.instance().project_closed(self) @classmethod @@ -410,13 +410,13 @@ class Project: log.warning("Purge old temporary project {}".format(project)) shutil.rmtree(path) - def hypervisor(self): + def compute(self): """ - Returns all loaded VM hypervisor. + Returns all loaded VM compute. """ # We import it at the last time to avoid circular dependencies - from ..hypervisor import MODULES + from ..compute import MODULES return MODULES def emit(self, action, event): diff --git a/gns3server/hypervisor/project_manager.py b/gns3server/compute/project_manager.py similarity index 100% rename from gns3server/hypervisor/project_manager.py rename to gns3server/compute/project_manager.py diff --git a/gns3server/hypervisor/qemu/__init__.py b/gns3server/compute/qemu/__init__.py similarity index 100% rename from gns3server/hypervisor/qemu/__init__.py rename to gns3server/compute/qemu/__init__.py diff --git a/gns3server/hypervisor/qemu/qcow2.py b/gns3server/compute/qemu/qcow2.py similarity index 100% rename from gns3server/hypervisor/qemu/qcow2.py rename to gns3server/compute/qemu/qcow2.py diff --git a/gns3server/hypervisor/qemu/qemu_error.py b/gns3server/compute/qemu/qemu_error.py similarity index 100% rename from gns3server/hypervisor/qemu/qemu_error.py rename to gns3server/compute/qemu/qemu_error.py diff --git a/gns3server/hypervisor/qemu/qemu_vm.py b/gns3server/compute/qemu/qemu_vm.py similarity index 100% rename from gns3server/hypervisor/qemu/qemu_vm.py rename to gns3server/compute/qemu/qemu_vm.py diff --git a/gns3server/hypervisor/virtualbox/__init__.py b/gns3server/compute/virtualbox/__init__.py similarity index 100% rename from gns3server/hypervisor/virtualbox/__init__.py rename to gns3server/compute/virtualbox/__init__.py diff --git a/gns3server/hypervisor/virtualbox/virtualbox_error.py b/gns3server/compute/virtualbox/virtualbox_error.py similarity index 100% rename from gns3server/hypervisor/virtualbox/virtualbox_error.py rename to gns3server/compute/virtualbox/virtualbox_error.py diff --git a/gns3server/hypervisor/virtualbox/virtualbox_vm.py b/gns3server/compute/virtualbox/virtualbox_vm.py similarity index 100% rename from gns3server/hypervisor/virtualbox/virtualbox_vm.py rename to gns3server/compute/virtualbox/virtualbox_vm.py diff --git a/gns3server/hypervisor/vm_error.py b/gns3server/compute/vm_error.py similarity index 100% rename from gns3server/hypervisor/vm_error.py rename to gns3server/compute/vm_error.py diff --git a/gns3server/hypervisor/vmware/__init__.py b/gns3server/compute/vmware/__init__.py similarity index 99% rename from gns3server/hypervisor/vmware/__init__.py rename to gns3server/compute/vmware/__init__.py index 3dac122e..1d49f0c2 100644 --- a/gns3server/hypervisor/vmware/__init__.py +++ b/gns3server/compute/vmware/__init__.py @@ -35,10 +35,10 @@ from pkg_resources import parse_version log = logging.getLogger(__name__) -from gns3server.hypervisor.base_manager import BaseManager -from gns3server.hypervisor.vmware.vmware_vm import VMwareVM -from gns3server.hypervisor.vmware.vmware_error import VMwareError -from gns3server.hypervisor.vmware.nio_vmnet import NIOVMNET +from gns3server.compute.base_manager import BaseManager +from gns3server.compute.vmware.vmware_vm import VMwareVM +from gns3server.compute.vmware.vmware_error import VMwareError +from gns3server.compute.vmware.nio_vmnet import NIOVMNET class VMware(BaseManager): diff --git a/gns3server/hypervisor/vmware/nio_vmnet.py b/gns3server/compute/vmware/nio_vmnet.py similarity index 100% rename from gns3server/hypervisor/vmware/nio_vmnet.py rename to gns3server/compute/vmware/nio_vmnet.py diff --git a/gns3server/hypervisor/vmware/vmware_error.py b/gns3server/compute/vmware/vmware_error.py similarity index 100% rename from gns3server/hypervisor/vmware/vmware_error.py rename to gns3server/compute/vmware/vmware_error.py diff --git a/gns3server/hypervisor/vmware/vmware_vm.py b/gns3server/compute/vmware/vmware_vm.py similarity index 100% rename from gns3server/hypervisor/vmware/vmware_vm.py rename to gns3server/compute/vmware/vmware_vm.py diff --git a/gns3server/hypervisor/vpcs/__init__.py b/gns3server/compute/vpcs/__init__.py similarity index 100% rename from gns3server/hypervisor/vpcs/__init__.py rename to gns3server/compute/vpcs/__init__.py diff --git a/gns3server/hypervisor/vpcs/vpcs_error.py b/gns3server/compute/vpcs/vpcs_error.py similarity index 100% rename from gns3server/hypervisor/vpcs/vpcs_error.py rename to gns3server/compute/vpcs/vpcs_error.py diff --git a/gns3server/hypervisor/vpcs/vpcs_vm.py b/gns3server/compute/vpcs/vpcs_vm.py similarity index 100% rename from gns3server/hypervisor/vpcs/vpcs_vm.py rename to gns3server/compute/vpcs/vpcs_vm.py diff --git a/gns3server/config.py b/gns3server/config.py index a118d1bf..b91c4677 100644 --- a/gns3server/config.py +++ b/gns3server/config.py @@ -16,7 +16,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. """ -Reads the configuration file and store the settings for the server & hypervisor. +Reads the configuration file and store the settings for the controller & compute. """ import sys diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index ca2a1fd1..557ad20f 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -20,14 +20,14 @@ import aiohttp from ..config import Config from .project import Project -from .hypervisor import Hypervisor +from .compute import Compute class Controller: - """The controller manage multiple gns3 hypervisors""" + """The controller manage multiple gns3 computes""" def __init__(self): - self._hypervisors = {} + self._computes = {} self._projects = {} def isEnabled(self): @@ -38,32 +38,32 @@ class Controller: return Config.instance().get_section_config("Server").getboolean("controller") @asyncio.coroutine - def addHypervisor(self, hypervisor_id, **kwargs): + def addCompute(self, compute_id, **kwargs): """ - Add a server to the dictionnary of hypervisors controlled by GNS3 + Add a server to the dictionnary of computes controlled by GNS3 - :param kwargs: See the documentation of Hypervisor + :param kwargs: See the documentation of Compute """ - if hypervisor_id not in self._hypervisors: - hypervisor = Hypervisor(hypervisor_id=hypervisor_id, controller=self, **kwargs) - self._hypervisors[hypervisor_id] = hypervisor - return self._hypervisors[hypervisor_id] + if compute_id not in self._computes: + compute = Compute(compute_id=compute_id, controller=self, **kwargs) + self._computes[compute_id] = compute + return self._computes[compute_id] @property - def hypervisors(self): + def computes(self): """ - :returns: The dictionnary of hypervisors managed by GNS3 + :returns: The dictionnary of computes managed by GNS3 """ - return self._hypervisors + return self._computes - def getHypervisor(self, hypervisor_id): + def getCompute(self, compute_id): """ - Return an hypervisor or raise a 404 + Return an compute or raise a 404 """ try: - return self._hypervisors[hypervisor_id] + return self._computes[compute_id] except KeyError: - raise aiohttp.web.HTTPNotFound(text="Hypervisor ID {} doesn't exist".format(hypervisor_id)) + raise aiohttp.web.HTTPNotFound(text="Compute ID {} doesn't exist".format(compute_id)) @asyncio.coroutine def addProject(self, project_id=None, **kwargs): @@ -75,8 +75,8 @@ class Controller: if project_id not in self._projects: project = Project(project_id=project_id, **kwargs) self._projects[project.id] = project - for hypervisor in self._hypervisors.values(): - yield from project.addHypervisor(hypervisor) + for compute in self._computes.values(): + yield from project.addCompute(compute) return self._projects[project.id] return self._projects[project_id] @@ -95,7 +95,7 @@ class Controller: @property def projects(self): """ - :returns: The dictionnary of hypervisors managed by GNS3 + :returns: The dictionnary of computes managed by GNS3 """ return self._projects diff --git a/gns3server/controller/hypervisor.py b/gns3server/controller/compute.py similarity index 85% rename from gns3server/controller/hypervisor.py rename to gns3server/controller/compute.py index 5f2bcec4..fc39fd35 100644 --- a/gns3server/controller/hypervisor.py +++ b/gns3server/controller/compute.py @@ -29,19 +29,19 @@ import logging log = logging.getLogger(__name__) -class HypervisorError(ControllerError): +class ComputeError(ControllerError): pass -class Hypervisor: +class Compute: """ - A GNS3 hypervisor. + A GNS3 compute. """ - def __init__(self, hypervisor_id, controller=None, protocol="http", host="localhost", port=8000, user=None, password=None): + def __init__(self, compute_id, controller=None, protocol="http", host="localhost", port=8000, user=None, password=None): assert controller is not None - log.info("Create hypervisor %s", hypervisor_id) - self._id = hypervisor_id + log.info("Create compute %s", compute_id) + self._id = compute_id self._protocol = protocol self._host = host self._port = port @@ -50,11 +50,12 @@ class Hypervisor: self._connected = False self._controller = controller self._setAuth(user, password) + self._session = aiohttp.ClientSession() - # If the hypervisor is local but the hypervisor id is local + # If the compute is local but the compute id is local # it's a configuration issue - if hypervisor_id == "local" and Config.instance().get_section_config("Server")["local"] is False: - raise HypervisorError("The local hypervisor is started without --local") + if compute_id == "local" and Config.instance().get_section_config("Server")["local"] is False: + raise ComputeError("The local compute is started without --local") asyncio.async(self._connect()) @@ -71,19 +72,18 @@ class Hypervisor: self._auth = aiohttp.BasicAuth(self._user, self._password) else: self._auth = None - self._session = aiohttp.ClientSession(auth=self._auth) @property def id(self): """ - :returns: Hypervisor identifier (string) + :returns: Compute identifier (string) """ return self._id @property def host(self): """ - :returns: Hypervisor host (string) + :returns: Compute host (string) """ return self._host @@ -105,7 +105,7 @@ class Hypervisor: def __json__(self): return { - "hypervisor_id": self._id, + "compute_id": self._id, "protocol": self._protocol, "host": self._host, "port": self._port, @@ -150,10 +150,10 @@ class Hypervisor: msg = json.loads(response.data) action = msg.pop("action") event = msg.pop("event") - self._controller.emit(action, event, hypervisor_id=self.id, **msg) + self._controller.emit(action, event, compute_id=self.id, **msg) def _getUrl(self, path): - return "{}://{}:{}/v2/hypervisor{}".format(self._protocol, self._host, self._port, path) + return "{}://{}:{}/v2/compute{}".format(self._protocol, self._host, self._port, path) @asyncio.coroutine def _runHttpQuery(self, method, path, data=None): @@ -167,7 +167,7 @@ class Hypervisor: data = data.__json__() data = json.dumps(data) - response = yield from self._session.request(method, url, headers=headers, data=data) + response = yield from self._session.request(method, url, headers=headers, data=data, auth=self._auth) body = yield from response.read() if body: body = body.decode() @@ -176,11 +176,11 @@ class Hypervisor: if response.status == 400: raise aiohttp.web.HTTPBadRequest(text="Bad request {} {}".format(url, body)) elif response.status == 401: - raise aiohttp.web.HTTPUnauthorized(text="Invalid authentication for hypervisor {}".format(self.id)) + raise aiohttp.web.HTTPUnauthorized(text="Invalid authentication for compute {}".format(self.id)) elif response.status == 403: raise aiohttp.web.HTTPForbidden(text="Forbidden {} {}".format(url, body)) elif response.status == 404: - raise aiohttp.web.HTTPNotFound(text="{} not found on hypervisor".format(url)) + raise aiohttp.web.HTTPNotFound(text="{} not found on compute".format(url)) elif response.status == 409: raise aiohttp.web.HTTPConflict(text="Conflict {} {}".format(url, body)) else: diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index b3466acb..51ecc5e7 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -47,7 +47,7 @@ class Project: self._id = project_id self._path = path self._temporary = temporary - self._hypervisors = set() + self._computes = set() self._vms = {} self._links = {} self._listeners = set() @@ -69,19 +69,19 @@ class Project: return self._path @asyncio.coroutine - def addHypervisor(self, hypervisor): - self._hypervisors.add(hypervisor) - yield from hypervisor.post("/projects", self) + def addCompute(self, compute): + self._computes.add(compute) + yield from compute.post("/projects", self) @asyncio.coroutine - def addVM(self, hypervisor, vm_id, **kwargs): + def addVM(self, compute, vm_id, **kwargs): """ Create a vm or return an existing vm :param kwargs: See the documentation of VM """ if vm_id not in self._vms: - vm = VM(self, hypervisor, vm_id=vm_id, **kwargs) + vm = VM(self, compute, vm_id=vm_id, **kwargs) yield from vm.create() self._vms[vm.id] = vm return vm @@ -130,18 +130,18 @@ class Project: @asyncio.coroutine def close(self): - for hypervisor in self._hypervisors: - yield from hypervisor.post("/projects/{}/close".format(self._id)) + for compute in self._computes: + yield from compute.post("/projects/{}/close".format(self._id)) @asyncio.coroutine def commit(self): - for hypervisor in self._hypervisors: - yield from hypervisor.post("/projects/{}/commit".format(self._id)) + for compute in self._computes: + yield from compute.post("/projects/{}/commit".format(self._id)) @asyncio.coroutine def delete(self): - for hypervisor in self._hypervisors: - yield from hypervisor.delete("/projects/{}".format(self._id)) + for compute in self._computes: + yield from compute.delete("/projects/{}".format(self._id)) @contextmanager def queue(self): diff --git a/gns3server/controller/udp_link.py b/gns3server/controller/udp_link.py index 37317b8d..5133997e 100644 --- a/gns3server/controller/udp_link.py +++ b/gns3server/controller/udp_link.py @@ -40,15 +40,15 @@ class UDPLink(Link): port_number2 = self._vms[1]["port_number"] # Reserve a UDP port on both side - response = yield from vm1.hypervisor.post("/projects/{}/ports/udp".format(self._project.id)) + response = yield from vm1.compute.post("/projects/{}/ports/udp".format(self._project.id)) self._vm1_port = response.json["udp_port"] - response = yield from vm2.hypervisor.post("/projects/{}/ports/udp".format(self._project.id)) + response = yield from vm2.compute.post("/projects/{}/ports/udp".format(self._project.id)) self._vm2_port = response.json["udp_port"] # Create the tunnel on both side data = { "lport": self._vm1_port, - "rhost": vm2.hypervisor.host, + "rhost": vm2.compute.host, "rport": self._vm2_port, "type": "nio_udp" } @@ -56,7 +56,7 @@ class UDPLink(Link): data = { "lport": self._vm2_port, - "rhost": vm1.hypervisor.host, + "rhost": vm1.compute.host, "rport": self._vm1_port, "type": "nio_udp" } diff --git a/gns3server/controller/vm.py b/gns3server/controller/vm.py index 18ac6e5b..23ca7840 100644 --- a/gns3server/controller/vm.py +++ b/gns3server/controller/vm.py @@ -23,10 +23,10 @@ import uuid class VM: - def __init__(self, project, hypervisor, vm_id=None, vm_type=None, name=None, console=None, console_type="telnet", properties={}): + def __init__(self, project, compute, vm_id=None, vm_type=None, name=None, console=None, console_type="telnet", properties={}): """ :param project: Project of the VM - :param hypervisor: Hypervisor server where the server will run + :param compute: Hypervisor server where the server will run :param vm_id: UUID of the vm. Integer id :param vm_type: Type of emulator :param name: Name of the vm @@ -42,7 +42,7 @@ class VM: self._name = name self._project = project - self._hypervisor = hypervisor + self._compute = compute self._vm_type = vm_type self._console = console self._console_type = console_type @@ -77,15 +77,15 @@ class VM: return self._project @property - def hypervisor(self): - return self._hypervisor + def compute(self): + return self._compute @property def host(self): """ :returns: Domain or ip for console connection """ - return self._hypervisor.host + return self._compute.host @asyncio.coroutine def create(self): @@ -100,7 +100,7 @@ class VM: if data[key] is None: del data[key] - response = yield from self._hypervisor.post("/projects/{}/{}/vms".format(self._project.id, self._vm_type), data=data) + response = yield from self._compute.post("/projects/{}/{}/vms".format(self._project.id, self._vm_type), data=data) for key, value in response.json.items(): if key == "console": @@ -132,22 +132,25 @@ class VM: yield from self.post("/suspend") @asyncio.coroutine - def post(self, path, data={}): + def post(self, path, data=None): """ HTTP post on the VM """ - return (yield from self._hypervisor.post("/projects/{}/{}/vms/{}{}".format(self._project.id, self._vm_type, self._id, path), data=data)) + if data: + return (yield from self._compute.post("/projects/{}/{}/vms/{}{}".format(self._project.id, self._vm_type, self._id, path), data=data)) + else: + return (yield from self._compute.post("/projects/{}/{}/vms/{}{}".format(self._project.id, self._vm_type, self._id, path))) @asyncio.coroutine def delete(self, path): """ HTTP post on the VM """ - return (yield from self._hypervisor.delete("/projects/{}/{}/vms/{}{}".format(self._project.id, self._vm_type, self._id, path))) + return (yield from self._compute.delete("/projects/{}/{}/vms/{}{}".format(self._project.id, self._vm_type, self._id, path))) def __json__(self): return { - "hypervisor_id": self._hypervisor.id, + "compute_id": self._compute.id, "project_id": self._project.id, "vm_id": self._id, "vm_type": self._vm_type, diff --git a/gns3server/handlers/__init__.py b/gns3server/handlers/__init__.py index 6b55323c..a0f7e11a 100644 --- a/gns3server/handlers/__init__.py +++ b/gns3server/handlers/__init__.py @@ -19,4 +19,4 @@ from gns3server.handlers.upload_handler import UploadHandler from gns3server.handlers.index_handler import IndexHandler from gns3server.handlers.api.controller import * -from gns3server.handlers.api.hypervisor import * +from gns3server.handlers.api.compute import * diff --git a/gns3server/handlers/api/hypervisor/__init__.py b/gns3server/handlers/api/compute/__init__.py similarity index 100% rename from gns3server/handlers/api/hypervisor/__init__.py rename to gns3server/handlers/api/compute/__init__.py diff --git a/gns3server/handlers/api/hypervisor/config_handler.py b/gns3server/handlers/api/compute/config_handler.py similarity index 100% rename from gns3server/handlers/api/hypervisor/config_handler.py rename to gns3server/handlers/api/compute/config_handler.py diff --git a/gns3server/handlers/api/hypervisor/docker_handler.py b/gns3server/handlers/api/compute/docker_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/docker_handler.py rename to gns3server/handlers/api/compute/docker_handler.py index 6964fb26..e54af945 100644 --- a/gns3server/handlers/api/hypervisor/docker_handler.py +++ b/gns3server/handlers/api/compute/docker_handler.py @@ -19,7 +19,7 @@ import os from aiohttp.web import HTTPConflict from ....web.route import Route -from ....hypervisor.docker import Docker +from ....compute.docker import Docker from ....schemas.docker import ( DOCKER_CREATE_SCHEMA, diff --git a/gns3server/handlers/api/hypervisor/dynamips_device_handler.py b/gns3server/handlers/api/compute/dynamips_device_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/dynamips_device_handler.py rename to gns3server/handlers/api/compute/dynamips_device_handler.py index 41fb2e52..3bfc96fc 100644 --- a/gns3server/handlers/api/hypervisor/dynamips_device_handler.py +++ b/gns3server/handlers/api/compute/dynamips_device_handler.py @@ -23,7 +23,7 @@ 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 ....hypervisor.dynamips import Dynamips +from ....compute.dynamips import Dynamips class DynamipsDeviceHandler: diff --git a/gns3server/handlers/api/hypervisor/dynamips_vm_handler.py b/gns3server/handlers/api/compute/dynamips_vm_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/dynamips_vm_handler.py rename to gns3server/handlers/api/compute/dynamips_vm_handler.py index dd381f23..c1a026c0 100644 --- a/gns3server/handlers/api/hypervisor/dynamips_vm_handler.py +++ b/gns3server/handlers/api/compute/dynamips_vm_handler.py @@ -27,9 +27,9 @@ 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 ....hypervisor.dynamips import Dynamips -from ....hypervisor.dynamips.dynamips_error import DynamipsError -from ....hypervisor.project_manager import ProjectManager +from ....compute.dynamips import Dynamips +from ....compute.dynamips.dynamips_error import DynamipsError +from ....compute.project_manager import ProjectManager DEFAULT_CHASSIS = { "c1700": "1720", diff --git a/gns3server/handlers/api/hypervisor/file_handler.py b/gns3server/handlers/api/compute/file_handler.py similarity index 100% rename from gns3server/handlers/api/hypervisor/file_handler.py rename to gns3server/handlers/api/compute/file_handler.py diff --git a/gns3server/handlers/api/hypervisor/iou_handler.py b/gns3server/handlers/api/compute/iou_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/iou_handler.py rename to gns3server/handlers/api/compute/iou_handler.py index 466054e8..f816471c 100644 --- a/gns3server/handlers/api/hypervisor/iou_handler.py +++ b/gns3server/handlers/api/compute/iou_handler.py @@ -27,7 +27,7 @@ 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 ....hypervisor.iou import IOU +from ....compute.iou import IOU class IOUHandler: diff --git a/gns3server/handlers/api/hypervisor/network_handler.py b/gns3server/handlers/api/compute/network_handler.py similarity index 94% rename from gns3server/handlers/api/hypervisor/network_handler.py rename to gns3server/handlers/api/compute/network_handler.py index 28e90f09..e2da87ad 100644 --- a/gns3server/handlers/api/hypervisor/network_handler.py +++ b/gns3server/handlers/api/compute/network_handler.py @@ -16,8 +16,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. from ....web.route import Route -from ....hypervisor.port_manager import PortManager -from ....hypervisor.project_manager import ProjectManager +from ....compute.port_manager import PortManager +from ....compute.project_manager import ProjectManager from ....utils.interfaces import interfaces diff --git a/gns3server/handlers/api/hypervisor/notification_handler.py b/gns3server/handlers/api/compute/notification_handler.py similarity index 95% rename from gns3server/handlers/api/hypervisor/notification_handler.py rename to gns3server/handlers/api/compute/notification_handler.py index 46a04f19..e0903f29 100644 --- a/gns3server/handlers/api/hypervisor/notification_handler.py +++ b/gns3server/handlers/api/compute/notification_handler.py @@ -18,7 +18,7 @@ import asyncio from ....web.route import Route -from ....hypervisor.notification_manager import NotificationManager +from ....compute.notification_manager import NotificationManager from aiohttp.web import WebSocketResponse diff --git a/gns3server/handlers/api/hypervisor/project_handler.py b/gns3server/handlers/api/compute/project_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/project_handler.py rename to gns3server/handlers/api/compute/project_handler.py index 7af2eb57..24991ba3 100644 --- a/gns3server/handlers/api/hypervisor/project_handler.py +++ b/gns3server/handlers/api/compute/project_handler.py @@ -24,8 +24,8 @@ import tempfile 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 ....hypervisor.project_manager import ProjectManager -from ....hypervisor import MODULES +from ....compute.project_manager import ProjectManager +from ....compute import MODULES import logging log = logging.getLogger() diff --git a/gns3server/handlers/api/hypervisor/qemu_handler.py b/gns3server/handlers/api/compute/qemu_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/qemu_handler.py rename to gns3server/handlers/api/compute/qemu_handler.py index 370826d0..f376217c 100644 --- a/gns3server/handlers/api/hypervisor/qemu_handler.py +++ b/gns3server/handlers/api/compute/qemu_handler.py @@ -20,7 +20,7 @@ import os.path from aiohttp.web import HTTPConflict from ....web.route import Route -from ....hypervisor.project_manager import ProjectManager +from ....compute.project_manager import ProjectManager from ....schemas.nio import NIO_SCHEMA from ....schemas.qemu import QEMU_CREATE_SCHEMA from ....schemas.qemu import QEMU_UPDATE_SCHEMA @@ -30,7 +30,7 @@ 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 ....hypervisor.qemu import Qemu +from ....compute.qemu import Qemu from ....config import Config diff --git a/gns3server/handlers/api/hypervisor/version_handler.py b/gns3server/handlers/api/compute/version_handler.py similarity index 100% rename from gns3server/handlers/api/hypervisor/version_handler.py rename to gns3server/handlers/api/compute/version_handler.py diff --git a/gns3server/handlers/api/hypervisor/virtualbox_handler.py b/gns3server/handlers/api/compute/virtualbox_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/virtualbox_handler.py rename to gns3server/handlers/api/compute/virtualbox_handler.py index 7065a20a..ccfd2311 100644 --- a/gns3server/handlers/api/hypervisor/virtualbox_handler.py +++ b/gns3server/handlers/api/compute/virtualbox_handler.py @@ -24,8 +24,8 @@ 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 ....hypervisor.virtualbox import VirtualBox -from ....hypervisor.project_manager import ProjectManager +from ....compute.virtualbox import VirtualBox +from ....compute.project_manager import ProjectManager class VirtualBoxHandler: diff --git a/gns3server/handlers/api/hypervisor/vmware_handler.py b/gns3server/handlers/api/compute/vmware_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/vmware_handler.py rename to gns3server/handlers/api/compute/vmware_handler.py index faecf764..7f00e4fa 100644 --- a/gns3server/handlers/api/hypervisor/vmware_handler.py +++ b/gns3server/handlers/api/compute/vmware_handler.py @@ -24,8 +24,8 @@ 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 ....hypervisor.vmware import VMware -from ....hypervisor.project_manager import ProjectManager +from ....compute.vmware import VMware +from ....compute.project_manager import ProjectManager class VMwareHandler: diff --git a/gns3server/handlers/api/hypervisor/vpcs_handler.py b/gns3server/handlers/api/compute/vpcs_handler.py similarity index 99% rename from gns3server/handlers/api/hypervisor/vpcs_handler.py rename to gns3server/handlers/api/compute/vpcs_handler.py index c3256cb5..8abd225e 100644 --- a/gns3server/handlers/api/hypervisor/vpcs_handler.py +++ b/gns3server/handlers/api/compute/vpcs_handler.py @@ -21,7 +21,7 @@ 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 ....hypervisor.vpcs import VPCS +from ....compute.vpcs import VPCS class VPCSHandler: diff --git a/gns3server/handlers/api/controller/__init__.py b/gns3server/handlers/api/controller/__init__.py index 9ddd4f7b..09520889 100644 --- a/gns3server/handlers/api/controller/__init__.py +++ b/gns3server/handlers/api/controller/__init__.py @@ -15,7 +15,7 @@ # 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 .hypervisor_handler import HypervisorHandler +from .compute_handler import ComputeHandler from .project_handler import ProjectHandler from .version_handler import VersionHandler from .vm_handler import VMHandler diff --git a/gns3server/handlers/api/controller/hypervisor_handler.py b/gns3server/handlers/api/controller/compute_handler.py similarity index 68% rename from gns3server/handlers/api/controller/hypervisor_handler.py rename to gns3server/handlers/api/controller/compute_handler.py index 6250286f..fcebc552 100644 --- a/gns3server/handlers/api/controller/hypervisor_handler.py +++ b/gns3server/handlers/api/controller/compute_handler.py @@ -20,47 +20,47 @@ from aiohttp.web import HTTPForbidden from ....web.route import Route from ....config import Config -from ....hypervisor.project_manager import ProjectManager -from ....schemas.hypervisor import HYPERVISOR_CREATE_SCHEMA, HYPERVISOR_OBJECT_SCHEMA +from ....compute.project_manager import ProjectManager +from ....schemas.compute import COMPUTE_CREATE_SCHEMA, COMPUTE_OBJECT_SCHEMA from ....controller import Controller -from ....controller.hypervisor import Hypervisor +from ....controller.compute import Compute import logging log = logging.getLogger(__name__) -class HypervisorHandler: - """API entry points for hypervisor management.""" +class ComputeHandler: + """API entry points for compute management.""" @classmethod @Route.post( - r"/hypervisors", - description="Register a hypervisor", + r"/computes", + description="Register a compute", status_codes={ - 201: "Hypervisor added" + 201: "Compute added" }, - input=HYPERVISOR_CREATE_SCHEMA, - output=HYPERVISOR_OBJECT_SCHEMA) + input=COMPUTE_CREATE_SCHEMA, + output=COMPUTE_OBJECT_SCHEMA) def create(request, response): - hypervisor = yield from Controller.instance().addHypervisor(**request.json) + compute = yield from Controller.instance().addCompute(**request.json) response.set_status(201) - response.json(hypervisor) + response.json(compute) @classmethod @Route.post( - r"/hypervisors/shutdown", - description="Shutdown the local hypervisor", + r"/computes/shutdown", + description="Shutdown the local compute", status_codes={ - 201: "Hypervisor is shutting down", - 403: "Hypervisor shutdown refused" + 201: "Compute is shutting down", + 403: "Compute shutdown refused" }) def shutdown(request, response): config = Config.instance() - if config.get_section_config("Hypervisor").getboolean("local", False) is False: - raise HTTPForbidden(text="You can only stop a local hypervisor") + if config.get_section_config("Server").getboolean("local", False) is False: + raise HTTPForbidden(text="You can only stop a local server") # close all the projects first pm = ProjectManager.instance() @@ -79,7 +79,7 @@ class HypervisorHandler: log.error("Could not close project {}".format(e), exc_info=1) continue - # then shutdown the hypervisor itself + # then shutdown the compute itself from gns3server.web.web_server import WebServer server = WebServer.instance() asyncio.async(server.shutdown_server()) diff --git a/gns3server/handlers/api/controller/vm_handler.py b/gns3server/handlers/api/controller/vm_handler.py index b7655af6..dd259cbc 100644 --- a/gns3server/handlers/api/controller/vm_handler.py +++ b/gns3server/handlers/api/controller/vm_handler.py @@ -42,9 +42,9 @@ class VMHandler: def create(request, response): controller = Controller.instance() - hypervisor = controller.getHypervisor(request.json.pop("hypervisor_id")) + compute = controller.getCompute(request.json.pop("compute_id")) project = controller.getProject(request.match_info["project_id"]) - vm = yield from project.addVM(hypervisor, request.json.pop("vm_id", None), **request.json) + vm = yield from project.addVM(compute, request.json.pop("vm_id", None), **request.json) response.set_status(201) response.json(vm) diff --git a/gns3server/handlers/index_handler.py b/gns3server/handlers/index_handler.py index 08489b13..bba7f25d 100644 --- a/gns3server/handlers/index_handler.py +++ b/gns3server/handlers/index_handler.py @@ -17,8 +17,8 @@ from ..web.route import Route from ..controller import Controller -from ..hypervisor.port_manager import PortManager -from ..hypervisor.project_manager import ProjectManager +from ..compute.port_manager import PortManager +from ..compute.project_manager import ProjectManager from ..version import __version__ @@ -34,14 +34,15 @@ class IndexHandler: @classmethod @Route.get( - r"/hypervisor", + r"/compute", description="Ressources used by GNS3 Hypervisor" ) - def hypervisor(request, response): - response.template("hypervisor.html", + def compute(request, response): + response.template("compute.html", port_manager=PortManager.instance(), project_manager=ProjectManager.instance() ) + @classmethod @Route.get( r"/controller", diff --git a/gns3server/main.py b/gns3server/main.py index 85a72dec..e1f3aa44 100644 --- a/gns3server/main.py +++ b/gns3server/main.py @@ -21,7 +21,7 @@ Entry point of the server. It's support daemonize the process """ # WARNING -# Due to buggy user machines we choose to put this as the first loading hypervisor +# Due to buggy user machines we choose to put this as the first loading # otherwise the egg cache is initialized in his standard location and # if is not writetable the application crash. It's the user fault # because one day the user as used sudo to run an egg and break his diff --git a/gns3server/run.py b/gns3server/run.py index 9338e73b..5eb87609 100644 --- a/gns3server/run.py +++ b/gns3server/run.py @@ -32,7 +32,7 @@ from gns3server.web.web_server import WebServer from gns3server.web.logger import init_logger from gns3server.version import __version__ from gns3server.config import Config -from gns3server.hypervisor.project import Project +from gns3server.compute.project import Project from gns3server.crash_report import CrashReport import logging @@ -99,7 +99,6 @@ def parse_arguments(argv): parser.add_argument("-A", "--allow", action="store_true", help="allow remote connections to local console ports") parser.add_argument("-q", "--quiet", action="store_true", help="do not show logs on stdout") parser.add_argument("-d", "--debug", action="store_true", help="show debug logs") - parser.add_argument("--live", action="store_true", help="enable code live reload") parser.add_argument("--shell", action="store_true", help="start a shell inside the server (debugging purpose only you need to install ptpython before)") parser.add_argument("--log", help="send output to logfile instead of console") parser.add_argument("--daemon", action="store_true", help="start as a daemon") @@ -122,7 +121,6 @@ def parse_arguments(argv): "allow": config.getboolean("allow_remote_console", False), "quiet": config.getboolean("quiet", False), "debug": config.getboolean("debug", False), - "live": config.getboolean("live", False), "logfile": config.getboolean("logfile", ""), } @@ -144,7 +142,6 @@ def set_config(args): server_config["certkey"] = args.certkey server_config["record"] = args.record server_config["debug"] = str(args.debug) - server_config["live"] = str(args.live) server_config["shell"] = str(args.shell) config.set_section_config("Server", server_config) diff --git a/gns3server/schemas/hypervisor.py b/gns3server/schemas/compute.py similarity index 82% rename from gns3server/schemas/hypervisor.py rename to gns3server/schemas/compute.py index ab91307d..80f5d5de 100644 --- a/gns3server/schemas/hypervisor.py +++ b/gns3server/schemas/compute.py @@ -16,12 +16,12 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -HYPERVISOR_CREATE_SCHEMA = { +COMPUTE_CREATE_SCHEMA = { "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Request validation to register a GNS3 hypervisor instance", + "description": "Request validation to register a GNS3 compute instance", "type": "object", "properties": { - "hypervisor_id": { + "compute_id": { "description": "Server identifier", "type": "string" }, @@ -47,15 +47,15 @@ HYPERVISOR_CREATE_SCHEMA = { } }, "additionalProperties": False, - "required": ["hypervisor_id", "protocol", "host", "port"] + "required": ["compute_id", "protocol", "host", "port"] } -HYPERVISOR_OBJECT_SCHEMA = { +COMPUTE_OBJECT_SCHEMA = { "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Request validation to a GNS3 hypervisor object instance", + "description": "Request validation to a GNS3 compute object instance", "type": "object", "properties": { - "hypervisor_id": { + "compute_id": { "description": "Server identifier", "type": "string" }, @@ -76,14 +76,14 @@ HYPERVISOR_OBJECT_SCHEMA = { "type": "string" }, "connected": { - "description": "True if controller is connected to the hypervisor", + "description": "True if controller is connected to the compute", "type": "boolean" }, "version": { - "description": "Version of the GNS3 remote hypervisor", + "description": "Version of the GNS3 remote compute", "type": ["string", "null"] } }, "additionalProperties": False, - "required": ["hypervisor_id", "protocol", "host", "port"] + "required": ["compute_id", "protocol", "host", "port"] } diff --git a/gns3server/schemas/vm.py b/gns3server/schemas/vm.py index 4c54b26f..89c9c8b5 100644 --- a/gns3server/schemas/vm.py +++ b/gns3server/schemas/vm.py @@ -69,7 +69,7 @@ VM_OBJECT_SCHEMA = { "description": "A VM object", "type": "object", "properties": { - "hypervisor_id": { + "compute_id": { "description": "Hypervisor identifier", "type": "string" }, @@ -109,5 +109,5 @@ VM_OBJECT_SCHEMA = { } }, "additionalProperties": False, - "required": ["name", "vm_type", "hypervisor_id"] + "required": ["name", "vm_type", "compute_id"] } diff --git a/gns3server/templates/hypervisor.html b/gns3server/templates/compute.html similarity index 100% rename from gns3server/templates/hypervisor.html rename to gns3server/templates/compute.html diff --git a/gns3server/templates/controller.html b/gns3server/templates/controller.html index f2315dea..a9064f16 100644 --- a/gns3server/templates/controller.html +++ b/gns3server/templates/controller.html @@ -19,24 +19,23 @@ in futur GNS3 versions. <tr> <td><a href="/projects/{{project.id}}">{{project.name}}</a></td> <td><a href="/projects/{{project.id}}">{{project.id}}</a></td> - <td>{{project.vms|length}}</td> - <td>{{project.links|length}}</td> + <td>{{project.vms|length}}</td> + <td>{{project.links|length}}</td> </tr> {% endfor %} </table> -<h2>Hypervisors</h2> +<h2>Computes</h2> <table border="1"> <tr> <th>ID</td> </tr> -{% for hypervisor in controller.hypervisors.values() %} +{% for compute in controller.computes.values() %} <tr> - <td>{{hypervisor.id}}</td> + <td>{{compute.id}}</td> </tr> {% endfor %} </table> {%endblock%} - diff --git a/gns3server/web/documentation.py b/gns3server/web/documentation.py index 31f9f744..3f8d0baa 100644 --- a/gns3server/web/documentation.py +++ b/gns3server/web/documentation.py @@ -36,7 +36,7 @@ class Documentation(object): self._directory = directory def write(self): - self.write_documentation("hypervisor") + self.write_documentation("compute") # Controller documentation self.write_documentation("controller") @@ -49,8 +49,8 @@ class Documentation(object): for handler_name in sorted(self._documentation): if "controller." in handler_name: server_type = "controller" - elif "hypervisor." in handler_name: - server_type = "hypervisor" + elif "compute" in handler_name: + server_type = "compute" else: server_type = "root" @@ -122,7 +122,7 @@ class Documentation(object): f.write("\n\n.. literalinclude:: ../../../examples/{}\n\n".format(query_path)) def _file_path(self, path): - path = path.replace("hypervisor", "") + path = path.replace("compute", "") path = path.replace("controller", "") return re.sub("^v2", "", re.sub("[^a-z0-9]", "", path)) diff --git a/gns3server/web/route.py b/gns3server/web/route.py index cf89ca0f..4fa56339 100644 --- a/gns3server/web/route.py +++ b/gns3server/web/route.py @@ -25,7 +25,7 @@ import traceback log = logging.getLogger(__name__) -from ..hypervisor.vm_error import VMError +from ..compute.vm_error import VMError from ..controller.controller_error import ControllerError from ..ubridge.ubridge_error import UbridgeError from .response import Response @@ -127,8 +127,8 @@ class Route(object): # Add the type of server to the route if "controller" in func.__module__: route = "/v{version}{path}".format(path=path, version=api_version) - elif "hypervisor" in func.__module__: - route = "/v{version}/hypervisor{path}".format(path=path, version=api_version) + elif "compute" in func.__module__: + route = "/v{version}/compute{path}".format(path=path, version=api_version) else: route = path @@ -243,7 +243,7 @@ class Route(object): if vm_id is None: vm_id = request.match_info["device_id"] - if "hypervisor" in request.path: + if "compute" in request.path: type = "compute" else: type = "controller" diff --git a/gns3server/web/web_server.py b/gns3server/web/web_server.py index ab921f37..348ede1d 100644 --- a/gns3server/web/web_server.py +++ b/gns3server/web/web_server.py @@ -32,8 +32,8 @@ import atexit from .route import Route from .request_handler import RequestHandler from ..config import Config -from ..hypervisor import MODULES -from ..hypervisor.port_manager import PortManager +from ..compute import MODULES +from ..compute.port_manager import PortManager # do not delete this import import gns3server.handlers @@ -124,34 +124,6 @@ class WebServer: else: self._loop.add_signal_handler(getattr(signal, signal_name), callback) - def _reload_hook(self): - - @asyncio.coroutine - def reload(): - - log.info("Reloading") - yield from self.shutdown_server() - os.execv(sys.executable, [sys.executable] + sys.argv) - - # code extracted from tornado - for module in sys.hypervisor.values(): - # Some hypervisor play games with sys.hypervisor (e.g. email/__init__.py - # in the standard library), and occasionally this can cause strange - # failures in getattr. Just ignore anything that's not an ordinary - # module. - if not isinstance(module, types.ModuleType): - continue - path = getattr(module, "__file__", None) - if not path: - continue - if path.endswith(".pyc") or path.endswith(".pyo"): - path = path[:-1] - modified = os.stat(path).st_mtime - if modified > self._start_time: - log.debug("File {} has been modified".format(path)) - asyncio.async(reload()) - self._loop.call_later(1, self._reload_hook) - def _create_ssl_context(self, server_config): import ssl @@ -245,10 +217,6 @@ class WebServer: self._signal_handling() self._exit_handling() - if server_config.getboolean("live"): - log.info("Code live reload is enabled, watching for file changes") - self._loop.call_later(1, self._reload_hook) - if server_config.getboolean("shell"): asyncio.async(self.start_shell()) diff --git a/tests/hypervisor/docker/test_docker.py b/tests/compute/docker/test_docker.py similarity index 95% rename from tests/hypervisor/docker/test_docker.py rename to tests/compute/docker/test_docker.py index 396f1b58..9d878198 100644 --- a/tests/hypervisor/docker/test_docker.py +++ b/tests/compute/docker/test_docker.py @@ -20,8 +20,8 @@ import asyncio from unittest.mock import MagicMock from tests.utils import asyncio_patch -from gns3server.hypervisor.docker import Docker -from gns3server.hypervisor.docker.docker_error import DockerError +from gns3server.compute.docker import Docker +from gns3server.compute.docker.docker_error import DockerError def test_query_success(loop): @@ -125,7 +125,7 @@ def test_list_images(loop): } ] - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: images = loop.run_until_complete(asyncio.async(Docker.instance().list_images())) mock.assert_called_with("GET", "images/json", params={"all": 0}) assert len(images) == 5 diff --git a/tests/hypervisor/docker/test_docker_vm.py b/tests/compute/docker/test_docker_vm.py similarity index 79% rename from tests/hypervisor/docker/test_docker_vm.py rename to tests/compute/docker/test_docker_vm.py index 79bc1b0c..be06ff9a 100644 --- a/tests/hypervisor/docker/test_docker_vm.py +++ b/tests/compute/docker/test_docker_vm.py @@ -22,9 +22,9 @@ import os from tests.utils import asyncio_patch, AsyncioMagicMock from gns3server.ubridge.ubridge_error import UbridgeNamespaceError -from gns3server.hypervisor.docker.docker_vm import DockerVM -from gns3server.hypervisor.docker.docker_error import * -from gns3server.hypervisor.docker import Docker +from gns3server.compute.docker.docker_vm import DockerVM +from gns3server.compute.docker.docker_error import * +from gns3server.compute.docker import Docker from gns3server.utils.get_resource import get_resource @@ -79,8 +79,8 @@ def test_create(loop, project, manager): "Id": "e90e34656806", "Warnings": [] } - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu") loop.run_until_complete(asyncio.async(vm.create())) mock.assert_called_with("POST", "containers/create", data={ @@ -115,8 +115,8 @@ def test_create_vnc(loop, project, manager): "Warnings": [] } - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu", console_type="vnc", console=5900) vm._start_vnc = MagicMock() vm._display = 42 @@ -155,8 +155,8 @@ def test_create_start_cmd(loop, project, manager): "Id": "e90e34656806", "Warnings": [] } - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu") vm._start_command = "/bin/ls" loop.run_until_complete(asyncio.async(vm.create())) @@ -191,8 +191,8 @@ def test_create_environment(loop, project, manager): "Id": "e90e34656806", "Warnings": [] } - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu") vm.environment = "YES=1\nNO=0" loop.run_until_complete(asyncio.async(vm.create())) @@ -243,8 +243,8 @@ def test_create_image_not_available(loop, project, manager): vm._get_image_informations = MagicMock() vm._get_image_informations.side_effect = informations - with asyncio_patch("gns3server.hypervisor.docker.DockerVM.pull_image", return_value=True) as mock_pull: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.DockerVM.pull_image", return_value=True) as mock_pull: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: loop.run_until_complete(asyncio.async(vm.create())) mock.assert_called_with("POST", "containers/create", data={ "Tty": True, @@ -286,17 +286,17 @@ def test_get_container_state(loop, vm): "StartedAt": "2015-01-06T15:47:32.072697474Z" } } - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: assert loop.run_until_complete(asyncio.async(vm._get_container_state())) == "running" response["State"]["Running"] = False response["State"]["Paused"] = True - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: assert loop.run_until_complete(asyncio.async(vm._get_container_state())) == "paused" response["State"]["Running"] = False response["State"]["Paused"] = False - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: assert loop.run_until_complete(asyncio.async(vm._get_container_state())) == "exited" @@ -307,17 +307,17 @@ def test_is_running(loop, vm): "Paused": False } } - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: assert loop.run_until_complete(asyncio.async(vm.is_running())) is False response["State"]["Running"] = True - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: assert loop.run_until_complete(asyncio.async(vm.is_running())) is True def test_pause(loop, vm): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock: loop.run_until_complete(asyncio.async(vm.pause())) mock.assert_called_with("POST", "containers/e90e34656842/pause") @@ -326,7 +326,7 @@ def test_pause(loop, vm): def test_unpause(loop, vm): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock: loop.run_until_complete(asyncio.async(vm.unpause())) mock.assert_called_with("POST", "containers/e90e34656842/unpause") @@ -349,7 +349,7 @@ def test_start(loop, vm, manager, free_console_port): nio = manager.create_nio(0, {"type": "nio_udp", "lport": free_console_port, "rport": free_console_port, "rhost": "127.0.0.1"}) loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(0, nio))) - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.start())) mock_query.assert_called_with("POST", "containers/e90e34656842/start") @@ -368,12 +368,12 @@ def test_start_namespace_failed(loop, vm, manager, free_console_port): nio = manager.create_nio(0, {"type": "nio_udp", "lport": free_console_port, "rport": free_console_port, "rhost": "127.0.0.1"}) loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(0, nio))) - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._start_ubridge") as mock_start_ubridge: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._add_ubridge_connection", side_effect=UbridgeNamespaceError()) as mock_add_ubridge_connection: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_log", return_value='Hello not available') as mock_log: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: + with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection", side_effect=UbridgeNamespaceError()) as mock_add_ubridge_connection: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_log", return_value='Hello not available') as mock_log: with pytest.raises(DockerError): loop.run_until_complete(asyncio.async(vm.start())) @@ -392,12 +392,12 @@ def test_start_without_nio(loop, vm, manager, free_console_port): assert vm.status != "started" vm.adapters = 1 - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._start_ubridge") as mock_start_ubridge: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._add_ubridge_connection") as mock_add_ubridge_connection: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._start_console") as mock_start_console: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: + with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection") as mock_add_ubridge_connection: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_console") as mock_start_console: loop.run_until_complete(asyncio.async(vm.start())) mock_query.assert_called_with("POST", "containers/e90e34656842/start") @@ -409,8 +409,8 @@ def test_start_without_nio(loop, vm, manager, free_console_port): def test_start_unpause(loop, vm, manager, free_console_port): - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="paused"): - with asyncio_patch("gns3server.hypervisor.docker.DockerVM.unpause", return_value="paused") as mock: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="paused"): + with asyncio_patch("gns3server.compute.docker.DockerVM.unpause", return_value="paused") as mock: loop.run_until_complete(asyncio.async(vm.start())) assert mock.called assert vm.status == "started" @@ -418,7 +418,7 @@ def test_start_unpause(loop, vm, manager, free_console_port): def test_restart(loop, vm): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock: loop.run_until_complete(asyncio.async(vm.restart())) mock.assert_called_with("POST", "containers/e90e34656842/restart") @@ -428,8 +428,8 @@ def test_stop(loop, vm): vm._ubridge_hypervisor = MagicMock() vm._ubridge_hypervisor.is_running.return_value = True - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="running"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="running"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.stop())) mock_query.assert_called_with("POST", "containers/e90e34656842/stop", params={"t": 5}) assert vm._ubridge_hypervisor.stop.called @@ -437,9 +437,9 @@ def test_stop(loop, vm): def test_stop_paused_container(loop, vm): - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="paused"): - with asyncio_patch("gns3server.hypervisor.docker.DockerVM.unpause") as mock_unpause: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="paused"): + with asyncio_patch("gns3server.compute.docker.DockerVM.unpause") as mock_unpause: + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.stop())) mock_query.assert_called_with("POST", "containers/e90e34656842/stop", params={"t": 5}) assert mock_unpause.called @@ -455,9 +455,9 @@ def test_update(loop, vm): original_console = vm.console original_aux = vm.aux - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock_query: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock_query: loop.run_until_complete(asyncio.async(vm.update())) mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1}) @@ -500,10 +500,10 @@ def test_update_vnc(loop, vm): original_console = vm.console original_aux = vm.aux - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._start_vnc"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_vnc"): + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock_query: loop.run_until_complete(asyncio.async(vm.update())) assert vm.console == original_console @@ -520,9 +520,9 @@ def test_update_running(loop, vm): original_console = vm.console vm.start = MagicMock() - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="running"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock_query: + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "ubuntu"}]) as mock_list_images: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="running"): + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock_query: loop.run_until_complete(asyncio.async(vm.update())) mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1}) @@ -555,8 +555,8 @@ def test_update_running(loop, vm): def test_delete(loop, vm): - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.delete())) mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) @@ -569,8 +569,8 @@ def test_close(loop, vm, port_manager): nio = vm.manager.create_nio(0, nio) loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(0, nio))) - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.close())) mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) @@ -584,8 +584,8 @@ def test_close_vnc(loop, vm, port_manager): vm._x11vnc_process = MagicMock() vm._xvfb_process = MagicMock() - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.hypervisor.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.close())) mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) @@ -599,7 +599,7 @@ def test_get_namespace(loop, vm): "Pid": 42 } } - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock_query: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock_query: assert loop.run_until_complete(asyncio.async(vm._get_namespace())) == 42 mock_query.assert_called_with("GET", "containers/e90e34656842/json") @@ -717,7 +717,7 @@ def test_adapter_remove_nio_binding(vm, loop): "rhost": "127.0.0.1"} nio = vm.manager.create_nio(0, nio) loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(0, nio))) - with asyncio_patch("gns3server.hypervisor.docker.DockerVM._delete_ubridge_connection") as delete_ubridge_mock: + with asyncio_patch("gns3server.compute.docker.DockerVM._delete_ubridge_connection") as delete_ubridge_mock: loop.run_until_complete(asyncio.async(vm.adapter_remove_nio_binding(0))) assert vm._ethernet_adapters[0].get_nio(0) is None delete_ubridge_mock.assert_called_with(0) @@ -750,7 +750,7 @@ def test_pull_image(loop, vm): mock_query = MagicMock() mock_query.content.return_value = Response() - with asyncio_patch("gns3server.hypervisor.docker.Docker.http_query", return_value=mock_query) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.http_query", return_value=mock_query) as mock: images = loop.run_until_complete(asyncio.async(vm.pull_image("ubuntu"))) mock.assert_called_with("POST", "images/create", params={"fromImage": "ubuntu"}) @@ -783,7 +783,7 @@ def test_get_log(loop, vm): mock_query = MagicMock() mock_query.read = read - with asyncio_patch("gns3server.hypervisor.docker.Docker.http_query", return_value=mock_query) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.http_query", return_value=mock_query) as mock: images = loop.run_until_complete(asyncio.async(vm._get_log())) mock.assert_called_with("GET", "containers/e90e34656842/logs", params={"stderr": 1, "stdout": 1}, data={}) @@ -791,7 +791,7 @@ def test_get_log(loop, vm): def test_get_image_informations(project, manager, loop): response = { } - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value=response) as mock: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response) as mock: vm = DockerVM("test", str(uuid.uuid4()), project, manager, "ubuntu") loop.run_until_complete(asyncio.async(vm._get_image_informations())) mock.assert_called_with("GET", "images/ubuntu/json") @@ -819,7 +819,7 @@ def test_mount_binds(vm, tmpdir): def test_start_vnc(vm, loop): vm.console_resolution = "1280x1024" with patch("shutil.which", return_value="/bin/x"): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.wait_for_file_creation") as mock_wait: + with asyncio_patch("gns3server.compute.docker.docker_vm.wait_for_file_creation") as mock_wait: with asyncio_patch("asyncio.create_subprocess_exec") as mock_exec: loop.run_until_complete(asyncio.async(vm._start_vnc())) assert vm._display is not None diff --git a/tests/hypervisor/dynamips/test_dynamips_manager.py b/tests/compute/dynamips/test_dynamips_manager.py similarity index 96% rename from tests/hypervisor/dynamips/test_dynamips_manager.py rename to tests/compute/dynamips/test_dynamips_manager.py index 459201fc..7caf1c52 100644 --- a/tests/hypervisor/dynamips/test_dynamips_manager.py +++ b/tests/compute/dynamips/test_dynamips_manager.py @@ -23,8 +23,8 @@ import uuid import os import asyncio -from gns3server.hypervisor.dynamips import Dynamips -from gns3server.hypervisor.dynamips.dynamips_error import DynamipsError +from gns3server.compute.dynamips import Dynamips +from gns3server.compute.dynamips.dynamips_error import DynamipsError from unittest.mock import patch diff --git a/tests/hypervisor/dynamips/test_dynamips_router.py b/tests/compute/dynamips/test_dynamips_router.py similarity index 90% rename from tests/hypervisor/dynamips/test_dynamips_router.py rename to tests/compute/dynamips/test_dynamips_router.py index 320246fd..1fe3ee59 100644 --- a/tests/hypervisor/dynamips/test_dynamips_router.py +++ b/tests/compute/dynamips/test_dynamips_router.py @@ -20,9 +20,9 @@ import asyncio import configparser from unittest.mock import patch -from gns3server.hypervisor.dynamips.nodes.router import Router -from gns3server.hypervisor.dynamips.dynamips_error import DynamipsError -from gns3server.hypervisor.dynamips import Dynamips +from gns3server.compute.dynamips.nodes.router import Router +from gns3server.compute.dynamips.dynamips_error import DynamipsError +from gns3server.compute.dynamips import Dynamips from gns3server.config import Config diff --git a/tests/hypervisor/iou/test_iou_manager.py b/tests/compute/iou/test_iou_manager.py similarity index 94% rename from tests/hypervisor/iou/test_iou_manager.py rename to tests/compute/iou/test_iou_manager.py index 68b47026..be4d8902 100644 --- a/tests/hypervisor/iou/test_iou_manager.py +++ b/tests/compute/iou/test_iou_manager.py @@ -25,10 +25,10 @@ import sys pytestmark = pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") if not sys.platform.startswith("win"): - from gns3server.hypervisor.iou import IOU - from gns3server.hypervisor.iou.iou_error import IOUError + from gns3server.compute.iou import IOU + from gns3server.compute.iou.iou_error import IOUError -from gns3server.hypervisor.project_manager import ProjectManager +from gns3server.compute.project_manager import ProjectManager @pytest.fixture(scope="function") diff --git a/tests/hypervisor/iou/test_iou_vm.py b/tests/compute/iou/test_iou_vm.py similarity index 89% rename from tests/hypervisor/iou/test_iou_vm.py rename to tests/compute/iou/test_iou_vm.py index 5d620434..9e0d4cee 100644 --- a/tests/hypervisor/iou/test_iou_vm.py +++ b/tests/compute/iou/test_iou_vm.py @@ -32,9 +32,9 @@ from unittest.mock import patch, MagicMock, PropertyMock pytestmark = pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") if not sys.platform.startswith("win"): - from gns3server.hypervisor.iou.iou_vm import IOUVM - from gns3server.hypervisor.iou.iou_error import IOUError - from gns3server.hypervisor.iou import IOU + from gns3server.compute.iou.iou_vm import IOUVM + from gns3server.compute.iou.iou_error import IOUError + from gns3server.compute.iou import IOU from gns3server.config import Config @@ -108,10 +108,10 @@ def test_vm_invalid_iouyap_path(project, manager, loop, fake_iou_bin): def test_start(loop, vm, monkeypatch): mock_process = MagicMock() - with patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with patch("gns3server.compute.iou.iou_vm.IOUVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_iouyap", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=mock_process) as mock_exec: mock_process.returncode = None loop.run_until_complete(asyncio.async(vm.start())) @@ -126,10 +126,10 @@ def test_start_with_iourc(loop, vm, monkeypatch, tmpdir): f.write("1") mock_process = MagicMock() with patch("gns3server.config.Config.get_section_config", return_value={"iourc_path": fake_file, "iouyap_path": vm.iouyap_path}): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_iouyap", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=mock_process) as exec_mock: mock_process.returncode = None loop.run_until_complete(asyncio.async(vm.start())) @@ -162,9 +162,9 @@ def test_stop(loop, vm): future.set_result(True) process.wait.return_value = future - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_iouyap", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): with asyncio_patch("gns3server.utils.asyncio.wait_for_process_termination"): loop.run_until_complete(asyncio.async(vm.start())) @@ -184,9 +184,9 @@ def test_reload(loop, vm, fake_iou_bin): process.wait.return_value = future process.returncode = None - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._start_iouyap", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): with asyncio_patch("gns3server.utils.asyncio.wait_for_process_termination"): loop.run_until_complete(asyncio.async(vm.start())) @@ -197,7 +197,7 @@ def test_reload(loop, vm, fake_iou_bin): def test_close(vm, port_manager, loop): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()): vm.start() port = vm.console diff --git a/tests/hypervisor/qemu/test_qemu_manager.py b/tests/compute/qemu/test_qemu_manager.py similarity index 89% rename from tests/hypervisor/qemu/test_qemu_manager.py rename to tests/compute/qemu/test_qemu_manager.py index d79152b1..e2baf1b7 100644 --- a/tests/hypervisor/qemu/test_qemu_manager.py +++ b/tests/compute/qemu/test_qemu_manager.py @@ -22,8 +22,8 @@ import sys import pytest import platform -from gns3server.hypervisor.qemu import Qemu -from gns3server.hypervisor.qemu.qemu_error import QemuError +from gns3server.compute.qemu import Qemu +from gns3server.compute.qemu.qemu_error import QemuError from tests.utils import asyncio_patch from unittest.mock import patch, MagicMock @@ -40,7 +40,7 @@ def fake_qemu_img_binary(tmpdir): def test_get_qemu_version(loop): - with asyncio_patch("gns3server.hypervisor.qemu.subprocess_check_output", return_value="QEMU emulator version 2.2.0, Copyright (c) 2003-2008 Fabrice Bellard") as mock: + with asyncio_patch("gns3server.compute.qemu.subprocess_check_output", return_value="QEMU emulator version 2.2.0, Copyright (c) 2003-2008 Fabrice Bellard") as mock: version = loop.run_until_complete(asyncio.async(Qemu.get_qemu_version("/tmp/qemu-test"))) if sys.platform.startswith("win"): assert version == "" @@ -58,7 +58,7 @@ def test_binary_list(loop): f.write("1") os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - with asyncio_patch("gns3server.hypervisor.qemu.subprocess_check_output", return_value="QEMU emulator version 2.2.0, Copyright (c) 2003-2008 Fabrice Bellard") as mock: + with asyncio_patch("gns3server.compute.qemu.subprocess_check_output", return_value="QEMU emulator version 2.2.0, Copyright (c) 2003-2008 Fabrice Bellard") as mock: if sys.platform.startswith("win"): version = "" else: @@ -97,7 +97,7 @@ def test_img_binary_list(loop): f.write("1") os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) - with asyncio_patch("gns3server.hypervisor.qemu.subprocess_check_output", return_value="qemu-img version 2.2.0, Copyright (c) 2004-2008 Fabrice Bellard") as mock: + with asyncio_patch("gns3server.compute.qemu.subprocess_check_output", return_value="qemu-img version 2.2.0, Copyright (c) 2004-2008 Fabrice Bellard") as mock: qemus = loop.run_until_complete(asyncio.async(Qemu.img_binary_list())) version = "2.2.0" @@ -151,7 +151,7 @@ def test_create_image_relative_path(loop, tmpdir, fake_qemu_img_binary): "size": 100 } with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as process: - with patch("gns3server.hypervisor.qemu.Qemu.get_images_directory", return_value=str(tmpdir)): + with patch("gns3server.compute.qemu.Qemu.get_images_directory", return_value=str(tmpdir)): loop.run_until_complete(asyncio.async(Qemu.instance().create_disk(fake_qemu_img_binary, "hda.qcow2", options))) args, kwargs = process.call_args assert args == ( @@ -172,7 +172,7 @@ def test_create_image_exist(loop, tmpdir, fake_qemu_img_binary): "size": 100 } with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as process: - with patch("gns3server.hypervisor.qemu.Qemu.get_images_directory", return_value=str(tmpdir)): + with patch("gns3server.compute.qemu.Qemu.get_images_directory", return_value=str(tmpdir)): with pytest.raises(QemuError): loop.run_until_complete(asyncio.async(Qemu.instance().create_disk(fake_qemu_img_binary, "hda.qcow2", options))) assert not process.called diff --git a/tests/hypervisor/qemu/test_qemu_vm.py b/tests/compute/qemu/test_qemu_vm.py similarity index 96% rename from tests/hypervisor/qemu/test_qemu_vm.py rename to tests/compute/qemu/test_qemu_vm.py index 8d0152da..cd808c86 100644 --- a/tests/hypervisor/qemu/test_qemu_vm.py +++ b/tests/compute/qemu/test_qemu_vm.py @@ -28,11 +28,11 @@ from tests.utils import asyncio_patch from unittest import mock from unittest.mock import patch, MagicMock -from gns3server.hypervisor.qemu.qemu_vm import QemuVM -from gns3server.hypervisor.qemu.qemu_error import QemuError -from gns3server.hypervisor.qemu import Qemu +from gns3server.compute.qemu.qemu_vm import QemuVM +from gns3server.compute.qemu.qemu_error import QemuError +from gns3server.compute.qemu import Qemu from gns3server.utils import force_unix_path -from gns3server.hypervisor.notification_manager import NotificationManager +from gns3server.compute.notification_manager import NotificationManager @pytest.fixture(scope="module") @@ -177,7 +177,7 @@ def test_termination_callback_error(vm, tmpdir, async_run): def test_reload(loop, vm): - with asyncio_patch("gns3server.hypervisor.qemu.QemuVM._control_vm") as mock: + with asyncio_patch("gns3server.compute.qemu.QemuVM._control_vm") as mock: loop.run_until_complete(asyncio.async(vm.reload())) assert mock.called_with("system_reset") @@ -186,7 +186,7 @@ def test_suspend(loop, vm): control_vm_result = MagicMock() control_vm_result.match.group.decode.return_value = "running" - with asyncio_patch("gns3server.hypervisor.qemu.QemuVM._control_vm", return_value=control_vm_result) as mock: + with asyncio_patch("gns3server.compute.qemu.QemuVM._control_vm", return_value=control_vm_result) as mock: loop.run_until_complete(asyncio.async(vm.suspend())) assert mock.called_with("system_reset") @@ -199,7 +199,7 @@ def test_add_nio_binding_udp(vm, loop): @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") def test_add_nio_binding_ethernet(vm, loop, ethernet_device): - with patch("gns3server.hypervisor.base_manager.BaseManager.has_privileged_access", return_value=True): + with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): nio = Qemu.instance().create_nio(vm.qemu_path, {"type": "nio_generic_ethernet", "ethernet_device": ethernet_device}) loop.run_until_complete(asyncio.async(vm.adapter_add_nio_binding(0, nio))) assert nio.ethernet_device == ethernet_device @@ -307,7 +307,7 @@ def test_set_qemu_path_kvm_binary(vm, tmpdir, fake_qemu_binary): def test_set_platform(project, manager): with patch("shutil.which", return_value="/bin/qemu-system-x86_64") as which_mock: - with patch("gns3server.hypervisor.qemu.QemuVM._check_qemu_path"): + with patch("gns3server.compute.qemu.QemuVM._check_qemu_path"): vm = QemuVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager, platform="x86_64") if sys.platform.startswith("win"): which_mock.assert_called_with("qemu-system-x86_64w.exe", path=mock.ANY) @@ -506,7 +506,7 @@ def test_initrd(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) - with patch("gns3server.hypervisor.project.Project.emit") as mock: + with patch("gns3server.compute.project.Project.emit") as mock: vm.initrd = str(tmpdir / "test") assert vm.initrd == force_unix_path(str(tmpdir / "test")) vm.initrd = "test" @@ -518,7 +518,7 @@ def test_initrd_asa(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) - with patch("gns3server.hypervisor.project.Project.emit") as mock: + with patch("gns3server.compute.project.Project.emit") as mock: vm.initrd = str(tmpdir / "asa842-initrd.gz") assert vm.initrd == force_unix_path(str(tmpdir / "asa842-initrd.gz")) vm.initrd = "asa842-initrd.gz" diff --git a/tests/hypervisor/test_base_vm.py b/tests/compute/test_base_vm.py similarity index 93% rename from tests/hypervisor/test_base_vm.py rename to tests/compute/test_base_vm.py index aea8fa42..e62fca06 100644 --- a/tests/hypervisor/test_base_vm.py +++ b/tests/compute/test_base_vm.py @@ -23,11 +23,11 @@ from tests.utils import asyncio_patch from unittest.mock import patch, MagicMock -from gns3server.hypervisor.vpcs.vpcs_vm import VPCSVM -from gns3server.hypervisor.docker.docker_vm import DockerVM -from gns3server.hypervisor.vpcs.vpcs_error import VPCSError -from gns3server.hypervisor.vm_error import VMError -from gns3server.hypervisor.vpcs import VPCS +from gns3server.compute.vpcs.vpcs_vm import VPCSVM +from gns3server.compute.docker.docker_vm import DockerVM +from gns3server.compute.vpcs.vpcs_error import VPCSError +from gns3server.compute.vm_error import VMError +from gns3server.compute.vpcs import VPCS @pytest.fixture(scope="module") diff --git a/tests/hypervisor/test_manager.py b/tests/compute/test_manager.py similarity index 92% rename from tests/hypervisor/test_manager.py rename to tests/compute/test_manager.py index f9d11df0..435347cf 100644 --- a/tests/hypervisor/test_manager.py +++ b/tests/compute/test_manager.py @@ -21,9 +21,9 @@ import pytest from unittest.mock import patch -from gns3server.hypervisor.vpcs import VPCS -from gns3server.hypervisor.qemu import Qemu -from gns3server.hypervisor.vm_error import VMError +from gns3server.compute.vpcs import VPCS +from gns3server.compute.qemu import Qemu +from gns3server.compute.vm_error import VMError from gns3server.utils import force_unix_path @@ -67,7 +67,7 @@ def test_create_vm_new_topology_without_uuid(loop, project, vpcs): def test_create_vm_old_topology(loop, project, tmpdir, vpcs): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project.is_local", return_value=True): # Create an old topology directory project_dir = str(tmpdir / "testold") vm_dir = os.path.join(project_dir, "testold-files", "vpcs", "pc-1") @@ -158,7 +158,7 @@ def test_list_images(loop, qemu, tmpdir): with open(str(tmpdir / image), "w+") as f: f.write("1") - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir)): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir)): assert loop.run_until_complete(qemu.list_images()) == [ {"filename": "a.bin", "path": "a.bin"}, {"filename": "b.bin", "path": "b.bin"} @@ -177,7 +177,7 @@ def test_list_images_recursives(loop, qemu, tmpdir): with open(str(tmpdir / "c" / image), "w+") as f: f.write("1") - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir)): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir)): assert loop.run_until_complete(qemu.list_images()) == [ {"filename": "a.bin", "path": "a.bin"}, {"filename": "b.bin", "path": "b.bin"}, @@ -186,10 +186,10 @@ def test_list_images_recursives(loop, qemu, tmpdir): def test_list_images_empty(loop, qemu, tmpdir): - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir)): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir)): assert loop.run_until_complete(qemu.list_images()) == [] def test_list_images_directory_not_exist(loop, qemu): - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value="/bla"): + with patch("gns3server.compute.Qemu.get_images_directory", return_value="/bla"): assert loop.run_until_complete(qemu.list_images()) == [] diff --git a/tests/hypervisor/test_notification_manager.py b/tests/compute/test_notification_manager.py similarity index 97% rename from tests/hypervisor/test_notification_manager.py rename to tests/compute/test_notification_manager.py index 444bc805..1c41a75c 100644 --- a/tests/hypervisor/test_notification_manager.py +++ b/tests/compute/test_notification_manager.py @@ -17,7 +17,7 @@ import uuid -from gns3server.hypervisor.notification_manager import NotificationManager +from gns3server.compute.notification_manager import NotificationManager def test_queue(async_run): diff --git a/tests/hypervisor/test_port_manager.py b/tests/compute/test_port_manager.py similarity index 84% rename from tests/hypervisor/test_port_manager.py rename to tests/compute/test_port_manager.py index 9e4750e0..6710a342 100644 --- a/tests/hypervisor/test_port_manager.py +++ b/tests/compute/test_port_manager.py @@ -21,15 +21,15 @@ import sys import uuid from unittest.mock import patch -from gns3server.hypervisor.port_manager import PortManager -from gns3server.hypervisor.project import Project +from gns3server.compute.port_manager import PortManager +from gns3server.compute.project import Project def test_reserve_tcp_port(): pm = PortManager() project = Project(project_id=str(uuid.uuid4())) pm.reserve_tcp_port(2001, project) - with patch("gns3server.hypervisor.project.Project.emit") as mock_emit: + with patch("gns3server.compute.project.Project.emit") as mock_emit: port = pm.reserve_tcp_port(2001, project) assert port != 2001 @@ -37,7 +37,7 @@ def test_reserve_tcp_port(): def test_reserve_tcp_port_outside_range(): pm = PortManager() project = Project(project_id=str(uuid.uuid4())) - with patch("gns3server.hypervisor.project.Project.emit") as mock_emit: + with patch("gns3server.compute.project.Project.emit") as mock_emit: port = pm.reserve_tcp_port(80, project) assert port != 80 @@ -50,7 +50,7 @@ def test_reserve_tcp_port_already_used_by_another_program(): pm = PortManager() project = Project(project_id=str(uuid.uuid4())) - with patch("gns3server.hypervisor.port_manager.PortManager._check_port") as mock_check: + with patch("gns3server.compute.port_manager.PortManager._check_port") as mock_check: def execute_mock(host, port, *args): if port == 2001: @@ -60,7 +60,7 @@ def test_reserve_tcp_port_already_used_by_another_program(): mock_check.side_effect = execute_mock - with patch("gns3server.hypervisor.project.Project.emit") as mock_emit: + with patch("gns3server.compute.project.Project.emit") as mock_emit: port = pm.reserve_tcp_port(2001, project) assert port != 2001 @@ -73,7 +73,7 @@ def test_reserve_tcp_port_already_used(): pm = PortManager() project = Project(project_id=str(uuid.uuid4())) - with patch("gns3server.hypervisor.port_manager.PortManager._check_port") as mock_check: + with patch("gns3server.compute.port_manager.PortManager._check_port") as mock_check: def execute_mock(host, port, *args): if port == 2001: @@ -83,7 +83,7 @@ def test_reserve_tcp_port_already_used(): mock_check.side_effect = execute_mock - with patch("gns3server.hypervisor.project.Project.emit") as mock_emit: + with patch("gns3server.compute.project.Project.emit") as mock_emit: port = pm.reserve_tcp_port(2001, project) assert port != 2001 diff --git a/tests/hypervisor/test_project.py b/tests/compute/test_project.py similarity index 94% rename from tests/hypervisor/test_project.py rename to tests/compute/test_project.py index 44b87252..bc43d489 100644 --- a/tests/hypervisor/test_project.py +++ b/tests/compute/test_project.py @@ -27,9 +27,9 @@ from uuid import uuid4 from unittest.mock import patch from tests.utils import asyncio_patch -from gns3server.hypervisor.project import Project -from gns3server.hypervisor.notification_manager import NotificationManager -from gns3server.hypervisor.vpcs import VPCS, VPCSVM +from gns3server.compute.project import Project +from gns3server.compute.notification_manager import NotificationManager +from gns3server.compute.vpcs import VPCS, VPCSVM from gns3server.config import Config @@ -55,8 +55,8 @@ def test_path(tmpdir): directory = Config.instance().get_section_config("Server").get("project_directory") - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): - with patch("gns3server.hypervisor.project.Project._get_default_project_directory", return_value=directory): + with patch("gns3server.compute.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project._get_default_project_directory", return_value=directory): p = Project(project_id=str(uuid4())) assert p.path == os.path.join(directory, p.id) assert os.path.exists(os.path.join(directory, p.id)) @@ -65,14 +65,14 @@ def test_path(tmpdir): def test_init_path(tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project.is_local", return_value=True): p = Project(path=str(tmpdir), project_id=str(uuid4())) assert p.path == str(tmpdir) def test_changing_path_temporary_flag(tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project.is_local", return_value=True): p = Project(temporary=True, project_id=str(uuid4())) assert os.path.exists(p.path) original_path = p.path @@ -96,14 +96,14 @@ def test_remove_temporary_flag(): def test_changing_path_not_allowed(tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=False): + with patch("gns3server.compute.project.Project.is_local", return_value=False): with pytest.raises(aiohttp.web.HTTPForbidden): p = Project(project_id=str(uuid4())) p.path = str(tmpdir) def test_changing_path_with_quote_not_allowed(tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project.is_local", return_value=True): with pytest.raises(aiohttp.web.HTTPForbidden): p = Project(project_id=str(uuid4())) p.path = str(tmpdir / "project\"53") @@ -117,7 +117,7 @@ def test_json(tmpdir): def test_vm_working_directory(tmpdir, vm): directory = Config.instance().get_section_config("Server").get("project_directory") - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): + with patch("gns3server.compute.project.Project.is_local", return_value=True): p = Project(project_id=str(uuid4())) assert p.vm_working_directory(vm) == os.path.join(directory, p.id, 'project-files', vm.module_name, vm.id) assert os.path.exists(p.vm_working_directory(vm)) @@ -186,7 +186,7 @@ def test_project_add_vm(manager): def test_project_close(loop, vm, project): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM.close") as mock: + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.close") as mock: loop.run_until_complete(asyncio.async(project.close())) assert mock.called assert vm.id not in vm.manager._vms @@ -372,7 +372,7 @@ def test_export_with_images(tmpdir): with open(os.path.join(path, "test.gns3"), 'w+') as f: json.dump(topology, f) - with patch("gns3server.hypervisor.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),): + with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),): z = project.export(include_images=True) with open(str(tmpdir / 'zipfile.zip'), 'wb') as f: for data in z: diff --git a/tests/hypervisor/test_project_manager.py b/tests/compute/test_project_manager.py similarity index 94% rename from tests/hypervisor/test_project_manager.py rename to tests/compute/test_project_manager.py index 7d359a99..bcdf5399 100644 --- a/tests/hypervisor/test_project_manager.py +++ b/tests/compute/test_project_manager.py @@ -17,7 +17,7 @@ import aiohttp import pytest -from gns3server.hypervisor.project_manager import ProjectManager +from gns3server.compute.project_manager import ProjectManager def test_create_project(): diff --git a/tests/hypervisor/virtualbox/test_virtualbox_manager.py b/tests/compute/virtualbox/test_virtualbox_manager.py similarity index 93% rename from tests/hypervisor/virtualbox/test_virtualbox_manager.py rename to tests/compute/virtualbox/test_virtualbox_manager.py index c0f4f855..fffe2c78 100644 --- a/tests/hypervisor/virtualbox/test_virtualbox_manager.py +++ b/tests/compute/virtualbox/test_virtualbox_manager.py @@ -25,8 +25,8 @@ import asyncio from unittest.mock import patch -from gns3server.hypervisor.virtualbox import VirtualBox -from gns3server.hypervisor.virtualbox.virtualbox_error import VirtualBoxError +from gns3server.compute.virtualbox import VirtualBox +from gns3server.compute.virtualbox.virtualbox_error import VirtualBoxError from tests.utils import asyncio_patch @@ -90,7 +90,7 @@ def test_list_images(manager, loop): return ["memory=256"] assert False, "Unknow {} {}".format(cmd, args) - with asyncio_patch("gns3server.hypervisor.virtualbox.VirtualBox.execute") as mock: + with asyncio_patch("gns3server.compute.virtualbox.VirtualBox.execute") as mock: mock.side_effect = execute_mock vms = loop.run_until_complete(asyncio.async(manager.list_images())) assert vms == [ diff --git a/tests/hypervisor/virtualbox/test_virtualbox_vm.py b/tests/compute/virtualbox/test_virtualbox_vm.py similarity index 84% rename from tests/hypervisor/virtualbox/test_virtualbox_vm.py rename to tests/compute/virtualbox/test_virtualbox_vm.py index 5a2ed514..799ae0ee 100644 --- a/tests/hypervisor/virtualbox/test_virtualbox_vm.py +++ b/tests/compute/virtualbox/test_virtualbox_vm.py @@ -19,9 +19,9 @@ import pytest import asyncio from tests.utils import asyncio_patch -from gns3server.hypervisor.virtualbox.virtualbox_vm import VirtualBoxVM -from gns3server.hypervisor.virtualbox.virtualbox_error import VirtualBoxError -from gns3server.hypervisor.virtualbox import VirtualBox +from gns3server.compute.virtualbox.virtualbox_vm import VirtualBoxVM +from gns3server.compute.virtualbox.virtualbox_error import VirtualBoxError +from gns3server.compute.virtualbox import VirtualBox @pytest.fixture(scope="module") @@ -44,13 +44,13 @@ def test_vm(project, manager): def test_vm_valid_virtualbox_api_version(loop, project, manager): - with asyncio_patch("gns3server.hypervisor.virtualbox.VirtualBox.execute", return_value=["API version: 4_3"]): + with asyncio_patch("gns3server.compute.virtualbox.VirtualBox.execute", return_value=["API version: 4_3"]): vm = VirtualBoxVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager, "test", False) loop.run_until_complete(asyncio.async(vm.create())) def test_vm_invalid_virtualbox_api_version(loop, project, manager): - with asyncio_patch("gns3server.hypervisor.virtualbox.VirtualBox.execute", return_value=["API version: 4_2"]): + with asyncio_patch("gns3server.compute.virtualbox.VirtualBox.execute", return_value=["API version: 4_2"]): with pytest.raises(VirtualBoxError): vm = VirtualBoxVM("test", "00010203-0405-0607-0809-0a0b0c0d0e0f", project, manager, "test", False) loop.run_until_complete(asyncio.async(vm.create())) diff --git a/tests/hypervisor/vmware/test_vmware_manager.py b/tests/compute/vmware/test_vmware_manager.py similarity index 96% rename from tests/hypervisor/vmware/test_vmware_manager.py rename to tests/compute/vmware/test_vmware_manager.py index 89025af6..c83a130e 100644 --- a/tests/hypervisor/vmware/test_vmware_manager.py +++ b/tests/compute/vmware/test_vmware_manager.py @@ -25,7 +25,7 @@ import asyncio from unittest.mock import patch -from gns3server.hypervisor.vmware import VMware +from gns3server.compute.vmware import VMware from tests.utils import asyncio_patch diff --git a/tests/hypervisor/vmware/test_vmware_vm.py b/tests/compute/vmware/test_vmware_vm.py similarity index 93% rename from tests/hypervisor/vmware/test_vmware_vm.py rename to tests/compute/vmware/test_vmware_vm.py index cd56f5ee..58c8482a 100644 --- a/tests/hypervisor/vmware/test_vmware_vm.py +++ b/tests/compute/vmware/test_vmware_vm.py @@ -19,9 +19,9 @@ import pytest import asyncio from tests.utils import asyncio_patch -from gns3server.hypervisor.vmware.vmware_vm import VMwareVM -from gns3server.hypervisor.vmware.vmware_error import VMwareError -from gns3server.hypervisor.vmware import VMware +from gns3server.compute.vmware.vmware_vm import VMwareVM +from gns3server.compute.vmware.vmware_error import VMwareError +from gns3server.compute.vmware import VMware @pytest.fixture(scope="module") diff --git a/tests/hypervisor/vpcs/test_vpcs_manager.py b/tests/compute/vpcs/test_vpcs_manager.py similarity index 93% rename from tests/hypervisor/vpcs/test_vpcs_manager.py rename to tests/compute/vpcs/test_vpcs_manager.py index cabc4fab..50aeb596 100644 --- a/tests/hypervisor/vpcs/test_vpcs_manager.py +++ b/tests/compute/vpcs/test_vpcs_manager.py @@ -20,9 +20,9 @@ import pytest import uuid -from gns3server.hypervisor.vpcs import VPCS -from gns3server.hypervisor.vpcs.vpcs_error import VPCSError -from gns3server.hypervisor.project_manager import ProjectManager +from gns3server.compute.vpcs import VPCS +from gns3server.compute.vpcs.vpcs_error import VPCSError +from gns3server.compute.project_manager import ProjectManager def test_get_mac_id(loop, project, port_manager): diff --git a/tests/hypervisor/vpcs/test_vpcs_vm.py b/tests/compute/vpcs/test_vpcs_vm.py similarity index 87% rename from tests/hypervisor/vpcs/test_vpcs_vm.py rename to tests/compute/vpcs/test_vpcs_vm.py index df0b042f..d5a9f24c 100644 --- a/tests/hypervisor/vpcs/test_vpcs_vm.py +++ b/tests/compute/vpcs/test_vpcs_vm.py @@ -25,10 +25,10 @@ from tests.utils import asyncio_patch from pkg_resources import parse_version from unittest.mock import patch, MagicMock -from gns3server.hypervisor.vpcs.vpcs_vm import VPCSVM -from gns3server.hypervisor.vpcs.vpcs_error import VPCSError -from gns3server.hypervisor.vpcs import VPCS -from gns3server.hypervisor.notification_manager import NotificationManager +from gns3server.compute.vpcs.vpcs_vm import VPCSVM +from gns3server.compute.vpcs.vpcs_error import VPCSError +from gns3server.compute.vpcs import VPCS +from gns3server.compute.notification_manager import NotificationManager @pytest.fixture(scope="module") @@ -52,19 +52,19 @@ def test_vm(project, manager): def test_vm_check_vpcs_version(loop, vm, manager): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.9"): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.9"): loop.run_until_complete(asyncio.async(vm._check_vpcs_version())) assert vm._vpcs_version == parse_version("0.9") def test_vm_check_vpcs_version_0_6_1(loop, vm, manager): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.6.1"): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.6.1"): loop.run_until_complete(asyncio.async(vm._check_vpcs_version())) assert vm._vpcs_version == parse_version("0.6.1") def test_vm_invalid_vpcs_version(loop, manager, vm): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.1"): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.subprocess_check_output", return_value="Welcome to Virtual PC Simulator, version 0.1"): with pytest.raises(VPCSError): nio = manager.create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -74,7 +74,7 @@ def test_vm_invalid_vpcs_version(loop, manager, vm): def test_vm_invalid_vpcs_path(vm, manager, loop): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM.vpcs_path", return_value="/tmp/fake/path/vpcs"): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.vpcs_path", return_value="/tmp/fake/path/vpcs"): with pytest.raises(VPCSError): nio = manager.create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -90,7 +90,7 @@ def test_start(loop, vm, async_run): with NotificationManager.instance().queue() as queue: async_run(queue.get(0)) # Ping - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -125,7 +125,7 @@ def test_start_0_6_1(loop, vm): process.returncode = None vm._vpcs_version = parse_version("0.6.1") - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -156,7 +156,7 @@ def test_stop(loop, vm, async_run): process.returncode = None with NotificationManager.instance().queue() as queue: - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -190,7 +190,7 @@ def test_reload(loop, vm): process.wait.return_value = future process.returncode = None - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) @@ -215,14 +215,14 @@ def test_add_nio_binding_udp(vm): @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") def test_add_nio_binding_tap(vm, ethernet_device): - with patch("gns3server.hypervisor.base_manager.BaseManager.has_privileged_access", return_value=True): + with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_tap", "tap_device": ethernet_device}) vm.port_add_nio_binding(0, nio) assert nio.tap_device == ethernet_device # def test_add_nio_binding_tap_no_privileged_access(vm): -# with patch("gns3server.hypervisor.base_manager.BaseManager.has_privileged_access", return_value=False): +# with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=False): # with pytest.raises(aiohttp.web.HTTPForbidden): # nio = VPCS.instance().create_nio(vm.vpcs_path, {"type": "nio_tap", "tap_device": "test"}) # vm.port_add_nio_binding(0, nio) @@ -286,7 +286,7 @@ def test_change_name(vm, tmpdir): def test_close(vm, port_manager, loop): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()): vm.start() loop.run_until_complete(asyncio.async(vm.close())) diff --git a/tests/conftest.py b/tests/conftest.py index 9c2f7a3e..369ca488 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,9 +37,9 @@ from gns3server.config import Config from gns3server.web.route import Route # TODO: get rid of * from gns3server.handlers import * -from gns3server.hypervisor import MODULES -from gns3server.hypervisor.port_manager import PortManager -from gns3server.hypervisor.project_manager import ProjectManager +from gns3server.compute import MODULES +from gns3server.compute.port_manager import PortManager +from gns3server.compute.project_manager import ProjectManager from gns3server.controller import Controller from tests.handlers.api.base import Query @@ -105,7 +105,7 @@ def http_server(request, loop, port_manager, monkeypatch): def tear_down(): for module in MODULES: instance = module.instance() - monkeypatch.setattr('gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.close', lambda self: True) + monkeypatch.setattr('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.close', lambda self: True) loop.run_until_complete(instance.unload()) srv.close() srv.wait_closed() @@ -132,12 +132,12 @@ def http_controller(loop, http_server): @pytest.fixture -def http_hypervisor(loop, http_server): +def http_compute(loop, http_server): """ Return an helper allowing you to call the hypervisor API via HTTP """ host, port = http_server - return Query(loop, host=host, port=port, prefix="/hypervisor", api_version=2) + return Query(loop, host=host, port=port, prefix="/compute", api_version=2) @pytest.fixture(scope="function") @@ -204,7 +204,7 @@ def run_around_tests(monkeypatch, port_manager, controller): # Force turn off KVM because it's not available on CI config.set("Qemu", "enable_kvm", False) - monkeypatch.setattr("gns3server.hypervisor.project.Project._get_default_project_directory", lambda *args: os.path.join(tmppath, 'projects')) + monkeypatch.setattr("gns3server.compute.project.Project._get_default_project_directory", lambda *args: os.path.join(tmppath, 'projects')) # Force sys.platform to the original value. Because it seem not be restore correctly at each tests sys.platform = sys.original_platform diff --git a/tests/controller/test_hypervisor.py b/tests/controller/test_compute.py similarity index 52% rename from tests/controller/test_hypervisor.py rename to tests/controller/test_compute.py index a640e598..babc7445 100644 --- a/tests/controller/test_hypervisor.py +++ b/tests/controller/test_compute.py @@ -23,124 +23,124 @@ import asyncio from unittest.mock import patch, MagicMock from gns3server.controller.project import Project -from gns3server.controller.hypervisor import Hypervisor, HypervisorError +from gns3server.controller.compute import Compute, ComputeError from gns3server.version import __version__ from tests.utils import asyncio_patch, AsyncioMagicMock @pytest.fixture -def hypervisor(): - hypervisor = Hypervisor("my_hypervisor_id", protocol="https", host="example.com", port=84, controller=MagicMock()) - hypervisor._connected = True - return hypervisor +def compute(): + compute = Compute("my_compute_id", protocol="https", host="example.com", port=84, controller=MagicMock()) + compute._connected = True + return compute -def test_init(hypervisor): - assert hypervisor.id == "my_hypervisor_id" +def test_init(compute): + assert compute.id == "my_compute_id" -def test_hypervisor_local(hypervisor): +def test_compute_local(compute): """ - If the hypervisor is local but the hypervisor id is local + If the compute is local but the compute id is local it's a configuration issue """ with patch("gns3server.config.Config.get_section_config", return_value={"local": False}): - with pytest.raises(HypervisorError): - s = Hypervisor("local", controller=MagicMock()) + with pytest.raises(ComputeError): + s = Compute("local", controller=MagicMock()) with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): - s = Hypervisor("test", controller=MagicMock()) + s = Compute("test", controller=MagicMock()) -def test_hypervisor_httpQuery(hypervisor, async_run): +def test_compute_httpQuery(compute, async_run): response = MagicMock() with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: response.status = 200 - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_called_with("POST", "https://example.com:84/v2/hypervisor/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None) - assert hypervisor._auth is None + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None) + assert compute._auth is None -def test_hypervisor_httpQueryAuth(hypervisor, async_run): +def test_compute_httpQueryAuth(compute, async_run): response = MagicMock() with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: response.status = 200 - hypervisor.user = "root" - hypervisor.password = "toor" - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_called_with("POST", "https://example.com:84/v2/hypervisor/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=hypervisor._auth) - assert hypervisor._auth.login == "root" - assert hypervisor._auth.password == "toor" + compute.user = "root" + compute.password = "toor" + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=compute._auth) + assert compute._auth.login == "root" + assert compute._auth.password == "toor" -def test_hypervisor_httpQueryNotConnected(hypervisor, async_run): - hypervisor._connected = False +def test_compute_httpQueryNotConnected(compute, async_run): + compute._connected = False response = AsyncioMagicMock() response.read = AsyncioMagicMock(return_value=json.dumps({"version": __version__}).encode()) response.status = 200 with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_any_call("GET", "https://example.com:84/v2/hypervisor/version", headers={'content-type': 'application/json'}, data=None, auth=None) - mock.assert_any_call("POST", "https://example.com:84/v2/hypervisor/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None) - assert hypervisor._connected + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_any_call("GET", "https://example.com:84/v2/compute/version", headers={'content-type': 'application/json'}, data=None, auth=None) + mock.assert_any_call("POST", "https://example.com:84/v2/compute/projects", data='{"a": "b"}', headers={'content-type': 'application/json'}, auth=None) + assert compute._connected -def test_hypervisor_httpQueryNotConnectedInvalidVersion(hypervisor, async_run): - hypervisor._connected = False +def test_compute_httpQueryNotConnectedInvalidVersion(compute, async_run): + compute._connected = False response = AsyncioMagicMock() response.read = AsyncioMagicMock(return_value=json.dumps({"version": "1.42.4"}).encode()) response.status = 200 with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: with pytest.raises(aiohttp.web.HTTPConflict): - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_any_call("GET", "https://example.com:84/v2/hypervisor/version", headers={'content-type': 'application/json'}, data=None, auth=None) + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_any_call("GET", "https://example.com:84/v2/compute/version", headers={'content-type': 'application/json'}, data=None, auth=None) -def test_hypervisor_httpQueryNotConnectedNonGNS3Server(hypervisor, async_run): - hypervisor._connected = False +def test_compute_httpQueryNotConnectedNonGNS3Server(compute, async_run): + compute._connected = False response = AsyncioMagicMock() response.read = AsyncioMagicMock(return_value=b'Blocked by super antivirus') response.status = 200 with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: with pytest.raises(aiohttp.web.HTTPConflict): - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_any_call("GET", "https://example.com:84/v2/hypervisor/version", headers={'content-type': 'application/json'}, data=None, auth=None) + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_any_call("GET", "https://example.com:84/v2/compute/version", headers={'content-type': 'application/json'}, data=None, auth=None) -def test_hypervisor_httpQueryNotConnectedNonGNS3Server2(hypervisor, async_run): - hypervisor._connected = False +def test_compute_httpQueryNotConnectedNonGNS3Server2(compute, async_run): + compute._connected = False response = AsyncioMagicMock() response.read = AsyncioMagicMock(return_value=b'{}') response.status = 200 with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: with pytest.raises(aiohttp.web.HTTPConflict): - async_run(hypervisor.post("/projects", {"a": "b"})) - mock.assert_any_call("GET", "https://example.com:84/v2/hypervisor/version", headers={'content-type': 'application/json'}, data=None, auth=None) + async_run(compute.post("/projects", {"a": "b"})) + mock.assert_any_call("GET", "https://example.com:84/v2/compute/version", headers={'content-type': 'application/json'}, data=None, auth=None) -def test_hypervisor_httpQueryError(hypervisor, async_run): +def test_compute_httpQueryError(compute, async_run): response = MagicMock() with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: response.status = 409 with pytest.raises(aiohttp.web.HTTPConflict): - async_run(hypervisor.post("/projects", {"a": "b"})) + async_run(compute.post("/projects", {"a": "b"})) -def test_hypervisor_httpQuery_project(hypervisor, async_run): +def test_compute_httpQuery_project(compute, async_run): response = MagicMock() with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock: response.status = 200 project = Project() - async_run(hypervisor.post("/projects", project)) - mock.assert_called_with("POST", "https://example.com:84/v2/hypervisor/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None) + async_run(compute.post("/projects", project)) + mock.assert_called_with("POST", "https://example.com:84/v2/compute/projects", data=json.dumps(project.__json__()), headers={'content-type': 'application/json'}, auth=None) -def test_connectNotification(hypervisor, async_run): +def test_connectNotification(compute, async_run): ws_mock = AsyncioMagicMock() call = 0 @@ -159,20 +159,20 @@ def test_connectNotification(hypervisor, async_run): response.tp = aiohttp.MsgType.closed return response - hypervisor._controller = MagicMock() - hypervisor._session = AsyncioMagicMock(return_value=ws_mock) - hypervisor._session.ws_connect = AsyncioMagicMock(return_value=ws_mock) + compute._controller = MagicMock() + compute._session = AsyncioMagicMock(return_value=ws_mock) + compute._session.ws_connect = AsyncioMagicMock(return_value=ws_mock) ws_mock.receive = receive - async_run(hypervisor._connectNotification()) + async_run(compute._connectNotification()) - hypervisor._controller.emit.assert_called_with('test', {'a': 1}, hypervisor_id=hypervisor.id, project_id='42') - assert hypervisor._connected is False + compute._controller.emit.assert_called_with('test', {'a': 1}, compute_id=compute.id, project_id='42') + assert compute._connected is False -def test_json(hypervisor): - hypervisor.user = "test" - assert hypervisor.__json__() == { - "hypervisor_id": "my_hypervisor_id", +def test_json(compute): + compute.user = "test" + assert compute.__json__() == { + "compute_id": "my_compute_id", "protocol": "https", "host": "example.com", "port": 84, diff --git a/tests/controller/test_controller.py b/tests/controller/test_controller.py index 6f1d2ad8..90fd057a 100644 --- a/tests/controller/test_controller.py +++ b/tests/controller/test_controller.py @@ -22,7 +22,7 @@ from unittest.mock import MagicMock from gns3server.controller import Controller -from gns3server.controller.hypervisor import Hypervisor +from gns3server.controller.compute import Compute from gns3server.controller.project import Project from gns3server.config import Config @@ -34,22 +34,22 @@ def test_isEnabled(controller): assert controller.isEnabled() -def test_addHypervisor(controller, async_run): - async_run(controller.addHypervisor("test1")) - assert len(controller.hypervisors) == 1 - async_run(controller.addHypervisor("test1")) - assert len(controller.hypervisors) == 1 - async_run(controller.addHypervisor("test2")) - assert len(controller.hypervisors) == 2 +def test_addCompute(controller, async_run): + async_run(controller.addCompute("test1")) + assert len(controller.computes) == 1 + async_run(controller.addCompute("test1")) + assert len(controller.computes) == 1 + async_run(controller.addCompute("test2")) + assert len(controller.computes) == 2 -def test_getHypervisor(controller, async_run): +def test_getCompute(controller, async_run): - hypervisor = async_run(controller.addHypervisor("test1")) + compute = async_run(controller.addCompute("test1")) - assert controller.getHypervisor("test1") == hypervisor + assert controller.getCompute("test1") == compute with pytest.raises(aiohttp.web.HTTPNotFound): - assert controller.getHypervisor("dsdssd") + assert controller.getCompute("dsdssd") def test_addProject(controller, async_run): @@ -74,15 +74,15 @@ def test_removeProject(controller, async_run): assert len(controller.projects) == 0 -def test_addProject_with_hypervisor(controller, async_run): +def test_addProject_with_compute(controller, async_run): uuid1 = str(uuid.uuid4()) - hypervisor = Hypervisor("test1", controller=MagicMock()) - hypervisor.post = MagicMock() - controller._hypervisors = {"test1": hypervisor} + compute = Compute("test1", controller=MagicMock()) + compute.post = MagicMock() + controller._computes = {"test1": compute} project1 = async_run(controller.addProject(project_id=uuid1)) - hypervisor.post.assert_called_with("/projects", project1) + compute.post.assert_called_with("/projects", project1) def test_getProject(controller, async_run): diff --git a/tests/controller/test_link.py b/tests/controller/test_link.py index 5b942826..4c509711 100644 --- a/tests/controller/test_link.py +++ b/tests/controller/test_link.py @@ -20,7 +20,7 @@ from unittest.mock import MagicMock from gns3server.controller.link import Link from gns3server.controller.vm import VM -from gns3server.controller.hypervisor import Hypervisor +from gns3server.controller.compute import Compute from gns3server.controller.project import Project @@ -30,12 +30,12 @@ def project(): @pytest.fixture -def hypervisor(): - return Hypervisor("example.com", controller=MagicMock()) +def compute(): + return Compute("example.com", controller=MagicMock()) -def test_addVM(async_run, project, hypervisor): - vm1 = VM(project, hypervisor) +def test_addVM(async_run, project, compute): + vm1 = VM(project, compute) link = Link(project) async_run(link.addVM(vm1, 0, 4)) @@ -48,9 +48,9 @@ def test_addVM(async_run, project, hypervisor): ] -def test_json(async_run, project, hypervisor): - vm1 = VM(project, hypervisor) - vm2 = VM(project, hypervisor) +def test_json(async_run, project, compute): + vm1 = VM(project, compute) + vm2 = VM(project, compute) link = Link(project) async_run(link.addVM(vm1, 0, 4)) diff --git a/tests/controller/test_project.py b/tests/controller/test_project.py index 51bc1204..27dac1e6 100644 --- a/tests/controller/test_project.py +++ b/tests/controller/test_project.py @@ -39,31 +39,31 @@ def test_json(tmpdir): def test_addVM(async_run): - hypervisor = MagicMock() + compute = MagicMock() project = Project() response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) - vm = async_run(project.addVM(hypervisor, None, name="test", vm_type="vpcs", properties={"startup_config": "test.cfg"})) + vm = async_run(project.addVM(compute, None, name="test", vm_type="vpcs", properties={"startup_config": "test.cfg"})) - hypervisor.post.assert_called_with('/projects/{}/vpcs/vms'.format(project.id), - data={'vm_id': vm.id, - 'console_type': 'telnet', - 'startup_config': 'test.cfg', - 'name': 'test'}) + compute.post.assert_called_with('/projects/{}/vpcs/vms'.format(project.id), + data={'vm_id': vm.id, + 'console_type': 'telnet', + 'startup_config': 'test.cfg', + 'name': 'test'}) def test_getVM(async_run): - hypervisor = MagicMock() + compute = MagicMock() project = Project() response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) - vm = async_run(project.addVM(hypervisor, None, name="test", vm_type="vpcs", properties={"startup_config": "test.cfg"})) + vm = async_run(project.addVM(compute, None, name="test", vm_type="vpcs", properties={"startup_config": "test.cfg"})) assert project.getVM(vm.id) == vm with pytest.raises(aiohttp.web_exceptions.HTTPNotFound): @@ -71,15 +71,15 @@ def test_getVM(async_run): def test_addLink(async_run): - hypervisor = MagicMock() + compute = MagicMock() project = Project() response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) - vm1 = async_run(project.addVM(hypervisor, None, name="test1", vm_type="vpcs", properties={"startup_config": "test.cfg"})) - vm2 = async_run(project.addVM(hypervisor, None, name="test2", vm_type="vpcs", properties={"startup_config": "test.cfg"})) + vm1 = async_run(project.addVM(compute, None, name="test1", vm_type="vpcs", properties={"startup_config": "test.cfg"})) + vm2 = async_run(project.addVM(compute, None, name="test2", vm_type="vpcs", properties={"startup_config": "test.cfg"})) link = async_run(project.addLink()) async_run(link.addVM(vm1, 3, 1)) async_run(link.addVM(vm2, 4, 2)) @@ -87,12 +87,12 @@ def test_addLink(async_run): def test_getLink(async_run): - hypervisor = MagicMock() + compute = MagicMock() project = Project() response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) link = async_run(project.addLink()) assert project.getLink(link.id) == link diff --git a/tests/controller/test_udp_link.py b/tests/controller/test_udp_link.py index 7335bc51..8bb2ca3e 100644 --- a/tests/controller/test_udp_link.py +++ b/tests/controller/test_udp_link.py @@ -21,7 +21,7 @@ import aiohttp from unittest.mock import MagicMock from gns3server.controller.project import Project -from gns3server.controller.hypervisor import Hypervisor +from gns3server.controller.compute import Compute from gns3server.controller.udp_link import UDPLink from gns3server.controller.vm import VM @@ -32,18 +32,18 @@ def project(): def test_create(async_run, project): - hypervisor1 = MagicMock() - hypervisor2 = MagicMock() + compute1 = MagicMock() + compute2 = MagicMock() - vm1 = VM(project, hypervisor1, vm_type="vpcs") - vm2 = VM(project, hypervisor2, vm_type="vpcs") + vm1 = VM(project, compute1, vm_type="vpcs") + vm2 = VM(project, compute2, vm_type="vpcs") link = UDPLink(project) async_run(link.addVM(vm1, 0, 4)) async_run(link.addVM(vm2, 3, 1)) @asyncio.coroutine - def hypervisor1_callback(path, data={}): + def compute1_callback(path, data={}): """ Fake server """ @@ -53,7 +53,7 @@ def test_create(async_run, project): return response @asyncio.coroutine - def hypervisor2_callback(path, data={}): + def compute2_callback(path, data={}): """ Fake server """ @@ -62,32 +62,32 @@ def test_create(async_run, project): response.json = {"udp_port": 2048} return response - hypervisor1.post.side_effect = hypervisor1_callback - hypervisor1.host = "example.com" - hypervisor2.post.side_effect = hypervisor2_callback - hypervisor2.host = "example.org" + compute1.post.side_effect = compute1_callback + compute1.host = "example.com" + compute2.post.side_effect = compute2_callback + compute2.host = "example.org" async_run(link.create()) - hypervisor1.post.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/0/ports/4/nio".format(project.id, vm1.id), data={ + compute1.post.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/0/ports/4/nio".format(project.id, vm1.id), data={ "lport": 1024, - "rhost": hypervisor2.host, + "rhost": compute2.host, "rport": 2048, "type": "nio_udp" }) - hypervisor2.post.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/3/ports/1/nio".format(project.id, vm2.id), data={ + compute2.post.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/3/ports/1/nio".format(project.id, vm2.id), data={ "lport": 2048, - "rhost": hypervisor1.host, + "rhost": compute1.host, "rport": 1024, "type": "nio_udp" }) def test_delete(async_run, project): - hypervisor1 = MagicMock() - hypervisor2 = MagicMock() + compute1 = MagicMock() + compute2 = MagicMock() - vm1 = VM(project, hypervisor1, vm_type="vpcs") - vm2 = VM(project, hypervisor2, vm_type="vpcs") + vm1 = VM(project, compute1, vm_type="vpcs") + vm2 = VM(project, compute2, vm_type="vpcs") link = UDPLink(project) async_run(link.addVM(vm1, 0, 4)) @@ -95,5 +95,5 @@ def test_delete(async_run, project): async_run(link.delete()) - hypervisor1.delete.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/0/ports/4/nio".format(project.id, vm1.id)) - hypervisor2.delete.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/3/ports/1/nio".format(project.id, vm2.id)) + compute1.delete.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/0/ports/4/nio".format(project.id, vm1.id)) + compute2.delete.assert_any_call("/projects/{}/vpcs/vms/{}/adapters/3/ports/1/nio".format(project.id, vm2.id)) diff --git a/tests/controller/test_vm.py b/tests/controller/test_vm.py index bc649f43..d36ccaf9 100644 --- a/tests/controller/test_vm.py +++ b/tests/controller/test_vm.py @@ -28,16 +28,16 @@ from gns3server.controller.project import Project @pytest.fixture -def hypervisor(): +def compute(): s = AsyncioMagicMock() s.id = "http://test.com:42" return s @pytest.fixture -def vm(hypervisor): +def vm(compute): project = Project(str(uuid.uuid4())) - vm = VM(project, hypervisor, + vm = VM(project, compute, name="demo", vm_id=str(uuid.uuid4()), vm_type="vpcs", @@ -46,9 +46,9 @@ def vm(hypervisor): return vm -def test_json(vm, hypervisor): +def test_json(vm, compute): assert vm.__json__() == { - "hypervisor_id": hypervisor.id, + "compute_id": compute.id, "project_id": vm.project.id, "vm_id": vm.id, "vm_type": vm.vm_type, @@ -59,19 +59,19 @@ def test_json(vm, hypervisor): } -def test_init_without_uuid(project, hypervisor): - vm = VM(project, hypervisor, +def test_init_without_uuid(project, compute): + vm = VM(project, compute, vm_type="vpcs", console_type="vnc") assert vm.id is not None -def test_create(vm, hypervisor, project, async_run): +def test_create(vm, compute, project, async_run): vm._console = 2048 response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) async_run(vm.create()) data = { @@ -81,43 +81,43 @@ def test_create(vm, hypervisor, project, async_run): "startup_script": "echo test", "name": "demo" } - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms".format(vm.project.id), data=data) + compute.post.assert_called_with("/projects/{}/vpcs/vms".format(vm.project.id), data=data) assert vm._console == 2048 assert vm._properties == {"startup_script": "echo test"} -def test_start(vm, hypervisor, project, async_run): +def test_start(vm, compute, project, async_run): - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() async_run(vm.start()) - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms/{}/start".format(vm.project.id, vm.id)) + compute.post.assert_called_with("/projects/{}/vpcs/vms/{}/start".format(vm.project.id, vm.id)) -def test_stop(vm, hypervisor, project, async_run): +def test_stop(vm, compute, project, async_run): - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() async_run(vm.stop()) - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms/{}/stop".format(vm.project.id, vm.id)) + compute.post.assert_called_with("/projects/{}/vpcs/vms/{}/stop".format(vm.project.id, vm.id)) -def test_suspend(vm, hypervisor, project, async_run): +def test_suspend(vm, compute, project, async_run): - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() async_run(vm.suspend()) - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms/{}/suspend".format(vm.project.id, vm.id)) + compute.post.assert_called_with("/projects/{}/vpcs/vms/{}/suspend".format(vm.project.id, vm.id)) -def test_create_without_console(vm, hypervisor, project, async_run): +def test_create_without_console(vm, compute, project, async_run): """ None properties should be send. Because it can mean the emulator doesn"t support it """ response = MagicMock() response.json = {"console": 2048, "test_value": "success"} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) async_run(vm.create()) data = { @@ -126,16 +126,16 @@ def test_create_without_console(vm, hypervisor, project, async_run): "startup_script": "echo test", "name": "demo" } - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms".format(vm.project.id), data=data) + compute.post.assert_called_with("/projects/{}/vpcs/vms".format(vm.project.id), data=data) assert vm._console == 2048 assert vm._properties == {"test_value": "success", "startup_script": "echo test"} -def test_post(vm, hypervisor, async_run): +def test_post(vm, compute, async_run): async_run(vm.post("/test", {"a": "b"})) - hypervisor.post.assert_called_with("/projects/{}/vpcs/vms/{}/test".format(vm.project.id, vm.id), data={"a": "b"}) + compute.post.assert_called_with("/projects/{}/vpcs/vms/{}/test".format(vm.project.id, vm.id), data={"a": "b"}) -def test_delete(vm, hypervisor, async_run): +def test_delete(vm, compute, async_run): async_run(vm.delete("/test")) - hypervisor.delete.assert_called_with("/projects/{}/vpcs/vms/{}/test".format(vm.project.id, vm.id)) + compute.delete.assert_called_with("/projects/{}/vpcs/vms/{}/test".format(vm.project.id, vm.id)) diff --git a/tests/handlers/api/base.py b/tests/handlers/api/base.py index 28499c8a..0b2c0667 100644 --- a/tests/handlers/api/base.py +++ b/tests/handlers/api/base.py @@ -32,7 +32,7 @@ class Query: def __init__(self, loop, host='localhost', port=8001, prefix='', api_version=None): """ - :param prefix: Prefix added before path (ex: /hypervisor) + :param prefix: Prefix added before path (ex: /compute) :param api_version: Version of the api """ self._loop = loop @@ -110,6 +110,8 @@ class Query: response.route = x_route.replace("/v{}".format(self._api_version), "") response.route = response.route .replace(self._prefix, "") + response.json = {} + response.html = "" if response.body is not None: if response.headers.get("CONTENT-TYPE", "") == "application/json": try: @@ -121,9 +123,7 @@ class Query: response.html = response.body.decode("utf-8") except UnicodeDecodeError: response.html = None - else: - response.json = {} - response.html = "" + if kwargs.get('example') and os.environ.get("PYTEST_BUILD_DOCUMENTATION") == "1": self._dump_example(method, response.route, path, body, response) return response diff --git a/tests/handlers/api/hypervisor/__init__.py b/tests/handlers/api/compute/__init__.py similarity index 100% rename from tests/handlers/api/hypervisor/__init__.py rename to tests/handlers/api/compute/__init__.py diff --git a/tests/handlers/api/hypervisor/test_config.py b/tests/handlers/api/compute/test_config.py similarity index 85% rename from tests/handlers/api/hypervisor/test_config.py rename to tests/handlers/api/compute/test_config.py index 0d6c6ea0..53efbb9c 100644 --- a/tests/handlers/api/hypervisor/test_config.py +++ b/tests/handlers/api/compute/test_config.py @@ -19,7 +19,7 @@ from unittest.mock import MagicMock, patch from gns3server.config import Config -def test_reload_accepted(http_hypervisor): +def test_reload_accepted(http_compute): gns_config = MagicMock() config = Config.instance() @@ -27,17 +27,17 @@ def test_reload_accepted(http_hypervisor): gns_config.get_section_config.return_value = config.get_section_config("Server") with patch("gns3server.config.Config.instance", return_value=gns_config): - response = http_hypervisor.post('/config/reload', example=True) + response = http_compute.post('/config/reload', example=True) assert response.status == 201 assert gns_config.reload.called -def test_reload_forbidden(http_hypervisor): +def test_reload_forbidden(http_compute): config = Config.instance() config.set("Server", "local", "false") - response = http_hypervisor.post('/config/reload') + response = http_compute.post('/config/reload') assert response.status == 403 diff --git a/tests/handlers/api/compute/test_docker.py b/tests/handlers/api/compute/test_docker.py new file mode 100644 index 00000000..15654e11 --- /dev/null +++ b/tests/handlers/api/compute/test_docker.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import pytest +import os +import stat +import sys +import uuid +import aiohttp + +from tests.utils import asyncio_patch +from unittest.mock import patch, MagicMock, PropertyMock +from gns3server.compute.docker import Docker + + +@pytest.fixture +def base_params(): + """Return standard parameters""" + return {"name": "PC TEST 1", "image": "nginx", "start_command": "nginx-daemon", "adapters": 2, "environment": "YES=1\nNO=0", "console_type": "telnet", "console_resolution": "1280x1024"} + + +@pytest.yield_fixture(autouse=True) +def mock_connection(): + docker = Docker.instance() + docker._connected = True + docker._connector = MagicMock() + yield + Docker._instance = None + + +@pytest.fixture +def vm(http_compute, project, base_params): + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]) as mock_list: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms".format(project_id=project.id), base_params) + if response.status != 201: + print(response.body) + assert response.status == 201 + return response.json + + +def test_docker_create(http_compute, project, base_params): + with asyncio_patch("gns3server.compute.docker.Docker.list_images", return_value=[{"image": "nginx"}]) as mock_list: + with asyncio_patch("gns3server.compute.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms".format(project_id=project.id), base_params) + assert response.status == 201 + assert response.route == "/projects/{project_id}/docker/vms" + assert response.json["name"] == "PC TEST 1" + assert response.json["project_id"] == project.id + assert response.json["container_id"] == "8bd8153ea8f5" + assert response.json["image"] == "nginx" + assert response.json["adapters"] == 2 + assert response.json["environment"] == "YES=1\nNO=0" + assert response.json["console_resolution"] == "1280x1024" + + +def test_docker_start(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + assert mock.called + assert response.status == 204 + + +def test_docker_stop(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + assert mock.called + assert response.status == 204 + + +def test_docker_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.restart", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + assert mock.called + assert response.status == 204 + + +def test_docker_delete(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.delete", return_value=True) as mock: + response = http_compute.delete("/projects/{project_id}/docker/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + assert mock.called + assert response.status == 204 + + +def test_docker_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.pause", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + assert mock.called + assert response.status == 204 + + +def test_docker_nio_create_udp(http_compute, vm): + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}, + example=True) + assert response.status == 201 + assert response.route == "/projects/{project_id}/docker/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" + assert response.json["type"] == "nio_udp" + + +def test_docker_delete_nio(http_compute, vm): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.adapter_remove_nio_binding") as mock: + response = http_compute.delete("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert response.status == 204 + assert response.route == "/projects/{project_id}/docker/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" + + +def test_docker_update(http_compute, vm, tmpdir, free_console_port): + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.update") as mock: + response = http_compute.put("/projects/{project_id}/docker/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", + "console": free_console_port, + "start_command": "yes", + "environment": "GNS3=1\nGNS4=0"}, + example=True) + assert mock.called + assert response.status == 200 + assert response.json["name"] == "test" + assert response.json["console"] == free_console_port + assert response.json["start_command"] == "yes" + assert response.json["environment"] == "GNS3=1\nGNS4=0" + + +def test_docker_start_capture(http_compute, vm, tmpdir, project): + + with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True) as mock: + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start_capture") as start_capture: + + params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params, example=True) + + assert response.status == 200 + + assert start_capture.called + assert "test.pcap" in response.json["pcap_file_path"] + + +def test_docker_start_capture_not_started(http_compute, vm, tmpdir): + + with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=False) as mock: + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.start_capture") as start_capture: + + params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params) + + assert not start_capture.called + assert response.status == 409 + + +def test_docker_stop_capture(http_compute, vm, tmpdir, project): + + with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=True) as mock: + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop_capture") as stop_capture: + + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + + assert response.status == 204 + + assert stop_capture.called + + +def test_docker_stop_capture_not_started(http_compute, vm, tmpdir): + + with patch("gns3server.compute.docker.docker_vm.DockerVM.is_running", return_value=False) as mock: + with asyncio_patch("gns3server.compute.docker.docker_vm.DockerVM.stop_capture") as stop_capture: + + response = http_compute.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + + assert not stop_capture.called + assert response.status == 409 diff --git a/tests/handlers/api/hypervisor/test_dynamips.py b/tests/handlers/api/compute/test_dynamips.py similarity index 57% rename from tests/handlers/api/hypervisor/test_dynamips.py rename to tests/handlers/api/compute/test_dynamips.py index 81de3f72..bee95dc3 100644 --- a/tests/handlers/api/hypervisor/test_dynamips.py +++ b/tests/handlers/api/compute/test_dynamips.py @@ -24,25 +24,25 @@ from tests.utils import asyncio_patch # @pytest.yield_fixture(scope="module") -# def vm(http_hypervisor, project): +# def vm(http_compute, project): # # dynamips_path = "/fake/dynamips" -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.create", return_value=True) as mock: -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms".format(project_id=project.id), {"name": "My router", +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True) as mock: +# response = http_compute.post("/projects/{project_id}/dynamips/vms".format(project_id=project.id), {"name": "My router", # "platform": "c3745", # "image": "somewhere", # "ram": 128}) # assert mock.called # assert response.status == 201 # -# with asyncio_patch("gns3server.hypervisor.dynamips.Dynamips.find_dynamips", return_value=dynamips_path): +# with asyncio_patch("gns3server.compute.dynamips.Dynamips.find_dynamips", return_value=dynamips_path): # yield response.json # # -# def test_dynamips_vm_create(http_hypervisor, project): +# def test_dynamips_vm_create(http_compute, project): # -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.create", return_value=True): -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms".format(project_id=project.id), {"name": "My router", +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.create", return_value=True): +# response = http_compute.post("/projects/{project_id}/dynamips/vms".format(project_id=project.id), {"name": "My router", # "platform": "c3745", # "image": "somewhere", # "ram": 128}, @@ -53,46 +53,46 @@ from tests.utils import asyncio_patch # assert response.json["dynamips_id"] # # -# def test_dynamips_vm_get(http_hypervisor, project, vm): -# response = http_hypervisor.get("/projects/{project_id}/dynamips/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +# def test_dynamips_vm_get(http_compute, project, vm): +# response = http_compute.get("/projects/{project_id}/dynamips/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) # assert response.status == 200 # assert response.route == "/projects/{project_id}/dynamips/vms/{vm_id}" # assert response.json["name"] == "My router" # assert response.json["project_id"] == project.id # # -# def test_dynamips_vm_start(http_hypervisor, vm): -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.start", return_value=True) as mock: -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) +# def test_dynamips_vm_start(http_compute, vm): +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.start", return_value=True) as mock: +# response = http_compute.post("/projects/{project_id}/dynamips/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) # assert mock.called # assert response.status == 204 # # -# def test_dynamips_vm_stop(http_hypervisor, vm): -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.stop", return_value=True) as mock: -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) +# def test_dynamips_vm_stop(http_compute, vm): +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.stop", return_value=True) as mock: +# response = http_compute.post("/projects/{project_id}/dynamips/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) # assert mock.called # assert response.status == 204 # # -# def test_dynamips_vm_suspend(http_hypervisor, vm): -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.suspend", return_value=True) as mock: -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) +# def test_dynamips_vm_suspend(http_compute, vm): +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.suspend", return_value=True) as mock: +# response = http_compute.post("/projects/{project_id}/dynamips/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) # assert mock.called # assert response.status == 204 # # -# def test_dynamips_vm_resume(http_hypervisor, vm): -# with asyncio_patch("gns3server.hypervisor.dynamips.nodes.router.Router.resume", return_value=True) as mock: -# response = http_hypervisor.post("/projects/{project_id}/dynamips/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) +# def test_dynamips_vm_resume(http_compute, vm): +# with asyncio_patch("gns3server.compute.dynamips.nodes.router.Router.resume", return_value=True) as mock: +# response = http_compute.post("/projects/{project_id}/dynamips/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) # assert mock.called # assert response.status == 204 -# def test_vbox_nio_create_udp(http_hypervisor, vm): +# def test_vbox_nio_create_udp(http_compute, vm): # -# with asyncio_patch('gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock: -# response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/nio".format(project_id=vm["project_id"], +# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock: +# response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/nio".format(project_id=vm["project_id"], # vm_id=vm["vm_id"]), {"type": "nio_udp", # "lport": 4242, # "rport": 4343, @@ -108,10 +108,10 @@ from tests.utils import asyncio_patch # assert response.json["type"] == "nio_udp" # # -# def test_vbox_delete_nio(http_hypervisor, vm): +# def test_vbox_delete_nio(http_compute, vm): # -# with asyncio_patch('gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock: -# response = http_hypervisor.delete("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +# with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock: +# response = http_compute.delete("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) # # assert mock.called # args, kwgars = mock.call_args @@ -121,8 +121,8 @@ from tests.utils import asyncio_patch # assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/{adapter_id:\d+}/nio" # # -# def test_vbox_update(http_hypervisor, vm, free_console_port): -# response = http_hypervisor.put("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", +# def test_vbox_update(http_compute, vm, free_console_port): +# response = http_compute.put("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", # "console": free_console_port}) # assert response.status == 200 # assert response.json["name"] == "test" @@ -151,17 +151,17 @@ def fake_file(tmpdir): return path -def test_vms(http_hypervisor, tmpdir, fake_dynamips, fake_file): +def test_vms(http_compute, tmpdir, fake_dynamips, fake_file): - with patch("gns3server.hypervisor.Dynamips.get_images_directory", return_value=str(tmpdir), example=True): - response = http_hypervisor.get("/dynamips/vms") + with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir), example=True): + response = http_compute.get("/dynamips/vms") assert response.status == 200 assert response.json == [{"filename": "7200.bin", "path": "7200.bin"}] -def test_upload_vm(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.Dynamips.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/dynamips/vms/test2", body="TEST", raw=True) +def test_upload_vm(http_compute, tmpdir): + with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/dynamips/vms/test2", body="TEST", raw=True) assert response.status == 204 with open(str(tmpdir / "test2")) as f: @@ -172,11 +172,11 @@ def test_upload_vm(http_hypervisor, tmpdir): assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf" -def test_upload_vm_permission_denied(http_hypervisor, tmpdir): +def test_upload_vm_permission_denied(http_compute, tmpdir): with open(str(tmpdir / "test2"), "w+") as f: f.write("") os.chmod(str(tmpdir / "test2"), 0) - with patch("gns3server.hypervisor.Dynamips.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/dynamips/vms/test2", body="TEST", raw=True) + with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/dynamips/vms/test2", body="TEST", raw=True) assert response.status == 409 diff --git a/tests/handlers/api/hypervisor/test_file.py b/tests/handlers/api/compute/test_file.py similarity index 83% rename from tests/handlers/api/hypervisor/test_file.py rename to tests/handlers/api/compute/test_file.py index 1c86a85d..76b692a4 100644 --- a/tests/handlers/api/hypervisor/test_file.py +++ b/tests/handlers/api/compute/test_file.py @@ -26,14 +26,14 @@ import aiohttp from gns3server.version import __version__ -def test_stream(http_hypervisor, tmpdir, loop): +def test_stream(http_compute, tmpdir, loop): with open(str(tmpdir / "test"), 'w+') as f: f.write("hello") def go(future): query = json.dumps({"location": str(tmpdir / "test")}) headers = {'content-type': 'application/json'} - response = yield from aiohttp.request("GET", http_hypervisor.get_url("/files/stream"), data=query, headers=headers) + response = yield from aiohttp.request("GET", http_compute.get_url("/files/stream"), data=query, headers=headers) response.body = yield from response.content.read(5) with open(str(tmpdir / "test"), 'a') as f: f.write("world") @@ -48,11 +48,11 @@ def test_stream(http_hypervisor, tmpdir, loop): assert response.body == b'helloworld' -def test_stream_file_not_found(http_hypervisor, tmpdir, loop): +def test_stream_file_not_found(http_compute, tmpdir, loop): def go(future): query = json.dumps({"location": str(tmpdir / "test")}) headers = {'content-type': 'application/json'} - response = yield from aiohttp.request("GET", http_hypervisor.get_url("/files/stream"), data=query, headers=headers) + response = yield from aiohttp.request("GET", http_compute.get_url("/files/stream"), data=query, headers=headers) response.close() future.set_result(response) diff --git a/tests/handlers/api/hypervisor/test_iou.py b/tests/handlers/api/compute/test_iou.py similarity index 55% rename from tests/handlers/api/hypervisor/test_iou.py rename to tests/handlers/api/compute/test_iou.py index 69e359ea..531133b9 100644 --- a/tests/handlers/api/hypervisor/test_iou.py +++ b/tests/handlers/api/compute/test_iou.py @@ -46,8 +46,8 @@ def base_params(tmpdir, fake_iou_bin): @pytest.fixture -def vm(http_hypervisor, project, base_params): - response = http_hypervisor.post("/projects/{project_id}/iou/vms".format(project_id=project.id), base_params) +def vm(http_compute, project, base_params): + response = http_compute.post("/projects/{project_id}/iou/vms".format(project_id=project.id), base_params) assert response.status == 201 return response.json @@ -58,8 +58,8 @@ def startup_config_file(project, vm): return os.path.join(directory, "startup-config.cfg") -def test_iou_create(http_hypervisor, project, base_params): - response = http_hypervisor.post("/projects/{project_id}/iou/vms".format(project_id=project.id), base_params) +def test_iou_create(http_compute, project, base_params): + response = http_compute.post("/projects/{project_id}/iou/vms".format(project_id=project.id), base_params) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms" assert response.json["name"] == "PC TEST 1" @@ -71,7 +71,7 @@ def test_iou_create(http_hypervisor, project, base_params): assert response.json["l1_keepalives"] is False -def test_iou_create_with_params(http_hypervisor, project, base_params): +def test_iou_create_with_params(http_compute, project, base_params): params = base_params params["ram"] = 1024 params["nvram"] = 512 @@ -82,7 +82,7 @@ def test_iou_create_with_params(http_hypervisor, project, base_params): params["use_default_iou_values"] = True params["iourc_content"] = "test" - response = http_hypervisor.post("/projects/{project_id}/iou/vms".format(project_id=project.id), params, example=True) + response = http_compute.post("/projects/{project_id}/iou/vms".format(project_id=project.id), params, example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms" assert response.json["name"] == "PC TEST 1" @@ -101,7 +101,7 @@ def test_iou_create_with_params(http_hypervisor, project, base_params): assert "iourc" in response.json["iourc_path"] -def test_iou_create_startup_config_already_exist(http_hypervisor, project, base_params): +def test_iou_create_startup_config_already_exist(http_compute, project, base_params): """We don't erase a startup-config if already exist at project creation""" vm_id = str(uuid.uuid4()) @@ -113,7 +113,7 @@ def test_iou_create_startup_config_already_exist(http_hypervisor, project, base_ params["vm_id"] = vm_id params["startup_config_content"] = "hostname test" - response = http_hypervisor.post("/projects/{project_id}/iou/vms".format(project_id=project.id), params, example=True) + response = http_compute.post("/projects/{project_id}/iou/vms".format(project_id=project.id), params, example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms" @@ -122,8 +122,8 @@ def test_iou_create_startup_config_already_exist(http_hypervisor, project, base_ assert f.read() == "echo hello" -def test_iou_get(http_hypervisor, project, vm): - response = http_hypervisor.get("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_iou_get(http_compute, project, vm): + response = http_compute.get("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 200 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}" assert response.json["name"] == "PC TEST 1" @@ -135,50 +135,50 @@ def test_iou_get(http_hypervisor, project, vm): assert response.json["l1_keepalives"] is False -def test_iou_start(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) +def test_iou_start(http_compute, vm): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) assert mock.called assert response.status == 200 assert response.json["name"] == "PC TEST 1" -def test_iou_start_with_iourc(http_hypervisor, vm, tmpdir): +def test_iou_start_with_iourc(http_compute, vm, tmpdir): body = {"iourc_content": "test"} - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=body, example=True) + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=body, example=True) assert mock.called assert response.status == 200 - response = http_hypervisor.get("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + response = http_compute.get("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) assert response.status == 200 with open(response.json["iourc_path"]) as f: assert f.read() == "test" -def test_iou_stop(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.stop", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_iou_stop(http_compute, vm): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_iou_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.reload", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_iou_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.reload", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_iou_delete(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.iou.IOU.delete_vm", return_value=True) as mock: - response = http_hypervisor.delete("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_iou_delete(http_compute, vm): + with asyncio_patch("gns3server.compute.iou.IOU.delete_vm", return_value=True) as mock: + response = http_compute.delete("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_iou_update(http_hypervisor, vm, tmpdir, free_console_port, project): +def test_iou_update(http_compute, vm, tmpdir, free_console_port, project): params = { "name": "test", "console": free_console_port, @@ -191,7 +191,7 @@ def test_iou_update(http_hypervisor, vm, tmpdir, free_console_port, project): "use_default_iou_values": True, "iourc_content": "test" } - response = http_hypervisor.put("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), params, example=True) + response = http_compute.put("/projects/{project_id}/iou/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), params, example=True) assert response.status == 200 assert response.json["name"] == "test" assert response.json["console"] == free_console_port @@ -208,65 +208,65 @@ def test_iou_update(http_hypervisor, vm, tmpdir, free_console_port, project): assert "iourc" in response.json["iourc_path"] -def test_iou_nio_create_udp(http_hypervisor, vm): - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}, - example=True) +def test_iou_nio_create_udp(http_compute, vm): + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}, + example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_udp" -def test_iou_nio_create_ethernet(http_hypervisor, vm, ethernet_device): - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", - "ethernet_device": ethernet_device, - }, - example=True) +def test_iou_nio_create_ethernet(http_compute, vm, ethernet_device): + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", + "ethernet_device": ethernet_device, + }, + example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_generic_ethernet" assert response.json["ethernet_device"] == ethernet_device -def test_iou_nio_create_ethernet_different_port(http_hypervisor, vm, ethernet_device): - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/3/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", - "ethernet_device": ethernet_device, - }, - example=False) +def test_iou_nio_create_ethernet_different_port(http_compute, vm, ethernet_device): + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/3/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", + "ethernet_device": ethernet_device, + }, + example=False) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_generic_ethernet" assert response.json["ethernet_device"] == ethernet_device -def test_iou_nio_create_tap(http_hypervisor, vm, ethernet_device): - with patch("gns3server.hypervisor.base_manager.BaseManager.has_privileged_access", return_value=True): - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_tap", - "tap_device": ethernet_device}) +def test_iou_nio_create_tap(http_compute, vm, ethernet_device): + with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_tap", + "tap_device": ethernet_device}) assert response.status == 201 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_tap" -def test_iou_delete_nio(http_hypervisor, vm): - http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}) - response = http_hypervisor.delete("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_iou_delete_nio(http_compute, vm): + http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}) + response = http_compute.delete("/projects/{project_id}/iou/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 204 assert response.route == "/projects/{project_id}/iou/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" -def test_iou_start_capture(http_hypervisor, vm, tmpdir, project): +def test_iou_start_capture(http_compute, vm, tmpdir, project): - with patch("gns3server.hypervisor.iou.iou_vm.IOUVM.is_running", return_value=True) as mock: - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.start_capture") as start_capture: + with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True) as mock: + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start_capture") as start_capture: params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params, example=True) + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params, example=True) assert response.status == 200 @@ -274,71 +274,71 @@ def test_iou_start_capture(http_hypervisor, vm, tmpdir, project): assert "test.pcap" in response.json["pcap_file_path"] -def test_iou_start_capture_not_started(http_hypervisor, vm, tmpdir): +def test_iou_start_capture_not_started(http_compute, vm, tmpdir): - with patch("gns3server.hypervisor.iou.iou_vm.IOUVM.is_running", return_value=False) as mock: - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.start_capture") as start_capture: + with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=False) as mock: + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.start_capture") as start_capture: params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params) + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params) assert not start_capture.called assert response.status == 409 -def test_iou_stop_capture(http_hypervisor, vm, tmpdir, project): +def test_iou_stop_capture(http_compute, vm, tmpdir, project): - with patch("gns3server.hypervisor.iou.iou_vm.IOUVM.is_running", return_value=True) as mock: - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.stop_capture") as stop_capture: + with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=True) as mock: + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop_capture") as stop_capture: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 204 assert stop_capture.called -def test_iou_stop_capture_not_started(http_hypervisor, vm, tmpdir): +def test_iou_stop_capture_not_started(http_compute, vm, tmpdir): - with patch("gns3server.hypervisor.iou.iou_vm.IOUVM.is_running", return_value=False) as mock: - with asyncio_patch("gns3server.hypervisor.iou.iou_vm.IOUVM.stop_capture") as stop_capture: + with patch("gns3server.compute.iou.iou_vm.IOUVM.is_running", return_value=False) as mock: + with asyncio_patch("gns3server.compute.iou.iou_vm.IOUVM.stop_capture") as stop_capture: - response = http_hypervisor.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) + response = http_compute.post("/projects/{project_id}/iou/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) assert not stop_capture.called assert response.status == 409 -def test_get_configs_without_configs_file(http_hypervisor, vm): +def test_get_configs_without_configs_file(http_compute, vm): - response = http_hypervisor.get("/projects/{project_id}/iou/vms/{vm_id}/configs".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + response = http_compute.get("/projects/{project_id}/iou/vms/{vm_id}/configs".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 200 assert "startup_config" not in response.json assert "private_config" not in response.json -def test_get_configs_with_startup_config_file(http_hypervisor, project, vm): +def test_get_configs_with_startup_config_file(http_compute, project, vm): path = startup_config_file(project, vm) with open(path, "w+") as f: f.write("TEST") - response = http_hypervisor.get("/projects/{project_id}/iou/vms/{vm_id}/configs".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + response = http_compute.get("/projects/{project_id}/iou/vms/{vm_id}/configs".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 200 assert response.json["startup_config_content"] == "TEST" -def test_vms(http_hypervisor, tmpdir, fake_iou_bin): +def test_vms(http_compute, tmpdir, fake_iou_bin): - with patch("gns3server.hypervisor.IOU.get_images_directory", return_value=str(tmpdir)): - response = http_hypervisor.get("/iou/vms", example=True) + with patch("gns3server.compute.IOU.get_images_directory", return_value=str(tmpdir)): + response = http_compute.get("/iou/vms", example=True) assert response.status == 200 assert response.json == [{"filename": "iou.bin", "path": "iou.bin"}] -def test_upload_vm(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.IOU.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/iou/vms/test2", body="TEST", raw=True) +def test_upload_vm(http_compute, tmpdir): + with patch("gns3server.compute.IOU.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/iou/vms/test2", body="TEST", raw=True) assert response.status == 204 with open(str(tmpdir / "test2")) as f: @@ -349,11 +349,11 @@ def test_upload_vm(http_hypervisor, tmpdir): assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf" -def test_upload_vm_permission_denied(http_hypervisor, tmpdir): +def test_upload_vm_permission_denied(http_compute, tmpdir): with open(str(tmpdir / "test2"), "w+") as f: f.write("") os.chmod(str(tmpdir / "test2"), 0) - with patch("gns3server.hypervisor.IOU.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/iou/vms/test2", body="TEST", raw=True) + with patch("gns3server.compute.IOU.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/iou/vms/test2", body="TEST", raw=True) assert response.status == 409 diff --git a/tests/handlers/api/hypervisor/test_network.py b/tests/handlers/api/compute/test_network.py similarity index 80% rename from tests/handlers/api/hypervisor/test_network.py rename to tests/handlers/api/compute/test_network.py index ccaf7958..32d0502a 100644 --- a/tests/handlers/api/hypervisor/test_network.py +++ b/tests/handlers/api/compute/test_network.py @@ -19,15 +19,15 @@ import os import pytest -def test_udp_allocation(http_hypervisor, project): - response = http_hypervisor.post('/projects/{}/ports/udp'.format(project.id), {}, example=True) +def test_udp_allocation(http_compute, project): + response = http_compute.post('/projects/{}/ports/udp'.format(project.id), {}, example=True) assert response.status == 201 assert response.json['udp_port'] is not None # Netfifaces is not available on Travis @pytest.mark.skipif(os.environ.get("TRAVIS", False) is not False, reason="Not supported on Travis") -def test_interfaces(http_hypervisor): - response = http_hypervisor.get('/interfaces', example=True) +def test_interfaces(http_compute): + response = http_compute.get('/interfaces', example=True) assert response.status == 200 assert isinstance(response.json, list) diff --git a/tests/handlers/api/hypervisor/test_notification.py b/tests/handlers/api/compute/test_notification.py similarity index 81% rename from tests/handlers/api/hypervisor/test_notification.py rename to tests/handlers/api/compute/test_notification.py index 0613b69f..5b2ee245 100644 --- a/tests/handlers/api/hypervisor/test_notification.py +++ b/tests/handlers/api/compute/test_notification.py @@ -17,11 +17,11 @@ import json -from gns3server.hypervisor.notification_manager import NotificationManager +from gns3server.compute.notification_manager import NotificationManager -def test_notification_ws(http_hypervisor, async_run): - ws = http_hypervisor.websocket("/notifications/ws") +def test_notification_ws(http_compute, async_run): + ws = http_compute.websocket("/notifications/ws") answer = async_run(ws.receive()) answer = json.loads(answer.data) assert answer["action"] == "ping" @@ -32,4 +32,4 @@ def test_notification_ws(http_hypervisor, async_run): answer = json.loads(answer.data) assert answer["action"] == "test" - async_run(http_hypervisor.close()) + async_run(http_compute.close()) diff --git a/tests/handlers/api/hypervisor/test_project.py b/tests/handlers/api/compute/test_project.py similarity index 54% rename from tests/handlers/api/hypervisor/test_project.py rename to tests/handlers/api/compute/test_project.py index c8a11832..497e6f03 100644 --- a/tests/handlers/api/hypervisor/test_project.py +++ b/tests/handlers/api/compute/test_project.py @@ -28,97 +28,96 @@ import zipfile from unittest.mock import patch from tests.utils import asyncio_patch -from gns3server.handlers.api.hypervisor.project_handler import ProjectHandler -from gns3server.hypervisor.project_manager import ProjectManager +from gns3server.handlers.api.compute.project_handler import ProjectHandler +from gns3server.compute.project_manager import ProjectManager -def test_create_project_with_path(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): - response = http_hypervisor.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"}) +def test_create_project_with_path(http_compute, tmpdir): + with patch("gns3server.compute.project.Project.is_local", return_value=True): + response = http_compute.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"}) assert response.status == 201 - assert response.json["name"] == "test" assert response.json["project_id"] == "00010203-0405-0607-0809-0a0b0c0d0e0f" -def test_create_project_without_dir(http_hypervisor): +def test_create_project_without_dir(http_compute): query = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"} - response = http_hypervisor.post("/projects", query, example=True) + response = http_compute.post("/projects", query, example=True) assert response.status == 201 assert response.json["project_id"] == "10010203-0405-0607-0809-0a0b0c0d0e0f" assert response.json["temporary"] is False assert response.json["name"] == "test" -def test_create_temporary_project(http_hypervisor): +def test_create_temporary_project(http_compute): query = {"name": "test", "temporary": True, "project_id": "20010203-0405-0607-0809-0a0b0c0d0e0f"} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 assert response.json["project_id"] == "20010203-0405-0607-0809-0a0b0c0d0e0f" assert response.json["temporary"] is True assert response.json["name"] == "test" -def test_create_project_with_uuid(http_hypervisor): +def test_create_project_with_uuid(http_compute): query = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f"} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 assert response.json["project_id"] == "30010203-0405-0607-0809-0a0b0c0d0e0f" assert response.json["name"] == "test" -def test_show_project(http_hypervisor): +def test_show_project(http_compute): query = {"name": "test", "project_id": "40010203-0405-0607-0809-0a0b0c0d0e02", "temporary": False} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 - response = http_hypervisor.get("/projects/40010203-0405-0607-0809-0a0b0c0d0e02", example=True) + response = http_compute.get("/projects/40010203-0405-0607-0809-0a0b0c0d0e02", example=True) assert len(response.json.keys()) == 3 assert response.json["project_id"] == "40010203-0405-0607-0809-0a0b0c0d0e02" assert response.json["temporary"] is False assert response.json["name"] == "test" -def test_show_project_invalid_uuid(http_hypervisor): - response = http_hypervisor.get("/projects/50010203-0405-0607-0809-0a0b0c0d0e42") +def test_show_project_invalid_uuid(http_compute): + response = http_compute.get("/projects/50010203-0405-0607-0809-0a0b0c0d0e42") assert response.status == 404 -def test_list_projects(http_hypervisor): +def test_list_projects(http_compute): ProjectManager.instance()._projects = {} query = {"name": "test", "project_id": "51010203-0405-0607-0809-0a0b0c0d0e0f"} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 query = {"name": "test", "project_id": "52010203-0405-0607-0809-0a0b0c0d0e0b"} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 - response = http_hypervisor.get("/projects", example=True) + response = http_compute.get("/projects", example=True) assert response.status == 200 assert len(response.json) == 2 assert "51010203-0405-0607-0809-0a0b0c0d0e0f" in [p["project_id"] for p in response.json] -def test_update_temporary_project(http_hypervisor): +def test_update_temporary_project(http_compute): query = {"name": "test", "temporary": True, "project_id": "60010203-0405-0607-0809-0a0b0c0d0e0b"} - response = http_hypervisor.post("/projects", query) + response = http_compute.post("/projects", query) assert response.status == 201 query = {"name": "test", "temporary": False} - response = http_hypervisor.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) + response = http_compute.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 200 assert response.json["temporary"] is False -def test_update_path_project_temporary(http_hypervisor, tmpdir): +def test_update_path_project_temporary(http_compute, tmpdir): os.makedirs(str(tmpdir / "a")) os.makedirs(str(tmpdir / "b")) - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): - response = http_hypervisor.post("/projects", {"name": "first_name", "path": str(tmpdir / "a"), "temporary": True, "project_id": "70010203-0405-0607-0809-0a0b0c0d0e0b"}) + with patch("gns3server.compute.project.Project.is_local", return_value=True): + response = http_compute.post("/projects", {"name": "first_name", "path": str(tmpdir / "a"), "temporary": True, "project_id": "70010203-0405-0607-0809-0a0b0c0d0e0b"}) assert response.status == 201 assert response.json["name"] == "first_name" query = {"name": "second_name", "path": str(tmpdir / "b")} - response = http_hypervisor.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) + response = http_compute.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 200 assert response.json["name"] == "second_name" @@ -126,17 +125,17 @@ def test_update_path_project_temporary(http_hypervisor, tmpdir): assert os.path.exists(str(tmpdir / "b")) -def test_update_path_project_non_temporary(http_hypervisor, tmpdir): +def test_update_path_project_non_temporary(http_compute, tmpdir): os.makedirs(str(tmpdir / "a")) os.makedirs(str(tmpdir / "b")) - with patch("gns3server.hypervisor.project.Project.is_local", return_value=True): - response = http_hypervisor.post("/projects", {"name": "first_name", "path": str(tmpdir / "a"), "project_id": "80010203-0405-0607-0809-0a0b0c0d0e0b"}) + with patch("gns3server.compute.project.Project.is_local", return_value=True): + response = http_compute.post("/projects", {"name": "first_name", "path": str(tmpdir / "a"), "project_id": "80010203-0405-0607-0809-0a0b0c0d0e0b"}) assert response.status == 201 assert response.json["name"] == "first_name" query = {"name": "second_name", "path": str(tmpdir / "b")} - response = http_hypervisor.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) + response = http_compute.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 200 assert response.json["name"] == "second_name" @@ -144,63 +143,63 @@ def test_update_path_project_non_temporary(http_hypervisor, tmpdir): assert os.path.exists(str(tmpdir / "b")) -def test_update_path_project_non_local(http_hypervisor, tmpdir): +def test_update_path_project_non_local(http_compute, tmpdir): - with patch("gns3server.hypervisor.project.Project.is_local", return_value=False): - response = http_hypervisor.post("/projects", {"name": "first_name", "project_id": "90010203-0405-0607-0809-0a0b0c0d0e0b"}) + with patch("gns3server.compute.project.Project.is_local", return_value=False): + response = http_compute.post("/projects", {"name": "first_name", "project_id": "90010203-0405-0607-0809-0a0b0c0d0e0b"}) assert response.status == 201 query = {"name": "second_name", "path": str(tmpdir)} - response = http_hypervisor.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) + response = http_compute.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 403 -def test_commit_project(http_hypervisor, project): - with asyncio_patch("gns3server.hypervisor.project.Project.commit", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/commit".format(project_id=project.id), example=True) +def test_commit_project(http_compute, project): + with asyncio_patch("gns3server.compute.project.Project.commit", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/commit".format(project_id=project.id), example=True) assert response.status == 204 assert mock.called -def test_commit_project_invalid_uuid(http_hypervisor): - response = http_hypervisor.post("/projects/{project_id}/commit".format(project_id=uuid.uuid4())) +def test_commit_project_invalid_uuid(http_compute): + response = http_compute.post("/projects/{project_id}/commit".format(project_id=uuid.uuid4())) assert response.status == 404 -def test_delete_project(http_hypervisor, project): - with asyncio_patch("gns3server.hypervisor.project.Project.delete", return_value=True) as mock: - response = http_hypervisor.delete("/projects/{project_id}".format(project_id=project.id), example=True) +def test_delete_project(http_compute, project): + with asyncio_patch("gns3server.compute.project.Project.delete", return_value=True) as mock: + response = http_compute.delete("/projects/{project_id}".format(project_id=project.id), example=True) assert response.status == 204 assert mock.called -def test_delete_project_invalid_uuid(http_hypervisor): - response = http_hypervisor.delete("/projects/{project_id}".format(project_id=uuid.uuid4())) +def test_delete_project_invalid_uuid(http_compute): + response = http_compute.delete("/projects/{project_id}".format(project_id=uuid.uuid4())) assert response.status == 404 -def test_close_project(http_hypervisor, project): - with asyncio_patch("gns3server.hypervisor.project.Project.close", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/close".format(project_id=project.id), example=True) +def test_close_project(http_compute, project): + with asyncio_patch("gns3server.compute.project.Project.close", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/close".format(project_id=project.id), example=True) assert response.status == 204 assert mock.called -def test_close_project_two_client_connected(http_hypervisor, project): +def test_close_project_two_client_connected(http_compute, project): ProjectHandler._notifications_listening = {project.id: 2} - with asyncio_patch("gns3server.hypervisor.project.Project.close", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/close".format(project_id=project.id), example=True) + with asyncio_patch("gns3server.compute.project.Project.close", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/close".format(project_id=project.id), example=True) assert response.status == 204 assert not mock.called -def test_close_project_invalid_uuid(http_hypervisor): - response = http_hypervisor.post("/projects/{project_id}/close".format(project_id=uuid.uuid4())) +def test_close_project_invalid_uuid(http_compute): + response = http_compute.post("/projects/{project_id}/close".format(project_id=uuid.uuid4())) assert response.status == 404 -def test_get_file(http_hypervisor, tmpdir): +def test_get_file(http_compute, tmpdir): with patch("gns3server.config.Config.get_section_config", return_value={"project_directory": str(tmpdir)}): project = ProjectManager.instance().create_project(project_id="01010203-0405-0607-0809-0a0b0c0d0e0b") @@ -208,24 +207,24 @@ def test_get_file(http_hypervisor, tmpdir): with open(os.path.join(project.path, "hello"), "w+") as f: f.write("world") - response = http_hypervisor.get("/projects/{project_id}/files/hello".format(project_id=project.id), raw=True) + response = http_compute.get("/projects/{project_id}/files/hello".format(project_id=project.id), raw=True) assert response.status == 200 assert response.body == b"world" - response = http_hypervisor.get("/projects/{project_id}/files/false".format(project_id=project.id), raw=True) + response = http_compute.get("/projects/{project_id}/files/false".format(project_id=project.id), raw=True) assert response.status == 404 - response = http_hypervisor.get("/projects/{project_id}/files/../hello".format(project_id=project.id), raw=True) + response = http_compute.get("/projects/{project_id}/files/../hello".format(project_id=project.id), raw=True) assert response.status == 403 -def test_export(http_hypervisor, tmpdir, loop, project): +def test_export(http_compute, tmpdir, loop, project): os.makedirs(project.path, exist_ok=True) with open(os.path.join(project.path, 'a'), 'w+') as f: f.write('hello') - response = http_hypervisor.get("/projects/{project_id}/export".format(project_id=project.id), raw=True) + response = http_compute.get("/projects/{project_id}/export".format(project_id=project.id), raw=True) assert response.status == 200 assert response.headers['CONTENT-TYPE'] == 'application/gns3z' assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3z"'.format(project.name) @@ -239,7 +238,7 @@ def test_export(http_hypervisor, tmpdir, loop, project): assert content == b"hello" -def test_import(http_hypervisor, tmpdir, loop, project): +def test_import(http_compute, tmpdir, loop, project): with zipfile.ZipFile(str(tmpdir / "test.zip"), 'w') as myzip: myzip.writestr("demo", b"hello") @@ -247,7 +246,7 @@ def test_import(http_hypervisor, tmpdir, loop, project): project_id = project.id with open(str(tmpdir / "test.zip"), "rb") as f: - response = http_hypervisor.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True) + response = http_compute.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True) assert response.status == 201 project = ProjectManager.instance().get_project(project_id=project_id) diff --git a/tests/handlers/api/hypervisor/test_qemu.py b/tests/handlers/api/compute/test_qemu.py similarity index 53% rename from tests/handlers/api/hypervisor/test_qemu.py rename to tests/handlers/api/compute/test_qemu.py index 5bd37ad1..849a4789 100644 --- a/tests/handlers/api/hypervisor/test_qemu.py +++ b/tests/handlers/api/compute/test_qemu.py @@ -57,14 +57,14 @@ def base_params(tmpdir, fake_qemu_bin): @pytest.fixture -def vm(http_hypervisor, project, base_params): - response = http_hypervisor.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) +def vm(http_compute, project, base_params): + response = http_compute.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) assert response.status == 201 return response.json -def test_qemu_create(http_hypervisor, project, base_params, fake_qemu_bin): - response = http_hypervisor.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) +def test_qemu_create(http_compute, project, base_params, fake_qemu_bin): + response = http_compute.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) assert response.status == 201 assert response.route == "/projects/{project_id}/qemu/vms" assert response.json["name"] == "PC TEST 1" @@ -73,11 +73,11 @@ def test_qemu_create(http_hypervisor, project, base_params, fake_qemu_bin): assert response.json["platform"] == "x86_64" -def test_qemu_create_platform(http_hypervisor, project, base_params, fake_qemu_bin): +def test_qemu_create_platform(http_compute, project, base_params, fake_qemu_bin): base_params["qemu_path"] = None base_params["platform"] = "x86_64" - response = http_hypervisor.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) + response = http_compute.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), base_params) assert response.status == 201 assert response.route == "/projects/{project_id}/qemu/vms" assert response.json["name"] == "PC TEST 1" @@ -86,12 +86,12 @@ def test_qemu_create_platform(http_hypervisor, project, base_params, fake_qemu_b assert response.json["platform"] == "x86_64" -def test_qemu_create_with_params(http_hypervisor, project, base_params, fake_qemu_vm): +def test_qemu_create_with_params(http_compute, project, base_params, fake_qemu_vm): params = base_params params["ram"] = 1024 params["hda_disk_image"] = "linux载.img" - response = http_hypervisor.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), params, example=True) + response = http_compute.post("/projects/{project_id}/qemu/vms".format(project_id=project.id), params, example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/qemu/vms" @@ -102,8 +102,8 @@ def test_qemu_create_with_params(http_hypervisor, project, base_params, fake_qem assert response.json["hda_disk_image_md5sum"] == "c4ca4238a0b923820dcc509a6f75849b" -def test_qemu_get(http_hypervisor, project, vm): - response = http_hypervisor.get("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_get(http_compute, project, vm): + response = http_compute.get("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 200 assert response.route == "/projects/{project_id}/qemu/vms/{vm_id}" assert response.json["name"] == "PC TEST 1" @@ -111,57 +111,57 @@ def test_qemu_get(http_hypervisor, project, vm): assert response.json["vm_directory"] == os.path.join(project.path, "project-files", "qemu", vm["vm_id"]) -def test_qemu_start(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.qemu_vm.QemuVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_start(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 200 assert response.json["name"] == "PC TEST 1" -def test_qemu_stop(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.qemu_vm.QemuVM.stop", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_stop(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM.stop", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_qemu_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.qemu_vm.QemuVM.reload", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM.reload", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_qemu_suspend(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.qemu_vm.QemuVM.suspend", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_suspend(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM.suspend", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_qemu_resume(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.qemu_vm.QemuVM.resume", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_resume(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.qemu_vm.QemuVM.resume", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_qemu_delete(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.qemu.Qemu.delete_vm", return_value=True) as mock: - response = http_hypervisor.delete("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_delete(http_compute, vm): + with asyncio_patch("gns3server.compute.qemu.Qemu.delete_vm", return_value=True) as mock: + response = http_compute.delete("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_qemu_update(http_hypervisor, vm, tmpdir, free_console_port, project, fake_qemu_vm): +def test_qemu_update(http_compute, vm, tmpdir, free_console_port, project, fake_qemu_vm): params = { "name": "test", "console": free_console_port, "ram": 1024, "hdb_disk_image": "linux.img" } - response = http_hypervisor.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), params, example=True) + response = http_compute.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), params, example=True) assert response.status == 200 assert response.json["name"] == "test" assert response.json["console"] == free_console_port @@ -169,71 +169,71 @@ def test_qemu_update(http_hypervisor, vm, tmpdir, free_console_port, project, fa assert response.json["ram"] == 1024 -def test_qemu_nio_create_udp(http_hypervisor, vm): - http_hypervisor.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}, - example=True) +def test_qemu_nio_create_udp(http_compute, vm): + http_compute.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}, + example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/qemu/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_udp" -def test_qemu_nio_create_ethernet(http_hypervisor, vm): - http_hypervisor.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) - response = http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", - "ethernet_device": "eth0", - }, - example=True) +def test_qemu_nio_create_ethernet(http_compute, vm): + http_compute.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) + response = http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_generic_ethernet", + "ethernet_device": "eth0", + }, + example=True) assert response.status == 409 -def test_qemu_delete_nio(http_hypervisor, vm): - http_hypervisor.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) - http_hypervisor.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}) - response = http_hypervisor.delete("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_qemu_delete_nio(http_compute, vm): + http_compute.put("/projects/{project_id}/qemu/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"adapters": 2}) + http_compute.post("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}) + response = http_compute.delete("/projects/{project_id}/qemu/vms/{vm_id}/adapters/1/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 204 assert response.route == "/projects/{project_id}/qemu/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" -def test_qemu_list_binaries(http_hypervisor, vm): +def test_qemu_list_binaries(http_compute, vm): ret = [{"path": "/tmp/1", "version": "2.2.0"}, {"path": "/tmp/2", "version": "2.1.0"}] - with asyncio_patch("gns3server.hypervisor.qemu.Qemu.binary_list", return_value=ret) as mock: - response = http_hypervisor.get("/qemu/binaries".format(project_id=vm["project_id"]), example=True) + with asyncio_patch("gns3server.compute.qemu.Qemu.binary_list", return_value=ret) as mock: + response = http_compute.get("/qemu/binaries".format(project_id=vm["project_id"]), example=True) assert mock.called_with(None) assert response.status == 200 assert response.json == ret -def test_qemu_list_binaries_filter(http_hypervisor, vm): +def test_qemu_list_binaries_filter(http_compute, vm): ret = [ {"path": "/tmp/x86_64", "version": "2.2.0"}, {"path": "/tmp/alpha", "version": "2.1.0"}, {"path": "/tmp/i386", "version": "2.1.0"} ] - with asyncio_patch("gns3server.hypervisor.qemu.Qemu.binary_list", return_value=ret) as mock: - response = http_hypervisor.get("/qemu/binaries".format(project_id=vm["project_id"]), body={"archs": ["i386"]}, example=True) + with asyncio_patch("gns3server.compute.qemu.Qemu.binary_list", return_value=ret) as mock: + response = http_compute.get("/qemu/binaries".format(project_id=vm["project_id"]), body={"archs": ["i386"]}, example=True) assert response.status == 200 assert mock.called_with(["i386"]) assert response.json == ret -def test_vms(http_hypervisor, tmpdir, fake_qemu_vm): +def test_vms(http_compute, tmpdir, fake_qemu_vm): - response = http_hypervisor.get("/qemu/vms") + response = http_compute.get("/qemu/vms") assert response.status == 200 assert response.json == [{"filename": "linux载.img", "path": "linux载.img"}] -def test_upload_vm(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/qemu/vms/test2", body="TEST", raw=True) +def test_upload_vm(http_compute, tmpdir): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/qemu/vms/test2", body="TEST", raw=True) assert response.status == 204 with open(str(tmpdir / "test2")) as f: @@ -244,9 +244,9 @@ def test_upload_vm(http_hypervisor, tmpdir): assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf" -def test_upload_vm_ova(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/qemu/vms/test2.ova/test2.vmdk", body="TEST", raw=True) +def test_upload_vm_ova(http_compute, tmpdir): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/qemu/vms/test2.ova/test2.vmdk", body="TEST", raw=True) assert response.status == 204 with open(str(tmpdir / "test2.ova" / "test2.vmdk")) as f: @@ -257,23 +257,23 @@ def test_upload_vm_ova(http_hypervisor, tmpdir): assert checksum == "033bd94b1168d7e4f0d644c3c95e35bf" -def test_upload_vm_forbiden_location(http_hypervisor, tmpdir): - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/qemu/vms/../../test2", body="TEST", raw=True) +def test_upload_vm_forbiden_location(http_compute, tmpdir): + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/qemu/vms/../../test2", body="TEST", raw=True) assert response.status == 403 -def test_upload_vm_permission_denied(http_hypervisor, tmpdir): +def test_upload_vm_permission_denied(http_compute, tmpdir): with open(str(tmpdir / "test2"), "w+") as f: f.write("") os.chmod(str(tmpdir / "test2"), 0) - with patch("gns3server.hypervisor.Qemu.get_images_directory", return_value=str(tmpdir),): - response = http_hypervisor.post("/qemu/vms/test2", body="TEST", raw=True) + with patch("gns3server.compute.Qemu.get_images_directory", return_value=str(tmpdir),): + response = http_compute.post("/qemu/vms/test2", body="TEST", raw=True) assert response.status == 409 -def test_create_img_relative(http_hypervisor): +def test_create_img_relative(http_compute): body = { "qemu_img": "/tmp/qemu-img", "path": "hda.qcow2", @@ -284,13 +284,13 @@ def test_create_img_relative(http_hypervisor): "lazy_refcounts": "off", "size": 100 } - with asyncio_patch("gns3server.hypervisor.Qemu.create_disk"): - response = http_hypervisor.post("/qemu/img", body=body, example=True) + with asyncio_patch("gns3server.compute.Qemu.create_disk"): + response = http_compute.post("/qemu/img", body=body, example=True) assert response.status == 201 -def test_create_img_absolute_non_local(http_hypervisor): +def test_create_img_absolute_non_local(http_compute): config = Config.instance() config.set("Server", "local", "false") @@ -305,13 +305,13 @@ def test_create_img_absolute_non_local(http_hypervisor): "lazy_refcounts": "off", "size": 100 } - with asyncio_patch("gns3server.hypervisor.Qemu.create_disk"): - response = http_hypervisor.post("/qemu/img", body=body, example=True) + with asyncio_patch("gns3server.compute.Qemu.create_disk"): + response = http_compute.post("/qemu/img", body=body, example=True) assert response.status == 403 -def test_create_img_absolute_local(http_hypervisor): +def test_create_img_absolute_local(http_compute): config = Config.instance() config.set("Server", "local", "true") @@ -326,13 +326,13 @@ def test_create_img_absolute_local(http_hypervisor): "lazy_refcounts": "off", "size": 100 } - with asyncio_patch("gns3server.hypervisor.Qemu.create_disk"): - response = http_hypervisor.post("/qemu/img", body=body, example=True) + with asyncio_patch("gns3server.compute.Qemu.create_disk"): + response = http_compute.post("/qemu/img", body=body, example=True) assert response.status == 201 -def test_capabilities(http_hypervisor): - with asyncio_patch("gns3server.hypervisor.Qemu.get_kvm_archs", return_value=["x86_64"]): - response = http_hypervisor.get("/qemu/capabilities", example=True) +def test_capabilities(http_compute): + with asyncio_patch("gns3server.compute.Qemu.get_kvm_archs", return_value=["x86_64"]): + response = http_compute.get("/qemu/capabilities", example=True) assert response.json["kvm"] == ["x86_64"] diff --git a/tests/handlers/api/hypervisor/test_version.py b/tests/handlers/api/compute/test_version.py similarity index 74% rename from tests/handlers/api/hypervisor/test_version.py rename to tests/handlers/api/compute/test_version.py index 59fa5424..da42188e 100644 --- a/tests/handlers/api/hypervisor/test_version.py +++ b/tests/handlers/api/compute/test_version.py @@ -25,37 +25,37 @@ from gns3server.config import Config from gns3server.version import __version__ -def test_version_output(http_hypervisor): +def test_version_output(http_compute): config = Config.instance() config.set("Server", "local", "true") - response = http_hypervisor.get('/version', example=True) + response = http_compute.get('/version', example=True) assert response.status == 200 assert response.json == {'local': True, 'version': __version__} -def test_version_input(http_hypervisor): +def test_version_input(http_compute): query = {'version': __version__} - response = http_hypervisor.post('/version', query, example=True) + response = http_compute.post('/version', query, example=True) assert response.status == 200 assert response.json == {'version': __version__} -def test_version_invalid_input(http_hypervisor): +def test_version_invalid_input(http_compute): query = {'version': "0.4.2"} - response = http_hypervisor.post('/version', query) + response = http_compute.post('/version', query) assert response.status == 409 assert response.json == {'message': 'Client version 0.4.2 differs with server version {}'.format(__version__), 'status': 409} -def test_version_invalid_input_schema(http_hypervisor): +def test_version_invalid_input_schema(http_compute): query = {'version': "0.4.2", "bla": "blu"} - response = http_hypervisor.post('/version', query) + response = http_compute.post('/version', query) assert response.status == 400 -def test_version_invalid_json(http_hypervisor): +def test_version_invalid_json(http_compute): query = "BOUM" - response = http_hypervisor.post('/version', query, raw=True) + response = http_compute.post('/version', query, raw=True) assert response.status == 400 diff --git a/tests/handlers/api/compute/test_virtualbox.py b/tests/handlers/api/compute/test_virtualbox.py new file mode 100644 index 00000000..256398b6 --- /dev/null +++ b/tests/handlers/api/compute/test_virtualbox.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import pytest +from tests.utils import asyncio_patch +from unittest.mock import patch + + +@pytest.yield_fixture(scope="function") +def vm(http_compute, project, monkeypatch): + + vboxmanage_path = "/fake/VboxManage" + + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.create", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms".format(project_id=project.id), {"name": "VMTEST", + "vmname": "VMTEST", + "linked_clone": False}) + assert mock.called + assert response.status == 201 + + with patch("gns3server.compute.virtualbox.VirtualBox.find_vboxmanage", return_value=vboxmanage_path): + yield response.json + + +def test_vbox_create(http_compute, project): + + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.create", return_value=True): + response = http_compute.post("/projects/{project_id}/virtualbox/vms".format(project_id=project.id), {"name": "VM1", + "vmname": "VM1", + "linked_clone": False}, + example=True) + assert response.status == 201 + assert response.json["name"] == "VM1" + assert response.json["project_id"] == project.id + + +def test_vbox_get(http_compute, project, vm): + response = http_compute.get("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert response.status == 200 + assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}" + assert response.json["name"] == "VMTEST" + assert response.json["project_id"] == project.id + + +def test_vbox_start(http_compute, vm): + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.check_hw_virtualization", return_value=True) as mock: + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert mock.called + assert response.status == 204 + + +def test_vbox_stop(http_compute, vm): + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.stop", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert mock.called + assert response.status == 204 + + +def test_vbox_suspend(http_compute, vm): + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.suspend", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert mock.called + assert response.status == 204 + + +def test_vbox_resume(http_compute, vm): + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.resume", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert mock.called + assert response.status == 204 + + +def test_vbox_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.reload", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + assert mock.called + assert response.status == 204 + + +def test_vbox_nio_create_udp(http_compute, vm): + + with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock: + response = http_compute.post("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], + vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}, + example=True) + + assert mock.called + args, kwgars = mock.call_args + assert args[0] == 0 + + assert response.status == 201 + assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" + assert response.json["type"] == "nio_udp" + + +def test_vbox_delete_nio(http_compute, vm): + + with asyncio_patch('gns3server.compute.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock: + response = http_compute.delete("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + + assert mock.called + args, kwgars = mock.call_args + assert args[0] == 0 + + assert response.status == 204 + assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" + + +def test_vbox_update(http_compute, vm, free_console_port): + response = http_compute.put("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", + "console": free_console_port}, + example=True) + assert response.status == 200 + assert response.json["name"] == "test" + assert response.json["console"] == free_console_port diff --git a/tests/handlers/api/hypervisor/test_vpcs.py b/tests/handlers/api/compute/test_vpcs.py similarity index 53% rename from tests/handlers/api/hypervisor/test_vpcs.py rename to tests/handlers/api/compute/test_vpcs.py index 64e97614..071a68de 100644 --- a/tests/handlers/api/hypervisor/test_vpcs.py +++ b/tests/handlers/api/compute/test_vpcs.py @@ -23,22 +23,22 @@ from unittest.mock import patch @pytest.fixture(scope="function") -def vm(http_hypervisor, project): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1"}) +def vm(http_compute, project): + response = http_compute.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1"}) assert response.status == 201 return response.json -def test_vpcs_create(http_hypervisor, project): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1"}, example=True) +def test_vpcs_create(http_compute, project): + response = http_compute.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1"}, example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/vpcs/vms" assert response.json["name"] == "PC TEST 1" assert response.json["project_id"] == project.id -def test_vpcs_get(http_hypervisor, project, vm): - response = http_hypervisor.get("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_vpcs_get(http_compute, project, vm): + response = http_compute.get("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 200 assert response.route == "/projects/{project_id}/vpcs/vms/{vm_id}" assert response.json["name"] == "PC TEST 1" @@ -47,8 +47,8 @@ def test_vpcs_get(http_hypervisor, project, vm): assert response.json["status"] == "stopped" -def test_vpcs_create_startup_script(http_hypervisor, project): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1", "startup_script": "ip 192.168.1.2\necho TEST"}) +def test_vpcs_create_startup_script(http_compute, project): + response = http_compute.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1", "startup_script": "ip 192.168.1.2\necho TEST"}) assert response.status == 201 assert response.route == "/projects/{project_id}/vpcs/vms" assert response.json["name"] == "PC TEST 1" @@ -57,8 +57,8 @@ def test_vpcs_create_startup_script(http_hypervisor, project): assert response.json["startup_script_path"] == "startup.vpc" -def test_vpcs_create_port(http_hypervisor, project, free_console_port): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1", "console": free_console_port}) +def test_vpcs_create_port(http_compute, project, free_console_port): + response = http_compute.post("/projects/{project_id}/vpcs/vms".format(project_id=project.id), {"name": "PC TEST 1", "console": free_console_port}) assert response.status == 201 assert response.route == "/projects/{project_id}/vpcs/vms" assert response.json["name"] == "PC TEST 1" @@ -66,72 +66,72 @@ def test_vpcs_create_port(http_hypervisor, project, free_console_port): assert response.json["console"] == free_console_port -def test_vpcs_nio_create_udp(http_hypervisor, vm): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}, - example=True) +def test_vpcs_nio_create_udp(http_compute, vm): + response = http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}, + example=True) assert response.status == 201 assert response.route == "/projects/{project_id}/vpcs/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_udp" @pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows") -def test_vpcs_nio_create_tap(http_hypervisor, vm, ethernet_device): - with patch("gns3server.hypervisor.base_manager.BaseManager.has_privileged_access", return_value=True): - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_tap", - "tap_device": ethernet_device}) +def test_vpcs_nio_create_tap(http_compute, vm, ethernet_device): + with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): + response = http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_tap", + "tap_device": ethernet_device}) assert response.status == 201 assert response.route == "/projects/{project_id}/vpcs/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" assert response.json["type"] == "nio_tap" -def test_vpcs_delete_nio(http_hypervisor, vm): - http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}) - response = http_hypervisor.delete("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_vpcs_delete_nio(http_compute, vm): + http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", + "lport": 4242, + "rport": 4343, + "rhost": "127.0.0.1"}) + response = http_compute.delete("/projects/{project_id}/vpcs/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert response.status == 204 assert response.route == "/projects/{project_id}/vpcs/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" -def test_vpcs_start(http_hypervisor, vm): +def test_vpcs_start(http_compute, vm): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.start", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 200 assert response.json["name"] == "PC TEST 1" -def test_vpcs_stop(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM.stop", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_vpcs_stop(http_compute, vm): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.stop", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_vpcs_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.vpcs.vpcs_vm.VPCSVM.reload", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/vpcs/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_vpcs_reload(http_compute, vm): + with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.reload", return_value=True) as mock: + response = http_compute.post("/projects/{project_id}/vpcs/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_vpcs_delete(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.vpcs.VPCS.delete_vm", return_value=True) as mock: - response = http_hypervisor.delete("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) +def test_vpcs_delete(http_compute, vm): + with asyncio_patch("gns3server.compute.vpcs.VPCS.delete_vm", return_value=True) as mock: + response = http_compute.delete("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) assert mock.called assert response.status == 204 -def test_vpcs_update(http_hypervisor, vm, tmpdir, free_console_port): - response = http_hypervisor.put("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", - "console": free_console_port, - "startup_script": "ip 192.168.1.1"}, - example=True) +def test_vpcs_update(http_compute, vm, tmpdir, free_console_port): + response = http_compute.put("/projects/{project_id}/vpcs/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", + "console": free_console_port, + "startup_script": "ip 192.168.1.1"}, + example=True) assert response.status == 200 assert response.json["name"] == "test" assert response.json["console"] == free_console_port diff --git a/tests/handlers/api/controller/test_hypervisor.py b/tests/handlers/api/controller/test_compute.py similarity index 74% rename from tests/handlers/api/controller/test_hypervisor.py rename to tests/handlers/api/controller/test_compute.py index 1f214d59..cfc786b3 100644 --- a/tests/handlers/api/controller/test_hypervisor.py +++ b/tests/handlers/api/controller/test_compute.py @@ -16,21 +16,21 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -def test_hypervisor_create(http_controller, controller): +def test_compute_create(http_controller, controller): params = { - "hypervisor_id": "my_hypervisor_id", + "compute_id": "my_compute_id", "protocol": "http", "host": "example.com", "port": 84, "user": "julien", "password": "secure" } - response = http_controller.post("/hypervisors", params, example=True) + response = http_controller.post("/computes", params, example=True) assert response.status == 201 - assert response.route == "/hypervisors" + assert response.route == "/computes" assert response.json["user"] == "julien" assert "password" not in response.json - assert len(controller.hypervisors) == 1 - assert controller.hypervisors["my_hypervisor_id"].host == "example.com" + assert len(controller.computes) == 1 + assert controller.computes["my_compute_id"].host == "example.com" diff --git a/tests/handlers/api/controller/test_vm.py b/tests/handlers/api/controller/test_vm.py index 16bccb94..ead90f73 100644 --- a/tests/handlers/api/controller/test_vm.py +++ b/tests/handlers/api/controller/test_vm.py @@ -35,11 +35,11 @@ from gns3server.controller.vm import VM @pytest.fixture -def hypervisor(http_controller, async_run): - hypervisor = MagicMock() - hypervisor.id = "example.com" - Controller.instance()._hypervisors = {"example.com": hypervisor} - return hypervisor +def compute(http_controller, async_run): + compute = MagicMock() + compute.id = "example.com" + Controller.instance()._computes = {"example.com": compute} + return compute @pytest.fixture @@ -48,21 +48,21 @@ def project(http_controller, async_run): @pytest.fixture -def vm(project, hypervisor, async_run): - vm = VM(project, hypervisor, name="test", vm_type="vpcs") +def vm(project, compute, async_run): + vm = VM(project, compute, name="test", vm_type="vpcs") project._vms[vm.id] = vm return vm -def test_create_vm(http_controller, tmpdir, project, hypervisor): +def test_create_vm(http_controller, tmpdir, project, compute): response = MagicMock() response.json = {"console": 2048} - hypervisor.post = AsyncioMagicMock(return_value=response) + compute.post = AsyncioMagicMock(return_value=response) response = http_controller.post("/projects/{}/vms".format(project.id), { "name": "test", "vm_type": "vpcs", - "hypervisor_id": "example.com", + "compute_id": "example.com", "properties": { "startup_script": "echo test" } @@ -72,27 +72,27 @@ def test_create_vm(http_controller, tmpdir, project, hypervisor): assert "name" not in response.json["properties"] -def test_start_vm(http_controller, tmpdir, project, hypervisor, vm): +def test_start_vm(http_controller, tmpdir, project, compute, vm): response = MagicMock() - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() response = http_controller.post("/projects/{}/vms/{}/start".format(project.id, vm.id), example=True) assert response.status == 201 assert response.json["name"] == vm.name -def test_stop_vm(http_controller, tmpdir, project, hypervisor, vm): +def test_stop_vm(http_controller, tmpdir, project, compute, vm): response = MagicMock() - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() response = http_controller.post("/projects/{}/vms/{}/stop".format(project.id, vm.id), example=True) assert response.status == 201 assert response.json["name"] == vm.name -def test_suspend_vm(http_controller, tmpdir, project, hypervisor, vm): +def test_suspend_vm(http_controller, tmpdir, project, compute, vm): response = MagicMock() - hypervisor.post = AsyncioMagicMock() + compute.post = AsyncioMagicMock() response = http_controller.post("/projects/{}/vms/{}/suspend".format(project.id, vm.id), example=True) assert response.status == 201 diff --git a/tests/handlers/api/hypervisor/test_docker.py b/tests/handlers/api/hypervisor/test_docker.py deleted file mode 100644 index 6aeee271..00000000 --- a/tests/handlers/api/hypervisor/test_docker.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2015 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -import pytest -import os -import stat -import sys -import uuid -import aiohttp - -from tests.utils import asyncio_patch -from unittest.mock import patch, MagicMock, PropertyMock -from gns3server.hypervisor.docker import Docker - - -@pytest.fixture -def base_params(): - """Return standard parameters""" - return {"name": "PC TEST 1", "image": "nginx", "start_command": "nginx-daemon", "adapters": 2, "environment": "YES=1\nNO=0", "console_type": "telnet", "console_resolution": "1280x1024"} - - -@pytest.yield_fixture(autouse=True) -def mock_connection(): - docker = Docker.instance() - docker._connected = True - docker._connector = MagicMock() - yield - Docker._instance = None - - -@pytest.fixture -def vm(http_hypervisor, project, base_params): - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "nginx"}]) as mock_list: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms".format(project_id=project.id), base_params) - if response.status != 201: - print(response.body) - assert response.status == 201 - return response.json - - -def test_docker_create(http_hypervisor, project, base_params): - with asyncio_patch("gns3server.hypervisor.docker.Docker.list_images", return_value=[{"image": "nginx"}]) as mock_list: - with asyncio_patch("gns3server.hypervisor.docker.Docker.query", return_value={"Id": "8bd8153ea8f5"}) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms".format(project_id=project.id), base_params) - assert response.status == 201 - assert response.route == "/projects/{project_id}/docker/vms" - assert response.json["name"] == "PC TEST 1" - assert response.json["project_id"] == project.id - assert response.json["container_id"] == "8bd8153ea8f5" - assert response.json["image"] == "nginx" - assert response.json["adapters"] == 2 - assert response.json["environment"] == "YES=1\nNO=0" - assert response.json["console_resolution"] == "1280x1024" - - -def test_docker_start(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - assert mock.called - assert response.status == 204 - - -def test_docker_stop(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.stop", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - assert mock.called - assert response.status == 204 - - -def test_docker_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.restart", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - assert mock.called - assert response.status == 204 - - -def test_docker_delete(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.delete", return_value=True) as mock: - response = http_hypervisor.delete("/projects/{project_id}/docker/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - assert mock.called - assert response.status == 204 - - -def test_docker_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.pause", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - assert mock.called - assert response.status == 204 - - -def test_docker_nio_create_udp(http_hypervisor, vm): - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}, - example=True) - assert response.status == 201 - assert response.route == "/projects/{project_id}/docker/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" - assert response.json["type"] == "nio_udp" - - -def test_docker_delete_nio(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.adapter_remove_nio_binding") as mock: - response = http_hypervisor.delete("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert response.status == 204 - assert response.route == "/projects/{project_id}/docker/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" - - -def test_docker_update(http_hypervisor, vm, tmpdir, free_console_port): - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.update") as mock: - response = http_hypervisor.put("/projects/{project_id}/docker/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", - "console": free_console_port, - "start_command": "yes", - "environment": "GNS3=1\nGNS4=0"}, - example=True) - assert mock.called - assert response.status == 200 - assert response.json["name"] == "test" - assert response.json["console"] == free_console_port - assert response.json["start_command"] == "yes" - assert response.json["environment"] == "GNS3=1\nGNS4=0" - - -def test_docker_start_capture(http_hypervisor, vm, tmpdir, project): - - with patch("gns3server.hypervisor.docker.docker_vm.DockerVM.is_running", return_value=True) as mock: - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.start_capture") as start_capture: - - params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params, example=True) - - assert response.status == 200 - - assert start_capture.called - assert "test.pcap" in response.json["pcap_file_path"] - - -def test_docker_start_capture_not_started(http_hypervisor, vm, tmpdir): - - with patch("gns3server.hypervisor.docker.docker_vm.DockerVM.is_running", return_value=False) as mock: - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.start_capture") as start_capture: - - params = {"capture_file_name": "test.pcap", "data_link_type": "DLT_EN10MB"} - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/start_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), body=params) - - assert not start_capture.called - assert response.status == 409 - - -def test_docker_stop_capture(http_hypervisor, vm, tmpdir, project): - - with patch("gns3server.hypervisor.docker.docker_vm.DockerVM.is_running", return_value=True) as mock: - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.stop_capture") as stop_capture: - - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - - assert response.status == 204 - - assert stop_capture.called - - -def test_docker_stop_capture_not_started(http_hypervisor, vm, tmpdir): - - with patch("gns3server.hypervisor.docker.docker_vm.DockerVM.is_running", return_value=False) as mock: - with asyncio_patch("gns3server.hypervisor.docker.docker_vm.DockerVM.stop_capture") as stop_capture: - - response = http_hypervisor.post("/projects/{project_id}/docker/vms/{vm_id}/adapters/0/ports/0/stop_capture".format(project_id=vm["project_id"], vm_id=vm["vm_id"])) - - assert not stop_capture.called - assert response.status == 409 diff --git a/tests/handlers/api/hypervisor/test_virtualbox.py b/tests/handlers/api/hypervisor/test_virtualbox.py deleted file mode 100644 index 1c931c9f..00000000 --- a/tests/handlers/api/hypervisor/test_virtualbox.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2015 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -import pytest -from tests.utils import asyncio_patch -from unittest.mock import patch - - -@pytest.yield_fixture(scope="function") -def vm(http_hypervisor, project, monkeypatch): - - vboxmanage_path = "/fake/VboxManage" - - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.create", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms".format(project_id=project.id), {"name": "VMTEST", - "vmname": "VMTEST", - "linked_clone": False}) - assert mock.called - assert response.status == 201 - - with patch("gns3server.hypervisor.virtualbox.VirtualBox.find_vboxmanage", return_value=vboxmanage_path): - yield response.json - - -def test_vbox_create(http_hypervisor, project): - - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.create", return_value=True): - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms".format(project_id=project.id), {"name": "VM1", - "vmname": "VM1", - "linked_clone": False}, - example=True) - assert response.status == 201 - assert response.json["name"] == "VM1" - assert response.json["project_id"] == project.id - - -def test_vbox_get(http_hypervisor, project, vm): - response = http_hypervisor.get("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert response.status == 200 - assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}" - assert response.json["name"] == "VMTEST" - assert response.json["project_id"] == project.id - - -def test_vbox_start(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.check_hw_virtualization", return_value=True) as mock: - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.start", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/start".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert mock.called - assert response.status == 204 - - -def test_vbox_stop(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.stop", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/stop".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert mock.called - assert response.status == 204 - - -def test_vbox_suspend(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.suspend", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/suspend".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert mock.called - assert response.status == 204 - - -def test_vbox_resume(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.resume", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/resume".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert mock.called - assert response.status == 204 - - -def test_vbox_reload(http_hypervisor, vm): - with asyncio_patch("gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.reload", return_value=True) as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/reload".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - assert mock.called - assert response.status == 204 - - -def test_vbox_nio_create_udp(http_hypervisor, vm): - - with asyncio_patch('gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_add_nio_binding') as mock: - response = http_hypervisor.post("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], - vm_id=vm["vm_id"]), {"type": "nio_udp", - "lport": 4242, - "rport": 4343, - "rhost": "127.0.0.1"}, - example=True) - - assert mock.called - args, kwgars = mock.call_args - assert args[0] == 0 - - assert response.status == 201 - assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" - assert response.json["type"] == "nio_udp" - - -def test_vbox_delete_nio(http_hypervisor, vm): - - with asyncio_patch('gns3server.hypervisor.virtualbox.virtualbox_vm.VirtualBoxVM.adapter_remove_nio_binding') as mock: - response = http_hypervisor.delete("/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/0/ports/0/nio".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), example=True) - - assert mock.called - args, kwgars = mock.call_args - assert args[0] == 0 - - assert response.status == 204 - assert response.route == "/projects/{project_id}/virtualbox/vms/{vm_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio" - - -def test_vbox_update(http_hypervisor, vm, free_console_port): - response = http_hypervisor.put("/projects/{project_id}/virtualbox/vms/{vm_id}".format(project_id=vm["project_id"], vm_id=vm["vm_id"]), {"name": "test", - "console": free_console_port}, - example=True) - assert response.status == 200 - assert response.json["name"] == "test" - assert response.json["console"] == free_console_port diff --git a/tests/handlers/test_index.py b/tests/handlers/test_index.py index 26515f33..eaa7f22a 100644 --- a/tests/handlers/test_index.py +++ b/tests/handlers/test_index.py @@ -39,8 +39,8 @@ def test_controller(http_root, async_run): assert response.status == 200 -def test_hypervisor(http_root): - response = http_root.get('/hypervisor') +def test_compute(http_root): + response = http_root.get('/compute') assert response.status == 200 diff --git a/tests/web/test_documentation.py b/tests/web/test_documentation.py index 7011aae4..bb764144 100644 --- a/tests/web/test_documentation.py +++ b/tests/web/test_documentation.py @@ -24,19 +24,19 @@ from gns3server.web.route import Route def test_documentation_write(tmpdir): os.makedirs(str(tmpdir / "api/examples")) - with open(str(tmpdir / "api/examples/hypervisor_post_projectsprojectidvirtualboxvms.txt"), "w+") as f: + with open(str(tmpdir / "api/examples/compute_post_projectsprojectidvirtualboxvms.txt"), "w+") as f: f.write("curl test") Documentation(Route, str(tmpdir)).write() assert os.path.exists(str(tmpdir / "api")) - assert os.path.exists(str(tmpdir / "api" / "v2" / "hypervisor")) - assert os.path.exists(str(tmpdir / "api" / "v2" / "hypervisor" / "virtualbox.rst")) - assert os.path.exists(str(tmpdir / "api" / "v2" / "hypervisor" / "virtualbox")) - assert os.path.exists(str(tmpdir / "api" / "v2" / "hypervisor" / "virtualbox" / "virtualboxvms.rst")) - with open(str(tmpdir / "api" / "v2" / "hypervisor" / "virtualbox" / "projectsprojectidvirtualboxvms.rst")) as f: + assert os.path.exists(str(tmpdir / "api" / "v2" / "compute")) + assert os.path.exists(str(tmpdir / "api" / "v2" / "compute" / "virtualbox.rst")) + assert os.path.exists(str(tmpdir / "api" / "v2" / "compute" / "virtualbox")) + assert os.path.exists(str(tmpdir / "api" / "v2" / "compute" / "virtualbox" / "virtualboxvms.rst")) + with open(str(tmpdir / "api" / "v2" / "compute" / "virtualbox" / "projectsprojectidvirtualboxvms.rst")) as f: content = f.read() assert "Sample session" in content - assert "literalinclude:: ../../../examples/hypervisor_post_projectsprojectidvirtualboxvms.txt" in content + assert "literalinclude:: ../../../examples/compute_post_projectsprojectidvirtualboxvms.txt" in content - assert os.path.exists(str(tmpdir / "api" / "v2" / "controller" / "hypervisor.rst")) + assert os.path.exists(str(tmpdir / "api" / "v2" / "controller" / "compute.rst"))