Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 8ef418bb

History | View | Annotate | Download (64.4 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
185
FIRST_DRBD_PORT = 11000
186
LAST_DRBD_PORT = 14999
187

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

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

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

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

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

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

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

    
227
DEV_CONSOLE = "/dev/console"
228

    
229
PROC_MOUNTS = "/proc/mounts"
230

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

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

    
246
EXPORT_CONF_FILE = "config.ini"
247

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
319
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
320

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

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

    
333
IE_CUSTOM_SIZE = "fd"
334

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
467
# disk templates that are enabled by default
468
DEFAULT_ENABLED_DISK_TEMPLATES = [
469
  DT_DRBD8,
470
  DT_PLAIN,
471
  ]
472

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
578
# drbd constants
579
DRBD_HMAC_ALG = "md5"
580
DRBD_NET_PROTOCOL = "C"
581
DRBD_STATUS_FILE = "/proc/drbd"
582

    
583
#: Size of DRBD meta block device
584
DRBD_META_SIZE = 128
585

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

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

    
604
# rbd tool command
605
RBD_CMD = "rbd"
606

    
607
# file backend driver
608
FD_LOOP = "loop"
609
FD_BLKTAP = "blktap"
610

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

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

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

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

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

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

    
653
# Remote import/export certificate validity in seconds
654
RIE_CERT_VALIDITY = 24 * 60 * 60
655

    
656
# Overall timeout for establishing connection
657
RIE_CONNECT_TIMEOUT = 180
658

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

    
662
# Export only: number of attempts to connect
663
RIE_CONNECT_RETRIES = 10
664

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

    
668
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
669

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

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

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

    
695
#: Exit code for query operations with unknown fields
696
EXIT_UNKNOWN_FIELD = 14
697

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

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

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

    
742
#: Key for job IDs in opcode result
743
JOB_IDS_KEY = "jobs"
744

    
745
# runparts results
746
(RUNPARTS_SKIP,
747
 RUNPARTS_RUN,
748
 RUNPARTS_ERR) = range(3)
749

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

    
756
# RPC constants
757
(RPC_ENCODING_NONE,
758
 RPC_ENCODING_ZLIB_BASE64) = range(2)
759

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

    
768
# Timeout for connecting to nodes (seconds)
769
RPC_CONNECT_TIMEOUT = 5
770

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

    
785
OS_API_FILE = "ganeti_api_version"
786
OS_VARIANTS_FILE = "variants.list"
787
OS_PARAMETERS_FILE = "parameters.list"
788

    
789
OS_VALIDATE_PARAMETERS = "parameters"
790
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
791

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

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

    
818
ES_PARAMETERS_FILE = "parameters.list"
819

    
820
# reboot types
821
INSTANCE_REBOOT_SOFT = "soft"
822
INSTANCE_REBOOT_HARD = "hard"
823
INSTANCE_REBOOT_FULL = "full"
824

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

    
831
# instance reboot behaviors
832
INSTANCE_REBOOT_ALLOWED = "reboot"
833
INSTANCE_REBOOT_EXIT = "exit"
834

    
835
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
836
  INSTANCE_REBOOT_ALLOWED,
837
  INSTANCE_REBOOT_EXIT,
838
  ])
839

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

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

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

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

    
947

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

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

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

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

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

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

    
1053
# KVM-specific statuses
1054
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1055

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1282
OOB_POWER_STATUS_POWERED = "powered"
1283

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1382
VNC_BASE_PORT = 5900
1383
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1384

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

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

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

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

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

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

    
1456
# Mouse types:
1457
HT_MOUSE_MOUSE = "mouse"
1458
HT_MOUSE_TABLET = "tablet"
1459

    
1460
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1461
  HT_MOUSE_MOUSE,
1462
  HT_MOUSE_TABLET,
1463
  ])
