Statistics
| Branch: | Tag: | Revision:

root / doc / rapi.rst @ 5823e0d2

History | View | Annotate | Download (24.7 kB)

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, required)
394
  Instance operating system.
395
``osparams`` (dictionary)
396
  Dictionary with OS parameters. If not valid for the given OS, the job
397
  will fail.
398
``force_variant`` (bool)
399
  Whether to force an unknown variant.
400
``pnode`` (string)
401
  Primary node.
402
``snode`` (string)
403
  Secondary node.
404
``src_node`` (string)
405
  Source node for import.
406
``src_path`` (string)
407
  Source directory for import.
408
``start`` (bool)
409
  Whether to start instance after creation.
410
``ip_check`` (bool)
411
  Whether to ensure instance's IP address is inactive.
412
``name_check`` (bool)
413
  Whether to ensure instance's name is resolvable.
414
``file_storage_dir`` (string)
415
  File storage directory.
416
``file_driver`` (string)
417
  File storage driver.
418
``iallocator`` (string)
419
  Instance allocator name.
420
``source_handshake``
421
  Signed handshake from source (remote import only).
422
``source_x509_ca`` (string)
423
  Source X509 CA in PEM format (remote import only).
424
``source_instance_name`` (string)
425
  Source instance name (remote import only).
426
``hypervisor`` (string)
427
  Hypervisor name.
428
``hvparams`` (dict)
429
  Hypervisor parameters, hypervisor-dependent.
430
``beparams``
431
  Backend parameters.
