Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 807d8853

History | View | Annotate | Download (66.4 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
187
FIRST_DRBD_PORT = 11000
188
LAST_DRBD_PORT = 14999
189

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

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

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

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

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

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

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

    
230
DEV_CONSOLE = "/dev/console"
231

    
232
PROC_MOUNTS = "/proc/mounts"
233

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

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

    
249
EXPORT_CONF_FILE = "config.ini"
250

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
322
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
323

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

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

    
336
IE_CUSTOM_SIZE = "fd"
337

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

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

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

    
356

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
835
ES_PARAMETERS_FILE = "parameters.list"
836

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1076
# KVM-specific statuses
1077
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1078

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1199
# Node parameter names
1200
ND_OOB_PROGRAM = "oob_program"
1201
ND_SPINDLE_COUNT = "spindle_count"
1202
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1203
ND_OVS = "ovs"
1204
ND_OVS_NAME = "ovs_name"
1205
ND_OVS_LINK = "ovs_link"
1206

    
1207
NDS_PARAMETER_TYPES = {
1208
  ND_OOB_PROGRAM: VTYPE_STRING,
1209
  ND_SPINDLE_COUNT: VTYPE_INT,
1210
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1211
  ND_OVS: VTYPE_BOOL,
1212
  ND_OVS_NAME: VTYPE_MAYBE_STRING,
1213
  ND_OVS_LINK: VTYPE_MAYBE_STRING,
1214
  }
1215

    
1216
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1217

    
1218
NDS_PARAMETER_TITLES = {
1219
  ND_OOB_PROGRAM: "OutOfBandProgram",
1220
  ND_SPINDLE_COUNT: "SpindleCount",
1221
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1222
  ND_OVS_NAME: "OpenvSwitchName",
1223
  ND_OVS_LINK: "OpenvSwitchLink",
1224
  }
1225

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

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

    
1300
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1301

    
1302
# OOB supported commands
1303
OOB_POWER_ON = "power-on"
1304
OOB_POWER_OFF = "power-off"
1305
OOB_POWER_CYCLE = "power-cycle"
1306
OOB_POWER_STATUS = "power-status"
1307
OOB_HEALTH = "health"
1308

    
1309
OOB_COMMANDS = compat.UniqueFrozenset([
1310
  OOB_POWER_ON,
1311
  OOB_POWER_OFF,
1312
  OOB_POWER_CYCLE,
1313
  OOB_POWER_STATUS,
1314
  OOB_HEALTH,
1315
  ])
1316

    
1317
OOB_POWER_STATUS_POWERED = "powered"
1318

    
1319
OOB_TIMEOUT = 60 # 60 seconds
1320
OOB_POWER_DELAY = 2.0 # 2 seconds
1321

    
1322
OOB_STATUS_OK = "OK"
1323
OOB_STATUS_WARNING = "WARNING"
1324
OOB_STATUS_CRITICAL = "CRITICAL"
1325
OOB_STATUS_UNKNOWN = "UNKNOWN"
1326

    
1327
OOB_STATUSES = compat.UniqueFrozenset([
1328
  OOB_STATUS_OK,
1329
  OOB_STATUS_WARNING,
1330
  OOB_STATUS_CRITICAL,
1331
  OOB_STATUS_UNKNOWN,
1332
  ])
1333

    
1334
# Instance Parameters Profile
1335
PP_DEFAULT = "default"
1336

    
1337
# NIC_* constants are used inside the ganeti config
1338
NIC_MODE = "mode"
1339
NIC_LINK = "link"
1340
NIC_VLAN = "vlan"
1341

    
1342
NIC_MODE_BRIDGED = "bridged"
1343
NIC_MODE_ROUTED = "routed"
1344
NIC_MODE_OVS = "openvswitch"
1345
NIC_IP_POOL = "pool"
1346

    
1347
NIC_VALID_MODES = compat.UniqueFrozenset([
1348
  NIC_MODE_BRIDGED,
1349
  NIC_MODE_ROUTED,
1350
  NIC_MODE_OVS,
1351
  ])
1352

    
1353
RESERVE_ACTION = "reserve"
1354
RELEASE_ACTION = "release"
1355

    
1356
NICS_PARAMETER_TYPES = {
1357
  NIC_MODE: VTYPE_STRING,
1358
  NIC_LINK: VTYPE_STRING,
1359
  NIC_VLAN: VTYPE_MAYBE_STRING,
1360
  }
1361

    
1362
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1363

    
1364
# IDISK_* constants are used in opcodes, to create/change disks
1365
IDISK_SIZE = "size"
1366
IDISK_SPINDLES = "spindles"
1367
IDISK_MODE = "mode"
1368
IDISK_ADOPT = "adopt"
1369
IDISK_VG = "vg"
1370
IDISK_METAVG = "metavg"
1371
IDISK_PROVIDER = "provider"
1372
IDISK_NAME = "name"
1373
IDISK_PARAMS_TYPES = {
1374
  IDISK_SIZE: VTYPE_SIZE,
1375
  IDISK_SPINDLES: VTYPE_INT,
1376
  IDISK_MODE: VTYPE_STRING,
1377
  IDISK_ADOPT: VTYPE_STRING,
1378
  IDISK_VG: VTYPE_STRING,
1379
  IDISK_METAVG: VTYPE_STRING,
1380
  IDISK_PROVIDER: VTYPE_STRING,
1381
  IDISK_NAME: VTYPE_MAYBE_STRING,
1382
  }
1383
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1384

    
1385
# INIC_* constants are used in opcodes, to create/change nics
1386
INIC_MAC = "mac"
1387
INIC_IP = "ip"
1388
INIC_MODE = "mode"
1389
INIC_LINK = "link"
1390
INIC_NETWORK = "network"
1391
INIC_NAME = "name"
1392
INIC_VLAN = "vlan"
1393
INIC_BRIDGE = "bridge"
1394
INIC_PARAMS_TYPES = {
1395
  INIC_IP: VTYPE_MAYBE_STRING,
1396
  INIC_LINK: VTYPE_STRING,
1397
  INIC_MAC: VTYPE_STRING,
1398
  INIC_MODE: VTYPE_STRING,
1399
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1400
  INIC_NAME: VTYPE_MAYBE_STRING,
1401
  INIC_VLAN: VTYPE_MAYBE_STRING,
1402
  INIC_BRIDGE: VTYPE_MAYBE_STRING
1403
  }
1404
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1405

    
1406
# Hypervisor constants
1407
HT_XEN_PVM = "xen-pvm"
1408
HT_FAKE = "fake"
1409
HT_XEN_HVM = "xen-hvm"
1410
HT_KVM = "kvm"
1411
HT_CHROOT = "chroot"
1412
HT_LXC = "lxc"
1413
HYPER_TYPES = compat.UniqueFrozenset([
1414
  HT_XEN_PVM,
1415
  HT_FAKE,
1416
  HT_XEN_HVM,
1417
  HT_KVM,
1418
  HT_CHROOT,
1419
  HT_LXC,
1420
  ])
1421
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1422

    
1423
VNC_BASE_PORT = 5900
1424
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1425

    
1426
# NIC types
1427
HT_NIC_RTL8139 = "rtl8139"
1428
HT_NIC_NE2K_PCI = "ne2k_pci"
1429
HT_NIC_NE2K_ISA = "ne2k_isa"
1430
HT_NIC_I82551 = "i82551"
1431
HT_NIC_I85557B = "i82557b"
1432
HT_NIC_I8259ER = "i82559er"
1433
HT_NIC_PCNET = "pcnet"
1434
HT_NIC_E1000 = "e1000"
1435
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1436

    
1437
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1438
  HT_NIC_RTL8139,
1439
  HT_NIC_NE2K_PCI,
1440
  HT_NIC_E1000,
1441
  HT_NIC_NE2K_ISA,
1442
  HT_NIC_PARAVIRTUAL,
1443
  ])
