Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 2fe1e043

History | View | Annotate | Download (65.4 kB)

1
#
2
#
3

    
4
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 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

    
22
"""Module holding different constants."""
23

    
24
import re
25
import socket
26

    
27
from ganeti import _autoconf
28
from ganeti import _vcsversion
29
from ganeti import compat
30
from ganeti import pathutils
31

    
32

    
33
# various versions
34
RELEASE_VERSION = _autoconf.PACKAGE_VERSION
35
OS_API_V10 = 10
36
OS_API_V15 = 15
37
OS_API_V20 = 20
38
OS_API_VERSIONS = compat.UniqueFrozenset([
39
  OS_API_V10,
40
  OS_API_V15,
41
  OS_API_V20,
42
  ])
43
VCS_VERSION = _vcsversion.VCS_VERSION
44
EXPORT_VERSION = 0
45
RAPI_VERSION = 2
46

    
47

    
48
# Format for CONFIG_VERSION:
49
#   01 03 0123 = 01030123
50
#   ^^ ^^ ^^^^
51
#   |  |  + Configuration version/revision
52
#   |  + Minor version
53
#   + Major version
54
#
55
# It is stored as an integer. Make sure not to write an octal number.
56

    
57
# BuildVersion and SplitVersion must be in here because we can't import other
58
# modules. The cfgupgrade tool must be able to read and write version numbers
59
# and thus requires these functions. To avoid code duplication, they're kept in
60
# here.
61

    
62
def BuildVersion(major, minor, revision):
63
  """Calculates int version number from major, minor and revision numbers.
64

65
  Returns: int representing version number
66

67
  """
68
  assert isinstance(major, int)
69
  assert isinstance(minor, int)
70
  assert isinstance(revision, int)
71
  return (1000000 * major +
72
            10000 * minor +
73
                1 * revision)
74

    
75

    
76
def SplitVersion(version):
77
  """Splits version number stored in an int.
78

79
  Returns: tuple; (major, minor, revision)
80

81
  """
82
  assert isinstance(version, int)
83

    
84
  (major, remainder) = divmod(version, 1000000)
85
  (minor, revision) = divmod(remainder, 10000)
86

    
87
  return (major, minor, revision)
88

    
89

    
90
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
91
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
92
CONFIG_REVISION = 0
93
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
94

    
95
#: RPC protocol version
96
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)
97

    
98
# user separation
99
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
100
ADMIN_GROUP = _autoconf.ADMIN_GROUP
101
MASTERD_USER = _autoconf.MASTERD_USER
102
MASTERD_GROUP = _autoconf.MASTERD_GROUP
103
RAPI_USER = _autoconf.RAPI_USER
104
RAPI_GROUP = _autoconf.RAPI_GROUP
105
CONFD_USER = _autoconf.CONFD_USER
106
CONFD_GROUP = _autoconf.CONFD_GROUP
107
LUXID_USER = _autoconf.LUXID_USER
108
LUXID_GROUP = _autoconf.LUXID_GROUP
109
NODED_USER = _autoconf.NODED_USER
110
NODED_GROUP = _autoconf.NODED_GROUP
111
MOND_USER = _autoconf.MOND_USER
112
MOND_GROUP = _autoconf.MOND_GROUP
113
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
114
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
115

    
116
# cpu pinning separators and constants
117
CPU_PINNING_SEP = ":"
118
CPU_PINNING_ALL = "all"
119
# internal representation of "all"
120
CPU_PINNING_ALL_VAL = -1
121
# one "all" entry in a CPU list means CPU pinning is off
122
CPU_PINNING_OFF = [CPU_PINNING_ALL_VAL]
123

    
124
# A Xen-specific implementation detail - there is no way to actually say
125
# "use any cpu for pinning" in a Xen configuration file, as opposed to the
126
# command line, where you can say "xm vcpu-pin <domain> <vcpu> all".
127
# The workaround used in Xen is "0-63" (see source code function
128
# xm_vcpu_pin in <xen-source>/tools/python/xen/xm/main.py).
129
# To support future changes, the following constant is treated as a
130
# blackbox string that simply means use-any-cpu-for-pinning-under-xen.
131
CPU_PINNING_ALL_XEN = "0-63"
132

    
133
# A KVM-specific implementation detail - the following value is used
134
# to set CPU affinity to all processors (#0 through #31), per taskset
135
# man page.
136
# FIXME: This only works for machines with up to 32 CPU cores
137
CPU_PINNING_ALL_KVM = 0xFFFFFFFF
138

    
139
# Wipe
140
DD_CMD = "dd"
141
MAX_WIPE_CHUNK = 1024 # 1GB
142
MIN_WIPE_CHUNK_PERCENT = 10
143

    
144
RUN_DIRS_MODE = 0775
145
SECURE_DIR_MODE = 0700
146
SECURE_FILE_MODE = 0600
147
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
148
ENABLE_CONFD = _autoconf.ENABLE_CONFD
149
ENABLE_MOND = _autoconf.ENABLE_MOND
150
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
151
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
152

    
153
# SSH constants
154
SSH = "ssh"
155
SCP = "scp"
156

    
157
NODED = "ganeti-noded"
158
CONFD = "ganeti-confd"
159
LUXID = "ganeti-luxid"
160
RAPI = "ganeti-rapi"
161
MASTERD = "ganeti-masterd"
162
MOND = "ganeti-mond"
163

    
164
DAEMONS = compat.UniqueFrozenset([
165
  NODED,
166
  CONFD,
167
  LUXID,
168
  RAPI,
169
  MASTERD,
170
  MOND,
171
  ])
172

    
173
DAEMONS_PORTS = {
174
  # daemon-name: ("proto", "default-port")
175
  NODED: ("tcp", 1811),
176
  CONFD: ("udp", 1814),
177
  MOND: ("tcp", 1815),
178
  RAPI: ("tcp", 5080),
179
  SSH: ("tcp", 22),
180
}
181

    
182
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
183
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
184
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
185
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
186

    
187
FIRST_DRBD_PORT = 11000
188
LAST_DRBD_PORT = 14999
189

    
190
DAEMONS_LOGBASE = {
191
  NODED: "node-daemon",
192
  CONFD: "conf-daemon",
193
  LUXID: "luxi-daemon",
194
  RAPI: "rapi-daemon",
195
  MASTERD: "master-daemon",
196
  MOND: "monitoring-daemon",
197
  }
198

    
199
DAEMONS_LOGFILES = \
200
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
201
         for daemon in DAEMONS_LOGBASE)
202

    
203
# Some daemons might require more than one logfile.
204
# Specifically, right now only the Haskell http library "snap", used by the
205
# monitoring daemon, requires multiple log files.
206

    
207
# These are the only valid reasons for having an extra logfile
208
EXTRA_LOGREASON_ACCESS = "access"
209
EXTRA_LOGREASON_ERROR = "error"
210

    
211
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
212
  EXTRA_LOGREASON_ACCESS,
213
  EXTRA_LOGREASON_ERROR,
214
  ])
215

    
216
# These are the extra logfiles, grouped by daemon
217
DAEMONS_EXTRA_LOGBASE = {
218
  MOND: {
219
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
220
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
221
    }
222
  }
223

    
224
DAEMONS_EXTRA_LOGFILES = \
225
  dict((daemon, dict((extra,
226
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
227
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
228
         for daemon in DAEMONS_EXTRA_LOGBASE)
229

    
230
DEV_CONSOLE = "/dev/console"
231

    
232
PROC_MOUNTS = "/proc/mounts"
233

    
234
# Local UniX Interface related constants
235
LUXI_EOM = "\3"
236
LUXI_VERSION = CONFIG_VERSION
237
#: Environment variable for the luxi override socket
238
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
239
LUXI_OVERRIDE_MASTER = "master"
240
LUXI_OVERRIDE_QUERY = "query"
241

    
242
# one of "no", "yes", "only"
243
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
244
SYSLOG_NO = "no"
245
SYSLOG_YES = "yes"
246
SYSLOG_ONLY = "only"
247
SYSLOG_SOCKET = "/dev/log"
248

    
249
EXPORT_CONF_FILE = "config.ini"
250

    
251
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
252
XEN_KERNEL = _autoconf.XEN_KERNEL
253
XEN_INITRD = _autoconf.XEN_INITRD
254
XEN_CMD_XM = "xm"
255
XEN_CMD_XL = "xl"
256

    
257
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
258
  XEN_CMD_XM,
259
  XEN_CMD_XL,
260
  ])
261

    
262
# When the Xen toolstack used is "xl", live migration requires the source host
263
# to connect to the target host via ssh (xl runs this command). We need to pass
264
# the command xl runs some extra info so that it can use Ganeti's key
265
# verification and not fail. Note that this string is incomplete: it must be
266
# filled with the cluster name before being used.
267
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
268
              " -oUserKnownHostsFile=/dev/null"
269
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
270
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
271
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
272

    
273
KVM_PATH = _autoconf.KVM_PATH
274
KVM_KERNEL = _autoconf.KVM_KERNEL
275
SOCAT_PATH = _autoconf.SOCAT_PATH
276
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
277
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
278
SOCAT_ESCAPE_CODE = "0x1d"
279

    
280
#: Console as SSH command
281
CONS_SSH = "ssh"
282

    
283
#: Console as VNC server
284
CONS_VNC = "vnc"
285

    
286
#: Console as SPICE server
287
CONS_SPICE = "spice"
288

    
289
#: Display a message for console access
290
CONS_MESSAGE = "msg"
291

    
292
#: All console types
293
CONS_ALL = compat.UniqueFrozenset([
294
  CONS_SSH,
295
  CONS_VNC,
296
  CONS_SPICE,
297
  CONS_MESSAGE,
298
  ])
299

    
300
# For RSA keys more bits are better, but they also make operations more
301
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
302
# 2010 on.
303
RSA_KEY_BITS = 2048
304

    
305
# Ciphers allowed for SSL connections. For the format, see ciphers(1). A better
306
# way to disable ciphers would be to use the exclamation mark (!), but socat
307
# versions below 1.5 can't parse exclamation marks in options properly. When
308
# modifying the ciphers, ensure not to accidentially add something after it's
309
# been removed. Use the "openssl" utility to check the allowed ciphers, e.g.
310
# "openssl ciphers -v HIGH:-DES".
311
OPENSSL_CIPHERS = "HIGH:-DES:-3DES:-EXPORT:-ADH"
312

    
313
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
314
X509_CERT_SIGN_DIGEST = "SHA1"
315

    
316
# Default validity of certificates in days
317
X509_CERT_DEFAULT_VALIDITY = 365 * 5
318

    
319
# commonName (CN) used in certificates
320
X509_CERT_CN = "ganeti.example.com"
321

    
322
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
323

    
324
# Import/export daemon mode
325
IEM_IMPORT = "import"
326
IEM_EXPORT = "export"
327

    
328
# Import/export transport compression
329
IEC_NONE = "none"
330
IEC_GZIP = "gzip"
331
IEC_ALL = compat.UniqueFrozenset([
332
  IEC_NONE,
333
  IEC_GZIP,
334
  ])
335

    
336
IE_CUSTOM_SIZE = "fd"
337

    
338
IE_MAGIC_RE = re.compile(r"^[-_.a-zA-Z0-9]{5,100}$")
339

    
340
# Import/export I/O
341
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
342
IEIO_FILE = "file"
343
# Raw block device I/O using "dd"
344
IEIO_RAW_DISK = "raw"
345
# OS definition import/export script
346
IEIO_SCRIPT = "script"
347

    
348
VALUE_DEFAULT = "default"
349
VALUE_AUTO = "auto"
350
VALUE_GENERATE = "generate"
351
VALUE_NONE = "none"
352
VALUE_TRUE = "true"
353
VALUE_FALSE = "false"
354

    
355
# External script validation mask
356
EXT_PLUGIN_MASK = re.compile("^[a-zA-Z0-9_-]+$")
357

    
358
# hooks-related constants
359
HOOKS_PHASE_PRE = "pre"
360
HOOKS_PHASE_POST = "post"
361
HOOKS_NAME_CFGUPDATE = "config-update"
362
HOOKS_NAME_WATCHER = "watcher"
363
HOOKS_VERSION = 2
364
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
365

    
366
# hooks subject type (what object type does the LU deal with)
367
HTYPE_CLUSTER = "CLUSTER"
368
HTYPE_NODE = "NODE"
369
HTYPE_GROUP = "GROUP"
370
HTYPE_INSTANCE = "INSTANCE"
371
HTYPE_NETWORK = "NETWORK"
372

    
373
HKR_SKIP = 0
374
HKR_FAIL = 1
375
HKR_SUCCESS = 2
376

    
377
# Storage types
378
ST_BLOCK = "blockdev"
379
ST_DISKLESS = "diskless"
380
ST_EXT = "ext"
381
ST_FILE = "file"
382
ST_LVM_PV = "lvm-pv"
383
ST_LVM_VG = "lvm-vg"
384
ST_RADOS = "rados"
385

    
386
STORAGE_TYPES = compat.UniqueFrozenset([
387
  ST_BLOCK,
388
  ST_DISKLESS,
389
  ST_EXT,
390
  ST_FILE,
391
  ST_LVM_PV,
392
  ST_LVM_VG,
393
  ST_RADOS,
394
  ])
395

    
396
# the set of storage types for which storage reporting is available
397
# FIXME: Remove this, once storage reporting is available for all types.
398
STS_REPORT = compat.UniqueFrozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
399

    
400
# Storage fields
401
# first two are valid in LU context only, not passed to backend
402
SF_NODE = "node"
403
SF_TYPE = "type"
404
# and the rest are valid in backend
405
SF_NAME = "name"
406
SF_SIZE = "size"
407
SF_FREE = "free"
408
SF_USED = "used"
409
SF_ALLOCATABLE = "allocatable"
410

    
411
# Storage operations
412
SO_FIX_CONSISTENCY = "fix-consistency"
413

    
414
# Available fields per storage type
415
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
416
  SF_NAME,
417
  SF_TYPE,
418
  SF_SIZE,
419
  SF_USED,
420
  SF_FREE,
421
  SF_ALLOCATABLE,
422
  ])
