Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 2522c59e

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
320
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
321

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

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

    
334
IE_CUSTOM_SIZE = "fd"
335

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
536
# the set of disk templates that are supported by exclusive_storage
537
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
538

    
539
# templates for which we don't perform checks on free space
540
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
541
  DT_FILE,
542
  DT_SHARED_FILE,
543
  DT_RBD,
544
  DT_EXT,
545
  ])
546

    
547
# logical disk types
548
LD_LV = "lvm"
549
LD_DRBD8 = "drbd8"
550
LD_FILE = "file"
551
LD_BLOCKDEV = "blockdev"
552
LD_RBD = "rbd"
553
LD_EXT = "ext"
554
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
555
  LD_LV,
556
  LD_DRBD8,
557
  LD_FILE,
558
  LD_BLOCKDEV,
559
  LD_RBD,
560
  LD_EXT,
561
  ])
562

    
563
LDS_BLOCK = compat.UniqueFrozenset([
564
  LD_LV,
565
  LD_DRBD8,
566
  LD_BLOCKDEV,
567
  LD_RBD,
568
  LD_EXT,
569
  ])
570

    
571
# drbd constants
572
DRBD_HMAC_ALG = "md5"
573
DRBD_NET_PROTOCOL = "C"
574
DRBD_STATUS_FILE = "/proc/drbd"
575

    
576
#: Size of DRBD meta block device
577
DRBD_META_SIZE = 128
578

    
579
# drbd barrier types
580
DRBD_B_NONE = "n"
581
DRBD_B_DISK_BARRIERS = "b"
582
DRBD_B_DISK_DRAIN = "d"
583
DRBD_B_DISK_FLUSH = "f"
584

    
585
# Valid barrier combinations: "n" or any non-null subset of "bfd"
586
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
587
  frozenset([DRBD_B_NONE]),
588
  frozenset([DRBD_B_DISK_BARRIERS]),
589
  frozenset([DRBD_B_DISK_DRAIN]),
590
  frozenset([DRBD_B_DISK_FLUSH]),
591
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
592
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
593
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
594
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
595
  ])
596

    
597
# rbd tool command
598
RBD_CMD = "rbd"
599

    
600
# file backend driver
601
FD_LOOP = "loop"
602
FD_BLKTAP = "blktap"
603

    
604
# the set of drbd-like disk types
605
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
606

    
607
# disk access mode
608
DISK_RDONLY = "ro"
609
DISK_RDWR = "rw"
610
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
611

    
612
# disk replacement mode
613
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
614
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
615
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
616
REPLACE_DISK_AUTO = "replace_auto"
617
REPLACE_MODES = compat.UniqueFrozenset([
618
  REPLACE_DISK_PRI,
619
  REPLACE_DISK_SEC,
620
  REPLACE_DISK_CHG,
621
  REPLACE_DISK_AUTO,
622
  ])
623

    
624
# Instance export mode
625
EXPORT_MODE_LOCAL = "local"
626
EXPORT_MODE_REMOTE = "remote"
627
EXPORT_MODES = compat.UniqueFrozenset([
628
  EXPORT_MODE_LOCAL,
629
  EXPORT_MODE_REMOTE,
630
  ])
631

    
632
# instance creation modes
633
INSTANCE_CREATE = "create"
634
INSTANCE_IMPORT = "import"
635
INSTANCE_REMOTE_IMPORT = "remote-import"
636
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
637
  INSTANCE_CREATE,
638
  INSTANCE_IMPORT,
639
  INSTANCE_REMOTE_IMPORT,
640
  ])
641

    
642
# Remote import/export handshake message and version
643
RIE_VERSION = 0
644
RIE_HANDSHAKE = "Hi, I'm Ganeti"
645

    
646
# Remote import/export certificate validity in seconds
647
RIE_CERT_VALIDITY = 24 * 60 * 60
648

    
649
# Overall timeout for establishing connection
650
RIE_CONNECT_TIMEOUT = 180
651

    
652
# Export only: how long to wait per connection attempt (seconds)
653
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
654

    
655
# Export only: number of attempts to connect
656
RIE_CONNECT_RETRIES = 10
657

    
658
#: Give child process up to 5 seconds to exit after sending a signal
659
CHILD_LINGER_TIMEOUT = 5.0
660

    
661
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
662

    
663
# import/export config options
664
INISECT_EXP = "export"
665
INISECT_INS = "instance"
666
INISECT_HYP = "hypervisor"
667
INISECT_BEP = "backend"
668
INISECT_OSP = "os"
669

    
670
# dynamic device modification
671
DDM_ADD = "add"
672
DDM_MODIFY = "modify"
673
DDM_REMOVE = "remove"
674
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
675
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
676
  DDM_MODIFY,
677
  ]))
678
# TODO: DDM_SWAP, DDM_MOVE?
679

    
680
# common exit codes
681
EXIT_SUCCESS = 0
682
EXIT_FAILURE = 1
683
EXIT_NOTCLUSTER = 5
684
EXIT_NOTMASTER = 11
685
EXIT_NODESETUP_ERROR = 12
686
EXIT_CONFIRMATION = 13 # need user confirmation
687

    
688
#: Exit code for query operations with unknown fields
689
EXIT_UNKNOWN_FIELD = 14
690

    
691
# tags
692
TAG_CLUSTER = "cluster"
693
TAG_NODEGROUP = "nodegroup"
694
TAG_NODE = "node"
695
TAG_INSTANCE = "instance"
696
TAG_NETWORK = "network"
697
VALID_TAG_TYPES = compat.UniqueFrozenset([
698
  TAG_CLUSTER,
699
  TAG_NODEGROUP,
700
  TAG_NODE,
701
  TAG_INSTANCE,
702
  TAG_NETWORK,
703
  ])
704
MAX_TAG_LEN = 128
705
MAX_TAGS_PER_OBJ = 4096
706

    
707
# others
708
DEFAULT_BRIDGE = "xen-br0"
709
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
710
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
711
IP4_ADDRESS_ANY = "0.0.0.0"
712
IP6_ADDRESS_LOCALHOST = "::1"
713
IP6_ADDRESS_ANY = "::"
714
IP4_VERSION = 4
715
IP6_VERSION = 6
716
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
717
# for export to htools
718
IP4_FAMILY = socket.AF_INET
719
IP6_FAMILY = socket.AF_INET6
720

    
721
TCP_PING_TIMEOUT = 10
722
DEFAULT_VG = "xenvg"
723
DEFAULT_DRBD_HELPER = "/bin/true"
724
MIN_VG_SIZE = 20480
725
DEFAULT_MAC_PREFIX = "aa:00:00"
726
# default maximum instance wait time, in seconds.
727
DEFAULT_SHUTDOWN_TIMEOUT = 120
728
NODE_MAX_CLOCK_SKEW = 150
729
# Time for an intra-cluster disk transfer to wait for a connection
730
DISK_TRANSFER_CONNECT_TIMEOUT = 60
731
# Disk index separator
732
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
733
IP_COMMAND_PATH = _autoconf.IP_PATH
734

    
735
#: Key for job IDs in opcode result
736
JOB_IDS_KEY = "jobs"
737

    
738
# runparts results
739
(RUNPARTS_SKIP,
740
 RUNPARTS_RUN,
741
 RUNPARTS_ERR) = range(3)
742

    
743
RUNPARTS_STATUS = compat.UniqueFrozenset([
744
  RUNPARTS_SKIP,
745
  RUNPARTS_RUN,
746
  RUNPARTS_ERR,
747
  ])
748

    
749
# RPC constants
750
(RPC_ENCODING_NONE,
751
 RPC_ENCODING_ZLIB_BASE64) = range(2)