432

    
433

    
434
``/2/instances/[instance_name]``
435
++++++++++++++++++++++++++++++++
436

    
437
Instance-specific resource.
438

    
439
It supports the following commands: ``GET``, ``DELETE``.
440

    
441
``GET``
442
~~~~~~~
443

    
444
Returns information about an instance, similar to the bulk output from
445
the instance list.
446

    
447
``DELETE``
448
~~~~~~~~~~
449

    
450
Deletes an instance.
451

    
452
It supports the ``dry-run`` argument.
453

    
454

    
455
``/2/instances/[instance_name]/info``
456
+++++++++++++++++++++++++++++++++++++++
457

    
458
It supports the following commands: ``GET``.
459

    
460
``GET``
461
~~~~~~~
462

    
463
Requests detailed information about the instance. An optional parameter,
464
``static`` (bool), can be set to return only static information from the
465
configuration without querying the instance's nodes. The result will be
466
a job id.
467

    
468

    
469
``/2/instances/[instance_name]/reboot``
470
+++++++++++++++++++++++++++++++++++++++
471

    
472
Reboots URI for an instance.
473

    
474
It supports the following commands: ``POST``.
475

    
476
``POST``
477
~~~~~~~~
478

    
479
Reboots the instance.
480

    
481
The URI takes optional ``type=soft|hard|full`` and
482
``ignore_secondaries=0|1`` parameters.
483

    
484
``type`` defines the reboot type. ``soft`` is just a normal reboot,
485
without terminating the hypervisor. ``hard`` means full shutdown
486
(including terminating the hypervisor process) and startup again.
487
``full`` is like ``hard`` but also recreates the configuration from
488
ground up as if you would have done a ``gnt-instance shutdown`` and
489
``gnt-instance start`` on it.
490

    
491
``ignore_secondaries`` is a bool argument indicating if we start the
492
instance even if secondary disks are failing.
493

    
494
It supports the ``dry-run`` argument.
495

    
496

    
497
``/2/instances/[instance_name]/shutdown``
498
+++++++++++++++++++++++++++++++++++++++++
499

    
500
Instance shutdown URI.
501

    
502
It supports the following commands: ``PUT``.
503

    
504
``PUT``
505
~~~~~~~
506

    
507
Shutdowns an instance.
508

    
509
It supports the ``dry-run`` argument.
510

    
511

    
512
``/2/instances/[instance_name]/startup``
513
++++++++++++++++++++++++++++++++++++++++
514

    
515
Instance startup URI.
516

    
517
It supports the following commands: ``PUT``.
518

    
519
``PUT``
520
~~~~~~~
521

    
522
Startup an instance.
523

    
524
The URI takes an optional ``force=1|0`` parameter to start the
525
instance even if secondary disks are failing.
526

    
527
It supports the ``dry-run`` argument.
528

    
529
``/2/instances/[instance_name]/reinstall``
530
++++++++++++++++++++++++++++++++++++++++++++++
531

    
532
Installs the operating system again.
533

    
534
It supports the following commands: ``POST``.
535

    
536
``POST``
537
~~~~~~~~
538

    
539
Takes the parameters ``os`` (OS template name) and ``nostartup`` (bool).
540

    
541

    
542
``/2/instances/[instance_name]/replace-disks``
543
++++++++++++++++++++++++++++++++++++++++++++++
544

    
545
Replaces disks on an instance.
546

    
547
It supports the following commands: ``POST``.
548

    
549
``POST``
550
~~~~~~~~
551

    
552
Takes the parameters ``mode`` (one of ``replace_on_primary``,
553
``replace_on_secondary``, ``replace_new_secondary`` or
554
``replace_auto``), ``disks`` (comma separated list of disk indexes),
555
``remote_node`` and ``iallocator``.
556

    
557
Either ``remote_node`` or ``iallocator`` needs to be defined when using
558
``mode=replace_new_secondary``.
559

    
560
``mode`` is a mandatory parameter. ``replace_auto`` tries to determine
561
the broken disk(s) on its own and replacing it.
562

    
563

    
564
``/2/instances/[instance_name]/activate-disks``
565
+++++++++++++++++++++++++++++++++++++++++++++++
566

    
567
Activate disks on an instance.
568

    
569
It supports the following commands: ``PUT``.
570

    
571
``PUT``
572
~~~~~~~
573

    
574
Takes the bool parameter ``ignore_size``. When set ignore the recorded
575
size (useful for forcing activation when recorded size is wrong).
576

    
577

    
578
``/2/instances/[instance_name]/deactivate-disks``
579
+++++++++++++++++++++++++++++++++++++++++++++++++
580

    
581
Deactivate disks on an instance.
582

    
583
It supports the following commands: ``PUT``.
584

    
585
``PUT``
586
~~~~~~~
587

    
588
Takes no parameters.
589

    
590

    
591
``/2/instances/[instance_name]/prepare-export``
592
+++++++++++++++++++++++++++++++++++++++++++++++++
593

    
594
Prepares an export of an instance.
595

    
596
It supports the following commands: ``PUT``.
597

    
598
``PUT``
599
~~~~~~~
600

    
601
Takes one parameter, ``mode``, for the export mode. Returns a job ID.
602

    
603

    
604
``/2/instances/[instance_name]/export``
605
+++++++++++++++++++++++++++++++++++++++++++++++++
606

    
607
Exports an instance.
608

    
609
It supports the following commands: ``PUT``.
610

    
611
``PUT``
612
~~~~~~~
613

    
614
Returns a job ID.
615

    
616
Body parameters:
617

    
618
``mode`` (string)
619
  Export mode.
620
``destination`` (required)
621
  Destination information, depends on export mode.
622
``shutdown`` (bool, required)
623
  Whether to shutdown instance before export.
624
``remove_instance`` (bool)
625
  Whether to remove instance after export.
626
``x509_key_name``
627
  Name of X509 key (remote export only).
628
``destination_x509_ca``
629
  Destination X509 CA (remote export only).
630

    
631

    
632
``/2/instances/[instance_name]/migrate``
633
++++++++++++++++++++++++++++++++++++++++
634

    
635
Migrates an instance.
636

    
637
Supports the following commands: ``PUT``.
638

    
639
``PUT``
640
~~~~~~~
641

    
642
Returns a job ID.
643

    
644
Body parameters:
645

    
646
``mode`` (string)
647
  Migration mode.
648
``cleanup`` (bool)
649
  Whether a previously failed migration should be cleaned up.
650

    
651

    
652
``/2/instances/[instance_name]/tags``
653
+++++++++++++++++++++++++++++++++++++
654

    
655
Manages per-instance tags.
656

    
657
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
658

    
659
``GET``
660
~~~~~~~
661

    
662
Returns a list of tags.
663

    
664
Example::
665

    
666
    ["tag1", "tag2", "tag3"]
