Statistics
| Branch: | Tag: | Revision:

root / doc / rapi.rst @ dbb4f850

History | View | Annotate | Download (42.5 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
.. _rapi-users:
20

    
21
Users and passwords
22
-------------------
23

    
24
``ganeti-rapi`` reads users and passwords from a file (usually
25
``/var/lib/ganeti/rapi/users``) on startup. Changes to the file will be
26
read automatically.
27

    
28
Lines starting with the hash sign (``#``) are treated as comments. Each
29
line consists of two or three fields separated by whitespace. The first
30
two fields are for username and password. The third field is optional
31
and can be used to specify per-user options (separated by comma without
32
spaces). Available options:
33

    
34
.. pyassert::
35

    
36
  rapi.RAPI_ACCESS_ALL == set([
37
    rapi.RAPI_ACCESS_WRITE,
38
    rapi.RAPI_ACCESS_READ,
39
    ])
40

    
41
:pyeval:`rapi.RAPI_ACCESS_WRITE`
42
  Enables the user to execute operations modifying the cluster. Implies
43
  :pyeval:`rapi.RAPI_ACCESS_READ` access.
44
:pyeval:`rapi.RAPI_ACCESS_READ`
45
  Allow access to operations querying for information.
46

    
47
Passwords can either be written in clear text or as a hash. Clear text
48
passwords may not start with an opening brace (``{``) or they must be
49
prefixed with ``{cleartext}``. To use the hashed form, get the MD5 hash
50
of the string ``$username:Ganeti Remote API:$password`` (e.g. ``echo -n
51
'jack:Ganeti Remote API:abc123' | openssl md5``) [#pwhash]_ and prefix
52
it with ``{ha1}``. Using the scheme prefix for all passwords is
53
recommended. Scheme prefixes are not case sensitive.
54

    
55
Example::
56

    
57
  # Give Jack and Fred read-only access
58
  jack abc123
59
  fred {cleartext}foo555
60

    
61
  # Give write access to an imaginary instance creation script
62
  autocreator xyz789 write
63

    
64
  # Hashed password for Jessica
65
  jessica {HA1}7046452df2cbb530877058712cf17bd4 write
66

    
67
  # Monitoring can query for values
68
  monitoring {HA1}ec018ffe72b8e75bb4d508ed5b6d079c read
69

    
70
  # A user who can read and write (the former is implied by granting
71
  # write access)
72
  superuser {HA1}ec018ffe72b8e75bb4d508ed5b6d079c read,write
73

    
74

    
75
.. [#pwhash] Using the MD5 hash of username, realm and password is
76
   described in :rfc:`2617` ("HTTP Authentication"), sections 3.2.2.2
77
   and 3.3. The reason for using it over another algorithm is forward
78
   compatibility. If ``ganeti-rapi`` were to implement HTTP Digest
79
   authentication in the future, the same hash could be used.
80
   In the current version ``ganeti-rapi``'s realm, ``Ganeti Remote
81
   API``, can only be changed by modifying the source code.
82

    
83

    
84
Protocol
85
--------
86

    
87
The protocol used is JSON_ over HTTP designed after the REST_ principle.
88
HTTP Basic authentication as per :rfc:`2617` is supported.
89

    
90
.. _JSON: http://www.json.org/
91
.. _REST: http://en.wikipedia.org/wiki/Representational_State_Transfer
92

    
93
HTTP requests with a body (e.g. ``PUT`` or ``POST``) require the request
94
header ``Content-type`` be set to ``application/json`` (see :rfc:`2616`
95
(HTTP/1.1), section 7.2.1).
96

    
97

    
98
A note on JSON as used by RAPI
99
++++++++++++++++++++++++++++++
100

    
101
JSON_ as used by Ganeti RAPI does not conform to the specification in
102
:rfc:`4627`. Section 2 defines a JSON text to be either an object
103
(``{"key": "value", …}``) or an array (``[1, 2, 3, …]``). In violation
104
of this RAPI uses plain strings (``"master-candidate"``, ``"1234"``) for
105
some requests or responses. Changing this now would likely break
106
existing clients and cause a lot of trouble.
107

    
108
.. highlight:: ruby
109

    
110
Unlike Python's `JSON encoder and decoder
111
<http://docs.python.org/library/json.html>`_, other programming
112
languages or libraries may only provide a strict implementation, not
113
allowing plain values. For those, responses can usually be wrapped in an
114
array whose first element is then used, e.g. the response ``"1234"``
115
becomes ``["1234"]``. This works equally well for more complex values.
116
Example in Ruby::
117

    
118
  require "json"
119

    
120
  # Insert code to get response here
121
  response = "\"1234\""
122

    
123
  decoded = JSON.parse("[#{response}]").first
124

    
125
Short of modifying the encoder to allow encoding to a less strict
126
format, requests will have to be formatted by hand. Newer RAPI requests
127
already use a dictionary as their input data and shouldn't cause any
128
problems.
129

    
130

    
131
PUT or POST?
132
------------
133

    
134
According to :rfc:`2616` the main difference between PUT and POST is
135
that POST can create new resources but PUT can only create the resource
136
the URI was pointing to on the PUT request.
137

    
138
Unfortunately, due to historic reasons, the Ganeti RAPI library is not
139
consistent with this usage, so just use the methods as documented below
140
for each resource.
141

    
142
For more details have a look in the source code at
143
``lib/rapi/rlib2.py``.
144

    
145

    
146
Generic parameter types
147
-----------------------
148

    
149
A few generic refered parameter types and the values they allow.
150

    
151
``bool``
152
++++++++
153

    
154
A boolean option will accept ``1`` or ``0`` as numbers but not
155
i.e. ``True`` or ``False``.
156

    
157
Generic parameters
158
------------------
159

    
160
A few parameter mean the same thing across all resources which implement
161
it.
162

    
163
``bulk``
164
++++++++
165

    
166
Bulk-mode means that for the resources which usually return just a list
167
of child resources (e.g. ``/2/instances`` which returns just instance
168
names), the output will instead contain detailed data for all these
169
subresources. This is more efficient than query-ing the sub-resources
170
themselves.
171

    
172
``dry-run``
173
+++++++++++
174

    
175
The boolean *dry-run* argument, if provided and set, signals to Ganeti
176
that the job should not be executed, only the pre-execution checks will
177
be done.
178

    
179
This is useful in trying to determine (without guarantees though, as in
180
the meantime the cluster state could have changed) if the operation is
181
likely to succeed or at least start executing.
182

    
183
``force``
184
+++++++++++
185

    
186
Force operation to continue even if it will cause the cluster to become
187
inconsistent (e.g. because there are not enough master candidates).
188

    
189
Parameter details
190
-----------------
191

    
192
Some parameters are not straight forward, so we describe them in details
193
here.
194

    
195
.. _rapi-ipolicy:
196

    
197
``ipolicy``
198
+++++++++++
199

    
200
The instance policy specification is a dict with the following fields:
201

    
202
.. pyassert::
203

    
204
  constants.IPOLICY_ALL_KEYS == set([constants.ISPECS_MIN,
205
                                     constants.ISPECS_MAX,
206
                                     constants.ISPECS_STD,
207
                                     constants.IPOLICY_DTS,
208
                                     constants.IPOLICY_VCPU_RATIO,
209
                                     constants.IPOLICY_SPINDLE_RATIO])
210

    
211

    
212
.. pyassert::
213

    
214
  (set(constants.ISPECS_PARAMETER_TYPES.keys()) ==
215
   set([constants.ISPEC_MEM_SIZE,
216
        constants.ISPEC_DISK_SIZE,
217
        constants.ISPEC_DISK_COUNT,
218
        constants.ISPEC_CPU_COUNT,
219
        constants.ISPEC_NIC_COUNT,
220
        constants.ISPEC_SPINDLE_USE]))
221

    
222
.. |ispec-min| replace:: :pyeval:`constants.ISPECS_MIN`
223
.. |ispec-max| replace:: :pyeval:`constants.ISPECS_MAX`
224
.. |ispec-std| replace:: :pyeval:`constants.ISPECS_STD`
225

    
226

    
227
|ispec-min|, |ispec-max|, |ispec-std|
228
  A sub- `dict` with the following fields, which sets the limit and standard
229
  values of the instances:
230

    
231
  :pyeval:`constants.ISPEC_MEM_SIZE`
232
    The size in MiB of the memory used
233
  :pyeval:`constants.ISPEC_DISK_SIZE`
234
    The size in MiB of the disk used
235
  :pyeval:`constants.ISPEC_DISK_COUNT`
236
    The numbers of disks used
237
  :pyeval:`constants.ISPEC_CPU_COUNT`
238
    The numbers of cpus used
239
  :pyeval:`constants.ISPEC_NIC_COUNT`
240
    The numbers of nics used
241
  :pyeval:`constants.ISPEC_SPINDLE_USE`
242
    The numbers of virtual disk spindles used by this instance. They are
243
    not real in the sense of actual HDD spindles, but useful for
244
    accounting the spindle usage on the residing node
245
:pyeval:`constants.IPOLICY_DTS`
246
  A `list` of disk templates allowed for instances using this policy
247
:pyeval:`constants.IPOLICY_VCPU_RATIO`
248
  Maximum ratio of virtual to physical CPUs (`float`)
249
:pyeval:`constants.IPOLICY_SPINDLE_RATIO`
250
  Maximum ratio of instances to their node's ``spindle_count`` (`float`)
251

    
252
Usage examples
253
--------------
254

    
255
You can access the API using your favorite programming language as long
256
as it supports network connections.
257

    
258
Ganeti RAPI client
259
++++++++++++++++++
260

    
261
Ganeti includes a standalone RAPI client, ``lib/rapi/client.py``.
262

    
263
Shell
264
+++++
265

    
266
.. highlight:: shell-example
267

    
268
Using wget::
269

    
270
   $ wget -q -O - https://%CLUSTERNAME%:5080/2/info
271

    
272
or curl::
273

    
274
  $ curl https://%CLUSTERNAME%:5080/2/info
275

    
276

    
277
Python
278
++++++
279

    
280
.. highlight:: python
281

    
282
::
283

    
284
  import urllib2
285
  f = urllib2.urlopen('https://CLUSTERNAME:5080/2/info')
286
  print f.read()
287

    
288

    
289
JavaScript
290
++++++++++
291

    
292
.. warning:: While it's possible to use JavaScript, it poses several
293
   potential problems, including browser blocking request due to
294
   non-standard ports or different domain names. Fetching the data on
295
   the webserver is easier.
296

    
297
.. highlight:: javascript
298

    
299
::
300

    
301
  var url = 'https://CLUSTERNAME:5080/2/info';
302
  var info;
303
  var xmlreq = new XMLHttpRequest();
304
  xmlreq.onreadystatechange = function () {
305
    if (xmlreq.readyState != 4) return;
306
    if (xmlreq.status == 200) {
307
      info = eval("(" + xmlreq.responseText + ")");
308
      alert(info);
309
    } else {
310
      alert('Error fetching cluster info');
311
    }
312
    xmlreq = null;
313
  };
314
  xmlreq.open('GET', url, true);
315
  xmlreq.send(null);
316

    
317
Resources
318
---------
319

    
320
.. highlight:: javascript
321

    
322
``/``
323
+++++
324

    
325
The root resource. Has no function, but for legacy reasons the ``GET``
326
method is supported.
327

    
328
``/2``
329
++++++
330

    
331
Has no function, but for legacy reasons the ``GET`` method is supported.
332

    
333
``/2/info``
334
+++++++++++
335

    
336
Cluster information resource.
337

    
338
It supports the following commands: ``GET``.
339

    
340
``GET``
341
~~~~~~~
342

    
343
Returns cluster information.
344

    
345
Example::
346

    
347
  {
348
    "config_version": 2000000,
349
    "name": "cluster",
350
    "software_version": "2.0.0~beta2",
351
    "os_api_version": 10,
352
    "export_version": 0,
353
    "candidate_pool_size": 10,
354
    "enabled_hypervisors": [
355
      "fake"
356
    ],
357
    "hvparams": {
358
      "fake": {}
359
     },
360
    "default_hypervisor": "fake",
361
    "master": "node1.example.com",
362
    "architecture": [
363
      "64bit",
364
      "x86_64"
365
    ],
366
    "protocol_version": 20,
367
    "beparams": {
368
      "default": {
369
        "auto_balance": true,
370
        "vcpus": 1,
371
        "memory": 128
372
       }
373
      },
374
375
  }
376

    
377

    
378
``/2/redistribute-config``
379
++++++++++++++++++++++++++
380

    
381
Redistribute configuration to all nodes.
382

    
383
It supports the following commands: ``PUT``.
384

    
385
``PUT``
386
~~~~~~~
387

    
388
Redistribute configuration to all nodes. The result will be a job id.
389

    
390
Job result:
391

    
392
.. opcode_result:: OP_CLUSTER_REDIST_CONF
393

    
394

    
395
``/2/features``
396
+++++++++++++++
397

    
398
``GET``
399
~~~~~~~
400

    
401
Returns a list of features supported by the RAPI server. Available
402
features:
403

    
404
.. pyassert::
405

    
406
  rlib2.ALL_FEATURES == set([rlib2._INST_CREATE_REQV1,
407
                             rlib2._INST_REINSTALL_REQV1,
408
                             rlib2._NODE_MIGRATE_REQV1,
409
                             rlib2._NODE_EVAC_RES1])
410

    
411
:pyeval:`rlib2._INST_CREATE_REQV1`
412
  Instance creation request data version 1 supported
413
:pyeval:`rlib2._INST_REINSTALL_REQV1`
414
  Instance reinstall supports body parameters
415
:pyeval:`rlib2._NODE_MIGRATE_REQV1`
416
  Whether migrating a node (``/2/nodes/[node_name]/migrate``) supports
417
  request body parameters
418
:pyeval:`rlib2._NODE_EVAC_RES1`
419
  Whether evacuating a node (``/2/nodes/[node_name]/evacuate``) returns
420
  a new-style result (see resource description)
421

    
422

    
423
``/2/modify``
424
++++++++++++++++++++++++++++++++++++++++
425

    
426
Modifies cluster parameters.
427

    
428
Supports the following commands: ``PUT``.
429

    
430
``PUT``
431
~~~~~~~
432

    
433
Returns a job ID.
434

    
435
Body parameters:
436

    
437
.. opcode_params:: OP_CLUSTER_SET_PARAMS
438

    
439
Job result:
440

    
441
.. opcode_result:: OP_CLUSTER_SET_PARAMS
442

    
443

    
444
``/2/groups``
445
+++++++++++++
446

    
447
The groups resource.
448

    
449
It supports the following commands: ``GET``, ``POST``.
450

    
451
``GET``
452
~~~~~~~
453

    
454
Returns a list of all existing node groups.
455

    
456
Example::
457

    
458
    [
459
      {
460
        "name": "group1",
461
        "uri": "\/2\/groups\/group1"
462
      },
463
      {
464
        "name": "group2",
465
        "uri": "\/2\/groups\/group2"
466
      }
467
    ]
468

    
469
If the optional bool *bulk* argument is provided and set to a true value
470
(i.e ``?bulk=1``), the output contains detailed information about node
471
groups as a list.
472

    
473
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.G_FIELDS))`.
474

    
475
Example::
476

    
477
    [
478
      {
479
        "name": "group1",
480
        "node_cnt": 2,
481
        "node_list": [
482
          "node1.example.com",
483
          "node2.example.com"
484
        ],
485
        "uuid": "0d7d407c-262e-49af-881a-6a430034bf43",
486
487
      },
488
      {
489
        "name": "group2",
490
        "node_cnt": 1,
491
        "node_list": [
492
          "node3.example.com"
493
        ],
494
        "uuid": "f5a277e7-68f9-44d3-a378-4b25ecb5df5c",
495
496
      },
497
498
    ]
499

    
500
``POST``
501
~~~~~~~~
502

    
503
Creates a node group.
504

    
505
If the optional bool *dry-run* argument is provided, the job will not be
506
actually executed, only the pre-execution checks will be done.
507

    
508
Returns: a job ID that can be used later for polling.
509

    
510
Body parameters:
511

    
512
.. opcode_params:: OP_GROUP_ADD
513

    
514
Earlier versions used a parameter named ``name`` which, while still
515
supported, has been renamed to ``group_name``.
516

    
517
Job result:
518

    
519
.. opcode_result:: OP_GROUP_ADD
520

    
521

    
522
``/2/groups/[group_name]``
523
++++++++++++++++++++++++++
524

    
525
Returns information about a node group.
526

    
527
It supports the following commands: ``GET``, ``DELETE``.
528

    
529
``GET``
530
~~~~~~~
531

    
532
Returns information about a node group, similar to the bulk output from
533
the node group list.
534

    
535
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.G_FIELDS))`.
536

    
537
``DELETE``
538
~~~~~~~~~~
539

    
540
Deletes a node group.
541

    
542
It supports the ``dry-run`` argument.
543

    
544
Job result:
545

    
546
.. opcode_result:: OP_GROUP_REMOVE
547

    
548

    
549
``/2/groups/[group_name]/modify``
550
+++++++++++++++++++++++++++++++++
551

    
552
Modifies the parameters of a node group.
553

    
554
Supports the following commands: ``PUT``.
555

    
556
``PUT``
557
~~~~~~~
558

    
559
Returns a job ID.
560

    
561
Body parameters:
562

    
563
.. opcode_params:: OP_GROUP_SET_PARAMS
564
   :exclude: group_name
565

    
566
Job result:
567

    
568
.. opcode_result:: OP_GROUP_SET_PARAMS
569

    
570

    
571
``/2/groups/[group_name]/rename``
572
+++++++++++++++++++++++++++++++++
573

    
574
Renames a node group.
575

    
576
Supports the following commands: ``PUT``.
577

    
578
``PUT``
579
~~~~~~~
580

    
581
Returns a job ID.
582

    
583
Body parameters:
584

    
585
.. opcode_params:: OP_GROUP_RENAME
586
   :exclude: group_name
587

    
588
Job result:
589

    
590
.. opcode_result:: OP_GROUP_RENAME
591

    
592

    
593
``/2/groups/[group_name]/assign-nodes``
594
+++++++++++++++++++++++++++++++++++++++
595

    
596
Assigns nodes to a group.
597

    
598
Supports the following commands: ``PUT``.
599

    
600
``PUT``
601
~~~~~~~
602

    
603
Returns a job ID. It supports the ``dry-run`` and ``force`` arguments.
604

    
605
Body parameters:
606

    
607
.. opcode_params:: OP_GROUP_ASSIGN_NODES
608
   :exclude: group_name, force, dry_run
609

    
610
Job result:
611

    
612
.. opcode_result:: OP_GROUP_ASSIGN_NODES
613

    
614

    
615
``/2/groups/[group_name]/tags``
616
+++++++++++++++++++++++++++++++
617

    
618
Manages per-nodegroup tags.
619

    
620
Supports the following commands: ``GET``, ``PUT``, ``DELETE``.
621

    
622
``GET``
623
~~~~~~~
624

    
625
Returns a list of tags.
626

    
627
Example::
628

    
629
    ["tag1", "tag2", "tag3"]
630

    
631
``PUT``
632
~~~~~~~
633

    
634
Add a set of tags.
635

    
636
The request as a list of strings should be ``PUT`` to this URI. The
637
result will be a job id.
638

    
639
It supports the ``dry-run`` argument.
640

    
641

    
642
``DELETE``
643
~~~~~~~~~~
644

    
645
Delete a tag.
646

    
647
In order to delete a set of tags, the DELETE request should be addressed
648
to URI like::
649

    
650
    /tags?tag=[tag]&tag=[tag]
651

    
652
It supports the ``dry-run`` argument.
653

    
654

    
655
``/2/networks``
656
+++++++++++++++
657

    
658
The networks resource.
659

    
660
It supports the following commands: ``GET``, ``POST``.
661

    
662
``GET``
663
~~~~~~~
664

    
665
Returns a list of all existing networks.
666

    
667
Example::
668

    
669
    [
670
      {
671
        "name": "network1",
672
        "uri": "\/2\/networks\/network1"
673
      },
674
      {
675
        "name": "network2",
676
        "uri": "\/2\/networks\/network2"
677
      }
678
    ]
679

    
680
If the optional bool *bulk* argument is provided and set to a true value
681
(i.e ``?bulk=1``), the output contains detailed information about networks
682
as a list.
683

    
684
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.NET_FIELDS))`.
685

    
686
Example::
687

    
688
    [
689
      {
690
        'external_reservations': '10.0.0.0, 10.0.0.1, 10.0.0.15',
691
        'free_count': 13,
692
        'gateway': '10.0.0.1',
693
        'gateway6': None,
694
        'group_list': ['default(bridged, prv0)'],
695
        'inst_list': [],
696
        'mac_prefix': None,
697
        'map': 'XX.............X',
698
        'name': 'nat',
699
        'network': '10.0.0.0/28',
700
        'network6': None,
701
        'network_type': 'private',
702
        'reserved_count': 3,
703
        'tags': ['nfdhcpd'],
704
705
      },
706
707
    ]
708

    
709
``POST``
710
~~~~~~~~
711

    
712
Creates a network.
713

    
714
If the optional bool *dry-run* argument is provided, the job will not be
715
actually executed, only the pre-execution checks will be done.
716

    
717
Returns: a job ID that can be used later for polling.
718

    
719
Body parameters:
720

    
721
.. opcode_params:: OP_NETWORK_ADD
722

    
723
Job result:
724

    
725
.. opcode_result:: OP_NETWORK_ADD
726

    
727

    
728
``/2/networks/[network_name]``
729
++++++++++++++++++++++++++++++
730

    
731
Returns information about a network.
732

    
733
It supports the following commands: ``GET``, ``DELETE``.
734

    
735
``GET``
736
~~~~~~~
737

    
738
Returns information about a network, similar to the bulk output from
739
the network list.
740

    
741
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.NET_FIELDS))`.
742

    
743
``DELETE``
744
~~~~~~~~~~
745

    
746
Deletes a network.
747

    
748
It supports the ``dry-run`` argument.
749

    
750
Job result:
751

    
752
.. opcode_result:: OP_NETWORK_REMOVE
753

    
754

    
755
``/2/networks/[network_name]/modify``
756
+++++++++++++++++++++++++++++++++++++
757

    
758
Modifies the parameters of a network.
759

    
760
Supports the following commands: ``PUT``.
761

    
762
``PUT``
763
~~~~~~~
764

    
765
Returns a job ID.
766

    
767
Body parameters:
768

    
769
.. opcode_params:: OP_NETWORK_SET_PARAMS
770

    
771
Job result:
772

    
773
.. opcode_result:: OP_NETWORK_SET_PARAMS
774

    
775

    
776
``/2/networks/[network_name]/connect``
777
++++++++++++++++++++++++++++++++++++++
778

    
779
Connects a network to a nodegroup.
780

    
781
Supports the following commands: ``PUT``.
782

    
783
``PUT``
784
~~~~~~~
785

    
786
Returns a job ID. It supports the ``dry-run`` arguments.
787

    
788
Body parameters:
789

    
790
.. opcode_params:: OP_NETWORK_CONNECT
791

    
792
Job result:
793

    
794
.. opcode_result:: OP_NETWORK_CONNECT
795

    
796

    
797
``/2/networks/[network_name]/disconnect``
798
+++++++++++++++++++++++++++++++++++++++++
799

    
800
Disonnects a network from a nodegroup.
801

    
802
Supports the following commands: ``PUT``.
803

    
804
``PUT``
805
~~~~~~~
806

    
807
Returns a job ID. It supports the ``dry-run`` arguments.
808

    
809
Body parameters:
810

    
811
.. opcode_params:: OP_NETWORK_DISCONNECT
812

    
813
Job result:
814

    
815
.. opcode_result:: OP_NETWORK_DISCONNECT
816

    
817

    
818
``/2/networks/[network_name]/tags``
819
+++++++++++++++++++++++++++++++++++
820

    
821
Manages per-network tags.
822

    
823
Supports the following commands: ``GET``, ``PUT``, ``DELETE``.
824

    
825
``GET``
826
~~~~~~~
827

    
828
Returns a list of tags.
829

    
830
Example::
831

    
832
    ["tag1", "tag2", "tag3"]
833

    
834
``PUT``
835
~~~~~~~
836

    
837
Add a set of tags.
838

    
839
The request as a list of strings should be ``PUT`` to this URI. The
840
result will be a job id.
841

    
842
It supports the ``dry-run`` argument.
843

    
844

    
845
``DELETE``
846
~~~~~~~~~~
847

    
848
Delete a tag.
849

    
850
In order to delete a set of tags, the DELETE request should be addressed
851
to URI like::
852

    
853
    /tags?tag=[tag]&tag=[tag]
854

    
855
It supports the ``dry-run`` argument.
856

    
857

    
858
``/2/instances-multi-alloc``
859
++++++++++++++++++++++++++++
860

    
861
Tries to allocate multiple instances.
862

    
863
It supports the following commands: ``POST``
864

    
865
``POST``
866
~~~~~~~~
867

    
868
The parameters:
869

    
870
.. opcode_params:: OP_INSTANCE_MULTI_ALLOC
871

    
872
Job result:
873

    
874
.. opcode_result:: OP_INSTANCE_MULTI_ALLOC
875

    
876

    
877
``/2/instances``
878
++++++++++++++++
879

    
880
The instances resource.
881

    
882
It supports the following commands: ``GET``, ``POST``.
883

    
884
``GET``
885
~~~~~~~
886

    
887
Returns a list of all available instances.
888

    
889
Example::
890

    
891
    [
892
      {
893
        "name": "web.example.com",
894
        "uri": "\/instances\/web.example.com"
895
      },
896
      {
897
        "name": "mail.example.com",
898
        "uri": "\/instances\/mail.example.com"
899
      }
900
    ]
901

    
902
If the optional bool *bulk* argument is provided and set to a true value
903
(i.e ``?bulk=1``), the output contains detailed information about
904
instances as a list.
905

    
906
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.I_FIELDS))`.
907

    
908
Example::
909

    
910
    [
911
      {
912
        "status": "running",
913
        "disk_usage": 20480,
914
        "nic.bridges": [
915
          "xen-br0"
916
        ],
917
        "name": "web.example.com",
918
        "tags": ["tag1", "tag2"],
919
        "beparams": {
920
          "vcpus": 2,
921
          "memory": 512
922
        },
923
        "disk.sizes": [
924
          20480
925
        ],
926
        "pnode": "node1.example.com",
927
        "nic.macs": ["01:23:45:67:89:01"],
928
        "snodes": ["node2.example.com"],
929
        "disk_template": "drbd",
930
        "admin_state": true,
931
        "os": "debian-etch",
932
        "oper_state": true,
933
934
      },
935
936
    ]
937

    
938

    
939
``POST``
940
~~~~~~~~
941

    
942
Creates an instance.
943

    
944
If the optional bool *dry-run* argument is provided, the job will not be
945
actually executed, only the pre-execution checks will be done. Query-ing
946
the job result will return, in both dry-run and normal case, the list of
947
nodes selected for the instance.
948

    
949
Returns: a job ID that can be used later for polling.
950

    
951
Body parameters:
952

    
953
``__version__`` (int, required)
954
  Must be ``1`` (older Ganeti versions used a different format for
955
  instance creation requests, version ``0``, but that format is no
956
  longer supported)
957

    
958
.. opcode_params:: OP_INSTANCE_CREATE
959

    
960
Earlier versions used parameters named ``name`` and ``os``. These have
961
been replaced by ``instance_name`` and ``os_type`` to match the
962
underlying opcode. The old names can still be used.
963

    
964
Job result:
965

    
966
.. opcode_result:: OP_INSTANCE_CREATE
967

    
968

    
969
``/2/instances/[instance_name]``
970
++++++++++++++++++++++++++++++++
971

    
972
Instance-specific resource.
973

    
974
It supports the following commands: ``GET``, ``DELETE``.
975

    
976
``GET``
977
~~~~~~~
978

    
979
Returns information about an instance, similar to the bulk output from
980
the instance list.
981

    
982
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.I_FIELDS))`.
983

    
984
``DELETE``
985
~~~~~~~~~~
986

    
987
Deletes an instance.
988

    
989
It supports the ``dry-run`` argument.
990

    
991
Job result:
992

    
993
.. opcode_result:: OP_INSTANCE_REMOVE
994

    
995

    
996
``/2/instances/[instance_name]/info``
997
+++++++++++++++++++++++++++++++++++++++
998

    
999
It supports the following commands: ``GET``.
1000

    
1001
``GET``
1002
~~~~~~~
1003

    
1004
Requests detailed information about the instance. An optional parameter,
1005
``static`` (bool), can be set to return only static information from the
1006
configuration without querying the instance's nodes. The result will be
1007
a job id.
1008

    
1009
Job result:
1010

    
1011
.. opcode_result:: OP_INSTANCE_QUERY_DATA
1012

    
1013

    
1014
``/2/instances/[instance_name]/reboot``
1015
+++++++++++++++++++++++++++++++++++++++
1016

    
1017
Reboots URI for an instance.
1018

    
1019
It supports the following commands: ``POST``.
1020

    
1021
``POST``
1022
~~~~~~~~
1023

    
1024
Reboots the instance.
1025

    
1026
The URI takes optional ``type=soft|hard|full`` and
1027
``ignore_secondaries=0|1`` parameters.
1028

    
1029
``type`` defines the reboot type. ``soft`` is just a normal reboot,
1030
without terminating the hypervisor. ``hard`` means full shutdown
1031
(including terminating the hypervisor process) and startup again.
1032
``full`` is like ``hard`` but also recreates the configuration from
1033
ground up as if you would have done a ``gnt-instance shutdown`` and
1034
``gnt-instance start`` on it.
1035

    
1036
``ignore_secondaries`` is a bool argument indicating if we start the
1037
instance even if secondary disks are failing.
1038

    
1039
It supports the ``dry-run`` argument.
1040

    
1041
Job result:
1042

    
1043
.. opcode_result:: OP_INSTANCE_REBOOT
1044

    
1045

    
1046
``/2/instances/[instance_name]/shutdown``
1047
+++++++++++++++++++++++++++++++++++++++++
1048

    
1049
Instance shutdown URI.
1050

    
1051
It supports the following commands: ``PUT``.
1052

    
1053
``PUT``
1054
~~~~~~~
1055

    
1056
Shutdowns an instance.
1057

    
1058
It supports the ``dry-run`` argument.
1059

    
1060
.. opcode_params:: OP_INSTANCE_SHUTDOWN
1061
   :exclude: instance_name, dry_run