423

    
424
MODIFIABLE_STORAGE_FIELDS = {
425
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
426
  }
427

    
428
VALID_STORAGE_OPERATIONS = {
429
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
430
  }
431

    
432
# Local disk status
433
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
434
(LDS_OKAY,
435
 LDS_UNKNOWN,
436
 LDS_FAULTY) = range(1, 4)
437

    
438
LDS_NAMES = {
439
  LDS_OKAY: "ok",
440
  LDS_UNKNOWN: "unknown",
441
  LDS_FAULTY: "faulty",
442
}
443

    
444
# disk template types
445
DT_BLOCK = "blockdev"
446
DT_DISKLESS = "diskless"
447
DT_DRBD8 = "drbd"
448
DT_EXT = "ext"
449
DT_FILE = "file"
450
DT_PLAIN = "plain"
451
DT_RBD = "rbd"
452
DT_SHARED_FILE = "sharedfile"
453

    
454
# This is used to order determine the default disk template when the list
455
# of enabled disk templates is inferred from the current state of the cluster.
456
# This only happens on an upgrade from a version of Ganeti that did not
457
# support the 'enabled_disk_templates' so far.
458
DISK_TEMPLATE_PREFERENCE = [
459
  DT_BLOCK,
460
  DT_DISKLESS,
461
  DT_DRBD8,
462
  DT_EXT,
463
  DT_FILE,
464
  DT_PLAIN,
465
  DT_RBD,
466
  DT_SHARED_FILE,
467
  ]
468

    
469
DISK_TEMPLATES = compat.UniqueFrozenset([
470
  DT_DISKLESS,
471
  DT_PLAIN,
472
  DT_DRBD8,
473
  DT_FILE,
474
  DT_SHARED_FILE,
475
  DT_BLOCK,
476
  DT_RBD,
477
  DT_EXT
478
  ])
479

    
480
# disk templates that are enabled by default
481
DEFAULT_ENABLED_DISK_TEMPLATES = [
482
  DT_DRBD8,
483
  DT_PLAIN,
484
  ]
485

    
486
# mapping of disk templates to storage types
487
MAP_DISK_TEMPLATE_STORAGE_TYPE = {
488
  DT_BLOCK: ST_BLOCK,
489
  DT_DISKLESS: ST_DISKLESS,
490
  DT_DRBD8: ST_LVM_VG,
491
  DT_EXT: ST_EXT,
492
  DT_FILE: ST_FILE,
493
  DT_PLAIN: ST_LVM_VG,
494
  DT_RBD: ST_RADOS,
495
  DT_SHARED_FILE: ST_FILE,
496
  }
497

    
498
# the set of network-mirrored disk templates
499
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
500

    
501
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
502
DTS_EXT_MIRROR = compat.UniqueFrozenset([
503
  DT_DISKLESS, # 'trivially' externally mirrored
504
  DT_SHARED_FILE,
505
  DT_BLOCK,
506
  DT_RBD,
507
  DT_EXT,
508
  ])
509

    
510
# the set of non-lvm-based disk templates
511
DTS_NOT_LVM = compat.UniqueFrozenset([
512
  DT_DISKLESS,
513
  DT_FILE,
514
  DT_SHARED_FILE,
515
  DT_BLOCK,
516
  DT_RBD,
517
  DT_EXT,
518
  ])
519

    
520
# the set of disk templates which can be grown
521
DTS_GROWABLE = compat.UniqueFrozenset([
522
  DT_PLAIN,
523
  DT_DRBD8,
524
  DT_FILE,
525
  DT_SHARED_FILE,
526
  DT_RBD,
527
  DT_EXT,
528
  ])
529

    
530
# the set of disk templates that allow adoption
531
DTS_MAY_ADOPT = compat.UniqueFrozenset([
532
  DT_PLAIN,
533
  DT_BLOCK,
534
  ])
535

    
536
# the set of disk templates that *must* use adoption
537
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
538

    
539
# the set of disk templates that allow migrations
540
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
541

    
542
# the set of file based disk templates
543
DTS_FILEBASED = compat.UniqueFrozenset([
544
  DT_FILE,
545
  DT_SHARED_FILE,
546
  ])
547

    
548
# the set of disk templates that can be moved by copying
549
# Note: a requirement is that they're not accessed externally or shared between
550
# nodes; in particular, sharedfile is not suitable.
551
DTS_COPYABLE = compat.UniqueFrozenset([
552
  DT_FILE,
553
  DT_PLAIN,
554
  ])
555

    
556
# the set of disk templates that are supported by exclusive_storage
557
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
558

    
559
# templates for which we don't perform checks on free space
560
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
561
  DT_FILE,
562
  DT_SHARED_FILE,
563
  DT_RBD,
564
  DT_EXT,
565
  ])
566

    
567
# logical disk types
568
LD_LV = "lvm"
569
LD_DRBD8 = "drbd8"
570
LD_FILE = "file"
571
LD_BLOCKDEV = "blockdev"
572
LD_RBD = "rbd"
573
LD_EXT = "ext"
574
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
575
  LD_LV,
576
  LD_DRBD8,
577
  LD_FILE,
578
  LD_BLOCKDEV,
579
  LD_RBD,
580
  LD_EXT,
581
  ])
582

    
583
LDS_BLOCK = compat.UniqueFrozenset([
584
  LD_LV,
585
  LD_DRBD8,
586
  LD_BLOCKDEV,
587
  LD_RBD,
588
  LD_EXT,
589
  ])
590

    
591
# drbd constants
592
DRBD_HMAC_ALG = "md5"
593
DRBD_DEFAULT_NET_PROTOCOL = "C"
594
DRBD_MIGRATION_NET_PROTOCOL = "C"
595
DRBD_STATUS_FILE = "/proc/drbd"
596

    
597
#: Size of DRBD meta block device
598
DRBD_META_SIZE = 128
599

    
600
# drbd barrier types
601
DRBD_B_NONE = "n"
602
DRBD_B_DISK_BARRIERS = "b"
603
DRBD_B_DISK_DRAIN = "d"
604
DRBD_B_DISK_FLUSH = "f"
605

    
606
# Valid barrier combinations: "n" or any non-null subset of "bfd"
607
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
608
  frozenset([DRBD_B_NONE]),
609
  frozenset([DRBD_B_DISK_BARRIERS]),
610
  frozenset([DRBD_B_DISK_DRAIN]),
611
  frozenset([DRBD_B_DISK_FLUSH]),
612
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
613
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
614
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
615
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
616
  ])
617

    
618
# rbd tool command
619
RBD_CMD = "rbd"
620

    
621
# file backend driver
622
FD_LOOP = "loop"
623
FD_BLKTAP = "blktap"
624

    
625
# the set of drbd-like disk types
626
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
627

    
628
# disk access mode
629
DISK_RDONLY = "ro"
630
DISK_RDWR = "rw"
631
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
632

    
633
# disk replacement mode
634
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
635
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
636
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
637
REPLACE_DISK_AUTO = "replace_auto"
638
REPLACE_MODES = compat.UniqueFrozenset([
639
  REPLACE_DISK_PRI,
640
  REPLACE_DISK_SEC,
641
  REPLACE_DISK_CHG,
642
  REPLACE_DISK_AUTO,
643
  ])
644

    
645
# Instance export mode
646
EXPORT_MODE_LOCAL = "local"
647
EXPORT_MODE_REMOTE = "remote"
648
EXPORT_MODES = compat.UniqueFrozenset([
649
  EXPORT_MODE_LOCAL,
650
  EXPORT_MODE_REMOTE,
651
  ])
652

    
653
# instance creation modes
654
INSTANCE_CREATE = "create"
655
INSTANCE_IMPORT = "import"
656
INSTANCE_REMOTE_IMPORT = "remote-import"
657
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
658
  INSTANCE_CREATE,
659
  INSTANCE_IMPORT,
660
  INSTANCE_REMOTE_IMPORT,
661
  ])
662

    
663
# Remote import/export handshake message and version
664
RIE_VERSION = 0
665
RIE_HANDSHAKE = "Hi, I'm Ganeti"
666

    
667
# Remote import/export certificate validity in seconds
668
RIE_CERT_VALIDITY = 24 * 60 * 60
669

    
670
# Overall timeout for establishing connection
671
RIE_CONNECT_TIMEOUT = 180
672

    
673
# Export only: how long to wait per connection attempt (seconds)
674
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
675

    
676
# Export only: number of attempts to connect
677
RIE_CONNECT_RETRIES = 10
678

    
679
#: Give child process up to 5 seconds to exit after sending a signal
680
CHILD_LINGER_TIMEOUT = 5.0
681

    
682
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
683

    
684
# import/export config options
685
INISECT_EXP = "export"
686
INISECT_INS = "instance"
687
INISECT_HYP = "hypervisor"
688
INISECT_BEP = "backend"
689
INISECT_OSP = "os"
690

    
691
# dynamic device modification
692
DDM_ADD = "add"
693
DDM_MODIFY = "modify"
694
DDM_REMOVE = "remove"
695
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
696
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
697
  DDM_MODIFY,
698
  ]))
699
# TODO: DDM_SWAP, DDM_MOVE?
700

    
701
# common exit codes
702
EXIT_SUCCESS = 0
703
EXIT_FAILURE = 1
704
EXIT_NOTCLUSTER = 5
705
EXIT_NOTMASTER = 11
706
EXIT_NODESETUP_ERROR = 12
707
EXIT_CONFIRMATION = 13 # need user confirmation
708

    
709
#: Exit code for query operations with unknown fields
710
EXIT_UNKNOWN_FIELD = 14
711

    
712
# tags
713
TAG_CLUSTER = "cluster"
714
TAG_NODEGROUP = "nodegroup"
715
TAG_NODE = "node"
716
TAG_INSTANCE = "instance"
717
TAG_NETWORK = "network"
718
VALID_TAG_TYPES = compat.UniqueFrozenset([
719
  TAG_CLUSTER,
720
  TAG_NODEGROUP,
721
  TAG_NODE,
722
  TAG_INSTANCE,
723
  TAG_NETWORK,
724
  ])