752

    
753
# Various time constants for the timeout table
754
RPC_TMO_URGENT = 60 # one minute
755
RPC_TMO_FAST = 5 * 60 # five minutes
756
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
757
RPC_TMO_SLOW = 3600 # one hour
758
RPC_TMO_4HRS = 4 * 3600
759
RPC_TMO_1DAY = 86400
760

    
761
# Timeout for connecting to nodes (seconds)
762
RPC_CONNECT_TIMEOUT = 5
763

    
764
# os related constants
765
OS_SCRIPT_CREATE = "create"
766
OS_SCRIPT_IMPORT = "import"
767
OS_SCRIPT_EXPORT = "export"
768
OS_SCRIPT_RENAME = "rename"
769
OS_SCRIPT_VERIFY = "verify"
770
OS_SCRIPTS = compat.UniqueFrozenset([
771
  OS_SCRIPT_CREATE,
772
  OS_SCRIPT_IMPORT,
773
  OS_SCRIPT_EXPORT,
774
  OS_SCRIPT_RENAME,
775
  OS_SCRIPT_VERIFY,
776
  ])
777

    
778
OS_API_FILE = "ganeti_api_version"
779
OS_VARIANTS_FILE = "variants.list"
780
OS_PARAMETERS_FILE = "parameters.list"
781

    
782
OS_VALIDATE_PARAMETERS = "parameters"
783
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
784

    
785
# External Storage (ES) related constants
786
ES_ACTION_CREATE = "create"
787
ES_ACTION_REMOVE = "remove"
788
ES_ACTION_GROW = "grow"
789
ES_ACTION_ATTACH = "attach"
790
ES_ACTION_DETACH = "detach"
791
ES_ACTION_SETINFO = "setinfo"
792
ES_ACTION_VERIFY = "verify"
793

    
794
ES_SCRIPT_CREATE = ES_ACTION_CREATE
795
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
796
ES_SCRIPT_GROW = ES_ACTION_GROW
797
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
798
ES_SCRIPT_DETACH = ES_ACTION_DETACH
799
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
800
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
801
ES_SCRIPTS = frozenset([
802
  ES_SCRIPT_CREATE,
803
  ES_SCRIPT_REMOVE,
804
  ES_SCRIPT_GROW,
805
  ES_SCRIPT_ATTACH,
806
  ES_SCRIPT_DETACH,
807
  ES_SCRIPT_SETINFO,
808
  ES_SCRIPT_VERIFY
809
  ])
810

    
811
ES_PARAMETERS_FILE = "parameters.list"
812

    
813
# reboot types
814
INSTANCE_REBOOT_SOFT = "soft"
815
INSTANCE_REBOOT_HARD = "hard"
816
INSTANCE_REBOOT_FULL = "full"
817

    
818
REBOOT_TYPES = compat.UniqueFrozenset([
819
  INSTANCE_REBOOT_SOFT,
820
  INSTANCE_REBOOT_HARD,
821
  INSTANCE_REBOOT_FULL,
822
  ])
823

    
824
# instance reboot behaviors
825
INSTANCE_REBOOT_ALLOWED = "reboot"
826
INSTANCE_REBOOT_EXIT = "exit"
827

    
828
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
829
  INSTANCE_REBOOT_ALLOWED,
830
  INSTANCE_REBOOT_EXIT,
831
  ])
832

    
833
VTYPE_STRING = "string"
834
VTYPE_MAYBE_STRING = "maybe-string"
835
VTYPE_BOOL = "bool"
836
VTYPE_SIZE = "size" # size, in MiBs
837
VTYPE_INT = "int"
838
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
839
  VTYPE_STRING,
840
  VTYPE_MAYBE_STRING,
841
  VTYPE_BOOL,
842
  VTYPE_SIZE,
843
  VTYPE_INT,
844
  ])
845

    
846
# Constant representing that the user does not specify any IP version
847
IFACE_NO_IP_VERSION_SPECIFIED = 0
848

    
849
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
850
  75,
851
  110,
852
  300,
853
  600,
854
  1200,
855
  1800,
856
  2400,
857
  4800,
858
  9600,
859
  14400,
860
  19200,
861
  28800,
862
  38400,
863
  57600,
864
  115200,
865
  230400,
866
  345600,
867
  460800,
868
  ])
869

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

    
938

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

    
1008
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1009

    
1010
HVS_PARAMETER_TITLES = {
1011
  HV_ACPI: "ACPI",
1012
  HV_BOOT_ORDER: "Boot_order",
1013
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1014
  HV_DISK_TYPE: "Disk_type",
1015
  HV_INITRD_PATH: "Initrd_path",
1016
  HV_KERNEL_PATH: "Kernel_path",
1017
  HV_NIC_TYPE: "NIC_type",
1018
  HV_PAE: "PAE",
1019
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1020
  HV_PASSTHROUGH: "pci_pass",
1021
  HV_CPU_TYPE: "cpu_type",
1022
  }
1023

    
1024
# Migration statuses
1025
HV_MIGRATION_COMPLETED = "completed"
1026
HV_MIGRATION_ACTIVE = "active"
1027
HV_MIGRATION_FAILED = "failed"
1028
HV_MIGRATION_CANCELLED = "cancelled"
1029

    
1030
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1031
  HV_MIGRATION_COMPLETED,
1032
  HV_MIGRATION_ACTIVE,
1033
  HV_MIGRATION_FAILED,
1034
  HV_MIGRATION_CANCELLED,
1035
  ])
1036

    
1037
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1038
  HV_MIGRATION_FAILED,
1039
  HV_MIGRATION_CANCELLED,
1040
  ])
1041

    
1042
# KVM-specific statuses
1043
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1044

    
1045
# Node info keys
1046
HV_NODEINFO_KEY_VERSION = "hv_version"
1047

    
1048
# Hypervisor state
1049
HVST_MEMORY_TOTAL = "mem_total"
1050
HVST_MEMORY_NODE = "mem_node"
1051
HVST_MEMORY_HV = "mem_hv"
1052
HVST_CPU_TOTAL = "cpu_total"
1053
HVST_CPU_NODE = "cpu_node"
1054

    
1055
HVST_DEFAULTS = {
1056
  HVST_MEMORY_TOTAL: 0,
1057
  HVST_MEMORY_NODE: 0,
1058
  HVST_MEMORY_HV: 0,
1059
  HVST_CPU_TOTAL: 1,
1060
  HVST_CPU_NODE: 1,
1061
  }
1062

    
1063
HVSTS_PARAMETER_TYPES = {
1064
  HVST_MEMORY_TOTAL: VTYPE_INT,
1065
  HVST_MEMORY_NODE: VTYPE_INT,
1066
  HVST_MEMORY_HV: VTYPE_INT,
1067
  HVST_CPU_TOTAL: VTYPE_INT,
1068
  HVST_CPU_NODE: VTYPE_INT,
1069
  }
1070

    
1071
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1072

    
1073
# Disk state
1074
DS_DISK_TOTAL = "disk_total"
1075
DS_DISK_RESERVED = "disk_reserved"
1076
DS_DISK_OVERHEAD = "disk_overhead"
1077

    
1078
DS_DEFAULTS = {
1079
  DS_DISK_TOTAL: 0,
1080
  DS_DISK_RESERVED: 0,
1081
  DS_DISK_OVERHEAD: 0,
1082
  }
1083

    
1084
DSS_PARAMETER_TYPES = {
1085
  DS_DISK_TOTAL: VTYPE_INT,
1086
  DS_DISK_RESERVED: VTYPE_INT,
1087
  DS_DISK_OVERHEAD: VTYPE_INT,
1088
  }
1089

    
1090
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1091
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1092

    
1093
# Backend parameter names
1094
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1095
BE_MAXMEM = "maxmem"
1096
BE_MINMEM = "minmem"
1097
BE_VCPUS = "vcpus"
1098
BE_AUTO_BALANCE = "auto_balance"
1099
BE_ALWAYS_FAILOVER = "always_failover"
1100
BE_SPINDLE_USE = "spindle_use"
1101

    
1102
BES_PARAMETER_TYPES = {
1103
  BE_MAXMEM: VTYPE_SIZE,
1104
  BE_MINMEM: VTYPE_SIZE,
1105
  BE_VCPUS: VTYPE_INT,
1106
  BE_AUTO_BALANCE: VTYPE_BOOL,
1107
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1108
  BE_SPINDLE_USE: VTYPE_INT,
1109
  }
