Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 30b12688

History | View | Annotate | Download (65.7 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 = chr(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
LUXI_SOCKET_PERMS = 0660
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
568
DTS_BLOCK = compat.UniqueFrozenset([
569
  DT_PLAIN,
570
  DT_DRBD8,
571
  DT_BLOCK,
572
  DT_RBD,
573
  DT_EXT,
574
  ])
575

    
576
# the set of drbd-like disk types
577
DTS_DRBD = compat.UniqueFrozenset([DT_DRBD8])
578

    
579
# drbd constants
580
DRBD_HMAC_ALG = "md5"
581
DRBD_DEFAULT_NET_PROTOCOL = "C"
582
DRBD_MIGRATION_NET_PROTOCOL = "C"
583
DRBD_STATUS_FILE = "/proc/drbd"
584

    
585
#: Size of DRBD meta block device
586
DRBD_META_SIZE = 128
587

    
588
# drbd barrier types
589
DRBD_B_NONE = "n"
590
DRBD_B_DISK_BARRIERS = "b"
591
DRBD_B_DISK_DRAIN = "d"
592
DRBD_B_DISK_FLUSH = "f"
593

    
594
# Valid barrier combinations: "n" or any non-null subset of "bfd"
595
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
596
  frozenset([DRBD_B_NONE]),
597
  frozenset([DRBD_B_DISK_BARRIERS]),
598
  frozenset([DRBD_B_DISK_DRAIN]),
599
  frozenset([DRBD_B_DISK_FLUSH]),
600
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
601
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
602
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
603
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
604
  ])
605

    
606
# rbd tool command
607
RBD_CMD = "rbd"
608

    
609
# file backend driver
610
FD_LOOP = "loop"
611
FD_BLKTAP = "blktap"
612
FD_BLKTAP2 = "blktap2"
613
FD_DEFAULT = FD_LOOP
614

    
615
# disk access mode
616
DISK_RDONLY = "ro"
617
DISK_RDWR = "rw"
618
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
619

    
620
# disk replacement mode
621
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
622
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
623
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
624
REPLACE_DISK_AUTO = "replace_auto"
625
REPLACE_MODES = compat.UniqueFrozenset([
626
  REPLACE_DISK_PRI,
627
  REPLACE_DISK_SEC,
628
  REPLACE_DISK_CHG,
629
  REPLACE_DISK_AUTO,
630
  ])
631

    
632
# Instance export mode
633
EXPORT_MODE_LOCAL = "local"
634
EXPORT_MODE_REMOTE = "remote"
635
EXPORT_MODES = compat.UniqueFrozenset([
636
  EXPORT_MODE_LOCAL,
637
  EXPORT_MODE_REMOTE,
638
  ])
639

    
640
# instance creation modes
641
INSTANCE_CREATE = "create"
642
INSTANCE_IMPORT = "import"
643
INSTANCE_REMOTE_IMPORT = "remote-import"
644
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
645
  INSTANCE_CREATE,
646
  INSTANCE_IMPORT,
647
  INSTANCE_REMOTE_IMPORT,
648
  ])
649

    
650
# Remote import/export handshake message and version
651
RIE_VERSION = 0
652
RIE_HANDSHAKE = "Hi, I'm Ganeti"
653

    
654
# Remote import/export certificate validity in seconds
655
RIE_CERT_VALIDITY = 24 * 60 * 60
656

    
657
# Overall timeout for establishing connection
658
RIE_CONNECT_TIMEOUT = 180
659

    
660
# Export only: how long to wait per connection attempt (seconds)
661
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
662

    
663
# Export only: number of attempts to connect
664
RIE_CONNECT_RETRIES = 10
665

    
666
#: Give child process up to 5 seconds to exit after sending a signal
667
CHILD_LINGER_TIMEOUT = 5.0
668

    
669
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP, FD_BLKTAP2])
670

    
671
# import/export config options
672
INISECT_EXP = "export"
673
INISECT_INS = "instance"
674
INISECT_HYP = "hypervisor"
675
INISECT_BEP = "backend"
676
INISECT_OSP = "os"
677

    
678
# dynamic device modification
679
DDM_ADD = "add"
680
DDM_MODIFY = "modify"
681
DDM_REMOVE = "remove"
682
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
683
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
684
  DDM_MODIFY,
