Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 7af7da68

History | View | Annotate | Download (63.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
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
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
254
XEN_CMD = _autoconf.XEN_CMD
255

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

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

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

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

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

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

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

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

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

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

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

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

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

    
321
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
322

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

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

    
335
IE_CUSTOM_SIZE = "fd"
336

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

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

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

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

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

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

    
372
HKR_SKIP = 0
373
HKR_FAIL = 1
374
HKR_SUCCESS = 2
375

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

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

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

    
406
# Storage operations
407
SO_FIX_CONSISTENCY = "fix-consistency"
408

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

    
419
MODIFIABLE_STORAGE_FIELDS = {
420
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
421
  }
422

    
423
VALID_STORAGE_OPERATIONS = {
424
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
425
  }
426

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

    
433
# disk template types
434
DT_BLOCK = "blockdev"
435
DT_DISKLESS = "diskless"
436
DT_DRBD8 = "drbd"
437
DT_EXT = "ext"
438
DT_FILE = "file"
439
DT_PLAIN = "plain"
440
DT_RBD = "rbd"
441
DT_SHARED_FILE = "sharedfile"
442

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

    
458
DISK_TEMPLATES = compat.UniqueFrozenset([
459
  DT_DISKLESS,
460
  DT_PLAIN,
461
  DT_DRBD8,
462
  DT_FILE,
463
  DT_SHARED_FILE,
464
  DT_BLOCK,
465
  DT_RBD,
466
  DT_EXT
467
  ])
468

    
469
# disk templates that are enabled by default
470
DEFAULT_ENABLED_DISK_TEMPLATES = compat.UniqueFrozenset([
471
  DT_DRBD8,
472
  DT_PLAIN,
473
  ])
474

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

    
487
# the set of network-mirrored disk templates
488
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
489

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

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

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

    
519
# the set of disk templates that allow adoption
520
DTS_MAY_ADOPT = compat.UniqueFrozenset([
521
  DT_PLAIN,
522
  DT_BLOCK,
523
  ])
524

    
525
# the set of disk templates that *must* use adoption
526
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
527

    
528
# the set of disk templates that allow migrations
529
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
530

    
531
# the set of file based disk templates
532
DTS_FILEBASED = compat.UniqueFrozenset([
533
  DT_FILE,
534
  DT_SHARED_FILE,
535
  ])
536

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

    
545
# the set of disk templates that are supported by exclusive_storage
546
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
547

    
548
# templates for which we don't perform checks on free space
549
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
550
  DT_FILE,
551
  DT_SHARED_FILE,
552
  DT_RBD,
553
  DT_EXT,
554
  ])
555

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

    
572
LDS_BLOCK = compat.UniqueFrozenset([
573
  LD_LV,
574
  LD_DRBD8,
575
  LD_BLOCKDEV,
576
  LD_RBD,
577
  LD_EXT,
578
  ])
579

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

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

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

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

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

    
609
# file backend driver
610
FD_LOOP = "loop"
611
FD_BLKTAP = "blktap"
612

    
613
# the set of drbd-like disk types
614
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
615

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
820
ES_PARAMETERS_FILE = "parameters.list"
821

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

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

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

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

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

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

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

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

    
948

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

    
1019
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1020

    
1021
HVS_PARAMETER_TITLES = {
1022
  HV_ACPI: "ACPI",
1023
  HV_BOOT_ORDER: "Boot_order",
1024
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1025
  HV_DISK_TYPE: "Disk_type",
1026
  HV_INITRD_PATH: "Initrd_path",
1027
  HV_KERNEL_PATH: "Kernel_path",
1028
  HV_NIC_TYPE: "NIC_type",
1029
  HV_PAE: "PAE",
1030
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1031
  HV_PASSTHROUGH: "pci_pass",
1032
  HV_CPU_TYPE: "cpu_type",
1033
  }
1034

    
1035
# Migration statuses
1036
HV_MIGRATION_COMPLETED = "completed"
1037
HV_MIGRATION_ACTIVE = "active"
1038
HV_MIGRATION_FAILED = "failed"
1039
HV_MIGRATION_CANCELLED = "cancelled"
1040

    
1041
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1042
  HV_MIGRATION_COMPLETED,
1043
  HV_MIGRATION_ACTIVE,
1044
  HV_MIGRATION_FAILED,
1045
  HV_MIGRATION_CANCELLED,
1046
  ])
1047

    
1048
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1049
  HV_MIGRATION_FAILED,
1050
  HV_MIGRATION_CANCELLED,
1051
  ])
1052

    
1053
# KVM-specific statuses
1054
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1055

    
1056
# Node info keys
1057
HV_NODEINFO_KEY_VERSION = "hv_version"
1058

    
1059
# Hypervisor state
1060
HVST_MEMORY_TOTAL = "mem_total"
1061
HVST_MEMORY_NODE = "mem_node"
1062
HVST_MEMORY_HV = "mem_hv"
1063
HVST_CPU_TOTAL = "cpu_total"
1064
HVST_CPU_NODE = "cpu_node"
1065

    
1066
HVST_DEFAULTS = {
1067
  HVST_MEMORY_TOTAL: 0,
1068
  HVST_MEMORY_NODE: 0,
1069
  HVST_MEMORY_HV: 0,
1070
  HVST_CPU_TOTAL: 1,
1071
  HVST_CPU_NODE: 1,
1072
  }
1073

    
1074
HVSTS_PARAMETER_TYPES = {
1075
  HVST_MEMORY_TOTAL: VTYPE_INT,
1076
  HVST_MEMORY_NODE: VTYPE_INT,
1077
  HVST_MEMORY_HV: VTYPE_INT,
1078
  HVST_CPU_TOTAL: VTYPE_INT,
1079
  HVST_CPU_NODE: VTYPE_INT,
1080
  }
1081

    
1082
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1083

    
1084
# Disk state
1085
DS_DISK_TOTAL = "disk_total"
1086
DS_DISK_RESERVED = "disk_reserved"
1087
DS_DISK_OVERHEAD = "disk_overhead"
1088

    
1089
DS_DEFAULTS = {
1090
  DS_DISK_TOTAL: 0,
1091
  DS_DISK_RESERVED: 0,
1092
  DS_DISK_OVERHEAD: 0,
1093
  }
1094

    
1095
DSS_PARAMETER_TYPES = {
1096
  DS_DISK_TOTAL: VTYPE_INT,
1097
  DS_DISK_RESERVED: VTYPE_INT,
1098
  DS_DISK_OVERHEAD: VTYPE_INT,
1099
  }
1100

    
1101
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1102
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1103

    
1104
# Backend parameter names
1105
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1106
BE_MAXMEM = "maxmem"
1107
BE_MINMEM = "minmem"
1108
BE_VCPUS = "vcpus"
1109
BE_AUTO_BALANCE = "auto_balance"
1110
BE_ALWAYS_FAILOVER = "always_failover"
1111
BE_SPINDLE_USE = "spindle_use"
1112

    
1113
BES_PARAMETER_TYPES = {
1114
  BE_MAXMEM: VTYPE_SIZE,
1115
  BE_MINMEM: VTYPE_SIZE,
1116
  BE_VCPUS: VTYPE_INT,
1117
  BE_AUTO_BALANCE: VTYPE_BOOL,
1118
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1119
  BE_SPINDLE_USE: VTYPE_INT,
1120
  }
1121

    
1122
BES_PARAMETER_TITLES = {
1123
  BE_AUTO_BALANCE: "Auto_balance",
1124
  BE_MAXMEM: "ConfigMaxMem",
1125
  BE_MINMEM: "ConfigMinMem",
1126
  BE_VCPUS: "ConfigVCPUs",
1127
  }
1128

    
1129
BES_PARAMETER_COMPAT = {
1130
  BE_MEMORY: VTYPE_SIZE,
1131
  }
1132
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1133

    
1134
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1135

    
1136
# instance specs
1137
ISPEC_MEM_SIZE = "memory-size"
1138
ISPEC_CPU_COUNT = "cpu-count"
1139
ISPEC_DISK_COUNT = "disk-count"
1140
ISPEC_DISK_SIZE = "disk-size"
1141
ISPEC_NIC_COUNT = "nic-count"
1142
ISPEC_SPINDLE_USE = "spindle-use"
1143

    
1144
ISPECS_PARAMETER_TYPES = {
1145
  ISPEC_MEM_SIZE: VTYPE_INT,
1146
  ISPEC_CPU_COUNT: VTYPE_INT,
1147
  ISPEC_DISK_COUNT: VTYPE_INT,
1148
  ISPEC_DISK_SIZE: VTYPE_INT,
1149
  ISPEC_NIC_COUNT: VTYPE_INT,
1150
  ISPEC_SPINDLE_USE: VTYPE_INT,
1151
  }
1152

    
1153
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1154

    
1155
ISPECS_MINMAX = "minmax"
1156
ISPECS_MIN = "min"
1157
ISPECS_MAX = "max"
1158
ISPECS_STD = "std"
1159
IPOLICY_DTS = "disk-templates"
1160
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1161
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1162

    
1163
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1164
  ISPECS_MIN,
1165
  ISPECS_MAX,
1166
  ])
1167

    
1168
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1169
  IPOLICY_VCPU_RATIO,
1170
  IPOLICY_SPINDLE_RATIO,
1171
  ])
1172

    
1173
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1174
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1175

    
1176
# Node parameter names
1177
ND_OOB_PROGRAM = "oob_program"
1178
ND_SPINDLE_COUNT = "spindle_count"
1179
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1180

    
1181
NDS_PARAMETER_TYPES = {
1182
  ND_OOB_PROGRAM: VTYPE_STRING,
1183
  ND_SPINDLE_COUNT: VTYPE_INT,
1184
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1185
  }
1186

    
1187
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1188

    
1189
NDS_PARAMETER_TITLES = {
1190
  ND_OOB_PROGRAM: "OutOfBandProgram",
1191
  ND_SPINDLE_COUNT: "SpindleCount",
1192
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1193
  }
1194

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

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

    
1265
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1266

    
1267
# OOB supported commands
1268
OOB_POWER_ON = "power-on"
1269
OOB_POWER_OFF = "power-off"
1270
OOB_POWER_CYCLE = "power-cycle"
1271
OOB_POWER_STATUS = "power-status"
1272
OOB_HEALTH = "health"
1273

    
1274
OOB_COMMANDS = compat.UniqueFrozenset([
1275
  OOB_POWER_ON,
1276
  OOB_POWER_OFF,
1277
  OOB_POWER_CYCLE,
1278
  OOB_POWER_STATUS,
1279
  OOB_HEALTH,
1280
  ])
1281

    
1282
OOB_POWER_STATUS_POWERED = "powered"
1283

    
1284
OOB_TIMEOUT = 60 # 60 seconds
1285
OOB_POWER_DELAY = 2.0 # 2 seconds
1286

    
1287
OOB_STATUS_OK = "OK"
1288
OOB_STATUS_WARNING = "WARNING"
1289
OOB_STATUS_CRITICAL = "CRITICAL"
1290
OOB_STATUS_UNKNOWN = "UNKNOWN"
1291

    
1292
OOB_STATUSES = compat.UniqueFrozenset([
1293
  OOB_STATUS_OK,
1294
  OOB_STATUS_WARNING,
1295
  OOB_STATUS_CRITICAL,
1296
  OOB_STATUS_UNKNOWN,
1297
  ])
1298

    
1299
# Instance Parameters Profile
1300
PP_DEFAULT = "default"
1301

    
1302
# NIC_* constants are used inside the ganeti config
1303
NIC_MODE = "mode"
1304
NIC_LINK = "link"
1305

    
1306
NIC_MODE_BRIDGED = "bridged"
1307
NIC_MODE_ROUTED = "routed"
1308
NIC_MODE_OVS = "openvswitch"
1309
NIC_IP_POOL = "pool"
1310

    
1311
NIC_VALID_MODES = compat.UniqueFrozenset([
1312
  NIC_MODE_BRIDGED,
1313
  NIC_MODE_ROUTED,
1314
  NIC_MODE_OVS,
1315
  ])
1316

    
1317
RESERVE_ACTION = "reserve"
1318
RELEASE_ACTION = "release"
1319

    
1320
NICS_PARAMETER_TYPES = {
1321
  NIC_MODE: VTYPE_STRING,
1322
  NIC_LINK: VTYPE_STRING,
1323
  }
1324

    
1325
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1326

    
1327
# IDISK_* constants are used in opcodes, to create/change disks
1328
IDISK_SIZE = "size"
1329
IDISK_MODE = "mode"
1330
IDISK_ADOPT = "adopt"
1331
IDISK_VG = "vg"
1332
IDISK_METAVG = "metavg"
1333
IDISK_PROVIDER = "provider"
1334
IDISK_NAME = "name"
1335
IDISK_PARAMS_TYPES = {
1336
  IDISK_SIZE: VTYPE_SIZE,
1337
  IDISK_MODE: VTYPE_STRING,
1338
  IDISK_ADOPT: VTYPE_STRING,
1339
  IDISK_VG: VTYPE_STRING,
1340
  IDISK_METAVG: VTYPE_STRING,
1341
  IDISK_PROVIDER: VTYPE_STRING,
1342
  IDISK_NAME: VTYPE_MAYBE_STRING,
1343
  }
