Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 18397489

History | View | Annotate | Download (65.6 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
HV_VIRIDIAN = "viridian"
963

    
964

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

    
1039
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1040

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

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

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

    
1068
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1069
  HV_MIGRATION_FAILED,
1070
  HV_MIGRATION_CANCELLED,
1071
  ])
1072

    
1073
# KVM-specific statuses
1074
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1075

    
1076
# Node info keys
1077
HV_NODEINFO_KEY_VERSION = "hv_version"
1078

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

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

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

    
1102
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1103

    
1104
# Disk state
1105
DS_DISK_TOTAL = "disk_total"
1106
DS_DISK_RESERVED = "disk_reserved"
1107
DS_DISK_OVERHEAD = "disk_overhead"
1108

    
1109
DS_DEFAULTS = {
1110
  DS_DISK_TOTAL: 0,
1111
  DS_DISK_RESERVED: 0,
1112
  DS_DISK_OVERHEAD: 0,
1113
  }
1114

    
1115
DSS_PARAMETER_TYPES = {
1116
  DS_DISK_TOTAL: VTYPE_INT,
1117
  DS_DISK_RESERVED: VTYPE_INT,
1118
  DS_DISK_OVERHEAD: VTYPE_INT,
1119
  }
1120

    
1121
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1122
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1123

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

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

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

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

    
1154
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1155

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

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

    
1173
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1174

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

    
1183
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1184
  ISPECS_MIN,
1185
  ISPECS_MAX,
1186
  ])
1187

    
1188
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1189
  IPOLICY_VCPU_RATIO,
1190
  IPOLICY_SPINDLE_RATIO,
1191
  ])
1192

    
1193
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1194
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1195

    
1196
# Node parameter names
1197
ND_OOB_PROGRAM = "oob_program"
1198
ND_SPINDLE_COUNT = "spindle_count"
1199
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1200

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

    
1207
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1208

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

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

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

    
1289
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1290

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

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

    
1306
OOB_POWER_STATUS_POWERED = "powered"
1307

    
1308
OOB_TIMEOUT = 60 # 60 seconds
1309
OOB_POWER_DELAY = 2.0 # 2 seconds
1310

    
1311
OOB_STATUS_OK = "OK"
1312
OOB_STATUS_WARNING = "WARNING"
1313
OOB_STATUS_CRITICAL = "CRITICAL"
1314
OOB_STATUS_UNKNOWN = "UNKNOWN"
1315

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

    
1323
# Instance Parameters Profile
1324
PP_DEFAULT = "default"
1325

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

    
1330
NIC_MODE_BRIDGED = "bridged"
1331
NIC_MODE_ROUTED = "routed"
1332
NIC_MODE_OVS = "openvswitch"
1333
NIC_IP_POOL = "pool"
1334

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

    
1341
RESERVE_ACTION = "reserve"
1342
RELEASE_ACTION = "release"
1343

    
1344
NICS_PARAMETER_TYPES = {
1345
  NIC_MODE: VTYPE_STRING,
1346
  NIC_LINK: VTYPE_STRING,
1347
  }
1348

    
1349
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1350

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

    
1372
# INIC_* constants are used in opcodes, to create/change nics
1373
INIC_MAC = "mac"
1374
INIC_IP = "ip"
1375
INIC_MODE = "mode"
1376
INIC_LINK = "link"
1377
INIC_NETWORK = "network"
1378
INIC_NAME = "name"
1379
INIC_PARAMS_TYPES = {
1380
  INIC_IP: VTYPE_MAYBE_STRING,
1381
  INIC_LINK: VTYPE_STRING,
1382
  INIC_MAC: VTYPE_STRING,
1383
  INIC_MODE: VTYPE_STRING,
1384
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1385
  INIC_NAME: 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
CV_ENODESHAREDFILESTORAGEPATHUNUSABLE = \
1665
  (CV_TNODE, "ENODESHAREDFILESTORAGEPATHUNUSABLE",
1666
      "Shared file storage path unusable")
1667

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

    
1705
CV_ALL_ECODES_STRINGS = \
1706
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1707

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

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

    
1756
# Admin states
1757
ADMINST_UP = "up"
1758
ADMINST_DOWN = "down"
1759
ADMINST_OFFLINE = "offline"
1760
ADMINST_ALL = compat.UniqueFrozenset([
1761
  ADMINST_UP,
1762
  ADMINST_DOWN,
1763
  ADMINST_OFFLINE,
1764
  ])
1765

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

    
1780
# SSL certificate check constants (in days)
1781
SSL_CERT_EXPIRATION_WARN = 30
1782
SSL_CERT_EXPIRATION_ERROR = 7
1783

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

    
1807
IALLOCATOR_NEVAC_PRI = "primary-only"
1808
IALLOCATOR_NEVAC_SEC = "secondary-only"
1809
IALLOCATOR_NEVAC_ALL = "all"
1810
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1811
  IALLOCATOR_NEVAC_PRI,
1812
  IALLOCATOR_NEVAC_SEC,
1813
  IALLOCATOR_NEVAC_ALL,
1814
  ])
1815

    
1816
# Node evacuation
1817
NODE_EVAC_PRI = "primary-only"
1818
NODE_EVAC_SEC = "secondary-only"
1819
NODE_EVAC_ALL = "all"
1820
NODE_EVAC_MODES = compat.UniqueFrozenset([
1821
  NODE_EVAC_PRI,
1822
  NODE_EVAC_SEC,
1823
  NODE_EVAC_ALL,
1824
  ])
1825

    
1826
# Job queue
1827
JOB_QUEUE_VERSION = 1
1828
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1829
JOB_QUEUE_FILES_PERMS = 0640
1830

    
1831
JOB_ID_TEMPLATE = r"\d+"
1832
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1833

    
1834
# unchanged job return
1835
JOB_NOTCHANGED = "nochange"
1836

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

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

    
1875
# OpCode priority
1876
OP_PRIO_LOWEST = +19
1877
OP_PRIO_HIGHEST = -20
1878

    
1879
OP_PRIO_LOW = +10
1880
OP_PRIO_NORMAL = 0
1881
OP_PRIO_HIGH = -10
1882

    
1883
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1884
  OP_PRIO_LOW,
1885
  OP_PRIO_NORMAL,
1886
  OP_PRIO_HIGH,
1887
  ])
1888

    
1889
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1890

    
1891
# Lock recalculate mode
1892
LOCKS_REPLACE = "replace"
1893
LOCKS_APPEND = "append"
1894

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

    
1904
# Execution log types
1905
ELOG_MESSAGE = "message"
1906
ELOG_REMOTE_IMPORT = "remote-import"
1907
ELOG_JQUEUE_TEST = "jqueue-test"
1908

    
1909
# /etc/hosts modification
1910
ETC_HOSTS_ADD = "add"
1911
ETC_HOSTS_REMOVE = "remove"
1912

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

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

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

    
1950
#: List of resources which can be queried using Local UniX Interface
1951
QR_VIA_LUXI = QR_VIA_OP.union([
1952
  QR_LOCK,
1953
  QR_JOB,
1954
  ])
1955

    
1956
#: List of resources which can be queried using RAPI
1957
QR_VIA_RAPI = QR_VIA_LUXI
1958

    
1959
# Query field types
1960
QFT_UNKNOWN = "unknown"
1961
QFT_TEXT = "text"
1962
QFT_BOOL = "bool"
1963
QFT_NUMBER = "number"
1964
QFT_UNIT = "unit"
1965
QFT_TIMESTAMP = "timestamp"
1966
QFT_OTHER = "other"
1967

    
1968
#: All query field types
1969
QFT_ALL = compat.UniqueFrozenset([
1970
  QFT_UNKNOWN,
1971
  QFT_TEXT,
1972
  QFT_BOOL,
1973
  QFT_NUMBER,
1974
  QFT_UNIT,
1975
  QFT_TIMESTAMP,
1976
  QFT_OTHER,
1977
  ])
1978

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

    
1994
RS_ALL = compat.UniqueFrozenset([
1995
  RS_NORMAL,
1996
  RS_UNKNOWN,
1997
  RS_NODATA,
1998
  RS_UNAVAIL,
1999
  RS_OFFLINE,
2000
  ])
2001

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

    
2010
# max dynamic devices
2011
MAX_NICS = 8
2012
MAX_DISKS = 16
2013

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

    
2041
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2042
SS_HVPARAMS_PREF = "hvparams_"
2043

    
2044
# Hvparams keys:
2045
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2046
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2047
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2048
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2049
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2050
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2051

    
2052
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2053
  SS_HVPARAMS_XEN_PVM,
2054
  SS_HVPARAMS_XEN_FAKE,
2055
  SS_HVPARAMS_XEN_HVM,
2056
  SS_HVPARAMS_XEN_KVM,
2057
  SS_HVPARAMS_XEN_CHROOT,
2058
  SS_HVPARAMS_XEN_LXC,
2059
  ])
2060

    
2061
SS_FILE_PERMS = 0444
2062

    
2063
# cluster wide default parameters
2064
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2065

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

    
2180
HVC_GLOBALS = compat.UniqueFrozenset([
2181
  HV_MIGRATION_PORT,
2182
  HV_MIGRATION_BANDWIDTH,
2183
  HV_MIGRATION_MODE,
2184
  HV_XEN_CMD,
2185
  ])
2186

    
2187
BEC_DEFAULTS = {
2188
  BE_MINMEM: 128,
2189
  BE_MAXMEM: 128,
2190
  BE_VCPUS: 1,
2191
  BE_AUTO_BALANCE: True,
2192
  BE_ALWAYS_FAILOVER: False,
2193
  BE_SPINDLE_USE: 1,
2194
  }
2195

    
2196
NDC_DEFAULTS = {
2197
  ND_OOB_PROGRAM: "",
2198
  ND_SPINDLE_COUNT: 1,
2199
  ND_EXCLUSIVE_STORAGE: False,
2200
  }
2201

    
2202
NDC_GLOBALS = compat.UniqueFrozenset([
2203
  ND_EXCLUSIVE_STORAGE,
2204
  ])
2205

    
2206
DISK_LD_DEFAULTS = {
2207
  LD_DRBD8: {
2208
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2209
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2210
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2211
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2212
    LDP_DISK_CUSTOM: "",
2213
    LDP_NET_CUSTOM: "",
2214
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2215
    LDP_DYNAMIC_RESYNC: False,
2216

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

    
2239
# readability shortcuts
2240
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2241
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2242

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

    
2274
# we don't want to export the shortcuts
2275
del _LV_DEFAULTS, _DRBD_DEFAULTS
2276

    
2277
NICC_DEFAULTS = {
2278
  NIC_MODE: NIC_MODE_BRIDGED,
2279
  NIC_LINK: DEFAULT_BRIDGE,
2280
  }
2281

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

    
2317
MASTER_POOL_SIZE_DEFAULT = 10
2318

    
2319
# Exclusive storage:
2320
# Error margin used to compare physical disks
2321
PART_MARGIN = .01
2322
# Space reserved when creating instance disks
2323
PART_RESERVED = .02
2324

    
2325
CONFD_PROTOCOL_VERSION = 1
2326

    
2327
CONFD_REQ_PING = 0
2328
CONFD_REQ_NODE_ROLE_BYNAME = 1
2329
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2330
CONFD_REQ_CLUSTER_MASTER = 3
2331
CONFD_REQ_NODE_PIP_LIST = 4
2332
CONFD_REQ_MC_PIP_LIST = 5
2333
CONFD_REQ_INSTANCES_IPS_LIST = 6
2334
CONFD_REQ_NODE_DRBD = 7
2335
CONFD_REQ_NODE_INSTANCES = 8
2336

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

    
2345
CONFD_REQFIELD_NAME = "0"
2346
CONFD_REQFIELD_IP = "1"
2347
CONFD_REQFIELD_MNODE_PIP = "2"
2348

    
2349
CONFD_REQS = compat.UniqueFrozenset([
2350
  CONFD_REQ_PING,
2351
  CONFD_REQ_NODE_ROLE_BYNAME,
2352
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2353
  CONFD_REQ_CLUSTER_MASTER,
2354
  CONFD_REQ_NODE_PIP_LIST,
2355
  CONFD_REQ_MC_PIP_LIST,
2356
  CONFD_REQ_INSTANCES_IPS_LIST,
2357
  CONFD_REQ_NODE_DRBD,
2358
  ])
2359

    
2360
CONFD_REPL_STATUS_OK = 0
2361
CONFD_REPL_STATUS_ERROR = 1
2362
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2363

    
2364
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2365
  CONFD_REPL_STATUS_OK,
2366
  CONFD_REPL_STATUS_ERROR,
2367
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2368
  ])
2369

    
2370
(CONFD_NODE_ROLE_MASTER,
2371
 CONFD_NODE_ROLE_CANDIDATE,
2372
 CONFD_NODE_ROLE_OFFLINE,
2373
 CONFD_NODE_ROLE_DRAINED,
2374
 CONFD_NODE_ROLE_REGULAR,
2375
 ) = range(5)
2376

    
2377
# A few common errors for confd
2378
CONFD_ERROR_UNKNOWN_ENTRY = 1
2379
CONFD_ERROR_INTERNAL = 2
2380
CONFD_ERROR_ARGUMENT = 3
2381

    
2382
# Each request is "salted" by the current timestamp.
2383
# This constants decides how many seconds of skew to accept.
2384
# TODO: make this a default and allow the value to be more configurable
2385
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2386

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

    
2393
# If we receive more than one update in this amount of microseconds,
2394
# we move to polling every RATELIMIT seconds, rather than relying on
2395
# inotify, to be able to serve more requests.
2396
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2397

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

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

    
2409
# Timeout in seconds to expire pending query request in the confd client
2410
# library. We don't actually expect any answer more than 10 seconds after we
2411
# sent a request.
2412
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2413

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

    
2421
# User-id pool minimum/maximum acceptable user-ids.
2422
UIDPOOL_UID_MIN = 0
2423
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2424

    
2425
# Name or path of the pgrep command
2426
PGREP = "pgrep"
2427

    
2428
# Name of the node group that gets created at cluster init or upgrade
2429
INITIAL_NODE_GROUP_NAME = "default"
2430

    
2431
# Possible values for NodeGroup.alloc_policy
2432
ALLOC_POLICY_PREFERRED = "preferred"
2433
ALLOC_POLICY_LAST_RESORT = "last_resort"
2434
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2435
VALID_ALLOC_POLICIES = [
2436
  ALLOC_POLICY_PREFERRED,
2437
  ALLOC_POLICY_LAST_RESORT,
2438
  ALLOC_POLICY_UNALLOCABLE,
2439
  ]
2440

    
2441
# Temporary external/shared storage parameters
2442
BLOCKDEV_DRIVER_MANUAL = "manual"
2443

    
2444
# qemu-img path, required for ovfconverter
2445
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2446

    
2447
# Whether htools was enabled at compilation time
2448
HTOOLS = _autoconf.HTOOLS
2449
# The hail iallocator
2450
IALLOC_HAIL = "hail"
2451

    
2452
# Fake opcodes for functions that have hooks attached to them via
2453
# backend.RunLocalHooks
2454
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2455
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2456

    
2457
# SSH key types
2458
SSHK_RSA = "rsa"
2459
SSHK_DSA = "dsa"
2460
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2461

    
2462
# SSH authorized key types
2463
SSHAK_RSA = "ssh-rsa"
2464
SSHAK_DSS = "ssh-dss"
2465
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2466

    
2467
# SSH setup
2468
SSHS_CLUSTER_NAME = "cluster_name"
2469
SSHS_SSH_HOST_KEY = "ssh_host_key"
2470
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2471
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2472

    
2473
#: Key files for SSH daemon
2474
SSH_DAEMON_KEYFILES = {
2475
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2476
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2477
  }
2478

    
2479
# Node daemon setup
2480
NDS_CLUSTER_NAME = "cluster_name"
2481
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2482
NDS_SSCONF = "ssconf"
2483
NDS_START_NODE_DAEMON = "start_node_daemon"
2484

    
2485
# Path generating random UUID
2486
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2487

    
2488
# Regex string for verifying a UUID
2489
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2490

    
2491
# Auto-repair tag prefixes
2492
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2493
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2494
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2495
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2496
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2497

    
2498
# Auto-repair levels
2499
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2500
AUTO_REPAIR_MIGRATE = "migrate"
2501
AUTO_REPAIR_FAILOVER = "failover"
2502
AUTO_REPAIR_REINSTALL = "reinstall"
2503
AUTO_REPAIR_ALL_TYPES = [
2504
  AUTO_REPAIR_FIX_STORAGE,
2505
  AUTO_REPAIR_MIGRATE,
2506
  AUTO_REPAIR_FAILOVER,
2507
  AUTO_REPAIR_REINSTALL,
2508
]
2509

    
2510
# Auto-repair results
2511
AUTO_REPAIR_SUCCESS = "success"
2512
AUTO_REPAIR_FAILURE = "failure"
2513
AUTO_REPAIR_ENOPERM = "enoperm"
2514
AUTO_REPAIR_ALL_RESULTS = frozenset([
2515
    AUTO_REPAIR_SUCCESS,
2516
    AUTO_REPAIR_FAILURE,
2517
    AUTO_REPAIR_ENOPERM,
2518
])
2519

    
2520
# The version identifier for builtin data collectors
2521
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2522

    
2523
# The reason trail opcode parameter name
2524
OPCODE_REASON = "reason"
2525

    
2526
# The source reasons for the execution of an OpCode
2527
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2528
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2529
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2530
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2531
OPCODE_REASON_SRC_USER = "gnt:user"
2532

    
2533
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2534
  OPCODE_REASON_SRC_CLIENT,
2535
  OPCODE_REASON_SRC_NODED,
2536
  OPCODE_REASON_SRC_OPCODE,
2537
  OPCODE_REASON_SRC_RLIB2,
2538
  OPCODE_REASON_SRC_USER,
2539
  ])
2540

    
2541
DISKSTATS_FILE = "/proc/diskstats"
2542

    
2543
# Do not re-export imported modules
2544
del re, _vcsversion, _autoconf, socket, pathutils, compat