685
  ]))
686
# TODO: DDM_SWAP, DDM_MOVE?
687

    
688
# common exit codes
689
EXIT_SUCCESS = 0
690
EXIT_FAILURE = 1
691
EXIT_NOTCLUSTER = 5
692
EXIT_NOTMASTER = 11
693
EXIT_NODESETUP_ERROR = 12
694
EXIT_CONFIRMATION = 13 # need user confirmation
695

    
696
#: Exit code for query operations with unknown fields
697
EXIT_UNKNOWN_FIELD = 14
698

    
699
# tags
700
TAG_CLUSTER = "cluster"
701
TAG_NODEGROUP = "nodegroup"
702
TAG_NODE = "node"
703
TAG_INSTANCE = "instance"
704
TAG_NETWORK = "network"
705
VALID_TAG_TYPES = compat.UniqueFrozenset([
706
  TAG_CLUSTER,
707
  TAG_NODEGROUP,
708
  TAG_NODE,
709
  TAG_INSTANCE,
710
  TAG_NETWORK,
711
  ])
712
MAX_TAG_LEN = 128
713
MAX_TAGS_PER_OBJ = 4096
714

    
715
# others
716
DEFAULT_BRIDGE = "xen-br0"
717
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
718
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
719
IP4_ADDRESS_ANY = "0.0.0.0"
720
IP6_ADDRESS_LOCALHOST = "::1"
721
IP6_ADDRESS_ANY = "::"
722
IP4_VERSION = 4
723
IP6_VERSION = 6
724
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
725
# for export to htools
726
IP4_FAMILY = socket.AF_INET
727
IP6_FAMILY = socket.AF_INET6
728

    
729
TCP_PING_TIMEOUT = 10
730
DEFAULT_VG = "xenvg"
731
DEFAULT_DRBD_HELPER = "/bin/true"
732
MIN_VG_SIZE = 20480
733
DEFAULT_MAC_PREFIX = "aa:00:00"
734
# default maximum instance wait time, in seconds.
735
DEFAULT_SHUTDOWN_TIMEOUT = 120
736
NODE_MAX_CLOCK_SKEW = 150
737
# Time for an intra-cluster disk transfer to wait for a connection
738
DISK_TRANSFER_CONNECT_TIMEOUT = 60
739
# Disk index separator
740
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
741
IP_COMMAND_PATH = _autoconf.IP_PATH
742

    
743
#: Key for job IDs in opcode result
744
JOB_IDS_KEY = "jobs"
745

    
746
# runparts results
747
(RUNPARTS_SKIP,
748
 RUNPARTS_RUN,
749
 RUNPARTS_ERR) = range(3)
750

    
751
RUNPARTS_STATUS = compat.UniqueFrozenset([
752
  RUNPARTS_SKIP,
753
  RUNPARTS_RUN,
754
  RUNPARTS_ERR,
755
  ])
756

    
757
# RPC constants
758
(RPC_ENCODING_NONE,
759
 RPC_ENCODING_ZLIB_BASE64) = range(2)
760

    
761
# Various time constants for the timeout table
762
RPC_TMO_URGENT = 60 # one minute
763
RPC_TMO_FAST = 5 * 60 # five minutes
764
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
765
RPC_TMO_SLOW = 3600 # one hour
766
RPC_TMO_4HRS = 4 * 3600
767
RPC_TMO_1DAY = 86400
768

    
769
# Timeout for connecting to nodes (seconds)
770
RPC_CONNECT_TIMEOUT = 5
771

    
772
# os related constants
773
OS_SCRIPT_CREATE = "create"
774
OS_SCRIPT_IMPORT = "import"
775
OS_SCRIPT_EXPORT = "export"
776
OS_SCRIPT_RENAME = "rename"
777
OS_SCRIPT_VERIFY = "verify"
778
OS_SCRIPTS = compat.UniqueFrozenset([
779
  OS_SCRIPT_CREATE,
780
  OS_SCRIPT_IMPORT,
781
  OS_SCRIPT_EXPORT,
782
  OS_SCRIPT_RENAME,
783
  OS_SCRIPT_VERIFY,
784
  ])
