Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ d76880d8

History | View | Annotate | Download (64.5 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
NODED_USER = _autoconf.NODED_USER
108
NODED_GROUP = _autoconf.NODED_GROUP
109
MOND_USER = _autoconf.MOND_USER
110
MOND_GROUP = _autoconf.MOND_GROUP
111
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
112
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
113

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

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

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

    
137
# Wipe
138
DD_CMD = "dd"
139
MAX_WIPE_CHUNK = 1024 # 1GB
140
MIN_WIPE_CHUNK_PERCENT = 10
141

    
142
RUN_DIRS_MODE = 0775
143
SECURE_DIR_MODE = 0700
144
SECURE_FILE_MODE = 0600
145
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
146
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
147
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
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
RAPI = "ganeti-rapi"
160
MASTERD = "ganeti-masterd"
161
MOND = "ganeti-mond"
162

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

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

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

    
185
FIRST_DRBD_PORT = 11000
186
LAST_DRBD_PORT = 14999
187

    
188
DAEMONS_LOGBASE = {
189
  NODED: "node-daemon",
190
  CONFD: "conf-daemon",
191
  RAPI: "rapi-daemon",
192
  MASTERD: "master-daemon",
193
  MOND: "monitoring-daemon",
194
  }
195

    
196
DAEMONS_LOGFILES = \
197
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
198
         for daemon in DAEMONS_LOGBASE)
199

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

    
204
# These are the only valid reasons for having an extra logfile
205
EXTRA_LOGREASON_ACCESS = "access"
206
EXTRA_LOGREASON_ERROR = "error"
207

    
208
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
209
  EXTRA_LOGREASON_ACCESS,
210
  EXTRA_LOGREASON_ERROR,
211
  ])
212

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

    
221
DAEMONS_EXTRA_LOGFILES = \
222
  dict((daemon, dict((extra,
223
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
224
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
225
         for daemon in DAEMONS_EXTRA_LOGBASE)
226

    
227
DEV_CONSOLE = "/dev/console"
228

    
229
PROC_MOUNTS = "/proc/mounts"
230

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

    
239
# one of "no", "yes", "only"
240
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
241
SYSLOG_NO = "no"
242
SYSLOG_YES = "yes"
243
SYSLOG_ONLY = "only"
244
SYSLOG_SOCKET = "/dev/log"
245

    
246
EXPORT_CONF_FILE = "config.ini"
247

    
248
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
249
XEN_KERNEL = _autoconf.XEN_KERNEL
250
XEN_INITRD = _autoconf.XEN_INITRD
251
XEN_CMD_XM = "xm"
252
XEN_CMD_XL = "xl"
253

    
254
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
255
  XEN_CMD_XM,
256
  XEN_CMD_XL,
257
  ])
258

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

    
270
KVM_PATH = _autoconf.KVM_PATH
271
KVM_KERNEL = _autoconf.KVM_KERNEL
272
SOCAT_PATH = _autoconf.SOCAT_PATH
273
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
274
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
275
SOCAT_ESCAPE_CODE = "0x1d"
276

    
277
#: Console as SSH command
278
CONS_SSH = "ssh"
279

    
280
#: Console as VNC server
281
CONS_VNC = "vnc"
282

    
283
#: Console as SPICE server
284
CONS_SPICE = "spice"
285

    
286
#: Display a message for console access
287
CONS_MESSAGE = "msg"
288

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

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

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

    
310
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
311
X509_CERT_SIGN_DIGEST = "SHA1"
312

    
313
# Default validity of certificates in days
314
X509_CERT_DEFAULT_VALIDITY = 365 * 5
315

    
316
# commonName (CN) used in certificates
317
X509_CERT_CN = "ganeti.example.com"
318

    
319
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
320

    
321
# Import/export daemon mode
322
IEM_IMPORT = "import"
323
IEM_EXPORT = "export"
324

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

    
333
IE_CUSTOM_SIZE = "fd"
334

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

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

    
345
VALUE_DEFAULT = "default"
346
VALUE_AUTO = "auto"
347
VALUE_GENERATE = "generate"
348
VALUE_NONE = "none"
349
VALUE_TRUE = "true"
350
VALUE_FALSE = "false"
351

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

    
355
# hooks-related constants
356
HOOKS_PHASE_PRE = "pre"
357
HOOKS_PHASE_POST = "post"
358
HOOKS_NAME_CFGUPDATE = "config-update"
359
HOOKS_NAME_WATCHER = "watcher"
360
HOOKS_VERSION = 2
361
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
362

    
363
# hooks subject type (what object type does the LU deal with)
364
HTYPE_CLUSTER = "CLUSTER"
365
HTYPE_NODE = "NODE"
366
HTYPE_GROUP = "GROUP"
367
HTYPE_INSTANCE = "INSTANCE"
368
HTYPE_NETWORK = "NETWORK"
369

    
370
HKR_SKIP = 0
371
HKR_FAIL = 1
372
HKR_SUCCESS = 2
373

    
374
# Storage types
375
ST_BLOCK = "blockdev"
376
ST_DISKLESS = "diskless"
377
ST_EXT = "ext"
378
ST_FILE = "file"
379
ST_LVM_PV = "lvm-pv"
380
ST_LVM_VG = "lvm-vg"
381
ST_RADOS = "rados"
382

    
383
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
384
  ST_BLOCK,
385
  ST_DISKLESS,
386
  ST_EXT,
387
  ST_FILE,
388
  ST_LVM_PV,
389
  ST_LVM_VG,
390
  ST_RADOS,
391
  ])
392

    
393
# Storage fields
394
# first two are valid in LU context only, not passed to backend
395
SF_NODE = "node"
396
SF_TYPE = "type"
397
# and the rest are valid in backend
398
SF_NAME = "name"
399
SF_SIZE = "size"
400
SF_FREE = "free"
401
SF_USED = "used"
402
SF_ALLOCATABLE = "allocatable"
403

    
404
# Storage operations
405
SO_FIX_CONSISTENCY = "fix-consistency"
406

    
407
# Available fields per storage type
408
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
409
  SF_NAME,
410
  SF_TYPE,
411
  SF_SIZE,
412
  SF_USED,
413
  SF_FREE,
414
  SF_ALLOCATABLE,
415
  ])
416

    
417
MODIFIABLE_STORAGE_FIELDS = {
418
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
419
  }
420

    
421
VALID_STORAGE_OPERATIONS = {
422
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
423
  }
424

    
425
# Local disk status
426
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
427
(LDS_OKAY,
428
 LDS_UNKNOWN,
429
 LDS_FAULTY) = range(1, 4)
430

    
431
LDS_NAMES = {
432
  LDS_OKAY: "ok",
433
  LDS_UNKNOWN: "unknown",
434
  LDS_FAULTY: "faulty",
435
}
436

    
437
# disk template types
438
DT_BLOCK = "blockdev"
439
DT_DISKLESS = "diskless"
440
DT_DRBD8 = "drbd"
441
DT_EXT = "ext"
442
DT_FILE = "file"
443
DT_PLAIN = "plain"
444
DT_RBD = "rbd"
445
DT_SHARED_FILE = "sharedfile"
446

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

    
462
DISK_TEMPLATES = compat.UniqueFrozenset([
463
  DT_DISKLESS,
464
  DT_PLAIN,
465
  DT_DRBD8,
466
  DT_FILE,
467
  DT_SHARED_FILE,
468
  DT_BLOCK,
469
  DT_RBD,
470
  DT_EXT
471
  ])
472

    
473
# disk templates that are enabled by default
474
DEFAULT_ENABLED_DISK_TEMPLATES = [
475
  DT_DRBD8,
476
  DT_PLAIN,
477
  ]
478

    
479
# mapping of disk templates to storage types
480
DISK_TEMPLATES_STORAGE_TYPE = {
481
  DT_BLOCK: ST_BLOCK,
482
  DT_DISKLESS: ST_DISKLESS,
483
  DT_DRBD8: ST_LVM_VG,
484
  DT_EXT: ST_EXT,
485
  DT_FILE: ST_FILE,
486
  DT_PLAIN: ST_LVM_VG,
487
  DT_RBD: ST_RADOS,
488
  DT_SHARED_FILE: ST_FILE,
489
  }
490

    
491
# the set of network-mirrored disk templates
492
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
493

    
494
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
495
DTS_EXT_MIRROR = compat.UniqueFrozenset([
496
  DT_DISKLESS, # 'trivially' externally mirrored
497
  DT_SHARED_FILE,
498
  DT_BLOCK,
499
  DT_RBD,
500
  DT_EXT,
501
  ])
502

    
503
# the set of non-lvm-based disk templates
504
DTS_NOT_LVM = compat.UniqueFrozenset([
505
  DT_DISKLESS,
506
  DT_FILE,
507
  DT_SHARED_FILE,
508
  DT_BLOCK,
509
  DT_RBD,
510
  DT_EXT,
511
  ])
512

    
513
# the set of disk templates which can be grown
514
DTS_GROWABLE = compat.UniqueFrozenset([
515
  DT_PLAIN,
516
  DT_DRBD8,
517
  DT_FILE,
518
  DT_SHARED_FILE,
519
  DT_RBD,
520
  DT_EXT,
521
  ])
522

    
523
# the set of disk templates that allow adoption
524
DTS_MAY_ADOPT = compat.UniqueFrozenset([
525
  DT_PLAIN,
526
  DT_BLOCK,
527
  ])
528

    
529
# the set of disk templates that *must* use adoption
530
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
531

    
532
# the set of disk templates that allow migrations
533
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
534

    
535
# the set of file based disk templates
536
DTS_FILEBASED = compat.UniqueFrozenset([
537
  DT_FILE,
538
  DT_SHARED_FILE,
539
  ])
540

    
541
# the set of disk templates that can be moved by copying
542
# Note: a requirement is that they're not accessed externally or shared between
543
# nodes; in particular, sharedfile is not suitable.
544
DTS_COPYABLE = compat.UniqueFrozenset([
545
  DT_FILE,
546
  DT_PLAIN,
547
  ])
548

    
549
# the set of disk templates that are supported by exclusive_storage
550
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
551

    
552
# templates for which we don't perform checks on free space
553
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
554
  DT_FILE,
555
  DT_SHARED_FILE,
556
  DT_RBD,
557
  DT_EXT,
558
  ])
559

    
560
# logical disk types
561
LD_LV = "lvm"
562
LD_DRBD8 = "drbd8"
563
LD_FILE = "file"
564
LD_BLOCKDEV = "blockdev"
565
LD_RBD = "rbd"
566
LD_EXT = "ext"
567
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
568
  LD_LV,
569
  LD_DRBD8,
570
  LD_FILE,
571
  LD_BLOCKDEV,
572
  LD_RBD,
573
  LD_EXT,
574
  ])
575

    
576
LDS_BLOCK = compat.UniqueFrozenset([
577
  LD_LV,
578
  LD_DRBD8,
579
  LD_BLOCKDEV,
580
  LD_RBD,
581
  LD_EXT,
582
  ])
583

    
584
# drbd constants
585
DRBD_HMAC_ALG = "md5"
586
DRBD_NET_PROTOCOL = "C"
587
DRBD_STATUS_FILE = "/proc/drbd"
588

    
589
#: Size of DRBD meta block device
590
DRBD_META_SIZE = 128
591

    
592
# drbd barrier types
593
DRBD_B_NONE = "n"
594
DRBD_B_DISK_BARRIERS = "b"
595
DRBD_B_DISK_DRAIN = "d"
596
DRBD_B_DISK_FLUSH = "f"
597

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

    
610
# rbd tool command
611
RBD_CMD = "rbd"
612

    
613
# file backend driver
614
FD_LOOP = "loop"
615
FD_BLKTAP = "blktap"
616

    
617
# the set of drbd-like disk types
618
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
619

    
620
# disk access mode
621
DISK_RDONLY = "ro"
622
DISK_RDWR = "rw"
623
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
624

    
625
# disk replacement mode
626
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
627
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
628
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
629
REPLACE_DISK_AUTO = "replace_auto"
630
REPLACE_MODES = compat.UniqueFrozenset([
631
  REPLACE_DISK_PRI,
632
  REPLACE_DISK_SEC,
633
  REPLACE_DISK_CHG,
634
  REPLACE_DISK_AUTO,
635
  ])
636

    
637
# Instance export mode
638
EXPORT_MODE_LOCAL = "local"
639
EXPORT_MODE_REMOTE = "remote"
640
EXPORT_MODES = compat.UniqueFrozenset([
641
  EXPORT_MODE_LOCAL,
642
  EXPORT_MODE_REMOTE,
643
  ])
644

    
645
# instance creation modes
646
INSTANCE_CREATE = "create"
647
INSTANCE_IMPORT = "import"
648
INSTANCE_REMOTE_IMPORT = "remote-import"
649
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
650
  INSTANCE_CREATE,
651
  INSTANCE_IMPORT,
652
  INSTANCE_REMOTE_IMPORT,
653
  ])
654

    
655
# Remote import/export handshake message and version
656
RIE_VERSION = 0
657
RIE_HANDSHAKE = "Hi, I'm Ganeti"
658

    
659
# Remote import/export certificate validity in seconds
660
RIE_CERT_VALIDITY = 24 * 60 * 60
661

    
662
# Overall timeout for establishing connection
663
RIE_CONNECT_TIMEOUT = 180
664

    
665
# Export only: how long to wait per connection attempt (seconds)
666
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
667

    
668
# Export only: number of attempts to connect
669
RIE_CONNECT_RETRIES = 10
670

    
671
#: Give child process up to 5 seconds to exit after sending a signal
672
CHILD_LINGER_TIMEOUT = 5.0
673

    
674
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
675

    
676
# import/export config options
677
INISECT_EXP = "export"
678
INISECT_INS = "instance"
679
INISECT_HYP = "hypervisor"
680
INISECT_BEP = "backend"
681
INISECT_OSP = "os"
682

    
683
# dynamic device modification
684
DDM_ADD = "add"
685
DDM_MODIFY = "modify"
686
DDM_REMOVE = "remove"
687
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
688
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
689
  DDM_MODIFY,
690
  ]))