1444
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1445
  HT_NIC_RTL8139,
1446
  HT_NIC_NE2K_PCI,
1447
  HT_NIC_NE2K_ISA,
1448
  HT_NIC_I82551,
1449
  HT_NIC_I85557B,
1450
  HT_NIC_I8259ER,
1451
  HT_NIC_PCNET,
1452
  HT_NIC_E1000,
1453
  HT_NIC_PARAVIRTUAL,
1454
  ])
1455

    
1456
# Vif types
1457
# default vif type in xen-hvm
1458
HT_HVM_VIF_IOEMU = "ioemu"
1459
HT_HVM_VIF_VIF = "vif"
1460
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1461
  HT_HVM_VIF_IOEMU,
1462
  HT_HVM_VIF_VIF,
1463
  ])
1464

    
1465
# Disk types
1466
HT_DISK_IOEMU = "ioemu"
1467
HT_DISK_IDE = "ide"
1468
HT_DISK_SCSI = "scsi"
1469
HT_DISK_SD = "sd"
1470
HT_DISK_MTD = "mtd"
1471
HT_DISK_PFLASH = "pflash"
1472

    
1473
HT_CACHE_DEFAULT = "default"
1474
HT_CACHE_NONE = "none"
1475
HT_CACHE_WTHROUGH = "writethrough"
1476
HT_CACHE_WBACK = "writeback"
1477
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1478
  HT_CACHE_DEFAULT,
1479
  HT_CACHE_NONE,
1480
  HT_CACHE_WTHROUGH,
1481
  HT_CACHE_WBACK,
1482
  ])
1483

    
1484
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1485
  HT_DISK_PARAVIRTUAL,
1486
  HT_DISK_IOEMU,
1487
  ])
1488
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1489
  HT_DISK_PARAVIRTUAL,
1490
  HT_DISK_IDE,
1491
  HT_DISK_SCSI,
1492
  HT_DISK_SD,
1493
  HT_DISK_MTD,
1494
  HT_DISK_PFLASH,
1495
  ])
1496

    
1497
# Mouse types:
1498
HT_MOUSE_MOUSE = "mouse"
1499
HT_MOUSE_TABLET = "tablet"
1500

    
1501
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1502
  HT_MOUSE_MOUSE,
1503
  HT_MOUSE_TABLET,
1504
  ])
1505

    
1506
# Boot order
1507
HT_BO_FLOPPY = "floppy"
1508
HT_BO_CDROM = "cdrom"
1509
HT_BO_DISK = "disk"
1510
HT_BO_NETWORK = "network"
1511

    
1512
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1513
  HT_BO_FLOPPY,
1514
  HT_BO_CDROM,
1515
  HT_BO_DISK,
1516
  HT_BO_NETWORK,
1517
  ])
1518

    
1519
# SPICE lossless image compression options
1520
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1521
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1522
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1523
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1524
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1525
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1526

    
1527
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1528
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1529
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1530
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1531
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1532
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1533
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1534
  ])