1344
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1345

    
1346
# INIC_* constants are used in opcodes, to create/change nics
1347
INIC_MAC = "mac"
1348
INIC_IP = "ip"
1349
INIC_MODE = "mode"
1350
INIC_LINK = "link"
1351
INIC_NETWORK = "network"
1352
INIC_NAME = "name"
1353
INIC_PARAMS_TYPES = {
1354
  INIC_IP: VTYPE_MAYBE_STRING,
1355
  INIC_LINK: VTYPE_STRING,
1356
  INIC_MAC: VTYPE_STRING,
1357
  INIC_MODE: VTYPE_STRING,
1358
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1359
  INIC_NAME: VTYPE_MAYBE_STRING,
1360
  }
1361
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1362

    
1363
# Hypervisor constants
1364
HT_XEN_PVM = "xen-pvm"
1365
HT_FAKE = "fake"
1366
HT_XEN_HVM = "xen-hvm"
1367
HT_KVM = "kvm"
1368
HT_CHROOT = "chroot"
1369
HT_LXC = "lxc"
1370
HYPER_TYPES = compat.UniqueFrozenset([
1371
  HT_XEN_PVM,
1372
  HT_FAKE,
1373
  HT_XEN_HVM,
1374
  HT_KVM,
1375
  HT_CHROOT,
1376
  HT_LXC,
1377
  ])
1378
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1379

    
1380
VNC_BASE_PORT = 5900
1381
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1382

    
1383
# NIC types
1384
HT_NIC_RTL8139 = "rtl8139"
1385
HT_NIC_NE2K_PCI = "ne2k_pci"
1386
HT_NIC_NE2K_ISA = "ne2k_isa"
1387
HT_NIC_I82551 = "i82551"
1388
HT_NIC_I85557B = "i82557b"
1389
HT_NIC_I8259ER = "i82559er"
1390
HT_NIC_PCNET = "pcnet"
1391
HT_NIC_E1000 = "e1000"
1392
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1393

    
1394
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1395
  HT_NIC_RTL8139,
1396
  HT_NIC_NE2K_PCI,
1397
  HT_NIC_E1000,
1398
  HT_NIC_NE2K_ISA,
1399
  HT_NIC_PARAVIRTUAL,
1400
  ])
1401
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1402
  HT_NIC_RTL8139,
1403
  HT_NIC_NE2K_PCI,
1404
  HT_NIC_NE2K_ISA,
1405
  HT_NIC_I82551,
1406
  HT_NIC_I85557B,
1407
  HT_NIC_I8259ER,
1408
  HT_NIC_PCNET,
1409
  HT_NIC_E1000,
1410
  HT_NIC_PARAVIRTUAL,
1411
  ])
1412

    
1413
# Vif types
1414
# default vif type in xen-hvm
1415
HT_HVM_VIF_IOEMU = "ioemu"
1416
HT_HVM_VIF_VIF = "vif"
1417
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1418
  HT_HVM_VIF_IOEMU,
1419
  HT_HVM_VIF_VIF,
1420
  ])
1421

    
1422
# Disk types
1423
HT_DISK_IOEMU = "ioemu"
1424
HT_DISK_IDE = "ide"
1425
HT_DISK_SCSI = "scsi"
1426
HT_DISK_SD = "sd"
1427
HT_DISK_MTD = "mtd"
1428
HT_DISK_PFLASH = "pflash"
1429

    
1430
HT_CACHE_DEFAULT = "default"
1431
HT_CACHE_NONE = "none"
1432
HT_CACHE_WTHROUGH = "writethrough"
1433
HT_CACHE_WBACK = "writeback"
1434
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1435
  HT_CACHE_DEFAULT,
1436
  HT_CACHE_NONE,
1437
  HT_CACHE_WTHROUGH,
1438
  HT_CACHE_WBACK,
1439
  ])
1440

    
1441
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1442
  HT_DISK_PARAVIRTUAL,
1443
  HT_DISK_IOEMU,
1444
  ])
1445
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1446
  HT_DISK_PARAVIRTUAL,
1447
  HT_DISK_IDE,
1448
  HT_DISK_SCSI,
1449
  HT_DISK_SD,
1450
  HT_DISK_MTD,
1451
  HT_DISK_PFLASH,
1452
  ])
1453

    
1454
# Mouse types:
1455
HT_MOUSE_MOUSE = "mouse"
1456
HT_MOUSE_TABLET = "tablet"
1457

    
1458
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1459
  HT_MOUSE_MOUSE,
1460
  HT_MOUSE_TABLET,
1461
  ])
1462

    
1463
# Boot order
1464
HT_BO_FLOPPY = "floppy"
1465
HT_BO_CDROM = "cdrom"
1466
HT_BO_DISK = "disk"
1467
HT_BO_NETWORK = "network"
1468

    
1469
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1470
  HT_BO_FLOPPY,
1471
  HT_BO_CDROM,
1472
  HT_BO_DISK,
1473
  HT_BO_NETWORK,
1474
  ])
1475

    
1476
# SPICE lossless image compression options
1477
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1478
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1479
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1480
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1481
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1482
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1483

    
1484
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1485
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1486
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1487
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1488
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1489
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1490
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1491
  ])
1492

    
1493
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1494
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1495
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1496
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1497

    
1498
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1499
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1500
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1501
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1502
  ])
1503

    
1504
# SPICE video stream detection
1505
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1506
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1507
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1508

    
1509
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1510
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1511
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1512
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1513
  ])
1514

    
1515
# Security models
1516
HT_SM_NONE = "none"
1517
HT_SM_USER = "user"
1518
HT_SM_POOL = "pool"
1519

    
1520
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1521
  HT_SM_NONE,
1522
  HT_SM_USER,
1523
  HT_SM_POOL,
1524
  ])
1525

    
1526
# Kvm flag values
1527
HT_KVM_ENABLED = "enabled"
1528
HT_KVM_DISABLED = "disabled"
1529

    
1530
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1531

    
1532
# Migration type
1533
HT_MIGRATION_LIVE = "live"
1534
HT_MIGRATION_NONLIVE = "non-live"
1535
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1536
  HT_MIGRATION_LIVE,
1537
  HT_MIGRATION_NONLIVE,
1538
  ])