691
# TODO: DDM_SWAP, DDM_MOVE?
692

    
693
# common exit codes
694
EXIT_SUCCESS = 0
695
EXIT_FAILURE = 1
696
EXIT_NOTCLUSTER = 5
697
EXIT_NOTMASTER = 11
698
EXIT_NODESETUP_ERROR = 12
699
EXIT_CONFIRMATION = 13 # need user confirmation
700

    
701
#: Exit code for query operations with unknown fields
702
EXIT_UNKNOWN_FIELD = 14
703

    
704
# tags
705
TAG_CLUSTER = "cluster"
706
TAG_NODEGROUP = "nodegroup"
707
TAG_NODE = "node"
708
TAG_INSTANCE = "instance"
709
TAG_NETWORK = "network"
710
VALID_TAG_TYPES = compat.UniqueFrozenset([
711
  TAG_CLUSTER,
712
  TAG_NODEGROUP,
713
  TAG_NODE,
714
  TAG_INSTANCE,
715
  TAG_NETWORK,
716
  ])
717
MAX_TAG_LEN = 128
718
MAX_TAGS_PER_OBJ = 4096
719

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

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

    
748
#: Key for job IDs in opcode result
749
JOB_IDS_KEY = "jobs"
750

    
751
# runparts results
752
(RUNPARTS_SKIP,
753
 RUNPARTS_RUN,
754
 RUNPARTS_ERR) = range(3)
755

    
756
RUNPARTS_STATUS = compat.UniqueFrozenset([
757
  RUNPARTS_SKIP,
758
  RUNPARTS_RUN,
759
  RUNPARTS_ERR,
760
  ])
761

    
762
# RPC constants
763
(RPC_ENCODING_NONE,
764
 RPC_ENCODING_ZLIB_BASE64) = range(2)
765

    
766
# Various time constants for the timeout table
767
RPC_TMO_URGENT = 60 # one minute
768
RPC_TMO_FAST = 5 * 60 # five minutes
769
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
770
RPC_TMO_SLOW = 3600 # one hour
771
RPC_TMO_4HRS = 4 * 3600
772
RPC_TMO_1DAY = 86400
773

    
774
# Timeout for connecting to nodes (seconds)
775
RPC_CONNECT_TIMEOUT = 5
776

    
777
# os related constants
778
OS_SCRIPT_CREATE = "create"
779
OS_SCRIPT_IMPORT = "import"
780
OS_SCRIPT_EXPORT = "export"
781
OS_SCRIPT_RENAME = "rename"
782
OS_SCRIPT_VERIFY = "verify"
783
OS_SCRIPTS = compat.UniqueFrozenset([
784
  OS_SCRIPT_CREATE,
785
  OS_SCRIPT_IMPORT,
786
  OS_SCRIPT_EXPORT,
787
  OS_SCRIPT_RENAME,
788
  OS_SCRIPT_VERIFY,
789
  ])
790

    
791
OS_API_FILE = "ganeti_api_version"
792
OS_VARIANTS_FILE = "variants.list"
793
OS_PARAMETERS_FILE = "parameters.list"
794

    
795
OS_VALIDATE_PARAMETERS = "parameters"
796
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
797

    
798
# External Storage (ES) related constants
799
ES_ACTION_CREATE = "create"
800
ES_ACTION_REMOVE = "remove"
801
ES_ACTION_GROW = "grow"
802
ES_ACTION_ATTACH = "attach"
803
ES_ACTION_DETACH = "detach"
804
ES_ACTION_SETINFO = "setinfo"
805
ES_ACTION_VERIFY = "verify"
806

    
807
ES_SCRIPT_CREATE = ES_ACTION_CREATE
808
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
809
ES_SCRIPT_GROW = ES_ACTION_GROW
810
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
811
ES_SCRIPT_DETACH = ES_ACTION_DETACH
812
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
813
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
814
ES_SCRIPTS = frozenset([
815
  ES_SCRIPT_CREATE,
816
  ES_SCRIPT_REMOVE,
817
  ES_SCRIPT_GROW,
818
  ES_SCRIPT_ATTACH,
819
  ES_SCRIPT_DETACH,
820
  ES_SCRIPT_SETINFO,
821
  ES_SCRIPT_VERIFY
822
  ])
823

    
824
ES_PARAMETERS_FILE = "parameters.list"
825

    
826
# reboot types
827
INSTANCE_REBOOT_SOFT = "soft"
828
INSTANCE_REBOOT_HARD = "hard"
829
INSTANCE_REBOOT_FULL = "full"
830

    
831
REBOOT_TYPES = compat.UniqueFrozenset([
832
  INSTANCE_REBOOT_SOFT,
833
  INSTANCE_REBOOT_HARD,
834
  INSTANCE_REBOOT_FULL,
835
  ])
836

    
837
# instance reboot behaviors
838
INSTANCE_REBOOT_ALLOWED = "reboot"
839
INSTANCE_REBOOT_EXIT = "exit"
840

    
841
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
842
  INSTANCE_REBOOT_ALLOWED,
843
  INSTANCE_REBOOT_EXIT,
844
  ])
845

    
846
VTYPE_STRING = "string"
847
VTYPE_MAYBE_STRING = "maybe-string"
848
VTYPE_BOOL = "bool"
849
VTYPE_SIZE = "size" # size, in MiBs
850
VTYPE_INT = "int"
851
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
852
  VTYPE_STRING,
853
  VTYPE_MAYBE_STRING,
854
  VTYPE_BOOL,
855
  VTYPE_SIZE,
856
  VTYPE_INT,
857
  ])
858

    
859
# Constant representing that the user does not specify any IP version
860
IFACE_NO_IP_VERSION_SPECIFIED = 0
861

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

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

    
953

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

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

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

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

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

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

    
1059
# KVM-specific statuses
1060
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1061

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

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

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

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

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

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

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

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

    
1107
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1108
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1109

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1271
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1272

    
1273
# OOB supported commands
1274
OOB_POWER_ON = "power-on"
1275
OOB_POWER_OFF = "power-off"
1276
OOB_POWER_CYCLE = "power-cycle"
1277
OOB_POWER_STATUS = "power-status"
1278
OOB_HEALTH = "health"
1279

    
1280
OOB_COMMANDS = compat.UniqueFrozenset([
1281
  OOB_POWER_ON,
1282
  OOB_POWER_OFF,
1283
  OOB_POWER_CYCLE,
1284
  OOB_POWER_STATUS,
1285
  OOB_HEALTH,
1286
  ])
1287

    
1288
OOB_POWER_STATUS_POWERED = "powered"
1289

    
1290
OOB_TIMEOUT = 60 # 60 seconds
1291
OOB_POWER_DELAY = 2.0 # 2 seconds
1292

    
1293
OOB_STATUS_OK = "OK"
1294
OOB_STATUS_WARNING = "WARNING"
1295
OOB_STATUS_CRITICAL = "CRITICAL"
1296
OOB_STATUS_UNKNOWN = "UNKNOWN"
1297

    
1298
OOB_STATUSES = compat.UniqueFrozenset([
1299
  OOB_STATUS_OK,
1300
  OOB_STATUS_WARNING,
1301
  OOB_STATUS_CRITICAL,
1302
  OOB_STATUS_UNKNOWN,
1303
  ])
1304

    
1305
# Instance Parameters Profile
1306
PP_DEFAULT = "default"
1307

    
1308
# NIC_* constants are used inside the ganeti config
1309
NIC_MODE = "mode"
1310
NIC_LINK = "link"
1311

    
1312
NIC_MODE_BRIDGED = "bridged"
1313
NIC_MODE_ROUTED = "routed"
1314
NIC_MODE_OVS = "openvswitch"
1315
NIC_IP_POOL = "pool"
1316

    
1317
NIC_VALID_MODES = compat.UniqueFrozenset([
1318
  NIC_MODE_BRIDGED,
1319
  NIC_MODE_ROUTED,
1320
  NIC_MODE_OVS,
1321
  ])