1535

    
1536
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1537
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1538
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1539
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1540

    
1541
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1542
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1543
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1544
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1545
  ])
1546

    
1547
# SPICE video stream detection
1548
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1549
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1550
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1551

    
1552
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1553
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1554
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1555
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1556
  ])
1557

    
1558
# Security models
1559
HT_SM_NONE = "none"
1560
HT_SM_USER = "user"
1561
HT_SM_POOL = "pool"
1562

    
1563
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1564
  HT_SM_NONE,
1565
  HT_SM_USER,
1566
  HT_SM_POOL,
1567
  ])
1568

    
1569
# Kvm flag values
1570
HT_KVM_ENABLED = "enabled"
1571
HT_KVM_DISABLED = "disabled"
1572

    
1573
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1574

    
1575
# Migration type
1576
HT_MIGRATION_LIVE = "live"
1577
HT_MIGRATION_NONLIVE = "non-live"
1578
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1579
  HT_MIGRATION_LIVE,
1580
  HT_MIGRATION_NONLIVE,
1581
  ])
1582

    
1583
# Cluster Verify steps
1584
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1585
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1586

    
1587
# Cluster Verify error classes
1588
CV_TCLUSTER = "cluster"
1589
CV_TGROUP = "group"
1590
CV_TNODE = "node"
1591
CV_TINSTANCE = "instance"
1592

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

    
1685
CV_ALL_ECODES = compat.UniqueFrozenset([
1686
  CV_ECLUSTERCFG,
1687
  CV_ECLUSTERCERT,
1688
  CV_ECLUSTERFILECHECK,
1689
  CV_ECLUSTERDANGLINGNODES,
1690
  CV_ECLUSTERDANGLINGINST,
1691
  CV_EINSTANCEBADNODE,
1692
  CV_EINSTANCEDOWN,
1693
  CV_EINSTANCELAYOUT,
1694
  CV_EINSTANCEMISSINGDISK,
1695
  CV_EINSTANCEFAULTYDISK,
1696
  CV_EINSTANCEWRONGNODE,
1697
  CV_EINSTANCESPLITGROUPS,
1698
  CV_EINSTANCEPOLICY,
1699
  CV_ENODEDRBD,
1700
  CV_ENODEDRBDHELPER,
1701
  CV_ENODEFILECHECK,
1702
  CV_ENODEHOOKS,
1703
  CV_ENODEHV,
1704
  CV_ENODELVM,
1705
  CV_ENODEN1,
1706
  CV_ENODENET,
1707
  CV_ENODEOS,
1708
  CV_ENODEORPHANINSTANCE,
1709
  CV_ENODEORPHANLV,
1710
  CV_ENODERPC,
1711
  CV_ENODESSH,
1712
  CV_ENODEVERSION,
1713
  CV_ENODESETUP,
1714
  CV_ENODETIME,
1715
  CV_ENODEOOBPATH,
1716
  CV_ENODEUSERSCRIPTS,
1717
  CV_ENODEFILESTORAGEPATHS,
1718
  CV_ENODEFILESTORAGEPATHUNUSABLE,
1719
  CV_ENODESHAREDFILESTORAGEPATHUNUSABLE,
1720
  ])
1721

    
1722
CV_ALL_ECODES_STRINGS = \
1723
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1724

    
1725
# Node verify constants
1726
NV_BRIDGES = "bridges"
1727
NV_DRBDHELPER = "drbd-helper"
1728
NV_DRBDVERSION = "drbd-version"
1729
NV_DRBDLIST = "drbd-list"
1730
NV_EXCLUSIVEPVS = "exclusive-pvs"
1731
NV_FILELIST = "filelist"
1732
NV_ACCEPTED_STORAGE_PATHS = "allowed-file-storage-paths"
1733
NV_FILE_STORAGE_PATH = "file-storage-path"
1734
NV_SHARED_FILE_STORAGE_PATH = "shared-file-storage-path"
1735
NV_HVINFO = "hvinfo"
1736
NV_HVPARAMS = "hvparms"
1737
NV_HYPERVISOR = "hypervisor"
1738
NV_INSTANCELIST = "instancelist"
1739
NV_LVLIST = "lvlist"
1740
NV_MASTERIP = "master-ip"
1741
NV_NODELIST = "nodelist"
1742
NV_NODENETTEST = "node-net-test"
1743
NV_NODESETUP = "nodesetup"
1744
NV_OOB_PATHS = "oob-paths"
1745
NV_OSLIST = "oslist"
1746
NV_PVLIST = "pvlist"
1747
NV_TIME = "time"
1748
NV_USERSCRIPTS = "user-scripts"
1749
NV_VERSION = "version"
1750
NV_VGLIST = "vglist"
1751
NV_VMNODES = "vmnodes"
1752

    
1753
# Instance status
1754
INSTST_RUNNING = "running"
1755
INSTST_ADMINDOWN = "ADMIN_down"
1756
INSTST_ADMINOFFLINE = "ADMIN_offline"
1757
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1758
INSTST_NODEDOWN = "ERROR_nodedown"
1759
INSTST_WRONGNODE = "ERROR_wrongnode"
1760
INSTST_ERRORUP = "ERROR_up"
1761
INSTST_ERRORDOWN = "ERROR_down"
1762
INSTST_ALL = compat.UniqueFrozenset([
1763
  INSTST_RUNNING,
1764
  INSTST_ADMINDOWN,
1765
  INSTST_ADMINOFFLINE,
1766
  INSTST_NODEOFFLINE,
1767
  INSTST_NODEDOWN,
1768
  INSTST_WRONGNODE,
1769
  INSTST_ERRORUP,
1770
  INSTST_ERRORDOWN,
1771
  ])