1539

    
1540
# Cluster Verify steps
1541
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1542
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1543

    
1544
# Cluster Verify error classes
1545
CV_TCLUSTER = "cluster"
1546
CV_TGROUP = "group"
1547
CV_TNODE = "node"
1548
CV_TINSTANCE = "instance"
1549

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

    
1632
CV_ALL_ECODES = compat.UniqueFrozenset([
1633
  CV_ECLUSTERCFG,
1634
  CV_ECLUSTERCERT,
1635
  CV_ECLUSTERFILECHECK,
1636
  CV_ECLUSTERDANGLINGNODES,
1637
  CV_ECLUSTERDANGLINGINST,
1638
  CV_EINSTANCEBADNODE,
1639
  CV_EINSTANCEDOWN,
1640
  CV_EINSTANCELAYOUT,
1641
  CV_EINSTANCEMISSINGDISK,
1642
  CV_EINSTANCEFAULTYDISK,
1643
  CV_EINSTANCEWRONGNODE,
1644
  CV_EINSTANCESPLITGROUPS,
1645
  CV_EINSTANCEPOLICY,
1646
  CV_ENODEDRBD,
1647
  CV_ENODEDRBDHELPER,
1648
  CV_ENODEFILECHECK,
1649
  CV_ENODEHOOKS,
1650
  CV_ENODEHV,
1651
  CV_ENODELVM,
1652
  CV_ENODEN1,
1653
  CV_ENODENET,
1654
  CV_ENODEOS,
1655
  CV_ENODEORPHANINSTANCE,
1656
  CV_ENODEORPHANLV,
1657
  CV_ENODERPC,
1658
  CV_ENODESSH,
1659
  CV_ENODEVERSION,
1660
  CV_ENODESETUP,
1661
  CV_ENODETIME,
1662
  CV_ENODEOOBPATH,
1663
  CV_ENODEUSERSCRIPTS,
1664
  CV_ENODEFILESTORAGEPATHS,
1665
  ])
1666

    
1667
CV_ALL_ECODES_STRINGS = \
1668
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1669

    
1670
# Node verify constants
1671
NV_BRIDGES = "bridges"
1672
NV_DRBDHELPER = "drbd-helper"
1673
NV_DRBDLIST = "drbd-list"
1674
NV_EXCLUSIVEPVS = "exclusive-pvs"
1675
NV_FILELIST = "filelist"
1676
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1677
NV_HVINFO = "hvinfo"
1678
NV_HVPARAMS = "hvparms"
1679
NV_HYPERVISOR = "hypervisor"
1680
NV_INSTANCELIST = "instancelist"
1681
NV_LVLIST = "lvlist"
1682
NV_MASTERIP = "master-ip"
1683
NV_NODELIST = "nodelist"
1684
NV_NODENETTEST = "node-net-test"
1685
NV_NODESETUP = "nodesetup"
1686
NV_OOB_PATHS = "oob-paths"
1687
NV_OSLIST = "oslist"
1688
NV_PVLIST = "pvlist"
1689
NV_TIME = "time"
1690
NV_USERSCRIPTS = "user-scripts"
1691
NV_VERSION = "version"
1692
NV_VGLIST = "vglist"
1693
NV_VMNODES = "vmnodes"
1694

    
1695
# Instance status
1696
INSTST_RUNNING = "running"
1697
INSTST_ADMINDOWN = "ADMIN_down"
1698
INSTST_ADMINOFFLINE = "ADMIN_offline"
1699
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1700
INSTST_NODEDOWN = "ERROR_nodedown"
1701
INSTST_WRONGNODE = "ERROR_wrongnode"
1702
INSTST_ERRORUP = "ERROR_up"
1703
INSTST_ERRORDOWN = "ERROR_down"
1704
INSTST_ALL = compat.UniqueFrozenset([
1705
  INSTST_RUNNING,
1706
  INSTST_ADMINDOWN,
1707
  INSTST_ADMINOFFLINE,
1708
  INSTST_NODEOFFLINE,
1709
  INSTST_NODEDOWN,
1710
  INSTST_WRONGNODE,
1711
  INSTST_ERRORUP,
1712
  INSTST_ERRORDOWN,
1713
  ])
1714

    
1715
# Admin states
1716
ADMINST_UP = "up"
1717
ADMINST_DOWN = "down"
1718
ADMINST_OFFLINE = "offline"
1719
ADMINST_ALL = compat.UniqueFrozenset([
1720
  ADMINST_UP,
1721
  ADMINST_DOWN,
1722
  ADMINST_OFFLINE,
1723
  ])
1724

    
1725
# Node roles
1726
NR_REGULAR = "R"
1727
NR_MASTER = "M"
1728
NR_MCANDIDATE = "C"
1729
NR_DRAINED = "D"
1730
NR_OFFLINE = "O"
1731
NR_ALL = compat.UniqueFrozenset([
1732
  NR_REGULAR,
1733
  NR_MASTER,
1734
  NR_MCANDIDATE,
1735
  NR_DRAINED,
1736
  NR_OFFLINE,
1737
  ])
1738

    
1739
# SSL certificate check constants (in days)
1740
SSL_CERT_EXPIRATION_WARN = 30
1741
SSL_CERT_EXPIRATION_ERROR = 7
1742

    
1743
# Allocator framework constants
1744
IALLOCATOR_VERSION = 2
1745
IALLOCATOR_DIR_IN = "in"
1746
IALLOCATOR_DIR_OUT = "out"
1747
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1748
  IALLOCATOR_DIR_IN,
1749
  IALLOCATOR_DIR_OUT,
1750
  ])
1751
IALLOCATOR_MODE_ALLOC = "allocate"
1752
IALLOCATOR_MODE_RELOC = "relocate"
1753
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1754
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1755
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1756
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1757
  IALLOCATOR_MODE_ALLOC,
1758
  IALLOCATOR_MODE_RELOC,
1759
  IALLOCATOR_MODE_CHG_GROUP,
1760
  IALLOCATOR_MODE_NODE_EVAC,
1761
  IALLOCATOR_MODE_MULTI_ALLOC,
1762
  ])
1763
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1764
DEFAULT_IALLOCATOR_SHORTCUT = "."
1765

    
1766
IALLOCATOR_NEVAC_PRI = "primary-only"
1767
IALLOCATOR_NEVAC_SEC = "secondary-only"
1768
IALLOCATOR_NEVAC_ALL = "all"
1769
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1770
  IALLOCATOR_NEVAC_PRI,
1771
  IALLOCATOR_NEVAC_SEC,
1772
  IALLOCATOR_NEVAC_ALL,
1773
  ])
1774

    
1775
# Node evacuation
1776
NODE_EVAC_PRI = "primary-only"
1777
NODE_EVAC_SEC = "secondary-only"
1778
NODE_EVAC_ALL = "all"
1779
NODE_EVAC_MODES = compat.UniqueFrozenset([
1780
  NODE_EVAC_PRI,
1781
  NODE_EVAC_SEC,
1782
  NODE_EVAC_ALL,
1783
  ])