1322

    
1323
RESERVE_ACTION = "reserve"
1324
RELEASE_ACTION = "release"
1325

    
1326
NICS_PARAMETER_TYPES = {
1327
  NIC_MODE: VTYPE_STRING,
1328
  NIC_LINK: VTYPE_STRING,
1329
  }
1330

    
1331
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1332

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

    
1354
# INIC_* constants are used in opcodes, to create/change nics
1355
INIC_MAC = "mac"
1356
INIC_IP = "ip"
1357
INIC_MODE = "mode"
1358
INIC_LINK = "link"
1359
INIC_NETWORK = "network"
1360
INIC_NAME = "name"
1361
INIC_PARAMS_TYPES = {
1362
  INIC_IP: VTYPE_MAYBE_STRING,
1363
  INIC_LINK: VTYPE_STRING,
1364
  INIC_MAC: VTYPE_STRING,
1365
  INIC_MODE: VTYPE_STRING,
1366
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1367
  INIC_NAME: VTYPE_MAYBE_STRING,
1368
  }
1369
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1370

    
1371
# Hypervisor constants
1372
HT_XEN_PVM = "xen-pvm"
1373
HT_FAKE = "fake"
1374
HT_XEN_HVM = "xen-hvm"
1375
HT_KVM = "kvm"
1376
HT_CHROOT = "chroot"
1377
HT_LXC = "lxc"
1378
HYPER_TYPES = compat.UniqueFrozenset([
1379
  HT_XEN_PVM,
1380
  HT_FAKE,
1381
  HT_XEN_HVM,
1382
  HT_KVM,
1383
  HT_CHROOT,
1384
  HT_LXC,
1385
  ])
1386
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1387

    
1388
VNC_BASE_PORT = 5900
1389
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1390

    
1391
# NIC types
1392
HT_NIC_RTL8139 = "rtl8139"
1393
HT_NIC_NE2K_PCI = "ne2k_pci"
1394
HT_NIC_NE2K_ISA = "ne2k_isa"
1395
HT_NIC_I82551 = "i82551"
1396
HT_NIC_I85557B = "i82557b"
1397
HT_NIC_I8259ER = "i82559er"
1398
HT_NIC_PCNET = "pcnet"
1399
HT_NIC_E1000 = "e1000"
1400
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1401

    
1402
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1403
  HT_NIC_RTL8139,
1404
  HT_NIC_NE2K_PCI,
1405
  HT_NIC_E1000,
1406
  HT_NIC_NE2K_ISA,
1407
  HT_NIC_PARAVIRTUAL,
1408
  ])
1409
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1410
  HT_NIC_RTL8139,
1411
  HT_NIC_NE2K_PCI,
1412
  HT_NIC_NE2K_ISA,
1413
  HT_NIC_I82551,
1414
  HT_NIC_I85557B,
1415
  HT_NIC_I8259ER,
1416
  HT_NIC_PCNET,
1417
  HT_NIC_E1000,
1418
  HT_NIC_PARAVIRTUAL,
1419
  ])
1420

    
1421
# Vif types
1422
# default vif type in xen-hvm
1423
HT_HVM_VIF_IOEMU = "ioemu"
1424
HT_HVM_VIF_VIF = "vif"
1425
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1426
  HT_HVM_VIF_IOEMU,
1427
  HT_HVM_VIF_VIF,
1428
  ])
1429

    
1430
# Disk types
1431
HT_DISK_IOEMU = "ioemu"
1432
HT_DISK_IDE = "ide"
1433
HT_DISK_SCSI = "scsi"
1434
HT_DISK_SD = "sd"
1435
HT_DISK_MTD = "mtd"
1436
HT_DISK_PFLASH = "pflash"
1437

    
1438
HT_CACHE_DEFAULT = "default"
1439
HT_CACHE_NONE = "none"
1440
HT_CACHE_WTHROUGH = "writethrough"
1441
HT_CACHE_WBACK = "writeback"
1442
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1443
  HT_CACHE_DEFAULT,
1444
  HT_CACHE_NONE,
1445
  HT_CACHE_WTHROUGH,
1446
  HT_CACHE_WBACK,
1447
  ])
1448

    
1449
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1450
  HT_DISK_PARAVIRTUAL,
1451
  HT_DISK_IOEMU,
1452
  ])
1453
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1454
  HT_DISK_PARAVIRTUAL,
1455
  HT_DISK_IDE,
1456
  HT_DISK_SCSI,
1457
  HT_DISK_SD,
1458
  HT_DISK_MTD,
1459
  HT_DISK_PFLASH,
1460
  ])
1461

    
1462
# Mouse types:
1463
HT_MOUSE_MOUSE = "mouse"
1464
HT_MOUSE_TABLET = "tablet"
1465

    
1466
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1467
  HT_MOUSE_MOUSE,
1468
  HT_MOUSE_TABLET,
1469
  ])
1470

    
1471
# Boot order
1472
HT_BO_FLOPPY = "floppy"
1473
HT_BO_CDROM = "cdrom"
1474
HT_BO_DISK = "disk"
1475
HT_BO_NETWORK = "network"
1476

    
1477
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1478
  HT_BO_FLOPPY,
1479
  HT_BO_CDROM,
1480
  HT_BO_DISK,
1481
  HT_BO_NETWORK,
1482
  ])
1483

    
1484
# SPICE lossless image compression options
1485
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1486
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1487
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1488
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1489
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1490
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1491

    
1492
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1493
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1494
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1495
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1496
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1497
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1498
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1499
  ])
1500

    
1501
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1502
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1503
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1504
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1505

    
1506
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1507
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1508
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1509
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1510
  ])
1511

    
1512
# SPICE video stream detection
1513
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1514
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1515
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1516

    
1517
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1518
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1519
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1520
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1521
  ])
1522

    
1523
# Security models
1524
HT_SM_NONE = "none"
1525
HT_SM_USER = "user"
1526
HT_SM_POOL = "pool"
1527

    
1528
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1529
  HT_SM_NONE,
1530
  HT_SM_USER,
1531
  HT_SM_POOL,
1532
  ])
1533

    
1534
# Kvm flag values
1535
HT_KVM_ENABLED = "enabled"
1536
HT_KVM_DISABLED = "disabled"
1537

    
1538
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1539

    
1540
# Migration type
1541
HT_MIGRATION_LIVE = "live"
1542
HT_MIGRATION_NONLIVE = "non-live"
1543
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1544
  HT_MIGRATION_LIVE,
1545
  HT_MIGRATION_NONLIVE,
1546
  ])