725
MAX_TAG_LEN = 128
726
MAX_TAGS_PER_OBJ = 4096
727

    
728
# others
729
DEFAULT_BRIDGE = "xen-br0"
730
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
731
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
732
IP4_ADDRESS_ANY = "0.0.0.0"
733
IP6_ADDRESS_LOCALHOST = "::1"
734
IP6_ADDRESS_ANY = "::"
735
IP4_VERSION = 4
736
IP6_VERSION = 6
737
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
738
# for export to htools
739
IP4_FAMILY = socket.AF_INET
740
IP6_FAMILY = socket.AF_INET6
741

    
742
TCP_PING_TIMEOUT = 10
743
DEFAULT_VG = "xenvg"
744
DEFAULT_DRBD_HELPER = "/bin/true"
745
MIN_VG_SIZE = 20480
746
DEFAULT_MAC_PREFIX = "aa:00:00"
747
# default maximum instance wait time, in seconds.
748
DEFAULT_SHUTDOWN_TIMEOUT = 120
749
NODE_MAX_CLOCK_SKEW = 150
750
# Time for an intra-cluster disk transfer to wait for a connection
751
DISK_TRANSFER_CONNECT_TIMEOUT = 60
752
# Disk index separator
753
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
754
IP_COMMAND_PATH = _autoconf.IP_PATH
755

    
756
#: Key for job IDs in opcode result
757
JOB_IDS_KEY = "jobs"
758

    
759
# runparts results
760
(RUNPARTS_SKIP,
761
 RUNPARTS_RUN,
762
 RUNPARTS_ERR) = range(3)
763

    
764
RUNPARTS_STATUS = compat.UniqueFrozenset([
765
  RUNPARTS_SKIP,
766
  RUNPARTS_RUN,
767
  RUNPARTS_ERR,
768
  ])
769

    
770
# RPC constants
771
(RPC_ENCODING_NONE,
772
 RPC_ENCODING_ZLIB_BASE64) = range(2)
773

    
774
# Various time constants for the timeout table
775
RPC_TMO_URGENT = 60 # one minute
776
RPC_TMO_FAST = 5 * 60 # five minutes
777
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
778
RPC_TMO_SLOW = 3600 # one hour
779
RPC_TMO_4HRS = 4 * 3600
780
RPC_TMO_1DAY = 86400
781

    
782
# Timeout for connecting to nodes (seconds)
783
RPC_CONNECT_TIMEOUT = 5
784

    
785
# os related constants
786
OS_SCRIPT_CREATE = "create"
787
OS_SCRIPT_IMPORT = "import"
788
OS_SCRIPT_EXPORT = "export"
789
OS_SCRIPT_RENAME = "rename"
790
OS_SCRIPT_VERIFY = "verify"
791
OS_SCRIPTS = compat.UniqueFrozenset([
792
  OS_SCRIPT_CREATE,
793
  OS_SCRIPT_IMPORT,
794
  OS_SCRIPT_EXPORT,
795
  OS_SCRIPT_RENAME,
796
  OS_SCRIPT_VERIFY,
797
  ])
798

    
799
OS_API_FILE = "ganeti_api_version"
800
OS_VARIANTS_FILE = "variants.list"
801
OS_PARAMETERS_FILE = "parameters.list"
802

    
803
OS_VALIDATE_PARAMETERS = "parameters"
804
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
805

    
806
# External Storage (ES) related constants
807
ES_ACTION_CREATE = "create"
808
ES_ACTION_REMOVE = "remove"
809
ES_ACTION_GROW = "grow"
810
ES_ACTION_ATTACH = "attach"
811
ES_ACTION_DETACH = "detach"
812
ES_ACTION_SETINFO = "setinfo"
813
ES_ACTION_VERIFY = "verify"
814

    
815
ES_SCRIPT_CREATE = ES_ACTION_CREATE
816
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
817
ES_SCRIPT_GROW = ES_ACTION_GROW
818
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
819
ES_SCRIPT_DETACH = ES_ACTION_DETACH
820
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
821
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
822
ES_SCRIPTS = frozenset([
823
  ES_SCRIPT_CREATE,
824
  ES_SCRIPT_REMOVE,
825
  ES_SCRIPT_GROW,
826
  ES_SCRIPT_ATTACH,
827
  ES_SCRIPT_DETACH,
828
  ES_SCRIPT_SETINFO,
829
  ES_SCRIPT_VERIFY
830
  ])
831

    
832
ES_PARAMETERS_FILE = "parameters.list"
833

    
834
# reboot types
835
INSTANCE_REBOOT_SOFT = "soft"
836
INSTANCE_REBOOT_HARD = "hard"
837
INSTANCE_REBOOT_FULL = "full"
838

    
839
REBOOT_TYPES = compat.UniqueFrozenset([
840
  INSTANCE_REBOOT_SOFT,
841
  INSTANCE_REBOOT_HARD,
842
  INSTANCE_REBOOT_FULL,
843
  ])
844

    
845
# instance reboot behaviors
846
INSTANCE_REBOOT_ALLOWED = "reboot"
847
INSTANCE_REBOOT_EXIT = "exit"
848

    
849
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
850
  INSTANCE_REBOOT_ALLOWED,
851
  INSTANCE_REBOOT_EXIT,
852
  ])
853

    
854
VTYPE_STRING = "string"
855
VTYPE_MAYBE_STRING = "maybe-string"
856
VTYPE_BOOL = "bool"
857
VTYPE_SIZE = "size" # size, in MiBs
858
VTYPE_INT = "int"
859
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
860
  VTYPE_STRING,
861
  VTYPE_MAYBE_STRING,
862
  VTYPE_BOOL,
863
  VTYPE_SIZE,
864
  VTYPE_INT,
865
  ])
866

    
867
# Constant representing that the user does not specify any IP version
868
IFACE_NO_IP_VERSION_SPECIFIED = 0
869

    
870
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
871
  75,
872
  110,
873
  300,
874
  600,
875
  1200,
876
  1800,
877
  2400,
878
  4800,
879
  9600,
880
  14400,
881
  19200,
882
  28800,
883
  38400,
884
  57600,
885
  115200,
886
  230400,
887
  345600,
888
  460800,
889
  ])
890

    
891
# HV parameter names (global namespace)
892
HV_BOOT_ORDER = "boot_order"
893
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
894
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
895
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
896
HV_NIC_TYPE = "nic_type"
897
HV_DISK_TYPE = "disk_type"
898
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
899
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
900
HV_VNC_PASSWORD_FILE = "vnc_password_file"
901
HV_VNC_TLS = "vnc_tls"
902
HV_VNC_X509 = "vnc_x509_path"
903
HV_VNC_X509_VERIFY = "vnc_x509_verify"
904
HV_KVM_SPICE_BIND = "spice_bind"
905
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
906
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
907
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
908
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
909
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
910
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
911
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
912
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
913
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
914
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
915
HV_ACPI = "acpi"
916
HV_PAE = "pae"
917
HV_USE_BOOTLOADER = "use_bootloader"
918
HV_BOOTLOADER_ARGS = "bootloader_args"
919
HV_BOOTLOADER_PATH = "bootloader_path"
920
HV_KERNEL_ARGS = "kernel_args"
921
HV_KERNEL_PATH = "kernel_path"
922
HV_INITRD_PATH = "initrd_path"
923
HV_ROOT_PATH = "root_path"
924
HV_SERIAL_CONSOLE = "serial_console"
925
HV_SERIAL_SPEED = "serial_speed"
926
HV_USB_MOUSE = "usb_mouse"
927
HV_KEYMAP = "keymap"
928
HV_DEVICE_MODEL = "device_model"
929
HV_INIT_SCRIPT = "init_script"
930
HV_MIGRATION_PORT = "migration_port"
931
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
932
HV_MIGRATION_DOWNTIME = "migration_downtime"
933
HV_MIGRATION_MODE = "migration_mode"
934
HV_USE_LOCALTIME = "use_localtime"
935
HV_DISK_CACHE = "disk_cache"
936
HV_SECURITY_MODEL = "security_model"
937
HV_SECURITY_DOMAIN = "security_domain"
938
HV_KVM_FLAG = "kvm_flag"
939
HV_VHOST_NET = "vhost_net"
940
HV_KVM_USE_CHROOT = "use_chroot"
941
HV_CPU_MASK = "cpu_mask"
942
HV_MEM_PATH = "mem_path"
943
HV_PASSTHROUGH = "pci_pass"
944
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
945
HV_REBOOT_BEHAVIOR = "reboot_behavior"
946
HV_CPU_TYPE = "cpu_type"
947
HV_CPU_CAP = "cpu_cap"
948
HV_CPU_WEIGHT = "cpu_weight"
949
HV_CPU_CORES = "cpu_cores"
950
HV_CPU_THREADS = "cpu_threads"
951
HV_CPU_SOCKETS = "cpu_sockets"
952
HV_SOUNDHW = "soundhw"
953
HV_USB_DEVICES = "usb_devices"
954
HV_VGA = "vga"
955
HV_KVM_EXTRA = "kvm_extra"
956
HV_KVM_MACHINE_VERSION = "machine_version"
957
HV_KVM_PATH = "kvm_path"
958
HV_VIF_TYPE = "vif_type"
959
HV_VIF_SCRIPT = "vif_script"
960
HV_XEN_CMD = "xen_cmd"
961
HV_VNET_HDR = "vnet_hdr"
962

    
963

    
964
HVS_PARAMETER_TYPES = {
965
  HV_KVM_PATH: VTYPE_STRING,
966
  HV_BOOT_ORDER: VTYPE_STRING,
967
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
968
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
969
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
970
  HV_NIC_TYPE: VTYPE_STRING,
971
  HV_DISK_TYPE: VTYPE_STRING,
972
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
973
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
974
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
975
  HV_VNC_TLS: VTYPE_BOOL,
976
  HV_VNC_X509: VTYPE_STRING,
977
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
978
  HV_KVM_SPICE_BIND: VTYPE_STRING,
979
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
980
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
981
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
982
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
983
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
984
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
985
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
986
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
987
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
988
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
989
  HV_ACPI: VTYPE_BOOL,
990
  HV_PAE: VTYPE_BOOL,
991
  HV_USE_BOOTLOADER: VTYPE_BOOL,
992
  HV_BOOTLOADER_PATH: VTYPE_STRING,
993
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
994
  HV_KERNEL_PATH: VTYPE_STRING,
995
  HV_KERNEL_ARGS: VTYPE_STRING,
996
  HV_INITRD_PATH: VTYPE_STRING,
997
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
998
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
999
  HV_SERIAL_SPEED: VTYPE_INT,
1000
  HV_USB_MOUSE: VTYPE_STRING,
1001
  HV_KEYMAP: VTYPE_STRING,
1002
  HV_DEVICE_MODEL: VTYPE_STRING,
1003
  HV_INIT_SCRIPT: VTYPE_STRING,
1004
  HV_MIGRATION_PORT: VTYPE_INT,
1005
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
1006
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
1007
  HV_MIGRATION_MODE: VTYPE_STRING,
1008
  HV_USE_LOCALTIME: VTYPE_BOOL,
1009
  HV_DISK_CACHE: VTYPE_STRING,
1010
  HV_SECURITY_MODEL: VTYPE_STRING,
1011
  HV_SECURITY_DOMAIN: VTYPE_STRING,
1012
  HV_KVM_FLAG: VTYPE_STRING,
1013
  HV_VHOST_NET: VTYPE_BOOL,
1014
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
1015
  HV_CPU_MASK: VTYPE_STRING,
1016
  HV_MEM_PATH: VTYPE_STRING,
1017
  HV_PASSTHROUGH: VTYPE_STRING,
1018
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
1019
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
1020
  HV_CPU_TYPE: VTYPE_STRING,
1021
  HV_CPU_CAP: VTYPE_INT,
1022
  HV_CPU_WEIGHT: VTYPE_INT,
1023
  HV_CPU_CORES: VTYPE_INT,
1024
  HV_CPU_THREADS: VTYPE_INT,
1025
  HV_CPU_SOCKETS: VTYPE_INT,
1026
  HV_SOUNDHW: VTYPE_STRING,
1027
  HV_USB_DEVICES: VTYPE_STRING,
1028
  HV_VGA: VTYPE_STRING,
1029
  HV_KVM_EXTRA: VTYPE_STRING,
1030
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1031
  HV_VIF_TYPE: VTYPE_STRING,
1032
  HV_VIF_SCRIPT: VTYPE_STRING,
1033
  HV_XEN_CMD: VTYPE_STRING,
1034
  HV_VNET_HDR: VTYPE_BOOL,
1035
  }
