Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 7ad422ec

History | View | Annotate | Download (65.2 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_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
147
ENABLE_CONFD = _autoconf.ENABLE_CONFD
148
ENABLE_MOND = _autoconf.ENABLE_MOND
149
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
150
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
151

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

    
156
NODED = "ganeti-noded"
157
CONFD = "ganeti-confd"
158
RAPI = "ganeti-rapi"
159
MASTERD = "ganeti-masterd"
160
MOND = "ganeti-mond"
161

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

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

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

    
184
FIRST_DRBD_PORT = 11000
185
LAST_DRBD_PORT = 14999
186

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

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

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

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

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

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

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

    
226
DEV_CONSOLE = "/dev/console"
227

    
228
PROC_MOUNTS = "/proc/mounts"
229

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

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

    
245
EXPORT_CONF_FILE = "config.ini"
246

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
318
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
319

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

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

    
332
IE_CUSTOM_SIZE = "fd"
333

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
583
# drbd constants
584
DRBD_HMAC_ALG = "md5"
585
DRBD_DEFAULT_NET_PROTOCOL = "C"
586
DRBD_MIGRATION_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_VIF_SCRIPT = "vif_script"
952
HV_XEN_CMD = "xen_cmd"
953

    
954

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

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

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

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

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

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

    
1061
# KVM-specific statuses
1062
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1063

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

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

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

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

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

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

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

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

    
1109
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1110
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1111

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1294
OOB_POWER_STATUS_POWERED = "powered"
1295

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

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

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

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

    
1314
# NIC_* constants are used inside the ganeti config
1315
NIC_MODE = "mode"
1316
NIC_LINK = "link"
1317
NIC_VLAN = "vlan"
1318

    
1319
NIC_MODE_BRIDGED = "bridged"
1320
NIC_MODE_ROUTED = "routed"
1321
NIC_MODE_OVS = "openvswitch"
1322
NIC_IP_POOL = "pool"
1323

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

    
1330
RESERVE_ACTION = "reserve"
1331
RELEASE_ACTION = "release"
1332

    
1333
NICS_PARAMETER_TYPES = {
1334
  NIC_MODE: VTYPE_STRING,
1335
  NIC_LINK: VTYPE_STRING,
1336
  NIC_VLAN: VTYPE_MAYBE_STRING,
1337
  }
1338

    
1339
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1340

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

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

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

    
1398
VNC_BASE_PORT = 5900
1399
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1400

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1693
CV_ALL_ECODES_STRINGS = \
1694
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1695

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

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

    
1744
# Admin states
1745
ADMINST_UP = "up"
1746
ADMINST_DOWN = "down"
1747
ADMINST_OFFLINE = "offline"
1748
ADMINST_ALL = compat.UniqueFrozenset([
1749
  ADMINST_UP,
1750
  ADMINST_DOWN,
1751
  ADMINST_OFFLINE,
1752
  ])
1753

    
1754
# Node roles
1755
NR_REGULAR = "R"
1756
NR_MASTER = "M"
1757
NR_MCANDIDATE = "C"
1758
NR_DRAINED = "D"
1759
NR_OFFLINE = "O"
1760
NR_ALL = compat.UniqueFrozenset([
1761
  NR_REGULAR,
1762
  NR_MASTER,
1763
  NR_MCANDIDATE,
1764
  NR_DRAINED,
1765
  NR_OFFLINE,
1766
  ])
1767

    
1768
# SSL certificate check constants (in days)
1769
SSL_CERT_EXPIRATION_WARN = 30
1770
SSL_CERT_EXPIRATION_ERROR = 7
1771

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

    
1795
IALLOCATOR_NEVAC_PRI = "primary-only"
1796
IALLOCATOR_NEVAC_SEC = "secondary-only"
1797
IALLOCATOR_NEVAC_ALL = "all"
1798
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1799
  IALLOCATOR_NEVAC_PRI,
1800
  IALLOCATOR_NEVAC_SEC,
1801
  IALLOCATOR_NEVAC_ALL,
1802
  ])
1803

    
1804
# Node evacuation
1805
NODE_EVAC_PRI = "primary-only"
1806
NODE_EVAC_SEC = "secondary-only"
1807
NODE_EVAC_ALL = "all"
1808
NODE_EVAC_MODES = compat.UniqueFrozenset([
1809
  NODE_EVAC_PRI,
1810
  NODE_EVAC_SEC,
1811
  NODE_EVAC_ALL,
1812
  ])
