Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 7eed4433

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_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
149
ENABLE_CONFD = _autoconf.ENABLE_CONFD
150
ENABLE_MOND = _autoconf.ENABLE_MOND
151
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
152
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
153

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

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

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

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

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

    
188
FIRST_DRBD_PORT = 11000
189
LAST_DRBD_PORT = 14999
190

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

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

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

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

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

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

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

    
231
DEV_CONSOLE = "/dev/console"
232

    
233
PROC_MOUNTS = "/proc/mounts"
234

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

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

    
250
EXPORT_CONF_FILE = "config.ini"
251

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
323
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
324

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

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

    
337
IE_CUSTOM_SIZE = "fd"
338

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

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

    
349
VALUE_DEFAULT = "default"
350
VALUE_AUTO = "auto"
351
VALUE_GENERATE = "generate"
352
VALUE_NONE = "none"
353
VALUE_TRUE = "true"
354
VALUE_FALSE = "false"
355
VALUE_HS_NOTHING = {"Nothing": None}
356

    
357

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

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

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

    
376
HKR_SKIP = 0
377
HKR_FAIL = 1
378
HKR_SUCCESS = 2
379

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

    
389
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
390
  ST_BLOCK,
391
  ST_DISKLESS,
392
  ST_EXT,
393
  ST_FILE,
394
  ST_LVM_PV,
395
  ST_LVM_VG,
396
  ST_RADOS,
397
  ])
398

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
727
# others
728
DEFAULT_BRIDGE = "xen-br0"
729
DEFAULT_OVS = "switch1"
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

    
962

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

    
1035
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1036

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

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

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

    
1064
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1065
  HV_MIGRATION_FAILED,
1066
  HV_MIGRATION_CANCELLED,
1067
  ])
1068

    
1069
# KVM-specific statuses
1070
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1071

    
1072
# Node info keys
1073
HV_NODEINFO_KEY_VERSION = "hv_version"
1074

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

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

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

    
1098
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1099

    
1100
# Disk state
1101
DS_DISK_TOTAL = "disk_total"
1102
DS_DISK_RESERVED = "disk_reserved"
1103
DS_DISK_OVERHEAD = "disk_overhead"
1104

    
1105
DS_DEFAULTS = {
1106
  DS_DISK_TOTAL: 0,
1107
  DS_DISK_RESERVED: 0,
1108
  DS_DISK_OVERHEAD: 0,
1109
  }
1110

    
1111
DSS_PARAMETER_TYPES = {
1112
  DS_DISK_TOTAL: VTYPE_INT,
1113
  DS_DISK_RESERVED: VTYPE_INT,
1114
  DS_DISK_OVERHEAD: VTYPE_INT,
1115
  }
1116

    
1117
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1118
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1119

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

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

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

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

    
1150
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1151

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

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

    
1169
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1170

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

    
1179
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1180
  ISPECS_MIN,
1181
  ISPECS_MAX,
1182
  ])
1183

    
1184
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1185
  IPOLICY_VCPU_RATIO,
1186
  IPOLICY_SPINDLE_RATIO,
1187
  ])
1188

    
1189
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1190
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1191

    
1192
# Node parameter names
1193
ND_OOB_PROGRAM = "oob_program"
1194
ND_SPINDLE_COUNT = "spindle_count"
1195
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1196

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

    
1203
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1204

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

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

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

    
1285
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1286

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

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

    
1302
OOB_POWER_STATUS_POWERED = "powered"
1303

    
1304
OOB_TIMEOUT = 60 # 60 seconds
1305
OOB_POWER_DELAY = 2.0 # 2 seconds
1306

    
1307
OOB_STATUS_OK = "OK"
1308
OOB_STATUS_WARNING = "WARNING"
1309
OOB_STATUS_CRITICAL = "CRITICAL"
1310
OOB_STATUS_UNKNOWN = "UNKNOWN"
1311

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

    
1319
# Instance Parameters Profile
1320
PP_DEFAULT = "default"
1321

    
1322
# NIC_* constants are used inside the ganeti config
1323
NIC_MODE = "mode"
1324
NIC_LINK = "link"
1325
NIC_VLAN = "vlan"
1326

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

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

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

    
1341
NICS_PARAMETER_TYPES = {
1342
  NIC_MODE: VTYPE_STRING,
1343
  NIC_LINK: VTYPE_STRING,
1344
  NIC_VLAN: VTYPE_MAYBE_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_VLAN = "vlan"
1378
INIC_PARAMS_TYPES = {
1379
  INIC_IP: VTYPE_MAYBE_STRING,
1380
  INIC_LINK: VTYPE_STRING,
1381
  INIC_MAC: VTYPE_STRING,
1382
  INIC_MODE: VTYPE_STRING,
1383
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1384
  INIC_NAME: VTYPE_MAYBE_STRING,
1385
  INIC_VLAN: VTYPE_MAYBE_STRING,
1386
  }
1387
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1388

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

    
1406
VNC_BASE_PORT = 5900
1407
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1408

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

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

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

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

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

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

    
1480
# Mouse types:
1481
HT_MOUSE_MOUSE = "mouse"
1482
HT_MOUSE_TABLET = "tablet"
1483

    
1484
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1485
  HT_MOUSE_MOUSE,
1486
  HT_MOUSE_TABLET,
1487
  ])