1110

    
1111
BES_PARAMETER_TITLES = {
1112
  BE_AUTO_BALANCE: "Auto_balance",
1113
  BE_MAXMEM: "ConfigMaxMem",
1114
  BE_MINMEM: "ConfigMinMem",
1115
  BE_VCPUS: "ConfigVCPUs",
1116
  }
1117

    
1118
BES_PARAMETER_COMPAT = {
1119
  BE_MEMORY: VTYPE_SIZE,
1120
  }
1121
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1122

    
1123
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1124

    
1125
# instance specs
1126
ISPEC_MEM_SIZE = "memory-size"
1127
ISPEC_CPU_COUNT = "cpu-count"
1128
ISPEC_DISK_COUNT = "disk-count"
1129
ISPEC_DISK_SIZE = "disk-size"
1130
ISPEC_NIC_COUNT = "nic-count"
1131
ISPEC_SPINDLE_USE = "spindle-use"
1132

    
1133
ISPECS_PARAMETER_TYPES = {
1134
  ISPEC_MEM_SIZE: VTYPE_INT,
1135
  ISPEC_CPU_COUNT: VTYPE_INT,
1136
  ISPEC_DISK_COUNT: VTYPE_INT,
1137
  ISPEC_DISK_SIZE: VTYPE_INT,
1138
  ISPEC_NIC_COUNT: VTYPE_INT,
1139
  ISPEC_SPINDLE_USE: VTYPE_INT,
1140
  }
1141

    
1142
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1143

    
1144
ISPECS_MINMAX = "minmax"
1145
ISPECS_MIN = "min"
1146
ISPECS_MAX = "max"
1147
ISPECS_STD = "std"
1148
IPOLICY_DTS = "disk-templates"
1149
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1150
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1151

    
1152
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1153
  ISPECS_MIN,
1154
  ISPECS_MAX,
1155
  ])
1156

    
1157
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1158
  IPOLICY_VCPU_RATIO,
1159
  IPOLICY_SPINDLE_RATIO,
1160
  ])
1161

    
1162
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1163
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1164

    
1165
# Node parameter names
1166
ND_OOB_PROGRAM = "oob_program"
1167
ND_SPINDLE_COUNT = "spindle_count"
1168
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1169

    
1170
NDS_PARAMETER_TYPES = {
1171
  ND_OOB_PROGRAM: VTYPE_STRING,
1172
  ND_SPINDLE_COUNT: VTYPE_INT,
1173
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1174
  }
1175

    
1176
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1177

    
1178
NDS_PARAMETER_TITLES = {
1179
  ND_OOB_PROGRAM: "OutOfBandProgram",
1180
  ND_SPINDLE_COUNT: "SpindleCount",
1181
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1182
  }
1183

    
1184
# Logical Disks parameters
1185
LDP_RESYNC_RATE = "resync-rate"
1186
LDP_STRIPES = "stripes"
1187
LDP_BARRIERS = "disabled-barriers"
1188
LDP_NO_META_FLUSH = "disable-meta-flush"
1189
LDP_DEFAULT_METAVG = "default-metavg"
1190
LDP_DISK_CUSTOM = "disk-custom"
1191
LDP_NET_CUSTOM = "net-custom"
1192
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1193
LDP_PLAN_AHEAD = "c-plan-ahead"
1194
LDP_FILL_TARGET = "c-fill-target"
1195
LDP_DELAY_TARGET = "c-delay-target"
1196
LDP_MAX_RATE = "c-max-rate"
1197
LDP_MIN_RATE = "c-min-rate"
1198
LDP_POOL = "pool"
1199
DISK_LD_TYPES = {
1200
  LDP_RESYNC_RATE: VTYPE_INT,
1201
  LDP_STRIPES: VTYPE_INT,
1202
  LDP_BARRIERS: VTYPE_STRING,
1203
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1204
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1205
  LDP_DISK_CUSTOM: VTYPE_STRING,
1206
  LDP_NET_CUSTOM: VTYPE_STRING,
1207
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1208
  LDP_PLAN_AHEAD: VTYPE_INT,
1209
  LDP_FILL_TARGET: VTYPE_INT,
1210
  LDP_DELAY_TARGET: VTYPE_INT,
1211
  LDP_MAX_RATE: VTYPE_INT,
1212
  LDP_MIN_RATE: VTYPE_INT,
1213
  LDP_POOL: VTYPE_STRING,
1214
  }
1215
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1216

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

    
1254
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1255

    
1256
# OOB supported commands
1257
OOB_POWER_ON = "power-on"
1258
OOB_POWER_OFF = "power-off"
1259
OOB_POWER_CYCLE = "power-cycle"
1260
OOB_POWER_STATUS = "power-status"
1261
OOB_HEALTH = "health"
1262

    
1263
OOB_COMMANDS = compat.UniqueFrozenset([
1264
  OOB_POWER_ON,
1265
  OOB_POWER_OFF,
1266
  OOB_POWER_CYCLE,
1267
  OOB_POWER_STATUS,
1268
  OOB_HEALTH,
1269
  ])
1270

    
1271
OOB_POWER_STATUS_POWERED = "powered"
1272

    
1273
OOB_TIMEOUT = 60 # 60 seconds
1274
OOB_POWER_DELAY = 2.0 # 2 seconds
1275

    
1276
OOB_STATUS_OK = "OK"
1277
OOB_STATUS_WARNING = "WARNING"
1278
OOB_STATUS_CRITICAL = "CRITICAL"
1279
OOB_STATUS_UNKNOWN = "UNKNOWN"
1280

    
1281
OOB_STATUSES = compat.UniqueFrozenset([
1282
  OOB_STATUS_OK,
1283
  OOB_STATUS_WARNING,
1284
  OOB_STATUS_CRITICAL,
1285
  OOB_STATUS_UNKNOWN,
1286
  ])
1287

    
1288
# Instance Parameters Profile
1289
PP_DEFAULT = "default"
1290

    
1291
# NIC_* constants are used inside the ganeti config
1292
NIC_MODE = "mode"
1293
NIC_LINK = "link"
1294

    
1295
NIC_MODE_BRIDGED = "bridged"
1296
NIC_MODE_ROUTED = "routed"
1297
NIC_MODE_OVS = "openvswitch"
1298
NIC_IP_POOL = "pool"
1299

    
1300
NIC_VALID_MODES = compat.UniqueFrozenset([
1301
  NIC_MODE_BRIDGED,
1302
  NIC_MODE_ROUTED,
1303
  NIC_MODE_OVS,
1304
  ])
1305

    
1306
RESERVE_ACTION = "reserve"
1307
RELEASE_ACTION = "release"
1308

    
1309
NICS_PARAMETER_TYPES = {
1310
  NIC_MODE: VTYPE_STRING,
1311
  NIC_LINK: VTYPE_STRING,
1312
  }
1313

    
1314
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1315

    
1316
# IDISK_* constants are used in opcodes, to create/change disks
1317
IDISK_SIZE = "size"
1318
IDISK_MODE = "mode"
1319
IDISK_ADOPT = "adopt"
1320
IDISK_VG = "vg"
1321
IDISK_METAVG = "metavg"
1322
IDISK_PROVIDER = "provider"
1323
IDISK_PARAMS_TYPES = {
1324
  IDISK_SIZE: VTYPE_SIZE,
1325
  IDISK_MODE: VTYPE_STRING,
1326
  IDISK_ADOPT: VTYPE_STRING,
1327
  IDISK_VG: VTYPE_STRING,
1328
  IDISK_METAVG: VTYPE_STRING,
1329
  IDISK_PROVIDER: VTYPE_STRING,
1330
  }
