Remove utils.FormatTimestampWithTZ
[ganeti-local] / doc / rapi.rst
index ed4a70f..0226089 100644 (file)
@@ -21,8 +21,8 @@ Users and passwords
 -------------------
 
 ``ganeti-rapi`` reads users and passwords from a file (usually
-``/var/lib/ganeti/rapi_users``) on startup. After modifying the password
-file, ``ganeti-rapi`` must be restarted.
+``/var/lib/ganeti/rapi/users``) on startup. Changes to the file will be
+read automatically.
 
 Each line consists of two or three fields separated by whitespace. The
 first two fields are for username and password. The third field is
@@ -53,7 +53,7 @@ Example::
 
 
 .. [#pwhash] Using the MD5 hash of username, realm and password is
-   described in RFC2617_ ("HTTP Authentication"), sections 3.2.2.2 and
+   described in :rfc:`2617` ("HTTP Authentication"), sections 3.2.2.2 and
    3.3. The reason for using it over another algorithm is forward
    compatibility. If ``ganeti-rapi`` were to implement HTTP Digest
    authentication in the future, the same hash could be used.
@@ -65,11 +65,70 @@ Protocol
 --------
 
 The protocol used is JSON_ over HTTP designed after the REST_ principle.
-HTTP Basic authentication as per RFC2617_ is supported.
+HTTP Basic authentication as per :rfc:`2617` is supported.
 
 .. _JSON: http://www.json.org/
 .. _REST: http://en.wikipedia.org/wiki/Representational_State_Transfer
-.. _RFC2617: http://tools.ietf.org/rfc/rfc2617.txt
+
+
+A note on JSON as used by RAPI
+++++++++++++++++++++++++++++++
+
+JSON_ as used by Ganeti RAPI does not conform to the specification in
+:rfc:`4627`. Section 2 defines a JSON text to be either an object
+(``{"key": "value", …}``) or an array (``[1, 2, 3, …]``). In violation
+of this RAPI uses plain strings (``"master-candidate"``, ``"1234"``) for
+some requests or responses. Changing this now would likely break
+existing clients and cause a lot of trouble.
+
+.. highlight:: ruby
+
+Unlike Python's `JSON encoder and decoder
+<http://docs.python.org/library/json.html>`_, other programming
+languages or libraries may only provide a strict implementation, not
+allowing plain values. For those, responses can usually be wrapped in an
+array whose first element is then used, e.g. the response ``"1234"``
+becomes ``["1234"]``. This works equally well for more complex values.
+Example in Ruby::
+
+  require "json"
+
+  # Insert code to get response here
+  response = "\"1234\""
+
+  decoded = JSON.parse("[#{response}]").first
+
+Short of modifying the encoder to allow encoding to a less strict
+format, requests will have to be formatted by hand. Newer RAPI requests
+already use a dictionary as their input data and shouldn't cause any
+problems.
+
+
+PUT or POST?
+------------
+
+According to :rfc:`2616` the main difference between PUT and POST is
+that POST can create new resources but PUT can only create the resource
+the URI was pointing to on the PUT request.
+
+Unfortunately, due to historic reasons, the Ganeti RAPI library is not
+consistent with this usage, so just use the methods as documented below
+for each resource.
+
+For more details have a look in the source code at
+``lib/rapi/rlib2.py``.
+
+
+Generic parameter types
+-----------------------
+
+A few generic refered parameter types and the values they allow.
+
+``bool``
+++++++++
+
+A boolean option will accept ``1`` or ``0`` as numbers but not
+i.e. ``True`` or ``False``.
 
 Generic parameters
 ------------------
@@ -89,9 +148,9 @@ themselves.
 ``dry-run``
 +++++++++++
 
-The optional *dry-run* argument, if provided and set to a positive
-integer value (e.g. ``?dry-run=1``), signals to Ganeti that the job
-should not be executed, only the pre-execution checks will be done.
+The boolean *dry-run* argument, if provided and set, signals to Ganeti
+that the job should not be executed, only the pre-execution checks will
+be done.
 
 This is useful in trying to determine (without guarantees though, as in
 the meantime the cluster state could have changed) if the operation is
@@ -109,6 +168,11 @@ Usage examples
 You can access the API using your favorite programming language as long
 as it supports network connections.
 
+Ganeti RAPI client
+++++++++++++++++++
+
+Ganeti includes a standalone RAPI client, ``lib/rapi/client.py``.
+
 Shell
 +++++
 
@@ -253,6 +317,145 @@ It supports the following commands: ``PUT``.
 Redistribute configuration to all nodes. The result will be a job id.
 
 
+``/2/features``
++++++++++++++++
+
+``GET``
+~~~~~~~
+
+Returns a list of features supported by the RAPI server. Available
+features:
+
+``instance-create-reqv1``
+  Instance creation request data version 1 supported.
+``instance-reinstall-reqv1``
+  Instance reinstall supports body parameters.
+
+
+``/2/groups``
++++++++++++++
+
+The groups resource.
+
+It supports the following commands: ``GET``, ``POST``.
+
+``GET``
+~~~~~~~
+
+Returns a list of all existing node groups.
+
+Example::
+
+    [
+      {
+        "name": "group1",
+        "uri": "\/2\/groups\/group1"
+      },
+      {
+        "name": "group2",
+        "uri": "\/2\/groups\/group2"
+      }
+    ]
+
+If the optional bool *bulk* argument is provided and set to a true value
+(i.e ``?bulk=1``), the output contains detailed information about node
+groups as a list.
+
+Example::
+
+    [
+      {
+        "name": "group1",
+        "node_cnt": 2,
+        "node_list": [
+          "node1.example.com",
+          "node2.example.com"
+        ],
+        "uuid": "0d7d407c-262e-49af-881a-6a430034bf43"
+      },
+      {
+        "name": "group2",
+        "node_cnt": 1,
+        "node_list": [
+          "node3.example.com"
+        ],
+        "uuid": "f5a277e7-68f9-44d3-a378-4b25ecb5df5c"
+      }
+    ]
+
+``POST``
+~~~~~~~~
+
+Creates a node group.
+
+If the optional bool *dry-run* argument is provided, the job will not be
+actually executed, only the pre-execution checks will be done.
+
+Returns: a job ID that can be used later for polling.
+
+Body parameters:
+
+``name`` (string, required)
+  Node group name.
+
+
+``/2/groups/[group_name]``
+++++++++++++++++++++++++++
+
+Returns information about a node group.
+
+It supports the following commands: ``GET``, ``DELETE``.
+
+``GET``
+~~~~~~~
+
+Returns information about a node group, similar to the bulk output from
+the node group list.
+
+``DELETE``
+~~~~~~~~~~
+
+Deletes a node group.
+
+It supports the ``dry-run`` argument.
+
+
+``/2/groups/[group_name]/modify``
++++++++++++++++++++++++++++++++++
+
+Modifies the parameters of a node group.
+
+Supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``alloc_policy`` (string)
+  If present, the new allocation policy for the node group.
+
+
+``/2/groups/[group_name]/rename``
++++++++++++++++++++++++++++++++++
+
+Renames a node group.
+
+Supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``new_name`` (string, required)
+  New node group name.
+
+
 ``/2/instances``
 ++++++++++++++++
 
@@ -278,9 +481,9 @@ Example::
       }
     ]
 
-If the optional *bulk* argument is provided and set to a true value (i.e
-``?bulk=1``), the output contains detailed information about instances
-as a list.
+If the optional bool *bulk* argument is provided and set to a true value
+(i.e ``?bulk=1``), the output contains detailed information about
+instances as a list.
 
 Example::
 
@@ -317,14 +520,77 @@ Example::
 
 Creates an instance.
 
-If the optional *dry-run* argument is provided and set to a positive
-integer valu (e.g. ``?dry-run=1``), the job will not be actually
-executed, only the pre-execution checks will be done. Query-ing the job
-result will return, in both dry-run and normal case, the list of nodes
-selected for the instance.
+If the optional bool *dry-run* argument is provided, the job will not be
+actually executed, only the pre-execution checks will be done. Query-ing
+the job result will return, in both dry-run and normal case, the list of
+nodes selected for the instance.
 
 Returns: a job ID that can be used later for polling.
 
+Body parameters:
+
+``__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).
+``mode`` (string, required)
+  Instance creation mode.
+``name`` (string, required)
+  Instance name.
+``disk_template`` (string, required)
+  Disk template for instance.
+``disks`` (list, required)
+  List of disk definitions. Example: ``[{"size": 100}, {"size": 5}]``.
+  Each disk definition must contain a ``size`` value and can contain an
+  optional ``mode`` value denoting the disk access mode (``ro`` or
+  ``rw``).
+``nics`` (list, required)
+  List of NIC (network interface) definitions. Example: ``[{}, {},
+  {"ip": "198.51.100.4"}]``. Each NIC definition can contain the
+  optional values ``ip``, ``mode``, ``link`` and ``bridge``.
+``os`` (string, required)
+  Instance operating system.
+``osparams`` (dictionary)
+  Dictionary with OS parameters. If not valid for the given OS, the job
+  will fail.
+``force_variant`` (bool)
+  Whether to force an unknown variant.
+``no_install`` (bool)
+  Do not install the OS (will enable no-start)
+``pnode`` (string)
+  Primary node.
+``snode`` (string)
+  Secondary node.
+``src_node`` (string)
+  Source node for import.
+``src_path`` (string)
+  Source directory for import.
+``start`` (bool)
+  Whether to start instance after creation.
+``ip_check`` (bool)
+  Whether to ensure instance's IP address is inactive.
+``name_check`` (bool)
+  Whether to ensure instance's name is resolvable.
+``file_storage_dir`` (string)
+  File storage directory.
+``file_driver`` (string)
+  File storage driver.
+``iallocator`` (string)
+  Instance allocator name.
+``source_handshake`` (list)
+  Signed handshake from source (remote import only).
+``source_x509_ca`` (string)
+  Source X509 CA in PEM format (remote import only).
+``source_instance_name`` (string)
+  Source instance name (remote import only).
+``hypervisor`` (string)
+  Hypervisor name.
+``hvparams`` (dict)
+  Hypervisor parameters, hypervisor-dependent.
+``beparams`` (dict)
+  Backend parameters.
+
+
 ``/2/instances/[instance_name]``
 ++++++++++++++++++++++++++++++++
 