1036

    
1037
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1038

    
1039
HVS_PARAMETER_TITLES = {
1040
  HV_ACPI: "ACPI",
1041
  HV_BOOT_ORDER: "Boot_order",
1042
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1043
  HV_DISK_TYPE: "Disk_type",
1044
  HV_INITRD_PATH: "Initrd_path",
1045
  HV_KERNEL_PATH: "Kernel_path",
1046
  HV_NIC_TYPE: "NIC_type",
1047
  HV_PAE: "PAE",
1048
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1049
  HV_PASSTHROUGH: "pci_pass",
1050
  HV_CPU_TYPE: "cpu_type",
1051
  }
1052

    
1053
# Migration statuses
1054
HV_MIGRATION_COMPLETED = "completed"
1055
HV_MIGRATION_ACTIVE = "active"
1056
HV_MIGRATION_FAILED = "failed"
1057
HV_MIGRATION_CANCELLED = "cancelled"
1058

    
1059
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1060
  HV_MIGRATION_COMPLETED,
1061
  HV_MIGRATION_ACTIVE,
1062
  HV_MIGRATION_FAILED,
1063
  HV_MIGRATION_CANCELLED,
1064
  ])
1065

    
1066
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1067
  HV_MIGRATION_FAILED,
1068
  HV_MIGRATION_CANCELLED,
1069
  ])
1070

    
1071
# KVM-specific statuses
1072
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1073

    
1074
# Node info keys
1075
HV_NODEINFO_KEY_VERSION = "hv_version"
1076

    
1077
# Hypervisor state
1078
HVST_MEMORY_TOTAL = "mem_total"
1079
HVST_MEMORY_NODE = "mem_node"
1080
HVST_MEMORY_HV = "mem_hv"
1081
HVST_CPU_TOTAL = "cpu_total"
1082
HVST_CPU_NODE = "cpu_node"
1083

    
1084
HVST_DEFAULTS = {
1085
  HVST_MEMORY_TOTAL: 0,
1086
  HVST_MEMORY_NODE: 0,
1087
  HVST_MEMORY_HV: 0,
1088
  HVST_CPU_TOTAL: 1,
1089
  HVST_CPU_NODE: 1,
1090
  }
1091

    
1092
HVSTS_PARAMETER_TYPES = {
1093
  HVST_MEMORY_TOTAL: VTYPE_INT,
1094
  HVST_MEMORY_NODE: VTYPE_INT,
1095
  HVST_MEMORY_HV: VTYPE_INT,
1096
  HVST_CPU_TOTAL: VTYPE_INT,
1097
  HVST_CPU_NODE: VTYPE_INT,
1098
  }
1099

    
1100
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1101

    
1102
# Disk state
1103
DS_DISK_TOTAL = "disk_total"
1104
DS_DISK_RESERVED = "disk_reserved"
1105
DS_DISK_OVERHEAD = "disk_overhead"
1106

    
1107
DS_DEFAULTS = {
1108
  DS_DISK_TOTAL: 0,
1109
  DS_DISK_RESERVED: 0,
1110
  DS_DISK_OVERHEAD: 0,
1111
  }
1112

    
1113
DSS_PARAMETER_TYPES = {
1114
  DS_DISK_TOTAL: VTYPE_INT,
1115
  DS_DISK_RESERVED: VTYPE_INT,
1116
  DS_DISK_OVERHEAD: VTYPE_INT,
1117
  }
1118

    
1119
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1120
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1121

    
1122
# Backend parameter names
1123
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1124
BE_MAXMEM = "maxmem"
1125
BE_MINMEM = "minmem"
1126
BE_VCPUS = "vcpus"
1127
BE_AUTO_BALANCE = "auto_balance"
1128
BE_ALWAYS_FAILOVER = "always_failover"
1129
BE_SPINDLE_USE = "spindle_use"
1130

    
1131
BES_PARAMETER_TYPES = {
1132
  BE_MAXMEM: VTYPE_SIZE,
1133
  BE_MINMEM: VTYPE_SIZE,
1134
  BE_VCPUS: VTYPE_INT,
1135
  BE_AUTO_BALANCE: VTYPE_BOOL,
1136
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1137
  BE_SPINDLE_USE: VTYPE_INT,
1138
  }
1139

    
1140
BES_PARAMETER_TITLES = {
1141
  BE_AUTO_BALANCE: "Auto_balance",
1142
  BE_MAXMEM: "ConfigMaxMem",
1143
  BE_MINMEM: "ConfigMinMem",
1144
  BE_VCPUS: "ConfigVCPUs",
1145
  }
1146

    
1147
BES_PARAMETER_COMPAT = {
1148
  BE_MEMORY: VTYPE_SIZE,
1149
  }
1150
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1151

    
1152
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1153

    
1154
# instance specs
1155
ISPEC_MEM_SIZE = "memory-size"
1156
ISPEC_CPU_COUNT = "cpu-count"
1157
ISPEC_DISK_COUNT = "disk-count"
1158
ISPEC_DISK_SIZE = "disk-size"
1159
ISPEC_NIC_COUNT = "nic-count"
1160
ISPEC_SPINDLE_USE = "spindle-use"
1161

    
1162
ISPECS_PARAMETER_TYPES = {
1163
  ISPEC_MEM_SIZE: VTYPE_INT,
1164
  ISPEC_CPU_COUNT: VTYPE_INT,
1165
  ISPEC_DISK_COUNT: VTYPE_INT,
1166
  ISPEC_DISK_SIZE: VTYPE_INT,
1167
  ISPEC_NIC_COUNT: VTYPE_INT,
1168
  ISPEC_SPINDLE_USE: VTYPE_INT,
1169
  }
1170

    
1171
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1172

    
1173
ISPECS_MINMAX = "minmax"
1174
ISPECS_MIN = "min"
1175
ISPECS_MAX = "max"
1176
ISPECS_STD = "std"
1177
IPOLICY_DTS = "disk-templates"
1178
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1179
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1180

    
1181
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1182
  ISPECS_MIN,
1183
  ISPECS_MAX,
1184
  ])
1185

    
1186
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1187
  IPOLICY_VCPU_RATIO,
1188
  IPOLICY_SPINDLE_RATIO,
1189
  ])
1190

    
1191
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1192
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1193

    
1194
# Node parameter names
1195
ND_OOB_PROGRAM = "oob_program"
1196
ND_SPINDLE_COUNT = "spindle_count"
1197
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1198

    
1199
NDS_PARAMETER_TYPES = {
1200
  ND_OOB_PROGRAM: VTYPE_STRING,
1201
  ND_SPINDLE_COUNT: VTYPE_INT,
1202
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1203
  }
1204

    
1205
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1206

    
1207
NDS_PARAMETER_TITLES = {
1208
  ND_OOB_PROGRAM: "OutOfBandProgram",
1209
  ND_SPINDLE_COUNT: "SpindleCount",
1210
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1211
  }
1212

    
1213
# Logical Disks parameters
1214
LDP_RESYNC_RATE = "resync-rate"
1215
LDP_STRIPES = "stripes"
1216
LDP_BARRIERS = "disabled-barriers"
1217
LDP_NO_META_FLUSH = "disable-meta-flush"
1218
LDP_DEFAULT_METAVG = "default-metavg"
1219
LDP_DISK_CUSTOM = "disk-custom"
1220
LDP_NET_CUSTOM = "net-custom"
1221
LDP_PROTOCOL = "protocol"
1222
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1223
LDP_PLAN_AHEAD = "c-plan-ahead"
1224
LDP_FILL_TARGET = "c-fill-target"
1225
LDP_DELAY_TARGET = "c-delay-target"
1226
LDP_MAX_RATE = "c-max-rate"
1227
LDP_MIN_RATE = "c-min-rate"
1228
LDP_POOL = "pool"
1229
DISK_LD_TYPES = {
1230
  LDP_RESYNC_RATE: VTYPE_INT,
1231
  LDP_STRIPES: VTYPE_INT,
1232
  LDP_BARRIERS: VTYPE_STRING,
1233
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1234
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1235
  LDP_DISK_CUSTOM: VTYPE_STRING,
1236
  LDP_NET_CUSTOM: VTYPE_STRING,
1237
  LDP_PROTOCOL: VTYPE_STRING,
1238
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1239
  LDP_PLAN_AHEAD: VTYPE_INT,
1240
  LDP_FILL_TARGET: VTYPE_INT,
1241
  LDP_DELAY_TARGET: VTYPE_INT,
1242
  LDP_MAX_RATE: VTYPE_INT,
1243
  LDP_MIN_RATE: VTYPE_INT,
1244
  LDP_POOL: VTYPE_STRING,
1245
  }
1246
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1247

    
1248
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1249
# gnt-group)
1250
DRBD_RESYNC_RATE = "resync-rate"
1251
DRBD_DATA_STRIPES = "data-stripes"
1252
DRBD_META_STRIPES = "meta-stripes"
1253
DRBD_DISK_BARRIERS = "disk-barriers"
1254
DRBD_META_BARRIERS = "meta-barriers"
1255
DRBD_DEFAULT_METAVG = "metavg"
1256
DRBD_DISK_CUSTOM = "disk-custom"
1257
DRBD_NET_CUSTOM = "net-custom"
1258
DRBD_PROTOCOL = "protocol"
1259
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1260
DRBD_PLAN_AHEAD = "c-plan-ahead"
1261
DRBD_FILL_TARGET = "c-fill-target"
1262
DRBD_DELAY_TARGET = "c-delay-target"
1263
DRBD_MAX_RATE = "c-max-rate"
1264
DRBD_MIN_RATE = "c-min-rate"
1265
LV_STRIPES = "stripes"
1266
RBD_POOL = "pool"
1267
DISK_DT_TYPES = {
1268
  DRBD_RESYNC_RATE: VTYPE_INT,
1269
  DRBD_DATA_STRIPES: VTYPE_INT,
1270
  DRBD_META_STRIPES: VTYPE_INT,
1271
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1272
  DRBD_META_BARRIERS: VTYPE_BOOL,
1273
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1274
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1275
  DRBD_NET_CUSTOM: VTYPE_STRING,
1276
  DRBD_PROTOCOL: VTYPE_STRING,
1277
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1278
  DRBD_PLAN_AHEAD: VTYPE_INT,
1279
  DRBD_FILL_TARGET: VTYPE_INT,
1280
  DRBD_DELAY_TARGET: VTYPE_INT,
1281
  DRBD_MAX_RATE: VTYPE_INT,
1282
  DRBD_MIN_RATE: VTYPE_INT,
1283
  LV_STRIPES: VTYPE_INT,
1284
  RBD_POOL: VTYPE_STRING,
1285
  }
1286

    
1287
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1288

    
1289
# OOB supported commands
1290
OOB_POWER_ON = "power-on"
1291
OOB_POWER_OFF = "power-off"
1292
OOB_POWER_CYCLE = "power-cycle"
1293
OOB_POWER_STATUS = "power-status"
1294
OOB_HEALTH = "health"
1295

    
1296
OOB_COMMANDS = compat.UniqueFrozenset([
1297
  OOB_POWER_ON,
1298
  OOB_POWER_OFF,
1299
  OOB_POWER_CYCLE,
1300
  OOB_POWER_STATUS,
1301
  OOB_HEALTH,
1302
  ])
