Use reserved documentation IPs and domains
[ganeti-local] / doc / rapi.rst
1 Ganeti remote API
2 =================
3
4 Documents Ganeti version |version|
5
6 .. contents::
7
8 Introduction
9 ------------
10
11 Ganeti supports a remote API for enable external tools to easily
12 retrieve information about a cluster's state. The remote API daemon,
13 *ganeti-rapi*, is automatically started on the master node. By default
14 it runs on TCP port 5080, but this can be changed either in
15 ``.../constants.py`` or via the command line parameter *-p*. SSL mode,
16 which is used by default, can also be disabled by passing command line
17 parameters.
18
19
20 Users and passwords
21 -------------------
22
23 ``ganeti-rapi`` reads users and passwords from a file (usually
24 ``/var/lib/ganeti/rapi_users``) on startup. After modifying the password
25 file, ``ganeti-rapi`` must be restarted.
26
27 Each line consists of two or three fields separated by whitespace. The
28 first two fields are for username and password. The third field is
29 optional and can be used to specify per-user options. Currently,
30 ``write`` is the only option supported and enables the user to execute
31 operations modifying the cluster. Lines starting with the hash sign
32 (``#``) are treated as comments.
33
34 Passwords can either be written in clear text or as a hash. Clear text
35 passwords may not start with an opening brace (``{``) or they must be
36 prefixed with ``{cleartext}``. To use the hashed form, get the MD5 hash
37 of the string ``$username:Ganeti Remote API:$password`` (e.g. ``echo -n
38 'jack:Ganeti Remote API:abc123' | openssl md5``) [#pwhash]_ and prefix
39 it with ``{ha1}``. Using the scheme prefix for all passwords is
40 recommended. Scheme prefixes are not case sensitive.
41
42 Example::
43
44   # Give Jack and Fred read-only access
45   jack abc123
46   fred {cleartext}foo555
47
48   # Give write access to an imaginary instance creation script
49   autocreator xyz789 write
50
51   # Hashed password for Jessica
52   jessica {HA1}7046452df2cbb530877058712cf17bd4 write
53
54
55 .. [#pwhash] Using the MD5 hash of username, realm and password is
56    described in RFC2617_ ("HTTP Authentication"), sections 3.2.2.2 and
57    3.3. The reason for using it over another algorithm is forward
58    compatibility. If ``ganeti-rapi`` were to implement HTTP Digest
59    authentication in the future, the same hash could be used.
60    In the current version ``ganeti-rapi``'s realm, ``Ganeti Remote
61    API``, can only be changed by modifying the source code.
62
63
64 Protocol
65 --------
66
67 The protocol used is JSON_ over HTTP designed after the REST_ principle.
68 HTTP Basic authentication as per RFC2617_ is supported.
69
70 .. _JSON: http://www.json.org/
71 .. _REST: http://en.wikipedia.org/wiki/Representational_State_Transfer
72 .. _RFC2617: http://tools.ietf.org/rfc/rfc2617.txt
73
74
75 PUT or POST?
76 ------------
77
78 According to RFC2616 the main difference between PUT and POST is that
79 POST can create new resources but PUT can only create the resource the
80 URI was pointing to on the PUT request.
81
82 Unfortunately, due to historic reasons, the Ganeti RAPI library is not
83 consistent with this usage, so just use the methods as documented below
84 for each resource.
85
86 For more details have a look in the source code at
87 ``lib/rapi/rlib2.py``.
88
89
90 Generic parameter types
91 -----------------------
92
93 A few generic refered parameter types and the values they allow.
94
95 ``bool``
96 ++++++++
97
98 A boolean option will accept ``1`` or ``0`` as numbers but not
99 i.e. ``True`` or ``False``.
100
101 Generic parameters
102 ------------------
103
104 A few parameter mean the same thing across all resources which implement
105 it.
106
107 ``bulk``
108 ++++++++
109
110 Bulk-mode means that for the resources which usually return just a list
111 of child resources (e.g. ``/2/instances`` which returns just instance
112 names), the output will instead contain detailed data for all these
113 subresources. This is more efficient than query-ing the sub-resources
114 themselves.
115
116 ``dry-run``
117 +++++++++++
118
119 The boolean *dry-run* argument, if provided and set, signals to Ganeti
120 that the job should not be executed, only the pre-execution checks will
121 be done.
122
123 This is useful in trying to determine (without guarantees though, as in
124 the meantime the cluster state could have changed) if the operation is
125 likely to succeed or at least start executing.
126
127 ``force``
128 +++++++++++
129
130 Force operation to continue even if it will cause the cluster to become
131 inconsistent (e.g. because there are not enough master candidates).
132
133 Usage examples
134 --------------
135
136 You can access the API using your favorite programming language as long
137 as it supports network connections.
138
139 Ganeti RAPI client
140 ++++++++++++++++++
141
142 Ganeti includes a standalone RAPI client, ``lib/rapi/client.py``.
143
144 Shell
145 +++++
146
147 .. highlight:: sh
148
149 Using wget::
150
151    wget -q -O - https://CLUSTERNAME:5080/2/info
152
153 or curl::
154
155   curl https://CLUSTERNAME:5080/2/info
156
157
158 Python
159 ++++++
160
161 .. highlight:: python
162
163 ::
164
165   import urllib2
166   f = urllib2.urlopen('https://CLUSTERNAME:5080/2/info')
167   print f.read()
168
169
170 JavaScript
171 ++++++++++
172
173 .. warning:: While it's possible to use JavaScript, it poses several
174    potential problems, including browser blocking request due to
175    non-standard ports or different domain names. Fetching the data on
176    the webserver is easier.
177
178 .. highlight:: javascript
179
180 ::
181
182   var url = 'https://CLUSTERNAME:5080/2/info';
183   var info;
184   var xmlreq = new XMLHttpRequest();
185   xmlreq.onreadystatechange = function () {
186     if (xmlreq.readyState != 4) return;
187     if (xmlreq.status == 200) {
188       info = eval("(" + xmlreq.responseText + ")");
189       alert(info);
190     } else {
191       alert('Error fetching cluster info');
192     }
193     xmlreq = null;
194   };
195   xmlreq.open('GET', url, true);
196   xmlreq.send(null);
197
198 Resources
199 ---------
200
201 .. highlight:: javascript
202
203 ``/``
204 +++++
205
206 The root resource.
207
208 It supports the following commands: ``GET``.
209
210 ``GET``
211 ~~~~~~~
212
213 Shows the list of mapped resources.
214
215 Returns: a dictionary with 'name' and 'uri' keys for each of them.
216
217 ``/2``
218 ++++++
219
220 The ``/2`` resource, the root of the version 2 API.
221
222 It supports the following commands: ``GET``.
223
224 ``GET``
225 ~~~~~~~
226
227 Show the list of mapped resources.
228
229 Returns: a dictionary with ``name`` and ``uri`` keys for each of them.
230
231 ``/2/info``
232 +++++++++++
233
234 Cluster information resource.
235
236 It supports the following commands: ``GET``.
237
238 ``GET``
239 ~~~~~~~
240
241 Returns cluster information.
242
243 Example::
244
245   {
246     "config_version": 2000000,
247     "name": "cluster",
248     "software_version": "2.0.0~beta2",
249     "os_api_version": 10,
250     "export_version": 0,
251     "candidate_pool_size": 10,
252     "enabled_hypervisors": [
253       "fake"
254     ],
255     "hvparams": {
256       "fake": {}
257      },
258     "default_hypervisor": "fake",
259     "master": "node1.example.com",
260     "architecture": [
261       "64bit",
262       "x86_64"
263     ],
264     "protocol_version": 20,
265     "beparams": {
266       "default": {
267         "auto_balance": true,
268         "vcpus": 1,
269         "memory": 128
270        }
271       }
272     }
273
274
275 ``/2/redistribute-config``
276 ++++++++++++++++++++++++++
277
278 Redistribute configuration to all nodes.
279
280 It supports the following commands: ``PUT``.
281
282 ``PUT``
283 ~~~~~~~
284
285 Redistribute configuration to all nodes. The result will be a job id.
286
287
288 ``/2/features``
289 +++++++++++++++
290
291 ``GET``
292 ~~~~~~~
293
294 Returns a list of features supported by the RAPI server. Available
295 features:
296
297 ``instance-create-reqv1``
298   Instance creation request data version 1 supported.
299
300
301 ``/2/instances``
302 ++++++++++++++++
303
304 The instances resource.
305
306 It supports the following commands: ``GET``, ``POST``.
307
308 ``GET``
309 ~~~~~~~
310
311 Returns a list of all available instances.
312
313 Example::
314
315     [
316       {
317         "name": "web.example.com",
318         "uri": "\/instances\/web.example.com"
319       },
320       {
321         "name": "mail.example.com",
322         "uri": "\/instances\/mail.example.com"
323       }
324     ]
325
326 If the optional bool *bulk* argument is provided and set to a true value
327 (i.e ``?bulk=1``), the output contains detailed information about
328 instances as a list.
329
330 Example::
331
332     [
333       {
334          "status": "running",
335          "disk_usage": 20480,
336          "nic.bridges": [
337            "xen-br0"
338           ],
339          "name": "web.example.com",
340          "tags": ["tag1", "tag2"],
341          "beparams": {
342            "vcpus": 2,
343            "memory": 512
344          },
345          "disk.sizes": [
346              20480
347          ],
348          "pnode": "node1.example.com",
349          "nic.macs": ["01:23:45:67:89:01"],
350          "snodes": ["node2.example.com"],
351          "disk_template": "drbd",
352          "admin_state": true,
353          "os": "debian-etch",
354          "oper_state": true
355       },
356       ...
357     ]
358
359
360 ``POST``
361 ~~~~~~~~
362
363 Creates an instance.
364
365 If the optional bool *dry-run* argument is provided, the job will not be
366 actually executed, only the pre-execution checks will be done. Query-ing
367 the job result will return, in both dry-run and normal case, the list of
368 nodes selected for the instance.
369
370 Returns: a job ID that can be used later for polling.
371
372 Body parameters:
373
374 ``__version__`` (int, required)
375   Must be ``1`` (older Ganeti versions used a different format for
376   instance creation requests, version ``0``, but that format is not
377   documented).
378 ``mode``
379   Instance creation mode (string, required).
380 ``name`` (string, required)
381   Instance name
382 ``disk_template`` (string, required)
383   Disk template for instance
384 ``disks`` (list, required)
385   List of disk definitions. Example: ``[{"size": 100}, {"size": 5}]``.
386   Each disk definition must contain a ``size`` value and can contain an
387   optional ``mode`` value denoting the disk access mode (``ro`` or
388   ``rw``).
389 ``nics`` (list, required)
390   List of NIC (network interface) definitions. Example: ``[{}, {},
391   {"ip": "198.51.100.4"}]``. Each NIC definition can contain the
392   optional values ``ip``, ``mode``, ``link`` and ``bridge``.
393 ``os`` (string)
394   Instance operating system.
395 ``force_variant`` (bool)
396   Whether to force an unknown variant.
397 ``pnode`` (string)
398   Primary node.
399 ``snode`` (string)
400   Secondary node.
401 ``src_node`` (string)
402   Source node for import.
403 ``src_path`` (string)
404   Source directory for import.
405 ``start`` (bool)
406   Whether to start instance after creation.
407 ``ip_check`` (bool)
408   Whether to ensure instance's IP address is inactive.
409 ``name_check`` (bool)
410   Whether to ensure instance's name is resolvable.
411 ``file_storage_dir`` (string)
412   File storage directory.
413 ``file_driver`` (string)
414   File storage driver.
415 ``iallocator`` (string)
416   Instance allocator name.
417 ``source_handshake``
418   Signed handshake from source (remote import only).
419 ``source_x509_ca`` (string)
420   Source X509 CA in PEM format (remote import only).
421 ``source_instance_name`` (string)
422   Source instance name (remote import only).
423 ``hypervisor`` (string)
424   Hypervisor name.
425 ``hvparams`` (dict)
426   Hypervisor parameters, hypervisor-dependent.
427 ``beparams``
428   Backend parameters.
429
430
431 ``/2/instances/[instance_name]``
432 ++++++++++++++++++++++++++++++++
433
434 Instance-specific resource.
435
436 It supports the following commands: ``GET``, ``DELETE``.
437
438 ``GET``
439 ~~~~~~~
440
441 Returns information about an instance, similar to the bulk output from
442 the instance list.
443
444 ``DELETE``
445 ~~~~~~~~~~
446
447 Deletes an instance.
448
449 It supports the ``dry-run`` argument.
450
451
452 ``/2/instances/[instance_name]/info``
453 +++++++++++++++++++++++++++++++++++++++
454
455 It supports the following commands: ``GET``.
456
457 ``GET``
458 ~~~~~~~
459
460 Requests detailed information about the instance. An optional parameter,
461 ``static`` (bool), can be set to return only static information from the
462 configuration without querying the instance's nodes. The result will be
463 a job id.
464
465
466 ``/2/instances/[instance_name]/reboot``
467 +++++++++++++++++++++++++++++++++++++++
468
469 Reboots URI for an instance.
470
471 It supports the following commands: ``POST``.
472
473 ``POST``
474 ~~~~~~~~
475
476 Reboots the instance.
477
478 The URI takes optional ``type=soft|hard|full`` and
479 ``ignore_secondaries=0|1`` parameters.
480
481 ``type`` defines the reboot type. ``soft`` is just a normal reboot,
482 without terminating the hypervisor. ``hard`` means full shutdown
483 (including terminating the hypervisor process) and startup again.
484 ``full`` is like ``hard`` but also recreates the configuration from
485 ground up as if you would have done a ``gnt-instance shutdown`` and
486 ``gnt-instance start`` on it.
487
488 ``ignore_secondaries`` is a bool argument indicating if we start the
489 instance even if secondary disks are failing.
490
491 It supports the ``dry-run`` argument.
492
493
494 ``/2/instances/[instance_name]/shutdown``
495 +++++++++++++++++++++++++++++++++++++++++
496
497 Instance shutdown URI.
498
499 It supports the following commands: ``PUT``.
500
501 ``PUT``
502 ~~~~~~~
503
504 Shutdowns an instance.
505
506 It supports the ``dry-run`` argument.
507
508
509 ``/2/instances/[instance_name]/startup``
510 ++++++++++++++++++++++++++++++++++++++++
511
512 Instance startup URI.
513
514 It supports the following commands: ``PUT``.
515
516 ``PUT``
517 ~~~~~~~
518
519 Startup an instance.
520
521 The URI takes an optional ``force=1|0`` parameter to start the
522 instance even if secondary disks are failing.
523
524 It supports the ``dry-run`` argument.
525
526 ``/2/instances/[instance_name]/reinstall``
527 ++++++++++++++++++++++++++++++++++++++++++++++
528
529 Installs the operating system again.
530
531 It supports the following commands: ``POST``.
532
533 ``POST``
534 ~~~~~~~~
535
536 Takes the parameters ``os`` (OS template name) and ``nostartup`` (bool).
537
538
539 ``/2/instances/[instance_name]/replace-disks``
540 ++++++++++++++++++++++++++++++++++++++++++++++
541
542 Replaces disks on an instance.
543
544 It supports the following commands: ``POST``.
545
546 ``POST``
547 ~~~~~~~~
548
549 Takes the parameters ``mode`` (one of ``replace_on_primary``,
550 ``replace_on_secondary``, ``replace_new_secondary`` or
551 ``replace_auto``), ``disks`` (comma separated list of disk indexes),
552 ``remote_node`` and ``iallocator``.
553
554 Either ``remote_node`` or ``iallocator`` needs to be defined when using
555 ``mode=replace_new_secondary``.
556
557 ``mode`` is a mandatory parameter. ``replace_auto`` tries to determine
558 the broken disk(s) on its own and replacing it.
559
560
561 ``/2/instances/[instance_name]/activate-disks``
562 +++++++++++++++++++++++++++++++++++++++++++++++
563
564 Activate disks on an instance.
565
566 It supports the following commands: ``PUT``.
567
568 ``PUT``
569 ~~~~~~~
570
571 Takes the bool parameter ``ignore_size``. When set ignore the recorded
572 size (useful for forcing activation when recorded size is wrong).
573
574
575 ``/2/instances/[instance_name]/deactivate-disks``
576 +++++++++++++++++++++++++++++++++++++++++++++++++
577
578 Deactivate disks on an instance.
579
580 It supports the following commands: ``PUT``.
581
582 ``PUT``
583 ~~~~~~~
584
585 Takes no parameters.
586
587
588 ``/2/instances/[instance_name]/prepare-export``
589 +++++++++++++++++++++++++++++++++++++++++++++++++
590
591 Prepares an export of an instance.
592
593 It supports the following commands: ``PUT``.
594
595 ``PUT``
596 ~~~~~~~
597
598 Takes one parameter, ``mode``, for the export mode. Returns a job ID.
599
600
601 ``/2/instances/[instance_name]/export``
602 +++++++++++++++++++++++++++++++++++++++++++++++++
603
604 Exports an instance.
605
606 It supports the following commands: ``PUT``.
607
608 ``PUT``
609 ~~~~~~~
610
611 Returns a job ID.
612
613 Body parameters:
614
615 ``mode`` (string)
616   Export mode.
617 ``destination`` (required)
618   Destination information, depends on export mode.
619 ``shutdown`` (bool, required)
620   Whether to shutdown instance before export.
621 ``remove_instance`` (bool)
622   Whether to remove instance after export.
623 ``x509_key_name``
624   Name of X509 key (remote export only).
625 ``destination_x509_ca``
626   Destination X509 CA (remote export only).
627
628
629 ``/2/instances/[instance_name]/tags``
630 +++++++++++++++++++++++++++++++++++++
631
632 Manages per-instance tags.
633
634 It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
635
636 ``GET``
637 ~~~~~~~
638
639 Returns a list of tags.
640
641 Example::
642
643     ["tag1", "tag2", "tag3"]
644
645 ``PUT``
646 ~~~~~~~
647
648 Add a set of tags.
649
650 The request as a list of strings should be ``PUT`` to this URI. The
651 result will be a job id.
652
653 It supports the ``dry-run`` argument.
654
655
656 ``DELETE``
657 ~~~~~~~~~~
658
659 Delete a tag.
660
661 In order to delete a set of tags, the DELETE request should be addressed
662 to URI like::
663
664     /tags?tag=[tag]&tag=[tag]
665
666 It supports the ``dry-run`` argument.
667
668
669 ``/2/jobs``
670 +++++++++++
671
672 The ``/2/jobs`` resource.
673
674 It supports the following commands: ``GET``.
675
676 ``GET``
677 ~~~~~~~
678
679 Returns a dictionary of jobs.
680
681 Returns: a dictionary with jobs id and uri.
682
683 ``/2/jobs/[job_id]``
684 ++++++++++++++++++++
685
686
687 Individual job URI.
688
689 It supports the following commands: ``GET``, ``DELETE``.
690
691 ``GET``
692 ~~~~~~~
693
694 Returns a job status.
695
696 Returns: a dictionary with job parameters.
697
698 The result includes:
699
700 - id: job ID as a number
701 - status: current job status as a string
702 - ops: involved OpCodes as a list of dictionaries for each opcodes in
703   the job
704 - opstatus: OpCodes status as a list
705 - opresult: OpCodes results as a list
706
707 For a successful opcode, the ``opresult`` field corresponding to it will
708 contain the raw result from its :term:`LogicalUnit`. In case an opcode
709 has failed, its element in the opresult list will be a list of two
710 elements:
711
712 - first element the error type (the Ganeti internal error name)
713 - second element a list of either one or two elements:
714
715   - the first element is the textual error description
716   - the second element, if any, will hold an error classification
717
718 The error classification is most useful for the ``OpPrereqError``
719 error type - these errors happen before the OpCode has started
720 executing, so it's possible to retry the OpCode without side
721 effects. But whether it make sense to retry depends on the error
722 classification:
723
724 ``resolver_error``
725   Resolver errors. This usually means that a name doesn't exist in DNS,
726   so if it's a case of slow DNS propagation the operation can be retried
727   later.
728
729 ``insufficient_resources``
730   Not enough resources (iallocator failure, disk space, memory,
731   etc.). If the resources on the cluster increase, the operation might
732   succeed.
733
734 ``wrong_input``
735   Wrong arguments (at syntax level). The operation will not ever be
736   accepted unless the arguments change.
737
738 ``wrong_state``
739   Wrong entity state. For example, live migration has been requested for
740   a down instance, or instance creation on an offline node. The
741   operation can be retried once the resource has changed state.
742
743 ``unknown_entity``
744   Entity not found. For example, information has been requested for an
745   unknown instance.
746
747 ``already_exists``
748   Entity already exists. For example, instance creation has been
749   requested for an already-existing instance.
750
751 ``resource_not_unique``
752   Resource not unique (e.g. MAC or IP duplication).
753
754 ``internal_error``
755   Internal cluster error. For example, a node is unreachable but not set
756   offline, or the ganeti node daemons are not working, etc. A
757   ``gnt-cluster verify`` should be run.
758
759 ``environment_error``
760   Environment error (e.g. node disk error). A ``gnt-cluster verify``
761   should be run.
762
763 Note that in the above list, by entity we refer to a node or instance,
764 while by a resource we refer to an instance's disk, or NIC, etc.
765
766
767 ``DELETE``
768 ~~~~~~~~~~
769
770 Cancel a not-yet-started job.
771
772
773 ``/2/jobs/[job_id]/wait``
774 +++++++++++++++++++++++++
775
776 ``GET``
777 ~~~~~~~
778
779 Waits for changes on a job. Takes the following body parameters in a
780 dict:
781
782 ``fields``
783   The job fields on which to watch for changes.
784
785 ``previous_job_info``
786   Previously received field values or None if not yet available.
787
788 ``previous_log_serial``
789   Highest log serial number received so far or None if not yet
790   available.
791
792 Returns None if no changes have been detected and a dict with two keys,
793 ``job_info`` and ``log_entries`` otherwise.
794
795
796 ``/2/nodes``
797 ++++++++++++
798
799 Nodes resource.
800
801 It supports the following commands: ``GET``.
802
803 ``GET``
804 ~~~~~~~
805
806 Returns a list of all nodes.
807
808 Example::
809
810     [
811       {
812         "id": "node1.example.com",
813         "uri": "\/nodes\/node1.example.com"
814       },
815       {
816         "id": "node2.example.com",
817         "uri": "\/nodes\/node2.example.com"
818       }
819     ]
820
821 If the optional 'bulk' argument is provided and set to 'true' value (i.e
822 '?bulk=1'), the output contains detailed information about nodes as a
823 list.
824
825 Example::
826
827     [
828       {
829         "pinst_cnt": 1,
830         "mfree": 31280,
831         "mtotal": 32763,
832         "name": "www.example.com",
833         "tags": [],
834         "mnode": 512,
835         "dtotal": 5246208,
836         "sinst_cnt": 2,
837         "dfree": 5171712,
838         "offline": false
839       },
840       ...
841     ]
842
843 ``/2/nodes/[node_name]``
844 +++++++++++++++++++++++++++++++++
845
846 Returns information about a node.
847
848 It supports the following commands: ``GET``.
849
850 ``/2/nodes/[node_name]/evacuate``
851 +++++++++++++++++++++++++++++++++
852
853 Evacuates all secondary instances off a node.
854
855 It supports the following commands: ``POST``.
856
857 ``POST``
858 ~~~~~~~~
859
860 To evacuate a node, either one of the ``iallocator`` or ``remote_node``
861 parameters must be passed::
862
863     evacuate?iallocator=[iallocator]
864     evacuate?remote_node=[nodeX.example.com]
865
866 The result value will be a list, each element being a triple of the job
867 id (for this specific evacuation), the instance which is being evacuated
868 by this job, and the node to which it is being relocated. In case the
869 node is already empty, the result will be an empty list (without any
870 jobs being submitted).
871
872 And additional parameter ``early_release`` signifies whether to try to
873 parallelize the evacuations, at the risk of increasing I/O contention
874 and increasing the chances of data loss, if the primary node of any of
875 the instances being evacuated is not fully healthy.
876
877 If the dry-run parameter was specified, then the evacuation jobs were
878 not actually submitted, and the job IDs will be null.
879
880
881 ``/2/nodes/[node_name]/migrate``
882 +++++++++++++++++++++++++++++++++
883
884 Migrates all primary instances from a node.
885
886 It supports the following commands: ``POST``.
887
888 ``POST``
889 ~~~~~~~~
890
891 No parameters are required, but the bool parameter ``live`` can be set
892 to use live migration (if available).
893
894     migrate?live=[0|1]
895
896 ``/2/nodes/[node_name]/role``
897 +++++++++++++++++++++++++++++
898
899 Manages node role.
900
901 It supports the following commands: ``GET``, ``PUT``.
902
903 The role is always one of the following:
904
905   - drained
906   - master
907   - master-candidate
908   - offline
909   - regular
910
911 ``GET``
912 ~~~~~~~
913
914 Returns the current node role.
915
916 Example::
917
918     "master-candidate"
919
920 ``PUT``
921 ~~~~~~~
922
923 Change the node role.
924
925 The request is a string which should be PUT to this URI. The result will
926 be a job id.
927
928 It supports the bool ``force`` argument.
929
930 ``/2/nodes/[node_name]/storage``
931 ++++++++++++++++++++++++++++++++
932
933 Manages storage units on the node.
934
935 ``GET``
936 ~~~~~~~
937
938 Requests a list of storage units on a node. Requires the parameters
939 ``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``) and
940 ``output_fields``. The result will be a job id, using which the result
941 can be retrieved.
942
943 ``/2/nodes/[node_name]/storage/modify``
944 +++++++++++++++++++++++++++++++++++++++
945
946 Modifies storage units on the node.
947
948 ``PUT``
949 ~~~~~~~
950
951 Modifies parameters of storage units on the node. Requires the
952 parameters ``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``)
953 and ``name`` (name of the storage unit).  Parameters can be passed
954 additionally. Currently only ``allocatable`` (bool) is supported. The
955 result will be a job id.
956
957 ``/2/nodes/[node_name]/storage/repair``
958 +++++++++++++++++++++++++++++++++++++++
959
960 Repairs a storage unit on the node.
961
962 ``PUT``
963 ~~~~~~~
964
965 Repairs a storage unit on the node. Requires the parameters
966 ``storage_type`` (currently only ``lvm-vg`` can be repaired) and
967 ``name`` (name of the storage unit). The result will be a job id.
968
969 ``/2/nodes/[node_name]/tags``
970 +++++++++++++++++++++++++++++
971
972 Manages per-node tags.
973
974 It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
975
976 ``GET``
977 ~~~~~~~
978
979 Returns a list of tags.
980
981 Example::
982
983     ["tag1", "tag2", "tag3"]
984
985 ``PUT``
986 ~~~~~~~
987
988 Add a set of tags.
989
990 The request as a list of strings should be PUT to this URI. The result
991 will be a job id.
992
993 It supports the ``dry-run`` argument.
994
995 ``DELETE``
996 ~~~~~~~~~~
997
998 Deletes tags.
999
1000 In order to delete a set of tags, the DELETE request should be addressed
1001 to URI like::
1002
1003     /tags?tag=[tag]&tag=[tag]
1004
1005 It supports the ``dry-run`` argument.
1006
1007
1008 ``/2/os``
1009 +++++++++
1010
1011 OS resource.
1012
1013 It supports the following commands: ``GET``.
1014
1015 ``GET``
1016 ~~~~~~~
1017
1018 Return a list of all OSes.
1019
1020 Can return error 500 in case of a problem. Since this is a costly
1021 operation for Ganeti 2.0, it is not recommended to execute it too often.
1022
1023 Example::
1024
1025     ["debian-etch"]
1026
1027 ``/2/tags``
1028 +++++++++++
1029
1030 Manages cluster tags.
1031
1032 It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
1033
1034 ``GET``
1035 ~~~~~~~
1036
1037 Returns the cluster tags.
1038
1039 Example::
1040
1041     ["tag1", "tag2", "tag3"]
1042
1043 ``PUT``
1044 ~~~~~~~
1045
1046 Adds a set of tags.
1047
1048 The request as a list of strings should be PUT to this URI. The result
1049 will be a job id.
1050
1051 It supports the ``dry-run`` argument.
1052
1053
1054 ``DELETE``
1055 ~~~~~~~~~~
1056
1057 Deletes tags.
1058
1059 In order to delete a set of tags, the DELETE request should be addressed
1060 to URI like::
1061
1062     /tags?tag=[tag]&tag=[tag]
1063
1064 It supports the ``dry-run`` argument.
1065
1066
1067 ``/version``
1068 ++++++++++++
1069
1070 The version resource.
1071
1072 This resource should be used to determine the remote API version and to
1073 adapt clients accordingly.
1074
1075 It supports the following commands: ``GET``.
1076
1077 ``GET``
1078 ~~~~~~~
1079
1080 Returns the remote API version. Ganeti 1.2 returned ``1`` and Ganeti 2.0
1081 returns ``2``.
1082
1083 .. vim: set textwidth=72 :
1084 .. Local Variables:
1085 .. mode: rst
1086 .. fill-column: 72
1087 .. End: