Statistics
| Branch: | Tag: | Revision:

root / lib / rpc_defs.py @ a303027b

History | View | Annotate | Download (27 kB)

1
#
2
#
3

    
4
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2014 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21
"""RPC definitions for communication between master and node daemons.
22

23
RPC definition fields:
24

25
  - Name as string
26
  - L{SINGLE} for single-node calls, L{MULTI} for multi-node
27
  - Name resolver option(s), can be callable receiving all arguments in a tuple
28
  - Timeout (e.g. L{constants.RPC_TMO_NORMAL}), or callback receiving all
29
    arguments in a tuple to calculate timeout
30
  - List of arguments as tuples
31

32
    - Name as string
33
    - Argument kind used for encoding/decoding
34
    - Description for docstring (can be C{None})
35

36
  - Custom body encoder (e.g. for preparing per-node bodies)
37
  - Return value wrapper (e.g. for deserializing into L{objects}-based objects)
38
  - Short call description for docstring
39

40
"""
41

    
42
from ganeti import constants
43
from ganeti import utils
44
from ganeti import objects
45

    
46

    
47
# Guidelines for choosing timeouts:
48
# - call used during watcher: timeout of 1min, constants.RPC_TMO_URGENT
49
# - trivial (but be sure it is trivial)
50
#     (e.g. reading a file): 5min, constants.RPC_TMO_FAST
51
# - other calls: 15 min, constants.RPC_TMO_NORMAL
52
# - special calls (instance add, etc.):
53
#     either constants.RPC_TMO_SLOW (1h) or huge timeouts
54

    
55
SINGLE = "single-node"
56
MULTI = "multi-node"
57

    
58
ACCEPT_OFFLINE_NODE = object()
59

    
60
# Constants for encoding/decoding
61
(ED_OBJECT_DICT,
62
 ED_OBJECT_DICT_LIST,
63
 ED_INST_DICT,
64
 ED_INST_DICT_HVP_BEP_DP,
65
 ED_NODE_TO_DISK_DICT_DP,
66
 ED_INST_DICT_OSP_DP,
67
 ED_IMPEXP_IO,
68
 ED_FILE_DETAILS,
69
 ED_FINALIZE_EXPORT_DISKS,
70
 ED_COMPRESS,
71
 ED_BLOCKDEV_RENAME,
72
 ED_DISKS_DICT_DP,
73
 ED_MULTI_DISKS_DICT_DP,
74
 ED_SINGLE_DISK_DICT_DP,
75
 ED_NIC_DICT,
76
 ED_DEVICE_DICT) = range(1, 17)
77

    
78

    
79
def _Prepare(calls):
80
  """Converts list of calls to dictionary.
81

82
  """
83
  return utils.SequenceToDict(calls)
84

    
85

    
86
def _MigrationStatusPostProc(result):
87
  """Post-processor for L{rpc.node.RpcRunner.call_instance_get_migration_status}
88

89
  """
90
  if not result.fail_msg and result.payload is not None:
91
    result.payload = objects.MigrationStatus.FromDict(result.payload)
92
  return result
93

    
94

    
95
def _BlockdevFindPostProc(result):
96
  """Post-processor for L{rpc.node.RpcRunner.call_blockdev_find}.
97

98
  """
99
  if not result.fail_msg and result.payload is not None:
100
    result.payload = objects.BlockDevStatus.FromDict(result.payload)
101
  return result
102

    
103

    
104
def _BlockdevGetMirrorStatusPostProc(result):
105
  """Post-processor for call_blockdev_getmirrorstatus.
106

107
  """
108
  if not result.fail_msg:
109
    result.payload = map(objects.BlockDevStatus.FromDict, result.payload)
110
  return result
111

    
112

    
113
def _BlockdevGetMirrorStatusMultiPreProc(node, args):
114
  """Prepares the appropriate node values for blockdev_getmirrorstatus_multi.
115

116
  """
117
  # there should be only one argument to this RPC, already holding a
118
  # node->disks dictionary, we just need to extract the value for the
119
  # current node
120
  assert len(args) == 1
121
  return [args[0][node]]
122

    
123

    
124
def _BlockdevGetMirrorStatusMultiPostProc(result):
125
  """Post-processor for call_blockdev_getmirrorstatus_multi.
126

127
  """