1784

    
1785
# Job queue
1786
JOB_QUEUE_VERSION = 1
1787
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1788
JOB_QUEUE_FILES_PERMS = 0640
1789

    
1790
JOB_ID_TEMPLATE = r"\d+"
1791
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1792

    
1793
# unchanged job return
1794
JOB_NOTCHANGED = "nochange"
1795

    
1796
# Job status
1797
JOB_STATUS_QUEUED = "queued"
1798
JOB_STATUS_WAITING = "waiting"
1799
JOB_STATUS_CANCELING = "canceling"
1800
JOB_STATUS_RUNNING = "running"
1801
JOB_STATUS_CANCELED = "canceled"
1802
JOB_STATUS_SUCCESS = "success"
1803
JOB_STATUS_ERROR = "error"
1804
JOBS_PENDING = compat.UniqueFrozenset([
1805
  JOB_STATUS_QUEUED,
1806
  JOB_STATUS_WAITING,
1807
  JOB_STATUS_CANCELING,
1808
  ])
1809
JOBS_FINALIZED = compat.UniqueFrozenset([
1810
  JOB_STATUS_CANCELED,
1811
  JOB_STATUS_SUCCESS,
1812
  JOB_STATUS_ERROR,
1813
  ])
1814
JOB_STATUS_ALL = compat.UniqueFrozenset([
1815
  JOB_STATUS_RUNNING,
1816
  ]) | JOBS_PENDING | JOBS_FINALIZED
1817

    
1818
# OpCode status
1819
# not yet finalized
1820
OP_STATUS_QUEUED = "queued"
1821
OP_STATUS_WAITING = "waiting"
1822
OP_STATUS_CANCELING = "canceling"
1823
OP_STATUS_RUNNING = "running"
1824
# finalized
1825
OP_STATUS_CANCELED = "canceled"
1826
OP_STATUS_SUCCESS = "success"
1827
OP_STATUS_ERROR = "error"
1828
OPS_FINALIZED = compat.UniqueFrozenset([
1829
  OP_STATUS_CANCELED,
1830
  OP_STATUS_SUCCESS,
1831
  OP_STATUS_ERROR,
1832
  ])
1833

    
1834
# OpCode priority
1835
OP_PRIO_LOWEST = +19
1836
OP_PRIO_HIGHEST = -20
1837

    
1838
OP_PRIO_LOW = +10
1839
OP_PRIO_NORMAL = 0
1840
OP_PRIO_HIGH = -10
1841

    
1842
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1843
  OP_PRIO_LOW,
1844
  OP_PRIO_NORMAL,
1845
  OP_PRIO_HIGH,
1846
  ])
1847

    
1848
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1849

    
1850
# Lock recalculate mode
1851
LOCKS_REPLACE = "replace"
1852
LOCKS_APPEND = "append"
1853

    
1854
# Lock timeout (sum) before we should go into blocking acquire (still
1855
# can be reset by priority change); computed as max time (10 hours)
1856
# before we should actually go into blocking acquire given that we
1857
# start from default priority level; in seconds
1858
# TODO
1859
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1860
LOCK_ATTEMPTS_MAXWAIT = 15.0
1861
LOCK_ATTEMPTS_MINWAIT = 1.0
1862

    
1863
# Execution log types
1864
ELOG_MESSAGE = "message"
1865
ELOG_REMOTE_IMPORT = "remote-import"
1866
ELOG_JQUEUE_TEST = "jqueue-test"
1867

    
1868
# /etc/hosts modification
1869
ETC_HOSTS_ADD = "add"
1870
ETC_HOSTS_REMOVE = "remove"
1871

    
1872
# Job queue test
1873
JQT_MSGPREFIX = "TESTMSG="
1874
JQT_EXPANDNAMES = "expandnames"
1875
JQT_EXEC = "exec"
1876
JQT_LOGMSG = "logmsg"
1877
JQT_STARTMSG = "startmsg"
1878
JQT_ALL = compat.UniqueFrozenset([
1879
  JQT_EXPANDNAMES,
1880
  JQT_EXEC,
1881
  JQT_LOGMSG,
1882
  JQT_STARTMSG,
1883
  ])
1884

    
1885
# Query resources
1886
QR_CLUSTER = "cluster"
1887
QR_INSTANCE = "instance"
1888
QR_NODE = "node"
1889
QR_LOCK = "lock"
1890
QR_GROUP = "group"
1891
QR_OS = "os"
1892
QR_JOB = "job"
1893
QR_EXPORT = "export"
1894
QR_NETWORK = "network"
1895
QR_EXTSTORAGE = "extstorage"
1896

    
1897
#: List of resources which can be queried using L{opcodes.OpQuery}
1898
QR_VIA_OP = compat.UniqueFrozenset([
1899
  QR_CLUSTER,
1900
  QR_INSTANCE,
1901
  QR_NODE,
1902
  QR_GROUP,
1903
  QR_OS,
1904
  QR_EXPORT,
1905
  QR_NETWORK,
1906
  QR_EXTSTORAGE,
1907
  ])
1908

    
1909
#: List of resources which can be queried using Local UniX Interface
1910
QR_VIA_LUXI = QR_VIA_OP.union([
1911
  QR_LOCK,
1912
  QR_JOB,
1913
  ])
1914

    
1915
#: List of resources which can be queried using RAPI
1916
QR_VIA_RAPI = QR_VIA_LUXI
1917

    
1918
# Query field types
1919
QFT_UNKNOWN = "unknown"
1920
QFT_TEXT = "text"
1921
QFT_BOOL = "bool"
1922
QFT_NUMBER = "number"
1923
QFT_UNIT = "unit"
1924
QFT_TIMESTAMP = "timestamp"
1925
QFT_OTHER = "other"
1926

    
1927
#: All query field types
1928
QFT_ALL = compat.UniqueFrozenset([
1929
  QFT_UNKNOWN,
1930
  QFT_TEXT,
1931
  QFT_BOOL,
1932
  QFT_NUMBER,
1933
  QFT_UNIT,
1934
  QFT_TIMESTAMP,
1935
  QFT_OTHER,
1936
  ])
1937

    
1938
# Query result field status (don't change or reuse values as they're used by
1939
# clients)
1940
#: Normal field status
1941
RS_NORMAL = 0
1942
#: Unknown field
1943
RS_UNKNOWN = 1
1944
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1945
RS_NODATA = 2
1946
#: Value unavailable/unsupported for item; if this field is supported
1947
#: but we cannot get the data for the moment, RS_NODATA or
1948
#: RS_OFFLINE should be used
1949
RS_UNAVAIL = 3
1950
#: Resource marked offline
1951
RS_OFFLINE = 4
1952

    
1953
RS_ALL = compat.UniqueFrozenset([
1954
  RS_NORMAL,
1955
  RS_UNKNOWN,
1956
  RS_NODATA,
1957
  RS_UNAVAIL,
1958
  RS_OFFLINE,
1959
  ])
