EVE-NG API

How to use EVE-NG API

 

EVE-NG APIs use JSend, a JSON response in the following syntax:

{
	"code": 404,
	"message": "Requested folder does not exist (60008).",
	"status": "fail"
}

Code is the HTTP response code, message is a simple string explaining what is going on, and status is a single word explaining the response. Five status type are used:

  • success for 20x HTTP codes;
  • unauthorized for 400 HTTP code, meaning that the user session has timed out;
  • unauthorized for 401 HTTP code, meaning that user should login;
  • forbidden for 403 HTTP code, meaning that user does not have enough privileges;
  • fail for other 40x HTTP codes;
  • error for 50x HTTP codes.

The default Web-UI uses only APIs, so this is an essential part to develop new Web-UI themes, integration and so on. Mind that each user can login from a single location only. If the same user login twice, the second login disable the first one.

EVE-NG Pro use ssl protocol. All samples here require adding -k and https as protocol… So adapt this documentation….

Due to EVE-NG Code evolution, some call’s documentation are outdated ( more parameters supported ). It is advised to use the GET method to have a full set of parameters available.

 

Authentication

The following API requests are involved on login and logout process. All other API requests require an authenticated user.

Login

curl -s -b /tmp/cookie -c /tmp/cookie -X POST -d '{"username":"admin","password":"eve"}' http://127.0.0.1/api/auth/login

A successful login provides the following output:

{
    "code": 200,
    "message": "User logged in (90013).",
    "status": "success"
}

User Info

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/auth

An authenticated user can get its own information:

{
    "code": 200,
    "data": {
        "email": "root@localhost",
        "folder": "/",
        "lab": null,
        "lang": "en",
        "name": "EVE-NG Administrator",
        "role": "admin",
        "tenant": "0",
        "username": "admin"
    },
    "message": "User has been loaded (90002).",
    "status": "success"
}

Logout

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/auth/logout

All users can logout, this request cannot fail:

{
    "code": 200,
    "message": "User logged out (90019).",
    "status": "success"
}

System status

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/status

An authenticated user can get system statistics:

{
    "code": 200,
    "data": {
        "cached": 5,
        "cpu": 1,
        "disk": 31,
        "dynamips": 0,
        "iol": 0,
        "mem": 8,
        "qemu": 0,
        "qemu_version": "2.4.0",
        "swap": 0,
        "version": "development"
    },
    "message": "Fetched system status (60001).",
    "status": "success"
}

List node templates

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/list/templates/

An authenticated user can list all available node templates:

{
    "code": 200,
    "data": {
        "a10": "A10 vThunder",
        "acs": "Cisco ACS",
        "asa": "Cisco ASA",
        "asav": "Cisco ASAv",
        "bigip": "F5 BIG-IP LTM VE",
        "brocadevadx": "Brocade vADX",
        "c1710": "Cisco IOS 1710 (Dynamips)",
        "c3725": "Cisco IOS 3725 (Dynamips)",
        "c7200": "Cisco IOS 7206VXR (Dynamips)",
        "cda": "Cisco Context Directory Agent",
        "cips": "Cisco IPS",
        "clearpass": "Aruba ClearPass",
        "coeus": "Cisco Web Security Appliance",
        "cpsg": "CheckPoint Security Gateway VE",
        "csr1000v": "Cisco CSR 1000V",
        "cumulus": "Cumulus VX",
        "extremexos": "ExtremeXOS",
        "fortinet": "Fortinet FortiGate",
        "hpvsr": "HP VSR1000",
        "iol": "Cisco IOL",
        "ise": "Cisco ISE",
        "linux": "Linux",
        "mikrotik": "MikroTik RouterOS",
        "nsvpx": "Citrix Netscaler",
        "olive": "Juniper Olive",
        "ostinato": "Ostinato",
        "paloalto": "Palo Alto VM-100 Firewall",
        "sourcefire": "Cisco Sourcefire",
        "sterra": "S-Terra",
        "timos": "Alcatel 7750 SR",
        "titanium": "Cisco NX-OSv (Titanium)",
        "ucspe": "Cisco UCS-PE",
        "veos": "Arista vEOS",
        "vios": "Cisco vIOS",
        "viosl2": "Cisco vIOS L2",
        "vmx": "Juniper vMX",
        "vnam": "Cisco vNAM",
        "vsrx": "Juniper vSRX",
        "vsrxng": "Juniper vSRX NextGen",
        "vwaas": "Cisco vWAAS",
        "vwlc": "Cisco vWLC",
        "vyos": "VyOS",
        "win": "Windows",
        "xrv": "Cisco XRv"
    },
    "message": "Successfully listed node templates (60003).",
    "status": "success"
}

A single template can be listed:

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/list/templates/iol

All available images for the selected template will be included in the output:

{
    "code": 200,
    "data": {
        "description": "Cisco IOL",
        "options": {
            "config": {
                "list": {
                    "Saved": "Saved",
                    "Unconfigured": "Unconfigured"
                },
                "name": "Startup configuration",
                "type": "list",
                "value": "Unconfigured"
            },
            "delay": {
                "name": "Delay (s)",
                "type": "input",
                "value": 0
            },
            "ethernet": {
                "name": "Ethernet portgroups (4 int each)",
                "type": "input",
                "value": 1
            },
            "icon": {
                "list": {
                    "Desktop.png": "Desktop",
                    "Firewall.png": "Firewall",
                    "Frame Relay.png": "Frame Relay",
                    "HUB.png": "HUB",
                    "Load Balancer.png": "Load Balancer",
                    "MPLS.png": "MPLS",
                    "Network Analyzer.png": "Network Analyzer",
                    "Router.png": "Router",
                    "Server.png": "Server",
                    "Switch L3.png": "Switch L3",
                    "Switch.png": "Switch",
                    "WAN Optimizer.png": "WAN Optimizer"
                },
                "name": "Icon",
                "type": "list",
                "value": "Router.png"
            },
            "image": {
                "list": {
                    "L2-IPBASEK9-M-15.1-20130726.bin": "L2-IPBASEK9-M-15.1-20130726.bin",
                    "L3-ADVENTERPRISEK9-M-15.4-1T.bin": "L3-ADVENTERPRISEK9-M-15.4-1T.bin"
                },
                "name": "Image",
                "type": "list",
                "value": "L3-ADVENTERPRISEK9-M-15.4-1T.bin"
            },
            "name": {
                "name": "Name/prefix",
                "type": "input",
                "value": "R"
            },
            "nvram": {
                "name": "NVRAM",
                "type": "input",
                "value": 1024
            },
            "ram": {
                "name": "RAM",
                "type": "input",
                "value": 256
            },
            "serial": {
                "name": "Serial portgroups (4 int each)",
                "type": "input",
                "value": 1
            }
        },
        "type": "iol"
    },
    "message": "Successfully listed node template (60032).",
    "status": "success"
}

List network types

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/list/networks

An authenticated user can list all available network types:

{"code": 200,
    "data": {
        "bridge": "bridge",
        "ovs": "ovs",
        "pnet0": "pnet0",
        "pnet1": "pnet1",
        "pnet2": "pnet2",
        "pnet3": "pnet3",
        "pnet4": "pnet4",
        "pnet5": "pnet5",
        "pnet6": "pnet6",
        "pnet7": "pnet7",
        "pnet8": "pnet8",
        "pnet9": "pnet9"
    },
    "message": "Successfully listed network types (60002).",
    "status":"success"}

List user roles

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/list/roles

An authenticated user can list all user roles:

{
    "code": 200,
    "data": {
        "admin": "Administrator",
        "editor": "Editor",
        "user": "User"
    },
    "message": "Successfully listed user roles (60041).",
    "status": "success"
}

The following API requests allow to manages folders and labs as files.

List content inside a folder

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/folders/User1

An authenticated user can list what is inside a folder:

{
    "code": 200,
    "data": {
        "folders": [
            {
                "name": "..",
                "path": "/"
            },
            {
                "name": "Folder 1",
                "path": "/User1/Folder 1"
            },
            {
                "name": "Folder 2",
                "path": "/User1/Folder 2"
            },
            {
                "name": "Folder 3",
                "path": "/User1/Folder 3"
            }
        ],
        "labs": [
            {
                "file": "Lab 1.unl",
                "path": "/User1/Lab 1.unl"
            },
            {
                "file": "Lab 2.unl",
                "path": "/User1/Lab 2.unl"
            },
            {
                "file": "Lab 3.unl",
                "path": "/User1/Lab 3.unl"
            }
        ]
    },
    "message": "Successfully listed path (60007).",
    "status": "success"
}

Folders and labs are listed using different arrays.

Add a new folder

curl -s -c /tmp/cookie -b /tmp/cookie
-X POST -d '{"path":"/User1/Folder 3","name":"New Folder"}' -H
'Content-type: application/json' http://127.0.0.1/api/folders

An authenticated user can add a folder inside a specific path:

{
    "code": 200,
    "message": "Folder has been created (60014).",
    "status": "success"
}

Move/rename an existent folder

curl -s -c /tmp/cookie -b /tmp/cookie
-X PUT -d '{"path":"/User1/Folder 3/Test Folder"}' -H 'Content-type:
application/json'
http://127.0.0.1/api/folders/User1/Folder%203/New%20Folder

An authenticated user can add a folder inside a specific path:

{
    "code": 200,
    "message": "Folder moved (60049).",
    "status": "success"
}

Delete an existing folder

curl -s -c /tmp/cookie -b /tmp/cookie
-X DELETE -H 'Content-type: application/json'
http://127.0.0.1/api/folders/User1/Folder%203/Test%20Folder

An authenticated user can delete an existing folder:

{
    "code": 200,
    "message": "Folder has been deleted (60012).",
    "status": "success"
}

Managing users

The following API requests allow to manage EVE-NG users and permissions.

Get a user

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/users/

An authenticated user can get all EVE-NG users:

{
    "code": 200,
    "data": {
        "admin": {
            "email": "root@localhost",
            "expiration": "-1",
            "folder": "/User1",
            "ip": "127.0.0.1",
            "lab": null,
            "name": "UNetLab Administrator",
            "pexpiration": "-1",
            "pod": "0",
            "role": "admin",
            "session": "1447319929",
            "username": "admin"
        },
        "User1": {
            "email": "User1.Lastname@gmail.com",
            "expiration": "-1",
            "folder": "/Featured/Cisco/Basic",
            "ip": "192.168.19.1",
            "lab": "/Featured/Cisco/Basic/STP.unl",
            "name": "User1 Lastname",
            "pexpiration": "-1",
            "pod": "1",
            "role": "admin",
            "session": "1447319925",
            "username": "User1"
        }
    },
    "message": "Successfully listed users (60040).",
    "status": "success"
}

A single user can be retrieved:

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/users/admin

Here the output:

{
    "code": 200,
    "data": {
        "email": "root@localhost",
        "expiration": "-1",
        "ip": "127.0.0.1",
        "name": "UNetLab Administrator",
        "pexpiration": "-1",
        "pod": "0",
        "role": "admin",
        "session": "1447319929",
        "username": "admin"
    },
    "message": "Successfully listed users (60040).",
    "status": "success"
}

Add a new user

curl -s -c /tmp/cookie -b /tmp/cookie
-X POST -d '{"username":"testuser","name":"Test
User","email":"test@unetlab.com","password":"testpassword1","role":"user","expiration":"-1","pod":127,"pexpiration":"1451520000"}'
-H 'Content-type: application/json' http://127.0.0.1/api/users

An authenticated user can add a new EVE-NG user:

{
    "code": 201,
    "message": "User saved (60042).",
    "status": "success"
}

Parameters:

  • email: the email address of the user;
  • expiration: date until the user is valid (UNIX timestamp) or -1 if never expires;
  • name: a description for the user, usually salutation;
  • password (mandatory): the user password used to login;
  • role: see “List user roles”;
  • username (mandatory): a unique alphanumeric string used to login;

Edit an user

curl -s -c /tmp/cookie -b /tmp/cookie
-X PUT -d '{"name":"New Test
User","email":"testuser@unetlab.com","password":"newpassword","role":"user","expiration":"1451520000","pod":127,"pexpiration":"-1"}'
-H 'Content-type: application/json' http://127.0.0.1/api/users/testuser

An authenticated user can edit an existent EVE-NG user:

{
    "code": 200,
    "message": "User saved (60042).",
    "status": "success"
}

Parameters:

  • email: the email address of the user;
  • expiration: date until the user is valid (UNIX timestamp) or -1 if never expires;
  • name: a description for the user, usually salutation;
  • password: the user password used to login;
  • role: see “List user roles”;

Delete an user

curl -s -c /tmp/cookie -b /tmp/cookie -X DELETE -H 'Content-type: application/json' http://127.0.0.1/api/users/testuser

An authenticated user can delete an existent EVE-NG user:

{
    "code": 201,
    "message": "User saved (60042).",
    "status": "success"
}

Managing labs

The following API requests allow to manage labs and object inside a lab, like nodes, networks… and so on.

Get a lab

curl -s -c /tmp/cookie -b /tmp/cookie -X GET -H 'Content-type: application/json' http://127.0.0.1/api/labs/User1/Lab%201.unl

An authenticated user can retrieve a lab:

{
    "code": 200,
    "data": {
        "author": "User1 Lastname",
        "body": "",
        "description": "A new test lab.",
        "filename": "Lab 1.unl",
        "id": "d34628dd-cc1d-4e52-8f91-4a0673985d87",
        "name": "Lab 1",
        "version": "1"
    },
    "message": "Lab has been loaded (60020).",
    "status": "success"
}

Get one or all networks configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/networks

An authenticated user can retrieve all configured networks in a lab:

{
    "code": 200,
    "data": {
        "1": {
            "id": 1,
            "left": 409,
            "name": "Net OVS",
            "top": 345,
            "type": "ovs"
        },
        "2": {
            "id": 2,
            "left": 583,
            "name": "Net2",
            "top": 261,
            "type": "bridge"
        },
        "3": {
            "id": 3,
            "left": 256,
            "name": "Net3",
            "top": 276,
            "type": "bridge"
        },
        "4": {
            "id": 4,
            "left": 583,
            "name": "Net4",
            "top": 483,
            "type": "bridge"
        },
        "5": {
            "id": 5,
            "left": 409,
            "name": "Net5",
            "top": 491,
            "type": "bridge"
        }
    },
    "message": "Successfully listed networks (60004).",
    "status": "success"
}

A single network can be retrieved:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/networks/1

Here the output:

{
    "code": 200,
    "data": {
        "left": 409,
        "name": "Net OVS",
        "top": 345,
        "type": "ovs"
    },
    "message": "Successfully listed network (60005).",
    "status": "success"
}

Get all remote endpoint for both ethernet and serial interfaces

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/links

An authenticated user can retrieve all available endpoint in a lab:

{
    "code": 200,
    "data": {
        "ethernet": {
            "1": "Net OVS",
            "2": "Net2",
            "3": "Net3",
            "4": "Net4",
            "5": "Net5"
        },
        "serial": {
            "3": {
                "1": "R3 s1/0",
                "17": "R3 s1/1",
                "33": "R3 s1/2",
                "49": "R3 s1/3"
            },
            "4": {
                "1": "R4 s1/0",
                "17": "R4 s1/1",
                "33": "R4 s1/2",
                "49": "R4 s1/3"
            }
        }
    },
    "message": "Fetced all lab networks and serial endpoints (60024).",
    "status": "success"
}

This API is useful when a user need to connect a node.

Get one or all nodes configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes

An authenticated user can retrieve all configured nodes in a lab:

{
    "code": 200,
    "data": {
        "1": {
            "console": "telnet",
            "cpu": 1,
            "delay": 0,
            "ethernet": 4,
            "icon": "Router.png",
            "id": 1,
            "image": "vios-adventerprisek9-m-15.4-1.3.0.181",
            "left": 358,
            "name": "R1",
            "ram": 512,
            "status": 0,
            "template": "vios",
            "top": 330,
            "type": "qemu",
            "url": "telnet://127.0.0.1:32769",
            "uuid": "ab60e9de-2599-4b67-919a-b769fb6e270d"
        },
        "2": {
            "console": "telnet",
            "cpu": 1,
            "delay": 0,
            "ethernet": 4,
            "icon": "Router.png",
            "id": 2,
            "image": "vios-adventerprisek9-m-15.4-1.3.0.181",
            "left": 501,
            "name": "R2",
            "ram": 512,
            "status": 0,
            "template": "vios",
            "top": 330,
            "type": "qemu",
            "url": "telnet://127.0.0.1:32770",
            "uuid": "206323a6-000b-40bc-a765-9c7e7e5751ee"
        },
        "3": {
            "console": "telnet",
            "delay": 0,
            "ethernet": 1,
            "icon": "Router.png",
            "id": 3,
            "image": "L3-ADVENTERPRISEK9-M-15.4-1T.bin",
            "left": 430,
            "name": "R3",
            "nvram": 1024,
            "ram": 256,
            "serial": 1,
            "status": 0,
            "template": "iol",
            "top": 529,
            "type": "iol",
            "url": "telnet://127.0.0.1:32771"
        },
        "4": {
            "console": "telnet",
            "delay": 0,
            "ethernet": 1,
            "icon": "Router.png",
            "id": 4,
            "image": "L3-ADVENTERPRISEK9-M-15.4-1T.bin",
            "left": 430,
            "name": "R4",
            "nvram": 1024,
            "ram": 256,
            "serial": 1,
            "status": 0,
            "template": "iol",
            "top": 192,
            "type": "iol",
            "url": "telnet://127.0.0.1:32772"
        }
    },
    "message": "Successfully listed nodes (60026).",
    "status": "success"
}

A single node can be retrieved:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1

Here the output:

{
    "code": 200,
    "data": {
        "config": "Unconfigured",
        "console": "telnet",
        "cpu": 1,
        "delay": 0,
        "ethernet": 4,
        "icon": "Router.png",
        "image": "vios-adventerprisek9-m-15.4-1.3.0.181",
        "left": 358,
        "name": "R1",
        "ram": 512,
        "status": 0,
        "template": "vios",
        "top": 330,
        "type": "qemu",
        "url": "telnet://127.0.0.1:32769",
        "uuid": "ab60e9de-2599-4b67-919a-b769fb6e270d"
    },
    "message": "Successfully listed node (60025).",
    "status": "success"
}

Start one or all nodes configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/start

An authenticated user can start all configured nodes in a lab:

{
    "code": 400,
    "message": "Failed to start node (12).",
    "status": "fail"
}

A single node can be started:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1/start

Here the output:

{
    "code": 200,
    "message": "Node started (80049).",
    "status": "success"
}

Stop one or all nodes configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/stop

An authenticated user can stop all configured nodes in a lab:

{
    "code": 200,
    "message": "Nodes stopped (80050).",
    "status": "success"
}

A single node can be stopped:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1/stop

Here the output:

{
    "code": 200,
    "message": "Node stopped (80051).",
    "status": "success"
}

Wipe one or all nodes configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/wipe

An authenticated user can wipe all configured nodes in a lab:

{
    "code": 200,
    "message": "Nodes cleared (80052).",
    "status": "success"
}

Wiping means delete all user config, included startup-config, VLANs, and so on. Next start will rebuild node from selected image. A single node can be wiped:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1/wipe

Here the output:

{
    "code": 200,
    "message": "Node cleared (80053).",
    "status": "success"
}

Export one or all nodes configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/export

An authenticated user can export all configured nodes in a lab:

{
    "code": 200,
    "message": "Nodes exported (80057).",
    "status": "success"
}

Exporting means save startup-config into the lab file. Starting a node after a wipe will load the previously exported startup-config. A single node can be wiped:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1/export

Here the output:

{
    "code": 200,
    "message": "Node exported (80058).",
    "status": "success"
}

Get configured intefaces from a node

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/nodes/1/interfaces

An authenticated user can retrieve all configured interfaces from a node:

{
    "code": 200,
    "data": {
        "ethernet": [
            {
                "name": "Gi0/0",
                "network_id": 1
            },
            {
                "name": "Gi0/1",
                "network_id": 3
            },
            {
                "name": "Gi0/2",
                "network_id": 5
            },
            {
                "name": "Gi0/3",
                "network_id": 0
            }
        ],
        "serial": []
    },
    "message": "Successfully listed node interfaces (60030).",
    "status": "success"
}

Get the lab topology

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/topology

An authenticated user can get lab topology:

{
    "code": "200",
    "data": [
        {
            "destination": "network1",
            "destination_label": "",
            "destination_type": "network",
            "source": "node1",
            "source_label": "Gi0/0",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "network1",
            "destination_label": "",
            "destination_type": "network",
            "source": "node2",
            "source_label": "Gi0/0",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "network1",
            "destination_label": "",
            "destination_type": "network",
            "source": "node3",
            "source_label": "e0/0",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "node1",
            "destination_label": "Gi0/1",
            "destination_type": "node",
            "source": "node3",
            "source_label": "e0/1",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "node1",
            "destination_label": "Gi0/2",
            "destination_type": "node",
            "source": "node3",
            "source_label": "e0/2",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "network1",
            "destination_label": "",
            "destination_type": "network",
            "source": "node4",
            "source_label": "e0/0",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "node2",
            "destination_label": "Gi0/1",
            "destination_type": "node",
            "source": "node4",
            "source_label": "e0/1",
            "source_type": "node",
            "type": "ethernet"
        },
        {
            "destination": "node2",
            "destination_label": "Gi0/2",
            "destination_type": "node",
            "source": "node4",
            "source_label": "e0/2",
            "source_type": "node",
            "type": "ethernet"
        }
    ],
    "message": "Topology loaded",
    "status": "success"
}

Get one or all pictures configured in a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/pictures

An authenticated user can get all configured pictures in a lab:

{
    "code": 200,
    "data": {
        "1": {
            "height": 201,
            "id": 1,
            "name": "RR Logo",
            "type": "image/png",
            "width": 410
        }
    },
    "message": "Successfully listed pictures (60028).",
    "status": "success"
}

A single picture can be retrieved:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/pictures/1

Here the output:

{
    "code": 200,
    "data": {
        "height": 201,
        "id": "1",
        "map": "<area shape='circle' coords='248,66,30' href='telnet://:'>\n",
        "name": "RR Logo",
        "type": "image/png",
        "width": 410
    },
    "message": "Picture loaded",
    "status": "success"
}

The data picture can be retrieved using a different request:

curl -s -c /tmp/cookie -b /tmp/cookie
-X GET -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Lab%201.unl/pictures/1/data/32/32

The resized picture is generated with original aspect-ratio using given values as maximum witdh/lenght.

Create a new lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X POST -d '{"path":"/User1/Folder 3","name":"New
Lab","version":"1","author":"User1 Lastname","description":"A new demo
lab","body":"Lab usage and guide"}' -H 'Content-type: application/json'
http://127.0.0.1/api/labs

An authenticated user can create a new lab:

{
    "code": 200,
    "message": "Lab has been created (60019).",
    "status": "success"
}

Move an existing lab to a different folder

curl -s -c /tmp/cookie -b /tmp/cookie
-X PUT -d '{"path":"/User1/Folder 2"}' -H 'Content-type:
application/json'
http://127.0.0.1/api/labs/User1/Folder%203/New%20Lab.unl/move

{
    "code": 200,
    "message": "Lab moved (60035).",
    "status": "success"
}

Edit an existing lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X PUT -d '{"name":"Different
Lab","version":"2","author":"AD","description":"A different demo lab"}'
-H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Folder%202/New%20Lab.unl

An authenticated user can edit an existing lab:

{
    "code": 200,
    "message": "Lab has been saved (60023).",
    "status": "success"
}

The request can set only one single parameter. Optional paramiter can be reverted to the default setting an empty string “”.

Add a new network to a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X POST -d '{"type":"bridge","name":"Core
Network","left":"35%","top":"25%"}' -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Folder%202/Different%20Lab.unl/networks

An authenticated user can add a network to an existing lab:

{
    "code": 201,
    "message": "Network has been added to the lab (60006).",
    "status": "success"
}

Parameters:

  • left: mergin from left, in percentage (i.e. 35%), default is a random value between 30% and 70%;
  • name: network name (i.e. Core Network), default is NetX (X = network_id);
  • top: margin from top, in percentage (i.e. 25%), default is a random value between 30% and 70%;
  • type (mandatory): see “List network types”.

Add a new node to a lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X POST -d
'{"type":"qemu","template":"vios","config":"Unconfigured","delay":0,"icon":"Router.png","image":"vios-adventerprisek9-m-15.5.3M","name":"Core
Router
1","left":"35%","top":"25%","ram":"1024","console":"telnet","cpu":1,"ethernet":2,"uuid":"641a4800-1b19-427c-ae87-4a8ee90b7790"}'
-H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Folder%202/Different%20Lab.unl/nodes

An authenticated user can add a node to an existing lab:

{
    "code": 201,
    "message": "Lab has been saved (60023).",
    "status": "success"
}

Parameters:

  • config: can be Unconfigured or Saved, default is Unconfigured;
  • delay: seconds to wait before starting the node, default is 0;
  • icon: icon (located under /opt/unetlab/html/images/icons/) used to display the node, default is Router.png;
  • image: image used to start the node, default is latest included in “List node templates”;
  • left: mergin from left, in percentage (i.e. 35%), default is a random value between 30% and 70%;
  • name: node name (i.e. “Core1”), default is NodeX (X = node_id);
  • ram: MB of RAM configured for the node, default is 1024;
  • template (mandatory): see “List node templates”;
  • top: margin from top, in percentage (i.e. 25%), default is a random value between 30% and 70%;
  • type (mandatory): can be iol, dynamips or qemu.

Parameters for IOL nodes:

  • ethernet: number of ethernet porgroups (each portgroup configures four interfaces), default is 2;
  • nvram: size of NVRAM in KB, default is 1024;
  • serial: number of serial porgroups (each portgroup configures four interfaces), default is 2.

Parameters for Dynamips nodes:

  • idlepc: value used for Dynamips optimization (i.e. 0x80369ac4), default is 0x0 (no optimization);
  • nvram: size of NVRAM in KB, default is 1024;
  • slot[0-9]+: the module configured in a specific slot (i.e. slot1=NM-1FE-TX).

Parameters for QEMU nodes:

  • console: can be telnet or vnc, default is telnet;
  • cpu: number of configured CPU, default is 1;
  • ethernet: number of ethernet interfaces, default is 4;
  • uuid: UUID configured, default is a random UUID (i.e. 641a4800-1b19-427c-ae87-4a8ee90b7790).

Delete an existent lab

curl -s -c /tmp/cookie -b /tmp/cookie
-X DELETE -H 'Content-type: application/json'
http://127.0.0.1/api/labs/User1/Folder%202/Different%20Lab.unl

An authenticated user can delete a lab:

{
    "code": 200,
    "message": "Lab has been deleted (60022).",
    "status": "success"
}