1062

    
1063
Job result:
1064

    
1065
.. opcode_result:: OP_INSTANCE_SHUTDOWN
1066

    
1067

    
1068
``/2/instances/[instance_name]/startup``
1069
++++++++++++++++++++++++++++++++++++++++
1070

    
1071
Instance startup URI.
1072

    
1073
It supports the following commands: ``PUT``.
1074

    
1075
``PUT``
1076
~~~~~~~
1077

    
1078
Startup an instance.
1079

    
1080
The URI takes an optional ``force=1|0`` parameter to start the
1081
instance even if secondary disks are failing.
1082

    
1083
It supports the ``dry-run`` argument.
1084

    
1085
Job result:
1086

    
1087
.. opcode_result:: OP_INSTANCE_STARTUP
1088

    
1089

    
1090
``/2/instances/[instance_name]/reinstall``
1091
++++++++++++++++++++++++++++++++++++++++++++++
1092

    
1093
Installs the operating system again.
1094

    
1095
It supports the following commands: ``POST``.
1096

    
1097
``POST``
1098
~~~~~~~~
1099

    
1100
Returns a job ID.
1101

    
1102
Body parameters:
1103

    
1104
``os`` (string, required)
1105
  Instance operating system.
1106
``start`` (bool, defaults to true)
1107
  Whether to start instance after reinstallation.