1813

    
1814
# Job queue
1815
JOB_QUEUE_VERSION = 1
1816
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1817
JOB_QUEUE_FILES_PERMS = 0640
1818

    
1819
JOB_ID_TEMPLATE = r"\d+"
1820
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1821

    
1822
# unchanged job return
1823
JOB_NOTCHANGED = "nochange"
1824

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

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

    
1863
# OpCode priority
1864
OP_PRIO_LOWEST = +19
1865
OP_PRIO_HIGHEST = -20
1866

    
1867
OP_PRIO_LOW = +10
1868
OP_PRIO_NORMAL = 0
1869
OP_PRIO_HIGH = -10
1870

    
1871
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1872
  OP_PRIO_LOW,
1873
  OP_PRIO_NORMAL,
1874
  OP_PRIO_HIGH,
1875
  ])
1876

    
1877
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1878

    
1879
# Lock recalculate mode
1880
LOCKS_REPLACE = "replace"
1881
LOCKS_APPEND = "append"
1882

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

    
1892
# Execution log types
1893
ELOG_MESSAGE = "message"
1894
ELOG_REMOTE_IMPORT = "remote-import"
1895
ELOG_JQUEUE_TEST = "jqueue-test"
1896

    
1897
# /etc/hosts modification
1898
ETC_HOSTS_ADD = "add"
1899
ETC_HOSTS_REMOVE = "remove"
1900

    
1901
# Job queue test
1902
JQT_MSGPREFIX = "TESTMSG="
1903
JQT_EXPANDNAMES = "expandnames"
1904
JQT_EXEC = "exec"
1905
JQT_LOGMSG = "logmsg"
1906
JQT_STARTMSG = "startmsg"
1907
JQT_ALL = compat.UniqueFrozenset([
1908
  JQT_EXPANDNAMES,
1909
  JQT_EXEC,
1910
  JQT_LOGMSG,
1911
  JQT_STARTMSG,
1912
  ])
1913

    
1914
# Query resources
1915
QR_CLUSTER = "cluster"
1916
QR_INSTANCE = "instance"
1917
QR_NODE = "node"
1918
QR_LOCK = "lock"
1919
QR_GROUP = "group"
1920
QR_OS = "os"
1921
QR_JOB = "job"
1922
QR_EXPORT = "export"
1923
QR_NETWORK = "network"
1924
QR_EXTSTORAGE = "extstorage"
1925

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

    
1938
#: List of resources which can be queried using Local UniX Interface
1939
QR_VIA_LUXI = QR_VIA_OP.union([
1940
  QR_LOCK,
1941
  QR_JOB,
1942
  ])
1943

    
1944
#: List of resources which can be queried using RAPI
1945
QR_VIA_RAPI = QR_VIA_LUXI
1946

    
1947
# Query field types
1948
QFT_UNKNOWN = "unknown"
1949
QFT_TEXT = "text"
1950
QFT_BOOL = "bool"
1951
QFT_NUMBER = "number"
1952
QFT_UNIT = "unit"
1953
QFT_TIMESTAMP = "timestamp"
1954
QFT_OTHER = "other"
1955

    
1956
#: All query field types
1957
QFT_ALL = compat.UniqueFrozenset([
1958
  QFT_UNKNOWN,
1959
  QFT_TEXT,
1960
  QFT_BOOL,
1961
  QFT_NUMBER,
1962
  QFT_UNIT,
1963
  QFT_TIMESTAMP,
1964
  QFT_OTHER,
1965
  ])
1966

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

    
1982
RS_ALL = compat.UniqueFrozenset([
1983
  RS_NORMAL,
1984
  RS_UNKNOWN,
1985
  RS_NODATA,
1986
  RS_UNAVAIL,
1987
  RS_OFFLINE,
1988
  ])
1989

    
1990
#: Dictionary with special field cases and their verbose/terse formatting
1991
RSS_DESCRIPTION = {
1992
  RS_UNKNOWN: ("(unknown)", "??"),
1993
  RS_NODATA: ("(nodata)", "?"),
1994
  RS_OFFLINE: ("(offline)", "*"),
1995
  RS_UNAVAIL: ("(unavail)", "-"),
1996
  }
