Statistics
| Branch: | Tag: | Revision:

root / doc / rapi.rst @ 6395cebb

History | View | Annotate | Download (22.4 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
``name`` (string, required)
379
  Instance name
380
``disk_template`` (string, required)
381
  Disk template for instance
382
``disks`` (list, required)
383
  List of disk definitions. Example: ``[{"size": 100}, {"size": 5}]``.
384
  Each disk definition must contain a ``size`` value and can contain an
385
  optional ``mode`` value denoting the disk access mode (``ro`` or
386
  ``rw``).
387
``nics`` (list, required)
388
  List of NIC (network interface) definitions. Example: ``[{}, {},
389
  {"ip": "1.2.3.4"}]``. Each NIC definition can contain the optional
390
  values ``ip``, ``mode``, ``link`` and ``bridge``.
391
``os`` (string)
392
  Instance operating system.
393
``force_variant`` (bool)
394
  Whether to force an unknown variant.
395
``pnode`` (string)
396
  Primary node.
397
``snode`` (string)
398
  Secondary node.
399
``src_node`` (string)
400
  Source node for import.
401
``src_path`` (string)
402
  Source directory for import.
403
``start`` (bool)
404
  Whether to start instance after creation.
405
``ip_check`` (bool)
406
  Whether to ensure instance's IP address is inactive.
407
``name_check`` (bool)
408
  Whether to ensure instance's name is resolvable.
409
``file_storage_dir`` (string)
410
  File storage directory.
411
``file_driver`` (string)
412
  File storage driver.
413
``iallocator`` (string)
414
  Instance allocator name.
415
``hypervisor`` (string)
416
  Hypervisor name.
417
``hvparams`` (dict)
418
  Hypervisor parameters, hypervisor-dependent.
419
``beparams``
420
  Backend parameters.
421

    
422

    
423
``/2/instances/[instance_name]``
424
++++++++++++++++++++++++++++++++
425

    
426
Instance-specific resource.
427

    
428
It supports the following commands: ``GET``, ``DELETE``.
429

    
430
``GET``
431
~~~~~~~
432

    
433
Returns information about an instance, similar to the bulk output from
434
the instance list.
435

    
436
``DELETE``
437
~~~~~~~~~~
438

    
439
Deletes an instance.
440

    
441
It supports the ``dry-run`` argument.
442

    
443

    
444
``/2/instances/[instance_name]/info``
445
+++++++++++++++++++++++++++++++++++++++
446

    
447
It supports the following commands: ``GET``.
448

    
449
``GET``
450
~~~~~~~
451

    
452
Requests detailed information about the instance. An optional parameter,
453
``static`` (bool), can be set to return only static information from the
454
configuration without querying the instance's nodes. The result will be
455
a job id.
456

    
457

    
458
``/2/instances/[instance_name]/reboot``
459
+++++++++++++++++++++++++++++++++++++++
460

    
461
Reboots URI for an instance.
462

    
463
It supports the following commands: ``POST``.
464

    
465
``POST``
466
~~~~~~~~
467

    
468
Reboots the instance.
469

    
470
The URI takes optional ``type=soft|hard|full`` and
471
``ignore_secondaries=0|1`` parameters.
472

    
473
``type`` defines the reboot type. ``soft`` is just a normal reboot,
474
without terminating the hypervisor. ``hard`` means full shutdown
475
(including terminating the hypervisor process) and startup again.
476
``full`` is like ``hard`` but also recreates the configuration from
477
ground up as if you would have done a ``gnt-instance shutdown`` and
478
``gnt-instance start`` on it.
479

    
480
``ignore_secondaries`` is a bool argument indicating if we start the
481
instance even if secondary disks are failing.
482

    
483
It supports the ``dry-run`` argument.
484

    
485

    
486
``/2/instances/[instance_name]/shutdown``
487
+++++++++++++++++++++++++++++++++++++++++
488

    
489
Instance shutdown URI.
490

    
491
It supports the following commands: ``PUT``.
492

    
493
``PUT``
494
~~~~~~~
495

    
496
Shutdowns an instance.
497

    
498
It supports the ``dry-run`` argument.
499

    
500

    
501
``/2/instances/[instance_name]/startup``
502
++++++++++++++++++++++++++++++++++++++++
503

    
504
Instance startup URI.
505

    
506
It supports the following commands: ``PUT``.
507

    
508
``PUT``
509
~~~~~~~
510

    
511
Startup an instance.
512

    
513
The URI takes an optional ``force=1|0`` parameter to start the
514
instance even if secondary disks are failing.
515

    
516
It supports the ``dry-run`` argument.
517

    
518
``/2/instances/[instance_name]/reinstall``
519
++++++++++++++++++++++++++++++++++++++++++++++
520

    
521
Installs the operating system again.
522

    
523
It supports the following commands: ``POST``.
524

    
525
``POST``
526
~~~~~~~~
527

    
528
Takes the parameters ``os`` (OS template name) and ``nostartup`` (bool).
529

    
530

    
531
``/2/instances/[instance_name]/replace-disks``
532
++++++++++++++++++++++++++++++++++++++++++++++
533

    
534
Replaces disks on an instance.
535

    
536
It supports the following commands: ``POST``.
537

    
538
``POST``
539
~~~~~~~~
540

    
541
Takes the parameters ``mode`` (one of ``replace_on_primary``,
542
``replace_on_secondary``, ``replace_new_secondary`` or
543
``replace_auto``), ``disks`` (comma separated list of disk indexes),
544
``remote_node`` and ``iallocator``.
545

    
546
Either ``remote_node`` or ``iallocator`` needs to be defined when using
547
``mode=replace_new_secondary``.
548

    
549
``mode`` is a mandatory parameter. ``replace_auto`` tries to determine
550
the broken disk(s) on its own and replacing it.
551

    
552

    
553
``/2/instances/[instance_name]/activate-disks``
554
+++++++++++++++++++++++++++++++++++++++++++++++
555

    
556
Activate disks on an instance.
557

    
558
It supports the following commands: ``PUT``.
559

    
560
``PUT``
561
~~~~~~~
562

    
563
Takes the bool parameter ``ignore_size``. When set ignore the recorded
564
size (useful for forcing activation when recorded size is wrong).
565

    
566

    
567
``/2/instances/[instance_name]/deactivate-disks``
568
+++++++++++++++++++++++++++++++++++++++++++++++++
569

    
570
Deactivate disks on an instance.
571

    
572
It supports the following commands: ``PUT``.
573

    
574
``PUT``
575
~~~~~~~
576

    
577
Takes no parameters.
578

    
579

    
580
``/2/instances/[instance_name]/tags``
581
+++++++++++++++++++++++++++++++++++++
582

    
583
Manages per-instance tags.
584

    
585
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
586

    
587
``GET``
588
~~~~~~~
589

    
590
Returns a list of tags.
591

    
592
Example::
593

    
594
    ["tag1", "tag2", "tag3"]
595

    
596
``PUT``
597
~~~~~~~
598

    
599
Add a set of tags.
600

    
601
The request as a list of strings should be ``PUT`` to this URI. The
602
result will be a job id.
603

    
604
It supports the ``dry-run`` argument.
605

    
606

    
607
``DELETE``
608
~~~~~~~~~~
609

    
610
Delete a tag.
611

    
612
In order to delete a set of tags, the DELETE request should be addressed
613
to URI like::
614

    
615
    /tags?tag=[tag]&tag=[tag]
616

    
617
It supports the ``dry-run`` argument.
618

    
619

    
620
``/2/jobs``
621
+++++++++++
622

    
623
The ``/2/jobs`` resource.
624

    
625
It supports the following commands: ``GET``.
626

    
627
``GET``
628
~~~~~~~
629

    
630
Returns a dictionary of jobs.
631

    
632
Returns: a dictionary with jobs id and uri.
633

    
634
``/2/jobs/[job_id]``
635
++++++++++++++++++++
636

    
637

    
638
Individual job URI.
639

    
640
It supports the following commands: ``GET``, ``DELETE``.
641

    
642
``GET``
643
~~~~~~~
644

    
645
Returns a job status.
646

    
647
Returns: a dictionary with job parameters.
648

    
649
The result includes:
650

    
651
- id: job ID as a number
652
- status: current job status as a string
653
- ops: involved OpCodes as a list of dictionaries for each opcodes in
654
  the job
655
- opstatus: OpCodes status as a list
656
- opresult: OpCodes results as a list
657

    
658
For a successful opcode, the ``opresult`` field corresponding to it will
659
contain the raw result from its :term:`LogicalUnit`. In case an opcode
660
has failed, its element in the opresult list will be a list of two
661
elements:
662

    
663
- first element the error type (the Ganeti internal error name)
664
- second element a list of either one or two elements:
665

    
666
  - the first element is the textual error description
667
  - the second element, if any, will hold an error classification
668

    
669
The error classification is most useful for the ``OpPrereqError``
670
error type - these errors happen before the OpCode has started
671
executing, so it's possible to retry the OpCode without side
672
effects. But whether it make sense to retry depends on the error
673
classification:
674

    
675
``resolver_error``
676
  Resolver errors. This usually means that a name doesn't exist in DNS,
677
  so if it's a case of slow DNS propagation the operation can be retried
678
  later.
679

    
680
``insufficient_resources``
681
  Not enough resources (iallocator failure, disk space, memory,
682
  etc.). If the resources on the cluster increase, the operation might
683
  succeed.
684

    
685
``wrong_input``
686
  Wrong arguments (at syntax level). The operation will not ever be
687
  accepted unless the arguments change.
688

    
689
``wrong_state``
690
  Wrong entity state. For example, live migration has been requested for
691
  a down instance, or instance creation on an offline node. The
692
  operation can be retried once the resource has changed state.
693

    
694
``unknown_entity``
695
  Entity not found. For example, information has been requested for an
696
  unknown instance.
697

    
698
``already_exists``
699
  Entity already exists. For example, instance creation has been
700
  requested for an already-existing instance.
701

    
702
``resource_not_unique``
703
  Resource not unique (e.g. MAC or IP duplication).
704

    
705
``internal_error``
706
  Internal cluster error. For example, a node is unreachable but not set
707
  offline, or the ganeti node daemons are not working, etc. A
708
  ``gnt-cluster verify`` should be run.
709

    
710
``environment_error``
711
  Environment error (e.g. node disk error). A ``gnt-cluster verify``
712
  should be run.
713

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

    
717

    
718
``DELETE``
719
~~~~~~~~~~
720

    
721
Cancel a not-yet-started job.
722

    
723

    
724
``/2/jobs/[job_id]/wait``
725
+++++++++++++++++++++++++
726

    
727
``GET``
728
~~~~~~~
729

    
730
Waits for changes on a job. Takes the following body parameters in a
731
dict:
732

    
733
``fields``
734
  The job fields on which to watch for changes.
735

    
736
``previous_job_info``
737
  Previously received field values or None if not yet available.
738

    
739
``previous_log_serial``
740
  Highest log serial number received so far or None if not yet
741
  available.
742

    
743
Returns None if no changes have been detected and a dict with two keys,
744
``job_info`` and ``log_entries`` otherwise.
745

    
746

    
747
``/2/nodes``
748
++++++++++++
749

    
750
Nodes resource.
751

    
752
It supports the following commands: ``GET``.
753

    
754
``GET``
755
~~~~~~~
756

    
757
Returns a list of all nodes.
758

    
759
Example::
760

    
761
    [
762
      {
763
        "id": "node1.example.com",
764
        "uri": "\/nodes\/node1.example.com"
765
      },
766
      {
767
        "id": "node2.example.com",
768
        "uri": "\/nodes\/node2.example.com"
769
      }
770
    ]
771

    
772
If the optional 'bulk' argument is provided and set to 'true' value (i.e
773
'?bulk=1'), the output contains detailed information about nodes as a
774
list.
775

    
776
Example::
777

    
778
    [
779
      {
780
        "pinst_cnt": 1,
781
        "mfree": 31280,
782
        "mtotal": 32763,
783
        "name": "www.example.com",
784
        "tags": [],
785
        "mnode": 512,
786
        "dtotal": 5246208,
787
        "sinst_cnt": 2,
788
        "dfree": 5171712,
789
        "offline": false
790
      },
791
      ...
792
    ]
793

    
794
``/2/nodes/[node_name]``
795
+++++++++++++++++++++++++++++++++
796

    
797
Returns information about a node.
798

    
799
It supports the following commands: ``GET``.
800

    
801
``/2/nodes/[node_name]/evacuate``
802
+++++++++++++++++++++++++++++++++
803

    
804
Evacuates all secondary instances off a node.
805

    
806
It supports the following commands: ``POST``.
807

    
808
``POST``
809
~~~~~~~~
810

    
811
To evacuate a node, either one of the ``iallocator`` or ``remote_node``
812
parameters must be passed::
813

    
814
    evacuate?iallocator=[iallocator]
815
    evacuate?remote_node=[nodeX.example.com]
816

    
817
``/2/nodes/[node_name]/migrate``
818
+++++++++++++++++++++++++++++++++
819

    
820
Migrates all primary instances from a node.
821

    
822
It supports the following commands: ``POST``.
823

    
824
``POST``
825
~~~~~~~~
826

    
827
No parameters are required, but the bool parameter ``live`` can be set
828
to use live migration (if available).
829

    
830
    migrate?live=[0|1]
831

    
832
``/2/nodes/[node_name]/role``
833
+++++++++++++++++++++++++++++
834

    
835
Manages node role.
836

    
837
It supports the following commands: ``GET``, ``PUT``.
838

    
839
The role is always one of the following:
840

    
841
  - drained
842
  - master
843
  - master-candidate
844
  - offline
845
  - regular
846

    
847
``GET``
848
~~~~~~~
849

    
850
Returns the current node role.
851

    
852
Example::
853

    
854
    "master-candidate"
855

    
856
``PUT``
857
~~~~~~~
858

    
859
Change the node role.
860

    
861
The request is a string which should be PUT to this URI. The result will
862
be a job id.
863

    
864
It supports the bool ``force`` argument.
865

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

    
869
Manages storage units on the node.
870

    
871
``GET``
872
~~~~~~~
873

    
874
Requests a list of storage units on a node. Requires the parameters
875
``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``) and
876
``output_fields``. The result will be a job id, using which the result
877
can be retrieved.
878

    
879
``/2/nodes/[node_name]/storage/modify``
880
+++++++++++++++++++++++++++++++++++++++
881

    
882
Modifies storage units on the node.
883

    
884
``PUT``
885
~~~~~~~
886

    
887
Modifies parameters of storage units on the node. Requires the
888
parameters ``storage_type`` (one of ``file``, ``lvm-pv`` or ``lvm-vg``)
889
and ``name`` (name of the storage unit).  Parameters can be passed
890
additionally. Currently only ``allocatable`` (bool) is supported. The
891
result will be a job id.
892

    
893
``/2/nodes/[node_name]/storage/repair``
894
+++++++++++++++++++++++++++++++++++++++
895

    
896
Repairs a storage unit on the node.
897

    
898
``PUT``
899
~~~~~~~
900

    
901
Repairs a storage unit on the node. Requires the parameters
902
``storage_type`` (currently only ``lvm-vg`` can be repaired) and
903
``name`` (name of the storage unit). The result will be a job id.
904

    
905
``/2/nodes/[node_name]/tags``
906
+++++++++++++++++++++++++++++
907

    
908
Manages per-node tags.
909

    
910
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
911

    
912
``GET``
913
~~~~~~~
914

    
915
Returns a list of tags.
916

    
917
Example::
918

    
919
    ["tag1", "tag2", "tag3"]