1108
``osparams`` (dict)
1109
  Dictionary with (temporary) OS parameters.
1110

    
1111
For backwards compatbility, this resource also takes the query
1112
parameters ``os`` (OS template name) and ``nostartup`` (bool). New
1113
clients should use the body parameters.
1114

    
1115

    
1116
``/2/instances/[instance_name]/replace-disks``
1117
++++++++++++++++++++++++++++++++++++++++++++++
1118

    
1119
Replaces disks on an instance.
1120

    
1121
It supports the following commands: ``POST``.
1122

    
1123
``POST``
1124
~~~~~~~~
1125

    
1126
Returns a job ID.
1127

    
1128
Body parameters:
1129

    
1130
.. opcode_params:: OP_INSTANCE_REPLACE_DISKS
1131
   :exclude: instance_name
1132

    
1133
Ganeti 2.4 and below used query parameters. Those are deprecated and
1134
should no longer be used.
1135

    
1136
Job result:
1137

    
1138
.. opcode_result:: OP_INSTANCE_REPLACE_DISKS
1139

    
1140

    
1141
``/2/instances/[instance_name]/activate-disks``
1142
+++++++++++++++++++++++++++++++++++++++++++++++
1143

    
1144
Activate disks on an instance.
1145

    
1146
It supports the following commands: ``PUT``.
1147

    
1148
``PUT``
1149
~~~~~~~
1150

    
1151
Takes the bool parameter ``ignore_size``. When set ignore the recorded
1152
size (useful for forcing activation when recorded size is wrong).
1153

    
1154
Job result:
1155

    
1156
.. opcode_result:: OP_INSTANCE_ACTIVATE_DISKS
1157

    
1158

    
1159
``/2/instances/[instance_name]/deactivate-disks``
1160
+++++++++++++++++++++++++++++++++++++++++++++++++
1161

    
1162
Deactivate disks on an instance.
1163

    
1164
It supports the following commands: ``PUT``.
1165

    
1166
``PUT``
1167
~~~~~~~
1168

    
1169
Takes no parameters.
1170

    
1171
Job result:
1172

    
1173
.. opcode_result:: OP_INSTANCE_DEACTIVATE_DISKS
1174

    
1175

    
1176
``/2/instances/[instance_name]/recreate-disks``
1177
+++++++++++++++++++++++++++++++++++++++++++++++++
1178

    
1179
Recreate disks of an instance. Supports the following commands:
1180
``POST``.
1181

    
1182
``POST``
1183
~~~~~~~~
1184

    
1185
Returns a job ID.
1186

    
1187
Body parameters:
1188

    
1189
.. opcode_params:: OP_INSTANCE_RECREATE_DISKS
1190
   :exclude: instance_name
1191

    
1192
Job result:
1193

    
1194
.. opcode_result:: OP_INSTANCE_RECREATE_DISKS
1195

    
1196

    
1197
``/2/instances/[instance_name]/disk/[disk_index]/grow``
1198
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
1199

    
1200
Grows one disk of an instance.
1201

    
1202
Supports the following commands: ``POST``.
1203

    
1204
``POST``
1205
~~~~~~~~
1206

    
1207
Returns a job ID.
1208

    
1209
Body parameters:
1210

    
1211
.. opcode_params:: OP_INSTANCE_GROW_DISK
1212
   :exclude: instance_name, disk
1213

    
1214
Job result:
1215

    
1216
.. opcode_result:: OP_INSTANCE_GROW_DISK
1217

    
1218

    
1219
``/2/instances/[instance_name]/prepare-export``
1220
+++++++++++++++++++++++++++++++++++++++++++++++++
1221

    
1222
Prepares an export of an instance.
1223

    
1224
It supports the following commands: ``PUT``.
1225

    
1226
``PUT``
1227
~~~~~~~
1228

    
1229
Takes one parameter, ``mode``, for the export mode. Returns a job ID.
1230

    
1231
Job result:
1232

    
1233
.. opcode_result:: OP_BACKUP_PREPARE
1234

    
1235

    
1236
``/2/instances/[instance_name]/export``
1237
+++++++++++++++++++++++++++++++++++++++++++++++++
1238

    
1239
Exports an instance.
1240

    
1241
It supports the following commands: ``PUT``.
1242

    
1243
``PUT``
1244
~~~~~~~
1245

    
1246
Returns a job ID.
1247

    
1248
Body parameters:
1249

    
1250
.. opcode_params:: OP_BACKUP_EXPORT
1251
   :exclude: instance_name