1303

    
1304
OOB_POWER_STATUS_POWERED = "powered"
1305

    
1306
OOB_TIMEOUT = 60 # 60 seconds
1307
OOB_POWER_DELAY = 2.0 # 2 seconds
1308

    
1309
OOB_STATUS_OK = "OK"
1310
OOB_STATUS_WARNING = "WARNING"
1311
OOB_STATUS_CRITICAL = "CRITICAL"
1312
OOB_STATUS_UNKNOWN = "UNKNOWN"
1313

    
1314
OOB_STATUSES = compat.UniqueFrozenset([
1315
  OOB_STATUS_OK,
1316
  OOB_STATUS_WARNING,
1317
  OOB_STATUS_CRITICAL,
1318
  OOB_STATUS_UNKNOWN,
1319
  ])
1320

    
1321
# Instance Parameters Profile
1322
PP_DEFAULT = "default"
1323

    
1324
# NIC_* constants are used inside the ganeti config
1325
NIC_MODE = "mode"
1326
NIC_LINK = "link"
1327

    
1328
NIC_MODE_BRIDGED = "bridged"
1329
NIC_MODE_ROUTED = "routed"
1330
NIC_MODE_OVS = "openvswitch"
1331
NIC_IP_POOL = "pool"
1332

    
1333
NIC_VALID_MODES = compat.UniqueFrozenset([
1334
  NIC_MODE_BRIDGED,
1335
  NIC_MODE_ROUTED,
1336
  NIC_MODE_OVS,
1337
  ])
1338

    
1339
RESERVE_ACTION = "reserve"
1340
RELEASE_ACTION = "release"
1341

    
1342
NICS_PARAMETER_TYPES = {
1343
  NIC_MODE: VTYPE_STRING,
1344
  NIC_LINK: VTYPE_STRING,
1345
  }
1346

    
1347
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1348

    
1349
# IDISK_* constants are used in opcodes, to create/change disks
1350
IDISK_SIZE = "size"
1351
IDISK_SPINDLES = "spindles"
1352
IDISK_MODE = "mode"
1353
IDISK_ADOPT = "adopt"
1354
IDISK_VG = "vg"
1355
IDISK_METAVG = "metavg"
1356
IDISK_PROVIDER = "provider"
1357
IDISK_NAME = "name"
1358
IDISK_PARAMS_TYPES = {
1359
  IDISK_SIZE: VTYPE_SIZE,
1360
  IDISK_SPINDLES: VTYPE_INT,
1361
  IDISK_MODE: VTYPE_STRING,
1362
  IDISK_ADOPT: VTYPE_STRING,
1363
  IDISK_VG: VTYPE_STRING,
1364
  IDISK_METAVG: VTYPE_STRING,
1365
  IDISK_PROVIDER: VTYPE_STRING,
1366
  IDISK_NAME: VTYPE_MAYBE_STRING,
1367
  }
1368
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1369

    
1370
# INIC_* constants are used in opcodes, to create/change nics
1371
INIC_MAC = "mac"
1372
INIC_IP = "ip"
1373
INIC_MODE = "mode"
1374
INIC_LINK = "link"
1375
INIC_NETWORK = "network"
1376
INIC_NAME = "name"
1377
INIC_PARAMS_TYPES = {
1378
  INIC_IP: VTYPE_MAYBE_STRING,
1379
  INIC_LINK: VTYPE_STRING,
1380
  INIC_MAC: VTYPE_STRING,
1381
  INIC_MODE: VTYPE_STRING,
1382
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1383
  INIC_NAME: VTYPE_MAYBE_STRING,
1384
  }
1385
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1386

    
1387
# Hypervisor constants
1388
HT_XEN_PVM = "xen-pvm"
1389
HT_FAKE = "fake"
1390
HT_XEN_HVM = "xen-hvm"
1391
HT_KVM = "kvm"
1392
HT_CHROOT = "chroot"
1393
HT_LXC = "lxc"
1394
HYPER_TYPES = compat.UniqueFrozenset([
1395
  HT_XEN_PVM,
1396
  HT_FAKE,
1397
  HT_XEN_HVM,
1398
  HT_KVM,
1399
  HT_CHROOT,
1400
  HT_LXC,
1401
  ])
1402
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1403

    
1404
VNC_BASE_PORT = 5900
1405
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1406

    
1407
# NIC types
1408
HT_NIC_RTL8139 = "rtl8139"
1409
HT_NIC_NE2K_PCI = "ne2k_pci"
1410
HT_NIC_NE2K_ISA = "ne2k_isa"
1411
HT_NIC_I82551 = "i82551"
1412
HT_NIC_I85557B = "i82557b"
1413
HT_NIC_I8259ER = "i82559er"
1414
HT_NIC_PCNET = "pcnet"
1415
HT_NIC_E1000 = "e1000"
1416
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1417

    
1418
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1419
  HT_NIC_RTL8139,
1420
  HT_NIC_NE2K_PCI,
1421
  HT_NIC_E1000,
1422
  HT_NIC_NE2K_ISA,
1423
  HT_NIC_PARAVIRTUAL,
1424
  ])
1425
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1426
  HT_NIC_RTL8139,
1427
  HT_NIC_NE2K_PCI,
1428
  HT_NIC_NE2K_ISA,
1429
  HT_NIC_I82551,
1430
  HT_NIC_I85557B,
1431
  HT_NIC_I8259ER,
1432
  HT_NIC_PCNET,
1433
  HT_NIC_E1000,
1434
  HT_NIC_PARAVIRTUAL,
1435
  ])
1436

    
1437
# Vif types
1438
# default vif type in xen-hvm
1439
HT_HVM_VIF_IOEMU = "ioemu"
1440
HT_HVM_VIF_VIF = "vif"
1441
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1442
  HT_HVM_VIF_IOEMU,
1443
  HT_HVM_VIF_VIF,
1444
  ])
1445

    
1446
# Disk types
1447
HT_DISK_IOEMU = "ioemu"
1448
HT_DISK_IDE = "ide"
1449
HT_DISK_SCSI = "scsi"
1450
HT_DISK_SD = "sd"
1451
HT_DISK_MTD = "mtd"
1452
HT_DISK_PFLASH = "pflash"
1453

    
1454
HT_CACHE_DEFAULT = "default"
1455
HT_CACHE_NONE = "none"
1456
HT_CACHE_WTHROUGH = "writethrough"
1457
HT_CACHE_WBACK = "writeback"
1458
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1459
  HT_CACHE_DEFAULT,
1460
  HT_CACHE_NONE,
1461
  HT_CACHE_WTHROUGH,
1462
  HT_CACHE_WBACK,
1463
  ])
1464

    
1465
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1466
  HT_DISK_PARAVIRTUAL,
1467
  HT_DISK_IOEMU,
1468
  ])
1469
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1470
  HT_DISK_PARAVIRTUAL,
1471
  HT_DISK_IDE,
1472
  HT_DISK_SCSI,
1473
  HT_DISK_SD,
1474
  HT_DISK_MTD,
1475
  HT_DISK_PFLASH,
1476
  ])
1477

    
1478
# Mouse types:
1479
HT_MOUSE_MOUSE = "mouse"
1480
HT_MOUSE_TABLET = "tablet"
1481

    
1482
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1483
  HT_MOUSE_MOUSE,
1484
  HT_MOUSE_TABLET,
1485
  ])
1486

    
1487
# Boot order
1488
HT_BO_FLOPPY = "floppy"
1489
HT_BO_CDROM = "cdrom"
1490
HT_BO_DISK = "disk"
1491
HT_BO_NETWORK = "network"
1492

    
1493
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1494
  HT_BO_FLOPPY,
1495
  HT_BO_CDROM,
1496
  HT_BO_DISK,
1497
  HT_BO_NETWORK,
1498
  ])
1499

    
1500
# SPICE lossless image compression options
1501
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1502
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1503
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1504
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1505
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1506
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1507

    
1508
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1509
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1510
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1511
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1512
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1513
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1514
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1515
  ])
1516

    
1517
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1518
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1519
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1520
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1521

    
1522
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1523
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1524
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1525
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1526
  ])
1527

    
1528
# SPICE video stream detection
1529
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1530
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1531
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1532

    
1533
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1534
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1535
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1536
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1537
  ])
1538

    
1539
# Security models
1540
HT_SM_NONE = "none"
1541
HT_SM_USER = "user"
1542
HT_SM_POOL = "pool"
1543

    
1544
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1545
  HT_SM_NONE,
1546
  HT_SM_USER,
1547
  HT_SM_POOL,
1548
  ])
1549

    
1550
# Kvm flag values
1551
HT_KVM_ENABLED = "enabled"
1552
HT_KVM_DISABLED = "disabled"
1553

    
1554
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1555

    
1556
# Migration type
1557
HT_MIGRATION_LIVE = "live"
1558
HT_MIGRATION_NONLIVE = "non-live"
1559
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1560
  HT_MIGRATION_LIVE,
1561
  HT_MIGRATION_NONLIVE,
1562
  ])
1563

    
1564
# Cluster Verify steps
1565
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1566
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1567

    
1568
# Cluster Verify error classes
1569
CV_TCLUSTER = "cluster"
1570
CV_TGROUP = "group"
1571
CV_TNODE = "node"
1572
CV_TINSTANCE = "instance"
1573

    
1574
# Cluster Verify error codes and documentation
1575
CV_ECLUSTERCFG = \
1576
  (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1577
CV_ECLUSTERCERT = \
1578
  (CV_TCLUSTER, "ECLUSTERCERT",
1579
   "Cluster certificate files verification failure")
1580
CV_ECLUSTERFILECHECK = \
1581
  (CV_TCLUSTER, "ECLUSTERFILECHECK",
1582
   "Cluster configuration verification failure")
1583
CV_ECLUSTERDANGLINGNODES = \
1584
  (CV_TNODE, "ECLUSTERDANGLINGNODES",
1585
   "Some nodes belong to non-existing groups")
1586
CV_ECLUSTERDANGLINGINST = \
1587
  (CV_TNODE, "ECLUSTERDANGLINGINST",
1588
   "Some instances have a non-existing primary node")
1589
CV_EGROUPDIFFERENTPVSIZE = \
1590
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1591
CV_EINSTANCEBADNODE = \
1592
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1593
   "Instance marked as running lives on an offline node")
1594
CV_EINSTANCEDOWN = \
1595
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1596
CV_EINSTANCELAYOUT = \
1597
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1598
CV_EINSTANCEMISSINGDISK = \
1599
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1600
CV_EINSTANCEFAULTYDISK = \
1601
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1602
   "Impossible to retrieve status for a disk")
1603
CV_EINSTANCEWRONGNODE = \
1604
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1605
CV_EINSTANCESPLITGROUPS = \
1606
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1607
   "Instance with primary and secondary nodes in different groups")
1608
CV_EINSTANCEPOLICY = \
1609
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1610
   "Instance does not meet policy")
1611
CV_EINSTANCEUNSUITABLENODE = \
1612
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1613
   "Instance running on nodes that are not suitable for it")
1614
CV_EINSTANCEMISSINGCFGPARAMETER = \
1615
  (CV_TINSTANCE, "EINSTANCEMISSINGCFGPARAMETER",
1616
   "A configuration parameter for an instance is missing")
1617
CV_ENODEDRBD = \
1618
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1619
CV_ENODEDRBDVERSION = \
1620
  (CV_TNODE, "ENODEDRBDVERSION", "DRBD version mismatch within a node group")
1621
CV_ENODEDRBDHELPER = \
1622
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1623
CV_ENODEFILECHECK = \
1624
  (CV_TNODE, "ENODEFILECHECK",
1625
   "Error retrieving the checksum of the node files")
1626
CV_ENODEHOOKS = \
1627
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1628
CV_ENODEHV = \
1629
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1630
CV_ENODELVM = \
1631
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1632
CV_ENODEN1 = \
1633
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1634
CV_ENODENET = \
1635
  (CV_TNODE, "ENODENET", "Network-related node error")
1636
CV_ENODEOS = \
1637
  (CV_TNODE, "ENODEOS", "OS-related node error")
1638
CV_ENODEORPHANINSTANCE = \
1639
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1640
CV_ENODEORPHANLV = \
1641
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1642
CV_ENODERPC = \
1643
  (CV_TNODE, "ENODERPC",
1644
   "Error during connection to the primary node of an instance")
1645
CV_ENODESSH = \
1646
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1647
CV_ENODEVERSION = \
1648
  (CV_TNODE, "ENODEVERSION",
1649
   "Protocol version mismatch or Ganeti version mismatch")
1650
CV_ENODESETUP = \
1651
  (CV_TNODE, "ENODESETUP", "Node setup error")
1652
CV_ENODETIME = \
1653
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1654
CV_ENODEOOBPATH = \
1655
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1656
CV_ENODEUSERSCRIPTS = \
1657
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1658
CV_ENODEFILESTORAGEPATHS = \
1659
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1660
CV_ENODEFILESTORAGEPATHUNUSABLE = \
1661
  (CV_TNODE, "ENODEFILESTORAGEPATHUNUSABLE", "File storage path unusable")
1662

    
1663
CV_ALL_ECODES = compat.UniqueFrozenset([
1664
  CV_ECLUSTERCFG,
1665
  CV_ECLUSTERCERT,
1666
  CV_ECLUSTERFILECHECK,
1667
  CV_ECLUSTERDANGLINGNODES,
1668
  CV_ECLUSTERDANGLINGINST,
1669
  CV_EINSTANCEBADNODE,
1670
  CV_EINSTANCEDOWN,
1671
  CV_EINSTANCELAYOUT,
1672
  CV_EINSTANCEMISSINGDISK,
1673
  CV_EINSTANCEFAULTYDISK,
1674
  CV_EINSTANCEWRONGNODE,
1675
  CV_EINSTANCESPLITGROUPS,
1676
  CV_EINSTANCEPOLICY,
1677
  CV_ENODEDRBD,
1678
  CV_ENODEDRBDHELPER,
1679
  CV_ENODEFILECHECK,
1680
  CV_ENODEHOOKS,
1681
  CV_ENODEHV,
1682
  CV_ENODELVM,
1683
  CV_ENODEN1,
1684
  CV_ENODENET,
1685
  CV_ENODEOS,
1686
  CV_ENODEORPHANINSTANCE,
1687
  CV_ENODEORPHANLV,
1688
  CV_ENODERPC,
1689
  CV_ENODESSH,
1690
  CV_ENODEVERSION,
1691
  CV_ENODESETUP,
1692
  CV_ENODETIME,
1693
  CV_ENODEOOBPATH,
1694
  CV_ENODEUSERSCRIPTS,
1695
  CV_ENODEFILESTORAGEPATHS,
1696
  CV_ENODEFILESTORAGEPATHUNUSABLE,
1697
  ])
1698

    
1699
CV_ALL_ECODES_STRINGS = \
1700
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1701

    
1702
# Node verify constants
1703
NV_BRIDGES = "bridges"
1704
NV_DRBDHELPER = "drbd-helper"
1705
NV_DRBDVERSION = "drbd-version"
1706
NV_DRBDLIST = "drbd-list"
1707
NV_EXCLUSIVEPVS = "exclusive-pvs"
1708
NV_FILELIST = "filelist"
1709
NV_ACCEPTED_STORAGE_PATHS = "allowed-file-storage-paths"
1710
NV_FILE_STORAGE_PATH = "file-storage-path"
1711
NV_SHARED_FILE_STORAGE_PATH = "shared-file-storage-path"
1712
NV_HVINFO = "hvinfo"
1713
NV_HVPARAMS = "hvparms"
1714
NV_HYPERVISOR = "hypervisor"
1715
NV_INSTANCELIST = "instancelist"
1716
NV_LVLIST = "lvlist"
1717
NV_MASTERIP = "master-ip"
1718
NV_NODELIST = "nodelist"
1719
NV_NODENETTEST = "node-net-test"
1720
NV_NODESETUP = "nodesetup"
1721
NV_OOB_PATHS = "oob-paths"
1722
NV_OSLIST = "oslist"
1723
NV_PVLIST = "pvlist"
1724
NV_TIME = "time"
1725
NV_USERSCRIPTS = "user-scripts"
1726
NV_VERSION = "version"
1727
NV_VGLIST = "vglist"
1728
NV_VMNODES = "vmnodes"
1729

    
1730
# Instance status
1731
INSTST_RUNNING = "running"
1732
INSTST_ADMINDOWN = "ADMIN_down"
1733
INSTST_ADMINOFFLINE = "ADMIN_offline"
1734
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1735
INSTST_NODEDOWN = "ERROR_nodedown"
1736
INSTST_WRONGNODE = "ERROR_wrongnode"
1737
INSTST_ERRORUP = "ERROR_up"
1738
INSTST_ERRORDOWN = "ERROR_down"
1739
INSTST_ALL = compat.UniqueFrozenset([
1740
  INSTST_RUNNING,
1741
  INSTST_ADMINDOWN,
1742
  INSTST_ADMINOFFLINE,
1743
  INSTST_NODEOFFLINE,
1744
  INSTST_NODEDOWN,
1745
  INSTST_WRONGNODE,
1746
  INSTST_ERRORUP,
1747
  INSTST_ERRORDOWN,
1748
  ])
1749

    
1750
# Admin states
1751
ADMINST_UP = "up"
1752
ADMINST_DOWN = "down"
1753
ADMINST_OFFLINE = "offline"
1754
ADMINST_ALL = compat.UniqueFrozenset([
1755
  ADMINST_UP,
1756
  ADMINST_DOWN,
1757
  ADMINST_OFFLINE,
1758
  ])
1759

    
1760
# Node roles
1761
NR_REGULAR = "R"
1762
NR_MASTER = "M"
1763
NR_MCANDIDATE = "C"
1764
NR_DRAINED = "D"
1765
NR_OFFLINE = "O"
1766
NR_ALL = compat.UniqueFrozenset([
1767
  NR_REGULAR,
1768
  NR_MASTER,
1769
  NR_MCANDIDATE,
1770
  NR_DRAINED,
1771
  NR_OFFLINE,
1772
  ])
1773

    
1774
# SSL certificate check constants (in days)
1775
SSL_CERT_EXPIRATION_WARN = 30
1776
SSL_CERT_EXPIRATION_ERROR = 7
1777

    
1778
# Allocator framework constants
1779
IALLOCATOR_VERSION = 2
1780
IALLOCATOR_DIR_IN = "in"
1781
IALLOCATOR_DIR_OUT = "out"
1782
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1783
  IALLOCATOR_DIR_IN,
1784
  IALLOCATOR_DIR_OUT,
1785
  ])
1786
IALLOCATOR_MODE_ALLOC = "allocate"
1787
IALLOCATOR_MODE_RELOC = "relocate"
1788
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1789
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1790
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1791
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1792
  IALLOCATOR_MODE_ALLOC,
1793
  IALLOCATOR_MODE_RELOC,
1794
  IALLOCATOR_MODE_CHG_GROUP,
1795
  IALLOCATOR_MODE_NODE_EVAC,
1796
  IALLOCATOR_MODE_MULTI_ALLOC,
1797
  ])
1798
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1799
DEFAULT_IALLOCATOR_SHORTCUT = "."
1800

    
1801
IALLOCATOR_NEVAC_PRI = "primary-only"
1802
IALLOCATOR_NEVAC_SEC = "secondary-only"
1803
IALLOCATOR_NEVAC_ALL = "all"
1804
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1805
  IALLOCATOR_NEVAC_PRI,
1806
  IALLOCATOR_NEVAC_SEC,
1807
  IALLOCATOR_NEVAC_ALL,
1808
  ])
1809

    
1810
# Node evacuation
1811
NODE_EVAC_PRI = "primary-only"
1812
NODE_EVAC_SEC = "secondary-only"
1813
NODE_EVAC_ALL = "all"
1814
NODE_EVAC_MODES = compat.UniqueFrozenset([
1815
  NODE_EVAC_PRI,
1816
  NODE_EVAC_SEC,
1817
  NODE_EVAC_ALL,
1818
  ])
1819

    
1820
# Job queue
1821
JOB_QUEUE_VERSION = 1
1822
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1823
JOB_QUEUE_FILES_PERMS = 0640
1824

    
1825
JOB_ID_TEMPLATE = r"\d+"
1826
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1827

    
1828
# unchanged job return
1829
JOB_NOTCHANGED = "nochange"
1830

    
1831
# Job status
1832
JOB_STATUS_QUEUED = "queued"
1833
JOB_STATUS_WAITING = "waiting"
1834
JOB_STATUS_CANCELING = "canceling"
1835
JOB_STATUS_RUNNING = "running"
1836
JOB_STATUS_CANCELED = "canceled"
1837
JOB_STATUS_SUCCESS = "success"
1838
JOB_STATUS_ERROR = "error"
1839
JOBS_PENDING = compat.UniqueFrozenset([
1840
  JOB_STATUS_QUEUED,
1841
  JOB_STATUS_WAITING,
1842
  JOB_STATUS_CANCELING,
1843
  ])
1844
JOBS_FINALIZED = compat.UniqueFrozenset([
1845
  JOB_STATUS_CANCELED,
1846
  JOB_STATUS_SUCCESS,
1847
  JOB_STATUS_ERROR,
1848
  ])
1849
JOB_STATUS_ALL = compat.UniqueFrozenset([
1850
  JOB_STATUS_RUNNING,
1851
  ]) | JOBS_PENDING | JOBS_FINALIZED
1852

    
1853
# OpCode status
1854
# not yet finalized
1855
OP_STATUS_QUEUED = "queued"
1856
OP_STATUS_WAITING = "waiting"
1857
OP_STATUS_CANCELING = "canceling"
1858
OP_STATUS_RUNNING = "running"
1859
# finalized
1860
OP_STATUS_CANCELED = "canceled"
1861
OP_STATUS_SUCCESS = "success"
1862
OP_STATUS_ERROR = "error"
1863
OPS_FINALIZED = compat.UniqueFrozenset([
1864
  OP_STATUS_CANCELED,
1865
  OP_STATUS_SUCCESS,
1866
  OP_STATUS_ERROR,
1867
  ])
1868

    
1869
# OpCode priority
1870
OP_PRIO_LOWEST = +19
1871
OP_PRIO_HIGHEST = -20
1872

    
1873
OP_PRIO_LOW = +10
1874
OP_PRIO_NORMAL = 0
1875
OP_PRIO_HIGH = -10
1876

    
1877
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1878
  OP_PRIO_LOW,
1879
  OP_PRIO_NORMAL,
1880
  OP_PRIO_HIGH,
1881
  ])
1882

    
1883
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1884

    
1885
# Lock recalculate mode
1886
LOCKS_REPLACE = "replace"
1887
LOCKS_APPEND = "append"
1888

    
1889
# Lock timeout (sum) before we should go into blocking acquire (still
1890
# can be reset by priority change); computed as max time (10 hours)
1891
# before we should actually go into blocking acquire given that we
1892
# start from default priority level; in seconds
1893
# TODO
1894
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1895
LOCK_ATTEMPTS_MAXWAIT = 15.0
1896
LOCK_ATTEMPTS_MINWAIT = 1.0
1897

    
1898
# Execution log types
1899
ELOG_MESSAGE = "message"
1900
ELOG_REMOTE_IMPORT = "remote-import"
1901
ELOG_JQUEUE_TEST = "jqueue-test"
1902

    
1903
# /etc/hosts modification
1904
ETC_HOSTS_ADD = "add"
1905
ETC_HOSTS_REMOVE = "remove"
1906

    
1907
# Job queue test
1908
JQT_MSGPREFIX = "TESTMSG="
1909
JQT_EXPANDNAMES = "expandnames"
1910
JQT_EXEC = "exec"
1911
JQT_LOGMSG = "logmsg"
1912
JQT_STARTMSG = "startmsg"
1913
JQT_ALL = compat.UniqueFrozenset([
1914
  JQT_EXPANDNAMES,
1915
  JQT_EXEC,
1916
  JQT_LOGMSG,
1917
  JQT_STARTMSG,
1918
  ])
1919

    
1920
# Query resources
1921
QR_CLUSTER = "cluster"
1922
QR_INSTANCE = "instance"
1923
QR_NODE = "node"
1924
QR_LOCK = "lock"
1925
QR_GROUP = "group"
1926
QR_OS = "os"
1927
QR_JOB = "job"
1928
QR_EXPORT = "export"
1929
QR_NETWORK = "network"
1930
QR_EXTSTORAGE = "extstorage"
1931

    
1932
#: List of resources which can be queried using L{opcodes.OpQuery}
1933
QR_VIA_OP = compat.UniqueFrozenset([
1934
  QR_CLUSTER,
1935
  QR_INSTANCE,
1936
  QR_NODE,
1937
  QR_GROUP,
1938
  QR_OS,
1939
  QR_EXPORT,
1940
  QR_NETWORK,
1941
  QR_EXTSTORAGE,
1942
  ])
1943

    
1944
#: List of resources which can be queried using Local UniX Interface
1945
QR_VIA_LUXI = QR_VIA_OP.union([
1946
  QR_LOCK,
1947
  QR_JOB,
1948
  ])
1949

    
1950
#: List of resources which can be queried using RAPI
1951
QR_VIA_RAPI = QR_VIA_LUXI
1952

    
1953
# Query field types
1954
QFT_UNKNOWN = "unknown"
1955
QFT_TEXT = "text"
1956
QFT_BOOL = "bool"
1957
QFT_NUMBER = "number"
1958
QFT_UNIT = "unit"
1959
QFT_TIMESTAMP = "timestamp"
1960
QFT_OTHER = "other"
1961

    
1962
#: All query field types
1963
QFT_ALL = compat.UniqueFrozenset([
1964
  QFT_UNKNOWN,
1965
  QFT_TEXT,
1966
  QFT_BOOL,
1967
  QFT_NUMBER,
1968
  QFT_UNIT,
1969
  QFT_TIMESTAMP,
1970
  QFT_OTHER,
1971
  ])
1972

    
1973
# Query result field status (don't change or reuse values as they're used by
1974
# clients)
1975
#: Normal field status
1976
RS_NORMAL = 0
1977
#: Unknown field
1978
RS_UNKNOWN = 1
1979
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1980
RS_NODATA = 2
1981
#: Value unavailable/unsupported for item; if this field is supported
1982
#: but we cannot get the data for the moment, RS_NODATA or
1983
#: RS_OFFLINE should be used
1984
RS_UNAVAIL = 3
1985
#: Resource marked offline
1986
RS_OFFLINE = 4
1987

    
1988
RS_ALL = compat.UniqueFrozenset([
1989
  RS_NORMAL,
1990
  RS_UNKNOWN,
1991
  RS_NODATA,
1992
  RS_UNAVAIL,
1993
  RS_OFFLINE,
1994
  ])
1995

    
1996
#: Dictionary with special field cases and their verbose/terse formatting
1997
RSS_DESCRIPTION = {
1998
  RS_UNKNOWN: ("(unknown)", "??"),
1999
  RS_NODATA: ("(nodata)", "?"),
2000
  RS_OFFLINE: ("(offline)", "*"),
2001
  RS_UNAVAIL: ("(unavail)", "-"),
2002
  }
2003

    
2004
# max dynamic devices
2005
MAX_NICS = 8
2006
MAX_DISKS = 16
2007

    
2008
# SSCONF file prefix
2009
SSCONF_FILEPREFIX = "ssconf_"
2010
# SSCONF keys
2011
SS_CLUSTER_NAME = "cluster_name"
2012
SS_CLUSTER_TAGS = "cluster_tags"
2013
SS_FILE_STORAGE_DIR = "file_storage_dir"
2014
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
2015
SS_MASTER_CANDIDATES = "master_candidates"
2016
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
2017
SS_MASTER_IP = "master_ip"
2018
SS_MASTER_NETDEV = "master_netdev"
2019
SS_MASTER_NETMASK = "master_netmask"
2020
SS_MASTER_NODE = "master_node"
2021
SS_NODE_LIST = "node_list"
2022
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2023
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2024
SS_OFFLINE_NODES = "offline_nodes"
2025
SS_ONLINE_NODES = "online_nodes"
2026
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2027
SS_INSTANCE_LIST = "instance_list"
2028
SS_RELEASE_VERSION = "release_version"
2029
SS_HYPERVISOR_LIST = "hypervisor_list"
2030
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2031
SS_UID_POOL = "uid_pool"
2032
SS_NODEGROUPS = "nodegroups"
2033
SS_NETWORKS = "networks"
2034

    
2035
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2036
SS_HVPARAMS_PREF = "hvparams_"
2037

    
2038
# Hvparams keys:
2039
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2040
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2041
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2042
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2043
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2044
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2045

    
2046
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2047
  SS_HVPARAMS_XEN_PVM,
2048
  SS_HVPARAMS_XEN_FAKE,
2049
  SS_HVPARAMS_XEN_HVM,
2050
  SS_HVPARAMS_XEN_KVM,
2051
  SS_HVPARAMS_XEN_CHROOT,
2052
  SS_HVPARAMS_XEN_LXC,
2053
  ])
2054

    
2055
SS_FILE_PERMS = 0444
2056

    
2057
# cluster wide default parameters
2058
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2059

    
2060
HVC_DEFAULTS = {
2061
  HT_XEN_PVM: {
2062
    HV_USE_BOOTLOADER: False,
2063
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
2064
    HV_BOOTLOADER_ARGS: "",
2065
    HV_KERNEL_PATH: XEN_KERNEL,
2066
    HV_INITRD_PATH: "",
2067
    HV_ROOT_PATH: "/dev/xvda1",
2068
    HV_KERNEL_ARGS: "ro",
2069
    HV_MIGRATION_PORT: 8002,
2070
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2071
    HV_BLOCKDEV_PREFIX: "sd",
2072
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2073
    HV_CPU_MASK: CPU_PINNING_ALL,
2074
    HV_CPU_CAP: 0,
2075
    HV_CPU_WEIGHT: 256,
2076
    HV_VIF_SCRIPT: "",
2077
    HV_XEN_CMD: XEN_CMD_XM,
2078
    },
2079
  HT_XEN_HVM: {
2080
    HV_BOOT_ORDER: "cd",
2081
    HV_CDROM_IMAGE_PATH: "",
2082
    HV_NIC_TYPE: HT_NIC_RTL8139,
2083
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2084
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2085
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2086
    HV_ACPI: True,
2087
    HV_PAE: True,
2088
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2089
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2090
    HV_MIGRATION_PORT: 8002,
2091
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2092
    HV_USE_LOCALTIME: False,
2093
    HV_BLOCKDEV_PREFIX: "hd",
2094
    HV_PASSTHROUGH: "",
2095
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2096
    HV_CPU_MASK: CPU_PINNING_ALL,
2097
    HV_CPU_CAP: 0,
2098
    HV_CPU_WEIGHT: 256,
2099
    HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
2100
    HV_VIF_SCRIPT: "",
2101
    HV_XEN_CMD: XEN_CMD_XM,
2102
    },
2103
  HT_KVM: {
2104
    HV_KVM_PATH: KVM_PATH,
2105
    HV_KERNEL_PATH: KVM_KERNEL,
2106
    HV_INITRD_PATH: "",
2107
    HV_KERNEL_ARGS: "ro",
2108
    HV_ROOT_PATH: "/dev/vda1",
2109
    HV_ACPI: True,
2110
    HV_SERIAL_CONSOLE: True,
2111
    HV_SERIAL_SPEED: 38400,
2112
    HV_VNC_BIND_ADDRESS: "",
2113
    HV_VNC_TLS: False,
2114
    HV_VNC_X509: "",
2115
    HV_VNC_X509_VERIFY: False,
2116
    HV_VNC_PASSWORD_FILE: "",
2117
    HV_KVM_SPICE_BIND: "",
2118
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2119
    HV_KVM_SPICE_PASSWORD_FILE: "",
2120
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2121
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2122
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2123
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2124
    HV_KVM_SPICE_AUDIO_COMPR: True,
2125
    HV_KVM_SPICE_USE_TLS: False,
2126
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2127
    HV_KVM_SPICE_USE_VDAGENT: True,
2128
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2129
    HV_CDROM_IMAGE_PATH: "",
2130
    HV_KVM_CDROM2_IMAGE_PATH: "",
2131
    HV_BOOT_ORDER: HT_BO_DISK,
2132
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2133
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2134
    HV_KVM_CDROM_DISK_TYPE: "",
2135
    HV_USB_MOUSE: "",
2136
    HV_KEYMAP: "",
2137
    HV_MIGRATION_PORT: 8102,
2138
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2139
    HV_MIGRATION_DOWNTIME: 30,  # ms
2140
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2141
    HV_USE_LOCALTIME: False,
2142
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2143
    HV_SECURITY_MODEL: HT_SM_NONE,
2144
    HV_SECURITY_DOMAIN: "",
2145
    HV_KVM_FLAG: "",
2146
    HV_VHOST_NET: False,
2147
    HV_KVM_USE_CHROOT: False,
2148
    HV_MEM_PATH: "",
2149
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2150
    HV_CPU_MASK: CPU_PINNING_ALL,
2151
    HV_CPU_TYPE: "",
2152
    HV_CPU_CORES: 0,
2153
    HV_CPU_THREADS: 0,
2154
    HV_CPU_SOCKETS: 0,
2155
    HV_SOUNDHW: "",
2156
    HV_USB_DEVICES: "",
2157
    HV_VGA: "",
2158
    HV_KVM_EXTRA: "",
2159
    HV_KVM_MACHINE_VERSION: "",
2160
    HV_VNET_HDR: True,
2161
    },
2162
  HT_FAKE: {
2163
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2164
  },
2165
  HT_CHROOT: {
2166
    HV_INIT_SCRIPT: "/ganeti-chroot",
2167
    },
2168
  HT_LXC: {
2169
    HV_CPU_MASK: "",
2170
    },
2171
  }
2172

    
2173
HVC_GLOBALS = compat.UniqueFrozenset([
2174
  HV_MIGRATION_PORT,
2175
  HV_MIGRATION_BANDWIDTH,
2176
  HV_MIGRATION_MODE,
2177
  HV_XEN_CMD,
2178
  ])
2179

    
2180
BEC_DEFAULTS = {
2181
  BE_MINMEM: 128,
2182
  BE_MAXMEM: 128,
2183
  BE_VCPUS: 1,
2184
  BE_AUTO_BALANCE: True,
2185
  BE_ALWAYS_FAILOVER: False,
2186
  BE_SPINDLE_USE: 1,
2187
  }
2188

    
2189
NDC_DEFAULTS = {
2190
  ND_OOB_PROGRAM: "",
2191
  ND_SPINDLE_COUNT: 1,
2192
  ND_EXCLUSIVE_STORAGE: False,
2193
  }
2194

    
2195
NDC_GLOBALS = compat.UniqueFrozenset([
2196
  ND_EXCLUSIVE_STORAGE,
2197
  ])
2198

    
2199
DISK_LD_DEFAULTS = {
2200
  LD_DRBD8: {
2201
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2202
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2203
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2204
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2205
    LDP_DISK_CUSTOM: "",
2206
    LDP_NET_CUSTOM: "",
2207
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2208
    LDP_DYNAMIC_RESYNC: False,
2209

    
2210
    # The default values for the DRBD dynamic resync speed algorithm
2211
    # are taken from the drbsetup 8.3.11 man page, except for
2212
    # c-plan-ahead (that we don't need to set to 0, because we have a
2213
    # separate option to enable it) and for c-max-rate, that we cap to
2214
    # the default value for the static resync rate.
2215
    LDP_PLAN_AHEAD: 20, # ds
2216
    LDP_FILL_TARGET: 0, # sectors
2217
    LDP_DELAY_TARGET: 1, # ds
2218
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2219
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2220
    },
2221
  LD_LV: {
2222
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2223
    },
2224
  LD_FILE: {},
2225
  LD_BLOCKDEV: {},
2226
  LD_RBD: {
2227
    LDP_POOL: "rbd"
2228
    },
2229
  LD_EXT: {},
2230
  }