1772

    
1773
# Admin states
1774
ADMINST_UP = "up"
1775
ADMINST_DOWN = "down"
1776
ADMINST_OFFLINE = "offline"
1777
ADMINST_ALL = compat.UniqueFrozenset([
1778
  ADMINST_UP,
1779
  ADMINST_DOWN,
1780
  ADMINST_OFFLINE,
1781
  ])
1782

    
1783
# Node roles
1784
NR_REGULAR = "R"
1785
NR_MASTER = "M"
1786
NR_MCANDIDATE = "C"
1787
NR_DRAINED = "D"
1788
NR_OFFLINE = "O"
1789
NR_ALL = compat.UniqueFrozenset([
1790
  NR_REGULAR,
1791
  NR_MASTER,
1792
  NR_MCANDIDATE,
1793
  NR_DRAINED,
1794
  NR_OFFLINE,
1795
  ])
1796

    
1797
# SSL certificate check constants (in days)
1798
SSL_CERT_EXPIRATION_WARN = 30
1799
SSL_CERT_EXPIRATION_ERROR = 7
1800

    
1801
# Allocator framework constants
1802
IALLOCATOR_VERSION = 2
1803
IALLOCATOR_DIR_IN = "in"
1804
IALLOCATOR_DIR_OUT = "out"
1805
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1806
  IALLOCATOR_DIR_IN,
1807
  IALLOCATOR_DIR_OUT,
1808
  ])
1809
IALLOCATOR_MODE_ALLOC = "allocate"
1810
IALLOCATOR_MODE_RELOC = "relocate"
1811
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1812
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1813
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1814
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1815
  IALLOCATOR_MODE_ALLOC,
1816
  IALLOCATOR_MODE_RELOC,
1817
  IALLOCATOR_MODE_CHG_GROUP,
1818
  IALLOCATOR_MODE_NODE_EVAC,
1819
  IALLOCATOR_MODE_MULTI_ALLOC,
1820
  ])
1821
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1822
DEFAULT_IALLOCATOR_SHORTCUT = "."
1823

    
1824
IALLOCATOR_NEVAC_PRI = "primary-only"
1825
IALLOCATOR_NEVAC_SEC = "secondary-only"
1826
IALLOCATOR_NEVAC_ALL = "all"
1827
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1828
  IALLOCATOR_NEVAC_PRI,
1829
  IALLOCATOR_NEVAC_SEC,
1830
  IALLOCATOR_NEVAC_ALL,
1831
  ])
1832

    
1833
# Node evacuation
1834
NODE_EVAC_PRI = "primary-only"
1835
NODE_EVAC_SEC = "secondary-only"
1836
NODE_EVAC_ALL = "all"
1837
NODE_EVAC_MODES = compat.UniqueFrozenset([
1838
  NODE_EVAC_PRI,
1839
  NODE_EVAC_SEC,
1840
  NODE_EVAC_ALL,
1841
  ])
1842

    
1843
# Job queue
1844
JOB_QUEUE_VERSION = 1
1845
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1846
JOB_QUEUE_FILES_PERMS = 0640
1847

    
1848
JOB_ID_TEMPLATE = r"\d+"
1849
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1850

    
1851
# unchanged job return
1852
JOB_NOTCHANGED = "nochange"
1853

    
1854
# Job status
1855
JOB_STATUS_QUEUED = "queued"
1856
JOB_STATUS_WAITING = "waiting"
1857
JOB_STATUS_CANCELING = "canceling"
1858
JOB_STATUS_RUNNING = "running"
1859
JOB_STATUS_CANCELED = "canceled"
1860
JOB_STATUS_SUCCESS = "success"
1861
JOB_STATUS_ERROR = "error"
1862
JOBS_PENDING = compat.UniqueFrozenset([
1863
  JOB_STATUS_QUEUED,
1864
  JOB_STATUS_WAITING,
1865
  JOB_STATUS_CANCELING,
1866
  ])
1867
JOBS_FINALIZED = compat.UniqueFrozenset([
1868
  JOB_STATUS_CANCELED,
1869
  JOB_STATUS_SUCCESS,
1870
  JOB_STATUS_ERROR,
1871
  ])
1872
JOB_STATUS_ALL = compat.UniqueFrozenset([
1873
  JOB_STATUS_RUNNING,
1874
  ]) | JOBS_PENDING | JOBS_FINALIZED
1875

    
1876
# OpCode status
1877
# not yet finalized
1878
OP_STATUS_QUEUED = "queued"
1879
OP_STATUS_WAITING = "waiting"
1880
OP_STATUS_CANCELING = "canceling"
1881
OP_STATUS_RUNNING = "running"
1882
# finalized
1883
OP_STATUS_CANCELED = "canceled"
1884
OP_STATUS_SUCCESS = "success"
1885
OP_STATUS_ERROR = "error"
1886
OPS_FINALIZED = compat.UniqueFrozenset([
1887
  OP_STATUS_CANCELED,
1888
  OP_STATUS_SUCCESS,
1889
  OP_STATUS_ERROR,
1890
  ])