1960

    
1961
#: Dictionary with special field cases and their verbose/terse formatting
1962
RSS_DESCRIPTION = {
1963
  RS_UNKNOWN: ("(unknown)", "??"),
1964
  RS_NODATA: ("(nodata)", "?"),
1965
  RS_OFFLINE: ("(offline)", "*"),
1966
  RS_UNAVAIL: ("(unavail)", "-"),
1967
  }
1968

    
1969
# max dynamic devices
1970
MAX_NICS = 8
1971
MAX_DISKS = 16
1972

    
1973
# SSCONF file prefix
1974
SSCONF_FILEPREFIX = "ssconf_"
1975
# SSCONF keys
1976
SS_CLUSTER_NAME = "cluster_name"
1977
SS_CLUSTER_TAGS = "cluster_tags"
1978
SS_FILE_STORAGE_DIR = "file_storage_dir"
1979
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1980
SS_MASTER_CANDIDATES = "master_candidates"
1981
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1982
SS_MASTER_IP = "master_ip"
1983
SS_MASTER_NETDEV = "master_netdev"
1984
SS_MASTER_NETMASK = "master_netmask"
1985
SS_MASTER_NODE = "master_node"
1986
SS_NODE_LIST = "node_list"
1987
SS_NODE_PRIMARY_IPS = "node_primary_ips"
1988
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1989
SS_OFFLINE_NODES = "offline_nodes"
1990
SS_ONLINE_NODES = "online_nodes"
1991
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
1992
SS_INSTANCE_LIST = "instance_list"
1993
SS_RELEASE_VERSION = "release_version"
1994
SS_HYPERVISOR_LIST = "hypervisor_list"
1995
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
1996
SS_UID_POOL = "uid_pool"
1997
SS_NODEGROUPS = "nodegroups"
1998
SS_NETWORKS = "networks"
1999

    
2000
SS_FILE_PERMS = 0444
2001

    
2002
# cluster wide default parameters
2003
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2004

    
2005
HVC_DEFAULTS = {
2006
  HT_XEN_PVM: {
2007
    HV_USE_BOOTLOADER: False,
2008
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
2009
    HV_BOOTLOADER_ARGS: "",
2010
    HV_KERNEL_PATH: XEN_KERNEL,
2011
    HV_INITRD_PATH: "",
2012
    HV_ROOT_PATH: "/dev/xvda1",
2013
    HV_KERNEL_ARGS: "ro",
2014
    HV_MIGRATION_PORT: 8002,
2015
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2016
    HV_BLOCKDEV_PREFIX: "sd",
2017
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2018
    HV_CPU_MASK: CPU_PINNING_ALL,
2019
    HV_CPU_CAP: 0,
2020
    HV_CPU_WEIGHT: 256,
2021
    },
2022
  HT_XEN_HVM: {
2023
    HV_BOOT_ORDER: "cd",
2024
    HV_CDROM_IMAGE_PATH: "",
2025
    HV_NIC_TYPE: HT_NIC_RTL8139,
2026
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2027
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2028
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2029
    HV_ACPI: True,
2030
    HV_PAE: True,
2031
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2032
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2033
    HV_MIGRATION_PORT: 8002,
2034
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2035
    HV_USE_LOCALTIME: False,
2036
    HV_BLOCKDEV_PREFIX: "hd",
2037
    HV_PASSTHROUGH: "",
2038
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2039
    HV_CPU_MASK: CPU_PINNING_ALL,
2040
    HV_CPU_CAP: 0,
2041
    HV_CPU_WEIGHT: 256,
2042
    HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
2043
    },
2044
  HT_KVM: {
2045
    HV_KVM_PATH: KVM_PATH,
2046
    HV_KERNEL_PATH: KVM_KERNEL,
2047
    HV_INITRD_PATH: "",
2048
    HV_KERNEL_ARGS: "ro",
2049
    HV_ROOT_PATH: "/dev/vda1",
2050
    HV_ACPI: True,
2051
    HV_SERIAL_CONSOLE: True,
2052
    HV_SERIAL_SPEED: 38400,
2053
    HV_VNC_BIND_ADDRESS: "",
2054
    HV_VNC_TLS: False,
2055
    HV_VNC_X509: "",
2056
    HV_VNC_X509_VERIFY: False,
2057
    HV_VNC_PASSWORD_FILE: "",
2058
    HV_KVM_SPICE_BIND: "",
2059
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2060
    HV_KVM_SPICE_PASSWORD_FILE: "",
2061
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2062
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2063
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2064
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2065
    HV_KVM_SPICE_AUDIO_COMPR: True,
2066
    HV_KVM_SPICE_USE_TLS: False,
2067
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2068
    HV_KVM_SPICE_USE_VDAGENT: True,
2069
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2070
    HV_CDROM_IMAGE_PATH: "",
2071
    HV_KVM_CDROM2_IMAGE_PATH: "",
2072
    HV_BOOT_ORDER: HT_BO_DISK,
2073
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2074
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2075
    HV_KVM_CDROM_DISK_TYPE: "",
2076
    HV_USB_MOUSE: "",
2077
    HV_KEYMAP: "",
2078
    HV_MIGRATION_PORT: 8102,
2079
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2080
    HV_MIGRATION_DOWNTIME: 30,  # ms
2081
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2082
    HV_USE_LOCALTIME: False,
2083
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2084
    HV_SECURITY_MODEL: HT_SM_NONE,
2085
    HV_SECURITY_DOMAIN: "",
2086
    HV_KVM_FLAG: "",
2087
    HV_VHOST_NET: False,
2088
    HV_KVM_USE_CHROOT: False,
2089
    HV_MEM_PATH: "",
2090
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2091
    HV_CPU_MASK: CPU_PINNING_ALL,
2092
    HV_CPU_TYPE: "",
2093
    HV_CPU_CORES: 0,
2094
    HV_CPU_THREADS: 0,
2095
    HV_CPU_SOCKETS: 0,
2096
    HV_SOUNDHW: "",
2097
    HV_USB_DEVICES: "",
2098
    HV_VGA: "",
2099
    HV_KVM_EXTRA: "",
2100
    HV_KVM_MACHINE_VERSION: "",
2101
    },
2102
  HT_FAKE: {},
2103
  HT_CHROOT: {
2104
    HV_INIT_SCRIPT: "/ganeti-chroot",
2105
    },
2106
  HT_LXC: {
2107
    HV_CPU_MASK: "",
2108
    },
2109
  }