1997

    
1998
# max dynamic devices
1999
MAX_NICS = 8
2000
MAX_DISKS = 16
2001

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

    
2029
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2030
SS_HVPARAMS_PREF = "hvparams_"
2031

    
2032
# Hvparams keys:
2033
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2034
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2035
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2036
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2037
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2038
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2039

    
2040
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2041
  SS_HVPARAMS_XEN_PVM,
2042
  SS_HVPARAMS_XEN_FAKE,
2043
  SS_HVPARAMS_XEN_HVM,
2044
  SS_HVPARAMS_XEN_KVM,
2045
  SS_HVPARAMS_XEN_CHROOT,
2046
  SS_HVPARAMS_XEN_LXC,
2047
  ])
2048

    
2049
SS_FILE_PERMS = 0444
2050

    
2051
# cluster wide default parameters
2052
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2053

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

    
2166
HVC_GLOBALS = compat.UniqueFrozenset([
2167
  HV_MIGRATION_PORT,
2168
  HV_MIGRATION_BANDWIDTH,
2169
  HV_MIGRATION_MODE,
2170
  HV_XEN_CMD,
2171
  ])
2172

    
2173
BEC_DEFAULTS = {
2174
  BE_MINMEM: 128,
2175
  BE_MAXMEM: 128,
2176
  BE_VCPUS: 1,
2177
  BE_AUTO_BALANCE: True,
2178
  BE_ALWAYS_FAILOVER: False,
2179
  BE_SPINDLE_USE: 1,
2180
  }
2181

    
2182
NDC_DEFAULTS = {
2183
  ND_OOB_PROGRAM: "",
2184
  ND_SPINDLE_COUNT: 1,
2185
  ND_EXCLUSIVE_STORAGE: False,
2186
  }
2187

    
2188
NDC_GLOBALS = compat.UniqueFrozenset([
2189
  ND_EXCLUSIVE_STORAGE,
2190
  ])
2191

    
2192
DISK_LD_DEFAULTS = {
2193
  LD_DRBD8: {
2194
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2195
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2196
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2197
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2198
    LDP_DISK_CUSTOM: "",
2199
    LDP_NET_CUSTOM: "",
2200
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2201
    LDP_DYNAMIC_RESYNC: False,
2202

    
2203
    # The default values for the DRBD dynamic resync speed algorithm
2204
    # are taken from the drbsetup 8.3.11 man page, except for
2205
    # c-plan-ahead (that we don't need to set to 0, because we have a
2206
    # separate option to enable it) and for c-max-rate, that we cap to
2207
    # the default value for the static resync rate.
2208
    LDP_PLAN_AHEAD: 20, # ds
2209
    LDP_FILL_TARGET: 0, # sectors
2210
    LDP_DELAY_TARGET: 1, # ds
2211
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2212
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2213
    },
2214
  LD_LV: {
2215
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2216
    },
2217
  LD_FILE: {},
2218
  LD_BLOCKDEV: {},
2219
  LD_RBD: {
2220
    LDP_POOL: "rbd"
2221
    },
2222
  LD_EXT: {},
2223
  }
2224

    
2225
# readability shortcuts
2226
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2227
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2228

    
2229
DISK_DT_DEFAULTS = {
2230
  DT_PLAIN: {
2231
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2232
    },
2233
  DT_DRBD8: {
2234
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2235
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2236
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2237
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2238
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2239
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2240
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2241
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2242
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2243
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2244
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2245
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2246
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2247
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2248
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2249
    },
2250
  DT_DISKLESS: {},
2251
  DT_FILE: {},
2252
  DT_SHARED_FILE: {},
2253
  DT_BLOCK: {},
2254
  DT_RBD: {
2255
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2256
    },
2257
  DT_EXT: {},
2258
  }
2259

    
2260
# we don't want to export the shortcuts
2261
del _LV_DEFAULTS, _DRBD_DEFAULTS
2262

    
2263
NICC_DEFAULTS = {
2264
  NIC_MODE: NIC_MODE_BRIDGED,
2265
  NIC_LINK: DEFAULT_BRIDGE,
2266
  NIC_VLAN: None,
2267
  }