1547

    
1548
# Cluster Verify steps
1549
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1550
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1551

    
1552
# Cluster Verify error classes
1553
CV_TCLUSTER = "cluster"
1554
CV_TGROUP = "group"
1555
CV_TNODE = "node"
1556
CV_TINSTANCE = "instance"
1557

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

    
1645
CV_ALL_ECODES = compat.UniqueFrozenset([
1646
  CV_ECLUSTERCFG,
1647
  CV_ECLUSTERCERT,
1648
  CV_ECLUSTERFILECHECK,
1649
  CV_ECLUSTERDANGLINGNODES,
1650
  CV_ECLUSTERDANGLINGINST,
1651
  CV_EINSTANCEBADNODE,
1652
  CV_EINSTANCEDOWN,
1653
  CV_EINSTANCELAYOUT,
1654
  CV_EINSTANCEMISSINGDISK,
1655
  CV_EINSTANCEFAULTYDISK,
1656
  CV_EINSTANCEWRONGNODE,
1657
  CV_EINSTANCESPLITGROUPS,
1658
  CV_EINSTANCEPOLICY,
1659
  CV_ENODEDRBD,
1660
  CV_ENODEDRBDHELPER,
1661
  CV_ENODEFILECHECK,
1662
  CV_ENODEHOOKS,
1663
  CV_ENODEHV,
1664
  CV_ENODELVM,
1665
  CV_ENODEN1,
1666
  CV_ENODENET,
1667
  CV_ENODEOS,
1668
  CV_ENODEORPHANINSTANCE,
1669
  CV_ENODEORPHANLV,
1670
  CV_ENODERPC,
1671
  CV_ENODESSH,
1672
  CV_ENODEVERSION,
1673
  CV_ENODESETUP,
1674
  CV_ENODETIME,
1675
  CV_ENODEOOBPATH,
1676
  CV_ENODEUSERSCRIPTS,
1677
  CV_ENODEFILESTORAGEPATHS,
1678
  ])
1679

    
1680
CV_ALL_ECODES_STRINGS = \
1681
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1682

    
1683
# Node verify constants
1684
NV_BRIDGES = "bridges"
1685
NV_DRBDHELPER = "drbd-helper"
1686
NV_DRBDVERSION = "drbd-version"
1687
NV_DRBDLIST = "drbd-list"
1688
NV_EXCLUSIVEPVS = "exclusive-pvs"
1689
NV_FILELIST = "filelist"
1690
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1691
NV_HVINFO = "hvinfo"
1692
NV_HVPARAMS = "hvparms"
1693
NV_HYPERVISOR = "hypervisor"
1694
NV_INSTANCELIST = "instancelist"
1695
NV_LVLIST = "lvlist"
1696
NV_MASTERIP = "master-ip"
1697
NV_NODELIST = "nodelist"
1698
NV_NODENETTEST = "node-net-test"
1699
NV_NODESETUP = "nodesetup"
1700
NV_OOB_PATHS = "oob-paths"
1701
NV_OSLIST = "oslist"
1702
NV_PVLIST = "pvlist"
1703
NV_TIME = "time"
1704
NV_USERSCRIPTS = "user-scripts"
1705
NV_VERSION = "version"
1706
NV_VGLIST = "vglist"
1707
NV_VMNODES = "vmnodes"
1708

    
1709
# Instance status
1710
INSTST_RUNNING = "running"
1711
INSTST_ADMINDOWN = "ADMIN_down"
1712
INSTST_ADMINOFFLINE = "ADMIN_offline"
1713
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1714
INSTST_NODEDOWN = "ERROR_nodedown"
1715
INSTST_WRONGNODE = "ERROR_wrongnode"
1716
INSTST_ERRORUP = "ERROR_up"
1717
INSTST_ERRORDOWN = "ERROR_down"
1718
INSTST_ALL = compat.UniqueFrozenset([
1719
  INSTST_RUNNING,
1720
  INSTST_ADMINDOWN,
1721
  INSTST_ADMINOFFLINE,
1722
  INSTST_NODEOFFLINE,
1723
  INSTST_NODEDOWN,
1724
  INSTST_WRONGNODE,
1725
  INSTST_ERRORUP,
1726
  INSTST_ERRORDOWN,
1727
  ])
1728

    
1729
# Admin states
1730
ADMINST_UP = "up"
1731
ADMINST_DOWN = "down"
1732
ADMINST_OFFLINE = "offline"
1733
ADMINST_ALL = compat.UniqueFrozenset([
1734
  ADMINST_UP,
1735
  ADMINST_DOWN,
1736
  ADMINST_OFFLINE,
1737
  ])
1738

    
1739
# Node roles
1740
NR_REGULAR = "R"
1741
NR_MASTER = "M"
1742
NR_MCANDIDATE = "C"
1743
NR_DRAINED = "D"
1744
NR_OFFLINE = "O"
1745
NR_ALL = compat.UniqueFrozenset([
1746
  NR_REGULAR,
1747
  NR_MASTER,
1748
  NR_MCANDIDATE,
1749
  NR_DRAINED,
1750
  NR_OFFLINE,
1751
  ])
1752

    
1753
# SSL certificate check constants (in days)
1754
SSL_CERT_EXPIRATION_WARN = 30
1755
SSL_CERT_EXPIRATION_ERROR = 7
1756

    
1757
# Allocator framework constants
1758
IALLOCATOR_VERSION = 2
1759
IALLOCATOR_DIR_IN = "in"
1760
IALLOCATOR_DIR_OUT = "out"
1761
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1762
  IALLOCATOR_DIR_IN,
1763
  IALLOCATOR_DIR_OUT,
1764
  ])
1765
IALLOCATOR_MODE_ALLOC = "allocate"
1766
IALLOCATOR_MODE_RELOC = "relocate"
1767
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1768
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1769
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1770
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1771
  IALLOCATOR_MODE_ALLOC,
1772
  IALLOCATOR_MODE_RELOC,
1773
  IALLOCATOR_MODE_CHG_GROUP,
1774
  IALLOCATOR_MODE_NODE_EVAC,
1775
  IALLOCATOR_MODE_MULTI_ALLOC,
1776
  ])
1777
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1778
DEFAULT_IALLOCATOR_SHORTCUT = "."
1779

    
1780
IALLOCATOR_NEVAC_PRI = "primary-only"
1781
IALLOCATOR_NEVAC_SEC = "secondary-only"
1782
IALLOCATOR_NEVAC_ALL = "all"
1783
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1784
  IALLOCATOR_NEVAC_PRI,
1785
  IALLOCATOR_NEVAC_SEC,
1786
  IALLOCATOR_NEVAC_ALL,
1787
  ])
1788

    
1789
# Node evacuation
1790
NODE_EVAC_PRI = "primary-only"
1791
NODE_EVAC_SEC = "secondary-only"
1792
NODE_EVAC_ALL = "all"
1793
NODE_EVAC_MODES = compat.UniqueFrozenset([
1794
  NODE_EVAC_PRI,
1795
  NODE_EVAC_SEC,
1796
  NODE_EVAC_ALL,
1797
  ])
1798

    
1799
# Job queue
1800
JOB_QUEUE_VERSION = 1
1801
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1802
JOB_QUEUE_FILES_PERMS = 0640
1803

    
1804
JOB_ID_TEMPLATE = r"\d+"
1805
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1806

    
1807
# unchanged job return
1808
JOB_NOTCHANGED = "nochange"
1809

    
1810
# Job status
1811
JOB_STATUS_QUEUED = "queued"
1812
JOB_STATUS_WAITING = "waiting"
1813
JOB_STATUS_CANCELING = "canceling"
1814
JOB_STATUS_RUNNING = "running"
1815
JOB_STATUS_CANCELED = "canceled"
1816
JOB_STATUS_SUCCESS = "success"
1817
JOB_STATUS_ERROR = "error"
1818
JOBS_PENDING = compat.UniqueFrozenset([
1819
  JOB_STATUS_QUEUED,
1820
  JOB_STATUS_WAITING,
1821
  JOB_STATUS_CANCELING,
1822
  ])