785

    
786
OS_API_FILE = "ganeti_api_version"
787
OS_VARIANTS_FILE = "variants.list"
788
OS_PARAMETERS_FILE = "parameters.list"
789

    
790
OS_VALIDATE_PARAMETERS = "parameters"
791
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
792

    
793
# External Storage (ES) related constants
794
ES_ACTION_CREATE = "create"
795
ES_ACTION_REMOVE = "remove"
796
ES_ACTION_GROW = "grow"
797
ES_ACTION_ATTACH = "attach"
798
ES_ACTION_DETACH = "detach"
799
ES_ACTION_SETINFO = "setinfo"
800
ES_ACTION_VERIFY = "verify"
801

    
802
ES_SCRIPT_CREATE = ES_ACTION_CREATE
803
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
804
ES_SCRIPT_GROW = ES_ACTION_GROW
805
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
806
ES_SCRIPT_DETACH = ES_ACTION_DETACH
807
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
808
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
809
ES_SCRIPTS = frozenset([
810
  ES_SCRIPT_CREATE,
811
  ES_SCRIPT_REMOVE,
812
  ES_SCRIPT_GROW,
813
  ES_SCRIPT_ATTACH,
814
  ES_SCRIPT_DETACH,
815
  ES_SCRIPT_SETINFO,
816
  ES_SCRIPT_VERIFY
817
  ])
818

    
819
ES_PARAMETERS_FILE = "parameters.list"
820

    
821
# reboot types
822
INSTANCE_REBOOT_SOFT = "soft"
823
INSTANCE_REBOOT_HARD = "hard"
824
INSTANCE_REBOOT_FULL = "full"
825

    
826
REBOOT_TYPES = compat.UniqueFrozenset([
827
  INSTANCE_REBOOT_SOFT,
828
  INSTANCE_REBOOT_HARD,
829
  INSTANCE_REBOOT_FULL,
830
  ])
831

    
832
# instance reboot behaviors
833
INSTANCE_REBOOT_ALLOWED = "reboot"
834
INSTANCE_REBOOT_EXIT = "exit"
835

    
836
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
837
  INSTANCE_REBOOT_ALLOWED,
838
  INSTANCE_REBOOT_EXIT,
839
  ])
840

    
841
VTYPE_STRING = "string"
842
VTYPE_MAYBE_STRING = "maybe-string"
843
VTYPE_BOOL = "bool"
844
VTYPE_SIZE = "size" # size, in MiBs
845
VTYPE_INT = "int"
846
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
847
  VTYPE_STRING,
848
  VTYPE_MAYBE_STRING,
849
  VTYPE_BOOL,
850
  VTYPE_SIZE,
851
  VTYPE_INT,
852
  ])
853

    
854
# Constant representing that the user does not specify any IP version
855
IFACE_NO_IP_VERSION_SPECIFIED = 0
856

    
857
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
858
  75,
859
  110,
860
  300,
861
  600,
862
  1200,
863
  1800,
864
  2400,
865
  4800,
866
  9600,
867
  14400,
868
  19200,
869
  28800,
870
  38400,
871
  57600,
872
  115200,
873
  230400,
874
  345600,
875
  460800,
876
  ])
877

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

    
951

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

    
1026
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1027

    
1028
HVS_PARAMETER_TITLES = {
1029
  HV_ACPI: "ACPI",
1030
  HV_BOOT_ORDER: "Boot_order",
1031
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1032
  HV_DISK_TYPE: "Disk_type",
1033
  HV_INITRD_PATH: "Initrd_path",
1034
  HV_KERNEL_PATH: "Kernel_path",
1035
  HV_NIC_TYPE: "NIC_type",
1036
  HV_PAE: "PAE",
1037
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1038
  HV_PASSTHROUGH: "pci_pass",
1039
  HV_CPU_TYPE: "cpu_type",
1040
  }