2268

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

    
2304
MASTER_POOL_SIZE_DEFAULT = 10
2305

    
2306
# Exclusive storage:
2307
# Error margin used to compare physical disks
2308
PART_MARGIN = .01
2309
# Space reserved when creating instance disks
2310
PART_RESERVED = .02
2311

    
2312
CONFD_PROTOCOL_VERSION = 1
2313

    
2314
CONFD_REQ_PING = 0
2315
CONFD_REQ_NODE_ROLE_BYNAME = 1
2316
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2317
CONFD_REQ_CLUSTER_MASTER = 3
2318
CONFD_REQ_NODE_PIP_LIST = 4
2319
CONFD_REQ_MC_PIP_LIST = 5
2320
CONFD_REQ_INSTANCES_IPS_LIST = 6
2321
CONFD_REQ_NODE_DRBD = 7
2322
CONFD_REQ_NODE_INSTANCES = 8
2323

    
2324
# Confd request query fields. These are used to narrow down queries.
2325
# These must be strings rather than integers, because json-encoding
2326
# converts them to strings anyway, as they're used as dict-keys.
2327
CONFD_REQQ_LINK = "0"
2328
CONFD_REQQ_IP = "1"
2329
CONFD_REQQ_IPLIST = "2"
2330
CONFD_REQQ_FIELDS = "3"
2331

    
2332
CONFD_REQFIELD_NAME = "0"
2333
CONFD_REQFIELD_IP = "1"
2334
CONFD_REQFIELD_MNODE_PIP = "2"
2335

    
2336
CONFD_REQS = compat.UniqueFrozenset([
2337
  CONFD_REQ_PING,
2338
  CONFD_REQ_NODE_ROLE_BYNAME,
2339
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2340
  CONFD_REQ_CLUSTER_MASTER,
2341
  CONFD_REQ_NODE_PIP_LIST,
2342
  CONFD_REQ_MC_PIP_LIST,
2343
  CONFD_REQ_INSTANCES_IPS_LIST,
2344
  CONFD_REQ_NODE_DRBD,
2345
  ])
2346

    
2347
CONFD_REPL_STATUS_OK = 0
2348
CONFD_REPL_STATUS_ERROR = 1
2349
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2350

    
2351
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2352
  CONFD_REPL_STATUS_OK,
2353
  CONFD_REPL_STATUS_ERROR,
2354
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2355
  ])
2356

    
2357
(CONFD_NODE_ROLE_MASTER,
2358
 CONFD_NODE_ROLE_CANDIDATE,
2359
 CONFD_NODE_ROLE_OFFLINE,
2360
 CONFD_NODE_ROLE_DRAINED,
2361
 CONFD_NODE_ROLE_REGULAR,
2362
 ) = range(5)
2363

    
2364
# A few common errors for confd
2365
CONFD_ERROR_UNKNOWN_ENTRY = 1
2366
CONFD_ERROR_INTERNAL = 2
2367
CONFD_ERROR_ARGUMENT = 3
2368

    
2369
# Each request is "salted" by the current timestamp.
2370
# This constants decides how many seconds of skew to accept.
2371
# TODO: make this a default and allow the value to be more configurable
2372
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2373

    
2374
# When we haven't reloaded the config for more than this amount of
2375
# seconds, we force a test to see if inotify is betraying us. Using a
2376
# prime number to ensure we get less chance of 'same wakeup' with
2377
# other processes.
2378
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2379

    
2380
# If we receive more than one update in this amount of microseconds,
2381
# we move to polling every RATELIMIT seconds, rather than relying on
2382
# inotify, to be able to serve more requests.
2383
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2384

    
2385
# Magic number prepended to all confd queries.
2386
# This allows us to distinguish different types of confd protocols and handle
2387
# them. For example by changing this we can move the whole payload to be
2388
# compressed, or move away from json.
2389
CONFD_MAGIC_FOURCC = "plj0"
2390

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

    
2396
# Timeout in seconds to expire pending query request in the confd client
2397
# library. We don't actually expect any answer more than 10 seconds after we
2398
# sent a request.
2399
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2400

    
2401
# Maximum UDP datagram size.
2402
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2403
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2404
#   (assuming we can't use jumbo frames)
2405
# We just set this to 60K, which should be enough
2406
MAX_UDP_DATA_SIZE = 61440
2407

    
2408
# User-id pool minimum/maximum acceptable user-ids.
2409
UIDPOOL_UID_MIN = 0
2410
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2411

    
2412
# Name or path of the pgrep command
2413
PGREP = "pgrep"
2414

    
2415
# Name of the node group that gets created at cluster init or upgrade
2416
INITIAL_NODE_GROUP_NAME = "default"
2417

    
2418
# Possible values for NodeGroup.alloc_policy
2419
ALLOC_POLICY_PREFERRED = "preferred"
2420
ALLOC_POLICY_LAST_RESORT = "last_resort"
2421
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2422
VALID_ALLOC_POLICIES = [
2423
  ALLOC_POLICY_PREFERRED,
2424
  ALLOC_POLICY_LAST_RESORT,
2425
  ALLOC_POLICY_UNALLOCABLE,
2426
  ]