2110

    
2111
HVC_GLOBALS = compat.UniqueFrozenset([
2112
  HV_MIGRATION_PORT,
2113
  HV_MIGRATION_BANDWIDTH,
2114
  HV_MIGRATION_MODE,
2115
  ])
2116

    
2117
BEC_DEFAULTS = {
2118
  BE_MINMEM: 128,
2119
  BE_MAXMEM: 128,
2120
  BE_VCPUS: 1,
2121
  BE_AUTO_BALANCE: True,
2122
  BE_ALWAYS_FAILOVER: False,
2123
  BE_SPINDLE_USE: 1,
2124
  }
2125

    
2126
NDC_DEFAULTS = {
2127
  ND_OOB_PROGRAM: "",
2128
  ND_SPINDLE_COUNT: 1,
2129
  ND_EXCLUSIVE_STORAGE: False,
2130
  }
2131

    
2132
NDC_GLOBALS = compat.UniqueFrozenset([
2133
  ND_EXCLUSIVE_STORAGE,
2134
  ])
2135

    
2136
DISK_LD_DEFAULTS = {
2137
  LD_DRBD8: {
2138
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2139
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2140
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2141
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2142
    LDP_DISK_CUSTOM: "",
2143
    LDP_NET_CUSTOM: "",
2144
    LDP_DYNAMIC_RESYNC: False,
2145

    
2146
    # The default values for the DRBD dynamic resync speed algorithm
2147
    # are taken from the drbsetup 8.3.11 man page, except for
2148
    # c-plan-ahead (that we don't need to set to 0, because we have a
2149
    # separate option to enable it) and for c-max-rate, that we cap to
2150
    # the default value for the static resync rate.
2151
    LDP_PLAN_AHEAD: 20, # ds
2152
    LDP_FILL_TARGET: 0, # sectors
2153
    LDP_DELAY_TARGET: 1, # ds
2154
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2155
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2156
    },
2157
  LD_LV: {
2158
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2159
    },
2160
  LD_FILE: {},
2161
  LD_BLOCKDEV: {},
2162
  LD_RBD: {
2163
    LDP_POOL: "rbd"
2164
    },
2165
  LD_EXT: {},
2166
  }
2167

    
2168
# readability shortcuts
2169
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2170
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2171

    
2172
DISK_DT_DEFAULTS = {
2173
  DT_PLAIN: {
2174
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2175
    },
2176
  DT_DRBD8: {
2177
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2178
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2179
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2180
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2181
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2182
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2183
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2184
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2185
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2186
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2187
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2188
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2189
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2190
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2191
    },
2192
  DT_DISKLESS: {},
2193
  DT_FILE: {},
2194
  DT_SHARED_FILE: {},
2195
  DT_BLOCK: {},
2196
  DT_RBD: {
2197
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2198
    },
2199
  DT_EXT: {},
2200
  }
2201

    
2202
# we don't want to export the shortcuts
2203
del _LV_DEFAULTS, _DRBD_DEFAULTS
2204

    
2205
NICC_DEFAULTS = {
2206
  NIC_MODE: NIC_MODE_BRIDGED,
2207
  NIC_LINK: DEFAULT_BRIDGE,
2208
  }
2209

    
2210
# All of the following values are quite arbitrarily - there are no
2211
# "good" defaults, these must be customised per-site
2212
ISPECS_MINMAX_DEFAULTS = {
2213
  ISPECS_MIN: {
2214
    ISPEC_MEM_SIZE: 128,
2215
    ISPEC_CPU_COUNT: 1,
2216
    ISPEC_DISK_COUNT: 1,
2217
    ISPEC_DISK_SIZE: 1024,
2218
    ISPEC_NIC_COUNT: 1,
2219
    ISPEC_SPINDLE_USE: 1,
2220
    },
2221
  ISPECS_MAX: {
2222
    ISPEC_MEM_SIZE: 32768,
2223
    ISPEC_CPU_COUNT: 8,
2224
    ISPEC_DISK_COUNT: MAX_DISKS,
2225
    ISPEC_DISK_SIZE: 1024 * 1024,
2226
    ISPEC_NIC_COUNT: MAX_NICS,
2227
    ISPEC_SPINDLE_USE: 12,
2228
    },
2229
  }
2230
IPOLICY_DEFAULTS = {
2231
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2232
  ISPECS_STD: {
2233
    ISPEC_MEM_SIZE: 128,
2234
    ISPEC_CPU_COUNT: 1,
2235
    ISPEC_DISK_COUNT: 1,
2236
    ISPEC_DISK_SIZE: 1024,
2237
    ISPEC_NIC_COUNT: 1,
2238
    ISPEC_SPINDLE_USE: 1,
2239
    },
2240
  IPOLICY_DTS: list(DISK_TEMPLATES),
2241
  IPOLICY_VCPU_RATIO: 4.0,
2242
  IPOLICY_SPINDLE_RATIO: 32.0,
2243
  }
2244

    
2245
MASTER_POOL_SIZE_DEFAULT = 10
2246

    
2247
# Exclusive storage:
2248
# Error margin used to compare physical disks
2249
PART_MARGIN = .01
2250
# Space reserved when creating instance disks
2251
PART_RESERVED = .02
2252

    
2253
CONFD_PROTOCOL_VERSION = 1
2254

    
2255
CONFD_REQ_PING = 0
2256
CONFD_REQ_NODE_ROLE_BYNAME = 1
2257
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2258
CONFD_REQ_CLUSTER_MASTER = 3
2259
CONFD_REQ_NODE_PIP_LIST = 4
2260
CONFD_REQ_MC_PIP_LIST = 5
2261
CONFD_REQ_INSTANCES_IPS_LIST = 6
2262
CONFD_REQ_NODE_DRBD = 7
2263
CONFD_REQ_NODE_INSTANCES = 8
2264

    
2265
# Confd request query fields. These are used to narrow down queries.
2266
# These must be strings rather than integers, because json-encoding
2267
# converts them to strings anyway, as they're used as dict-keys.
2268
CONFD_REQQ_LINK = "0"
2269
CONFD_REQQ_IP = "1"
2270
CONFD_REQQ_IPLIST = "2"
2271
CONFD_REQQ_FIELDS = "3"
2272

    
2273
CONFD_REQFIELD_NAME = "0"
2274
CONFD_REQFIELD_IP = "1"
2275
CONFD_REQFIELD_MNODE_PIP = "2"
2276

    
2277
CONFD_REQS = compat.UniqueFrozenset([
2278
  CONFD_REQ_PING,
2279
  CONFD_REQ_NODE_ROLE_BYNAME,
2280
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2281
  CONFD_REQ_CLUSTER_MASTER,
2282
  CONFD_REQ_NODE_PIP_LIST,
2283
  CONFD_REQ_MC_PIP_LIST,
2284
  CONFD_REQ_INSTANCES_IPS_LIST,
2285
  CONFD_REQ_NODE_DRBD,
2286
  ])