1823
JOBS_FINALIZED = compat.UniqueFrozenset([
1824
  JOB_STATUS_CANCELED,
1825
  JOB_STATUS_SUCCESS,
1826
  JOB_STATUS_ERROR,
1827
  ])
1828
JOB_STATUS_ALL = compat.UniqueFrozenset([
1829
  JOB_STATUS_RUNNING,
1830
  ]) | JOBS_PENDING | JOBS_FINALIZED
1831

    
1832
# OpCode status
1833
# not yet finalized
1834
OP_STATUS_QUEUED = "queued"
1835
OP_STATUS_WAITING = "waiting"
1836
OP_STATUS_CANCELING = "canceling"
1837
OP_STATUS_RUNNING = "running"
1838
# finalized
1839
OP_STATUS_CANCELED = "canceled"
1840
OP_STATUS_SUCCESS = "success"
1841
OP_STATUS_ERROR = "error"
1842
OPS_FINALIZED = compat.UniqueFrozenset([
1843
  OP_STATUS_CANCELED,
1844
  OP_STATUS_SUCCESS,
1845
  OP_STATUS_ERROR,
1846
  ])
1847

    
1848
# OpCode priority
1849
OP_PRIO_LOWEST = +19
1850
OP_PRIO_HIGHEST = -20
1851

    
1852
OP_PRIO_LOW = +10
1853
OP_PRIO_NORMAL = 0
1854
OP_PRIO_HIGH = -10
1855

    
1856
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1857
  OP_PRIO_LOW,
1858
  OP_PRIO_NORMAL,
1859
  OP_PRIO_HIGH,
1860
  ])
1861

    
1862
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1863

    
1864
# Lock recalculate mode
1865
LOCKS_REPLACE = "replace"
1866
LOCKS_APPEND = "append"
1867

    
1868
# Lock timeout (sum) before we should go into blocking acquire (still
1869
# can be reset by priority change); computed as max time (10 hours)
1870
# before we should actually go into blocking acquire given that we
1871
# start from default priority level; in seconds
1872
# TODO
1873
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1874
LOCK_ATTEMPTS_MAXWAIT = 15.0
1875
LOCK_ATTEMPTS_MINWAIT = 1.0
1876

    
1877
# Execution log types
1878
ELOG_MESSAGE = "message"
1879
ELOG_REMOTE_IMPORT = "remote-import"
1880
ELOG_JQUEUE_TEST = "jqueue-test"
1881

    
1882
# /etc/hosts modification
1883
ETC_HOSTS_ADD = "add"
1884
ETC_HOSTS_REMOVE = "remove"
1885

    
1886
# Job queue test
1887
JQT_MSGPREFIX = "TESTMSG="
1888
JQT_EXPANDNAMES = "expandnames"
1889
JQT_EXEC = "exec"
1890
JQT_LOGMSG = "logmsg"
1891
JQT_STARTMSG = "startmsg"
1892
JQT_ALL = compat.UniqueFrozenset([
1893
  JQT_EXPANDNAMES,
1894
  JQT_EXEC,
1895
  JQT_LOGMSG,
1896
  JQT_STARTMSG,
1897
  ])
1898

    
1899
# Query resources
1900
QR_CLUSTER = "cluster"
1901
QR_INSTANCE = "instance"
1902
QR_NODE = "node"
1903
QR_LOCK = "lock"
1904
QR_GROUP = "group"
1905
QR_OS = "os"
1906
QR_JOB = "job"
1907
QR_EXPORT = "export"
1908
QR_NETWORK = "network"
1909
QR_EXTSTORAGE = "extstorage"
1910

    
1911
#: List of resources which can be queried using L{opcodes.OpQuery}
1912
QR_VIA_OP = compat.UniqueFrozenset([
1913
  QR_CLUSTER,
1914
  QR_INSTANCE,
1915
  QR_NODE,
1916
  QR_GROUP,
1917
  QR_OS,
1918
  QR_EXPORT,
1919
  QR_NETWORK,
1920
  QR_EXTSTORAGE,
1921
  ])
1922

    
1923
#: List of resources which can be queried using Local UniX Interface
1924
QR_VIA_LUXI = QR_VIA_OP.union([
1925
  QR_LOCK,
1926
  QR_JOB,
1927
  ])
1928

    
1929
#: List of resources which can be queried using RAPI
1930
QR_VIA_RAPI = QR_VIA_LUXI
1931

    
1932
# Query field types
1933
QFT_UNKNOWN = "unknown"
1934
QFT_TEXT = "text"
1935
QFT_BOOL = "bool"
1936
QFT_NUMBER = "number"
1937
QFT_UNIT = "unit"
1938
QFT_TIMESTAMP = "timestamp"
1939
QFT_OTHER = "other"
1940

    
1941
#: All query field types
1942
QFT_ALL = compat.UniqueFrozenset([
1943
  QFT_UNKNOWN,
1944
  QFT_TEXT,
1945
  QFT_BOOL,
1946
  QFT_NUMBER,
1947
  QFT_UNIT,
1948
  QFT_TIMESTAMP,
1949
  QFT_OTHER,
1950
  ])
1951

    
1952
# Query result field status (don't change or reuse values as they're used by
1953
# clients)
1954
#: Normal field status
1955
RS_NORMAL = 0
1956
#: Unknown field
1957
RS_UNKNOWN = 1
1958
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1959
RS_NODATA = 2
1960
#: Value unavailable/unsupported for item; if this field is supported
1961
#: but we cannot get the data for the moment, RS_NODATA or
1962
#: RS_OFFLINE should be used
1963
RS_UNAVAIL = 3
1964
#: Resource marked offline
1965
RS_OFFLINE = 4
1966

    
1967
RS_ALL = compat.UniqueFrozenset([
1968
  RS_NORMAL,
1969
  RS_UNKNOWN,
1970
  RS_NODATA,
1971
  RS_UNAVAIL,
1972
  RS_OFFLINE,
1973
  ])
1974

    
1975
#: Dictionary with special field cases and their verbose/terse formatting
1976
RSS_DESCRIPTION = {
1977
  RS_UNKNOWN: ("(unknown)", "??"),
1978
  RS_NODATA: ("(nodata)", "?"),
1979
  RS_OFFLINE: ("(offline)", "*"),
1980
  RS_UNAVAIL: ("(unavail)", "-"),
1981
  }
1982

    
1983
# max dynamic devices
1984
MAX_NICS = 8
1985
MAX_DISKS = 16
1986

    
1987
# SSCONF file prefix
1988
SSCONF_FILEPREFIX = "ssconf_"
1989
# SSCONF keys
1990
SS_CLUSTER_NAME = "cluster_name"
1991
SS_CLUSTER_TAGS = "cluster_tags"
1992
SS_FILE_STORAGE_DIR = "file_storage_dir"
1993
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1994
SS_MASTER_CANDIDATES = "master_candidates"
1995
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1996
SS_MASTER_IP = "master_ip"
1997
SS_MASTER_NETDEV = "master_netdev"
1998
SS_MASTER_NETMASK = "master_netmask"
1999
SS_MASTER_NODE = "master_node"
2000
SS_NODE_LIST = "node_list"
2001
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2002
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2003
SS_OFFLINE_NODES = "offline_nodes"
2004
SS_ONLINE_NODES = "online_nodes"
2005
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2006
SS_INSTANCE_LIST = "instance_list"
2007
SS_RELEASE_VERSION = "release_version"
2008
SS_HYPERVISOR_LIST = "hypervisor_list"
2009
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2010
SS_UID_POOL = "uid_pool"
2011
SS_NODEGROUPS = "nodegroups"
2012
SS_NETWORKS = "networks"
2013

    
2014
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2015
SS_HVPARAMS_PREF = "hvparams_"
2016

    
2017
# Hvparams keys:
2018
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2019
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2020
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2021
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2022
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2023
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2024

    
2025
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2026
  SS_HVPARAMS_XEN_PVM,
