1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-11-28 03:08:14 +00:00

VPCS reload

This commit is contained in:
Julien Duponchelle 2015-01-22 10:55:11 +01:00
parent 1a43ff118c
commit 8d3ea60404
18 changed files with 69 additions and 22 deletions

View File

@ -18,5 +18,5 @@ X-ROUTE: /vpcs/{uuid}
"project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
"script_file": null, "script_file": null,
"startup_script": null, "startup_script": null,
"uuid": "a0ecc3ea-907f-4751-9415-9f6d5da4dc3a" "uuid": "925c4d08-58a5-4078-9e77-a6875e0c28dc"
} }

View File

@ -1,7 +1,8 @@
curl -i -X POST 'http://localhost:8000/virtualbox' -d '{"name": "VM1", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "vmname": "VM1"}' curl -i -X POST 'http://localhost:8000/virtualbox' -d '{"linked_clone": false, "name": "VM1", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "vmname": "VM1"}'
POST /virtualbox HTTP/1.1 POST /virtualbox HTTP/1.1
{ {
"linked_clone": false,
"name": "VM1", "name": "VM1",
"project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
"vmname": "VM1" "vmname": "VM1"
@ -19,5 +20,5 @@ X-ROUTE: /virtualbox
{ {
"name": "VM1", "name": "VM1",
"project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
"uuid": "0f7b32bb-13e1-4c3f-8176-bbf277672b58" "uuid": "c220788f-ee1e-491c-b318-6542d2f130bf"
} }

View File

@ -21,5 +21,5 @@ X-ROUTE: /vpcs
"project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80", "project_uuid": "a1e920ca-338a-4e9f-b363-aa607b09dd80",
"script_file": null, "script_file": null,
"startup_script": null, "startup_script": null,
"uuid": "f4f04818-610c-4e95-aa0e-6d29afa72fc7" "uuid": "4d670947-44a8-4156-8626-adce3faa5ae6"
} }

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /project POST /project
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Create a project on the server Create a project on the server
Response status codes Response status codes

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
GET /version GET /version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Retrieve the server version number Retrieve the server version number
Response status codes Response status codes
@ -28,7 +28,7 @@ Sample session
POST /version POST /version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Check if version is the same as the server Check if version is the same as the server
Response status codes Response status codes

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /virtualbox POST /virtualbox
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Create a new VirtualBox VM instance Create a new VirtualBox VM instance
Response status codes Response status codes
@ -19,9 +19,9 @@ Input
<table> <table>
<tr> <th>Name</th> <th>Mandatory</th> <th>Type</th> <th>Description</th> </tr> <tr> <th>Name</th> <th>Mandatory</th> <th>Type</th> <th>Description</th> </tr>
<tr><td>linked_clone</td> <td> </td> <td>boolean</td> <td>either the VM is a linked clone or not</td> </tr> <tr><td>linked_clone</td> <td>&#10004;</td> <td>boolean</td> <td>either the VM is a linked clone or not</td> </tr>
<tr><td>name</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance name</td> </tr> <tr><td>name</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance name</td> </tr>
<tr><td>project_uuid</td> <td> </td> <td>string</td> <td>Project UUID</td> </tr> <tr><td>project_uuid</td> <td>&#10004;</td> <td>string</td> <td>Project UUID</td> </tr>
<tr><td>uuid</td> <td> </td> <td>string</td> <td>VirtualBox VM instance UUID</td> </tr> <tr><td>uuid</td> <td> </td> <td>string</td> <td>VirtualBox VM instance UUID</td> </tr>
<tr><td>vbox_id</td> <td> </td> <td>integer</td> <td>VirtualBox VM instance ID (for project created before GNS3 1.3)</td> </tr> <tr><td>vbox_id</td> <td> </td> <td>integer</td> <td>VirtualBox VM instance ID (for project created before GNS3 1.3)</td> </tr>
<tr><td>vmname</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM name (in VirtualBox itself)</td> </tr> <tr><td>vmname</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM name (in VirtualBox itself)</td> </tr>
@ -35,7 +35,7 @@ Output
<tr> <th>Name</th> <th>Mandatory</th> <th>Type</th> <th>Description</th> </tr> <tr> <th>Name</th> <th>Mandatory</th> <th>Type</th> <th>Description</th> </tr>
<tr><td>console</td> <td> </td> <td>integer</td> <td>console TCP port</td> </tr> <tr><td>console</td> <td> </td> <td>integer</td> <td>console TCP port</td> </tr>
<tr><td>name</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance name</td> </tr> <tr><td>name</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance name</td> </tr>
<tr><td>project_uuid</td> <td> </td> <td>string</td> <td>Project UUID</td> </tr> <tr><td>project_uuid</td> <td>&#10004;</td> <td>string</td> <td>Project UUID</td> </tr>
<tr><td>uuid</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance UUID</td> </tr> <tr><td>uuid</td> <td>&#10004;</td> <td>string</td> <td>VirtualBox VM instance UUID</td> </tr>
</table> </table>

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /virtualbox/**{uuid}**/start POST /virtualbox/**{uuid}**/start
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start a VirtualBox VM instance Start a VirtualBox VM instance
Parameters Parameters

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /virtualbox/**{uuid}**/stop POST /virtualbox/**{uuid}**/stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Stop a VirtualBox VM instance Stop a VirtualBox VM instance
Parameters Parameters

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /vpcs POST /vpcs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Create a new VPCS instance Create a new VPCS instance
Response status codes Response status codes

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
GET /vpcs/**{uuid}** GET /vpcs/**{uuid}**
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Get a VPCS instance Get a VPCS instance
Parameters Parameters
@ -24,7 +24,7 @@ Sample session
PUT /vpcs/**{uuid}** PUT /vpcs/**{uuid}**
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Update a VPCS instance Update a VPCS instance
Response status codes Response status codes

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /vpcs/**{uuid}**/ports/**{port_id}**/nio POST /vpcs/**{uuid}**/ports/**{port_id}**/nio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Add a NIO to a VPCS Add a NIO to a VPCS
Parameters Parameters
@ -26,7 +26,7 @@ Sample session
DELETE /vpcs/**{uuid}**/ports/**{port_id}**/nio DELETE /vpcs/**{uuid}**/ports/**{port_id}**/nio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Remove a NIO from a VPCS Remove a NIO from a VPCS
Parameters Parameters

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /vpcs/**{uuid}**/start POST /vpcs/**{uuid}**/start
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start a VPCS instance Start a VPCS instance
Parameters Parameters