1252
   :alias: target_node=destination
1253

    
1254
Job result:
1255

    
1256
.. opcode_result:: OP_BACKUP_EXPORT
1257

    
1258

    
1259
``/2/instances/[instance_name]/migrate``
1260
++++++++++++++++++++++++++++++++++++++++
1261

    
1262
Migrates an instance.
1263

    
1264
Supports the following commands: ``PUT``.
1265

    
1266
``PUT``
1267
~~~~~~~
1268

    
1269
Returns a job ID.
1270

    
1271
Body parameters:
1272

    
1273
.. opcode_params:: OP_INSTANCE_MIGRATE
1274
   :exclude: instance_name, live
1275

    
1276
Job result:
1277

    
1278
.. opcode_result:: OP_INSTANCE_MIGRATE
1279

    
1280

    
1281
``/2/instances/[instance_name]/failover``
1282
+++++++++++++++++++++++++++++++++++++++++
1283

    
1284
Does a failover of an instance.
1285

    
1286
Supports the following commands: ``PUT``.
1287

    
1288
``PUT``
1289
~~~~~~~
1290

    
1291
Returns a job ID.
1292

    
1293
Body parameters:
1294

    
1295
.. opcode_params:: OP_INSTANCE_FAILOVER
1296
   :exclude: instance_name