@@ -372,8 +638,18 @@ It supports the following commands: ``POST``.
 
 Reboots the instance.
 
-The URI takes optional ``type=hard|soft|full`` and
-``ignore_secondaries=False|True`` parameters.
+The URI takes optional ``type=soft|hard|full`` and
+``ignore_secondaries=0|1`` parameters.
+
+``type`` defines the reboot type. ``soft`` is just a normal reboot,
+without terminating the hypervisor. ``hard`` means full shutdown
+(including terminating the hypervisor process) and startup again.
+``full`` is like ``hard`` but also recreates the configuration from
+ground up as if you would have done a ``gnt-instance shutdown`` and
+``gnt-instance start`` on it.
+
+``ignore_secondaries`` is a bool argument indicating if we start the
+instance even if secondary disks are failing.
 
 It supports the ``dry-run`` argument.
 
@@ -405,8 +681,8 @@ It supports the following commands: ``PUT``.
 
 Startup an instance.
 
-The URI takes an optional ``force=False|True`` parameter to start the
-instance if even if secondary disks are failing.
+The URI takes an optional ``force=1|0`` parameter to start the
+instance even if secondary disks are failing.
 
 It supports the ``dry-run`` argument.
 
@@ -420,7 +696,20 @@ It supports the following commands: ``POST``.
 ``POST``
 ~~~~~~~~
 
-Takes the parameters ``os`` (OS template name) and ``nostartup`` (bool).
+Returns a job ID.
+
+Body parameters:
+
+``os`` (string, required)
+  Instance operating system.
+``start`` (bool, defaults to true)
+  Whether to start instance after reinstallation.
+``osparams`` (dict)
+  Dictionary with (temporary) OS parameters.
+
+For backwards compatbility, this resource also takes the query
+parameters ``os`` (OS template name) and ``nostartup`` (bool). New
+clients should use the body parameters.
 
 
 ``/2/instances/[instance_name]/replace-disks``
@@ -438,6 +727,161 @@ Takes the parameters ``mode`` (one of ``replace_on_primary``,
 ``replace_auto``), ``disks`` (comma separated list of disk indexes),
 ``remote_node`` and ``iallocator``.
 