667

    
668
``PUT``
669
~~~~~~~
670

    
671
Add a set of tags.
672

    
673
The request as a list of strings should be ``PUT`` to this URI. The
674
result will be a job id.
675

    
676
It supports the ``dry-run`` argument.
677

    
678

    
679
``DELETE``
680
~~~~~~~~~~
681

    
682
Delete a tag.
683

    
684
In order to delete a set of tags, the DELETE request should be addressed
685
to URI like::
686

    
687
    /tags?tag=[tag]&tag=[tag]
688

    
689
It supports the ``dry-run`` argument.
690

    
691

    
692
``/2/jobs``
693
+++++++++++
694

    
695
The ``/2/jobs`` resource.
696

    
697
It supports the following commands: ``GET``.
698

    
699
``GET``
700
~~~~~~~
701

    
702
Returns a dictionary of jobs.
703

    
704
Returns: a dictionary with jobs id and uri.
705

    
706
``/2/jobs/[job_id]``
707
++++++++++++++++++++
708

    
709

    
710
Individual job URI.
711

    
712
It supports the following commands: ``GET``, ``DELETE``.
713

    
714
``GET``
715
~~~~~~~
716

    
717
Returns a job status.
718

    
719
Returns: a dictionary with job parameters.
720

    
721
The result includes:
722

    
723
- id: job ID as a number
724
- status: current job status as a string
725
- ops: involved OpCodes as a list of dictionaries for each opcodes in
726
  the job
727
- opstatus: OpCodes status as a list
728
- opresult: OpCodes results as a list
729

    
730
For a successful opcode, the ``opresult`` field corresponding to it will
731
contain the raw result from its :term:`LogicalUnit`. In case an opcode
732
has failed, its element in the opresult list will be a list of two
733
elements:
734

    
735
- first element the error type (the Ganeti internal error name)
736
- second element a list of either one or two elements:
737

    
738
  - the first element is the textual error description
739
  - the second element, if any, will hold an error classification
740

    
741
The error classification is most useful for the ``OpPrereqError``
742
error type - these errors happen before the OpCode has started
743
executing, so it's possible to retry the OpCode without side
744
effects. But whether it make sense to retry depends on the error
745
classification:
746

    
747
``resolver_error``
748
  Resolver errors. This usually means that a name doesn't exist in DNS,
749
  so if it's a case of slow DNS propagation the operation can be retried
750
  later.
751

    
752
``insufficient_resources``
753
  Not enough resources (iallocator failure, disk space, memory,
754
  etc.). If the resources on the cluster increase, the operation might
755
  succeed.
756

    
757
``wrong_input``
758
  Wrong arguments (at syntax level). The operation will not ever be
759
  accepted unless the arguments change.
760

    
761
``wrong_state``
762
  Wrong entity state. For example, live migration has been requested for
763
  a down instance, or instance creation on an offline node. The
764
  operation can be retried once the resource has changed state.
765

    
766
``unknown_entity``
767
  Entity not found. For example, information has been requested for an
768
  unknown instance.
769

    
770
``already_exists``
771
  Entity already exists. For example, instance creation has been
772
  requested for an already-existing instance.
773

    
774
``resource_not_unique``
775
  Resource not unique (e.g. MAC or IP duplication).
776

    
777
``internal_error``
778
  Internal cluster error. For example, a node is unreachable but not set
779
  offline, or the ganeti node daemons are not working, etc. A
780
  ``gnt-cluster verify`` should be run.
781

    
782
``environment_error``
783
  Environment error (e.g. node disk error). A ``gnt-cluster verify``
784
  should be run.
785

    
786
Note that in the above list, by entity we refer to a node or instance,
787
while by a resource we refer to an instance's disk, or NIC, etc.
788

    
789

    
790
``DELETE``
791
~~~~~~~~~~
792

    
793
Cancel a not-yet-started job.
794

    
795

    
796
``/2/jobs/[job_id]/wait``
797
+++++++++++++++++++++++++
798

    
799
``GET``
800
~~~~~~~
801

    
802
Waits for changes on a job. Takes the following body parameters in a
803
dict:
804

    
805
``fields``
806
  The job fields on which to watch for changes.