1041

    
1042
# Migration statuses
1043
HV_MIGRATION_COMPLETED = "completed"
1044
HV_MIGRATION_ACTIVE = "active"
1045
HV_MIGRATION_FAILED = "failed"
1046
HV_MIGRATION_CANCELLED = "cancelled"
1047

    
1048
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1049
  HV_MIGRATION_COMPLETED,
1050
  HV_MIGRATION_ACTIVE,
1051
  HV_MIGRATION_FAILED,
1052
  HV_MIGRATION_CANCELLED,
1053
  ])
1054

    
1055
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1056
  HV_MIGRATION_FAILED,
1057
  HV_MIGRATION_CANCELLED,
1058
  ])
1059

    
1060
# KVM-specific statuses
1061
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1062

    
1063
# Node info keys
1064
HV_NODEINFO_KEY_VERSION = "hv_version"
1065

    
1066
# Hypervisor state
1067
HVST_MEMORY_TOTAL = "mem_total"
1068
HVST_MEMORY_NODE = "mem_node"
1069
HVST_MEMORY_HV = "mem_hv"
1070
HVST_CPU_TOTAL = "cpu_total"
1071
HVST_CPU_NODE = "cpu_node"
1072

    
1073
HVST_DEFAULTS = {
1074
  HVST_MEMORY_TOTAL: 0,
1075
  HVST_MEMORY_NODE: 0,
1076
  HVST_MEMORY_HV: 0,
1077
  HVST_CPU_TOTAL: 1,
1078
  HVST_CPU_NODE: 1,
1079
  }
1080

    
1081
HVSTS_PARAMETER_TYPES = {
1082
  HVST_MEMORY_TOTAL: VTYPE_INT,
1083
  HVST_MEMORY_NODE: VTYPE_INT,
1084
  HVST_MEMORY_HV: VTYPE_INT,
1085
  HVST_CPU_TOTAL: VTYPE_INT,
1086
  HVST_CPU_NODE: VTYPE_INT,
1087
  }
1088

    
1089
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1090

    
1091
# Disk state
1092
DS_DISK_TOTAL = "disk_total"
1093
DS_DISK_RESERVED = "disk_reserved"
1094
DS_DISK_OVERHEAD = "disk_overhead"
1095

    
1096
DS_DEFAULTS = {
1097
  DS_DISK_TOTAL: 0,
1098
  DS_DISK_RESERVED: 0,
1099
  DS_DISK_OVERHEAD: 0,
1100
  }
1101

    
1102
DSS_PARAMETER_TYPES = {
1103
  DS_DISK_TOTAL: VTYPE_INT,
1104
  DS_DISK_RESERVED: VTYPE_INT,
1105
  DS_DISK_OVERHEAD: VTYPE_INT,
1106
  }
1107

    
1108
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1109
DS_VALID_TYPES = compat.UniqueFrozenset([DT_PLAIN])
1110

    
1111
# Backend parameter names
1112
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1113
BE_MAXMEM = "maxmem"
1114
BE_MINMEM = "minmem"
1115
BE_VCPUS = "vcpus"
1116
BE_AUTO_BALANCE = "auto_balance"
1117
BE_ALWAYS_FAILOVER = "always_failover"
1118
BE_SPINDLE_USE = "spindle_use"
1119

    
1120
BES_PARAMETER_TYPES = {
1121
  BE_MAXMEM: VTYPE_SIZE,
1122
  BE_MINMEM: VTYPE_SIZE,
1123
  BE_VCPUS: VTYPE_INT,
1124
  BE_AUTO_BALANCE: VTYPE_BOOL,
1125
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1126
  BE_SPINDLE_USE: VTYPE_INT,
1127
  }
1128

    
1129
BES_PARAMETER_TITLES = {
1130
  BE_AUTO_BALANCE: "Auto_balance",
1131
  BE_MAXMEM: "ConfigMaxMem",
1132
  BE_MINMEM: "ConfigMinMem",
1133
  BE_VCPUS: "ConfigVCPUs",
1134
  }
1135

    
1136
BES_PARAMETER_COMPAT = {
1137
  BE_MEMORY: VTYPE_SIZE,
1138
  }
1139
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1140

    
1141
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1142

    
1143
# instance specs
1144
ISPEC_MEM_SIZE = "memory-size"
1145
ISPEC_CPU_COUNT = "cpu-count"
1146
ISPEC_DISK_COUNT = "disk-count"
1147
ISPEC_DISK_SIZE = "disk-size"
1148
ISPEC_NIC_COUNT = "nic-count"
1149
ISPEC_SPINDLE_USE = "spindle-use"
1150

    
1151
ISPECS_PARAMETER_TYPES = {
1152
  ISPEC_MEM_SIZE: VTYPE_INT,
1153
  ISPEC_CPU_COUNT: VTYPE_INT,
1154
  ISPEC_DISK_COUNT: VTYPE_INT,
1155
  ISPEC_DISK_SIZE: VTYPE_INT,
1156
  ISPEC_NIC_COUNT: VTYPE_INT,
1157
  ISPEC_SPINDLE_USE: VTYPE_INT,
1158
  }
1159

    
1160
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1161

    
1162
ISPECS_MINMAX = "minmax"
1163
ISPECS_MIN = "min"
1164
ISPECS_MAX = "max"
1165
ISPECS_STD = "std"
1166
IPOLICY_DTS = "disk-templates"
1167
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1168
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1169

    
1170
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1171
  ISPECS_MIN,
1172
  ISPECS_MAX,
1173
  ])
1174

    
1175
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1176
  IPOLICY_VCPU_RATIO,
1177
  IPOLICY_SPINDLE_RATIO,
1178
  ])
1179

    
1180
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1181
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1182

    
1183
# Node parameter names
1184
ND_OOB_PROGRAM = "oob_program"
1185
ND_SPINDLE_COUNT = "spindle_count"
1186
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1187

    
1188
NDS_PARAMETER_TYPES = {
1189
  ND_OOB_PROGRAM: VTYPE_STRING,
1190
  ND_SPINDLE_COUNT: VTYPE_INT,
1191
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1192
  }
1193

    
1194
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1195

    
1196
NDS_PARAMETER_TITLES = {
1197
  ND_OOB_PROGRAM: "OutOfBandProgram",
1198
  ND_SPINDLE_COUNT: "SpindleCount",
1199
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1200
  }
1201

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

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

    
1276
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1277

    
1278
# OOB supported commands
1279
OOB_POWER_ON = "power-on"
1280
OOB_POWER_OFF = "power-off"
1281
OOB_POWER_CYCLE = "power-cycle"
1282
OOB_POWER_STATUS = "power-status"
1283
OOB_HEALTH = "health"
1284

    
1285
OOB_COMMANDS = compat.UniqueFrozenset([
1286
  OOB_POWER_ON,
1287
  OOB_POWER_OFF,
1288
  OOB_POWER_CYCLE,
1289
  OOB_POWER_STATUS,
1290
  OOB_HEALTH,
1291
  ])
1292

    
1293
OOB_POWER_STATUS_POWERED = "powered"
1294

    
1295
OOB_TIMEOUT = 60 # 60 seconds
1296
OOB_POWER_DELAY = 2.0 # 2 seconds
1297

    
1298
OOB_STATUS_OK = "OK"
1299
OOB_STATUS_WARNING = "WARNING"
1300
OOB_STATUS_CRITICAL = "CRITICAL"
1301
OOB_STATUS_UNKNOWN = "UNKNOWN"
1302

    
1303
OOB_STATUSES = compat.UniqueFrozenset([
1304
  OOB_STATUS_OK,
1305
  OOB_STATUS_WARNING,
1306
  OOB_STATUS_CRITICAL,
1307
  OOB_STATUS_UNKNOWN,
1308
  ])
1309

    
1310
# Instance Parameters Profile
1311
PP_DEFAULT = "default"
1312

    
1313
# NIC_* constants are used inside the ganeti config
1314
NIC_MODE = "mode"
1315
NIC_LINK = "link"
1316

    
1317
NIC_MODE_BRIDGED = "bridged"
1318
NIC_MODE_ROUTED = "routed"
1319
NIC_MODE_OVS = "openvswitch"
1320
NIC_IP_POOL = "pool"
1321

    
1322
NIC_VALID_MODES = compat.UniqueFrozenset([
1323
  NIC_MODE_BRIDGED,
1324
  NIC_MODE_ROUTED,
1325
  NIC_MODE_OVS,
1326
  ])
1327

    
1328
RESERVE_ACTION = "reserve"
1329
RELEASE_ACTION = "release"
1330

    
1331
NICS_PARAMETER_TYPES = {
1332
  NIC_MODE: VTYPE_STRING,
1333
  NIC_LINK: VTYPE_STRING,
1334
  }
1335

    
1336
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1337

    
1338
# IDISK_* constants are used in opcodes, to create/change disks
1339
IDISK_SIZE = "size"
1340
IDISK_SPINDLES = "spindles"
1341
IDISK_MODE = "mode"
1342
IDISK_ADOPT = "adopt"
1343
IDISK_VG = "vg"
1344
IDISK_METAVG = "metavg"
1345
IDISK_PROVIDER = "provider"
1346
IDISK_NAME = "name"
1347
IDISK_PARAMS_TYPES = {
1348
  IDISK_SIZE: VTYPE_SIZE,
1349
  IDISK_SPINDLES: VTYPE_INT,
1350
  IDISK_MODE: VTYPE_STRING,
1351
  IDISK_ADOPT: VTYPE_STRING,
1352
  IDISK_VG: VTYPE_STRING,
1353
  IDISK_METAVG: VTYPE_STRING,
1354
  IDISK_PROVIDER: VTYPE_STRING,
1355
  IDISK_NAME: VTYPE_MAYBE_STRING,
1356
  }
1357
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1358

    
1359
MODIFIABLE_IDISK_PARAMS_TYPES = {
1360
  IDISK_MODE: VTYPE_STRING,
1361
  IDISK_NAME: VTYPE_STRING,
1362
  }
1363
MODIFIABLE_IDISK_PARAMS = frozenset(MODIFIABLE_IDISK_PARAMS_TYPES.keys())
1364

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

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

    
1399
VNC_BASE_PORT = 5900
1400
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1401

    
1402
# NIC types
1403
HT_NIC_RTL8139 = "rtl8139"
1404
HT_NIC_NE2K_PCI = "ne2k_pci"
1405
HT_NIC_NE2K_ISA = "ne2k_isa"
1406
HT_NIC_I82551 = "i82551"
1407
HT_NIC_I85557B = "i82557b"
1408
HT_NIC_I8259ER = "i82559er"
1409
HT_NIC_PCNET = "pcnet"
1410
HT_NIC_E1000 = "e1000"
1411
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1412

    
1413
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1414
  HT_NIC_RTL8139,
1415
  HT_NIC_NE2K_PCI,
1416
  HT_NIC_E1000,
1417
  HT_NIC_NE2K_ISA,
1418
  HT_NIC_PARAVIRTUAL,
1419
  ])
1420
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1421
  HT_NIC_RTL8139,
1422
  HT_NIC_NE2K_PCI,
1423
  HT_NIC_NE2K_ISA,
1424
  HT_NIC_I82551,
1425
  HT_NIC_I85557B,
1426
  HT_NIC_I8259ER,
1427
  HT_NIC_PCNET,
1428
  HT_NIC_E1000,
1429
  HT_NIC_PARAVIRTUAL,
1430
  ])
1431

    
1432
# Vif types
1433
# default vif type in xen-hvm
1434
HT_HVM_VIF_IOEMU = "ioemu"
1435
HT_HVM_VIF_VIF = "vif"
1436
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1437
  HT_HVM_VIF_IOEMU,
1438
  HT_HVM_VIF_VIF,
1439
  ])
1440

    
1441
# Disk types
1442
HT_DISK_IOEMU = "ioemu"
1443
HT_DISK_IDE = "ide"
1444
HT_DISK_SCSI = "scsi"
1445
HT_DISK_SD = "sd"
1446
HT_DISK_MTD = "mtd"
1447
HT_DISK_PFLASH = "pflash"
1448

    
1449
HT_CACHE_DEFAULT = "default"
1450
HT_CACHE_NONE = "none"
1451
HT_CACHE_WTHROUGH = "writethrough"
1452
HT_CACHE_WBACK = "writeback"
1453
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1454
  HT_CACHE_DEFAULT,
1455
  HT_CACHE_NONE,
1456
  HT_CACHE_WTHROUGH,
1457
  HT_CACHE_WBACK,
1458
  ])
1459

    
1460
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1461
  HT_DISK_PARAVIRTUAL,
1462
  HT_DISK_IOEMU,
1463
  ])
1464
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1465
  HT_DISK_PARAVIRTUAL,
1466
  HT_DISK_IDE,
1467
  HT_DISK_SCSI,
1468
  HT_DISK_SD,
1469
  HT_DISK_MTD,
1470
  HT_DISK_PFLASH,
1471
  ])
1472

    
1473
# Mouse types:
1474
HT_MOUSE_MOUSE = "mouse"
1475
HT_MOUSE_TABLET = "tablet"
1476

    
1477
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1478
  HT_MOUSE_MOUSE,
1479
  HT_MOUSE_TABLET,
1480
  ])
1481

    
1482
# Boot order
1483
HT_BO_FLOPPY = "floppy"
1484
HT_BO_CDROM = "cdrom"
1485
HT_BO_DISK = "disk"
1486
HT_BO_NETWORK = "network"
1487

    
1488
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1489
  HT_BO_FLOPPY,
1490
  HT_BO_CDROM,
1491
  HT_BO_DISK,
1492
  HT_BO_NETWORK,
1493
  ])
1494

    
1495
# SPICE lossless image compression options
1496
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1497
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1498
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1499
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1500
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1501
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1502

    
1503
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1504
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1505
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1506
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1507
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1508
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1509
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1510
  ])
1511

    
1512
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1513
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1514
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1515
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1516

    
1517
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1518
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1519
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1520
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1521
  ])
1522

    
1523
# SPICE video stream detection
1524
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1525
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1526
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1527

    
1528
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1529
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1530
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1531
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1532
  ])
1533

    
1534
# Security models
1535
HT_SM_NONE = "none"
1536
HT_SM_USER = "user"
1537
HT_SM_POOL = "pool"
1538

    
1539
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1540
  HT_SM_NONE,
1541
  HT_SM_USER,
1542
  HT_SM_POOL,
1543
  ])
1544

    
1545
# Kvm flag values
1546
HT_KVM_ENABLED = "enabled"
1547
HT_KVM_DISABLED = "disabled"
1548

    
1549
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1550

    
1551
# Migration type
1552
HT_MIGRATION_LIVE = "live"
1553
HT_MIGRATION_NONLIVE = "non-live"
1554
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1555
  HT_MIGRATION_LIVE,
1556
  HT_MIGRATION_NONLIVE,
1557
  ])
1558

    
1559
# Cluster Verify steps
1560
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1561
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1562

    
1563
# Cluster Verify error classes
1564
CV_TCLUSTER = "cluster"
1565
CV_TGROUP = "group"
1566
CV_TNODE = "node"
1567
CV_TINSTANCE = "instance"
1568

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1882
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1883

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2054
SS_FILE_PERMS = 0444
2055

    
2056
# cluster wide default parameters
2057
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2058

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

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

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

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

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

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

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

    
2233
# readability shortcuts
2234
_LV_DEFAULTS = DISK_LD_DEFAULTS[DT_PLAIN]
2235
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[DT_DRBD8]
2236

    
2237
DISK_DT_DEFAULTS = {
2238
  DT_PLAIN: {
2239
    LV_STRIPES: DISK_LD_DEFAULTS[DT_PLAIN][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[DT_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
  }
2275

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

    
2311
MASTER_POOL_SIZE_DEFAULT = 10
2312

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

    
2319
CONFD_PROTOCOL_VERSION = 1
2320

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2535
DISKSTATS_FILE = "/proc/diskstats"
2536

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