1297

    
1298
Job result:
1299

    
1300
.. opcode_result:: OP_INSTANCE_FAILOVER
1301

    
1302

    
1303
``/2/instances/[instance_name]/rename``
1304
++++++++++++++++++++++++++++++++++++++++
1305

    
1306
Renames an instance.
1307

    
1308
Supports the following commands: ``PUT``.
1309

    
1310
``PUT``
1311
~~~~~~~
1312

    
1313
Returns a job ID.
1314

    
1315
Body parameters:
1316

    
1317
.. opcode_params:: OP_INSTANCE_RENAME
1318
   :exclude: instance_name
1319

    
1320
Job result:
1321

    
1322
.. opcode_result:: OP_INSTANCE_RENAME
1323

    
1324

    
1325
``/2/instances/[instance_name]/modify``
1326
++++++++++++++++++++++++++++++++++++++++
1327

    
1328
Modifies an instance.
1329

    
1330
Supports the following commands: ``PUT``.
1331

    
1332
``PUT``
1333
~~~~~~~
1334

    
1335
Returns a job ID.
1336

    
1337
Body parameters:
1338

    
1339
.. opcode_params:: OP_INSTANCE_SET_PARAMS
1340
   :exclude: instance_name
1341

    
1342
Job result:
1343

    
1344
.. opcode_result:: OP_INSTANCE_SET_PARAMS
1345

    
1346

    
1347
``/2/instances/[instance_name]/console``
1348
++++++++++++++++++++++++++++++++++++++++
1349

    
1350
Request information for connecting to instance's console.
1351

    
1352
.. pyassert::
1353

    
1354
  not (hasattr(rlib2.R_2_instances_name_console, "PUT") or
1355
       hasattr(rlib2.R_2_instances_name_console, "POST") or
1356
       hasattr(rlib2.R_2_instances_name_console, "DELETE"))
1357

    
1358
Supports the following commands: ``GET``. Requires authentication with
1359
one of the following options:
1360
:pyeval:`utils.CommaJoin(rlib2.R_2_instances_name_console.GET_ACCESS)`.
1361

    
1362
``GET``
1363
~~~~~~~
1364

    
1365
Returns a dictionary containing information about the instance's
1366
console. Contained keys:
1367

    
1368
.. pyassert::
1369

    
1370
   constants.CONS_ALL == frozenset([
1371
     constants.CONS_MESSAGE,
1372
     constants.CONS_SSH,
1373
     constants.CONS_VNC,
1374
     constants.CONS_SPICE,
1375
     ])
1376

    
1377
``instance``
1378
  Instance name
1379
``kind``
1380
  Console type, one of :pyeval:`constants.CONS_SSH`,
1381
  :pyeval:`constants.CONS_VNC`, :pyeval:`constants.CONS_SPICE`
1382
  or :pyeval:`constants.CONS_MESSAGE`
1383
``message``
1384
  Message to display (:pyeval:`constants.CONS_MESSAGE` type only)
1385
``host``
1386
  Host to connect to (:pyeval:`constants.CONS_SSH`,
1387
  :pyeval:`constants.CONS_VNC` or :pyeval:`constants.CONS_SPICE` only)
1388
``port``
1389
  TCP port to connect to (:pyeval:`constants.CONS_VNC` or
1390
  :pyeval:`constants.CONS_SPICE` only)
1391
``user``
1392
  Username to use (:pyeval:`constants.CONS_SSH` only)
1393
``command``
1394
  Command to execute on machine (:pyeval:`constants.CONS_SSH` only)
1395
``display``
1396
  VNC display number (:pyeval:`constants.CONS_VNC` only)
1397

    
1398

    
1399
``/2/instances/[instance_name]/tags``
1400
+++++++++++++++++++++++++++++++++++++
1401

    
1402
Manages per-instance tags.
1403

    
1404
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
1405

    
1406
``GET``
1407
~~~~~~~
1408

    
1409
Returns a list of tags.
1410

    
1411
Example::
1412

    
1413
    ["tag1", "tag2", "tag3"]
1414

    
1415
``PUT``
1416
~~~~~~~
1417

    
1418
Add a set of tags.
1419

    
1420
The request as a list of strings should be ``PUT`` to this URI. The
1421
result will be a job id.
1422

    
1423
It supports the ``dry-run`` argument.
1424

    
1425

    
1426
``DELETE``
1427
~~~~~~~~~~
1428

    
1429
Delete a tag.
1430

    
1431
In order to delete a set of tags, the DELETE request should be addressed
1432
to URI like::
1433

    
1434
    /tags?tag=[tag]&tag=[tag]
1435

    
1436
It supports the ``dry-run`` argument.
1437

    
1438

    
1439
``/2/jobs``
1440
+++++++++++
1441

    
1442
The ``/2/jobs`` resource.
1443

    
1444
It supports the following commands: ``GET``.
1445

    
1446
``GET``
1447
~~~~~~~
1448

    
1449
Returns a dictionary of jobs.
1450

    
1451
Returns: a dictionary with jobs id and uri.
1452

    
1453
If the optional bool *bulk* argument is provided and set to a true value
1454
(i.e. ``?bulk=1``), the output contains detailed information about jobs
1455
as a list.
1456

    
1457
Returned fields for bulk requests (unlike other bulk requests, these
1458
fields are not the same as for per-job requests):
1459
:pyeval:`utils.CommaJoin(sorted(rlib2.J_FIELDS_BULK))`.
1460

    
1461
``/2/jobs/[job_id]``
1462
++++++++++++++++++++
1463

    
1464

    
1465
Individual job URI.
1466

    
1467
It supports the following commands: ``GET``, ``DELETE``.
1468

    
1469
``GET``
1470
~~~~~~~
1471

    
1472
Returns a dictionary with job parameters, containing the fields
1473
:pyeval:`utils.CommaJoin(sorted(rlib2.J_FIELDS))`.
1474

    
1475
The result includes:
1476

    
1477
- id: job ID as a number
1478
- status: current job status as a string
1479
- ops: involved OpCodes as a list of dictionaries for each opcodes in
1480
  the job
1481
- opstatus: OpCodes status as a list
1482
- opresult: OpCodes results as a list
1483

    
1484
For a successful opcode, the ``opresult`` field corresponding to it will
1485
contain the raw result from its :term:`LogicalUnit`. In case an opcode
1486
has failed, its element in the opresult list will be a list of two
1487
elements:
1488

    
1489
- first element the error type (the Ganeti internal error name)
1490
- second element a list of either one or two elements:
1491

    
1492
  - the first element is the textual error description
1493
  - the second element, if any, will hold an error classification
1494

    
1495
The error classification is most useful for the ``OpPrereqError``
1496
error type - these errors happen before the OpCode has started
1497
executing, so it's possible to retry the OpCode without side
1498
effects. But whether it make sense to retry depends on the error
1499
classification:
1500

    
1501
.. pyassert::
1502

    
1503
   errors.ECODE_ALL == set([errors.ECODE_RESOLVER, errors.ECODE_NORES,
1504
     errors.ECODE_INVAL, errors.ECODE_STATE, errors.ECODE_NOENT,
1505
     errors.ECODE_EXISTS, errors.ECODE_NOTUNIQUE, errors.ECODE_FAULT,
1506
     errors.ECODE_ENVIRON, errors.ECODE_TEMP_NORES])
1507

    
1508
:pyeval:`errors.ECODE_RESOLVER`
1509
  Resolver errors. This usually means that a name doesn't exist in DNS,
1510
  so if it's a case of slow DNS propagation the operation can be retried
1511
  later.
1512

    
1513
:pyeval:`errors.ECODE_NORES`
1514
  Not enough resources (iallocator failure, disk space, memory,
1515
  etc.). If the resources on the cluster increase, the operation might
1516
  succeed.
1517

    
1518
:pyeval:`errors.ECODE_TEMP_NORES`
1519
  Simliar to :pyeval:`errors.ECODE_NORES`, but indicating the operation
1520
  should be attempted again after some time.
1521

    
1522
:pyeval:`errors.ECODE_INVAL`
1523
  Wrong arguments (at syntax level). The operation will not ever be
1524
  accepted unless the arguments change.
1525

    
1526
:pyeval:`errors.ECODE_STATE`
1527
  Wrong entity state. For example, live migration has been requested for
1528
  a down instance, or instance creation on an offline node. The
1529
  operation can be retried once the resource has changed state.
1530

    
1531
:pyeval:`errors.ECODE_NOENT`
1532
  Entity not found. For example, information has been requested for an
1533
  unknown instance.
1534

    
1535
:pyeval:`errors.ECODE_EXISTS`
1536
  Entity already exists. For example, instance creation has been
1537
  requested for an already-existing instance.
1538

    
1539
:pyeval:`errors.ECODE_NOTUNIQUE`
1540
  Resource not unique (e.g. MAC or IP duplication).
1541

    
1542
:pyeval:`errors.ECODE_FAULT`
1543
  Internal cluster error. For example, a node is unreachable but not set
1544
  offline, or the ganeti node daemons are not working, etc. A
1545
  ``gnt-cluster verify`` should be run.
1546

    
1547
:pyeval:`errors.ECODE_ENVIRON`
1548
  Environment error (e.g. node disk error). A ``gnt-cluster verify``
1549
  should be run.
1550

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

    
1554

    
1555
``DELETE``
1556
~~~~~~~~~~
1557

    
1558
Cancel a not-yet-started job.
1559

    
1560

    
1561
``/2/jobs/[job_id]/wait``
1562
+++++++++++++++++++++++++
1563

    
1564
``GET``
1565
~~~~~~~
1566

    
1567
Waits for changes on a job. Takes the following body parameters in a
1568
dict:
1569

    
1570
``fields``
1571
  The job fields on which to watch for changes
1572

    
1573
``previous_job_info``
1574
  Previously received field values or None if not yet available
1575

    
1576
``previous_log_serial``
1577
  Highest log serial number received so far or None if not yet
1578
  available
1579

    
1580
Returns None if no changes have been detected and a dict with two keys,
1581
``job_info`` and ``log_entries`` otherwise.
1582

    
1583

    
1584
``/2/nodes``
1585
++++++++++++
1586

    
1587
Nodes resource.
1588

    
1589
It supports the following commands: ``GET``.
1590

    
1591
``GET``
1592
~~~~~~~
1593

    
1594
Returns a list of all nodes.
1595

    
1596
Example::
1597

    
1598
    [
1599
      {
1600
        "id": "node1.example.com",
1601
        "uri": "\/nodes\/node1.example.com"
1602
      },
1603
      {
1604
        "id": "node2.example.com",
1605
        "uri": "\/nodes\/node2.example.com"
1606
      }
1607
    ]