128
  if not result.fail_msg:
129
    for idx, (success, status) in enumerate(result.payload):
130
      if success:
131
        result.payload[idx] = (success, objects.BlockDevStatus.FromDict(status))
132

    
133
  return result
134

    
135

    
136
def _NodeInfoPreProc(node, args):
137
  """Prepare the storage_units argument for node_info calls."""
138
  assert len(args) == 2
139
  # The storage_units argument is either a dictionary with one value for each
140
  # node, or a fixed value to be used for all the nodes
141
  if type(args[0]) is dict:
142
    return [args[0][node], args[1]]
143
  else:
144
    return args
145

    
146

    
147
def _OsGetPostProc(result):
148
  """Post-processor for L{rpc.node.RpcRunner.call_os_get}.
149

150
  """
151
  if not result.fail_msg and isinstance(result.payload, dict):
152
    result.payload = objects.OS.FromDict(result.payload)
153
  return result
154

    
155

    
156
def _ImpExpStatusPostProc(result):
157
  """Post-processor for import/export status.
158

159
  @rtype: Payload containing list of L{objects.ImportExportStatus} instances
160
  @return: Returns a list of the state of each named import/export or None if
161
           a status couldn't be retrieved
162

163
  """
164
  if not result.fail_msg:
165
    decoded = []
166

    
167
    for i in result.payload:
168
      if i is None:
169
        decoded.append(None)
170
        continue
171
      decoded.append(objects.ImportExportStatus.FromDict(i))
172

    
173
    result.payload = decoded
174

    
175
  return result
176

    
177

    
178
def _TestDelayTimeout((duration, )):
179
  """Calculate timeout for "test_delay" RPC.
180

181
  """
182
  return int(duration + 5)
183

    
184

    
185
_FILE_STORAGE_CALLS = [
186
  ("file_storage_dir_create", SINGLE, None, constants.RPC_TMO_FAST, [
187
    ("file_storage_dir", None, "File storage directory"),
188
    ], None, None, "Create the given file storage directory"),
189
  ("file_storage_dir_remove", SINGLE, None, constants.RPC_TMO_FAST, [
190
    ("file_storage_dir", None, "File storage directory"),
191
    ], None, None, "Remove the given file storage directory"),
192
  ("file_storage_dir_rename", SINGLE, None, constants.RPC_TMO_FAST, [
193
    ("old_file_storage_dir", None, "Old name"),
194
    ("new_file_storage_dir", None, "New name"),
195
    ], None, None, "Rename file storage directory"),
196
  ]
197

    
198
_STORAGE_CALLS = [
199
  ("storage_list", MULTI, None, constants.RPC_TMO_NORMAL, [
200
    ("su_name", None, None),
201
    ("su_args", None, None),
202
    ("name", None, None),
203
    ("fields", None, None),
204
    ], None, None, "Get list of storage units"),
205
  ("storage_modify", SINGLE, None, constants.RPC_TMO_NORMAL, [
206
    ("su_name", None, None),
207
    ("su_args", None, None),
208
    ("name", None, None),
209
    ("changes", None, None),
210
    ], None, None, "Modify a storage unit"),
211
  ("storage_execute", SINGLE, None, constants.RPC_TMO_NORMAL, [
212
    ("su_name", None, None),
213
    ("su_args", None, None),
214
    ("name", None, None),
215
    ("op", None, None),
216
    ], None, None, "Executes an operation on a storage unit"),
217
  ]