920

    
921
``PUT``
922
~~~~~~~
923

    
924
Add a set of tags.
925

    
926
The request as a list of strings should be PUT to this URI. The result
927
will be a job id.
928

    
929
It supports the ``dry-run`` argument.
930

    
931
``DELETE``
932
~~~~~~~~~~
933

    
934
Deletes tags.
935

    
936
In order to delete a set of tags, the DELETE request should be addressed
937
to URI like::
938

    
939
    /tags?tag=[tag]&tag=[tag]
940

    
941
It supports the ``dry-run`` argument.
942

    
943

    
944
``/2/os``
945
+++++++++
946

    
947
OS resource.
948

    
949
It supports the following commands: ``GET``.
950

    
951
``GET``
952
~~~~~~~
953

    
954
Return a list of all OSes.
955

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

    
959
Example::
960

    
961
    ["debian-etch"]
962

    
963
``/2/tags``
964
+++++++++++
965

    
966
Manages cluster tags.
967

    
968
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
969

    
970
``GET``
971
~~~~~~~
972

    
973
Returns the cluster tags.
974

    
975
Example::
976

    
977
    ["tag1", "tag2", "tag3"]
978

    
979
``PUT``
980
~~~~~~~
981

    
982
Adds a set of tags.
983

    
984
The request as a list of strings should be PUT to this URI. The result
985
will be a job id.
986

    
987
It supports the ``dry-run`` argument.
988

    
989

    
990
``DELETE``
991
~~~~~~~~~~
992

    
993
Deletes tags.
994

    
995
In order to delete a set of tags, the DELETE request should be addressed
996
to URI like::
997

    
998
    /tags?tag=[tag]&tag=[tag]
999

    
1000
It supports the ``dry-run`` argument.
1001

    
1002

    
1003
``/version``
1004
++++++++++++
1005

    
1006
The version resource.
1007

    
1008
This resource should be used to determine the remote API version and to
1009
adapt clients accordingly.
1010

    
1011
It supports the following commands: ``GET``.
1012

    
1013
``GET``
1014
~~~~~~~
1015

    
1016
Returns the remote API version. Ganeti 1.2 returned ``1`` and Ganeti 2.0
1017
returns ``2``.
1018

    
1019
.. vim: set textwidth=72 :
1020
.. Local Variables:
1021
.. mode: rst
1022
.. fill-column: 72
1023
.. End: