Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 884dc063

History | View | Annotate | Download (65.9 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
188
FIRST_DRBD_PORT = 11000
189
LAST_DRBD_PORT = 14999
190

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

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

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

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

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

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

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

    
231
DEV_CONSOLE = "/dev/console"
232

    
233
PROC_MOUNTS = "/proc/mounts"
234

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

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

    
250
EXPORT_CONF_FILE = "config.ini"
251

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
323
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
324

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

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

    
337
IE_CUSTOM_SIZE = "fd"
338

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

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

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

    
357

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

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

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

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

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

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

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

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

    
414
# Storage operations
415
SO_FIX_CONSISTENCY = "fix-consistency"
416

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

    
427
MODIFIABLE_STORAGE_FIELDS = {
428
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
429
  }
430

    
431
VALID_STORAGE_OPERATIONS = {
432
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
433
  }
434

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
586
LDS_BLOCK = compat.UniqueFrozenset([
587
  LD_LV,
588
  LD_DRBD8,
589
  LD_BLOCKDEV,
590
  LD_RBD,
591
  LD_EXT,
592
  ])
593

    
594
# drbd constants
595
DRBD_HMAC_ALG = "md5"
596
DRBD_DEFAULT_NET_PROTOCOL = "C"
597
DRBD_MIGRATION_NET_PROTOCOL = "C"
598
DRBD_STATUS_FILE = "/proc/drbd"
599

    
600
#: Size of DRBD meta block device
601
DRBD_META_SIZE = 128
602

    
603
# drbd barrier types
604
DRBD_B_NONE = "n"
605
DRBD_B_DISK_BARRIERS = "b"
606
DRBD_B_DISK_DRAIN = "d"
607
DRBD_B_DISK_FLUSH = "f"
608

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

    
621
# rbd tool command
622
RBD_CMD = "rbd"
623

    
624
# file backend driver
625
FD_LOOP = "loop"
626
FD_BLKTAP = "blktap"
627

    
628
# the set of drbd-like disk types
629
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
630

    
631
# disk access mode
632
DISK_RDONLY = "ro"
633
DISK_RDWR = "rw"
634
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
635

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

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

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

    
666
# Remote import/export handshake message and version
667
RIE_VERSION = 0
668
RIE_HANDSHAKE = "Hi, I'm Ganeti"
669

    
670
# Remote import/export certificate validity in seconds
671
RIE_CERT_VALIDITY = 24 * 60 * 60
672

    
673
# Overall timeout for establishing connection
674
RIE_CONNECT_TIMEOUT = 180
675

    
676
# Export only: how long to wait per connection attempt (seconds)
677
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
678

    
679
# Export only: number of attempts to connect
680
RIE_CONNECT_RETRIES = 10
681

    
682
#: Give child process up to 5 seconds to exit after sending a signal
683
CHILD_LINGER_TIMEOUT = 5.0
684

    
685
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
686

    
687
# import/export config options
688
INISECT_EXP = "export"
689
INISECT_INS = "instance"
690
INISECT_HYP = "hypervisor"
691
INISECT_BEP = "backend"
692
INISECT_OSP = "os"
693

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

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

    
712
#: Exit code for query operations with unknown fields
713
EXIT_UNKNOWN_FIELD = 14
714

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

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

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

    
760
#: Key for job IDs in opcode result
761
JOB_IDS_KEY = "jobs"
762

    
763
# runparts results
764
(RUNPARTS_SKIP,
765
 RUNPARTS_RUN,
766
 RUNPARTS_ERR) = range(3)
767

    
768
RUNPARTS_STATUS = compat.UniqueFrozenset([
769
  RUNPARTS_SKIP,
770
  RUNPARTS_RUN,
771
  RUNPARTS_ERR,
772
  ])
773

    
774
# RPC constants
775
(RPC_ENCODING_NONE,
776
 RPC_ENCODING_ZLIB_BASE64) = range(2)
777

    
778
# Various time constants for the timeout table
779
RPC_TMO_URGENT = 60 # one minute
780
RPC_TMO_FAST = 5 * 60 # five minutes
781
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
782
RPC_TMO_SLOW = 3600 # one hour
783
RPC_TMO_4HRS = 4 * 3600
784
RPC_TMO_1DAY = 86400
785

    
786
# Timeout for connecting to nodes (seconds)
787
RPC_CONNECT_TIMEOUT = 5
788

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

    
803
OS_API_FILE = "ganeti_api_version"
804
OS_VARIANTS_FILE = "variants.list"
805
OS_PARAMETERS_FILE = "parameters.list"
806

    
807
OS_VALIDATE_PARAMETERS = "parameters"
808
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
809

    
810
# External Storage (ES) related constants
811
ES_ACTION_CREATE = "create"
812
ES_ACTION_REMOVE = "remove"
813
ES_ACTION_GROW = "grow"
814
ES_ACTION_ATTACH = "attach"
815
ES_ACTION_DETACH = "detach"
816
ES_ACTION_SETINFO = "setinfo"
817
ES_ACTION_VERIFY = "verify"
818

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

    
836
ES_PARAMETERS_FILE = "parameters.list"
837

    
838
# reboot types
839
INSTANCE_REBOOT_SOFT = "soft"
840
INSTANCE_REBOOT_HARD = "hard"
841
INSTANCE_REBOOT_FULL = "full"
842

    
843
REBOOT_TYPES = compat.UniqueFrozenset([
844
  INSTANCE_REBOOT_SOFT,
845
  INSTANCE_REBOOT_HARD,
846
  INSTANCE_REBOOT_FULL,
847
  ])
848

    
849
# instance reboot behaviors
850
INSTANCE_REBOOT_ALLOWED = "reboot"
851
INSTANCE_REBOOT_EXIT = "exit"
852

    
853
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
854
  INSTANCE_REBOOT_ALLOWED,
855
  INSTANCE_REBOOT_EXIT,
856
  ])
857

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

    
871
# Constant representing that the user does not specify any IP version
872
IFACE_NO_IP_VERSION_SPECIFIED = 0
873

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

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

    
967

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

    
1041
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1042

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

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

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

    
1070
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1071
  HV_MIGRATION_FAILED,
1072
  HV_MIGRATION_CANCELLED,
1073
  ])
1074

    
1075
# KVM-specific statuses
1076
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1077

    
1078
# Node info keys
1079
HV_NODEINFO_KEY_VERSION = "hv_version"
1080

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

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

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

    
1104
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1105

    
1106
# Disk state
1107
DS_DISK_TOTAL = "disk_total"
1108
DS_DISK_RESERVED = "disk_reserved"
1109
DS_DISK_OVERHEAD = "disk_overhead"
1110

    
1111
DS_DEFAULTS = {
1112
  DS_DISK_TOTAL: 0,
1113
  DS_DISK_RESERVED: 0,
1114
  DS_DISK_OVERHEAD: 0,
1115
  }
1116

    
1117
DSS_PARAMETER_TYPES = {
1118
  DS_DISK_TOTAL: VTYPE_INT,
1119
  DS_DISK_RESERVED: VTYPE_INT,
1120
  DS_DISK_OVERHEAD: VTYPE_INT,
1121
  }
1122

    
1123
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1124
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1125

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

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

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

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

    
1156
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1157

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

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

    
1175
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1176

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

    
1185
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1186
  ISPECS_MIN,
1187
  ISPECS_MAX,
1188
  ])
1189

    
1190
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1191
  IPOLICY_VCPU_RATIO,
1192
  IPOLICY_SPINDLE_RATIO,
1193
  ])
1194

    
1195
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1196
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1197

    
1198
# Node parameter names
1199
ND_OOB_PROGRAM = "oob_program"
1200
ND_SPINDLE_COUNT = "spindle_count"
1201
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1202

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

    
1209
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1210

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

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

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

    
1291
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1292

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

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

    
1308
OOB_POWER_STATUS_POWERED = "powered"
1309

    
1310
OOB_TIMEOUT = 60 # 60 seconds
1311
OOB_POWER_DELAY = 2.0 # 2 seconds
1312

    
1313
OOB_STATUS_OK = "OK"
1314
OOB_STATUS_WARNING = "WARNING"
1315
OOB_STATUS_CRITICAL = "CRITICAL"
1316
OOB_STATUS_UNKNOWN = "UNKNOWN"
1317

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

    
1325
# Instance Parameters Profile
1326
PP_DEFAULT = "default"
1327

    
1328
# NIC_* constants are used inside the ganeti config
1329
NIC_MODE = "mode"
1330
NIC_LINK = "link"
1331
NIC_VLAN = "vlan"
1332

    
1333
NIC_MODE_BRIDGED = "bridged"
1334
NIC_MODE_ROUTED = "routed"
1335
NIC_MODE_OVS = "openvswitch"
1336
NIC_IP_POOL = "pool"
1337

    
1338
NIC_VALID_MODES = compat.UniqueFrozenset([
1339
  NIC_MODE_BRIDGED,
1340
  NIC_MODE_ROUTED,
1341
  NIC_MODE_OVS,
1342
  ])
1343

    
1344
RESERVE_ACTION = "reserve"
1345
RELEASE_ACTION = "release"
1346

    
1347
NICS_PARAMETER_TYPES = {
1348
  NIC_MODE: VTYPE_STRING,
1349
  NIC_LINK: VTYPE_STRING,
1350
  NIC_VLAN: VTYPE_MAYBE_STRING,
1351
  }
1352

    
1353
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1354

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

    
1376
# INIC_* constants are used in opcodes, to create/change nics
1377
INIC_MAC = "mac"
1378
INIC_IP = "ip"
1379
INIC_MODE = "mode"
1380
INIC_LINK = "link"
1381
INIC_NETWORK = "network"
1382
INIC_NAME = "name"
1383
INIC_VLAN = "vlan"
1384
INIC_BRIDGE = "bridge"
1385
INIC_PARAMS_TYPES = {
1386
  INIC_IP: VTYPE_MAYBE_STRING,
1387
  INIC_LINK: VTYPE_STRING,
1388
  INIC_MAC: VTYPE_STRING,
1389
  INIC_MODE: VTYPE_STRING,
1390
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1391
  INIC_NAME: VTYPE_MAYBE_STRING,
1392
  INIC_VLAN: VTYPE_MAYBE_STRING,
1393
  INIC_BRIDGE: VTYPE_MAYBE_STRING
1394
  }
1395
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1396

    
1397
# Hypervisor constants
1398
HT_XEN_PVM = "xen-pvm"
1399
HT_FAKE = "fake"
1400
HT_XEN_HVM = "xen-hvm"
1401
HT_KVM = "kvm"
1402
HT_CHROOT = "chroot"
1403
HT_LXC = "lxc"
1404
HYPER_TYPES = compat.UniqueFrozenset([
1405
  HT_XEN_PVM,
1406
  HT_FAKE,
1407
  HT_XEN_HVM,
1408
  HT_KVM,
1409
  HT_CHROOT,
1410
  HT_LXC,
1411
  ])
1412
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1413

    
1414
VNC_BASE_PORT = 5900
1415
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1416

    
1417
# NIC types
1418
HT_NIC_RTL8139 = "rtl8139"
1419
HT_NIC_NE2K_PCI = "ne2k_pci"
1420
HT_NIC_NE2K_ISA = "ne2k_isa"
1421
HT_NIC_I82551 = "i82551"
1422
HT_NIC_I85557B = "i82557b"
1423
HT_NIC_I8259ER = "i82559er"
1424
HT_NIC_PCNET = "pcnet"
1425
HT_NIC_E1000 = "e1000"
1426
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1427

    
1428
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1429
  HT_NIC_RTL8139,
1430
  HT_NIC_NE2K_PCI,
1431
  HT_NIC_E1000,
1432
  HT_NIC_NE2K_ISA,
1433
  HT_NIC_PARAVIRTUAL,
1434
  ])
1435
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1436
  HT_NIC_RTL8139,
1437
  HT_NIC_NE2K_PCI,
1438
  HT_NIC_NE2K_ISA,
1439
  HT_NIC_I82551,
1440
  HT_NIC_I85557B,
1441
  HT_NIC_I8259ER,
1442
  HT_NIC_PCNET,
1443
  HT_NIC_E1000,
1444
  HT_NIC_PARAVIRTUAL,
1445
  ])
1446

    
1447
# Vif types
1448
# default vif type in xen-hvm
1449
HT_HVM_VIF_IOEMU = "ioemu"
1450
HT_HVM_VIF_VIF = "vif"
1451
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1452
  HT_HVM_VIF_IOEMU,
1453
  HT_HVM_VIF_VIF,
1454
  ])