218

    
219
_INSTANCE_CALLS = [
220
  ("instance_info", SINGLE, None, constants.RPC_TMO_URGENT, [
221
    ("instance", None, "Instance name"),
222
    ("hname", None, "Hypervisor type"),
223
    ("hvparams", None, "Hypervisor parameters"),
224
    ], None, None, "Returns information about a single instance"),
225
  ("all_instances_info", MULTI, None, constants.RPC_TMO_URGENT, [
226
    ("hypervisor_list", None, "Hypervisors to query for instances"),
227
    ("all_hvparams", None, "Dictionary mapping hypervisor names to hvparams"),
228
    ], None, None,
229
   "Returns information about all instances on the given nodes"),
230
  ("instance_list", MULTI, None, constants.RPC_TMO_URGENT, [
231
    ("hypervisor_list", None, "Hypervisors to query for instances"),
232
    ("hvparams", None, "Hvparams of all hypervisors"),
233
    ], None, None, "Returns the list of running instances on the given nodes"),
234
  ("instance_reboot", SINGLE, None, constants.RPC_TMO_NORMAL, [
235
    ("inst", ED_INST_DICT, "Instance object"),
236
    ("reboot_type", None, None),
237
    ("shutdown_timeout", None, None),
238
    ("reason", None, "The reason for the reboot"),
239
    ], None, None, "Returns the list of running instances on the given nodes"),
240
  ("instance_shutdown", SINGLE, None, constants.RPC_TMO_NORMAL, [
241
    ("instance", ED_INST_DICT, "Instance object"),
242
    ("timeout", None, None),
243
    ("reason", None, "The reason for the shutdown"),
244
    ], None, None, "Stops an instance"),
245
  ("instance_balloon_memory", SINGLE, None, constants.RPC_TMO_NORMAL, [
246
    ("instance", ED_INST_DICT, "Instance object"),
247
    ("memory", None, None),
248
    ], None, None, "Modify the amount of an instance's runtime memory"),
249
  ("instance_run_rename", SINGLE, None, constants.RPC_TMO_SLOW, [
250
    ("instance", ED_INST_DICT, "Instance object"),
251
    ("old_name", None, None),
252
    ("debug", None, None),
253
    ], None, None, "Run the OS rename script for an instance"),
254
  ("instance_migratable", SINGLE, None, constants.RPC_TMO_NORMAL, [
255
    ("instance", ED_INST_DICT, "Instance object"),
256
    ], None, None, "Checks whether the given instance can be migrated"),
257
  ("migration_info", SINGLE, None, constants.RPC_TMO_NORMAL, [
258
    ("instance", ED_INST_DICT, "Instance object"),
259
    ], None, None,
260
    "Gather the information necessary to prepare an instance migration"),
261
  ("accept_instance", SINGLE, None, constants.RPC_TMO_NORMAL, [
262
    ("instance", ED_INST_DICT, "Instance object"),
263
    ("info", None, "Result for the call_migration_info call"),
264
    ("target", None, "Target hostname (usually an IP address)"),
265
    ], None, None, "Prepare a node to accept an instance"),
266
  ("instance_finalize_migration_dst", SINGLE, None, constants.RPC_TMO_NORMAL, [
267
    ("instance", ED_INST_DICT, "Instance object"),
268
    ("info", None, "Result for the call_migration_info call"),
269
    ("success", None, "Whether the migration was a success or failure"),
270
    ], None, None, "Finalize any target-node migration specific operation"),
271
  ("instance_migrate", SINGLE, None, constants.RPC_TMO_SLOW, [
272
    ("cluster_name", None, "Cluster name"),
273
    ("instance", ED_INST_DICT, "Instance object"),
274
    ("target", None, "Target node name"),
275
    ("live", None, "Whether the migration should be done live or not"),
276
    ], None, None, "Migrate an instance"),
277
  ("instance_finalize_migration_src", SINGLE, None, constants.RPC_TMO_SLOW, [
278
    ("instance", ED_INST_DICT, "Instance object"),
279
    ("success", None, "Whether the migration succeeded or not"),
280
    ("live", None, "Whether the user requested a live migration or not"),
281
    ], None, None, "Finalize the instance migration on the source node"),
282
  ("instance_get_migration_status", SINGLE, None, constants.RPC_TMO_SLOW, [
283
    ("instance", ED_INST_DICT, "Instance object"),
284
    ], None, _MigrationStatusPostProc, "Report migration status"),
285
  ("instance_start", SINGLE, None, constants.RPC_TMO_NORMAL, [
286
    ("instance_hvp_bep", ED_INST_DICT_HVP_BEP_DP, None),
287
    ("startup_paused", None, None),
288
    ("reason", None, "The reason for the startup"),
289
    ], None, None, "Starts an instance"),
290
  ("instance_os_add", SINGLE, None, constants.RPC_TMO_1DAY, [
291
    ("instance_osp", ED_INST_DICT_OSP_DP, "Tuple: (target instance,"
292
                                          " temporary OS parameters"
293
                                          " overriding configuration)"),
294
    ("reinstall", None, "Whether the instance is being reinstalled"),
295
    ("debug", None, "Debug level for the OS install script to use"),
296
    ], None, None, "Installs an operative system onto an instance"),
297
  ("hotplug_device", SINGLE, None, constants.RPC_TMO_NORMAL, [
298
    ("instance", ED_INST_DICT, "Instance object"),
299
    ("action", None, "Hotplug Action"),
300
    ("dev_type", None, "Device type"),
301
    ("device", ED_DEVICE_DICT, "Device dict"),
302
    ("extra", None, "Extra info for device (dev_path for disk)"),
303
    ("seq", None, "Device seq"),
304
    ], None, None, "Hoplug a device to a running instance"),
305
  ("hotplug_supported", SINGLE, None, constants.RPC_TMO_NORMAL, [
306
    ("instance", ED_INST_DICT, "Instance object"),
307
    ], None, None, "Check if hotplug is supported"),
308
  ]