1488

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

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

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

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

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

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

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

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

    
1541
# Security models
1542
HT_SM_NONE = "none"
1543
HT_SM_USER = "user"
1544
HT_SM_POOL = "pool"
1545

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

    
1552
# Kvm flag values
1553
HT_KVM_ENABLED = "enabled"
1554
HT_KVM_DISABLED = "disabled"
1555

    
1556
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1557

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

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

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

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

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

    
1701
CV_ALL_ECODES_STRINGS = \
1702
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1703

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

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

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

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

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

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

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

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

    
1822
# Job queue
1823
JOB_QUEUE_VERSION = 1
1824
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1825
JOB_QUEUE_FILES_PERMS = 0640
1826

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

    
1830
# unchanged job return
1831
JOB_NOTCHANGED = "nochange"
1832

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

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

    
1871
# OpCode priority
1872
OP_PRIO_LOWEST = +19
1873
OP_PRIO_HIGHEST = -20
1874

    
1875
OP_PRIO_LOW = +10
1876
OP_PRIO_NORMAL = 0
1877
OP_PRIO_HIGH = -10
1878

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

    
1885
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1886

    
1887
# Lock recalculate mode
1888
LOCKS_REPLACE = "replace"
1889
LOCKS_APPEND = "append"
1890

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

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

    
1905
# /etc/hosts modification
1906
ETC_HOSTS_ADD = "add"
1907
ETC_HOSTS_REMOVE = "remove"
1908

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

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

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

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

    
1952
#: List of resources which can be queried using RAPI
1953
QR_VIA_RAPI = QR_VIA_LUXI
1954

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

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

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

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

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

    
2006
# max dynamic devices
2007
MAX_NICS = 8
2008
MAX_DISKS = 16
2009

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

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

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

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

    
2057
SS_FILE_PERMS = 0444
2058

    
2059
# cluster wide default parameters
2060
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2061

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

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

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

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

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

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

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

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

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

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

    
2271
NICC_DEFAULTS = {
2272
  NIC_MODE: NIC_MODE_BRIDGED,
2273
  NIC_LINK: DEFAULT_BRIDGE,
2274
  NIC_VLAN: None,
2275
  }
2276

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

    
2312
MASTER_POOL_SIZE_DEFAULT = 10
2313

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

    
2320
CONFD_PROTOCOL_VERSION = 1
2321

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

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

    
2340
CONFD_REQFIELD_NAME = "0"
2341
CONFD_REQFIELD_IP = "1"
2342
CONFD_REQFIELD_MNODE_PIP = "2"
2343

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

    
2355
CONFD_REPL_STATUS_OK = 0
2356
CONFD_REPL_STATUS_ERROR = 1
2357
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2358

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

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

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

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

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

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

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

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

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

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

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

    
2420
# Name or path of the pgrep command
2421
PGREP = "pgrep"
2422

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

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

    
2436
# Temporary external/shared storage parameters
2437
BLOCKDEV_DRIVER_MANUAL = "manual"
2438

    
2439
# qemu-img path, required for ovfconverter
2440
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2441

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

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

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

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

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

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

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

    
2480
# Path generating random UUID
2481
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2482

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

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

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

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

    
2515
# The version identifier for builtin data collectors
2516
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2517

    
2518
# The reason trail opcode parameter name
2519
OPCODE_REASON = "reason"
2520

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

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

    
2536
DISKSTATS_FILE = "/proc/diskstats"
2537

    
2538
# Do not re-export imported modules
2539
del re, _vcsversion, _autoconf, socket, pathutils, compat