1455

    
1456
# Disk types
1457
HT_DISK_IOEMU = "ioemu"
1458
HT_DISK_IDE = "ide"
1459
HT_DISK_SCSI = "scsi"
1460
HT_DISK_SD = "sd"
1461
HT_DISK_MTD = "mtd"
1462
HT_DISK_PFLASH = "pflash"
1463

    
1464
HT_CACHE_DEFAULT = "default"
1465
HT_CACHE_NONE = "none"
1466
HT_CACHE_WTHROUGH = "writethrough"
1467
HT_CACHE_WBACK = "writeback"
1468
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1469
  HT_CACHE_DEFAULT,
1470
  HT_CACHE_NONE,
1471
  HT_CACHE_WTHROUGH,
1472
  HT_CACHE_WBACK,
1473
  ])
1474

    
1475
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1476
  HT_DISK_PARAVIRTUAL,
1477
  HT_DISK_IOEMU,
1478
  ])
1479
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1480
  HT_DISK_PARAVIRTUAL,
1481
  HT_DISK_IDE,
1482
  HT_DISK_SCSI,
1483
  HT_DISK_SD,
1484
  HT_DISK_MTD,
1485
  HT_DISK_PFLASH,
1486
  ])
1487

    
1488
# Mouse types:
1489
HT_MOUSE_MOUSE = "mouse"
1490
HT_MOUSE_TABLET = "tablet"
1491

    
1492
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1493
  HT_MOUSE_MOUSE,
1494
  HT_MOUSE_TABLET,
1495
  ])
1496

    
1497
# Boot order
1498
HT_BO_FLOPPY = "floppy"
1499
HT_BO_CDROM = "cdrom"
1500
HT_BO_DISK = "disk"
1501
HT_BO_NETWORK = "network"
1502

    
1503
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1504
  HT_BO_FLOPPY,
1505
  HT_BO_CDROM,
1506
  HT_BO_DISK,
1507
  HT_BO_NETWORK,
1508
  ])
1509

    
1510
# SPICE lossless image compression options
1511
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1512
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1513
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1514
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1515
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1516
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1517

    
1518
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1519
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1520
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1521
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1522
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1523
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1524
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1525
  ])
1526

    
1527
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1528
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1529
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1530
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1531

    
1532
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1533
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1534
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1535
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1536
  ])
1537

    
1538
# SPICE video stream detection
1539
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1540
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1541
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1542

    
1543
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1544
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1545
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1546
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1547
  ])
1548

    
1549
# Security models
1550
HT_SM_NONE = "none"
1551
HT_SM_USER = "user"
1552
HT_SM_POOL = "pool"
1553

    
1554
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1555
  HT_SM_NONE,
1556
  HT_SM_USER,
1557
  HT_SM_POOL,
1558
  ])
1559

    
1560
# Kvm flag values
1561
HT_KVM_ENABLED = "enabled"
1562
HT_KVM_DISABLED = "disabled"
1563

    
1564
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1565

    
1566
# Migration type
1567
HT_MIGRATION_LIVE = "live"
1568
HT_MIGRATION_NONLIVE = "non-live"
1569
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1570
  HT_MIGRATION_LIVE,
1571
  HT_MIGRATION_NONLIVE,
1572
  ])
1573

    
1574
# Cluster Verify steps
1575
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1576
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1577

    
1578
# Cluster Verify error classes
1579
CV_TCLUSTER = "cluster"
1580
CV_TGROUP = "group"
1581
CV_TNODE = "node"
1582
CV_TINSTANCE = "instance"
1583

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

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

    
1709
CV_ALL_ECODES_STRINGS = \
1710
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1711

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

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

    
1760
# Admin states
1761
ADMINST_UP = "up"
1762
ADMINST_DOWN = "down"
1763
ADMINST_OFFLINE = "offline"
1764
ADMINST_ALL = compat.UniqueFrozenset([
1765
  ADMINST_UP,
1766
  ADMINST_DOWN,
1767
  ADMINST_OFFLINE,
1768
  ])
1769

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

    
1784
# SSL certificate check constants (in days)
1785
SSL_CERT_EXPIRATION_WARN = 30
1786
SSL_CERT_EXPIRATION_ERROR = 7
1787

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

    
1811
IALLOCATOR_NEVAC_PRI = "primary-only"
1812
IALLOCATOR_NEVAC_SEC = "secondary-only"
1813
IALLOCATOR_NEVAC_ALL = "all"
1814
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1815
  IALLOCATOR_NEVAC_PRI,
1816
  IALLOCATOR_NEVAC_SEC,
1817
  IALLOCATOR_NEVAC_ALL,
1818
  ])