+Either ``remote_node`` or ``iallocator`` needs to be defined when using
+``mode=replace_new_secondary``.
+
+``mode`` is a mandatory parameter. ``replace_auto`` tries to determine
+the broken disk(s) on its own and replacing it.
+
+
+``/2/instances/[instance_name]/activate-disks``
++++++++++++++++++++++++++++++++++++++++++++++++
+
+Activate disks on an instance.
+
+It supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Takes the bool parameter ``ignore_size``. When set ignore the recorded
+size (useful for forcing activation when recorded size is wrong).
+
+
+``/2/instances/[instance_name]/deactivate-disks``
++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Deactivate disks on an instance.
+
+It supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Takes no parameters.
+
+
+``/2/instances/[instance_name]/prepare-export``
++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Prepares an export of an instance.
+
+It supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Takes one parameter, ``mode``, for the export mode. Returns a job ID.
+
+
+``/2/instances/[instance_name]/export``
++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Exports an instance.
+
+It supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``mode`` (string)
+  Export mode.
+``destination`` (required)
+  Destination information, depends on export mode.
+``shutdown`` (bool, required)
+  Whether to shutdown instance before export.
+``remove_instance`` (bool)
+  Whether to remove instance after export.
+``x509_key_name``
+  Name of X509 key (remote export only).
+``destination_x509_ca``
+  Destination X509 CA (remote export only).
+
+
+``/2/instances/[instance_name]/migrate``
+++++++++++++++++++++++++++++++++++++++++
+
+Migrates an instance.
+
+Supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``mode`` (string)
+  Migration mode.
+``cleanup`` (bool)
+  Whether a previously failed migration should be cleaned up.
+
+
+``/2/instances/[instance_name]/rename``
+++++++++++++++++++++++++++++++++++++++++
+
+Renames an instance.
+
+Supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``new_name`` (string, required)
+  New instance name.
+``ip_check`` (bool)
+  Whether to ensure instance's IP address is inactive.
+``name_check`` (bool)
+  Whether to ensure instance's name is resolvable.
+
+
+``/2/instances/[instance_name]/modify``
+++++++++++++++++++++++++++++++++++++++++
+
+Modifies an instance.
+
+Supports the following commands: ``PUT``.
+
+``PUT``
+~~~~~~~
+
+Returns a job ID.
+
+Body parameters:
+
+``osparams`` (dict)
+  Dictionary with OS parameters.
+``hvparams`` (dict)
+  Hypervisor parameters, hypervisor-dependent.
+``beparams`` (dict)
+  Backend parameters.
+``force`` (bool)
+  Whether to force the operation.
+``nics`` (list)
+  List of NIC changes. Each item is of the form ``(op, settings)``.
+  ``op`` can be ``add`` to add a new NIC with the specified settings,
+  ``remove`` to remove the last NIC or a number to modify the settings
+  of the NIC with that index.
+``disks`` (list)
+  List of disk changes. See ``nics``.
+``disk_template`` (string)
+  Disk template for instance.
+``remote_node`` (string)
+  Secondary node (used when changing disk template).
+``os_name`` (string)
+  Change instance's OS name. Does not reinstall the instance.
+``force_variant`` (bool)
+  Whether to force an unknown variant.
+
 
 ``/2/instances/[instance_name]/tags``
 +++++++++++++++++++++++++++++++++++++
@@ -582,6 +1026,30 @@ while by a resource we refer to an instance's disk, or NIC, etc.
 
 Cancel a not-yet-started job.
 
+
+``/2/jobs/[job_id]/wait``
++++++++++++++++++++++++++
+
+``GET``
+~~~~~~~
+
+Waits for changes on a job. Takes the following body parameters in a
+dict:
+
+``fields``
+  The job fields on which to watch for changes.
+
+``previous_job_info``
+  Previously received field values or None if not yet available.
+
+``previous_log_serial``
+  Highest log serial number received so far or None if not yet
+  available.
+
+Returns None if no changes have been detected and a dict with two keys,
+``job_info`` and ``log_entries`` otherwise.
+
+
 ``/2/nodes``
 ++++++++++++
 
@@ -647,11 +1115,26 @@ It supports the following commands: ``POST``.
 ~~~~~~~~
 
 To evacuate a node, either one of the ``iallocator`` or ``remote_node``
-parameters must be passed:
+parameters must be passed::
 
     evacuate?iallocator=[iallocator]
     evacuate?remote_node=[nodeX.example.com]
 
+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).
+
+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.
+
+If the dry-run parameter was specified, then the evacuation jobs were
+not actually submitted, and the job IDs will be null.
+
+
 ``/2/nodes/[node_name]/migrate``
 +++++++++++++++++++++++++++++++++
 
@@ -662,9 +1145,15 @@ It supports the following commands: ``POST``.
 ``POST``
 ~~~~~~~~
 
-No parameters are required, but ``live`` can be set to a boolean value.
+If no mode is explicitly specified, each instances' hypervisor default
+migration mode will be used. Query parameters:
+
+``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.
 
-    migrate?live=[0|1]
 
 ``/2/nodes/[node_name]/role``
 +++++++++++++++++++++++++++++
@@ -698,7 +1187,7 @@ Change the node role.
 The request is a string which should be PUT to this URI. The result will
 be a job id.
 
-It supports the ``force`` argument.
+It supports the bool ``force`` argument.
 
 ``/2/nodes/[node_name]/storage``
 ++++++++++++++++++++++++++++++++