2027
  SS_HVPARAMS_XEN_FAKE,
2028
  SS_HVPARAMS_XEN_HVM,
2029
  SS_HVPARAMS_XEN_KVM,
2030
  SS_HVPARAMS_XEN_CHROOT,
2031
  SS_HVPARAMS_XEN_LXC,
2032
  ])
2033

    
2034
SS_FILE_PERMS = 0444
2035

    
2036
# cluster wide default parameters
2037
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2038

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

    
2149
HVC_GLOBALS = compat.UniqueFrozenset([
2150
  HV_MIGRATION_PORT,
2151
  HV_MIGRATION_BANDWIDTH,
2152
  HV_MIGRATION_MODE,
2153
  HV_XEN_CMD,
2154
  ])
2155

    
2156
BEC_DEFAULTS = {
2157
  BE_MINMEM: 128,
2158
  BE_MAXMEM: 128,
2159
  BE_VCPUS: 1,
2160
  BE_AUTO_BALANCE: True,
2161
  BE_ALWAYS_FAILOVER: False,
2162
  BE_SPINDLE_USE: 1,
2163
  }
2164

    
2165
NDC_DEFAULTS = {
2166
  ND_OOB_PROGRAM: "",
2167
  ND_SPINDLE_COUNT: 1,
2168
  ND_EXCLUSIVE_STORAGE: False,
2169
  }
2170

    
2171
NDC_GLOBALS = compat.UniqueFrozenset([
2172
  ND_EXCLUSIVE_STORAGE,
2173
  ])
2174

    
2175
DISK_LD_DEFAULTS = {
2176
  LD_DRBD8: {
2177
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2178
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2179
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2180
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2181
    LDP_DISK_CUSTOM: "",
2182
    LDP_NET_CUSTOM: "",
2183
    LDP_DYNAMIC_RESYNC: False,
2184

    
2185
    # The default values for the DRBD dynamic resync speed algorithm
2186
    # are taken from the drbsetup 8.3.11 man page, except for
2187
    # c-plan-ahead (that we don't need to set to 0, because we have a
2188
    # separate option to enable it) and for c-max-rate, that we cap to
2189
    # the default value for the static resync rate.
2190
    LDP_PLAN_AHEAD: 20, # ds
2191
    LDP_FILL_TARGET: 0, # sectors
2192
    LDP_DELAY_TARGET: 1, # ds
2193
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2194
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2195
    },
2196
  LD_LV: {
2197
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2198
    },
2199
  LD_FILE: {},
2200
  LD_BLOCKDEV: {},
2201
  LD_RBD: {
2202
    LDP_POOL: "rbd"
2203
    },
2204
  LD_EXT: {},
2205
  }
2206

    
2207
# readability shortcuts
2208
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2209
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2210

    
2211
DISK_DT_DEFAULTS = {
2212
  DT_PLAIN: {
2213
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2214
    },
2215
  DT_DRBD8: {
2216
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2217
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2218
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2219
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2220
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2221
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2222
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2223
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2224
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2225
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2226
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2227
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2228
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2229
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2230
    },
2231
  DT_DISKLESS: {},
2232
  DT_FILE: {},
2233
  DT_SHARED_FILE: {},
2234
  DT_BLOCK: {},
2235
  DT_RBD: {
2236
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2237
    },
2238
  DT_EXT: {},
2239
  }
2240

    
2241
# we don't want to export the shortcuts
2242
del _LV_DEFAULTS, _DRBD_DEFAULTS
2243

    
2244
NICC_DEFAULTS = {
2245
  NIC_MODE: NIC_MODE_BRIDGED,
2246
  NIC_LINK: DEFAULT_BRIDGE,
2247
  }
2248

    
2249
# All of the following values are quite arbitrarily - there are no
2250
# "good" defaults, these must be customised per-site
2251
ISPECS_MINMAX_DEFAULTS = {
2252
  ISPECS_MIN: {
2253
    ISPEC_MEM_SIZE: 128,
2254
    ISPEC_CPU_COUNT: 1,
2255
    ISPEC_DISK_COUNT: 1,
2256
    ISPEC_DISK_SIZE: 1024,
2257
    ISPEC_NIC_COUNT: 1,
2258
    ISPEC_SPINDLE_USE: 1,
2259
    },
2260
  ISPECS_MAX: {
2261
    ISPEC_MEM_SIZE: 32768,
2262
    ISPEC_CPU_COUNT: 8,
2263
    ISPEC_DISK_COUNT: MAX_DISKS,
2264
    ISPEC_DISK_SIZE: 1024 * 1024,
2265
    ISPEC_NIC_COUNT: MAX_NICS,
2266
    ISPEC_SPINDLE_USE: 12,
2267
    },
2268
  }
2269
IPOLICY_DEFAULTS = {
2270
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2271
  ISPECS_STD: {
2272
    ISPEC_MEM_SIZE: 128,
2273
    ISPEC_CPU_COUNT: 1,
2274
    ISPEC_DISK_COUNT: 1,
2275
    ISPEC_DISK_SIZE: 1024,
2276
    ISPEC_NIC_COUNT: 1,
2277
    ISPEC_SPINDLE_USE: 1,
2278
    },
2279
  IPOLICY_DTS: list(DISK_TEMPLATES),
2280
  IPOLICY_VCPU_RATIO: 4.0,
2281
  IPOLICY_SPINDLE_RATIO: 32.0,
2282
  }
2283

    
2284
MASTER_POOL_SIZE_DEFAULT = 10
2285

    
2286
# Exclusive storage:
2287
# Error margin used to compare physical disks
2288
PART_MARGIN = .01
2289
# Space reserved when creating instance disks
2290
PART_RESERVED = .02
2291

    
2292
CONFD_PROTOCOL_VERSION = 1
2293

    
2294
CONFD_REQ_PING = 0
2295
CONFD_REQ_NODE_ROLE_BYNAME = 1
2296
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2297
CONFD_REQ_CLUSTER_MASTER = 3
2298
CONFD_REQ_NODE_PIP_LIST = 4
2299
CONFD_REQ_MC_PIP_LIST = 5
2300
CONFD_REQ_INSTANCES_IPS_LIST = 6
2301
CONFD_REQ_NODE_DRBD = 7
2302
CONFD_REQ_NODE_INSTANCES = 8
2303

    
2304
# Confd request query fields. These are used to narrow down queries.
2305
# These must be strings rather than integers, because json-encoding
2306
# converts them to strings anyway, as they're used as dict-keys.
2307
CONFD_REQQ_LINK = "0"
2308
CONFD_REQQ_IP = "1"
2309
CONFD_REQQ_IPLIST = "2"
2310
CONFD_REQQ_FIELDS = "3"
2311

    
2312
CONFD_REQFIELD_NAME = "0"
2313
CONFD_REQFIELD_IP = "1"
2314
CONFD_REQFIELD_MNODE_PIP = "2"
2315

    
2316
CONFD_REQS = compat.UniqueFrozenset([
2317
  CONFD_REQ_PING,
2318
  CONFD_REQ_NODE_ROLE_BYNAME,
2319
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2320
  CONFD_REQ_CLUSTER_MASTER,
2321
  CONFD_REQ_NODE_PIP_LIST,
2322
  CONFD_REQ_MC_PIP_LIST,
2323
  CONFD_REQ_INSTANCES_IPS_LIST,
2324
  CONFD_REQ_NODE_DRBD,
2325
  ])