1819

    
1820
# Node evacuation
1821
NODE_EVAC_PRI = "primary-only"
1822
NODE_EVAC_SEC = "secondary-only"
1823
NODE_EVAC_ALL = "all"
1824
NODE_EVAC_MODES = compat.UniqueFrozenset([
1825
  NODE_EVAC_PRI,
1826
  NODE_EVAC_SEC,
1827
  NODE_EVAC_ALL,
1828
  ])
1829

    
1830
# Job queue
1831
JOB_QUEUE_VERSION = 1
1832
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1833
JOB_QUEUE_FILES_PERMS = 0640
1834

    
1835
JOB_ID_TEMPLATE = r"\d+"
1836
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1837

    
1838
# unchanged job return
1839
JOB_NOTCHANGED = "nochange"
1840

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

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

    
1879
# OpCode priority
1880
OP_PRIO_LOWEST = +19
1881
OP_PRIO_HIGHEST = -20
1882

    
1883
OP_PRIO_LOW = +10
1884
OP_PRIO_NORMAL = 0
1885
OP_PRIO_HIGH = -10
1886

    
1887
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1888
  OP_PRIO_LOW,
1889
  OP_PRIO_NORMAL,
1890
  OP_PRIO_HIGH,
1891
  ])
1892

    
1893
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1894

    
1895
# Lock recalculate mode
1896
LOCKS_REPLACE = "replace"
1897
LOCKS_APPEND = "append"
1898

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

    
1908
# Execution log types
1909
ELOG_MESSAGE = "message"
1910
ELOG_REMOTE_IMPORT = "remote-import"
1911
ELOG_JQUEUE_TEST = "jqueue-test"
1912

    
1913
# /etc/hosts modification
1914
ETC_HOSTS_ADD = "add"
1915
ETC_HOSTS_REMOVE = "remove"
1916

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

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

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

    
1954
#: List of resources which can be queried using Local UniX Interface
1955
QR_VIA_LUXI = QR_VIA_OP.union([
1956
  QR_LOCK,
1957
  QR_JOB,
1958
  ])
1959

    
1960
#: List of resources which can be queried using RAPI
1961
QR_VIA_RAPI = QR_VIA_LUXI
1962

    
1963
# Query field types
1964
QFT_UNKNOWN = "unknown"
1965
QFT_TEXT = "text"
1966
QFT_BOOL = "bool"
1967
QFT_NUMBER = "number"
1968
QFT_UNIT = "unit"
1969
QFT_TIMESTAMP = "timestamp"
1970
QFT_OTHER = "other"
1971

    
1972
#: All query field types
1973
QFT_ALL = compat.UniqueFrozenset([
1974
  QFT_UNKNOWN,
1975
  QFT_TEXT,
1976
  QFT_BOOL,
1977
  QFT_NUMBER,
1978
  QFT_UNIT,
1979
  QFT_TIMESTAMP,
1980
  QFT_OTHER,
1981
  ])
1982

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

    
1998
RS_ALL = compat.UniqueFrozenset([
1999
  RS_NORMAL,
2000
  RS_UNKNOWN,
2001
  RS_NODATA,
2002
  RS_UNAVAIL,
2003
  RS_OFFLINE,
2004
  ])
2005

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

    
2014
# max dynamic devices
2015
MAX_NICS = 8
2016
MAX_DISKS = 16
2017

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

    
2045
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2046
SS_HVPARAMS_PREF = "hvparams_"
2047

    
2048
# Hvparams keys:
2049
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2050
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2051
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2052
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2053
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2054
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2055

    
2056
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2057
  SS_HVPARAMS_XEN_PVM,
2058
  SS_HVPARAMS_XEN_FAKE,
2059
  SS_HVPARAMS_XEN_HVM,
2060
  SS_HVPARAMS_XEN_KVM,
2061
  SS_HVPARAMS_XEN_CHROOT,
2062
  SS_HVPARAMS_XEN_LXC,
2063
  ])
2064

    
2065
SS_FILE_PERMS = 0444
2066

    
2067
# cluster wide default parameters
2068
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2069

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

    
2183
HVC_GLOBALS = compat.UniqueFrozenset([
2184
  HV_MIGRATION_PORT,
2185
  HV_MIGRATION_BANDWIDTH,
2186
  HV_MIGRATION_MODE,
2187
  HV_XEN_CMD,
2188
  ])