1464

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

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

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

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

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

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

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

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

    
1517
# Security models
1518
HT_SM_NONE = "none"
1519
HT_SM_USER = "user"
1520
HT_SM_POOL = "pool"
1521

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

    
1528
# Kvm flag values
1529
HT_KVM_ENABLED = "enabled"
1530
HT_KVM_DISABLED = "disabled"
1531

    
1532
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1533

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

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

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

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

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

    
1674
CV_ALL_ECODES_STRINGS = \
1675
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1676

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

    
1703
# Instance status
1704
INSTST_RUNNING = "running"
1705
INSTST_ADMINDOWN = "ADMIN_down"
1706
INSTST_ADMINOFFLINE = "ADMIN_offline"
1707
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1708
INSTST_NODEDOWN = "ERROR_nodedown"
1709
INSTST_WRONGNODE = "ERROR_wrongnode"
1710
INSTST_ERRORUP = "ERROR_up"
1711
INSTST_ERRORDOWN = "ERROR_down"
1712
INSTST_ALL = compat.UniqueFrozenset([
1713
  INSTST_RUNNING,
1714
  INSTST_ADMINDOWN,
1715
  INSTST_ADMINOFFLINE,
1716
  INSTST_NODEOFFLINE,
1717
  INSTST_NODEDOWN,
1718
  INSTST_WRONGNODE,
1719
  INSTST_ERRORUP,
1720
  INSTST_ERRORDOWN,
1721
  ])
1722

    
1723
# Admin states
1724
ADMINST_UP = "up"
1725
ADMINST_DOWN = "down"
1726
ADMINST_OFFLINE = "offline"
1727
ADMINST_ALL = compat.UniqueFrozenset([
1728
  ADMINST_UP,
1729
  ADMINST_DOWN,
1730
  ADMINST_OFFLINE,
1731
  ])
1732

    
1733
# Node roles
1734
NR_REGULAR = "R"
1735
NR_MASTER = "M"
1736
NR_MCANDIDATE = "C"
1737
NR_DRAINED = "D"
1738
NR_OFFLINE = "O"
1739
NR_ALL = compat.UniqueFrozenset([
1740
  NR_REGULAR,
1741
  NR_MASTER,
1742
  NR_MCANDIDATE,
1743
  NR_DRAINED,
1744
  NR_OFFLINE,
1745
  ])
1746

    
1747
# SSL certificate check constants (in days)
1748
SSL_CERT_EXPIRATION_WARN = 30
1749
SSL_CERT_EXPIRATION_ERROR = 7
1750

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

    
1774
IALLOCATOR_NEVAC_PRI = "primary-only"
1775
IALLOCATOR_NEVAC_SEC = "secondary-only"
1776
IALLOCATOR_NEVAC_ALL = "all"
1777
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1778
  IALLOCATOR_NEVAC_PRI,
1779
  IALLOCATOR_NEVAC_SEC,
1780
  IALLOCATOR_NEVAC_ALL,
1781
  ])
1782

    
1783
# Node evacuation
1784
NODE_EVAC_PRI = "primary-only"
1785
NODE_EVAC_SEC = "secondary-only"
1786
NODE_EVAC_ALL = "all"
1787
NODE_EVAC_MODES = compat.UniqueFrozenset([
1788
  NODE_EVAC_PRI,
1789
  NODE_EVAC_SEC,
1790
  NODE_EVAC_ALL,
1791
  ])
1792

    
1793
# Job queue
1794
JOB_QUEUE_VERSION = 1
1795
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1796
JOB_QUEUE_FILES_PERMS = 0640
1797

    
1798
JOB_ID_TEMPLATE = r"\d+"
1799
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1800

    
1801
# unchanged job return
1802
JOB_NOTCHANGED = "nochange"
1803

    
1804
# Job status
1805
JOB_STATUS_QUEUED = "queued"
1806
JOB_STATUS_WAITING = "waiting"
1807
JOB_STATUS_CANCELING = "canceling"
1808
JOB_STATUS_RUNNING = "running"
1809
JOB_STATUS_CANCELED = "canceled"
1810
JOB_STATUS_SUCCESS = "success"
1811
JOB_STATUS_ERROR = "error"
1812
JOBS_PENDING = compat.UniqueFrozenset([
1813
  JOB_STATUS_QUEUED,
1814
  JOB_STATUS_WAITING,
1815
  JOB_STATUS_CANCELING,
1816
  ])
1817
JOBS_FINALIZED = compat.UniqueFrozenset([
1818
  JOB_STATUS_CANCELED,
1819
  JOB_STATUS_SUCCESS,
1820
  JOB_STATUS_ERROR,
1821
  ])