1331
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1332

    
1333
# INIC_* constants are used in opcodes, to create/change nics
1334
INIC_MAC = "mac"
1335
INIC_IP = "ip"
1336
INIC_MODE = "mode"
1337
INIC_LINK = "link"
1338
INIC_NETWORK = "network"
1339
INIC_PARAMS_TYPES = {
1340
  INIC_IP: VTYPE_MAYBE_STRING,
1341
  INIC_LINK: VTYPE_STRING,
1342
  INIC_MAC: VTYPE_STRING,
1343
  INIC_MODE: VTYPE_STRING,
1344
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1345
  }
1346
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1347

    
1348
# Hypervisor constants
1349
HT_XEN_PVM = "xen-pvm"
1350
HT_FAKE = "fake"
1351
HT_XEN_HVM = "xen-hvm"
1352
HT_KVM = "kvm"
1353
HT_CHROOT = "chroot"
1354
HT_LXC = "lxc"
1355
HYPER_TYPES = compat.UniqueFrozenset([
1356
  HT_XEN_PVM,
1357
  HT_FAKE,
1358
  HT_XEN_HVM,
1359
  HT_KVM,
1360
  HT_CHROOT,
1361
  HT_LXC,
1362
  ])
1363
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1364

    
1365
VNC_BASE_PORT = 5900
1366
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1367

    
1368
# NIC types
1369
HT_NIC_RTL8139 = "rtl8139"
1370
HT_NIC_NE2K_PCI = "ne2k_pci"
1371
HT_NIC_NE2K_ISA = "ne2k_isa"
1372
HT_NIC_I82551 = "i82551"
1373
HT_NIC_I85557B = "i82557b"
1374
HT_NIC_I8259ER = "i82559er"
1375
HT_NIC_PCNET = "pcnet"
1376
HT_NIC_E1000 = "e1000"
1377
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1378

    
1379
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1380
  HT_NIC_RTL8139,
1381
  HT_NIC_NE2K_PCI,
1382
  HT_NIC_E1000,
1383
  HT_NIC_NE2K_ISA,
1384
  HT_NIC_PARAVIRTUAL,
1385
  ])
1386
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1387
  HT_NIC_RTL8139,
1388
  HT_NIC_NE2K_PCI,
1389
  HT_NIC_NE2K_ISA,
1390
  HT_NIC_I82551,
1391
  HT_NIC_I85557B,
1392
  HT_NIC_I8259ER,
1393
  HT_NIC_PCNET,
1394
  HT_NIC_E1000,
1395
  HT_NIC_PARAVIRTUAL,
1396
  ])
1397

    
1398
# Disk types
1399
HT_DISK_IOEMU = "ioemu"
1400
HT_DISK_IDE = "ide"
1401
HT_DISK_SCSI = "scsi"
1402
HT_DISK_SD = "sd"
1403
HT_DISK_MTD = "mtd"
1404
HT_DISK_PFLASH = "pflash"
1405

    
1406
HT_CACHE_DEFAULT = "default"
1407
HT_CACHE_NONE = "none"
1408
HT_CACHE_WTHROUGH = "writethrough"
1409
HT_CACHE_WBACK = "writeback"
1410
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1411
  HT_CACHE_DEFAULT,
1412
  HT_CACHE_NONE,
1413
  HT_CACHE_WTHROUGH,
1414
  HT_CACHE_WBACK,
1415
  ])
1416

    
1417
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1418
  HT_DISK_PARAVIRTUAL,
1419
  HT_DISK_IOEMU,
1420
  ])
1421
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1422
  HT_DISK_PARAVIRTUAL,
1423
  HT_DISK_IDE,
1424
  HT_DISK_SCSI,
1425
  HT_DISK_SD,
1426
  HT_DISK_MTD,
1427
  HT_DISK_PFLASH,
1428
  ])
1429

    
1430
# Mouse types:
1431
HT_MOUSE_MOUSE = "mouse"
1432
HT_MOUSE_TABLET = "tablet"
1433

    
1434
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1435
  HT_MOUSE_MOUSE,
1436
  HT_MOUSE_TABLET,
1437
  ])
1438

    
1439
# Boot order
1440
HT_BO_FLOPPY = "floppy"
1441
HT_BO_CDROM = "cdrom"
1442
HT_BO_DISK = "disk"
1443
HT_BO_NETWORK = "network"
1444

    
1445
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1446
  HT_BO_FLOPPY,
1447
  HT_BO_CDROM,
1448
  HT_BO_DISK,
1449
  HT_BO_NETWORK,
1450
  ])
1451

    
1452
# SPICE lossless image compression options
1453
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1454
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1455
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1456
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1457
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1458
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1459

    
1460
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1461
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1462
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1463
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1464
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1465
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1466
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1467
  ])
1468

    
1469
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1470
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1471
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1472
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1473

    
1474
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1475
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1476
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1477
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1478
  ])
1479

    
1480
# SPICE video stream detection
1481
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1482
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1483
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1484

    
1485
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1486
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1487
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1488
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1489
  ])
1490

    
1491
# Security models
1492
HT_SM_NONE = "none"
1493
HT_SM_USER = "user"
1494
HT_SM_POOL = "pool"
1495

    
1496
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1497
  HT_SM_NONE,
1498
  HT_SM_USER,
1499
  HT_SM_POOL,
1500
  ])
1501

    
1502
# Kvm flag values
1503
HT_KVM_ENABLED = "enabled"
1504
HT_KVM_DISABLED = "disabled"
1505

    
1506
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1507

    
1508
# Migration type
1509
HT_MIGRATION_LIVE = "live"
1510
HT_MIGRATION_NONLIVE = "non-live"
1511
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1512
  HT_MIGRATION_LIVE,
1513
  HT_MIGRATION_NONLIVE,
1514
  ])
1515

    
1516
# Cluster Verify steps
1517
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1518
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1519

    
1520
# Cluster Verify error classes
1521
CV_TCLUSTER = "cluster"
1522
CV_TGROUP = "group"
1523
CV_TNODE = "node"
1524
CV_TINSTANCE = "instance"
1525

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

    
1608
CV_ALL_ECODES = compat.UniqueFrozenset([
1609
  CV_ECLUSTERCFG,
1610
  CV_ECLUSTERCERT,
1611
  CV_ECLUSTERFILECHECK,
1612
  CV_ECLUSTERDANGLINGNODES,
1613
  CV_ECLUSTERDANGLINGINST,
1614
  CV_EINSTANCEBADNODE,
1615
  CV_EINSTANCEDOWN,
1616
  CV_EINSTANCELAYOUT,
1617
  CV_EINSTANCEMISSINGDISK,
1618
  CV_EINSTANCEFAULTYDISK,
1619
  CV_EINSTANCEWRONGNODE,
1620
  CV_EINSTANCESPLITGROUPS,
1621
  CV_EINSTANCEPOLICY,
1622
  CV_ENODEDRBD,
1623
  CV_ENODEDRBDHELPER,
1624
  CV_ENODEFILECHECK,
1625
  CV_ENODEHOOKS,
1626
  CV_ENODEHV,
1627
  CV_ENODELVM,
1628
  CV_ENODEN1,
1629
  CV_ENODENET,
1630
  CV_ENODEOS,
1631
  CV_ENODEORPHANINSTANCE,
1632
  CV_ENODEORPHANLV,
1633
  CV_ENODERPC,
1634
  CV_ENODESSH,
1635
  CV_ENODEVERSION,
1636
  CV_ENODESETUP,
1637
  CV_ENODETIME,
1638
  CV_ENODEOOBPATH,
1639
  CV_ENODEUSERSCRIPTS,
1640
  CV_ENODEFILESTORAGEPATHS,
1641
  ])