2189

    
2190
BEC_DEFAULTS = {
2191
  BE_MINMEM: 128,
2192
  BE_MAXMEM: 128,
2193
  BE_VCPUS: 1,
2194
  BE_AUTO_BALANCE: True,
2195
  BE_ALWAYS_FAILOVER: False,
2196
  BE_SPINDLE_USE: 1,
2197
  }
2198

    
2199
NDC_DEFAULTS = {
2200
  ND_OOB_PROGRAM: "",
2201
  ND_SPINDLE_COUNT: 1,
2202
  ND_EXCLUSIVE_STORAGE: False,
2203
  }
2204

    
2205
NDC_GLOBALS = compat.UniqueFrozenset([
2206
  ND_EXCLUSIVE_STORAGE,
2207
  ])
2208

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

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

    
2242
# readability shortcuts
2243
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2244
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2245

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

    
2277
# we don't want to export the shortcuts
2278
del _LV_DEFAULTS, _DRBD_DEFAULTS
2279

    
2280
NICC_DEFAULTS = {
2281
  NIC_MODE: NIC_MODE_BRIDGED,
2282
  NIC_LINK: DEFAULT_BRIDGE,
2283
  NIC_VLAN: VALUE_HS_NOTHING,
2284
  }
2285

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

    
2321
MASTER_POOL_SIZE_DEFAULT = 10
2322

    
2323
# Exclusive storage:
2324
# Error margin used to compare physical disks
2325
PART_MARGIN = .01
2326
# Space reserved when creating instance disks
2327
PART_RESERVED = .02
2328

    
2329
CONFD_PROTOCOL_VERSION = 1
2330

    
2331
CONFD_REQ_PING = 0
2332
CONFD_REQ_NODE_ROLE_BYNAME = 1
2333
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2334
CONFD_REQ_CLUSTER_MASTER = 3
2335
CONFD_REQ_NODE_PIP_LIST = 4
2336
CONFD_REQ_MC_PIP_LIST = 5
2337
CONFD_REQ_INSTANCES_IPS_LIST = 6
2338
CONFD_REQ_NODE_DRBD = 7
2339
CONFD_REQ_NODE_INSTANCES = 8
2340

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

    
2349
CONFD_REQFIELD_NAME = "0"
2350
CONFD_REQFIELD_IP = "1"
2351
CONFD_REQFIELD_MNODE_PIP = "2"
2352

    
2353
CONFD_REQS = compat.UniqueFrozenset([
2354
  CONFD_REQ_PING,
2355
  CONFD_REQ_NODE_ROLE_BYNAME,
2356
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2357
  CONFD_REQ_CLUSTER_MASTER,
2358
  CONFD_REQ_NODE_PIP_LIST,
2359
  CONFD_REQ_MC_PIP_LIST,
2360
  CONFD_REQ_INSTANCES_IPS_LIST,
2361
  CONFD_REQ_NODE_DRBD,
2362
  ])
2363

    
2364
CONFD_REPL_STATUS_OK = 0
2365
CONFD_REPL_STATUS_ERROR = 1
2366
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2367

    
2368
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2369
  CONFD_REPL_STATUS_OK,
2370
  CONFD_REPL_STATUS_ERROR,
2371
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2372
  ])
2373

    
2374
(CONFD_NODE_ROLE_MASTER,
2375
 CONFD_NODE_ROLE_CANDIDATE,
2376
 CONFD_NODE_ROLE_OFFLINE,
2377
 CONFD_NODE_ROLE_DRAINED,
2378
 CONFD_NODE_ROLE_REGULAR,
2379
 ) = range(5)
2380

    
2381
# A few common errors for confd
2382
CONFD_ERROR_UNKNOWN_ENTRY = 1
2383
CONFD_ERROR_INTERNAL = 2
2384
CONFD_ERROR_ARGUMENT = 3
2385

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

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

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

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

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

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

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

    
2425
# User-id pool minimum/maximum acceptable user-ids.
2426
UIDPOOL_UID_MIN = 0
2427
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2428

    
2429
# Name or path of the pgrep command
2430
PGREP = "pgrep"
2431

    
2432
# Name of the node group that gets created at cluster init or upgrade
2433
INITIAL_NODE_GROUP_NAME = "default"
2434

    
2435
# Possible values for NodeGroup.alloc_policy
2436
ALLOC_POLICY_PREFERRED = "preferred"
2437
ALLOC_POLICY_LAST_RESORT = "last_resort"
2438
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2439
VALID_ALLOC_POLICIES = [
2440
  ALLOC_POLICY_PREFERRED,
2441
  ALLOC_POLICY_LAST_RESORT,
2442
  ALLOC_POLICY_UNALLOCABLE,
2443
  ]
