This add a /appliances call
16 KiB
Sample session using curl
You need to read the glossary
, and general
before.
Full endpoints list is available: endpoints
Warning
Beware the output of this sample is truncated in order to simplify the understanding. Please read the documentation for the exact output.
You can check the server version with a simple curl command:
# curl "http://localhost:3080/v2/version"
{
"version": "2.0.0dev1"
}
List computes
We will list the computes node where we can run our nodes:
# curl "http://localhost:3080/v2/computes"
[
{
"compute_id": "local",
"connected": true,
"host": "127.0.0.1",
"name": "Local",
"port": 3080,
"protocol": "http",
"user": "admin"
}
]
In this sample we have only one compute where we can run our nodes. This compute as a special id: local. This mean it's the local server embed in the GNS3 controller.
Create project
The next step is to create a project.
# curl -X POST "http://localhost:3080/v2/projects" -d '{"name": "test"}'
{
"name": "test",
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f",
}
Create nodes
With this project id we can now create two VPCS Node.
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes" -d '{"name": "VPCS 1", "node_type": "vpcs", "compute_id": "local"}'
{
"compute_id": "local",
"console": 5000,
"console_host": "127.0.0.1",
"console_type": "telnet",
"name": "VPCS 1",
"node_id": "f124dec0-830a-451e-a314-be50bbd58a00",
"node_type": "vpcs",
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f",
"status": "stopped"
}
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes" -d '{"name": "VPCS 2", "node_type": "vpcs", "compute_id": "local"}'
{
"compute_id": "local",
"console": 5001,
"console_host": "127.0.0.1",
"console_type": "telnet",
"name": "VPCS 2",
"node_id": "83892a4d-aea0-4350-8b3e-d0af3713da74",
"node_type": "vpcs",
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f",
"status": "stopped"
}
The properties dictionnary contains all setting specific to a node type (dynamips, docker, vpcs...)
Link nodes
Now we need to link the two VPCS by connecting their port 0 together.
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/links" -d '{"nodes": [{"adapter_number": 0, "node_id": "f124dec0-830a-451e-a314-be50bbd58a00", "port_number": 0}, {"adapter_number": 0, "node_id": "83892a4d-aea0-4350-8b3e-d0af3713da74", "port_number": 0}]}'
{
"capture_file_name": null,
"capture_file_path": null,
"capturing": false,
"link_id": "007f2177-6790-4e1b-ac28-41fa226b2a06",
"nodes": [
{
"adapter_number": 0,
"node_id": "f124dec0-830a-451e-a314-be50bbd58a00",
"port_number": 0
},
{
"adapter_number": 0,
"node_id": "83892a4d-aea0-4350-8b3e-d0af3713da74",
"port_number": 0
}
],
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f"
}
Start nodes
Now we can start the two nodes.
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes/f124dec0-830a-451e-a314-be50bbd58a00/start" -d "{}"
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes/83892a4d-aea0-4350-8b3e-d0af3713da74/start" -d "{}"
Connect to nodes
Everything should be started now. You can connect via telnet to the different Node. The port is the field console in the create Node request.
# telnet 127.0.0.1 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to Virtual PC Simulator, version 0.6
Dedicated to Daling.
Build time: Dec 29 2014 12:51:46
Copyright (c) 2007-2014, Paul Meng (mirnshi@gmail.com)
All rights reserved.
VPCS is free software, distributed under the terms of the "BSD" licence.
Source code and license can be found at vpcs.sf.net.
For more information, please visit wiki.freecode.com.cn.
Press '?' to get help.
VPCS> ip 192.168.1.1
Checking for duplicate address...
PC1 : 192.168.1.1 255.255.255.0
VPCS> disconnect
Good-bye
Connection closed by foreign host.
# telnet 127.0.0.1 5001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome to Virtual PC Simulator, version 0.6
Dedicated to Daling.
Build time: Dec 29 2014 12:51:46
Copyright (c) 2007-2014, Paul Meng (mirnshi@gmail.com)
All rights reserved.
VPCS is free software, distributed under the terms of the "BSD" licence.
Source code and license can be found at vpcs.sf.net.
For more information, please visit wiki.freecode.com.cn.
Press '?' to get help.
VPCS> ip 192.168.1.2
Checking for duplicate address...
PC1 : 192.168.1.2 255.255.255.0
VPCS> ping 192.168.1.1
84 bytes from 192.168.1.1 icmp_seq=1 ttl=64 time=0.179 ms
84 bytes from 192.168.1.1 icmp_seq=2 ttl=64 time=0.218 ms
84 bytes from 192.168.1.1 icmp_seq=3 ttl=64 time=0.190 ms
84 bytes from 192.168.1.1 icmp_seq=4 ttl=64 time=0.198 ms
84 bytes from 192.168.1.1 icmp_seq=5 ttl=64 time=0.185 ms
VPCS> disconnect
Good-bye
Connection closed by foreign host.
Stop nodes
And we stop the two nodes.
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes/f124dec0-830a-451e-a314-be50bbd58a00/stop" -d "{}"
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes/83892a4d-aea0-4350-8b3e-d0af3713da74/stop" -d "{}"
Add a visual element
When you want add visual elements to the topology like rectangle, circle, images you can just send a raw SVG. This will display a red square in the middle of your topologies:
# curl -X POST "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/drawings" -d '{"x":0, "y": 12, "svg": "<svg width=\"50\" height=\"50\"><rect width=\"50\" height=\"50\" style=\"fill: #ff0000\"></rect></svg>"}'
Tips: you can embed png/jpg... by using a base64 encoding in the SVG.
Creation of nodes
Their is two way of adding nodes. Manual by passing all the information require for a Node.
Or by using an appliance. The appliance is a node model saved in your server.
Using an appliance
First you need to list the available appliances
# curl "http://localhost:3080/v2/appliances"
[
{
"appliance_id": "5fa8a8ca-0f80-4ac4-8104-2b32c7755443",
"category": "guest",
"compute_id": "vm",
"default_name_format": "{name}-{0}",
"name": "MicroCore",
"node_type": "qemu",
"symbol": ":/symbols/qemu_guest.svg"
},
{
"appliance_id": "9cd59d5a-c70f-4454-8313-6a9e81a8278f",
"category": "guest",
"compute_id": "vm",
"default_name_format": "{name}-{0}",
"name": "Chromium",
"node_type": "docker",
"symbol": ":/symbols/docker_guest.svg"
}
]
Now you can use the appliance and put it at a specific position
# curl -X POST http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f -d '{"x": 12, "y": 42}'
Manual creation of a Qemu node
# curl -X POST http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes -d '{"node_type": "qemu", "compute_id": "local", "name": "Microcore1", "properties": {"hda_disk_image": "linux-microcore-6.4.img", "ram": 256, "qemu_path": "qemu-system-x86_64"}}'
{
"command_line": "",
"compute_id": "local",
"console": 5001,
"console_host": "127.0.0.1",
"console_type": "telnet",
"first_port_name": null,
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: TypeWriter;font-size: 10;font-weight: bold;fill: #000000;fill-opacity: 1.0;",
"text": "Microcore1",
"x": null,
"y": -40
},
"name": "Microcore1",
"node_directory": "/Users/noplay/GNS3/projects/untitled/project-files/qemu/9e4eb45b-22f5-450d-8277-2934fbd0aa20",
"node_id": "9e4eb45b-22f5-450d-8277-2934fbd0aa20",
"node_type": "qemu",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"ports": [
{
"adapter_number": 0,
"data_link_types": {
"Ethernet": "DLT_EN10MB"
},
"link_type": "ethernet",
"name": "Ethernet0",
"port_number": 0,
"short_name": "e0/0"
}
],
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f",
"properties": {
"acpi_shutdown": false,
"adapter_type": "e1000",
"adapters": 1,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "linux-microcore-6.4.img",
"hda_disk_image_md5sum": "877419f975c4891c019947ceead5c696",
"hda_disk_interface": "ide",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"mac_address": "00:af:69:aa:20:00",
"options": "",
"platform": "x86_64",
"process_priority": "low",
"qemu_path": "/usr/local/bin/qemu-system-x86_64",
"ram": 256,
"usage": ""
},
"status": "stopped",
"symbol": ":/symbols/computer.svg",
"width": 65,
"x": 0,
"y": 0,
"z": 0
}
Manual creation of a dynamips node
# curl http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/nodes -d '{"symbol": ":/symbols/router.svg", "name": "R1", "properties": {"platform": "c7200", "nvram": 512, "image": "c7200-adventerprisek9-mz.124-24.T8.image", "ram": 512, "slot3": "PA-GE", "system_id": "FTX0945W0MY", "slot0": "C7200-IO-FE", "slot2": "PA-GE", "slot1": "PA-GE", "idlepc": "0x606e0538", "startup_config_content": "hostname %h\n"}, "compute_id": "local", "node_type": "dynamips"}'
{
"command_line": null,
"compute_id": "local",
"console": 5002,
"console_host": "127.0.0.1",
"console_type": "telnet",
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: TypeWriter;font-size: 10;font-weight: bold;fill: #000000;fill-opacity: 1.0;",
"text": "R1",
"x": null,
"y": -32
},
"name": "R1",
"node_directory": "/Users/noplay/GNS3/projects/untitled/project-files/dynamips",
"node_id": "f7367e7e-804e-48be-9037-284d4d9b059e",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"ports": [
{
"adapter_number": 0,
"data_link_types": {
"Ethernet": "DLT_EN10MB"
},
"link_type": "ethernet",
"name": "FastEthernet0/0",
"port_number": 0,
"short_name": "f0/0"
},
{
"adapter_number": 1,
"data_link_types": {
"Ethernet": "DLT_EN10MB"
},
"link_type": "ethernet",
"name": "GigabitEthernet0/0",
"port_number": 0,
"short_name": "g0/0"
},
{
"adapter_number": 2,
"data_link_types": {
"Ethernet": "DLT_EN10MB"
},
"link_type": "ethernet",
"name": "GigabitEthernet1/0",
"port_number": 0,
"short_name": "g1/0"
},
{
"adapter_number": 3,
"data_link_types": {
"Ethernet": "DLT_EN10MB"
},
"link_type": "ethernet",
"name": "GigabitEthernet2/0",
"port_number": 0,
"short_name": "g2/0"
}
],
"project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f",
"properties": {
"auto_delete_disks": false,
"aux": null,
"clock_divisor": 4,
"disk0": 64,
"disk1": 0,
"dynamips_id": 2,
"exec_area": 64,
"idlemax": 500,
"idlepc": "0x606e0538",
"idlesleep": 30,
"image": "c7200-adventerprisek9-mz.124-24.T8.image",
"image_md5sum": "b89d30823cbbda460364991ed18449c7",
"mac_addr": "ca02.dcbb.0000",
"midplane": "vxr",
"mmap": true,
"npe": "npe-400",
"nvram": 512,
"platform": "c7200",
"power_supplies": [
1,
1
],
"private_config": "",
"private_config_content": "",
"ram": 512,
"sensors": [
22,
22,
22,
22
],
"slot0": "C7200-IO-FE",
"slot1": "PA-GE",
"slot2": "PA-GE",
"slot3": "PA-GE",
"slot4": null,
"slot5": null,
"slot6": null,
"sparsemem": true,
"startup_config": "configs/i2_startup-config.cfg",
"startup_config_content": "!\nhostname R1\n",
"system_id": "FTX0945W0MY"
},
"status": "stopped",
"symbol": ":/symbols/router.svg",
"width": 66,
"x": 0,
"y": 0,
"z": 0
}
Notifications
You can see notification about the changes via the notification feed:
# curl "http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/notifications"
{"action": "ping", "event": {"compute_id": "local", "cpu_usage_percent": 35.7, "memory_usage_percent": 80.7}}
{"action": "node.updated", "event": {"command_line": "/usr/local/bin/vpcs -p 5001 -m 1 -i 1 -F -R -s 10001 -c 10000 -t 127.0.0.1", "compute_id": "local", "console": 5001, "console_host": "127.0.0.1", "console_type": "telnet", "name": "VPCS 2", "node_id": "83892a4d-aea0-4350-8b3e-d0af3713da74", "node_type": "vpcs", "project_id": "b8c070f7-f34c-4b7b-ba6f-be3d26ed073f", "properties": {"startup_script": null, "startup_script_path": null}, "status": "started"}}
A websocket version is also available on http://localhost:3080/v2/projects/b8c070f7-f34c-4b7b-ba6f-be3d26ed073f/notifications/ws
Read notifications
for more informations
How to found the endpoints?
Full endpoints list is available: endpoints
If you start the server with --debug you can see all the requests made by the client and by the controller to the computes nodes.