1822
JOB_STATUS_ALL = compat.UniqueFrozenset([
1823
  JOB_STATUS_RUNNING,
1824
  ]) | JOBS_PENDING | JOBS_FINALIZED
1825

    
1826
# OpCode status
1827
# not yet finalized
1828
OP_STATUS_QUEUED = "queued"
1829
OP_STATUS_WAITING = "waiting"
1830
OP_STATUS_CANCELING = "canceling"
1831
OP_STATUS_RUNNING = "running"
1832
# finalized
1833
OP_STATUS_CANCELED = "canceled"
1834
OP_STATUS_SUCCESS = "success"
1835
OP_STATUS_ERROR = "error"
1836
OPS_FINALIZED = compat.UniqueFrozenset([
1837
  OP_STATUS_CANCELED,
1838
  OP_STATUS_SUCCESS,
1839
  OP_STATUS_ERROR,
1840
  ])
1841

    
1842
# OpCode priority
1843
OP_PRIO_LOWEST = +19
1844
OP_PRIO_HIGHEST = -20
1845

    
1846
OP_PRIO_LOW = +10
1847
OP_PRIO_NORMAL = 0
1848
OP_PRIO_HIGH = -10
1849

    
1850
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1851
  OP_PRIO_LOW,
1852
  OP_PRIO_NORMAL,
1853
  OP_PRIO_HIGH,
1854
  ])
1855

    
1856
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1857

    
1858
# Lock recalculate mode
1859
LOCKS_REPLACE = "replace"
1860
LOCKS_APPEND = "append"
1861

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

    
1871
# Execution log types
1872
ELOG_MESSAGE = "message"
1873
ELOG_REMOTE_IMPORT = "remote-import"
1874
ELOG_JQUEUE_TEST = "jqueue-test"
1875

    
1876
# /etc/hosts modification
1877
ETC_HOSTS_ADD = "add"
1878
ETC_HOSTS_REMOVE = "remove"
1879

    
1880
# Job queue test
1881
JQT_MSGPREFIX = "TESTMSG="
1882
JQT_EXPANDNAMES = "expandnames"
1883
JQT_EXEC = "exec"
1884
JQT_LOGMSG = "logmsg"
1885
JQT_STARTMSG = "startmsg"
1886
JQT_ALL = compat.UniqueFrozenset([
1887
  JQT_EXPANDNAMES,
1888
  JQT_EXEC,
1889
  JQT_LOGMSG,
1890
  JQT_STARTMSG,
1891
  ])
1892

    
1893
# Query resources
1894
QR_CLUSTER = "cluster"
1895
QR_INSTANCE = "instance"
1896
QR_NODE = "node"
1897
QR_LOCK = "lock"
1898
QR_GROUP = "group"
1899
QR_OS = "os"
1900
QR_JOB = "job"
1901
QR_EXPORT = "export"
1902
QR_NETWORK = "network"
1903
QR_EXTSTORAGE = "extstorage"
1904

    
1905
#: List of resources which can be queried using L{opcodes.OpQuery}
1906
QR_VIA_OP = compat.UniqueFrozenset([
1907
  QR_CLUSTER,
1908
  QR_INSTANCE,
1909
  QR_NODE,
1910
  QR_GROUP,
1911
  QR_OS,
1912
  QR_EXPORT,
1913
  QR_NETWORK,
1914
  QR_EXTSTORAGE,
1915
  ])
1916

    
1917
#: List of resources which can be queried using Local UniX Interface
1918
QR_VIA_LUXI = QR_VIA_OP.union([
1919
  QR_LOCK,
1920
  QR_JOB,
1921
  ])
1922

    
1923
#: List of resources which can be queried using RAPI
1924
QR_VIA_RAPI = QR_VIA_LUXI
1925

    
1926
# Query field types
1927
QFT_UNKNOWN = "unknown"
1928
QFT_TEXT = "text"
1929
QFT_BOOL = "bool"
1930
QFT_NUMBER = "number"
1931
QFT_UNIT = "unit"
1932
QFT_TIMESTAMP = "timestamp"
1933
QFT_OTHER = "other"
1934

    
1935
#: All query field types
1936
QFT_ALL = compat.UniqueFrozenset([
1937
  QFT_UNKNOWN,
1938
  QFT_TEXT,
1939
  QFT_BOOL,
1940
  QFT_NUMBER,
1941
  QFT_UNIT,
1942
  QFT_TIMESTAMP,
1943
  QFT_OTHER,
1944
  ])