309

    
310
_IMPEXP_CALLS = [
311
  ("import_start", SINGLE, None, constants.RPC_TMO_NORMAL, [
312
    ("opts", ED_OBJECT_DICT, None),
313
    ("instance", ED_INST_DICT, None),
314
    ("component", None, None),
315
    ("dest", ED_IMPEXP_IO, "Import destination"),
316
    ], None, None, "Starts an import daemon"),
317
  ("export_start", SINGLE, None, constants.RPC_TMO_NORMAL, [
318
    ("opts", ED_OBJECT_DICT, None),
319
    ("host", None, None),
320
    ("port", None, None),
321
    ("instance", ED_INST_DICT, None),
322
    ("component", None, None),
323
    ("source", ED_IMPEXP_IO, "Export source"),
324
    ], None, None, "Starts an export daemon"),
325
  ("impexp_status", SINGLE, None, constants.RPC_TMO_FAST, [
326
    ("names", None, "Import/export names"),
327
    ], None, _ImpExpStatusPostProc, "Gets the status of an import or export"),
328
  ("impexp_abort", SINGLE, None, constants.RPC_TMO_NORMAL, [
329
    ("name", None, "Import/export name"),
330
    ], None, None, "Aborts an import or export"),
331
  ("impexp_cleanup", SINGLE, None, constants.RPC_TMO_NORMAL, [
332
    ("name", None, "Import/export name"),
333
    ], None, None, "Cleans up after an import or export"),
334
  ("export_info", SINGLE, None, constants.RPC_TMO_FAST, [
335
    ("path", None, None),
336
    ], None, None, "Queries the export information in a given path"),
337
  ("finalize_export", SINGLE, None, constants.RPC_TMO_NORMAL, [
338
    ("instance", ED_INST_DICT, None),
339
    ("snap_disks", ED_FINALIZE_EXPORT_DISKS, None),
340
    ], None, None, "Request the completion of an export operation"),
341
  ("export_list", MULTI, None, constants.RPC_TMO_FAST, [], None, None,
342
   "Gets the stored exports list"),
343
  ("export_remove", SINGLE, None, constants.RPC_TMO_FAST, [
344
    ("export", None, None),
345
    ], None, None, "Requests removal of a given export"),
346
  ]
347

    
348
_X509_CALLS = [
349
  ("x509_cert_create", SINGLE, None, constants.RPC_TMO_NORMAL, [
350
    ("validity", None, "Validity in seconds"),
351
    ], None, None, "Creates a new X509 certificate for SSL/TLS"),
352
  ("x509_cert_remove", SINGLE, None, constants.RPC_TMO_NORMAL, [
353
    ("name", None, "Certificate name"),
354
    ], None, None, "Removes a X509 certificate"),
355
  ]