2444

    
2445
# Temporary external/shared storage parameters
2446
BLOCKDEV_DRIVER_MANUAL = "manual"
2447

    
2448
# qemu-img path, required for ovfconverter
2449
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2450

    
2451
# Whether htools was enabled at compilation time
2452
HTOOLS = _autoconf.HTOOLS
2453
# The hail iallocator
2454
IALLOC_HAIL = "hail"
2455

    
2456
# Fake opcodes for functions that have hooks attached to them via
2457
# backend.RunLocalHooks
2458
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2459
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2460

    
2461
# SSH key types
2462
SSHK_RSA = "rsa"
2463
SSHK_DSA = "dsa"
2464
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2465

    
2466
# SSH authorized key types
2467
SSHAK_RSA = "ssh-rsa"
2468
SSHAK_DSS = "ssh-dss"
2469
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2470

    
2471
# SSH setup
2472
SSHS_CLUSTER_NAME = "cluster_name"
2473
SSHS_SSH_HOST_KEY = "ssh_host_key"
2474
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2475
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2476

    
2477
#: Key files for SSH daemon
2478
SSH_DAEMON_KEYFILES = {
2479
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2480
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2481
  }
2482

    
2483
# Node daemon setup
2484
NDS_CLUSTER_NAME = "cluster_name"
2485
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2486
NDS_SSCONF = "ssconf"
2487
NDS_START_NODE_DAEMON = "start_node_daemon"
2488

    
2489
# Path generating random UUID
2490
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2491

    
2492
# Regex string for verifying a UUID
2493
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2494

    
2495
# Auto-repair tag prefixes
2496
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2497
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2498
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2499
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2500
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2501

    
2502
# Auto-repair levels
2503
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2504
AUTO_REPAIR_MIGRATE = "migrate"
2505
AUTO_REPAIR_FAILOVER = "failover"
2506
AUTO_REPAIR_REINSTALL = "reinstall"
2507
AUTO_REPAIR_ALL_TYPES = [
2508
  AUTO_REPAIR_FIX_STORAGE,
2509
  AUTO_REPAIR_MIGRATE,
2510
  AUTO_REPAIR_FAILOVER,
2511
  AUTO_REPAIR_REINSTALL,
2512
]
2513

    
2514
# Auto-repair results
2515
AUTO_REPAIR_SUCCESS = "success"
2516
AUTO_REPAIR_FAILURE = "failure"
2517
AUTO_REPAIR_ENOPERM = "enoperm"
2518
AUTO_REPAIR_ALL_RESULTS = frozenset([
2519
    AUTO_REPAIR_SUCCESS,
2520
    AUTO_REPAIR_FAILURE,
2521
    AUTO_REPAIR_ENOPERM,
2522
])
2523

    
2524
# The version identifier for builtin data collectors
2525
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2526

    
2527
# The reason trail opcode parameter name
2528
OPCODE_REASON = "reason"
2529

    
2530
# The source reasons for the execution of an OpCode
2531
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2532
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2533
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2534
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2535
OPCODE_REASON_SRC_USER = "gnt:user"
2536

    
2537
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2538
  OPCODE_REASON_SRC_CLIENT,
2539
  OPCODE_REASON_SRC_NODED,
2540
  OPCODE_REASON_SRC_OPCODE,
2541
  OPCODE_REASON_SRC_RLIB2,
2542
  OPCODE_REASON_SRC_USER,
2543
  ])
2544

    
2545
DISKSTATS_FILE = "/proc/diskstats"
2546

    
2547
# CPU load collector variables
2548
STAT_FILE = "/proc/stat"
2549
CPUAVGLOAD_BUFFER_SIZE = 150
2550
CPUAVGLOAD_WINDOW_SIZE = 600
2551

    
2552
# Mond's variable for periodical data collection
2553
MOND_TIME_INTERVAL = 5
2554

    
2555
# Do not re-export imported modules
2556
del re, _vcsversion, _autoconf, socket, pathutils, compat
2557

    
2558

    
2559
ALLOCATABLE_KEY = "allocatable"
2560
FAILED_KEY = "failed"