1945

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

    
1961
RS_ALL = compat.UniqueFrozenset([
1962
  RS_NORMAL,
1963
  RS_UNKNOWN,
1964
  RS_NODATA,
1965
  RS_UNAVAIL,
1966
  RS_OFFLINE,
1967
  ])
1968

    
1969
#: Dictionary with special field cases and their verbose/terse formatting
1970
RSS_DESCRIPTION = {
1971
  RS_UNKNOWN: ("(unknown)", "??"),
1972
  RS_NODATA: ("(nodata)", "?"),
1973
  RS_OFFLINE: ("(offline)", "*"),
1974
  RS_UNAVAIL: ("(unavail)", "-"),
1975
  }
1976

    
1977
# max dynamic devices
1978
MAX_NICS = 8
1979
MAX_DISKS = 16
1980

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

    
2008
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2009
SS_HVPARAMS_PREF = "hvparams_"
2010

    
2011
# Hvparams keys:
2012
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2013
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2014
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2015
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2016
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2017
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2018

    
2019
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2020
  SS_HVPARAMS_XEN_PVM,
2021
  SS_HVPARAMS_XEN_FAKE,
2022
  SS_HVPARAMS_XEN_HVM,
2023
  SS_HVPARAMS_XEN_KVM,
2024
  SS_HVPARAMS_XEN_CHROOT,
2025
  SS_HVPARAMS_XEN_LXC,
2026
  ])
2027

    
2028
SS_FILE_PERMS = 0444
2029

    
2030
# cluster wide default parameters
2031
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2032

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

    
2141
HVC_GLOBALS = compat.UniqueFrozenset([
2142
  HV_MIGRATION_PORT,
2143
  HV_MIGRATION_BANDWIDTH,
2144
  HV_MIGRATION_MODE,
2145
  HV_XEN_CMD,
2146
  ])
2147

    
2148
BEC_DEFAULTS = {
2149
  BE_MINMEM: 128,
2150
  BE_MAXMEM: 128,
2151
  BE_VCPUS: 1,
2152
  BE_AUTO_BALANCE: True,
2153
  BE_ALWAYS_FAILOVER: False,
2154
  BE_SPINDLE_USE: 1,
2155
  }
2156

    
2157
NDC_DEFAULTS = {
2158
  ND_OOB_PROGRAM: "",
2159
  ND_SPINDLE_COUNT: 1,
2160
  ND_EXCLUSIVE_STORAGE: False,
2161
  }
2162

    
2163
NDC_GLOBALS = compat.UniqueFrozenset([
2164
  ND_EXCLUSIVE_STORAGE,
2165
  ])