2427

    
2428
# Temporary external/shared storage parameters
2429
BLOCKDEV_DRIVER_MANUAL = "manual"
2430

    
2431
# qemu-img path, required for ovfconverter
2432
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2433

    
2434
# Whether htools was enabled at compilation time
2435
HTOOLS = _autoconf.HTOOLS
2436
# The hail iallocator
2437
IALLOC_HAIL = "hail"
2438

    
2439
# Fake opcodes for functions that have hooks attached to them via
2440
# backend.RunLocalHooks
2441
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2442
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2443

    
2444
# SSH key types
2445
SSHK_RSA = "rsa"
2446
SSHK_DSA = "dsa"
2447
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2448

    
2449
# SSH authorized key types
2450
SSHAK_RSA = "ssh-rsa"
2451
SSHAK_DSS = "ssh-dss"
2452
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2453

    
2454
# SSH setup
2455
SSHS_CLUSTER_NAME = "cluster_name"
2456
SSHS_SSH_HOST_KEY = "ssh_host_key"
2457
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2458
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2459

    
2460
#: Key files for SSH daemon
2461
SSH_DAEMON_KEYFILES = {
2462
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2463
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2464
  }
2465

    
2466
# Node daemon setup
2467
NDS_CLUSTER_NAME = "cluster_name"
2468
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2469
NDS_SSCONF = "ssconf"
2470
NDS_START_NODE_DAEMON = "start_node_daemon"
2471

    
2472
# Path generating random UUID
2473
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2474

    
2475
# Regex string for verifying a UUID
2476
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2477

    
2478
# Auto-repair tag prefixes
2479
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2480
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2481
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2482
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2483
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2484

    
2485
# Auto-repair levels
2486
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2487
AUTO_REPAIR_MIGRATE = "migrate"
2488
AUTO_REPAIR_FAILOVER = "failover"
2489
AUTO_REPAIR_REINSTALL = "reinstall"
2490
AUTO_REPAIR_ALL_TYPES = [
2491
  AUTO_REPAIR_FIX_STORAGE,
2492
  AUTO_REPAIR_MIGRATE,
2493
  AUTO_REPAIR_FAILOVER,
2494
  AUTO_REPAIR_REINSTALL,
2495
]
2496

    
2497
# Auto-repair results
2498
AUTO_REPAIR_SUCCESS = "success"
2499
AUTO_REPAIR_FAILURE = "failure"
2500
AUTO_REPAIR_ENOPERM = "enoperm"
2501
AUTO_REPAIR_ALL_RESULTS = frozenset([
2502
    AUTO_REPAIR_SUCCESS,
2503
    AUTO_REPAIR_FAILURE,
2504
    AUTO_REPAIR_ENOPERM,
2505
])
2506

    
2507
# The version identifier for builtin data collectors
2508
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2509

    
2510
# The reason trail opcode parameter name
2511
OPCODE_REASON = "reason"
2512

    
2513
# The source reasons for the execution of an OpCode
2514
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2515
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2516
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2517
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2518
OPCODE_REASON_SRC_USER = "gnt:user"
2519

    
2520
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2521
  OPCODE_REASON_SRC_CLIENT,
2522
  OPCODE_REASON_SRC_NODED,
2523
  OPCODE_REASON_SRC_OPCODE,
2524
  OPCODE_REASON_SRC_RLIB2,
2525
  OPCODE_REASON_SRC_USER,
2526
  ])
2527

    
2528
DISKSTATS_FILE = "/proc/diskstats"
2529

    
2530
# Do not re-export imported modules
2531
del re, _vcsversion, _autoconf, socket, pathutils, compat