1642

    
1643
CV_ALL_ECODES_STRINGS = \
1644
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1645

    
1646
# Node verify constants
1647
NV_BRIDGES = "bridges"
1648
NV_DRBDHELPER = "drbd-helper"
1649
NV_DRBDLIST = "drbd-list"
1650
NV_EXCLUSIVEPVS = "exclusive-pvs"
1651
NV_FILELIST = "filelist"
1652
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1653
NV_HVINFO = "hvinfo"
1654
NV_HVPARAMS = "hvparms"
1655
NV_HYPERVISOR = "hypervisor"
1656
NV_INSTANCELIST = "instancelist"
1657
NV_LVLIST = "lvlist"
1658
NV_MASTERIP = "master-ip"
1659
NV_NODELIST = "nodelist"
1660
NV_NODENETTEST = "node-net-test"
1661
NV_NODESETUP = "nodesetup"
1662
NV_OOB_PATHS = "oob-paths"
1663
NV_OSLIST = "oslist"
1664
NV_PVLIST = "pvlist"
1665
NV_TIME = "time"
1666
NV_USERSCRIPTS = "user-scripts"
1667
NV_VERSION = "version"
1668
NV_VGLIST = "vglist"
1669
NV_VMNODES = "vmnodes"
1670

    
1671
# Instance status
1672
INSTST_RUNNING = "running"
1673
INSTST_ADMINDOWN = "ADMIN_down"
1674
INSTST_ADMINOFFLINE = "ADMIN_offline"
1675
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1676
INSTST_NODEDOWN = "ERROR_nodedown"
1677
INSTST_WRONGNODE = "ERROR_wrongnode"
1678
INSTST_ERRORUP = "ERROR_up"
1679
INSTST_ERRORDOWN = "ERROR_down"
1680
INSTST_ALL = compat.UniqueFrozenset([
1681
  INSTST_RUNNING,
1682
  INSTST_ADMINDOWN,
1683
  INSTST_ADMINOFFLINE,
1684
  INSTST_NODEOFFLINE,
1685
  INSTST_NODEDOWN,
1686
  INSTST_WRONGNODE,
1687
  INSTST_ERRORUP,
1688
  INSTST_ERRORDOWN,
1689
  ])
1690

    
1691
# Admin states
1692
ADMINST_UP = "up"
1693
ADMINST_DOWN = "down"
1694
ADMINST_OFFLINE = "offline"
1695
ADMINST_ALL = compat.UniqueFrozenset([
1696
  ADMINST_UP,
1697
  ADMINST_DOWN,
1698
  ADMINST_OFFLINE,
1699
  ])
1700

    
1701
# Node roles
1702
NR_REGULAR = "R"
1703
NR_MASTER = "M"
1704
NR_MCANDIDATE = "C"
1705
NR_DRAINED = "D"
1706
NR_OFFLINE = "O"
1707
NR_ALL = compat.UniqueFrozenset([
1708
  NR_REGULAR,
1709
  NR_MASTER,
1710
  NR_MCANDIDATE,
1711
  NR_DRAINED,
1712
  NR_OFFLINE,
1713
  ])
1714

    
1715
# SSL certificate check constants (in days)
1716
SSL_CERT_EXPIRATION_WARN = 30
1717
SSL_CERT_EXPIRATION_ERROR = 7
1718

    
1719
# Allocator framework constants
1720
IALLOCATOR_VERSION = 2
1721
IALLOCATOR_DIR_IN = "in"
1722
IALLOCATOR_DIR_OUT = "out"
1723
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1724
  IALLOCATOR_DIR_IN,
1725
  IALLOCATOR_DIR_OUT,
1726
  ])
1727
IALLOCATOR_MODE_ALLOC = "allocate"
1728
IALLOCATOR_MODE_RELOC = "relocate"
1729
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1730
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1731
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1732
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1733
  IALLOCATOR_MODE_ALLOC,
1734
  IALLOCATOR_MODE_RELOC,
1735
  IALLOCATOR_MODE_CHG_GROUP,
1736
  IALLOCATOR_MODE_NODE_EVAC,
1737
  IALLOCATOR_MODE_MULTI_ALLOC,
1738
  ])
1739
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1740
DEFAULT_IALLOCATOR_SHORTCUT = "."
1741

    
1742
IALLOCATOR_NEVAC_PRI = "primary-only"
1743
IALLOCATOR_NEVAC_SEC = "secondary-only"
1744
IALLOCATOR_NEVAC_ALL = "all"
1745
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1746
  IALLOCATOR_NEVAC_PRI,
1747
  IALLOCATOR_NEVAC_SEC,
1748
  IALLOCATOR_NEVAC_ALL,
1749
  ])
1750

    
1751
# Node evacuation
1752
NODE_EVAC_PRI = "primary-only"
1753
NODE_EVAC_SEC = "secondary-only"
1754
NODE_EVAC_ALL = "all"
1755
NODE_EVAC_MODES = compat.UniqueFrozenset([
1756
  NODE_EVAC_PRI,
1757
  NODE_EVAC_SEC,
1758
  NODE_EVAC_ALL,
1759
  ])
1760

    
1761
# Job queue
1762
JOB_QUEUE_VERSION = 1
1763
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1764

    
1765
JOB_ID_TEMPLATE = r"\d+"
1766
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1767

    
1768
# unchanged job return
1769
JOB_NOTCHANGED = "nochange"
1770

    
1771
# Job status
1772
JOB_STATUS_QUEUED = "queued"
1773
JOB_STATUS_WAITING = "waiting"
1774
JOB_STATUS_CANCELING = "canceling"
1775
JOB_STATUS_RUNNING = "running"
1776
JOB_STATUS_CANCELED = "canceled"
1777
JOB_STATUS_SUCCESS = "success"
1778
JOB_STATUS_ERROR = "error"
1779
JOBS_PENDING = compat.UniqueFrozenset([
1780
  JOB_STATUS_QUEUED,
1781
  JOB_STATUS_WAITING,
1782
  JOB_STATUS_CANCELING,
1783
  ])
1784
JOBS_FINALIZED = compat.UniqueFrozenset([
1785
  JOB_STATUS_CANCELED,
1786
  JOB_STATUS_SUCCESS,
1787
  JOB_STATUS_ERROR,
1788
  ])
1789
JOB_STATUS_ALL = compat.UniqueFrozenset([
1790
  JOB_STATUS_RUNNING,
1791
  ]) | JOBS_PENDING | JOBS_FINALIZED
1792

    
1793
# OpCode status
1794
# not yet finalized
1795
OP_STATUS_QUEUED = "queued"
1796
OP_STATUS_WAITING = "waiting"
1797
OP_STATUS_CANCELING = "canceling"
1798
OP_STATUS_RUNNING = "running"
1799
# finalized
1800
OP_STATUS_CANCELED = "canceled"
1801
OP_STATUS_SUCCESS = "success"
1802
OP_STATUS_ERROR = "error"
1803
OPS_FINALIZED = compat.UniqueFrozenset([
1804
  OP_STATUS_CANCELED,
1805
  OP_STATUS_SUCCESS,
1806
  OP_STATUS_ERROR,
1807
  ])
1808

    
1809
# OpCode priority
1810
OP_PRIO_LOWEST = +19
1811
OP_PRIO_HIGHEST = -20
1812

    
1813
OP_PRIO_LOW = +10
1814
OP_PRIO_NORMAL = 0
1815
OP_PRIO_HIGH = -10
1816

    
1817
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1818
  OP_PRIO_LOW,
1819
  OP_PRIO_NORMAL,
1820
  OP_PRIO_HIGH,
1821
  ])
