| Ganeti remote API |
| ================= |
| |
| Documents Ganeti version |version| |
| |
| .. 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. |
| |
| .. _rapi-users: |
| |
| Users and passwords |
| ------------------- |
| |
| ``ganeti-rapi`` reads users and passwords from a file (usually |
| ``/var/lib/ganeti/rapi/users``) on startup. Changes to the file will be |
| read automatically. |
| |
| Lines starting with the hash sign (``#``) are treated as comments. Each |
| line consists of two or three fields separated by whitespace. The first |
| two fields are for username and password. The third field is optional |
| and can be used to specify per-user options (separated by comma without |
| spaces). |
| |
| Passwords can either be written in clear text or as a hash. Clear text |
| passwords may not start with an opening brace (``{``) or they must be |
| prefixed with ``{cleartext}``. To use the hashed form, get the MD5 hash |
| of the string ``$username:Ganeti Remote API:$password`` (e.g. ``echo -n |
| 'jack:Ganeti Remote API:abc123' | openssl md5``) [#pwhash]_ and prefix |
| it with ``{ha1}``. Using the scheme prefix for all passwords is |
| recommended. Scheme prefixes are case insensitive. |
| |
| Options control a user's access permissions. The section |
| :ref:`rapi-access-permissions` lists the permissions required for each |
| resource. If the ``--require-authentication`` command line option is |
| given to the ``ganeti-rapi`` daemon, all requests require |
| authentication. Available options: |
| |
| .. pyassert:: |
| |
| rapi.RAPI_ACCESS_ALL == set([ |
| rapi.RAPI_ACCESS_WRITE, |
| rapi.RAPI_ACCESS_READ, |
| ]) |
| |
| .. pyassert:: |
| |
| rlib2.R_2_nodes_name_storage.GET_ACCESS == [rapi.RAPI_ACCESS_WRITE] |
| |
| .. pyassert:: |
| |
| rlib2.R_2_jobs_id_wait.GET_ACCESS == [rapi.RAPI_ACCESS_WRITE] |
| |
| :pyeval:`rapi.RAPI_ACCESS_WRITE` |
| Enables the user to execute operations modifying the cluster. Implies |
| :pyeval:`rapi.RAPI_ACCESS_READ` access. Resources blocking other |
| operations for read-only access, such as |
| :ref:`/2/nodes/[node_name]/storage <rapi-res-nodes-node_name-storage+get>` |
| or blocking server-side processes, such as |
| :ref:`/2/jobs/[job_id]/wait <rapi-res-jobs-job_id-wait+get>`, use |
| :pyeval:`rapi.RAPI_ACCESS_WRITE` to control access to their |
| :pyeval:`http.HTTP_GET` method. |
| :pyeval:`rapi.RAPI_ACCESS_READ` |
| Allow access to operations querying for information. |
| |
| Example:: |
| |
| # Give Jack and Fred read-only access |
| jack abc123 |
| fred {cleartext}foo555 |
| |
| # Give write access to an imaginary instance creation script |
| autocreator xyz789 write |
| |
| # Hashed password for Jessica |
| jessica {HA1}7046452df2cbb530877058712cf17bd4 write |
| |
| # Monitoring can query for values |
| monitoring {HA1}ec018ffe72b8e75bb4d508ed5b6d079c read |
| |
| # A user who can read and write (the former is implied by granting |
| # write access) |
| superuser {HA1}ec018ffe72b8e75bb4d508ed5b6d079c read,write |
| |
| When using the RAPI, username and password can be sent to the server |
| by using the standard HTTP basic access authentication. This means that |
| for accessing the protected URL ``https://cluster.example.com/resource``, |
| the address ``https://username:password@cluster.example.com/resource`` should |
| be used instead. |
| Alternatively, the appropriate parameter of your HTTP client |
| (such as ``-u`` for ``curl``) can be used. |
| |
| .. [#pwhash] Using the MD5 hash of username, realm and password is |
| 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. |
| In the current version ``ganeti-rapi``'s realm, ``Ganeti Remote |
| API``, can only be changed by modifying the source code. |
| |
| |
| Protocol |
| -------- |
| |
| The protocol used is JSON_ over HTTP designed after the REST_ principle. |
| HTTP Basic authentication as per :rfc:`2617` is supported. |
| |
| .. _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 |
| ++++++++++++++++++++++++++++++ |
| |
| 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 |
| ------------------ |
| |
| A few parameter mean the same thing across all resources which implement |
| it. |
| |
| ``bulk`` |
| ++++++++ |
| |
| Bulk-mode means that for the resources which usually return just a list |
| of child resources (e.g. ``/2/instances`` which returns just instance |
| names), the output will instead contain detailed data for all these |
| subresources. This is more efficient than query-ing the sub-resources |
| themselves. |
| |
| ``dry-run`` |
| +++++++++++ |
| |
| 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 |
| likely to succeed or at least start executing. |
| |
| ``force`` |
| +++++++++++ |
| |
| Force operation to continue even if it will cause the cluster to become |
| inconsistent (e.g. because there are not enough master candidates). |
| |
| Parameter details |
| ----------------- |
| |
| Some parameters are not straight forward, so we describe them in details |
| here. |
| |
| .. _rapi-ipolicy: |
| |
| ``ipolicy`` |
| +++++++++++ |
| |
| The instance policy specification is a dict with the following fields: |
| |
| .. pyassert:: |
| |
| constants.IPOLICY_ALL_KEYS == set([constants.ISPECS_MINMAX, |
| constants.ISPECS_STD, |
| constants.IPOLICY_DTS, |
| constants.IPOLICY_VCPU_RATIO, |
| constants.IPOLICY_SPINDLE_RATIO]) |
| |
| |
| .. pyassert:: |
| |
| (set(constants.ISPECS_PARAMETER_TYPES.keys()) == |
| set([constants.ISPEC_MEM_SIZE, |
| constants.ISPEC_DISK_SIZE, |
| constants.ISPEC_DISK_COUNT, |
| constants.ISPEC_CPU_COUNT, |
| constants.ISPEC_NIC_COUNT, |
| constants.ISPEC_SPINDLE_USE])) |
| |
| .. |ispec-min| replace:: :pyeval:`constants.ISPECS_MIN` |
| .. |ispec-max| replace:: :pyeval:`constants.ISPECS_MAX` |
| .. |ispec-std| replace:: :pyeval:`constants.ISPECS_STD` |
| |
| |
| :pyeval:`constants.ISPECS_MINMAX` |
| A list of dictionaries, each with the following two fields: |
| |
| |ispec-min|, |ispec-max| |
| A sub- `dict` with the following fields, which sets the limit of the |
| instances: |
| |
| :pyeval:`constants.ISPEC_MEM_SIZE` |
| The size in MiB of the memory used |
| :pyeval:`constants.ISPEC_DISK_SIZE` |
| The size in MiB of the disk used |
| :pyeval:`constants.ISPEC_DISK_COUNT` |
| The numbers of disks used |
| :pyeval:`constants.ISPEC_CPU_COUNT` |
| The numbers of cpus used |
| :pyeval:`constants.ISPEC_NIC_COUNT` |
| The numbers of nics used |
| :pyeval:`constants.ISPEC_SPINDLE_USE` |
| The numbers of virtual disk spindles used by this instance. They |
| are not real in the sense of actual HDD spindles, but useful for |
| accounting the spindle usage on the residing node |
| |ispec-std| |
| A sub- `dict` with the same fields as |ispec-min| and |ispec-max| above, |
| which sets the standard values of the instances. |
| :pyeval:`constants.IPOLICY_DTS` |
| A `list` of disk templates allowed for instances using this policy |
| :pyeval:`constants.IPOLICY_VCPU_RATIO` |
| Maximum ratio of virtual to physical CPUs (`float`) |
| :pyeval:`constants.IPOLICY_SPINDLE_RATIO` |
| Maximum ratio of instances to their node's ``spindle_count`` (`float`) |
| |
| 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 |
| +++++ |
| |
| .. highlight:: shell-example |
| |
| Using ``wget``:: |
| |
| $ wget -q -O - https://%CLUSTERNAME%:5080/2/info |
| |
| or ``curl``:: |
| |
| $ curl https://%CLUSTERNAME%:5080/2/info |
| |
| Note: with ``curl``, the request method (GET, POST, PUT) can be specified |
| using the ``-X`` command line option, and the username/password can be |
| specified with the ``-u`` option. In case of POST requests with a body, the |
| Content-Type can be set to JSON (as per the Protocol_ section) using the |
| parameter ``-H "Content-Type: application/json"``. |
| |
| Python |
| ++++++ |
| |
| .. highlight:: python |
| |
| :: |
| |
| import urllib2 |
| f = urllib2.urlopen('https://CLUSTERNAME:5080/2/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. |
| |
| .. highlight:: javascript |
| |
| :: |
| |
| var url = 'https://CLUSTERNAME:5080/2/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 |
| --------- |
| |
| .. highlight:: javascript |
| |
| ``/`` |
| +++++ |
| |
| The root resource. Has no function, but for legacy reasons the ``GET`` |
| method is supported. |
| |
| ``/2`` |
| ++++++ |
| |
| Has no function, but for legacy reasons the ``GET`` method is supported. |
| |
| .. _rapi-res-info: |
| |
| ``/2/info`` |
| +++++++++++ |
| |
| Cluster information resource. |
| |
| .. rapi_resource_details:: /2/info |
| |
| |
| .. _rapi-res-info+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 |
| } |
| }, |
| … |
| } |
| |
| |
| .. _rapi-res-redistribute-config: |
| |
| ``/2/redistribute-config`` |
| ++++++++++++++++++++++++++ |
| |
| Redistribute configuration to all nodes. |
| |
| .. rapi_resource_details:: /2/redistribute-config |
| |
| |
| .. _rapi-res-redistribute-config+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Redistribute configuration to all nodes. The result will be a job id. |
| |
| Job result: |
| |
| .. opcode_result:: OP_CLUSTER_REDIST_CONF |
| |
| |
| .. _rapi-res-features: |
| |
| ``/2/features`` |
| +++++++++++++++ |
| |
| .. rapi_resource_details:: /2/features |
| |
| |
| .. _rapi-res-features+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of features supported by the RAPI server. Available |
| features: |
| |
| .. 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 |
| :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) |
| |
| |
| .. _rapi-res-modify: |
| |
| ``/2/modify`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Modifies cluster parameters. |
| |
| .. rapi_resource_details:: /2/modify |
| |
| |
| .. _rapi-res-modify+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_CLUSTER_SET_PARAMS |
| |
| Job result: |
| |
| .. opcode_result:: OP_CLUSTER_SET_PARAMS |
| |
| |
| .. _rapi-res-groups: |
| |
| ``/2/groups`` |
| +++++++++++++ |
| |
| The groups resource. |
| |
| .. rapi_resource_details:: /2/groups |
| |
| |
| .. _rapi-res-groups+get: |
| |
| ``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. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.G_FIELDS))`. |
| |
| 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", |
| … |
| }, |
| … |
| ] |
| |
| |
| .. _rapi-res-groups+post: |
| |
| ``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: |
| |
| .. opcode_params:: OP_GROUP_ADD |
| |
| Earlier versions used a parameter named ``name`` which, while still |
| supported, has been renamed to ``group_name``. |
| |
| Job result: |
| |
| .. opcode_result:: OP_GROUP_ADD |
| |
| |
| .. _rapi-res-groups-group_name: |
| |
| ``/2/groups/[group_name]`` |
| ++++++++++++++++++++++++++ |
| |
| Returns information about a node group. |
| |
| .. rapi_resource_details:: /2/groups/[group_name] |
| |
| |
| .. _rapi-res-groups-group_name+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns information about a node group, similar to the bulk output from |
| the node group list. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.G_FIELDS))`. |
| |
| .. _rapi-res-groups-group_name+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Deletes a node group. |
| |
| It supports the ``dry-run`` argument. |
| |
| Job result: |
| |
| .. opcode_result:: OP_GROUP_REMOVE |
| |
| |
| .. _rapi-res-groups-group_name-modify: |
| |
| ``/2/groups/[group_name]/modify`` |
| +++++++++++++++++++++++++++++++++ |
| |
| Modifies the parameters of a node group. |
| |
| .. rapi_resource_details:: /2/groups/[group_name]/modify |
| |
| |
| .. _rapi-res-groups-group_name-modify+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_GROUP_SET_PARAMS |
| :exclude: group_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_GROUP_SET_PARAMS |
| |
| |
| .. _rapi-res-groups-group_name-rename: |
| |
| ``/2/groups/[group_name]/rename`` |
| +++++++++++++++++++++++++++++++++ |
| |
| Renames a node group. |
| |
| .. rapi_resource_details:: /2/groups/[group_name]/rename |
| |
| |
| .. _rapi-res-groups-group_name-rename+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_GROUP_RENAME |
| :exclude: group_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_GROUP_RENAME |
| |
| |
| .. _rapi-res-groups-group_name-assign-nodes: |
| |
| ``/2/groups/[group_name]/assign-nodes`` |
| +++++++++++++++++++++++++++++++++++++++ |
| |
| Assigns nodes to a group. |
| |
| .. rapi_resource_details:: /2/groups/[group_name]/assign-nodes |
| |
| .. _rapi-res-groups-group_name-assign-nodes+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. It supports the ``dry-run`` and ``force`` arguments. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_GROUP_ASSIGN_NODES |
| :exclude: group_name, force, dry_run |
| |
| Job result: |
| |
| .. opcode_result:: OP_GROUP_ASSIGN_NODES |
| |
| .. _rapi-res-groups-group_name-tags: |
| |
| ``/2/groups/[group_name]/tags`` |
| +++++++++++++++++++++++++++++++ |
| |
| Manages per-nodegroup tags. |
| |
| .. rapi_resource_details:: /2/groups/[group_name]/tags |
| |
| |
| .. _rapi-res-groups-group_name-tags+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of tags. |
| |
| Example:: |
| |
| ["tag1", "tag2", "tag3"] |
| |
| .. _rapi-res-groups-group_name-tags+put: |
| |
| ``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. |
| |
| |
| .. _rapi-res-groups-group_name-tags+delete: |
| |
| ``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. |
| |
| |
| .. _rapi-res-networks: |
| |
| ``/2/networks`` |
| +++++++++++++++ |
| |
| The networks resource. |
| |
| .. rapi_resource_details:: /2/networks |
| |
| |
| .. _rapi-res-networks+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of all existing networks. |
| |
| Example:: |
| |
| [ |
| { |
| "name": "network1", |
| "uri": "\/2\/networks\/network1" |
| }, |
| { |
| "name": "network2", |
| "uri": "\/2\/networks\/network2" |
| } |
| ] |
| |
| If the optional bool *bulk* argument is provided and set to a true value |
| (i.e ``?bulk=1``), the output contains detailed information about networks |
| as a list. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.NET_FIELDS))`. |
| |
| Example:: |
| |
| [ |
| { |
| 'external_reservations': '10.0.0.0, 10.0.0.1, 10.0.0.15', |
| 'free_count': 13, |
| 'gateway': '10.0.0.1', |
| 'gateway6': None, |
| 'group_list': ['default(bridged, prv0)'], |
| 'inst_list': [], |
| 'mac_prefix': None, |
| 'map': 'XX.............X', |
| 'name': 'nat', |
| 'network': '10.0.0.0/28', |
| 'network6': None, |
| 'reserved_count': 3, |
| 'tags': ['nfdhcpd'], |
| … |
| }, |
| … |
| ] |
| |
| |
| .. _rapi-res-networks+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Creates a network. |
| |
| 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: |
| |
| .. opcode_params:: OP_NETWORK_ADD |
| |
| Job result: |
| |
| .. opcode_result:: OP_NETWORK_ADD |
| |
| |
| .. _rapi-res-networks-network_name: |
| |
| ``/2/networks/[network_name]`` |
| ++++++++++++++++++++++++++++++ |
| |
| Returns information about a network. |
| |
| .. rapi_resource_details:: /2/networks/[network_name] |
| |
| |
| .. _rapi-res-networks-network_name+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns information about a network, similar to the bulk output from |
| the network list. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.NET_FIELDS))`. |
| |
| |
| .. _rapi-res-networks-network_name+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Deletes a network. |
| |
| It supports the ``dry-run`` argument. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NETWORK_REMOVE |
| |
| |
| .. _rapi-res-networks-network_name-modify: |
| |
| ``/2/networks/[network_name]/modify`` |
| +++++++++++++++++++++++++++++++++++++ |
| |
| Modifies the parameters of a network. |
| |
| .. rapi_resource_details:: /2/networks/[network_name]/modify |
| |
| |
| .. _rapi-res-networks-network_name-modify+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_NETWORK_SET_PARAMS |
| |
| Job result: |
| |
| .. opcode_result:: OP_NETWORK_SET_PARAMS |
| |
| |
| .. _rapi-res-networks-network_name-connect: |
| |
| ``/2/networks/[network_name]/connect`` |
| ++++++++++++++++++++++++++++++++++++++ |
| |
| Connects a network to a nodegroup. |
| |
| .. rapi_resource_details:: /2/networks/[network_name]/connect |
| |
| |
| .. _rapi-res-networks-network_name-connect+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. It supports the ``dry-run`` arguments. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_NETWORK_CONNECT |
| |
| Job result: |
| |
| .. opcode_result:: OP_NETWORK_CONNECT |
| |
| |
| .. _rapi-res-networks-network_name-disconnect: |
| |
| ``/2/networks/[network_name]/disconnect`` |
| +++++++++++++++++++++++++++++++++++++++++ |
| |
| Disonnects a network from a nodegroup. |
| |
| .. rapi_resource_details:: /2/networks/[network_name]/disconnect |
| |
| |
| .. _rapi-res-networks-network_name-disconnect+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. It supports the ``dry-run`` arguments. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_NETWORK_DISCONNECT |
| |
| Job result: |
| |
| .. opcode_result:: OP_NETWORK_DISCONNECT |
| |
| |
| .. _rapi-res-networks-network_name-tags: |
| |
| ``/2/networks/[network_name]/tags`` |
| +++++++++++++++++++++++++++++++++++ |
| |
| Manages per-network tags. |
| |
| .. rapi_resource_details:: /2/networks/[network_name]/tags |
| |
| |
| .. _rapi-res-networks-network_name-tags+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of tags. |
| |
| Example:: |
| |
| ["tag1", "tag2", "tag3"] |
| |
| |
| .. _rapi-res-networks-network_name-tags+put: |
| |
| ``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. |
| |
| |
| .. _rapi-res-networks-network_name-tags+delete: |
| |
| ``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. |
| |
| |
| .. _rapi-res-instances-multi-alloc: |
| |
| ``/2/instances-multi-alloc`` |
| ++++++++++++++++++++++++++++ |
| |
| Tries to allocate multiple instances. |
| |
| .. rapi_resource_details:: /2/instances-multi-alloc |
| |
| |
| .. _rapi-res-instances-multi-alloc+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| The parameters: |
| |
| .. opcode_params:: OP_INSTANCE_MULTI_ALLOC |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_MULTI_ALLOC |
| |
| |
| .. _rapi-res-instances: |
| |
| ``/2/instances`` |
| ++++++++++++++++ |
| |
| The instances resource. |
| |
| .. rapi_resource_details:: /2/instances |
| |
| |
| .. _rapi-res-instances+get: |
| |
| ``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 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. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.I_FIELDS))`. |
| |
| 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, |
| … |
| }, |
| … |
| ] |
| |
| |
| .. _rapi-res-instances+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Creates an 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 no |
| longer supported) |
| |
| .. opcode_params:: OP_INSTANCE_CREATE |
| |
| Earlier versions used parameters named ``name`` and ``os``. These have |
| been replaced by ``instance_name`` and ``os_type`` to match the |
| underlying opcode. The old names can still be used. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_CREATE |
| |
| |
| .. _rapi-res-instances-instance_name: |
| |
| ``/2/instances/[instance_name]`` |
| ++++++++++++++++++++++++++++++++ |
| |
| Instance-specific resource. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name] |
| |
| |
| .. _rapi-res-instances-instance_name+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns information about an instance, similar to the bulk output from |
| the instance list. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.I_FIELDS))`. |
| |
| |
| .. _rapi-res-instances-instance_name+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Deletes an instance. |
| |
| It supports the ``dry-run`` argument. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_REMOVE |
| |
| |
| .. _rapi-res-instances-instance_name-info: |
| |
| ``/2/instances/[instance_name]/info`` |
| +++++++++++++++++++++++++++++++++++++++ |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/info |
| |
| |
| .. _rapi-res-instances-instance_name-info+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Requests detailed information about the instance. An optional parameter, |
| ``static`` (bool), can be set to return only static information from the |
| configuration without querying the instance's nodes. The result will be |
| a job id. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_QUERY_DATA |
| |
| |
| .. _rapi-res-instances-instance_name-reboot: |
| |
| ``/2/instances/[instance_name]/reboot`` |
| +++++++++++++++++++++++++++++++++++++++ |
| |
| Reboots URI for an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/reboot |
| |
| |
| .. _rapi-res-instances-instance_name-reboot+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Reboots the instance. |
| |
| 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. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_REBOOT |
| |
| |
| .. _rapi-res-instances-instance_name-shutdown: |
| |
| ``/2/instances/[instance_name]/shutdown`` |
| +++++++++++++++++++++++++++++++++++++++++ |
| |
| Instance shutdown URI. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/shutdown |
| |
| |
| .. _rapi-res-instances-instance_name-shutdown+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Shutdowns an instance. |
| |
| It supports the ``dry-run`` argument. |
| |
| .. opcode_params:: OP_INSTANCE_SHUTDOWN |
| :exclude: instance_name, dry_run |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_SHUTDOWN |
| |
| |
| .. _rapi-res-instances-instance_name-startup: |
| |
| ``/2/instances/[instance_name]/startup`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Instance startup URI. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/startup |
| |
| |
| .. _rapi-res-instances-instance_name-startup+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Startup an instance. |
| |
| 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. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_STARTUP |
| |
| |
| .. _rapi-res-instances-instance_name-reinstall: |
| |
| ``/2/instances/[instance_name]/reinstall`` |
| ++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Installs the operating system again. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/reinstall |
| |
| |
| .. _rapi-res-instances-instance_name-reinstall+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| 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. |
| |
| |
| .. _rapi-res-instances-instance_name-replace-disks: |
| |
| ``/2/instances/[instance_name]/replace-disks`` |
| ++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Replaces disks on an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/replace-disks |
| |
| |
| .. _rapi-res-instances-instance_name-replace-disks+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_REPLACE_DISKS |
| :exclude: instance_name |
| |
| Ganeti 2.4 and below used query parameters. Those are deprecated and |
| should no longer be used. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_REPLACE_DISKS |
| |
| |
| .. _rapi-res-instances-instance_name-activate-disks: |
| |
| ``/2/instances/[instance_name]/activate-disks`` |
| +++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Activate disks on an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/activate-disks |
| |
| |
| .. _rapi-res-instances-instance_name-activate-disks+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Takes the bool parameter ``ignore_size``. When set ignore the recorded |
| size (useful for forcing activation when recorded size is wrong). |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_ACTIVATE_DISKS |
| |
| |
| .. _rapi-res-instances-instance_name-deactivate-disks: |
| |
| ``/2/instances/[instance_name]/deactivate-disks`` |
| +++++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Deactivate disks on an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/deactivate-disks |
| |
| |
| .. _rapi-res-instances-instance_name-deactivate-disks+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Takes no parameters. |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_DEACTIVATE_DISKS |
| |
| |
| .. _rapi-res-instances-instance_name-recreate-disks: |
| |
| ``/2/instances/[instance_name]/recreate-disks`` |
| +++++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Recreate disks of an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/recreate-disks |
| |
| |
| .. _rapi-res-instances-instance_name-recreate-disks+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_RECREATE_DISKS |
| :exclude: instance_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_RECREATE_DISKS |
| |
| |
| .. _rapi-res-instances-instance_name-disk-disk_index-grow: |
| |
| ``/2/instances/[instance_name]/disk/[disk_index]/grow`` |
| +++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Grows one disk of an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/disk/[disk_index]/grow |
| |
| |
| .. _rapi-res-instances-instance_name-disk-disk_index-grow+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_GROW_DISK |
| :exclude: instance_name, disk |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_GROW_DISK |
| |
| |
| .. _rapi-res-instances-instance_name-prepare-export: |
| |
| ``/2/instances/[instance_name]/prepare-export`` |
| +++++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Prepares an export of an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/prepare-export |
| |
| |
| .. _rapi-res-instances-instance_name-prepare-export+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Takes one parameter, ``mode``, for the export mode. Returns a job ID. |
| |
| Job result: |
| |
| .. opcode_result:: OP_BACKUP_PREPARE |
| |
| |
| .. _rapi-res-instances-instance_name-export: |
| |
| ``/2/instances/[instance_name]/export`` |
| +++++++++++++++++++++++++++++++++++++++++++++++++ |
| |
| Exports an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/export |
| |
| |
| .. _rapi-res-instances-instance_name-export+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_BACKUP_EXPORT |
| :exclude: instance_name |
| :alias: target_node=destination |
| |
| Job result: |
| |
| .. opcode_result:: OP_BACKUP_EXPORT |
| |
| |
| .. _rapi-res-instances-instance_name-migrate: |
| |
| ``/2/instances/[instance_name]/migrate`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Migrates an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/migrate |
| |
| |
| .. _rapi-res-instances-instance_name-migrate+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_MIGRATE |
| :exclude: instance_name, live |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_MIGRATE |
| |
| |
| .. _rapi-res-instances-instance_name-failover: |
| |
| ``/2/instances/[instance_name]/failover`` |
| +++++++++++++++++++++++++++++++++++++++++ |
| |
| Does a failover of an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/failover |
| |
| |
| .. _rapi-res-instances-instance_name-failover+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_FAILOVER |
| :exclude: instance_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_FAILOVER |
| |
| |
| .. _rapi-res-instances-instance_name-rename: |
| |
| ``/2/instances/[instance_name]/rename`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Renames an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/rename |
| |
| |
| .. _rapi-res-instances-instance_name-rename+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_RENAME |
| :exclude: instance_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_RENAME |
| |
| |
| .. _rapi-res-instances-instance_name-modify: |
| |
| ``/2/instances/[instance_name]/modify`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Modifies an instance. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/modify |
| |
| |
| .. _rapi-res-instances-instance_name-modify+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_INSTANCE_SET_PARAMS |
| :exclude: instance_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_INSTANCE_SET_PARAMS |
| |
| |
| .. _rapi-res-instances-instance_name-console: |
| |
| ``/2/instances/[instance_name]/console`` |
| ++++++++++++++++++++++++++++++++++++++++ |
| |
| Request information for connecting to instance's console. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/console |
| |
| |
| .. _rapi-res-instances-instance_name-console+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a dictionary containing information about the instance's |
| console. Contained keys: |
| |
| .. pyassert:: |
| |
| constants.CONS_ALL == frozenset([ |
| constants.CONS_MESSAGE, |
| constants.CONS_SSH, |
| constants.CONS_VNC, |
| constants.CONS_SPICE, |
| ]) |
| |
| .. pyassert:: |
| |
| frozenset(objects.InstanceConsole.GetAllSlots()) == frozenset([ |
| "command", |
| "display", |
| "host", |
| "instance", |
| "kind", |
| "message", |
| "port", |
| "user", |
| ]) |
| |
| |
| ``instance`` |
| Instance name |
| ``kind`` |
| Console type, one of :pyeval:`constants.CONS_SSH`, |
| :pyeval:`constants.CONS_VNC`, :pyeval:`constants.CONS_SPICE` |
| or :pyeval:`constants.CONS_MESSAGE` |
| ``message`` |
| Message to display (:pyeval:`constants.CONS_MESSAGE` type only) |
| ``host`` |
| Host to connect to (:pyeval:`constants.CONS_SSH`, |
| :pyeval:`constants.CONS_VNC` or :pyeval:`constants.CONS_SPICE` only) |
| ``port`` |
| TCP port to connect to (:pyeval:`constants.CONS_VNC` or |
| :pyeval:`constants.CONS_SPICE` only) |
| ``user`` |
| Username to use (:pyeval:`constants.CONS_SSH` only) |
| ``command`` |
| Command to execute on machine (:pyeval:`constants.CONS_SSH` only) |
| ``display`` |
| VNC display number (:pyeval:`constants.CONS_VNC` only) |
| |
| |
| .. _rapi-res-instances-instance_name-tags: |
| |
| ``/2/instances/[instance_name]/tags`` |
| +++++++++++++++++++++++++++++++++++++ |
| |
| Manages per-instance tags. |
| |
| .. rapi_resource_details:: /2/instances/[instance_name]/tags |
| |
| |
| .. _rapi-res-instances-instance_name-tags+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of tags. |
| |
| Example:: |
| |
| ["tag1", "tag2", "tag3"] |
| |
| |
| .. _rapi-res-instances-instance_name-tags+put: |
| |
| ``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. |
| |
| |
| .. _rapi-res-instances-instance_name-tags+delete: |
| |
| ``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. |
| |
| |
| .. _rapi-res-jobs: |
| |
| ``/2/jobs`` |
| +++++++++++ |
| |
| The ``/2/jobs`` resource. |
| |
| .. rapi_resource_details:: /2/jobs |
| |
| |
| .. _rapi-res-jobs+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a dictionary of jobs. |
| |
| Returns: a dictionary with jobs id and uri. |
| |
| If the optional bool *bulk* argument is provided and set to a true value |
| (i.e. ``?bulk=1``), the output contains detailed information about jobs |
| as a list. |
| |
| Returned fields for bulk requests (unlike other bulk requests, these |
| fields are not the same as for per-job requests): |
| :pyeval:`utils.CommaJoin(sorted(rlib2.J_FIELDS_BULK))`. |
| |
| |
| .. _rapi-res-jobs-job_id: |
| |
| ``/2/jobs/[job_id]`` |
| ++++++++++++++++++++ |
| |
| Individual job URI. |
| |
| .. rapi_resource_details:: /2/jobs/[job_id] |
| |
| |
| .. _rapi-res-jobs-job_id+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a dictionary with job parameters, containing the fields |
| :pyeval:`utils.CommaJoin(sorted(rlib2.J_FIELDS))`. |
| |
| 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 |
| |
| For a successful opcode, the ``opresult`` field corresponding to it will |
| contain the raw result from its :term:`LogicalUnit`. In case an opcode |
| has failed, its element in the opresult list will be a list of two |
| elements: |
| |
| - first element the error type (the Ganeti internal error name) |
| - second element a list of either one or two elements: |
| |
| - the first element is the textual error description |
| - the second element, if any, will hold an error classification |
| |
| The error classification is most useful for the ``OpPrereqError`` |
| error type - these errors happen before the OpCode has started |
| executing, so it's possible to retry the OpCode without side |
| effects. But whether it make sense to retry depends on the error |
| classification: |
| |
| .. 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, errors.ECODE_TEMP_NORES]) |
| |
| :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. |
| |
| :pyeval:`errors.ECODE_NORES` |
| Not enough resources (iallocator failure, disk space, memory, |
| etc.). If the resources on the cluster increase, the operation might |
| succeed. |
| |
| :pyeval:`errors.ECODE_TEMP_NORES` |
| Simliar to :pyeval:`errors.ECODE_NORES`, but indicating the operation |
| should be attempted again after some time. |
| |
| :pyeval:`errors.ECODE_INVAL` |
| Wrong arguments (at syntax level). The operation will not ever be |
| accepted unless the arguments change. |
| |
| :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. |
| |
| :pyeval:`errors.ECODE_NOENT` |
| Entity not found. For example, information has been requested for an |
| unknown instance. |
| |
| :pyeval:`errors.ECODE_EXISTS` |
| Entity already exists. For example, instance creation has been |
| requested for an already-existing instance. |
| |
| :pyeval:`errors.ECODE_NOTUNIQUE` |
| Resource not unique (e.g. MAC or IP duplication). |
| |
| :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. |
| |
| :pyeval:`errors.ECODE_ENVIRON` |
| Environment error (e.g. node disk error). A ``gnt-cluster verify`` |
| should be run. |
| |
| Note that in the above list, by entity we refer to a node or instance, |
| while by a resource we refer to an instance's disk, or NIC, etc. |
| |
| |
| .. _rapi-res-jobs-job_id+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Cancel a not-yet-started job. |
| |
| |
| .. _rapi-res-jobs-job_id-wait: |
| |
| ``/2/jobs/[job_id]/wait`` |
| +++++++++++++++++++++++++ |
| |
| .. rapi_resource_details:: /2/jobs/[job_id]/wait |
| |
| |
| .. _rapi-res-jobs-job_id-wait+get: |
| |
| ``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. |
| |
| |
| .. _rapi-res-nodes: |
| |
| ``/2/nodes`` |
| ++++++++++++ |
| |
| Nodes resource. |
| |
| .. rapi_resource_details:: /2/nodes |
| |
| |
| .. _rapi-res-nodes+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of all nodes. |
| |
| Example:: |
| |
| [ |
| { |
| "id": "node1.example.com", |
| "uri": "\/nodes\/node1.example.com" |
| }, |
| { |
| "id": "node2.example.com", |
| "uri": "\/nodes\/node2.example.com" |
| } |
| ] |
| |
| If the optional bool *bulk* argument is provided and set to a true value |
| (i.e ``?bulk=1``), the output contains detailed information about nodes |
| as a list. |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.N_FIELDS))`. |
| |
| Example:: |
| |
| [ |
| { |
| "pinst_cnt": 1, |
| "mfree": 31280, |
| "mtotal": 32763, |
| "name": "www.example.com", |
| "tags": [], |
| "mnode": 512, |
| "dtotal": 5246208, |
| "sinst_cnt": 2, |
| "dfree": 5171712, |
| "offline": false, |
| … |
| }, |
| … |
| ] |
| |
| |
| .. _rapi-res-nodes-node_name: |
| |
| ``/2/nodes/[node_name]`` |
| +++++++++++++++++++++++++++++++++ |
| |
| Returns information about a node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name] |
| |
| |
| .. _rapi-res-nodes-node_name+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.N_FIELDS))`. |
| |
| |
| |
| .. _rapi-res-nodes-node_name-powercycle: |
| |
| ``/2/nodes/[node_name]/powercycle`` |
| +++++++++++++++++++++++++++++++++++ |
| |
| Powercycles a node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/powercycle |
| |
| |
| .. _rapi-res-nodes-node_name-powercycle+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_POWERCYCLE |
| |
| |
| .. _rapi-res-nodes-node_name-evacuate: |
| |
| ``/2/nodes/[node_name]/evacuate`` |
| +++++++++++++++++++++++++++++++++ |
| |
| Evacuates instances off a node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/evacuate |
| |
| |
| .. _rapi-res-nodes-node_name-evacuate+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. The result of the job will contain the IDs of the |
| individual jobs submitted to evacuate the node. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_NODE_EVACUATE |
| :exclude: nodes |
| |
| 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. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_EVACUATE |
| |
| |
| .. _rapi-res-nodes-node_name-migrate: |
| |
| ``/2/nodes/[node_name]/migrate`` |
| +++++++++++++++++++++++++++++++++ |
| |
| Migrates all primary instances from a node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/migrate |
| |
| |
| .. _rapi-res-nodes-node_name-migrate+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| If no mode is explicitly specified, each instances' hypervisor default |
| migration mode will be used. Body parameters: |
| |
| .. opcode_params:: OP_NODE_MIGRATE |
| :exclude: node_name |
| |
| 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. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_MIGRATE |
| |
| |
| .. _rapi-res-nodes-node_name-role: |
| |
| ``/2/nodes/[node_name]/role`` |
| +++++++++++++++++++++++++++++ |
| |
| Manages node role. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/role |
| |
| The role is always one of the following: |
| |
| - drained |
| - 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``). |
| |
| |
| .. _rapi-res-nodes-node_name-role+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns the current node role. |
| |
| Example:: |
| |
| "master-candidate" |
| |
| |
| .. _rapi-res-nodes-node_name-role+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| 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 bool ``force`` argument. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_SET_PARAMS |
| |
| |
| .. _rapi-res-nodes-node_name-modify: |
| |
| ``/2/nodes/[node_name]/modify`` |
| +++++++++++++++++++++++++++++++ |
| |
| Modifies the parameters of a node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/modify |
| |
| |
| .. _rapi-res-nodes-node_name-modify+post: |
| |
| ``POST`` |
| ~~~~~~~~ |
| |
| Returns a job ID. |
| |
| Body parameters: |
| |
| .. opcode_params:: OP_NODE_SET_PARAMS |
| :exclude: node_name |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_SET_PARAMS |
| |
| |
| .. _rapi-res-nodes-node_name-storage: |
| |
| ``/2/nodes/[node_name]/storage`` |
| ++++++++++++++++++++++++++++++++ |
| |
| Manages storage units on the node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/storage |
| |
| |
| .. _rapi-res-nodes-node_name-storage+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| .. pyassert:: |
| |
| constants.STS_REPORT == 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`` for storage types that support space reporting |
| (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. |
| |
| |
| .. _rapi-res-nodes-node_name-storage-modify: |
| |
| ``/2/nodes/[node_name]/storage/modify`` |
| +++++++++++++++++++++++++++++++++++++++ |
| |
| Modifies storage units on the node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/storage/modify |
| |
| |
| .. _rapi-res-nodes-node_name-storage-modify+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Modifies parameters of storage units on the node. Requires the |
| 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 :pyeval:`constants.SF_ALLOCATABLE` (bool) |
| is supported. The result will be a job id. |
| |
| Job result: |
| |
| .. opcode_result:: OP_NODE_MODIFY_STORAGE |
| |
| |
| .. _rapi-res-nodes-node_name-storage-repair: |
| |
| ``/2/nodes/[node_name]/storage/repair`` |
| +++++++++++++++++++++++++++++++++++++++ |
| |
| Repairs a storage unit on the node. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/storage/repair |
| |
| |
| .. _rapi-res-nodes-node_name-storage-repair+put: |
| |
| ``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 :pyeval:`constants.ST_LVM_VG` can be |
| repaired) and ``name`` (name of the storage unit). The result will be a |
| job id. |
| |
| Job result: |
| |
| .. opcode_result:: OP_REPAIR_NODE_STORAGE |
| |
| |
| .. _rapi-res-nodes-node_name-tags: |
| |
| ``/2/nodes/[node_name]/tags`` |
| +++++++++++++++++++++++++++++ |
| |
| Manages per-node tags. |
| |
| .. rapi_resource_details:: /2/nodes/[node_name]/tags |
| |
| |
| .. _rapi-res-nodes-node_name-tags+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns a list of tags. |
| |
| Example:: |
| |
| ["tag1", "tag2", "tag3"] |
| |
| |
| .. _rapi-res-nodes-node_name-tags+put: |
| |
| ``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. |
| |
| |
| .. _rapi-res-nodes-node_name-tags+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Deletes tags. |
| |
| 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. |
| |
| |
| .. _rapi-res-query-resource: |
| |
| ``/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. |
| |
| .. rapi_resource_details:: /2/query/[resource] |
| |
| |
| .. _rapi-res-query-resource+get: |
| |
| ``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. |
| |
| |
| .. _rapi-res-query-resource+put: |
| |
| ``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. |
| |
| |
| .. _rapi-res-query-resource-fields: |
| |
| ``/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. |
| |
| .. rapi_resource_details:: /2/query/[resource]/fields |
| |
| |
| .. _rapi-res-query-resource-fields+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. |
| |
| |
| .. _rapi-res-os: |
| |
| ``/2/os`` |
| +++++++++ |
| |
| OS resource. |
| |
| .. rapi_resource_details:: /2/os |
| |
| |
| .. _rapi-res-os+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Return a list of all OSes. |
| |
| Can return error 500 in case of a problem. Since this is a costly |
| operation for Ganeti 2.0, it is not recommended to execute it too often. |
| |
| Example:: |
| |
| ["debian-etch"] |
| |
| |
| .. _rapi-res-tags: |
| |
| ``/2/tags`` |
| +++++++++++ |
| |
| Manages cluster tags. |
| |
| .. rapi_resource_details:: /2/tags |
| |
| |
| .. _rapi-res-tags+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns the cluster tags. |
| |
| Example:: |
| |
| ["tag1", "tag2", "tag3"] |
| |
| |
| .. _rapi-res-tags+put: |
| |
| ``PUT`` |
| ~~~~~~~ |
| |
| Adds 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. |
| |
| |
| .. _rapi-res-tags+delete: |
| |
| ``DELETE`` |
| ~~~~~~~~~~ |
| |
| Deletes tags. |
| |
| 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. |
| |
| |
| .. _rapi-res-version: |
| |
| ``/version`` |
| ++++++++++++ |
| |
| The version resource. |
| |
| This resource should be used to determine the remote API version and to |
| adapt clients accordingly. |
| |
| .. rapi_resource_details:: /version |
| |
| |
| .. _rapi-res-version+get: |
| |
| ``GET`` |
| ~~~~~~~ |
| |
| Returns the remote API version. Ganeti 1.2 returned ``1`` and Ganeti 2.0 |
| returns ``2``. |
| |
| |
| .. _rapi-access-permissions: |
| |
| Access permissions |
| ------------------ |
| |
| The following list describes the access permissions required for each |
| resource. See :ref:`rapi-users` for more details. |
| |
| .. rapi_access_table:: |
| |
| |
| .. vim: set textwidth=72 : |
| .. Local Variables: |
| .. mode: rst |
| .. fill-column: 72 |
| .. End: |