2166

    
2167
DISK_LD_DEFAULTS = {
2168
  LD_DRBD8: {
2169
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2170
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2171
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2172
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2173
    LDP_DISK_CUSTOM: "",
2174
    LDP_NET_CUSTOM: "",
2175
    LDP_DYNAMIC_RESYNC: False,
2176

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

    
2199
# readability shortcuts
2200
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2201
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2202

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

    
2233
# we don't want to export the shortcuts
2234
del _LV_DEFAULTS, _DRBD_DEFAULTS
2235

    
2236
NICC_DEFAULTS = {
2237
  NIC_MODE: NIC_MODE_BRIDGED,
2238
  NIC_LINK: DEFAULT_BRIDGE,
2239
  }
2240

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

    
2276
MASTER_POOL_SIZE_DEFAULT = 10
2277

    
2278
# Exclusive storage:
2279
# Error margin used to compare physical disks
2280
PART_MARGIN = .01
2281
# Space reserved when creating instance disks
2282
PART_RESERVED = .02
2283

    
2284
CONFD_PROTOCOL_VERSION = 1
2285

    
2286
CONFD_REQ_PING = 0
2287
CONFD_REQ_NODE_ROLE_BYNAME = 1
2288
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2289
CONFD_REQ_CLUSTER_MASTER = 3
2290
CONFD_REQ_NODE_PIP_LIST = 4
2291
CONFD_REQ_MC_PIP_LIST = 5
2292
CONFD_REQ_INSTANCES_IPS_LIST = 6
2293
CONFD_REQ_NODE_DRBD = 7
2294
CONFD_REQ_NODE_INSTANCES = 8
2295

    
2296
# Confd request query fields. These are used to narrow down queries.
2297
# These must be strings rather than integers, because json-encoding
2298
# converts them to strings anyway, as they're used as dict-keys.
2299
CONFD_REQQ_LINK = "0"
2300
CONFD_REQQ_IP = "1"
2301
CONFD_REQQ_IPLIST = "2"
2302
CONFD_REQQ_FIELDS = "3"
2303

    
2304
CONFD_REQFIELD_NAME = "0"
2305
CONFD_REQFIELD_IP = "1"
2306
CONFD_REQFIELD_MNODE_PIP = "2"
2307

    
2308
CONFD_REQS = compat.UniqueFrozenset([
2309
  CONFD_REQ_PING,
2310
  CONFD_REQ_NODE_ROLE_BYNAME,
2311
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2312
  CONFD_REQ_CLUSTER_MASTER,
2313
  CONFD_REQ_NODE_PIP_LIST,
2314
  CONFD_REQ_MC_PIP_LIST,
2315
  CONFD_REQ_INSTANCES_IPS_LIST,
2316
  CONFD_REQ_NODE_DRBD,
2317
  ])
2318

    
2319
CONFD_REPL_STATUS_OK = 0
2320
CONFD_REPL_STATUS_ERROR = 1
2321
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2322

    
2323
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2324
  CONFD_REPL_STATUS_OK,
2325
  CONFD_REPL_STATUS_ERROR,
2326
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2327
  ])
2328

    
2329
(CONFD_NODE_ROLE_MASTER,
2330
 CONFD_NODE_ROLE_CANDIDATE,
2331
 CONFD_NODE_ROLE_OFFLINE,
2332
 CONFD_NODE_ROLE_DRAINED,
2333
 CONFD_NODE_ROLE_REGULAR,
2334
 ) = range(5)
2335

    
2336
# A few common errors for confd
2337
CONFD_ERROR_UNKNOWN_ENTRY = 1
2338
CONFD_ERROR_INTERNAL = 2
2339
CONFD_ERROR_ARGUMENT = 3
2340

    
2341
# Each request is "salted" by the current timestamp.
2342
# This constants decides how many seconds of skew to accept.
2343
# TODO: make this a default and allow the value to be more configurable
2344
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2345

    
2346
# When we haven't reloaded the config for more than this amount of
2347
# seconds, we force a test to see if inotify is betraying us. Using a
2348
# prime number to ensure we get less chance of 'same wakeup' with
2349
# other processes.
2350
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2351

    
2352
# If we receive more than one update in this amount of microseconds,
2353
# we move to polling every RATELIMIT seconds, rather than relying on
2354
# inotify, to be able to serve more requests.
2355
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2356

    
2357
# Magic number prepended to all confd queries.
2358
# This allows us to distinguish different types of confd protocols and handle
2359
# them. For example by changing this we can move the whole payload to be
2360
# compressed, or move away from json.
2361
CONFD_MAGIC_FOURCC = "plj0"
2362

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

    
2368
# Timeout in seconds to expire pending query request in the confd client
2369
# library. We don't actually expect any answer more than 10 seconds after we
2370
# sent a request.
2371
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2372

    
2373
# Maximum UDP datagram size.
2374
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2375
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2376
#   (assuming we can't use jumbo frames)
2377
# We just set this to 60K, which should be enough
2378
MAX_UDP_DATA_SIZE = 61440
2379

    
2380
# User-id pool minimum/maximum acceptable user-ids.
2381
UIDPOOL_UID_MIN = 0
2382
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2383

    
2384
# Name or path of the pgrep command
2385
PGREP = "pgrep"
2386

    
2387
# Name of the node group that gets created at cluster init or upgrade
2388
INITIAL_NODE_GROUP_NAME = "default"
2389

    
2390
# Possible values for NodeGroup.alloc_policy
2391
ALLOC_POLICY_PREFERRED = "preferred"
2392
ALLOC_POLICY_LAST_RESORT = "last_resort"
2393
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2394
VALID_ALLOC_POLICIES = [
2395
  ALLOC_POLICY_PREFERRED,
2396
  ALLOC_POLICY_LAST_RESORT,
2397
  ALLOC_POLICY_UNALLOCABLE,
2398
  ]
2399

    
2400
# Temporary external/shared storage parameters
2401
BLOCKDEV_DRIVER_MANUAL = "manual"
2402

    
2403
# qemu-img path, required for ovfconverter
2404
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2405

    
2406
# Whether htools was enabled at compilation time
2407
HTOOLS = _autoconf.HTOOLS
2408
# The hail iallocator
2409
IALLOC_HAIL = "hail"
2410

    
2411
# Fake opcodes for functions that have hooks attached to them via
2412
# backend.RunLocalHooks
2413
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2414
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2415

    
2416
# SSH key types
2417
SSHK_RSA = "rsa"
2418
SSHK_DSA = "dsa"
2419
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2420

    
2421
# SSH authorized key types
2422
SSHAK_RSA = "ssh-rsa"
2423
SSHAK_DSS = "ssh-dss"
2424
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2425

    
2426
# SSH setup
2427
SSHS_CLUSTER_NAME = "cluster_name"
2428
SSHS_SSH_HOST_KEY = "ssh_host_key"
2429
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2430
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2431

    
2432
#: Key files for SSH daemon
2433
SSH_DAEMON_KEYFILES = {
2434
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2435
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2436
  }
2437

    
2438
# Node daemon setup
2439
NDS_CLUSTER_NAME = "cluster_name"
2440
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2441
NDS_SSCONF = "ssconf"
2442
NDS_START_NODE_DAEMON = "start_node_daemon"
2443

    
2444
# Path generating random UUID
2445
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2446

    
2447
# Regex string for verifying a UUID
2448
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2449

    
2450
# Auto-repair tag prefixes
2451
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2452
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2453
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2454
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2455
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2456

    
2457
# Auto-repair levels
2458
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2459
AUTO_REPAIR_MIGRATE = "migrate"
2460
AUTO_REPAIR_FAILOVER = "failover"
2461
AUTO_REPAIR_REINSTALL = "reinstall"
2462
AUTO_REPAIR_ALL_TYPES = [
2463
  AUTO_REPAIR_FIX_STORAGE,
2464
  AUTO_REPAIR_MIGRATE,
2465
  AUTO_REPAIR_FAILOVER,
2466
  AUTO_REPAIR_REINSTALL,
2467
]
2468

    
2469
# Auto-repair results
2470
AUTO_REPAIR_SUCCESS = "success"
2471
AUTO_REPAIR_FAILURE = "failure"
2472
AUTO_REPAIR_ENOPERM = "enoperm"
2473
AUTO_REPAIR_ALL_RESULTS = frozenset([
2474
    AUTO_REPAIR_SUCCESS,
2475
    AUTO_REPAIR_FAILURE,
2476
    AUTO_REPAIR_ENOPERM,
2477
])
2478

    
2479
# The version identifier for builtin data collectors
2480
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2481

    
2482
# The reason trail opcode parameter name
2483
OPCODE_REASON = "reason"
2484

    
2485
# The source reasons for the execution of an OpCode
2486
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2487
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2488
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2489
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2490
OPCODE_REASON_SRC_USER = "gnt:user"
2491

    
2492
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2493
  OPCODE_REASON_SRC_CLIENT,
2494
  OPCODE_REASON_SRC_NODED,
2495
  OPCODE_REASON_SRC_OPCODE,
2496
  OPCODE_REASON_SRC_RLIB2,
2497
  OPCODE_REASON_SRC_USER,
2498
  ])
2499

    
2500
DISKSTATS_FILE = "/proc/diskstats"
2501

    
2502
# Do not re-export imported modules
2503
del re, _vcsversion, _autoconf, socket, pathutils, compat