2326

    
2327
CONFD_REPL_STATUS_OK = 0
2328
CONFD_REPL_STATUS_ERROR = 1
2329
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2330

    
2331
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2332
  CONFD_REPL_STATUS_OK,
2333
  CONFD_REPL_STATUS_ERROR,
2334
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2335
  ])
2336

    
2337
(CONFD_NODE_ROLE_MASTER,
2338
 CONFD_NODE_ROLE_CANDIDATE,
2339
 CONFD_NODE_ROLE_OFFLINE,
2340
 CONFD_NODE_ROLE_DRAINED,
2341
 CONFD_NODE_ROLE_REGULAR,
2342
 ) = range(5)
2343

    
2344
# A few common errors for confd
2345
CONFD_ERROR_UNKNOWN_ENTRY = 1
2346
CONFD_ERROR_INTERNAL = 2
2347
CONFD_ERROR_ARGUMENT = 3
2348

    
2349
# Each request is "salted" by the current timestamp.
2350
# This constants decides how many seconds of skew to accept.
2351
# TODO: make this a default and allow the value to be more configurable
2352
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2353

    
2354
# When we haven't reloaded the config for more than this amount of
2355
# seconds, we force a test to see if inotify is betraying us. Using a
2356
# prime number to ensure we get less chance of 'same wakeup' with
2357
# other processes.
2358
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2359

    
2360
# If we receive more than one update in this amount of microseconds,
2361
# we move to polling every RATELIMIT seconds, rather than relying on
2362
# inotify, to be able to serve more requests.
2363
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2364

    
2365
# Magic number prepended to all confd queries.
2366
# This allows us to distinguish different types of confd protocols and handle
2367
# them. For example by changing this we can move the whole payload to be
2368
# compressed, or move away from json.
2369
CONFD_MAGIC_FOURCC = "plj0"
2370

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

    
2376
# Timeout in seconds to expire pending query request in the confd client
2377
# library. We don't actually expect any answer more than 10 seconds after we
2378
# sent a request.
2379
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2380

    
2381
# Maximum UDP datagram size.
2382
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2383
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2384
#   (assuming we can't use jumbo frames)
2385
# We just set this to 60K, which should be enough
2386
MAX_UDP_DATA_SIZE = 61440
2387

    
2388
# User-id pool minimum/maximum acceptable user-ids.
2389
UIDPOOL_UID_MIN = 0
2390
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2391

    
2392
# Name or path of the pgrep command
2393
PGREP = "pgrep"
2394

    
2395
# Name of the node group that gets created at cluster init or upgrade
2396
INITIAL_NODE_GROUP_NAME = "default"
2397

    
2398
# Possible values for NodeGroup.alloc_policy
2399
ALLOC_POLICY_PREFERRED = "preferred"
2400
ALLOC_POLICY_LAST_RESORT = "last_resort"
2401
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2402
VALID_ALLOC_POLICIES = [
2403
  ALLOC_POLICY_PREFERRED,
2404
  ALLOC_POLICY_LAST_RESORT,
2405
  ALLOC_POLICY_UNALLOCABLE,
2406
  ]
2407

    
2408
# Temporary external/shared storage parameters
2409
BLOCKDEV_DRIVER_MANUAL = "manual"
2410

    
2411
# qemu-img path, required for ovfconverter
2412
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2413

    
2414
# Whether htools was enabled at compilation time
2415
HTOOLS = _autoconf.HTOOLS
2416
# The hail iallocator
2417
IALLOC_HAIL = "hail"
2418

    
2419
# Fake opcodes for functions that have hooks attached to them via
2420
# backend.RunLocalHooks
2421
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2422
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2423

    
2424
# SSH key types
2425
SSHK_RSA = "rsa"
2426
SSHK_DSA = "dsa"
2427
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2428

    
2429
# SSH authorized key types
2430
SSHAK_RSA = "ssh-rsa"
2431
SSHAK_DSS = "ssh-dss"
2432
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2433

    
2434
# SSH setup
2435
SSHS_CLUSTER_NAME = "cluster_name"
2436
SSHS_SSH_HOST_KEY = "ssh_host_key"
2437
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2438
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2439

    
2440
#: Key files for SSH daemon
2441
SSH_DAEMON_KEYFILES = {
2442
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2443
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2444
  }
2445

    
2446
# Node daemon setup
2447
NDS_CLUSTER_NAME = "cluster_name"
2448
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2449
NDS_SSCONF = "ssconf"
2450
NDS_START_NODE_DAEMON = "start_node_daemon"
2451

    
2452
# Path generating random UUID
2453
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2454

    
2455
# Regex string for verifying a UUID
2456
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2457

    
2458
# Auto-repair tag prefixes
2459
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2460
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2461
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2462
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2463
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2464

    
2465
# Auto-repair levels
2466
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2467
AUTO_REPAIR_MIGRATE = "migrate"
2468
AUTO_REPAIR_FAILOVER = "failover"
2469
AUTO_REPAIR_REINSTALL = "reinstall"
2470
AUTO_REPAIR_ALL_TYPES = [
2471
  AUTO_REPAIR_FIX_STORAGE,
2472
  AUTO_REPAIR_MIGRATE,
2473
  AUTO_REPAIR_FAILOVER,
2474
  AUTO_REPAIR_REINSTALL,
2475
]
2476

    
2477
# Auto-repair results
2478
AUTO_REPAIR_SUCCESS = "success"
2479
AUTO_REPAIR_FAILURE = "failure"
2480
AUTO_REPAIR_ENOPERM = "enoperm"
2481
AUTO_REPAIR_ALL_RESULTS = frozenset([
2482
    AUTO_REPAIR_SUCCESS,
2483
    AUTO_REPAIR_FAILURE,
2484
    AUTO_REPAIR_ENOPERM,
2485
])
2486

    
2487
# The version identifier for builtin data collectors
2488
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2489

    
2490
# The reason trail opcode parameter name
2491
OPCODE_REASON = "reason"
2492

    
2493
# The source reasons for the execution of an OpCode
2494
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2495
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2496
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2497
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2498
OPCODE_REASON_SRC_USER = "gnt:user"
2499

    
2500
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2501
  OPCODE_REASON_SRC_CLIENT,
2502
  OPCODE_REASON_SRC_NODED,
2503
  OPCODE_REASON_SRC_OPCODE,
2504
  OPCODE_REASON_SRC_RLIB2,
2505
  OPCODE_REASON_SRC_USER,
2506
  ])
2507

    
2508
DISKSTATS_FILE = "/proc/diskstats"
2509

    
2510
# Do not re-export imported modules
2511
del re, _vcsversion, _autoconf, socket, pathutils, compat