807

    
808
``previous_job_info``
809
  Previously received field values or None if not yet available.
810

    
811
``previous_log_serial``
812
  Highest log serial number received so far or None if not yet
813
  available.
814

    
815
Returns None if no changes have been detected and a dict with two keys,
816
``job_info`` and ``log_entries`` otherwise.
817

    
818

    
819
``/2/nodes``
820
++++++++++++
821

    
822
Nodes resource.
823

    
824
It supports the following commands: ``GET``.
825

    
826
``GET``
827
~~~~~~~
828

    
829
Returns a list of all nodes.
830

    
831
Example::
832

    
833
    [
834
      {
835
        "id": "node1.example.com",
836
        "uri": "\/nodes\/node1.example.com"
837
      },
838
      {
839
        "id": "node2.example.com",
840
        "uri": "\/nodes\/node2.example.com"
841
      }
842
    ]
843

    
844
If the optional 'bulk' argument is provided and set to 'true' value (i.e
845
'?bulk=1'), the output contains detailed information about nodes as a
846
list.
847

    
848
Example::
849

    
850
    [
851
      {
852
        "pinst_cnt": 1,
853
        "mfree": 31280,
854
        "mtotal": 32763,
855
        "name": "www.example.com",
856
        "tags": [],
857
        "mnode": 512,
858
        "dtotal": 5246208,
859
        "sinst_cnt": 2,
860
        "dfree": 5171712,
861
        "offline": false
862
      },
863
      ...
864
    ]
865

    
866
``/2/nodes/[node_name]``
867
+++++++++++++++++++++++++++++++++
868

    
869
Returns information about a node.
870

    
871
It supports the following commands: ``GET``.
872

    
873
``/2/nodes/[node_name]/evacuate``
874
+++++++++++++++++++++++++++++++++
875

    
876
Evacuates all secondary instances off a node.
877

    
878
It supports the following commands: ``POST``.
879

    
880
``POST``
881
~~~~~~~~
882

    
883
To evacuate a node, either one of the ``iallocator`` or ``remote_node``
884
parameters must be passed::
885

    
886
    evacuate?iallocator=[iallocator]
887
    evacuate?remote_node=[nodeX.example.com]
888

    
889
The result value will be a list, each element being a triple of the job
890
id (for this specific evacuation), the instance which is being evacuated
891
by this job, and the node to which it is being relocated. In case the
892
node is already empty, the result will be an empty list (without any
893
jobs being submitted).
894

    
895
And additional parameter ``early_release`` signifies whether to try to
896
parallelize the evacuations, at the risk of increasing I/O contention
897
and increasing the chances of data loss, if the primary node of any of
898
the instances being evacuated is not fully healthy.
899

    
900
If the dry-run parameter was specified, then the evacuation jobs were
901
not actually submitted, and the job IDs will be null.
902

    
903

    
904
``/2/nodes/[node_name]/migrate``
905
+++++++++++++++++++++++++++++++++
906

    
907
Migrates all primary instances from a node.
908

    
909
It supports the following commands: ``POST``.
910

    
911
``POST``
912
~~~~~~~~
913

    
914
No parameters are required, but the bool parameter ``live`` can be set
915
to use live migration (if available).
916

    
917
    migrate?live=[0|1]
918

    
919
``/2/nodes/[node_name]/role``
920
+++++++++++++++++++++++++++++
921

    
922
Manages node role.
923

    
924
It supports the following commands: ``GET``, ``PUT``.
925

    
926
The role is always one of the following:
927

    
928
  - drained
929
  - master
930
  - master-candidate
931
  - offline
932
  - regular
933

    
934
``GET``
935
~~~~~~~
936

    
937
Returns the current node role.
938

    
939
Example::
940

    
941
    "master-candidate"