1891

    
1892
# OpCode priority
1893
OP_PRIO_LOWEST = +19
1894
OP_PRIO_HIGHEST = -20
1895

    
1896
OP_PRIO_LOW = +10
1897
OP_PRIO_NORMAL = 0
1898
OP_PRIO_HIGH = -10
1899

    
1900
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1901
  OP_PRIO_LOW,
1902
  OP_PRIO_NORMAL,
1903
  OP_PRIO_HIGH,
1904
  ])
1905

    
1906
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1907

    
1908
# Lock recalculate mode
1909
LOCKS_REPLACE = "replace"
1910
LOCKS_APPEND = "append"
1911

    
1912
# Lock timeout (sum) before we should go into blocking acquire (still
1913
# can be reset by priority change); computed as max time (10 hours)
1914
# before we should actually go into blocking acquire given that we
1915
# start from default priority level; in seconds
1916
# TODO
1917
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1918
LOCK_ATTEMPTS_MAXWAIT = 15.0
1919
LOCK_ATTEMPTS_MINWAIT = 1.0
1920

    
1921
# Execution log types
1922
ELOG_MESSAGE = "message"
1923
ELOG_REMOTE_IMPORT = "remote-import"
1924
ELOG_JQUEUE_TEST = "jqueue-test"
1925

    
1926
# /etc/hosts modification
1927
ETC_HOSTS_ADD = "add"
1928
ETC_HOSTS_REMOVE = "remove"
1929

    
1930
# Job queue test
1931
JQT_MSGPREFIX = "TESTMSG="
1932
JQT_EXPANDNAMES = "expandnames"
1933
JQT_EXEC = "exec"
1934
JQT_LOGMSG = "logmsg"
1935
JQT_STARTMSG = "startmsg"
1936
JQT_ALL = compat.UniqueFrozenset([
1937
  JQT_EXPANDNAMES,
1938
  JQT_EXEC,
1939
  JQT_LOGMSG,
1940
  JQT_STARTMSG,
1941
  ])
1942

    
1943
# Query resources
1944
QR_CLUSTER = "cluster"
1945
QR_INSTANCE = "instance"
1946
QR_NODE = "node"
1947
QR_LOCK = "lock"
1948
QR_GROUP = "group"
1949
QR_OS = "os"
1950
QR_JOB = "job"
1951
QR_EXPORT = "export"
1952
QR_NETWORK = "network"
1953
QR_EXTSTORAGE = "extstorage"
1954

    
1955
#: List of resources which can be queried using L{opcodes.OpQuery}
1956
QR_VIA_OP = compat.UniqueFrozenset([
1957
  QR_CLUSTER,
1958
  QR_INSTANCE,
1959
  QR_NODE,
1960
  QR_GROUP,
1961
  QR_OS,
1962
  QR_EXPORT,
1963
  QR_NETWORK,
1964
  QR_EXTSTORAGE,
1965
  ])
1966

    
1967
#: List of resources which can be queried using Local UniX Interface
1968
QR_VIA_LUXI = QR_VIA_OP.union([
1969
  QR_LOCK,
1970
  QR_JOB,
1971
  ])
1972

    
1973
#: List of resources which can be queried using RAPI
1974
QR_VIA_RAPI = QR_VIA_LUXI
1975

    
1976
# Query field types
1977
QFT_UNKNOWN = "unknown"
1978
QFT_TEXT = "text"
1979
QFT_BOOL = "bool"
1980
QFT_NUMBER = "number"
1981
QFT_UNIT = "unit"
1982
QFT_TIMESTAMP = "timestamp"
1983
QFT_OTHER = "other"
1984

    
1985
#: All query field types
1986
QFT_ALL = compat.UniqueFrozenset([
1987
  QFT_UNKNOWN,
1988
  QFT_TEXT,
1989
  QFT_BOOL,
1990
  QFT_NUMBER,
1991
  QFT_UNIT,
1992
  QFT_TIMESTAMP,
1993
  QFT_OTHER,
1994
  ])
1995

    
1996
# Query result field status (don't change or reuse values as they're used by
1997
# clients)
1998
#: Normal field status
1999
RS_NORMAL = 0
2000
#: Unknown field
2001
RS_UNKNOWN = 1
2002
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
2003
RS_NODATA = 2
2004
#: Value unavailable/unsupported for item; if this field is supported
2005
#: but we cannot get the data for the moment, RS_NODATA or
2006
#: RS_OFFLINE should be used
2007
RS_UNAVAIL = 3
2008
#: Resource marked offline
2009
RS_OFFLINE = 4
2010

    
2011
RS_ALL = compat.UniqueFrozenset([
2012
  RS_NORMAL,
2013
  RS_UNKNOWN,
2014
  RS_NODATA,
2015
  RS_UNAVAIL,
2016
  RS_OFFLINE,
2017
  ])
2018

    
2019
#: Dictionary with special field cases and their verbose/terse formatting
2020
RSS_DESCRIPTION = {
2021
  RS_UNKNOWN: ("(unknown)", "??"),
2022
  RS_NODATA: ("(nodata)", "?"),
2023
  RS_OFFLINE: ("(offline)", "*"),
2024
  RS_UNAVAIL: ("(unavail)", "-"),
2025
  }