1608

    
1609
If the optional bool *bulk* argument is provided and set to a true value
1610
(i.e ``?bulk=1``), the output contains detailed information about nodes
1611
as a list.
1612

    
1613
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.N_FIELDS))`.
1614

    
1615
Example::
1616

    
1617
    [
1618
      {
1619
        "pinst_cnt": 1,
1620
        "mfree": 31280,
1621
        "mtotal": 32763,
1622
        "name": "www.example.com",
1623
        "tags": [],
1624
        "mnode": 512,
1625
        "dtotal": 5246208,
1626
        "sinst_cnt": 2,
1627
        "dfree": 5171712,
1628
        "offline": false,
1629
1630
      },
1631
1632
    ]
1633

    
1634
``/2/nodes/[node_name]``
1635
+++++++++++++++++++++++++++++++++
1636

    
1637
Returns information about a node.
1638

    
1639
It supports the following commands: ``GET``.
1640

    
1641
Returned fields: :pyeval:`utils.CommaJoin(sorted(rlib2.N_FIELDS))`.
1642

    
1643
``/2/nodes/[node_name]/powercycle``
1644
+++++++++++++++++++++++++++++++++++
1645

    
1646
Powercycles a node. Supports the following commands: ``POST``.
1647

    
1648
``POST``
1649
~~~~~~~~
1650

    
1651
Returns a job ID.
1652

    
1653
Job result:
1654

    
1655
.. opcode_result:: OP_NODE_POWERCYCLE
1656

    
1657

    
1658
``/2/nodes/[node_name]/evacuate``
1659
+++++++++++++++++++++++++++++++++
1660

    
1661
Evacuates instances off a node.
1662

    
1663
It supports the following commands: ``POST``.
1664

    
1665
``POST``
1666
~~~~~~~~
1667

    
1668
Returns a job ID. The result of the job will contain the IDs of the
1669
individual jobs submitted to evacuate the node.
1670

    
1671
Body parameters:
1672

    
1673
.. opcode_params:: OP_NODE_EVACUATE
1674
   :exclude: nodes
1675

    
1676
Up to and including Ganeti 2.4 query arguments were used. Those are no
1677
longer supported. The new request can be detected by the presence of the
1678
:pyeval:`rlib2._NODE_EVAC_RES1` feature string.
1679

    
1680
Job result:
1681

    
1682
.. opcode_result:: OP_NODE_EVACUATE
1683

    
1684

    
1685
``/2/nodes/[node_name]/migrate``
1686
+++++++++++++++++++++++++++++++++
1687

    
1688
Migrates all primary instances from a node.
1689

    
1690
It supports the following commands: ``POST``.
1691

    
1692
``POST``
1693
~~~~~~~~
1694

    
1695
If no mode is explicitly specified, each instances' hypervisor default
1696
migration mode will be used. Body parameters:
1697

    
1698
.. opcode_params:: OP_NODE_MIGRATE
1699
   :exclude: node_name
1700

    
1701
The query arguments used up to and including Ganeti 2.4 are deprecated
1702
and should no longer be used. The new request format can be detected by
1703
the presence of the :pyeval:`rlib2._NODE_MIGRATE_REQV1` feature string.
1704

    
1705
Job result:
1706

    
1707
.. opcode_result:: OP_NODE_MIGRATE
1708

    
1709

    
1710
``/2/nodes/[node_name]/role``
1711
+++++++++++++++++++++++++++++
1712

    
1713
Manages node role.
1714

    
1715
It supports the following commands: ``GET``, ``PUT``.
1716

    
1717
The role is always one of the following:
1718

    
1719
  - drained
1720
  - master-candidate
1721
  - offline
1722
  - regular
1723

    
1724
Note that the 'master' role is a special, and currently it can't be
1725
modified via RAPI, only via the command line (``gnt-cluster
1726
master-failover``).
1727

    
1728
``GET``
1729
~~~~~~~
1730

    
1731
Returns the current node role.
1732

    
1733
Example::
1734

    
1735
    "master-candidate"
1736

    
1737
``PUT``
1738
~~~~~~~
1739

    
1740
Change the node role.
1741

    
1742
The request is a string which should be PUT to this URI. The result will
1743
be a job id.
1744

    
1745
It supports the bool ``force`` argument.
1746

    
1747
Job result:
1748

    
1749
.. opcode_result:: OP_NODE_SET_PARAMS
1750

    
1751

    
1752
``/2/nodes/[node_name]/modify``
1753
+++++++++++++++++++++++++++++++
1754

    
1755
Modifies the parameters of a node. Supports the following commands:
1756
``POST``.
1757

    
1758
``POST``
1759
~~~~~~~~
1760

    
1761
Returns a job ID.
1762

    
1763
Body parameters:
1764

    
1765
.. opcode_params:: OP_NODE_SET_PARAMS
1766
   :exclude: node_name
1767

    
1768
Job result:
1769

    
1770
.. opcode_result:: OP_NODE_SET_PARAMS
1771

    
1772

    
1773
``/2/nodes/[node_name]/storage``
1774
++++++++++++++++++++++++++++++++
1775

    
1776
Manages storage units on the node.
1777

    
1778
``GET``
1779
~~~~~~~
1780

    
1781
.. pyassert::
1782

    
1783
   constants.VALID_STORAGE_TYPES == set([constants.ST_FILE,
1784
                                         constants.ST_LVM_PV,
1785
                                         constants.ST_LVM_VG])
1786

    
1787
Requests a list of storage units on a node. Requires the parameters
1788
``storage_type`` (one of :pyeval:`constants.ST_FILE`,
1789
:pyeval:`constants.ST_LVM_PV` or :pyeval:`constants.ST_LVM_VG`) and
1790
``output_fields``. The result will be a job id, using which the result
1791
can be retrieved.
1792

    
1793
``/2/nodes/[node_name]/storage/modify``
1794
+++++++++++++++++++++++++++++++++++++++
1795

    
1796
Modifies storage units on the node.
1797

    
1798
``PUT``
1799
~~~~~~~
1800

    
1801
Modifies parameters of storage units on the node. Requires the
1802
parameters ``storage_type`` (one of :pyeval:`constants.ST_FILE`,
1803
:pyeval:`constants.ST_LVM_PV` or :pyeval:`constants.ST_LVM_VG`)
1804
and ``name`` (name of the storage unit).  Parameters can be passed
1805
additionally. Currently only :pyeval:`constants.SF_ALLOCATABLE` (bool)
1806
is supported. The result will be a job id.
1807

    
1808
Job result:
1809

    
1810
.. opcode_result:: OP_NODE_MODIFY_STORAGE
1811

    
1812

    
1813
``/2/nodes/[node_name]/storage/repair``
1814
+++++++++++++++++++++++++++++++++++++++
1815

    
1816
Repairs a storage unit on the node.
1817

    
1818
``PUT``
1819
~~~~~~~
1820

    
1821
.. pyassert::
1822

    
1823
   constants.VALID_STORAGE_OPERATIONS == {
1824
    constants.ST_LVM_VG: set([constants.SO_FIX_CONSISTENCY]),
1825
    }
1826

    
1827
Repairs a storage unit on the node. Requires the parameters
1828
``storage_type`` (currently only :pyeval:`constants.ST_LVM_VG` can be
1829
repaired) and ``name`` (name of the storage unit). The result will be a
1830
job id.
1831

    
1832
Job result:
1833

    
1834
.. opcode_result:: OP_REPAIR_NODE_STORAGE
1835

    
1836

    
1837
``/2/nodes/[node_name]/tags``
1838
+++++++++++++++++++++++++++++
1839

    
1840
Manages per-node tags.
1841

    
1842
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
1843

    
1844
``GET``
1845
~~~~~~~
1846

    
1847
Returns a list of tags.
1848

    
1849
Example::
1850

    
1851
    ["tag1", "tag2", "tag3"]
1852

    
1853
``PUT``
1854
~~~~~~~
1855

    
1856
Add a set of tags.
1857

    
1858
The request as a list of strings should be PUT to this URI. The result
1859
will be a job id.
1860

    
1861
It supports the ``dry-run`` argument.
1862

    
1863
``DELETE``
1864
~~~~~~~~~~
1865

    
1866
Deletes tags.
1867

    
1868
In order to delete a set of tags, the DELETE request should be addressed
1869
to URI like::
1870

    
1871
    /tags?tag=[tag]&tag=[tag]
1872

    
1873
It supports the ``dry-run`` argument.
1874

    
1875

    
1876
``/2/query/[resource]``
1877
+++++++++++++++++++++++
1878

    
1879
Requests resource information. Available fields can be found in man
1880
pages and using ``/2/query/[resource]/fields``. The resource is one of
1881
:pyeval:`utils.CommaJoin(constants.QR_VIA_RAPI)`. See the :doc:`query2
1882
design document <design-query2>` for more details.
1883

    
1884
.. pyassert::
1885

    
1886
  (rlib2.R_2_query.GET_ACCESS == rlib2.R_2_query.PUT_ACCESS and
1887
   not (hasattr(rlib2.R_2_query, "POST") or
1888
        hasattr(rlib2.R_2_query, "DELETE")))
1889

    
1890
Supports the following commands: ``GET``, ``PUT``. Requires
1891
authentication with one of the following options:
1892
:pyeval:`utils.CommaJoin(rlib2.R_2_query.GET_ACCESS)`.
1893

    
1894
``GET``
1895
~~~~~~~
1896

    
1897
Returns list of included fields and actual data. Takes a query parameter
1898
named "fields", containing a comma-separated list of field names. Does
1899
not support filtering.
1900

    
1901
``PUT``
1902
~~~~~~~
1903

    
1904
Returns list of included fields and actual data. The list of requested
1905
fields can either be given as the query parameter "fields" or as a body
1906
parameter with the same name. The optional body parameter "filter" can
1907
be given and must be either ``null`` or a list containing filter
1908
operators.
1909

    
1910

    
1911
``/2/query/[resource]/fields``
1912
++++++++++++++++++++++++++++++
1913

    
1914
Request list of available fields for a resource. The resource is one of
1915
:pyeval:`utils.CommaJoin(constants.QR_VIA_RAPI)`. See the
1916
:doc:`query2 design document <design-query2>` for more details.
1917

    
1918
Supports the following commands: ``GET``.
1919

    
1920
``GET``
1921
~~~~~~~
1922

    
1923
Returns a list of field descriptions for available fields. Takes an
1924
optional query parameter named "fields", containing a comma-separated
1925
list of field names.
1926

    
1927

    
1928
``/2/os``
1929
+++++++++
1930

    
1931
OS resource.
1932

    
1933
It supports the following commands: ``GET``.
1934

    
1935
``GET``
1936
~~~~~~~
1937

    
1938
Return a list of all OSes.
1939

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

    
1943
Example::
1944

    
1945
    ["debian-etch"]
1946

    
1947
``/2/tags``
1948
+++++++++++
1949

    
1950
Manages cluster tags.
1951

    
1952
It supports the following commands: ``GET``, ``PUT``, ``DELETE``.
1953

    
1954
``GET``
1955
~~~~~~~
1956

    
1957
Returns the cluster tags.
1958

    
1959
Example::
1960

    
1961
    ["tag1", "tag2", "tag3"]
1962

    
1963
``PUT``
1964
~~~~~~~
1965

    
1966
Adds a set of tags.
1967

    
1968
The request as a list of strings should be PUT to this URI. The result
1969
will be a job id.
1970

    
1971
It supports the ``dry-run`` argument.
1972

    
1973

    
1974
``DELETE``
1975
~~~~~~~~~~
1976

    
1977
Deletes tags.
1978

    
1979
In order to delete a set of tags, the DELETE request should be addressed
1980
to URI like::
1981

    
1982
    /tags?tag=[tag]&tag=[tag]
1983

    
1984
It supports the ``dry-run`` argument.
1985

    
1986

    
1987
``/version``
1988
++++++++++++
1989

    
1990
The version resource.
1991

    
1992
This resource should be used to determine the remote API version and to
1993
adapt clients accordingly.
1994

    
1995
It supports the following commands: ``GET``.
1996

    
1997
``GET``
1998
~~~~~~~
1999

    
2000
Returns the remote API version. Ganeti 1.2 returned ``1`` and Ganeti 2.0
2001
returns ``2``.
2002

    
2003
.. vim: set textwidth=72 :
2004
.. Local Variables:
2005
.. mode: rst
2006
.. fill-column: 72
2007
.. End: