.. _JSON: http://www.json.org/
.. _REST: http://en.wikipedia.org/wiki/Representational_State_Transfer
+HTTP requests with a body (e.g. ``PUT`` or ``POST``) require the request
+header ``Content-type`` be set to ``application/json`` (see :rfc:`2616`
+(HTTP/1.1), section 7.2.1).
+
A note on JSON as used by RAPI
++++++++++++++++++++++++++++++
Returns a list of features supported by the RAPI server. Available
features:
-``instance-create-reqv1``
+.. pyassert::
+
+ rlib2.ALL_FEATURES == set([rlib2._INST_CREATE_REQV1,
+ rlib2._INST_REINSTALL_REQV1,
+ rlib2._NODE_MIGRATE_REQV1,
+ rlib2._NODE_EVAC_RES1])
+
+:pyeval:`rlib2._INST_CREATE_REQV1`
Instance creation request data version 1 supported.
-``instance-reinstall-reqv1``
+:pyeval:`rlib2._INST_REINSTALL_REQV1`
Instance reinstall supports body parameters.
+:pyeval:`rlib2._NODE_MIGRATE_REQV1`
+ Whether migrating a node (``/2/nodes/[node_name]/migrate``) supports
+ request body parameters.
+:pyeval:`rlib2._NODE_EVAC_RES1`
+ Whether evacuating a node (``/2/nodes/[node_name]/evacuate``) returns
+ a new-style result (see resource description)
``/2/modify``
:exclude: group_name, force, dry_run
+``/2/groups/[group_name]/tags``
++++++++++++++++++++++++++++++++
+
+Manages per-nodegroup tags.
+
+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. The
+result will be a job id.
+
+It supports the ``dry-run`` argument.
+
+
+``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]
+
+It supports the ``dry-run`` argument.
+
+
``/2/instances``
++++++++++++++++
``__version__`` (int, required)
Must be ``1`` (older Ganeti versions used a different format for
- instance creation requests, version ``0``, but that format is not
- documented and should no longer be used).
+ instance creation requests, version ``0``, but that format is no
+ longer supported)
.. opcode_params:: OP_INSTANCE_CREATE
It supports the ``dry-run`` argument.
+.. opcode_params:: OP_INSTANCE_SHUTDOWN
+ :exclude: instance_name, dry_run
+
``/2/instances/[instance_name]/startup``
++++++++++++++++++++++++++++++++++++++++
:exclude: instance_name
+``/2/instances/[instance_name]/console``
+++++++++++++++++++++++++++++++++++++++++
+
+Request information for connecting to instance's console.
+
+Supports the following commands: ``GET``.
+
+``GET``
+~~~~~~~
+
+Returns a dictionary containing information about the instance's
+console. Contained keys:
+
+``instance``
+ Instance name.
+``kind``
+ Console type, one of ``ssh``, ``vnc`` or ``msg``.
+``message``
+ Message to display (``msg`` type only).
+``host``
+ Host to connect to (``ssh`` and ``vnc`` only).
+``port``
+ TCP port to connect to (``vnc`` only).
+``user``
+ Username to use (``ssh`` only).
+``command``
+ Command to execute on machine (``ssh`` only)
+``display``
+ VNC display number (``vnc`` only).
+
+
``/2/instances/[instance_name]/tags``
+++++++++++++++++++++++++++++++++++++
effects. But whether it make sense to retry depends on the error
classification:
-``resolver_error``
+.. pyassert::
+
+ errors.ECODE_ALL == set([errors.ECODE_RESOLVER, errors.ECODE_NORES,
+ errors.ECODE_INVAL, errors.ECODE_STATE, errors.ECODE_NOENT,
+ errors.ECODE_EXISTS, errors.ECODE_NOTUNIQUE, errors.ECODE_FAULT,
+ errors.ECODE_ENVIRON])
+
+:pyeval:`errors.ECODE_RESOLVER`
Resolver errors. This usually means that a name doesn't exist in DNS,
so if it's a case of slow DNS propagation the operation can be retried
later.
-``insufficient_resources``
+:pyeval:`errors.ECODE_NORES`
Not enough resources (iallocator failure, disk space, memory,
etc.). If the resources on the cluster increase, the operation might
succeed.
-``wrong_input``
+:pyeval:`errors.ECODE_INVAL`
Wrong arguments (at syntax level). The operation will not ever be
accepted unless the arguments change.
-``wrong_state``
+:pyeval:`errors.ECODE_STATE`
Wrong entity state. For example, live migration has been requested for
a down instance, or instance creation on an offline node. The
operation can be retried once the resource has changed state.
-``unknown_entity``
+:pyeval:`errors.ECODE_NOENT`
Entity not found. For example, information has been requested for an
unknown instance.
-``already_exists``
+:pyeval:`errors.ECODE_EXISTS`
Entity already exists. For example, instance creation has been
requested for an already-existing instance.
-``resource_not_unique``
+:pyeval:`errors.ECODE_NOTUNIQUE`
Resource not unique (e.g. MAC or IP duplication).
-``internal_error``
+:pyeval:`errors.ECODE_FAULT`
Internal cluster error. For example, a node is unreachable but not set
offline, or the ganeti node daemons are not working, etc. A
``gnt-cluster verify`` should be run.
-``environment_error``
+:pyeval:`errors.ECODE_ENVIRON`
Environment error (e.g. node disk error). A ``gnt-cluster verify``
should be run.
``/2/nodes/[node_name]/evacuate``
+++++++++++++++++++++++++++++++++
-Evacuates all secondary instances off a node.
+Evacuates instances off a node.
It supports the following commands: ``POST``.
``POST``
~~~~~~~~
-To evacuate a node, either one of the ``iallocator`` or ``remote_node``
-parameters must be passed::
-
- evacuate?iallocator=[iallocator]
- evacuate?remote_node=[nodeX.example.com]
+Returns a job ID. The result of the job will contain the IDs of the
+individual jobs submitted to evacuate the node.
-The result value will be a list, each element being a triple of the job
-id (for this specific evacuation), the instance which is being evacuated
-by this job, and the node to which it is being relocated. In case the
-node is already empty, the result will be an empty list (without any
-jobs being submitted).
+Body parameters:
-And additional parameter ``early_release`` signifies whether to try to
-parallelize the evacuations, at the risk of increasing I/O contention
-and increasing the chances of data loss, if the primary node of any of
-the instances being evacuated is not fully healthy.
+.. opcode_params:: OP_NODE_EVACUATE
+ :exclude: nodes
-If the dry-run parameter was specified, then the evacuation jobs were
-not actually submitted, and the job IDs will be null.
+Up to and including Ganeti 2.4 query arguments were used. Those are no
+longer supported. The new request can be detected by the presence of the
+:pyeval:`rlib2._NODE_EVAC_RES1` feature string.
``/2/nodes/[node_name]/migrate``
~~~~~~~~
If no mode is explicitly specified, each instances' hypervisor default
-migration mode will be used. Query parameters:
+migration mode will be used. Body parameters:
+
+.. opcode_params:: OP_NODE_MIGRATE
+ :exclude: node_name
-``live`` (bool)
- If set, use live migration if available.
-``mode`` (string)
- Sets migration mode, ``live`` for live migration and ``non-live`` for
- non-live migration. Supported by Ganeti 2.2 and above.
+The query arguments used up to and including Ganeti 2.4 are deprecated
+and should no longer be used. The new request format can be detected by
+the presence of the :pyeval:`rlib2._NODE_MIGRATE_REQV1` feature string.
``/2/nodes/[node_name]/role``
The role is always one of the following:
- drained
- - master
- master-candidate
- offline
- regular
+Note that the 'master' role is a special, and currently it can't be
+modified via RAPI, only via the command line (``gnt-cluster
+master-failover``).
+
``GET``
~~~~~~~
``GET``
~~~~~~~
+.. pyassert::
+
+ constants.VALID_STORAGE_TYPES == set([constants.ST_FILE,
+ constants.ST_LVM_PV,
+ constants.ST_LVM_VG])
+
Requests a list of storage units on a node. Requires the parameters
-``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``) and
+``storage_type`` (one of :pyeval:`constants.ST_FILE`,
+:pyeval:`constants.ST_LVM_PV` or :pyeval:`constants.ST_LVM_VG`) and
``output_fields``. The result will be a job id, using which the result
can be retrieved.
~~~~~~~
Modifies parameters of storage units on the node. Requires the
-parameters ``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``)
+parameters ``storage_type`` (one of :pyeval:`constants.ST_FILE`,
+:pyeval:`constants.ST_LVM_PV` or :pyeval:`constants.ST_LVM_VG`)
and ``name`` (name of the storage unit). Parameters can be passed
-additionally. Currently only ``allocatable`` (bool) is supported. The
-result will be a job id.
+additionally. Currently only :pyeval:`constants.SF_ALLOCATABLE` (bool)
+is supported. The result will be a job id.
``/2/nodes/[node_name]/storage/repair``
+++++++++++++++++++++++++++++++++++++++
``PUT``
~~~~~~~
+.. pyassert::
+
+ constants.VALID_STORAGE_OPERATIONS == {
+ constants.ST_LVM_VG: set([constants.SO_FIX_CONSISTENCY]),
+ }
+
Repairs a storage unit on the node. Requires the parameters
-``storage_type`` (currently only ``lvm-vg`` can be repaired) and
-``name`` (name of the storage unit). The result will be a job id.
+``storage_type`` (currently only :pyeval:`constants.ST_LVM_VG` can be
+repaired) and ``name`` (name of the storage unit). The result will be a
+job id.
``/2/nodes/[node_name]/tags``
+++++++++++++++++++++++++++++
It supports the ``dry-run`` argument.
+``/2/query/[resource]``
++++++++++++++++++++++++
+
+Requests resource information. Available fields can be found in man
+pages and using ``/2/query/[resource]/fields``. The resource is one of
+:pyeval:`utils.CommaJoin(constants.QR_VIA_RAPI)`. See the :doc:`query2
+design document <design-query2>` for more details.
+
+Supports the following commands: ``GET``, ``PUT``.
+
+``GET``
+~~~~~~~
+
+Returns list of included fields and actual data. Takes a query parameter
+named "fields", containing a comma-separated list of field names. Does
+not support filtering.
+
+``PUT``
+~~~~~~~
+
+Returns list of included fields and actual data. The list of requested
+fields can either be given as the query parameter "fields" or as a body
+parameter with the same name. The optional body parameter "filter" can
+be given and must be either ``null`` or a list containing filter
+operators.
+
+
+``/2/query/[resource]/fields``
+++++++++++++++++++++++++++++++
+
+Request list of available fields for a resource. The resource is one of
+:pyeval:`utils.CommaJoin(constants.QR_VIA_RAPI)`. See the
+:doc:`query2 design document <design-query2>` for more details.
+
+Supports the following commands: ``GET``.
+
+``GET``
+~~~~~~~
+
+Returns a list of field descriptions for available fields. Takes an
+optional query parameter named "fields", containing a comma-separated
+list of field names.
+
+
``/2/os``
+++++++++