942

    
943
``PUT``
944
~~~~~~~
945

    
946
Change the node role.
947

    
948
The request is a string which should be PUT to this URI. The result will
949
be a job id.
950

    
951
It supports the bool ``force`` argument.
952

    
953
``/2/nodes/[node_name]/storage``
954
++++++++++++++++++++++++++++++++
955

    
956
Manages storage units on the node.
957

    
958
``GET``
959
~~~~~~~
960

    
961
Requests a list of storage units on a node. Requires the parameters
962
``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``) and
963
``output_fields``. The result will be a job id, using which the result
964
can be retrieved.
965

    
966
``/2/nodes/[node_name]/storage/modify``
967
+++++++++++++++++++++++++++++++++++++++
968

    
969
Modifies storage units on the node.
970

    
971
``PUT``
972
~~~~~~~
973

    
974
Modifies parameters of storage units on the node. Requires the
975
parameters ``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``)
976
and ``name`` (name of the storage unit).  Parameters can be passed
977
additionally. Currently only ``allocatable`` (bool) is supported. The
978
result will be a job id.
979

    
980
``/2/nodes/[node_name]/storage/repair``
981
+++++++++++++++++++++++++++++++++++++++
982

    
983
Repairs a storage unit on the node.
984

    
985
``PUT``
986
~~~~~~~
987

    
988
Repairs a storage unit on the node. Requires the parameters
989
``storage_type`` (currently only ``lvm-vg`` can be repaired) and
990
``name`` (name of the storage unit). The result will be a job id.
991

    
992
``/2/nodes/[node_name]/tags``
993
+++++++++++++++++++++++++++++
994

    
995
Manages per-node tags.
996

    
997
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
998

    
999
``GET``
1000
~~~~~~~
1001

    
1002
Returns a list of tags.
1003

    
1004
Example::
1005

    
1006
    ["tag1", "tag2", "tag3"]
1007

    
1008
``PUT``
1009
~~~~~~~
1010

    
1011
Add a set of tags.
1012

    
1013
The request as a list of strings should be PUT to this URI. The result
1014
will be a job id.
1015

    
1016
It supports the ``dry-run`` argument.
1017

    
1018
``DELETE``
1019
~~~~~~~~~~
1020

    
1021
Deletes tags.
1022

    
1023
In order to delete a set of tags, the DELETE request should be addressed
1024
to URI like::
1025

    
1026
    /tags?tag=[tag]&tag=[tag]
1027

    
1028
It supports the ``dry-run`` argument.
1029

    
1030

    
1031
``/2/os``
1032
+++++++++
1033

    
1034
OS resource.
1035

    
1036
It supports the following commands: ``GET``.
1037

    
1038
``GET``
1039
~~~~~~~
1040

    
1041
Return a list of all OSes.
1042

    
1043
Can return error 500 in case of a problem. Since this is a costly
1044
operation for Ganeti 2.0, it is not recommended to execute it too often.
1045

    
1046
Example::
1047

    
1048
    ["debian-etch"]
1049

    
1050
``/2/tags``
1051
+++++++++++
1052

    
1053
Manages cluster tags.
1054

    
1055
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
1056

    
1057
``GET``
1058
~~~~~~~
1059

    
1060
Returns the cluster tags.
1061

    
1062
Example::
1063

    
1064
    ["tag1", "tag2", "tag3"]
1065

    
1066
``PUT``
1067
~~~~~~~
1068

    
1069
Adds a set of tags.
1070

    
1071
The request as a list of strings should be PUT to this URI. The result
1072
will be a job id.
1073

    
1074
It supports the ``dry-run`` argument.
1075

    
1076

    
1077
``DELETE``
1078
~~~~~~~~~~
1079

    
1080
Deletes tags.
1081

    
1082
In order to delete a set of tags, the DELETE request should be addressed
1083
to URI like::
1084

    
1085
    /tags?tag=[tag]&tag=[tag]
1086

    
1087
It supports the ``dry-run`` argument.
1088

    
1089

    
1090
``/version``
1091
++++++++++++
1092

    
1093
The version resource.
1094

    
1095
This resource should be used to determine the remote API version and to
1096
adapt clients accordingly.
1097

    
1098
It supports the following commands: ``GET``.
1099

    
1100
``GET``
1101
~~~~~~~
1102

    
1103
Returns the remote API version. Ganeti 1.2 returned ``1`` and Ganeti 2.0
1104
returns ``2``.
1105

    
1106
.. vim: set textwidth=72 :
1107
.. Local Variables:
1108
.. mode: rst
1109
.. fill-column: 72
1110
.. End: