Ganeti remote API ================= Documents Ganeti version 2.0 .. contents:: Introduction ------------ Ganeti supports a remote API for enable external tools to easily retrieve information about a cluster's state. The remote API daemon, *ganeti-rapi*, is automatically started on the master node. By default it runs on TCP port 5080, but this can be changed either in ``.../constants.py`` or via the command line parameter *-p*. SSL mode, which is used by default, can also be disabled by passing command line parameters. Protocol -------- The protocol used is JSON_ over HTTP designed after the REST_ principle. .. _JSON: http://www.json.org/ .. _REST: http://en.wikipedia.org/wiki/Representational_State_Transfer Usage examples -------------- You can access the API using your favorite programming language as long as it supports network connections. Shell +++++ Using wget:: wget -q -O - https://CLUSTERNAME:5080/2/info or curl:: curl https://CLUSTERNAME:5080/2/info Python ++++++ :: import urllib2 f = urllib2.urlopen('https://CLUSTERNAME:5080/info') print f.read() JavaScript ++++++++++ .. warning:: While it's possible to use JavaScript, it poses several potential problems, including browser blocking request due to non-standard ports or different domain names. Fetching the data on the webserver is easier. :: var url = 'https://CLUSTERNAME:5080/info'; var info; var xmlreq = new XMLHttpRequest(); xmlreq.onreadystatechange = function () { if (xmlreq.readyState != 4) return; if (xmlreq.status == 200) { info = eval("(" + xmlreq.responseText + ")"); alert(info); } else { alert('Error fetching cluster info'); } xmlreq = null; }; xmlreq.open('GET', url, true); xmlreq.send(null); Resources --------- / + :: / resource. It supports the following commands: GET. GET ~~~ :: Show the list of mapped resources. Returns: a dictionary with 'name' and 'uri' keys for each of them. /2 ++ :: /2 resource, the root of the version 2 API. It supports the following commands: GET. GET ~~~ :: Show the list of mapped resources. Returns: a dictionary with 'name' and 'uri' keys for each of them. /2/info +++++++ :: Cluster info. It supports the following commands: GET. GET ~~~ :: Returns cluster information. Example:: { "config_version": 2000000, "name": "cluster", "software_version": "2.0.0~beta2", "os_api_version": 10, "export_version": 0, "candidate_pool_size": 10, "enabled_hypervisors": [ "fake" ], "hvparams": { "fake": {} }, "default_hypervisor": "fake", "master": "node1.example.com", "architecture": [ "64bit", "x86_64" ], "protocol_version": 20, "beparams": { "default": { "auto_balance": true, "vcpus": 1, "memory": 128 } } } /2/instances ++++++++++++ :: /2/instances resource. It supports the following commands: GET, POST. GET ~~~ :: Returns a list of all available instances. Example:: [ { "name": "web.example.com", "uri": "\/instances\/web.example.com" }, { "name": "mail.example.com", "uri": "\/instances\/mail.example.com" } ] If the optional 'bulk' argument is provided and set to 'true' value (i.e '?bulk=1'), the output contains detailed information about instances as a list. Example:: [ { "status": "running", "disk_usage": 20480, "nic.bridges": [ "xen-br0" ], "name": "web.example.com", "tags": ["tag1", "tag2"], "beparams": { "vcpus": 2, "memory": 512 }, "disk.sizes": [ 20480 ], "pnode": "node1.example.com", "nic.macs": ["01:23:45:67:89:01"], "snodes": ["node2.example.com"], "disk_template": "drbd", "admin_state": true, "os": "debian-etch", "oper_state": true }, ... ] Returns: a dictionary with 'name' and 'uri' keys for each of them. POST ~~~~ :: Create an instance. Returns: a job id /2/instances/[instance_name] ++++++++++++++++++++++++++++ :: /2/instances/[instance_name] resources. It supports the following commands: GET, DELETE. GET ~~~ :: Send information about an instance. DELETE ~~~~~~ :: Delete an instance. /2/instances/[instance_name]/reboot +++++++++++++++++++++++++++++++++++ :: /2/instances/[instance_name]/reboot resource. Implements an instance reboot. It supports the following commands: POST. POST ~~~~ :: Reboot an instance. The URI takes type=[hard|soft|full] and ignore_secondaries=[False|True] parameters. /2/instances/[instance_name]/shutdown +++++++++++++++++++++++++++++++++++++ :: /2/instances/[instance_name]/shutdown resource. Implements an instance shutdown. It supports the following commands: PUT. PUT ~~~ :: Shutdown an instance. /2/instances/[instance_name]/startup ++++++++++++++++++++++++++++++++++++ :: /2/instances/[instance_name]/startup resource. Implements an instance startup. It supports the following commands: PUT. PUT ~~~ :: Startup an instance. The URI takes force=[False|True] parameter to start the instance if even if secondary disks are failing. /2/instances/[instance_name]/tags +++++++++++++++++++++++++++++++++ :: /2/instances/[instance_name]/tags resource. Manages per-instance tags. It supports the following commands: GET, PUT, DELETE. GET ~~~ :: Returns a list of tags. Example: ["tag1", "tag2", "tag3"] PUT ~~~ :: Add a set of tags. The request as a list of strings should be PUT to this URI. And you'll have back a job id. DELETE ~~~~~~ :: Delete a tag. In order to delete a set of tags, the DELETE request should be addressed to URI like: /tags?tag=[tag]&tag=[tag] /2/jobs +++++++ :: /2/jobs resource. It supports the following commands: GET. GET ~~~ :: Returns a dictionary of jobs. Returns: a dictionary with jobs id and uri. /2/jobs/[job_id] ++++++++++++++++ :: /2/jobs/[job_id] resource. It supports the following commands: GET, DELETE. GET ~~~ :: Returns a job status. Returns: a dictionary with job parameters. The result includes: - id: job ID as a number - status: current job status as a string - ops: involved OpCodes as a list of dictionaries for each opcodes in the job - opstatus: OpCodes status as a list - opresult: OpCodes results as a list of lists DELETE ~~~~~~ :: Cancel not-yet-started job. /2/nodes ++++++++ :: /2/nodes resource. It supports the following commands: GET. GET ~~~ :: Returns a list of all nodes. Example:: [ { "id": "node1.example.com", "uri": "\/instances\/node1.example.com" }, { "id": "node2.example.com", "uri": "\/instances\/node2.example.com" } ] If the optional 'bulk' argument is provided and set to 'true' value (i.e '?bulk=1'), the output contains detailed information about nodes as a list. Example:: [ { "pinst_cnt": 1, "mfree": 31280, "mtotal": 32763, "name": "www.example.com", "tags": [], "mnode": 512, "dtotal": 5246208, "sinst_cnt": 2, "dfree": 5171712, "offline": false }, ... ] Returns: a dictionary with 'name' and 'uri' keys for each of them /2/nodes/[node_name]/tags +++++++++++++++++++++++++ :: /2/nodes/[node_name]/tags resource. Manages per-node tags. It supports the following commands: GET, PUT, DELETE. GET ~~~ :: Returns a list of tags. Example: ["tag1", "tag2", "tag3"] PUT ~~~ :: Add a set of tags. The request as a list of strings should be PUT to this URI. And you'll have back a job id. DELETE ~~~~~~ :: Delete a tag. In order to delete a set of tags, the DELETE request should be addressed to URI like: /tags?tag=[tag]&tag=[tag] /2/os +++++ :: /2/os resource. It supports the following commands: GET. GET ~~~ :: Return a list of all OSes. Can return error 500 in case of a problem. Example: ["debian-etch"] /2/tags +++++++ :: /2/instances/tags resource. Manages cluster tags. It supports the following commands: GET, PUT, DELETE. GET ~~~ :: Returns a list of tags. Example: ["tag1", "tag2", "tag3"] PUT ~~~ :: Add a set of tags. The request as a list of strings should be PUT to this URI. And you'll have back a job id. DELETE ~~~~~~ :: Delete a tag. In order to delete a set of tags, the DELETE request should be addressed to URI like: /tags?tag=[tag]&tag=[tag] /nodes/[node_name] ++++++++++++++++++ :: /2/nodes/[node_name] resources. It supports the following commands: GET. GET ~~~ :: Send information about a node. /version ++++++++ :: /version resource. This resource should be used to determine the remote API version and to adapt clients accordingly. It supports the following commands: GET. GET ~~~ :: Returns the remote API version.