2026

    
2027
# max dynamic devices
2028
MAX_NICS = 8
2029
MAX_DISKS = 16
2030

    
2031
# SSCONF file prefix
2032
SSCONF_FILEPREFIX = "ssconf_"
2033
# SSCONF keys
2034
SS_CLUSTER_NAME = "cluster_name"
2035
SS_CLUSTER_TAGS = "cluster_tags"
2036
SS_FILE_STORAGE_DIR = "file_storage_dir"
2037
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
2038
SS_MASTER_CANDIDATES = "master_candidates"
2039
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
2040
SS_MASTER_IP = "master_ip"
2041
SS_MASTER_NETDEV = "master_netdev"
2042
SS_MASTER_NETMASK = "master_netmask"
2043
SS_MASTER_NODE = "master_node"
2044
SS_NODE_LIST = "node_list"
2045
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2046
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2047
SS_OFFLINE_NODES = "offline_nodes"
2048
SS_ONLINE_NODES = "online_nodes"
2049
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2050
SS_INSTANCE_LIST = "instance_list"
2051
SS_RELEASE_VERSION = "release_version"
2052
SS_HYPERVISOR_LIST = "hypervisor_list"
2053
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2054
SS_UID_POOL = "uid_pool"
2055
SS_NODEGROUPS = "nodegroups"
2056
SS_NETWORKS = "networks"
2057

    
2058
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2059
SS_HVPARAMS_PREF = "hvparams_"
2060

    
2061
# Hvparams keys:
2062
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2063
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2064
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2065
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2066
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2067
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2068

    
2069
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2070
  SS_HVPARAMS_XEN_PVM,
2071
  SS_HVPARAMS_XEN_FAKE,
2072
  SS_HVPARAMS_XEN_HVM,
2073
  SS_HVPARAMS_XEN_KVM,
2074
  SS_HVPARAMS_XEN_CHROOT,
2075
  SS_HVPARAMS_XEN_LXC,
2076
  ])
2077

    
2078
SS_FILE_PERMS = 0444
2079

    
2080
# cluster wide default parameters
2081
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2082

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

    
2197
HVC_GLOBALS = compat.UniqueFrozenset([
2198
  HV_MIGRATION_PORT,
2199
  HV_MIGRATION_BANDWIDTH,
2200
  HV_MIGRATION_MODE,
2201
  HV_XEN_CMD,
2202
  ])
2203

    
2204
BEC_DEFAULTS = {
2205
  BE_MINMEM: 128,
2206
  BE_MAXMEM: 128,
2207
  BE_VCPUS: 1,
2208
  BE_AUTO_BALANCE: True,
2209
  BE_ALWAYS_FAILOVER: False,
2210
  BE_SPINDLE_USE: 1,
2211
  }
2212

    
2213
NDC_DEFAULTS = {
2214
  ND_OOB_PROGRAM: "",
2215
  ND_SPINDLE_COUNT: 1,
2216
  ND_EXCLUSIVE_STORAGE: False,
2217
  ND_OVS: False,
2218
  ND_OVS_NAME: DEFAULT_OVS,
2219
  ND_OVS_LINK: ""
2220
  }
2221

    
2222
NDC_GLOBALS = compat.UniqueFrozenset([
2223
  ND_EXCLUSIVE_STORAGE,
2224
  ])
2225

    
2226
DISK_LD_DEFAULTS = {
2227
  LD_DRBD8: {
2228
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2229
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2230
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2231
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2232
    LDP_DISK_CUSTOM: "",
2233
    LDP_NET_CUSTOM: "",
2234
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2235
    LDP_DYNAMIC_RESYNC: False,
2236

    
2237
    # The default values for the DRBD dynamic resync speed algorithm
2238
    # are taken from the drbsetup 8.3.11 man page, except for
2239
    # c-plan-ahead (that we don't need to set to 0, because we have a
2240
    # separate option to enable it) and for c-max-rate, that we cap to
2241
    # the default value for the static resync rate.
2242
    LDP_PLAN_AHEAD: 20, # ds
2243
    LDP_FILL_TARGET: 0, # sectors
2244
    LDP_DELAY_TARGET: 1, # ds
2245
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2246
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2247
    },
2248
  LD_LV: {
2249
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2250
    },
2251
  LD_FILE: {},
2252
  LD_BLOCKDEV: {},
2253
  LD_RBD: {
2254
    LDP_POOL: "rbd"
2255
    },
2256
  LD_EXT: {},
2257
  }
2258

    
2259
# readability shortcuts
2260
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2261
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2262

    
2263
DISK_DT_DEFAULTS = {
2264
  DT_PLAIN: {
2265
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2266
    },
2267
  DT_DRBD8: {
2268
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2269
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2270
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2271
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2272
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2273
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2274
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2275
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2276
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2277
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2278
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2279
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2280
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2281
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2282
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2283
    },
2284
  DT_DISKLESS: {},
2285
  DT_FILE: {},
2286
  DT_SHARED_FILE: {},
2287
  DT_BLOCK: {},
2288
  DT_RBD: {
2289
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2290
    },
2291
  DT_EXT: {},
2292
  }
2293

    
2294
# we don't want to export the shortcuts
2295
del _LV_DEFAULTS, _DRBD_DEFAULTS
2296

    
2297
NICC_DEFAULTS = {
2298
  NIC_MODE: NIC_MODE_BRIDGED,
2299
  NIC_LINK: DEFAULT_BRIDGE,
2300
  NIC_VLAN: VALUE_HS_NOTHING,
2301
  }