2287

    
2288
CONFD_REPL_STATUS_OK = 0
2289
CONFD_REPL_STATUS_ERROR = 1
2290
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2291

    
2292
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2293
  CONFD_REPL_STATUS_OK,
2294
  CONFD_REPL_STATUS_ERROR,
2295
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2296
  ])
2297

    
2298
(CONFD_NODE_ROLE_MASTER,
2299
 CONFD_NODE_ROLE_CANDIDATE,
2300
 CONFD_NODE_ROLE_OFFLINE,
2301
 CONFD_NODE_ROLE_DRAINED,
2302
 CONFD_NODE_ROLE_REGULAR,
2303
 ) = range(5)
2304

    
2305
# A few common errors for confd
2306
CONFD_ERROR_UNKNOWN_ENTRY = 1
2307
CONFD_ERROR_INTERNAL = 2
2308
CONFD_ERROR_ARGUMENT = 3
2309

    
2310
# Each request is "salted" by the current timestamp.
2311
# This constants decides how many seconds of skew to accept.
2312
# TODO: make this a default and allow the value to be more configurable
2313
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2314

    
2315
# When we haven't reloaded the config for more than this amount of
2316
# seconds, we force a test to see if inotify is betraying us. Using a
2317
# prime number to ensure we get less chance of 'same wakeup' with
2318
# other processes.
2319
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2320

    
2321
# If we receive more than one update in this amount of microseconds,
2322
# we move to polling every RATELIMIT seconds, rather than relying on
2323
# inotify, to be able to serve more requests.
2324
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2325

    
2326
# Magic number prepended to all confd queries.
2327
# This allows us to distinguish different types of confd protocols and handle
2328
# them. For example by changing this we can move the whole payload to be
2329
# compressed, or move away from json.
2330
CONFD_MAGIC_FOURCC = "plj0"
2331

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

    
2337
# Timeout in seconds to expire pending query request in the confd client
2338
# library. We don't actually expect any answer more than 10 seconds after we
2339
# sent a request.
2340
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2341

    
2342
# Maximum UDP datagram size.
2343
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2344
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2345
#   (assuming we can't use jumbo frames)
2346
# We just set this to 60K, which should be enough
2347
MAX_UDP_DATA_SIZE = 61440
2348

    
2349
# User-id pool minimum/maximum acceptable user-ids.
2350
UIDPOOL_UID_MIN = 0
2351
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2352

    
2353
# Name or path of the pgrep command
2354
PGREP = "pgrep"
2355

    
2356
# Name of the node group that gets created at cluster init or upgrade
2357
INITIAL_NODE_GROUP_NAME = "default"
2358

    
2359
# Possible values for NodeGroup.alloc_policy
2360
ALLOC_POLICY_PREFERRED = "preferred"
2361
ALLOC_POLICY_LAST_RESORT = "last_resort"
2362
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2363
VALID_ALLOC_POLICIES = [
2364
  ALLOC_POLICY_PREFERRED,
2365
  ALLOC_POLICY_LAST_RESORT,
2366
  ALLOC_POLICY_UNALLOCABLE,
2367
  ]
2368

    
2369
# Temporary external/shared storage parameters
2370
BLOCKDEV_DRIVER_MANUAL = "manual"
2371

    
2372
# qemu-img path, required for ovfconverter
2373
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2374

    
2375
# Whether htools was enabled at compilation time
2376
HTOOLS = _autoconf.HTOOLS
2377
# The hail iallocator
2378
IALLOC_HAIL = "hail"
2379

    
2380
# Fake opcodes for functions that have hooks attached to them via
2381
# backend.RunLocalHooks
2382
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2383
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2384

    
2385
# SSH key types
2386
SSHK_RSA = "rsa"
2387
SSHK_DSA = "dsa"
2388
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2389

    
2390
# SSH authorized key types
2391
SSHAK_RSA = "ssh-rsa"
2392
SSHAK_DSS = "ssh-dss"
2393
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2394

    
2395
# SSH setup
2396
SSHS_CLUSTER_NAME = "cluster_name"
2397
SSHS_SSH_HOST_KEY = "ssh_host_key"
2398
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2399
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2400

    
2401
#: Key files for SSH daemon
2402
SSH_DAEMON_KEYFILES = {
2403
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2404
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2405
  }
2406

    
2407
# Node daemon setup
2408
NDS_CLUSTER_NAME = "cluster_name"
2409
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2410
NDS_SSCONF = "ssconf"
2411
NDS_START_NODE_DAEMON = "start_node_daemon"
2412

    
2413
# Path generating random UUID
2414
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2415

    
2416
# Regex string for verifying a UUID
2417
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2418

    
2419
# Auto-repair tag prefixes
2420
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2421
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2422
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2423
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2424
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2425

    
2426
# Auto-repair levels
2427
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2428
AUTO_REPAIR_MIGRATE = "migrate"
2429
AUTO_REPAIR_FAILOVER = "failover"
2430
AUTO_REPAIR_REINSTALL = "reinstall"
2431
AUTO_REPAIR_ALL_TYPES = [
2432
  AUTO_REPAIR_FIX_STORAGE,
2433
  AUTO_REPAIR_MIGRATE,
2434
  AUTO_REPAIR_FAILOVER,
2435
  AUTO_REPAIR_REINSTALL,
2436
]
2437

    
2438
# Auto-repair results
2439
AUTO_REPAIR_SUCCESS = "success"
2440
AUTO_REPAIR_FAILURE = "failure"
2441
AUTO_REPAIR_ENOPERM = "enoperm"
2442
AUTO_REPAIR_ALL_RESULTS = frozenset([
2443
    AUTO_REPAIR_SUCCESS,
2444
    AUTO_REPAIR_FAILURE,
2445
    AUTO_REPAIR_ENOPERM,
2446
])
2447

    
2448
# The version identifier for builtin data collectors
2449
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2450

    
2451
# The reason trail opcode parameter name
2452
OPCODE_REASON = "reason"
2453

    
2454
# The source reasons for the execution of an OpCode
2455
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2456
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2457
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2458
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2459
OPCODE_REASON_SRC_USER = "gnt:user"
2460

    
2461
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2462
  OPCODE_REASON_SRC_CLIENT,
2463
  OPCODE_REASON_SRC_NODED,
2464
  OPCODE_REASON_SRC_OPCODE,
2465
  OPCODE_REASON_SRC_RLIB2,
2466
  OPCODE_REASON_SRC_USER,
2467
  ])
2468

    
2469
# Do not re-export imported modules
2470
del re, _vcsversion, _autoconf, socket, pathutils, compat