View File

@ -4,7 +4,7 @@
.. contents:: .. contents::
POST /vpcs/**{uuid}**/stop POST /vpcs/**{uuid}**/stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Stop a VPCS instance Stop a VPCS instance
Parameters Parameters

View File

@ -169,3 +169,21 @@ class VPCSHandler:
vm = vpcs_manager.get_vm(request.match_info["uuid"]) vm = vpcs_manager.get_vm(request.match_info["uuid"])
nio = vm.port_remove_nio_binding(int(request.match_info["port_id"])) nio = vm.port_remove_nio_binding(int(request.match_info["port_id"]))
response.set_status(204) response.set_status(204)
@classmethod
@Route.post(
r"/vpcs/{uuid}/reload",
parameters={
"uuid": "VPCS instance UUID",
},
status_codes={
204: "VPCS reloaded",
404: "VPCS instance doesn't exist"
},
description="Remove a NIO from a VPCS")
def reload(request, response):
vpcs_manager = VPCS.instance()
vm = vpcs_manager.get_vm(request.match_info["uuid"])
nio = vm.reload()
response.set_status(204)

View File

@ -252,6 +252,15 @@ class VPCSVM(BaseVM):
self._process = None self._process = None
self._started = False self._started = False
@asyncio.coroutine
def reload(self):
"""
Reload the VPCS process. (Stop / Start)
"""
yield from self.stop()
yield from self.start()
def _kill_process(self): def _kill_process(self):
"""Kill the process if running""" """Kill the process if running"""
@ -271,7 +280,6 @@ class VPCSVM(BaseVM):
Reads the standard output of the VPCS process. Reads the standard output of the VPCS process.
Only use when the process has been stopped or has crashed. Only use when the process has been stopped or has crashed.
""" """
# TODO: should be async
output = "" output = ""
if self._vpcs_stdout_file: if self._vpcs_stdout_file:
try: try:

View File

@ -38,7 +38,7 @@ class Documentation(object):
f.write('.. contents::\n') f.write('.. contents::\n')
for method in handler_doc["methods"]: for method in handler_doc["methods"]:
f.write('\n{} {}\n'.format(method["method"], path.replace("{", '**{').replace("}", "}**"))) f.write('\n{} {}\n'.format(method["method"], path.replace("{", '**{').replace("}", "}**")))
f.write('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n') f.write('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n')
f.write('{}\n\n'.format(method["description"])) f.write('{}\n\n'.format(method["description"]))
if len(method["parameters"]) > 0: if len(method["parameters"]) > 0:

View File

@ -119,6 +119,13 @@ def test_vpcs_stop(server, vm):
assert response.status == 204 assert response.status == 204
def test_vpcs_reload(server, vm):
with asyncio_patch("gns3server.modules.vpcs.vpcs_vm.VPCSVM.reload", return_value=True) as mock:
response = server.post("/vpcs/{}/reload".format(vm["uuid"]))
assert mock.called
assert response.status == 204
def test_vpcs_update(server, vm, tmpdir, free_console_port): def test_vpcs_update(server, vm, tmpdir, free_console_port):
path = os.path.join(str(tmpdir), 'startup2.vpcs') path = os.path.join(str(tmpdir), 'startup2.vpcs')
with open(path, 'w+') as f: with open(path, 'w+') as f:

View File

@ -87,6 +87,19 @@ def test_stop(loop, vm):
process.terminate.assert_called_with() process.terminate.assert_called_with()
def test_reload(loop, vm):
process = MagicMock()
with asyncio_patch("gns3server.modules.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True):
with asyncio_patch("asyncio.create_subprocess_exec", return_value=process):
nio = vm.port_add_nio_binding(0, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"})
loop.run_until_complete(asyncio.async(vm.start()))
assert vm.is_running()
loop.run_until_complete(asyncio.async(vm.reload()))
assert vm.is_running() is True
process.terminate.assert_called_with()
def test_add_nio_binding_udp(vm): def test_add_nio_binding_udp(vm):
nio = vm.port_add_nio_binding(0, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) nio = vm.port_add_nio_binding(0, {"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"})
assert nio.lport == 4242 assert nio.lport == 4242