2302

    
2303
# All of the following values are quite arbitrarily - there are no
2304
# "good" defaults, these must be customised per-site
2305
ISPECS_MINMAX_DEFAULTS = {
2306
  ISPECS_MIN: {
2307
    ISPEC_MEM_SIZE: 128,
2308
    ISPEC_CPU_COUNT: 1,
2309
    ISPEC_DISK_COUNT: 1,
2310
    ISPEC_DISK_SIZE: 1024,
2311
    ISPEC_NIC_COUNT: 1,
2312
    ISPEC_SPINDLE_USE: 1,
2313
    },
2314
  ISPECS_MAX: {
2315
    ISPEC_MEM_SIZE: 32768,
2316
    ISPEC_CPU_COUNT: 8,
2317
    ISPEC_DISK_COUNT: MAX_DISKS,
2318
    ISPEC_DISK_SIZE: 1024 * 1024,
2319
    ISPEC_NIC_COUNT: MAX_NICS,
2320
    ISPEC_SPINDLE_USE: 12,
2321
    },
2322
  }
2323
IPOLICY_DEFAULTS = {
2324
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2325
  ISPECS_STD: {
2326
    ISPEC_MEM_SIZE: 128,
2327
    ISPEC_CPU_COUNT: 1,
2328
    ISPEC_DISK_COUNT: 1,
2329
    ISPEC_DISK_SIZE: 1024,
2330
    ISPEC_NIC_COUNT: 1,
2331
    ISPEC_SPINDLE_USE: 1,
2332
    },
2333
  IPOLICY_DTS: list(DISK_TEMPLATES),
2334
  IPOLICY_VCPU_RATIO: 4.0,
2335
  IPOLICY_SPINDLE_RATIO: 32.0,
2336
  }
2337

    
2338
MASTER_POOL_SIZE_DEFAULT = 10
2339

    
2340
# Exclusive storage:
2341
# Error margin used to compare physical disks
2342
PART_MARGIN = .01
2343
# Space reserved when creating instance disks
2344
PART_RESERVED = .02
2345

    
2346
CONFD_PROTOCOL_VERSION = 1
2347

    
2348
CONFD_REQ_PING = 0
2349
CONFD_REQ_NODE_ROLE_BYNAME = 1
2350
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2351
CONFD_REQ_CLUSTER_MASTER = 3
2352
CONFD_REQ_NODE_PIP_LIST = 4
2353
CONFD_REQ_MC_PIP_LIST = 5
2354
CONFD_REQ_INSTANCES_IPS_LIST = 6
2355
CONFD_REQ_NODE_DRBD = 7
2356
CONFD_REQ_NODE_INSTANCES = 8
2357

    
2358
# Confd request query fields. These are used to narrow down queries.
2359
# These must be strings rather than integers, because json-encoding
2360
# converts them to strings anyway, as they're used as dict-keys.
2361
CONFD_REQQ_LINK = "0"
2362
CONFD_REQQ_IP = "1"
2363
CONFD_REQQ_IPLIST = "2"
2364
CONFD_REQQ_FIELDS = "3"
2365

    
2366
CONFD_REQFIELD_NAME = "0"
2367
CONFD_REQFIELD_IP = "1"
2368
CONFD_REQFIELD_MNODE_PIP = "2"
2369

    
2370
CONFD_REQS = compat.UniqueFrozenset([
2371
  CONFD_REQ_PING,
2372
  CONFD_REQ_NODE_ROLE_BYNAME,
2373
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2374
  CONFD_REQ_CLUSTER_MASTER,
2375
  CONFD_REQ_NODE_PIP_LIST,
2376
  CONFD_REQ_MC_PIP_LIST,
2377
  CONFD_REQ_INSTANCES_IPS_LIST,
2378
  CONFD_REQ_NODE_DRBD,
2379
  ])
2380

    
2381
CONFD_REPL_STATUS_OK = 0
2382
CONFD_REPL_STATUS_ERROR = 1
2383
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2384

    
2385
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2386
  CONFD_REPL_STATUS_OK,
2387
  CONFD_REPL_STATUS_ERROR,
2388
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2389
  ])
2390

    
2391
(CONFD_NODE_ROLE_MASTER,
2392
 CONFD_NODE_ROLE_CANDIDATE,
2393
 CONFD_NODE_ROLE_OFFLINE,
2394
 CONFD_NODE_ROLE_DRAINED,
2395
 CONFD_NODE_ROLE_REGULAR,
2396
 ) = range(5)