1822

    
1823
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1824

    
1825
# Lock recalculate mode
1826
LOCKS_REPLACE = "replace"
1827
LOCKS_APPEND = "append"
1828

    
1829
# Lock timeout (sum) before we should go into blocking acquire (still
1830
# can be reset by priority change); computed as max time (10 hours)
1831
# before we should actually go into blocking acquire given that we
1832
# start from default priority level; in seconds
1833
# TODO
1834
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1835
LOCK_ATTEMPTS_MAXWAIT = 15.0
1836
LOCK_ATTEMPTS_MINWAIT = 1.0
1837

    
1838
# Execution log types
1839
ELOG_MESSAGE = "message"
1840
ELOG_REMOTE_IMPORT = "remote-import"
1841
ELOG_JQUEUE_TEST = "jqueue-test"
1842

    
1843
# /etc/hosts modification
1844
ETC_HOSTS_ADD = "add"
1845
ETC_HOSTS_REMOVE = "remove"
1846

    
1847
# Job queue test
1848
JQT_MSGPREFIX = "TESTMSG="
1849
JQT_EXPANDNAMES = "expandnames"
1850
JQT_EXEC = "exec"
1851
JQT_LOGMSG = "logmsg"
1852
JQT_STARTMSG = "startmsg"
1853
JQT_ALL = compat.UniqueFrozenset([
1854
  JQT_EXPANDNAMES,
1855
  JQT_EXEC,
1856
  JQT_LOGMSG,
1857
  JQT_STARTMSG,
1858
  ])
1859

    
1860
# Query resources
1861
QR_CLUSTER = "cluster"
1862
QR_INSTANCE = "instance"
1863
QR_NODE = "node"
1864
QR_LOCK = "lock"
1865
QR_GROUP = "group"
1866
QR_OS = "os"
1867
QR_JOB = "job"
1868
QR_EXPORT = "export"
1869
QR_NETWORK = "network"
1870
QR_EXTSTORAGE = "extstorage"
1871

    
1872
#: List of resources which can be queried using L{opcodes.OpQuery}
1873
QR_VIA_OP = compat.UniqueFrozenset([
1874
  QR_CLUSTER,
1875
  QR_INSTANCE,
1876
  QR_NODE,
1877
  QR_GROUP,
1878
  QR_OS,
1879
  QR_EXPORT,
1880
  QR_NETWORK,
1881
  QR_EXTSTORAGE,
1882
  ])
1883

    
1884
#: List of resources which can be queried using Local UniX Interface
1885
QR_VIA_LUXI = QR_VIA_OP.union([
1886
  QR_LOCK,
1887
  QR_JOB,
1888
  ])
1889

    
1890
#: List of resources which can be queried using RAPI
1891
QR_VIA_RAPI = QR_VIA_LUXI
1892

    
1893
# Query field types
1894
QFT_UNKNOWN = "unknown"
1895
QFT_TEXT = "text"
1896
QFT_BOOL = "bool"
1897
QFT_NUMBER = "number"
1898
QFT_UNIT = "unit"
1899
QFT_TIMESTAMP = "timestamp"
1900
QFT_OTHER = "other"
1901

    
1902
#: All query field types
1903
QFT_ALL = compat.UniqueFrozenset([
1904
  QFT_UNKNOWN,
1905
  QFT_TEXT,
1906
  QFT_BOOL,
1907
  QFT_NUMBER,
1908
  QFT_UNIT,
1909
  QFT_TIMESTAMP,
1910
  QFT_OTHER,
1911
  ])
1912

    
1913
# Query result field status (don't change or reuse values as they're used by
1914
# clients)
1915
#: Normal field status
1916
RS_NORMAL = 0
1917
#: Unknown field
1918
RS_UNKNOWN = 1
1919
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1920
RS_NODATA = 2
1921
#: Value unavailable/unsupported for item; if this field is supported
1922
#: but we cannot get the data for the moment, RS_NODATA or
1923
#: RS_OFFLINE should be used
1924
RS_UNAVAIL = 3
1925
#: Resource marked offline
1926
RS_OFFLINE = 4
1927

    
1928
RS_ALL = compat.UniqueFrozenset([
1929
  RS_NORMAL,
1930
  RS_UNKNOWN,
1931
  RS_NODATA,
1932
  RS_UNAVAIL,
1933
  RS_OFFLINE,
1934
  ])
1935

    
1936
#: Dictionary with special field cases and their verbose/terse formatting
1937
RSS_DESCRIPTION = {
1938
  RS_UNKNOWN: ("(unknown)", "??"),
1939
  RS_NODATA: ("(nodata)", "?"),
1940
  RS_OFFLINE: ("(offline)", "*"),
1941
  RS_UNAVAIL: ("(unavail)", "-"),
1942
  }
1943

    
1944
# max dynamic devices
1945
MAX_NICS = 8
1946
MAX_DISKS = 16
1947

    
1948
# SSCONF file prefix
1949
SSCONF_FILEPREFIX = "ssconf_"
1950
# SSCONF keys
1951
SS_CLUSTER_NAME = "cluster_name"
1952
SS_CLUSTER_TAGS = "cluster_tags"
1953
SS_FILE_STORAGE_DIR = "file_storage_dir"
1954
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1955
SS_MASTER_CANDIDATES = "master_candidates"
1956
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1957
SS_MASTER_IP = "master_ip"
1958
SS_MASTER_NETDEV = "master_netdev"
1959
SS_MASTER_NETMASK = "master_netmask"
1960
SS_MASTER_NODE = "master_node"
1961
SS_NODE_LIST = "node_list"
1962
SS_NODE_PRIMARY_IPS = "node_primary_ips"
1963
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1964
SS_OFFLINE_NODES = "offline_nodes"
1965
SS_ONLINE_NODES = "online_nodes"
1966
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
1967
SS_INSTANCE_LIST = "instance_list"
1968
SS_RELEASE_VERSION = "release_version"
1969
SS_HYPERVISOR_LIST = "hypervisor_list"
1970
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
1971
SS_UID_POOL = "uid_pool"
1972
SS_NODEGROUPS = "nodegroups"
1973
SS_NETWORKS = "networks"
1974

    
1975
SS_FILE_PERMS = 0444
1976

    
1977
# cluster wide default parameters
1978
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1979

    
1980
HVC_DEFAULTS = {
1981
  HT_XEN_PVM: {
1982
    HV_USE_BOOTLOADER: False,
1983
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
1984
    HV_BOOTLOADER_ARGS: "",
1985
    HV_KERNEL_PATH: XEN_KERNEL,
1986
    HV_INITRD_PATH: "",
1987
    HV_ROOT_PATH: "/dev/xvda1",
1988
    HV_KERNEL_ARGS: "ro",
1989
    HV_MIGRATION_PORT: 8002,
1990
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1991
    HV_BLOCKDEV_PREFIX: "sd",
1992
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1993
    HV_CPU_MASK: CPU_PINNING_ALL,
1994
    HV_CPU_CAP: 0,
1995
    HV_CPU_WEIGHT: 256,
1996
    },
1997
  HT_XEN_HVM: {
1998
    HV_BOOT_ORDER: "cd",
1999
    HV_CDROM_IMAGE_PATH: "",
2000
    HV_NIC_TYPE: HT_NIC_RTL8139,
2001
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2002
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2003
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2004
    HV_ACPI: True,
2005
    HV_PAE: True,
2006
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2007
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2008
    HV_MIGRATION_PORT: 8002,
2009
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2010
    HV_USE_LOCALTIME: False,
2011
    HV_BLOCKDEV_PREFIX: "hd",
2012
    HV_PASSTHROUGH: "",
2013
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2014
    HV_CPU_MASK: CPU_PINNING_ALL,
2015
    HV_CPU_CAP: 0,
2016
    HV_CPU_WEIGHT: 256,
2017
    },
2018
  HT_KVM: {
2019
    HV_KVM_PATH: KVM_PATH,
2020
    HV_KERNEL_PATH: KVM_KERNEL,
2021
    HV_INITRD_PATH: "",
2022
    HV_KERNEL_ARGS: "ro",
2023
    HV_ROOT_PATH: "/dev/vda1",
2024
    HV_ACPI: True,
2025
    HV_SERIAL_CONSOLE: True,
2026
    HV_SERIAL_SPEED: 38400,
2027
    HV_VNC_BIND_ADDRESS: "",
2028
    HV_VNC_TLS: False,
2029
    HV_VNC_X509: "",
2030
    HV_VNC_X509_VERIFY: False,
2031
    HV_VNC_PASSWORD_FILE: "",
2032
    HV_KVM_SPICE_BIND: "",
2033
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2034
    HV_KVM_SPICE_PASSWORD_FILE: "",
2035
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2036
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2037
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2038
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2039
    HV_KVM_SPICE_AUDIO_COMPR: True,
2040
    HV_KVM_SPICE_USE_TLS: False,
2041
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2042
    HV_KVM_SPICE_USE_VDAGENT: True,
2043
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2044
    HV_CDROM_IMAGE_PATH: "",
2045
    HV_KVM_CDROM2_IMAGE_PATH: "",
2046
    HV_BOOT_ORDER: HT_BO_DISK,
2047
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2048
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2049
    HV_KVM_CDROM_DISK_TYPE: "",
2050
    HV_USB_MOUSE: "",
2051
    HV_KEYMAP: "",
2052
    HV_MIGRATION_PORT: 8102,
2053
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2054
    HV_MIGRATION_DOWNTIME: 30,  # ms
2055
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2056
    HV_USE_LOCALTIME: False,
2057
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2058
    HV_SECURITY_MODEL: HT_SM_NONE,
2059
    HV_SECURITY_DOMAIN: "",
2060
    HV_KVM_FLAG: "",
2061
    HV_VHOST_NET: False,
2062
    HV_KVM_USE_CHROOT: False,
2063
    HV_MEM_PATH: "",
2064
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2065
    HV_CPU_MASK: CPU_PINNING_ALL,
2066
    HV_CPU_TYPE: "",
2067
    HV_CPU_CORES: 0,
2068
    HV_CPU_THREADS: 0,
2069
    HV_CPU_SOCKETS: 0,
2070
    HV_SOUNDHW: "",
2071
    HV_USB_DEVICES: "",
2072
    HV_VGA: "",
2073
    HV_KVM_EXTRA: "",
2074
    HV_KVM_MACHINE_VERSION: "",
2075
    },
2076
  HT_FAKE: {},
2077
  HT_CHROOT: {
2078
    HV_INIT_SCRIPT: "/ganeti-chroot",
2079
    },
2080
  HT_LXC: {
2081
    HV_CPU_MASK: "",
2082
    },
2083
  }
2084

    
2085
HVC_GLOBALS = compat.UniqueFrozenset([
2086
  HV_MIGRATION_PORT,
2087
  HV_MIGRATION_BANDWIDTH,
2088
  HV_MIGRATION_MODE,
2089
  ])
2090

    
2091
BEC_DEFAULTS = {
2092
  BE_MINMEM: 128,
2093
  BE_MAXMEM: 128,
2094
  BE_VCPUS: 1,
2095
  BE_AUTO_BALANCE: True,
2096
  BE_ALWAYS_FAILOVER: False,
2097
  BE_SPINDLE_USE: 1,
2098
  }
2099

    
2100
NDC_DEFAULTS = {
2101
  ND_OOB_PROGRAM: "",
2102
  ND_SPINDLE_COUNT: 1,
2103
  ND_EXCLUSIVE_STORAGE: False,
2104
  }
2105

    
2106
NDC_GLOBALS = compat.UniqueFrozenset([
2107
  ND_EXCLUSIVE_STORAGE,
2108
  ])
2109

    
2110
DISK_LD_DEFAULTS = {
2111
  LD_DRBD8: {
2112
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2113
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2114
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2115
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2116
    LDP_DISK_CUSTOM: "",
2117
    LDP_NET_CUSTOM: "",
2118
    LDP_DYNAMIC_RESYNC: False,
2119

    
2120
    # The default values for the DRBD dynamic resync speed algorithm
2121
    # are taken from the drbsetup 8.3.11 man page, except for
2122
    # c-plan-ahead (that we don't need to set to 0, because we have a
2123
    # separate option to enable it) and for c-max-rate, that we cap to
2124
    # the default value for the static resync rate.
2125
    LDP_PLAN_AHEAD: 20, # ds
2126
    LDP_FILL_TARGET: 0, # sectors
2127
    LDP_DELAY_TARGET: 1, # ds
2128
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2129
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2130
    },
2131
  LD_LV: {
2132
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2133
    },
2134
  LD_FILE: {},
2135
  LD_BLOCKDEV: {},
2136
  LD_RBD: {
2137
    LDP_POOL: "rbd"
2138
    },
2139
  LD_EXT: {},
2140
  }
2141

    
2142
# readability shortcuts
2143
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2144
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2145

    
2146
DISK_DT_DEFAULTS = {
2147
  DT_PLAIN: {
2148
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2149
    },
2150
  DT_DRBD8: {
2151
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2152
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2153
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2154
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2155
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2156
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2157
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2158
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2159
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2160
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2161
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2162
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2163
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2164
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2165
    },
2166
  DT_DISKLESS: {},
2167
  DT_FILE: {},
2168
  DT_SHARED_FILE: {},
2169
  DT_BLOCK: {},
2170
  DT_RBD: {
2171
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2172
    },
2173
  DT_EXT: {},
2174
  }
2175

    
2176
# we don't want to export the shortcuts
2177
del _LV_DEFAULTS, _DRBD_DEFAULTS
2178

    
2179
NICC_DEFAULTS = {
2180
  NIC_MODE: NIC_MODE_BRIDGED,
2181
  NIC_LINK: DEFAULT_BRIDGE,
2182
  }
2183

    
2184
# All of the following values are quite arbitrarily - there are no
2185
# "good" defaults, these must be customised per-site
2186
ISPECS_MINMAX_DEFAULTS = {
2187
  ISPECS_MIN: {
2188
    ISPEC_MEM_SIZE: 128,
2189
    ISPEC_CPU_COUNT: 1,
2190
    ISPEC_DISK_COUNT: 1,
2191
    ISPEC_DISK_SIZE: 1024,
2192
    ISPEC_NIC_COUNT: 1,
2193
    ISPEC_SPINDLE_USE: 1,
2194
    },
2195
  ISPECS_MAX: {
2196
    ISPEC_MEM_SIZE: 32768,
2197
    ISPEC_CPU_COUNT: 8,
2198
    ISPEC_DISK_COUNT: MAX_DISKS,
2199
    ISPEC_DISK_SIZE: 1024 * 1024,
2200
    ISPEC_NIC_COUNT: MAX_NICS,
2201
    ISPEC_SPINDLE_USE: 12,
2202
    },
2203
  }
2204
IPOLICY_DEFAULTS = {
2205
  ISPECS_MINMAX: ISPECS_MINMAX_DEFAULTS,
2206
  ISPECS_STD: {
2207
    ISPEC_MEM_SIZE: 128,
2208
    ISPEC_CPU_COUNT: 1,
2209
    ISPEC_DISK_COUNT: 1,
2210
    ISPEC_DISK_SIZE: 1024,
2211
    ISPEC_NIC_COUNT: 1,
2212
    ISPEC_SPINDLE_USE: 1,
2213
    },
2214
  IPOLICY_DTS: list(DISK_TEMPLATES),
2215
  IPOLICY_VCPU_RATIO: 4.0,
2216
  IPOLICY_SPINDLE_RATIO: 32.0,
2217
  }