356

    
357
_BLOCKDEV_CALLS = [
358
  ("bdev_sizes", MULTI, None, constants.RPC_TMO_URGENT, [
359
    ("devices", None, None),
360
    ], None, None,
361
   "Gets the sizes of requested block devices present on a node"),
362
  ("blockdev_create", SINGLE, None, constants.RPC_TMO_NORMAL, [
363
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
364
    ("size", None, None),
365
    ("owner", None, None),
366
    ("on_primary", None, None),
367
    ("info", None, None),
368
    ("exclusive_storage", None, None),
369
    ], None, None, "Request creation of a given block device"),
370
  ("blockdev_image", SINGLE, None, constants.RPC_TMO_SLOW, [
371
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
372
    ("image", None, None),
373
    ("size", None, None),
374
    ], None, None,
375
    "Request to dump an image with given size onto a block device"),
376
  ("blockdev_wipe", SINGLE, None, constants.RPC_TMO_SLOW, [
377
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
378
    ("offset", None, None),
379
    ("size", None, None),
380
    ], None, None,
381
    "Request wipe at given offset with given size of a block device"),
382
  ("blockdev_remove", SINGLE, None, constants.RPC_TMO_NORMAL, [
383
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
384
    ], None, None, "Request removal of a given block device"),
385
  ("blockdev_pause_resume_sync", SINGLE, None, constants.RPC_TMO_NORMAL, [
386
    ("disks", ED_DISKS_DICT_DP, None),
387
    ("pause", None, None),
388
    ], None, None, "Request a pause/resume of given block device"),
389
  ("blockdev_assemble", SINGLE, None, constants.RPC_TMO_NORMAL, [
390
    ("disk", ED_SINGLE_DISK_DICT_DP, None),
391
    ("owner", None, None),
392
    ("on_primary", None, None),
393
    ("idx", None, None),
394
    ], None, None, "Request assembling of a given block device"),
395
  ("blockdev_shutdown", SINGLE, None, constants.RPC_TMO_NORMAL, [
396
    ("disk", ED_SINGLE_DISK_DICT_DP, None),
397
    ], None, None, "Request shutdown of a given block device"),
398
  ("blockdev_addchildren", SINGLE, None, constants.RPC_TMO_NORMAL, [
399
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
400
    ("ndevs", ED_DISKS_DICT_DP, None),
401
    ], None, None,
402
   "Request adding a list of children to a (mirroring) device"),
403
  ("blockdev_removechildren", SINGLE, None, constants.RPC_TMO_NORMAL, [
404
    ("bdev", ED_SINGLE_DISK_DICT_DP, None),
405
    ("ndevs", ED_DISKS_DICT_DP, None),
406
    ], None, None,
407
   "Request removing a list of children from a (mirroring) device"),
408
  ("blockdev_close", SINGLE, None, constants.RPC_TMO_NORMAL, [
409
    ("instance_name", None, None),
410
    ("disks", ED_DISKS_DICT_DP, None),
411
    ], None, None, "Closes the given block devices"),
412
  ("blockdev_getdimensions", SINGLE, None, constants.RPC_TMO_NORMAL, [
413
    ("disks", ED_MULTI_DISKS_DICT_DP, None),
414
    ], None, None, "Returns size and spindles of the given disks"),
415
  ("drbd_disconnect_net", MULTI, None, constants.RPC_TMO_NORMAL, [
416
    ("disks", ED_DISKS_DICT_DP, None),
417
    ], None, None,
418
   "Disconnects the network of the given drbd devices"),
419
  ("drbd_attach_net", MULTI, None, constants.RPC_TMO_NORMAL, [
420
    ("disks", ED_DISKS_DICT_DP, None),
421
    ("instance_name", None, None),
422
    ("multimaster", None, None),
423
    ], None, None, "Connects the given DRBD devices"),
424
  ("drbd_wait_sync", MULTI, None, constants.RPC_TMO_SLOW, [
425
    ("disks", ED_DISKS_DICT_DP, None),
426
    ], None, None,
427
   "Waits for the synchronization of drbd devices is complete"),
428
  ("drbd_needs_activation", SINGLE, None, constants.RPC_TMO_NORMAL, [
429
    ("disks", ED_MULTI_DISKS_DICT_DP, None),
430
    ], None, None,
431
   "Returns the drbd disks which need activation"),
432
  ("blockdev_grow", SINGLE, None, constants.RPC_TMO_NORMAL, [
433
    ("cf_bdev", ED_SINGLE_DISK_DICT_DP, None),
434
    ("amount", None, None),
435
    ("dryrun", None, None),
436
    ("backingstore", None, None),
437
    ("es_flag", None, None),
438
    ], None, None, "Request growing of the given block device by a"
439
   " given amount"),
440
  ("blockdev_snapshot", SINGLE, None, constants.RPC_TMO_NORMAL, [
441
    ("cf_bdev", ED_SINGLE_DISK_DICT_DP, None),
442
    ], None, None, "Export a given disk to another node"),
443
  ("blockdev_rename", SINGLE, None, constants.RPC_TMO_NORMAL, [
444
    ("devlist", ED_BLOCKDEV_RENAME, None),
445
    ], None, None, "Request rename of the given block devices"),
446
  ("blockdev_find", SINGLE, None, constants.RPC_TMO_NORMAL, [
447
    ("disk", ED_SINGLE_DISK_DICT_DP, None),
448
    ], None, _BlockdevFindPostProc,
449
    "Request identification of a given block device"),
450
  ("blockdev_getmirrorstatus", SINGLE, None, constants.RPC_TMO_NORMAL, [
451
    ("disks", ED_DISKS_DICT_DP, None),
452
    ], None, _BlockdevGetMirrorStatusPostProc,
453
    "Request status of a (mirroring) device"),
454
  ("blockdev_getmirrorstatus_multi", MULTI, None, constants.RPC_TMO_NORMAL, [
455
    ("node_disks", ED_NODE_TO_DISK_DICT_DP, None),
456
    ], _BlockdevGetMirrorStatusMultiPreProc,
457
   _BlockdevGetMirrorStatusMultiPostProc,
458
    "Request status of (mirroring) devices from multiple nodes"),
459
  ("blockdev_setinfo", SINGLE, None, constants.RPC_TMO_NORMAL, [
460
    ("disk", ED_SINGLE_DISK_DICT_DP, None),
461
    ("info", None, None),
462
    ], None, None, "Sets metadata information on a given block device"),
463
  ]
464

    
465
_OS_CALLS = [
466
  ("os_diagnose", MULTI, None, constants.RPC_TMO_FAST, [], None, None,
467
   "Request a diagnose of OS definitions"),
468
  ("os_validate", MULTI, None, constants.RPC_TMO_FAST, [
469
    ("required", None, None),
470
    ("name", None, None),
471
    ("checks", None, None),
472
    ("params", None, None),
473
    ], None, None, "Run a validation routine for a given OS"),
474
  ("os_get", SINGLE, None, constants.RPC_TMO_FAST, [
475
    ("name", None, None),
476
    ], None, _OsGetPostProc, "Returns an OS definition"),
477
  ]
478

    
479
_EXTSTORAGE_CALLS = [
480
  ("extstorage_diagnose", MULTI, None, constants.RPC_TMO_FAST, [], None, None,
481
   "Request a diagnose of ExtStorage Providers"),
482
  ]
483

    
484
_NODE_CALLS = [
485
  ("node_has_ip_address", SINGLE, None, constants.RPC_TMO_FAST, [
486
    ("address", None, "IP address"),
487
    ], None, None, "Checks if a node has the given IP address"),
488
  ("node_info", MULTI, None, constants.RPC_TMO_URGENT, [
489
    ("storage_units", None,
490
     "List of tuples '<storage_type>,<key>,[<param>]' to ask for disk space"
491
     " information; the parameter list varies depending on the storage_type"),
492
    ("hv_specs", None,
493
     "List of hypervisor specification (name, hvparams) to ask for node "
494
     "information"),
495
    ], _NodeInfoPreProc, None, "Return node information"),
496
  ("node_verify", MULTI, None, constants.RPC_TMO_NORMAL, [
497
    ("checkdict", None, "What to verify"),
498
    ("cluster_name", None, "Cluster name"),
499
    ("all_hvparams", None, "Dictionary mapping hypervisor names to hvparams"),
500
    ("node_groups", None, "node names mapped to their group uuids"),
501
    ("groups_cfg", None,
502
      "a dictionary mapping group uuids to their configuration"),
503
    ], None, None, "Request verification of given parameters"),
504
  ("node_volumes", MULTI, None, constants.RPC_TMO_FAST, [], None, None,
505
   "Gets all volumes on node(s)"),
506
  ("node_demote_from_mc", SINGLE, None, constants.RPC_TMO_FAST, [], None, None,
507
   "Demote a node from the master candidate role"),
508
  ("node_powercycle", SINGLE, ACCEPT_OFFLINE_NODE, constants.RPC_TMO_NORMAL, [
509
    ("hypervisor", None, "Hypervisor type"),
510
    ("hvparams", None, "Hypervisor parameters"),
511
    ], None, None, "Tries to powercycle a node"),
512
  ("node_configure_ovs", SINGLE, None, constants.RPC_TMO_NORMAL, [
513
    ("ovs_name", None, "Name of the OpenvSwitch to create"),
514
    ("ovs_link", None, "Link of the OpenvSwitch to the outside"),
515
    ], None, None, "This will create and setup the OpenvSwitch"),
516
  ("node_crypto_tokens", SINGLE, None, constants.RPC_TMO_NORMAL, [
517
    ("token_request", None,
518
     "List of tuples of requested crypto token types, actions"),
519
    ], None, None, "Handle crypto tokens of the node."),
520
  ]
521

    
522
_MISC_CALLS = [
523
  ("lv_list", MULTI, None, constants.RPC_TMO_URGENT, [
524
    ("vg_name", None, None),
525
    ], None, None, "Gets the logical volumes present in a given volume group"),
526
  ("vg_list", MULTI, None, constants.RPC_TMO_URGENT, [], None, None,
527
   "Gets the volume group list"),
528
  ("bridges_exist", SINGLE, None, constants.RPC_TMO_URGENT, [
529
    ("bridges_list", None, "Bridges which must be present on remote node"),
530
    ], None, None, "Checks if a node has all the bridges given"),
531
  ("etc_hosts_modify", SINGLE, None, constants.RPC_TMO_NORMAL, [
532
    ("mode", None,
533
     "Mode to operate; currently L{constants.ETC_HOSTS_ADD} or"
534
     " L{constants.ETC_HOSTS_REMOVE}"),
535
    ("name", None, "Hostname to be modified"),
536
    ("ip", None, "IP address (L{constants.ETC_HOSTS_ADD} only)"),
537
    ], None, None, "Modify hosts file with name"),
538
  ("drbd_helper", MULTI, None, constants.RPC_TMO_URGENT, [],
539
   None, None, "Gets DRBD helper"),
540
  ("restricted_command", MULTI, None, constants.RPC_TMO_SLOW, [
541
    ("cmd", None, "Command name"),
542
    ], None, None, "Runs restricted command"),
543
  ("run_oob", SINGLE, None, constants.RPC_TMO_NORMAL, [
544
    ("oob_program", None, None),
545
    ("command", None, None),
546
    ("remote_node", None, None),
547
    ("timeout", None, None),
548
    ], None, None, "Runs out-of-band command"),
549
  ("hooks_runner", MULTI, None, constants.RPC_TMO_NORMAL, [
550
    ("hpath", None, None),
551
    ("phase", None, None),
552
    ("env", None, None),
553
    ], None, None, "Call the hooks runner"),
554
  ("iallocator_runner", SINGLE, None, constants.RPC_TMO_NORMAL, [
555
    ("name", None, "Iallocator name"),
556
    ("idata", None, "JSON-encoded input string"),
557
    ("default_iallocator_params", None, "Additional iallocator parameters"),
558
    ], None, None, "Call an iallocator on a remote node"),
559
  ("test_delay", MULTI, None, _TestDelayTimeout, [
560
    ("duration", None, None),
561
    ], None, None, "Sleep for a fixed time on given node(s)"),
562
  ("hypervisor_validate_params", MULTI, None, constants.RPC_TMO_NORMAL, [
563
    ("hvname", None, "Hypervisor name"),
564
    ("hvfull", None, "Parameters to be validated"),
565
    ], None, None, "Validate hypervisor params"),
566
  ("get_watcher_pause", SINGLE, None, constants.RPC_TMO_URGENT, [],
567
    None, None, "Get watcher pause end"),
568
  ("set_watcher_pause", MULTI, None, constants.RPC_TMO_URGENT, [
569
    ("until", None, None),
570
    ], None, None, "Set watcher pause end"),
571
  ]
572

    
573
CALLS = {
574
  "RpcClientDefault":
575
    _Prepare(_IMPEXP_CALLS + _X509_CALLS + _OS_CALLS + _NODE_CALLS +
576
             _FILE_STORAGE_CALLS + _MISC_CALLS + _INSTANCE_CALLS +
577
             _BLOCKDEV_CALLS + _STORAGE_CALLS + _EXTSTORAGE_CALLS),
578
  "RpcClientJobQueue": _Prepare([
579
    ("jobqueue_update", MULTI, None, constants.RPC_TMO_URGENT, [
580
      ("file_name", None, None),
581
      ("content", ED_COMPRESS, None),
582
      ], None, None, "Update job queue file"),
583
    ("jobqueue_purge", SINGLE, None, constants.RPC_TMO_NORMAL, [], None, None,
584
     "Purge job queue"),
585
    ("jobqueue_rename", MULTI, None, constants.RPC_TMO_URGENT, [
586
      ("rename", None, None),
587
      ], None, None, "Rename job queue file"),
588
    ("jobqueue_set_drain_flag", MULTI, None, constants.RPC_TMO_URGENT, [
589
      ("flag", None, None),
590
      ], None, None, "Set job queue drain flag"),
591
    ]),
592
  "RpcClientBootstrap": _Prepare([
593
    ("node_start_master_daemons", SINGLE, None, constants.RPC_TMO_FAST, [
594
      ("no_voting", None, None),
595
      ], None, None, "Starts master daemons on a node"),
596
    ("node_activate_master_ip", SINGLE, None, constants.RPC_TMO_FAST, [
597
      ("master_params", ED_OBJECT_DICT, "Network parameters of the master"),
598
      ("use_external_mip_script", None,
599
       "Whether to use the user-provided master IP address setup script"),
600
      ], None, None,
601
      "Activates master IP on a node"),
602
    ("node_stop_master", SINGLE, None, constants.RPC_TMO_FAST, [], None, None,
603
     "Deactivates master IP and stops master daemons on a node"),
604
    ("node_deactivate_master_ip", SINGLE, None, constants.RPC_TMO_FAST, [
605
      ("master_params", ED_OBJECT_DICT, "Network parameters of the master"),
606
      ("use_external_mip_script", None,
607
       "Whether to use the user-provided master IP address setup script"),
608
      ], None, None,
609
     "Deactivates master IP on a node"),
610
    ("node_change_master_netmask", SINGLE, None, constants.RPC_TMO_FAST, [
611
      ("old_netmask", None, "The old value of the netmask"),
612
      ("netmask", None, "The new value of the netmask"),
613
      ("master_ip", None, "The master IP"),
614
      ("master_netdev", None, "The master network device"),
615
      ], None, None, "Change master IP netmask"),
616
    ("node_leave_cluster", SINGLE, None, constants.RPC_TMO_NORMAL, [
617
      ("modify_ssh_setup", None, None),
618
      ], None, None,
619
     "Requests a node to clean the cluster information it has"),
620
    ("master_node_name", MULTI, None, constants.RPC_TMO_URGENT, [], None, None,
621
     "Returns the master node name"),
622
    ]),
623
  "RpcClientDnsOnly": _Prepare([
624
    ("version", MULTI, ACCEPT_OFFLINE_NODE, constants.RPC_TMO_URGENT, [], None,
625
     None, "Query node version"),
626
    ("node_verify_light", MULTI, None, constants.RPC_TMO_NORMAL, [
627
      ("checkdict", None, "What to verify"),
628
      ("cluster_name", None, "Cluster name"),
629
      ("hvparams", None, "Dictionary mapping hypervisor names to hvparams"),
630
      ("node_groups", None, "node names mapped to their group uuids"),
631
      ("groups_cfg", None,
632
       "a dictionary mapping group uuids to their configuration"),
633
      ], None, None, "Request verification of given parameters"),
634
    ]),
635
  "RpcClientConfig": _Prepare([
636
    ("upload_file", MULTI, None, constants.RPC_TMO_NORMAL, [
637
      ("file_name", ED_FILE_DETAILS, None),
638
      ], None, None, "Upload files"),
639
    ("upload_file_single", MULTI, None, constants.RPC_TMO_NORMAL, [
640
      ("file_name", None, "The name of the file"),
641
      ("content", ED_COMPRESS, "The data to be uploaded"),
642
      ("mode", None, "The mode of the file or None"),
643
      ("uid", None, "The owner of the file"),
644
      ("gid", None, "The group of the file"),
645
      ("atime", None, "The file's last access time"),
646
      ("mtime", None, "The file's last modification time"),
647
      ], None, None, "Upload files"),
648
    ("write_ssconf_files", MULTI, None, constants.RPC_TMO_NORMAL, [
649
      ("values", None, None),
650
      ], None, None, "Write ssconf files"),
651
    ]),
652
  }