2397

    
2398
# A few common errors for confd
2399
CONFD_ERROR_UNKNOWN_ENTRY = 1
2400
CONFD_ERROR_INTERNAL = 2
2401
CONFD_ERROR_ARGUMENT = 3
2402

    
2403
# Each request is "salted" by the current timestamp.
2404
# This constants decides how many seconds of skew to accept.
2405
# TODO: make this a default and allow the value to be more configurable
2406
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2407

    
2408
# When we haven't reloaded the config for more than this amount of
2409
# seconds, we force a test to see if inotify is betraying us. Using a
2410
# prime number to ensure we get less chance of 'same wakeup' with
2411
# other processes.
2412
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2413

    
2414
# If we receive more than one update in this amount of microseconds,
2415
# we move to polling every RATELIMIT seconds, rather than relying on
2416
# inotify, to be able to serve more requests.
2417
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2418

    
2419
# Magic number prepended to all confd queries.
2420
# This allows us to distinguish different types of confd protocols and handle
2421
# them. For example by changing this we can move the whole payload to be
2422
# compressed, or move away from json.
2423
CONFD_MAGIC_FOURCC = "plj0"
2424

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

    
2430
# Timeout in seconds to expire pending query request in the confd client
2431
# library. We don't actually expect any answer more than 10 seconds after we
2432
# sent a request.
2433
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2434

    
2435
# Maximum UDP datagram size.
2436
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2437
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2438
#   (assuming we can't use jumbo frames)
2439
# We just set this to 60K, which should be enough
2440
MAX_UDP_DATA_SIZE = 61440
2441

    
2442
# User-id pool minimum/maximum acceptable user-ids.
2443
UIDPOOL_UID_MIN = 0
2444
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2445

    
2446
# Name or path of the pgrep command
2447
PGREP = "pgrep"
2448

    
2449
# Name of the node group that gets created at cluster init or upgrade
2450
INITIAL_NODE_GROUP_NAME = "default"
2451

    
2452
# Possible values for NodeGroup.alloc_policy
2453
ALLOC_POLICY_PREFERRED = "preferred"
2454
ALLOC_POLICY_LAST_RESORT = "last_resort"
2455
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2456
VALID_ALLOC_POLICIES = [
2457
  ALLOC_POLICY_PREFERRED,
2458
  ALLOC_POLICY_LAST_RESORT,
2459
  ALLOC_POLICY_UNALLOCABLE,
2460
  ]
2461

    
2462
# Temporary external/shared storage parameters
2463
BLOCKDEV_DRIVER_MANUAL = "manual"
2464

    
2465
# qemu-img path, required for ovfconverter
2466
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2467

    
2468
# Whether htools was enabled at compilation time
2469
HTOOLS = _autoconf.HTOOLS
2470
# The hail iallocator
2471
IALLOC_HAIL = "hail"
2472

    
2473
# Fake opcodes for functions that have hooks attached to them via
2474
# backend.RunLocalHooks
2475
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2476
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2477

    
2478
# SSH key types
2479
SSHK_RSA = "rsa"
2480
SSHK_DSA = "dsa"
2481
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2482

    
2483
# SSH authorized key types
2484
SSHAK_RSA = "ssh-rsa"
2485
SSHAK_DSS = "ssh-dss"
2486
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2487

    
2488
# SSH setup
2489
SSHS_CLUSTER_NAME = "cluster_name"
2490
SSHS_SSH_HOST_KEY = "ssh_host_key"
2491
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2492
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2493

    
2494
#: Key files for SSH daemon
2495
SSH_DAEMON_KEYFILES = {
2496
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2497
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2498
  }
2499

    
2500
# Node daemon setup
2501
NDS_CLUSTER_NAME = "cluster_name"
2502
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2503
NDS_SSCONF = "ssconf"
2504
NDS_START_NODE_DAEMON = "start_node_daemon"
2505

    
2506
# Path generating random UUID
2507
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2508

    
2509
# Regex string for verifying a UUID
2510
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2511

    
2512
# Auto-repair tag prefixes
2513
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2514
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2515
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2516
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2517
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2518

    
2519
# Auto-repair levels
2520
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2521
AUTO_REPAIR_MIGRATE = "migrate"
2522
AUTO_REPAIR_FAILOVER = "failover"
2523
AUTO_REPAIR_REINSTALL = "reinstall"
2524
AUTO_REPAIR_ALL_TYPES = [
2525
  AUTO_REPAIR_FIX_STORAGE,
2526
  AUTO_REPAIR_MIGRATE,
2527
  AUTO_REPAIR_FAILOVER,
2528
  AUTO_REPAIR_REINSTALL,
2529
]
2530

    
2531
# Auto-repair results
2532
AUTO_REPAIR_SUCCESS = "success"
2533
AUTO_REPAIR_FAILURE = "failure"
2534
AUTO_REPAIR_ENOPERM = "enoperm"
2535
AUTO_REPAIR_ALL_RESULTS = frozenset([
2536
    AUTO_REPAIR_SUCCESS,
2537
    AUTO_REPAIR_FAILURE,
2538
    AUTO_REPAIR_ENOPERM,
2539
])
2540

    
2541
# The version identifier for builtin data collectors
2542
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2543

    
2544
# The reason trail opcode parameter name
2545
OPCODE_REASON = "reason"
2546

    
2547
# The source reasons for the execution of an OpCode
2548
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2549
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2550
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2551
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2552
OPCODE_REASON_SRC_USER = "gnt:user"
2553

    
2554
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2555
  OPCODE_REASON_SRC_CLIENT,
2556
  OPCODE_REASON_SRC_NODED,
2557
  OPCODE_REASON_SRC_OPCODE,
2558
  OPCODE_REASON_SRC_RLIB2,
2559
  OPCODE_REASON_SRC_USER,
2560
  ])
2561

    
2562
DISKSTATS_FILE = "/proc/diskstats"
2563

    
2564
# CPU load collector variables
2565
STAT_FILE = "/proc/stat"
2566
CPUAVGLOAD_BUFFER_SIZE = 150
2567
CPUAVGLOAD_WINDOW_SIZE = 600
2568

    
2569
# Mond's variable for periodical data collection
2570
MOND_TIME_INTERVAL = 5
2571

    
2572
# Do not re-export imported modules
2573
del re, _vcsversion, _autoconf, socket, pathutils, compat
2574

    
2575

    
2576
ALLOCATABLE_KEY = "allocatable"
2577
FAILED_KEY = "failed"