2218

    
2219
MASTER_POOL_SIZE_DEFAULT = 10
2220

    
2221
# Exclusive storage:
2222
# Error margin used to compare physical disks
2223
PART_MARGIN = .01
2224
# Space reserved when creating instance disks
2225
PART_RESERVED = .02
2226

    
2227
CONFD_PROTOCOL_VERSION = 1
2228

    
2229
CONFD_REQ_PING = 0
2230
CONFD_REQ_NODE_ROLE_BYNAME = 1
2231
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2232
CONFD_REQ_CLUSTER_MASTER = 3
2233
CONFD_REQ_NODE_PIP_LIST = 4
2234
CONFD_REQ_MC_PIP_LIST = 5
2235
CONFD_REQ_INSTANCES_IPS_LIST = 6
2236
CONFD_REQ_NODE_DRBD = 7
2237
CONFD_REQ_NODE_INSTANCES = 8
2238

    
2239
# Confd request query fields. These are used to narrow down queries.
2240
# These must be strings rather than integers, because json-encoding
2241
# converts them to strings anyway, as they're used as dict-keys.
2242
CONFD_REQQ_LINK = "0"
2243
CONFD_REQQ_IP = "1"
2244
CONFD_REQQ_IPLIST = "2"
2245
CONFD_REQQ_FIELDS = "3"
2246

    
2247
CONFD_REQFIELD_NAME = "0"
2248
CONFD_REQFIELD_IP = "1"
2249
CONFD_REQFIELD_MNODE_PIP = "2"
2250

    
2251
CONFD_REQS = compat.UniqueFrozenset([
2252
  CONFD_REQ_PING,
2253
  CONFD_REQ_NODE_ROLE_BYNAME,
2254
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2255
  CONFD_REQ_CLUSTER_MASTER,
2256
  CONFD_REQ_NODE_PIP_LIST,
2257
  CONFD_REQ_MC_PIP_LIST,
2258
  CONFD_REQ_INSTANCES_IPS_LIST,
2259
  CONFD_REQ_NODE_DRBD,
2260
  ])
2261

    
2262
CONFD_REPL_STATUS_OK = 0
2263
CONFD_REPL_STATUS_ERROR = 1
2264
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2265

    
2266
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2267
  CONFD_REPL_STATUS_OK,
2268
  CONFD_REPL_STATUS_ERROR,
2269
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2270
  ])
2271

    
2272
(CONFD_NODE_ROLE_MASTER,
2273
 CONFD_NODE_ROLE_CANDIDATE,
2274
 CONFD_NODE_ROLE_OFFLINE,
2275
 CONFD_NODE_ROLE_DRAINED,
2276
 CONFD_NODE_ROLE_REGULAR,
2277
 ) = range(5)
2278

    
2279
# A few common errors for confd
2280
CONFD_ERROR_UNKNOWN_ENTRY = 1
2281
CONFD_ERROR_INTERNAL = 2
2282
CONFD_ERROR_ARGUMENT = 3
2283

    
2284
# Each request is "salted" by the current timestamp.
2285
# This constants decides how many seconds of skew to accept.
2286
# TODO: make this a default and allow the value to be more configurable
2287
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2288

    
2289
# When we haven't reloaded the config for more than this amount of
2290
# seconds, we force a test to see if inotify is betraying us. Using a
2291
# prime number to ensure we get less chance of 'same wakeup' with
2292
# other processes.
2293
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2294

    
2295
# If we receive more than one update in this amount of microseconds,
2296
# we move to polling every RATELIMIT seconds, rather than relying on
2297
# inotify, to be able to serve more requests.
2298
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2299

    
2300
# Magic number prepended to all confd queries.
2301
# This allows us to distinguish different types of confd protocols and handle
2302
# them. For example by changing this we can move the whole payload to be
2303
# compressed, or move away from json.
2304
CONFD_MAGIC_FOURCC = "plj0"
2305

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

    
2311
# Timeout in seconds to expire pending query request in the confd client
2312
# library. We don't actually expect any answer more than 10 seconds after we
2313
# sent a request.
2314
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2315

    
2316
# Maximum UDP datagram size.
2317
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2318
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2319
#   (assuming we can't use jumbo frames)
2320
# We just set this to 60K, which should be enough
2321
MAX_UDP_DATA_SIZE = 61440
2322

    
2323
# User-id pool minimum/maximum acceptable user-ids.
2324
UIDPOOL_UID_MIN = 0
2325
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2326

    
2327
# Name or path of the pgrep command
2328
PGREP = "pgrep"
2329

    
2330
# Name of the node group that gets created at cluster init or upgrade
2331
INITIAL_NODE_GROUP_NAME = "default"
2332

    
2333
# Possible values for NodeGroup.alloc_policy
2334
ALLOC_POLICY_PREFERRED = "preferred"
2335
ALLOC_POLICY_LAST_RESORT = "last_resort"
2336
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2337
VALID_ALLOC_POLICIES = [
2338
  ALLOC_POLICY_PREFERRED,
2339
  ALLOC_POLICY_LAST_RESORT,
2340
  ALLOC_POLICY_UNALLOCABLE,
2341
  ]
2342

    
2343
# Temporary external/shared storage parameters
2344
BLOCKDEV_DRIVER_MANUAL = "manual"
2345

    
2346
# qemu-img path, required for ovfconverter
2347
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2348

    
2349
# Whether htools was enabled at compilation time
2350
HTOOLS = _autoconf.HTOOLS
2351
# The hail iallocator
2352
IALLOC_HAIL = "hail"
2353

    
2354
# Fake opcodes for functions that have hooks attached to them via
2355
# backend.RunLocalHooks
2356
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2357
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2358

    
2359
# SSH key types
2360
SSHK_RSA = "rsa"
2361
SSHK_DSA = "dsa"
2362
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2363

    
2364
# SSH authorized key types
2365
SSHAK_RSA = "ssh-rsa"
2366
SSHAK_DSS = "ssh-dss"
2367
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2368

    
2369
# SSH setup
2370
SSHS_CLUSTER_NAME = "cluster_name"
2371
SSHS_SSH_HOST_KEY = "ssh_host_key"
2372
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2373
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2374

    
2375
#: Key files for SSH daemon
2376
SSH_DAEMON_KEYFILES = {
2377
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2378
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2379
  }
2380

    
2381
# Node daemon setup
2382
NDS_CLUSTER_NAME = "cluster_name"
2383
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2384
NDS_SSCONF = "ssconf"
2385
NDS_START_NODE_DAEMON = "start_node_daemon"
2386

    
2387
# Path generating random UUID
2388
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2389

    
2390
# Regex string for verifying a UUID
2391
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2392

    
2393
# Auto-repair tag prefixes
2394
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2395
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2396
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2397
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2398
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2399

    
2400
# Auto-repair levels
2401
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2402
AUTO_REPAIR_MIGRATE = "migrate"
2403
AUTO_REPAIR_FAILOVER = "failover"
2404
AUTO_REPAIR_REINSTALL = "reinstall"
2405
AUTO_REPAIR_ALL_TYPES = [
2406
  AUTO_REPAIR_FIX_STORAGE,
2407
  AUTO_REPAIR_MIGRATE,
2408
  AUTO_REPAIR_FAILOVER,
2409
  AUTO_REPAIR_REINSTALL,
2410
]
2411

    
2412
# Auto-repair results
2413
AUTO_REPAIR_SUCCESS = "success"
2414
AUTO_REPAIR_FAILURE = "failure"
2415
AUTO_REPAIR_ENOPERM = "enoperm"
2416
AUTO_REPAIR_ALL_RESULTS = frozenset([
2417
    AUTO_REPAIR_SUCCESS,
2418
    AUTO_REPAIR_FAILURE,
2419
    AUTO_REPAIR_ENOPERM,
2420
])
2421

    
2422
# The version identifier for builtin data collectors
2423
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2424

    
2425
# The source reasons for the change of state of an instance
2426
INSTANCE_REASON_SOURCE_CLI = "cli"
2427
INSTANCE_REASON_SOURCE_RAPI = "rapi"
2428
INSTANCE_REASON_SOURCE_UNKNOWN = "unknown"
2429

    
2430
INSTANCE_REASON_SOURCES = compat.UniqueFrozenset([
2431
  INSTANCE_REASON_SOURCE_CLI,
2432
  INSTANCE_REASON_SOURCE_RAPI,
2433
  INSTANCE_REASON_SOURCE_UNKNOWN,
2434
  ])
2435

    
2436
# The default reasons for the change of state of an instance
2437
INSTANCE_REASON_REBOOT = "reboot"
2438

    
2439
# Do not re-export imported modules
2440
del re, _vcsversion, _autoconf, socket, pathutils, compat