2231

    
2232
# readability shortcuts
2233
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2234
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2235

    
2236
DISK_DT_DEFAULTS = {
2237
  DT_PLAIN: {
2238
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2239
    },
2240
  DT_DRBD8: {
2241
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2242
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2243
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2244
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2245
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2246
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2247
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2248
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2249
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2250
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2251
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2252
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2253
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2254
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2255
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2256
    },
2257
  DT_DISKLESS: {},
2258
  DT_FILE: {},
2259
  DT_SHARED_FILE: {},
2260
  DT_BLOCK: {},
2261
  DT_RBD: {
2262
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2263
    },
2264
  DT_EXT: {},
2265
  }
2266

    
2267
# we don't want to export the shortcuts
2268
del _LV_DEFAULTS, _DRBD_DEFAULTS
2269

    
2270
NICC_DEFAULTS = {
2271
  NIC_MODE: NIC_MODE_BRIDGED,
2272
  NIC_LINK: DEFAULT_BRIDGE,
2273
  }
2274

    
2275
# All of the following values are quite arbitrarily - there are no
2276
# "good" defaults, these must be customised per-site
2277
ISPECS_MINMAX_DEFAULTS = {
2278
  ISPECS_MIN: {
2279
    ISPEC_MEM_SIZE: 128,
2280
    ISPEC_CPU_COUNT: 1,
2281
    ISPEC_DISK_COUNT: 1,
2282
    ISPEC_DISK_SIZE: 1024,
2283
    ISPEC_NIC_COUNT: 1,
2284
    ISPEC_SPINDLE_USE: 1,
2285
    },
2286
  ISPECS_MAX: {
2287
    ISPEC_MEM_SIZE: 32768,
2288
    ISPEC_CPU_COUNT: 8,
2289
    ISPEC_DISK_COUNT: MAX_DISKS,
2290
    ISPEC_DISK_SIZE: 1024 * 1024,
2291
    ISPEC_NIC_COUNT: MAX_NICS,
2292
    ISPEC_SPINDLE_USE: 12,
2293
    },
2294
  }
2295
IPOLICY_DEFAULTS = {
2296
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2297
  ISPECS_STD: {
2298
    ISPEC_MEM_SIZE: 128,
2299
    ISPEC_CPU_COUNT: 1,
2300
    ISPEC_DISK_COUNT: 1,
2301
    ISPEC_DISK_SIZE: 1024,
2302
    ISPEC_NIC_COUNT: 1,
2303
    ISPEC_SPINDLE_USE: 1,
2304
    },
2305
  IPOLICY_DTS: list(DISK_TEMPLATES),
2306
  IPOLICY_VCPU_RATIO: 4.0,
2307
  IPOLICY_SPINDLE_RATIO: 32.0,
2308
  }
2309

    
2310
MASTER_POOL_SIZE_DEFAULT = 10
2311

    
2312
# Exclusive storage:
2313
# Error margin used to compare physical disks
2314
PART_MARGIN = .01
2315
# Space reserved when creating instance disks
2316
PART_RESERVED = .02
2317

    
2318
CONFD_PROTOCOL_VERSION = 1
2319

    
2320
CONFD_REQ_PING = 0
2321
CONFD_REQ_NODE_ROLE_BYNAME = 1
2322
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2323
CONFD_REQ_CLUSTER_MASTER = 3
2324
CONFD_REQ_NODE_PIP_LIST = 4
2325
CONFD_REQ_MC_PIP_LIST = 5
2326
CONFD_REQ_INSTANCES_IPS_LIST = 6
2327
CONFD_REQ_NODE_DRBD = 7
2328
CONFD_REQ_NODE_INSTANCES = 8
2329

    
2330
# Confd request query fields. These are used to narrow down queries.
2331
# These must be strings rather than integers, because json-encoding
2332
# converts them to strings anyway, as they're used as dict-keys.
2333
CONFD_REQQ_LINK = "0"
2334
CONFD_REQQ_IP = "1"
2335
CONFD_REQQ_IPLIST = "2"
2336
CONFD_REQQ_FIELDS = "3"
2337

    
2338
CONFD_REQFIELD_NAME = "0"
2339
CONFD_REQFIELD_IP = "1"
2340
CONFD_REQFIELD_MNODE_PIP = "2"
2341

    
2342
CONFD_REQS = compat.UniqueFrozenset([
2343
  CONFD_REQ_PING,
2344
  CONFD_REQ_NODE_ROLE_BYNAME,
2345
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2346
  CONFD_REQ_CLUSTER_MASTER,
2347
  CONFD_REQ_NODE_PIP_LIST,
2348
  CONFD_REQ_MC_PIP_LIST,
2349
  CONFD_REQ_INSTANCES_IPS_LIST,
2350
  CONFD_REQ_NODE_DRBD,
2351
  ])
2352

    
2353
CONFD_REPL_STATUS_OK = 0
2354
CONFD_REPL_STATUS_ERROR = 1
2355
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2356

    
2357
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2358
  CONFD_REPL_STATUS_OK,
2359
  CONFD_REPL_STATUS_ERROR,
2360
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2361
  ])
2362

    
2363
(CONFD_NODE_ROLE_MASTER,
2364
 CONFD_NODE_ROLE_CANDIDATE,
2365
 CONFD_NODE_ROLE_OFFLINE,
2366
 CONFD_NODE_ROLE_DRAINED,
2367
 CONFD_NODE_ROLE_REGULAR,
2368
 ) = range(5)
2369

    
2370
# A few common errors for confd
2371
CONFD_ERROR_UNKNOWN_ENTRY = 1
2372
CONFD_ERROR_INTERNAL = 2
2373
CONFD_ERROR_ARGUMENT = 3
2374

    
2375
# Each request is "salted" by the current timestamp.
2376
# This constants decides how many seconds of skew to accept.
2377
# TODO: make this a default and allow the value to be more configurable
2378
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2379

    
2380
# When we haven't reloaded the config for more than this amount of
2381
# seconds, we force a test to see if inotify is betraying us. Using a
2382
# prime number to ensure we get less chance of 'same wakeup' with
2383
# other processes.
2384
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2385

    
2386
# If we receive more than one update in this amount of microseconds,
2387
# we move to polling every RATELIMIT seconds, rather than relying on
2388
# inotify, to be able to serve more requests.
2389
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2390

    
2391
# Magic number prepended to all confd queries.
2392
# This allows us to distinguish different types of confd protocols and handle
2393
# them. For example by changing this we can move the whole payload to be
2394
# compressed, or move away from json.
2395
CONFD_MAGIC_FOURCC = "plj0"
2396

    
2397
# By default a confd request is sent to the minimum between this number and all
2398
# MCs. 6 was chosen because even in the case of a disastrous 50% response rate,
2399
# we should have enough answers to be able to compare more than one.
2400
CONFD_DEFAULT_REQ_COVERAGE = 6
2401

    
2402
# Timeout in seconds to expire pending query request in the confd client
2403
# library. We don't actually expect any answer more than 10 seconds after we
2404
# sent a request.
2405
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2406

    
2407
# Maximum UDP datagram size.
2408
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2409
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2410
#   (assuming we can't use jumbo frames)
2411
# We just set this to 60K, which should be enough
2412
MAX_UDP_DATA_SIZE = 61440
2413

    
2414
# User-id pool minimum/maximum acceptable user-ids.
2415
UIDPOOL_UID_MIN = 0
2416
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2417

    
2418
# Name or path of the pgrep command
2419
PGREP = "pgrep"
2420

    
2421
# Name of the node group that gets created at cluster init or upgrade
2422
INITIAL_NODE_GROUP_NAME = "default"
2423

    
2424
# Possible values for NodeGroup.alloc_policy
2425
ALLOC_POLICY_PREFERRED = "preferred"
2426
ALLOC_POLICY_LAST_RESORT = "last_resort"
2427
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2428
VALID_ALLOC_POLICIES = [
2429
  ALLOC_POLICY_PREFERRED,
2430
  ALLOC_POLICY_LAST_RESORT,
2431
  ALLOC_POLICY_UNALLOCABLE,
2432
  ]
2433

    
2434
# Temporary external/shared storage parameters
2435
BLOCKDEV_DRIVER_MANUAL = "manual"
2436

    
2437
# qemu-img path, required for ovfconverter
2438
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2439

    
2440
# Whether htools was enabled at compilation time
2441
HTOOLS = _autoconf.HTOOLS
2442
# The hail iallocator
2443
IALLOC_HAIL = "hail"
2444

    
2445
# Fake opcodes for functions that have hooks attached to them via
2446
# backend.RunLocalHooks
2447
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2448
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2449

    
2450
# SSH key types
2451
SSHK_RSA = "rsa"
2452
SSHK_DSA = "dsa"
2453
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2454

    
2455
# SSH authorized key types
2456
SSHAK_RSA = "ssh-rsa"
2457
SSHAK_DSS = "ssh-dss"
2458
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2459

    
2460
# SSH setup
2461
SSHS_CLUSTER_NAME = "cluster_name"
2462
SSHS_SSH_HOST_KEY = "ssh_host_key"
2463
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2464
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2465

    
2466
#: Key files for SSH daemon
2467
SSH_DAEMON_KEYFILES = {
2468
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2469
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2470
  }
2471

    
2472
# Node daemon setup
2473
NDS_CLUSTER_NAME = "cluster_name"
2474
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2475
NDS_SSCONF = "ssconf"
2476
NDS_START_NODE_DAEMON = "start_node_daemon"
2477

    
2478
# Path generating random UUID
2479
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2480

    
2481
# Regex string for verifying a UUID
2482
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2483

    
2484
# Auto-repair tag prefixes
2485
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2486
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2487
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2488
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2489
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2490

    
2491
# Auto-repair levels
2492
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2493
AUTO_REPAIR_MIGRATE = "migrate"
2494
AUTO_REPAIR_FAILOVER = "failover"
2495
AUTO_REPAIR_REINSTALL = "reinstall"
2496
AUTO_REPAIR_ALL_TYPES = [
2497
  AUTO_REPAIR_FIX_STORAGE,
2498
  AUTO_REPAIR_MIGRATE,
2499
  AUTO_REPAIR_FAILOVER,
2500
  AUTO_REPAIR_REINSTALL,
2501
]
2502

    
2503
# Auto-repair results
2504
AUTO_REPAIR_SUCCESS = "success"
2505
AUTO_REPAIR_FAILURE = "failure"
2506
AUTO_REPAIR_ENOPERM = "enoperm"
2507
AUTO_REPAIR_ALL_RESULTS = frozenset([
2508
    AUTO_REPAIR_SUCCESS,
2509
    AUTO_REPAIR_FAILURE,
2510
    AUTO_REPAIR_ENOPERM,
2511
])
2512

    
2513
# The version identifier for builtin data collectors
2514
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2515

    
2516
# The reason trail opcode parameter name
2517
OPCODE_REASON = "reason"
2518

    
2519
# The source reasons for the execution of an OpCode
2520
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2521
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2522
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2523
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2524
OPCODE_REASON_SRC_USER = "gnt:user"
2525

    
2526
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2527
  OPCODE_REASON_SRC_CLIENT,
2528
  OPCODE_REASON_SRC_NODED,
2529
  OPCODE_REASON_SRC_OPCODE,
2530
  OPCODE_REASON_SRC_RLIB2,
2531
  OPCODE_REASON_SRC_USER,
2532
  ])
2533

    
2534
DISKSTATS_FILE = "/proc/diskstats"
2535

    
2536
# Do not re-export imported modules
2537
del re, _vcsversion, _autoconf, socket, pathutils, compat