Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 65fc2388

History | View | Annotate | Download (64.9 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
185
FIRST_DRBD_PORT = 11000
186
LAST_DRBD_PORT = 14999
187

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

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

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

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

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

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

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

    
227
DEV_CONSOLE = "/dev/console"
228

    
229
PROC_MOUNTS = "/proc/mounts"
230

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

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

    
246
EXPORT_CONF_FILE = "config.ini"
247

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
319
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
320

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

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

    
333
IE_CUSTOM_SIZE = "fd"
334

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
825
ES_PARAMETERS_FILE = "parameters.list"
826

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

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

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

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

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

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

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

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

    
955

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

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

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

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

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

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

    
1062
# KVM-specific statuses
1063
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1064

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1295
OOB_POWER_STATUS_POWERED = "powered"
1296

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1395
VNC_BASE_PORT = 5900
1396
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1397

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

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

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

    
1437
# Disk types
1438
HT_DISK_IOEMU = "ioemu"
1439
HT_DISK_IDE = "ide"
1440
HT_DISK_SCSI = "scsi"
1441
HT_DISK_SD = "sd"
1442
HT_DISK_MTD = "mtd"
1443
HT_DISK_PFLASH = "pflash"
1444

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

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

    
1469
# Mouse types:
1470
HT_MOUSE_MOUSE = "mouse"
1471
HT_MOUSE_TABLET = "tablet"
1472

    
1473
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1474
  HT_MOUSE_MOUSE,
1475
  HT_MOUSE_TABLET,
1476
  ])
1477

    
1478
# Boot order
1479
HT_BO_FLOPPY = "floppy"
1480
HT_BO_CDROM = "cdrom"
1481
HT_BO_DISK = "disk"
1482
HT_BO_NETWORK = "network"
1483

    
1484
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1485
  HT_BO_FLOPPY,
1486
  HT_BO_CDROM,
1487
  HT_BO_DISK,
1488
  HT_BO_NETWORK,
1489
  ])
1490

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

    
1499
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1500
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1501
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1502
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1503
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1504
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1505
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1506
  ])
1507

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

    
1513
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1514
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1515
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1516
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1517
  ])
1518

    
1519
# SPICE video stream detection
1520
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1521
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1522
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1523

    
1524
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1525
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1526
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1527
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1528
  ])
1529

    
1530
# Security models
1531
HT_SM_NONE = "none"
1532
HT_SM_USER = "user"
1533
HT_SM_POOL = "pool"
1534

    
1535
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1536
  HT_SM_NONE,
1537
  HT_SM_USER,
1538
  HT_SM_POOL,
1539
  ])
1540

    
1541
# Kvm flag values
1542
HT_KVM_ENABLED = "enabled"
1543
HT_KVM_DISABLED = "disabled"
1544

    
1545
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1546

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

    
1555
# Cluster Verify steps
1556
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1557
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1558

    
1559
# Cluster Verify error classes
1560
CV_TCLUSTER = "cluster"
1561
CV_TGROUP = "group"
1562
CV_TNODE = "node"
1563
CV_TINSTANCE = "instance"
1564

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

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

    
1687
CV_ALL_ECODES_STRINGS = \
1688
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1689

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

    
1716
# Instance status
1717
INSTST_RUNNING = "running"
1718
INSTST_ADMINDOWN = "ADMIN_down"
1719
INSTST_ADMINOFFLINE = "ADMIN_offline"
1720
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1721
INSTST_NODEDOWN = "ERROR_nodedown"
1722
INSTST_WRONGNODE = "ERROR_wrongnode"
1723
INSTST_ERRORUP = "ERROR_up"
1724
INSTST_ERRORDOWN = "ERROR_down"
1725
INSTST_ALL = compat.UniqueFrozenset([
1726
  INSTST_RUNNING,
1727
  INSTST_ADMINDOWN,
1728
  INSTST_ADMINOFFLINE,
1729
  INSTST_NODEOFFLINE,
1730
  INSTST_NODEDOWN,
1731
  INSTST_WRONGNODE,
1732
  INSTST_ERRORUP,
1733
  INSTST_ERRORDOWN,
1734
  ])
1735

    
1736
# Admin states
1737
ADMINST_UP = "up"
1738
ADMINST_DOWN = "down"
1739
ADMINST_OFFLINE = "offline"
1740
ADMINST_ALL = compat.UniqueFrozenset([
1741
  ADMINST_UP,
1742
  ADMINST_DOWN,
1743
  ADMINST_OFFLINE,
1744
  ])
1745

    
1746
# Node roles
1747
NR_REGULAR = "R"
1748
NR_MASTER = "M"
1749
NR_MCANDIDATE = "C"
1750
NR_DRAINED = "D"
1751
NR_OFFLINE = "O"
1752
NR_ALL = compat.UniqueFrozenset([
1753
  NR_REGULAR,
1754
  NR_MASTER,
1755
  NR_MCANDIDATE,
1756
  NR_DRAINED,
1757
  NR_OFFLINE,
1758
  ])
1759

    
1760
# SSL certificate check constants (in days)
1761
SSL_CERT_EXPIRATION_WARN = 30
1762
SSL_CERT_EXPIRATION_ERROR = 7
1763

    
1764
# Allocator framework constants
1765
IALLOCATOR_VERSION = 2
1766
IALLOCATOR_DIR_IN = "in"
1767
IALLOCATOR_DIR_OUT = "out"
1768
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1769
  IALLOCATOR_DIR_IN,
1770
  IALLOCATOR_DIR_OUT,
1771
  ])
1772
IALLOCATOR_MODE_ALLOC = "allocate"
1773
IALLOCATOR_MODE_RELOC = "relocate"
1774
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1775
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1776
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1777
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1778
  IALLOCATOR_MODE_ALLOC,
1779
  IALLOCATOR_MODE_RELOC,
1780
  IALLOCATOR_MODE_CHG_GROUP,
1781
  IALLOCATOR_MODE_NODE_EVAC,
1782
  IALLOCATOR_MODE_MULTI_ALLOC,
1783
  ])
1784
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1785
DEFAULT_IALLOCATOR_SHORTCUT = "."
1786

    
1787
IALLOCATOR_NEVAC_PRI = "primary-only"
1788
IALLOCATOR_NEVAC_SEC = "secondary-only"
1789
IALLOCATOR_NEVAC_ALL = "all"
1790
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1791
  IALLOCATOR_NEVAC_PRI,
1792
  IALLOCATOR_NEVAC_SEC,
1793
  IALLOCATOR_NEVAC_ALL,
1794
  ])
1795

    
1796
# Node evacuation
1797
NODE_EVAC_PRI = "primary-only"
1798
NODE_EVAC_SEC = "secondary-only"
1799
NODE_EVAC_ALL = "all"
1800
NODE_EVAC_MODES = compat.UniqueFrozenset([
1801
  NODE_EVAC_PRI,
1802
  NODE_EVAC_SEC,
1803
  NODE_EVAC_ALL,
1804
  ])
1805

    
1806
# Job queue
1807
JOB_QUEUE_VERSION = 1
1808
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1809
JOB_QUEUE_FILES_PERMS = 0640
1810

    
1811
JOB_ID_TEMPLATE = r"\d+"
1812
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1813

    
1814
# unchanged job return
1815
JOB_NOTCHANGED = "nochange"
1816

    
1817
# Job status
1818
JOB_STATUS_QUEUED = "queued"
1819
JOB_STATUS_WAITING = "waiting"
1820
JOB_STATUS_CANCELING = "canceling"
1821
JOB_STATUS_RUNNING = "running"
1822
JOB_STATUS_CANCELED = "canceled"
1823
JOB_STATUS_SUCCESS = "success"
1824
JOB_STATUS_ERROR = "error"
1825
JOBS_PENDING = compat.UniqueFrozenset([
1826
  JOB_STATUS_QUEUED,
1827
  JOB_STATUS_WAITING,
1828
  JOB_STATUS_CANCELING,
1829
  ])
1830
JOBS_FINALIZED = compat.UniqueFrozenset([
1831
  JOB_STATUS_CANCELED,
1832
  JOB_STATUS_SUCCESS,
1833
  JOB_STATUS_ERROR,
1834
  ])
1835
JOB_STATUS_ALL = compat.UniqueFrozenset([
1836
  JOB_STATUS_RUNNING,
1837
  ]) | JOBS_PENDING | JOBS_FINALIZED
1838

    
1839
# OpCode status
1840
# not yet finalized
1841
OP_STATUS_QUEUED = "queued"
1842
OP_STATUS_WAITING = "waiting"
1843
OP_STATUS_CANCELING = "canceling"
1844
OP_STATUS_RUNNING = "running"
1845
# finalized
1846
OP_STATUS_CANCELED = "canceled"
1847
OP_STATUS_SUCCESS = "success"
1848
OP_STATUS_ERROR = "error"
1849
OPS_FINALIZED = compat.UniqueFrozenset([
1850
  OP_STATUS_CANCELED,
1851
  OP_STATUS_SUCCESS,
1852
  OP_STATUS_ERROR,
1853
  ])
1854

    
1855
# OpCode priority
1856
OP_PRIO_LOWEST = +19
1857
OP_PRIO_HIGHEST = -20
1858

    
1859
OP_PRIO_LOW = +10
1860
OP_PRIO_NORMAL = 0
1861
OP_PRIO_HIGH = -10
1862

    
1863
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1864
  OP_PRIO_LOW,
1865
  OP_PRIO_NORMAL,
1866
  OP_PRIO_HIGH,
1867
  ])
1868

    
1869
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1870

    
1871
# Lock recalculate mode
1872
LOCKS_REPLACE = "replace"
1873
LOCKS_APPEND = "append"
1874

    
1875
# Lock timeout (sum) before we should go into blocking acquire (still
1876
# can be reset by priority change); computed as max time (10 hours)
1877
# before we should actually go into blocking acquire given that we
1878
# start from default priority level; in seconds
1879
# TODO
1880
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1881
LOCK_ATTEMPTS_MAXWAIT = 15.0
1882
LOCK_ATTEMPTS_MINWAIT = 1.0
1883

    
1884
# Execution log types
1885
ELOG_MESSAGE = "message"
1886
ELOG_REMOTE_IMPORT = "remote-import"
1887
ELOG_JQUEUE_TEST = "jqueue-test"
1888

    
1889
# /etc/hosts modification
1890
ETC_HOSTS_ADD = "add"
1891
ETC_HOSTS_REMOVE = "remove"
1892

    
1893
# Job queue test
1894
JQT_MSGPREFIX = "TESTMSG="
1895
JQT_EXPANDNAMES = "expandnames"
1896
JQT_EXEC = "exec"
1897
JQT_LOGMSG = "logmsg"
1898
JQT_STARTMSG = "startmsg"
1899
JQT_ALL = compat.UniqueFrozenset([
1900
  JQT_EXPANDNAMES,
1901
  JQT_EXEC,
1902
  JQT_LOGMSG,
1903
  JQT_STARTMSG,
1904
  ])
1905

    
1906
# Query resources
1907
QR_CLUSTER = "cluster"
1908
QR_INSTANCE = "instance"
1909
QR_NODE = "node"
1910
QR_LOCK = "lock"
1911
QR_GROUP = "group"
1912
QR_OS = "os"
1913
QR_JOB = "job"
1914
QR_EXPORT = "export"
1915
QR_NETWORK = "network"
1916
QR_EXTSTORAGE = "extstorage"
1917

    
1918
#: List of resources which can be queried using L{opcodes.OpQuery}
1919
QR_VIA_OP = compat.UniqueFrozenset([
1920
  QR_CLUSTER,
1921
  QR_INSTANCE,
1922
  QR_NODE,
1923
  QR_GROUP,
1924
  QR_OS,
1925
  QR_EXPORT,
1926
  QR_NETWORK,
1927
  QR_EXTSTORAGE,
1928
  ])
1929

    
1930
#: List of resources which can be queried using Local UniX Interface
1931
QR_VIA_LUXI = QR_VIA_OP.union([
1932
  QR_LOCK,
1933
  QR_JOB,
1934
  ])
1935

    
1936
#: List of resources which can be queried using RAPI
1937
QR_VIA_RAPI = QR_VIA_LUXI
1938

    
1939
# Query field types
1940
QFT_UNKNOWN = "unknown"
1941
QFT_TEXT = "text"
1942
QFT_BOOL = "bool"
1943
QFT_NUMBER = "number"
1944
QFT_UNIT = "unit"
1945
QFT_TIMESTAMP = "timestamp"
1946
QFT_OTHER = "other"
1947

    
1948
#: All query field types
1949
QFT_ALL = compat.UniqueFrozenset([
1950
  QFT_UNKNOWN,
1951
  QFT_TEXT,
1952
  QFT_BOOL,
1953
  QFT_NUMBER,
1954
  QFT_UNIT,
1955
  QFT_TIMESTAMP,
1956
  QFT_OTHER,
1957
  ])
1958

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

    
1974
RS_ALL = compat.UniqueFrozenset([
1975
  RS_NORMAL,
1976
  RS_UNKNOWN,
1977
  RS_NODATA,
1978
  RS_UNAVAIL,
1979
  RS_OFFLINE,
1980
  ])
1981

    
1982
#: Dictionary with special field cases and their verbose/terse formatting
1983
RSS_DESCRIPTION = {
1984
  RS_UNKNOWN: ("(unknown)", "??"),
1985
  RS_NODATA: ("(nodata)", "?"),
1986
  RS_OFFLINE: ("(offline)", "*"),
1987
  RS_UNAVAIL: ("(unavail)", "-"),
1988
  }
1989

    
1990
# max dynamic devices
1991
MAX_NICS = 8
1992
MAX_DISKS = 16
1993

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

    
2021
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2022
SS_HVPARAMS_PREF = "hvparams_"
2023

    
2024
# Hvparams keys:
2025
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2026
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2027
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2028
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2029
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2030
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2031

    
2032
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2033
  SS_HVPARAMS_XEN_PVM,
2034
  SS_HVPARAMS_XEN_FAKE,
2035
  SS_HVPARAMS_XEN_HVM,
2036
  SS_HVPARAMS_XEN_KVM,
2037
  SS_HVPARAMS_XEN_CHROOT,
2038
  SS_HVPARAMS_XEN_LXC,
2039
  ])
2040

    
2041
SS_FILE_PERMS = 0444
2042

    
2043
# cluster wide default parameters
2044
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2045

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

    
2158
HVC_GLOBALS = compat.UniqueFrozenset([
2159
  HV_MIGRATION_PORT,
2160
  HV_MIGRATION_BANDWIDTH,
2161
  HV_MIGRATION_MODE,
2162
  HV_XEN_CMD,
2163
  ])
2164

    
2165
BEC_DEFAULTS = {
2166
  BE_MINMEM: 128,
2167
  BE_MAXMEM: 128,
2168
  BE_VCPUS: 1,
2169
  BE_AUTO_BALANCE: True,
2170
  BE_ALWAYS_FAILOVER: False,
2171
  BE_SPINDLE_USE: 1,
2172
  }
2173

    
2174
NDC_DEFAULTS = {
2175
  ND_OOB_PROGRAM: "",
2176
  ND_SPINDLE_COUNT: 1,
2177
  ND_EXCLUSIVE_STORAGE: False,
2178
  }
2179

    
2180
NDC_GLOBALS = compat.UniqueFrozenset([
2181
  ND_EXCLUSIVE_STORAGE,
2182
  ])
2183

    
2184
DISK_LD_DEFAULTS = {
2185
  LD_DRBD8: {
2186
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2187
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2188
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2189
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2190
    LDP_DISK_CUSTOM: "",
2191
    LDP_NET_CUSTOM: "",
2192
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2193
    LDP_DYNAMIC_RESYNC: False,
2194

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

    
2217
# readability shortcuts
2218
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2219
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2220

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

    
2252
# we don't want to export the shortcuts
2253
del _LV_DEFAULTS, _DRBD_DEFAULTS
2254

    
2255
NICC_DEFAULTS = {
2256
  NIC_MODE: NIC_MODE_BRIDGED,
2257
  NIC_LINK: DEFAULT_BRIDGE,
2258
  }
2259

    
2260
# All of the following values are quite arbitrarily - there are no
2261
# "good" defaults, these must be customised per-site
2262
ISPECS_MINMAX_DEFAULTS = {
2263
  ISPECS_MIN: {
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
  ISPECS_MAX: {
2272
    ISPEC_MEM_SIZE: 32768,
2273
    ISPEC_CPU_COUNT: 8,
2274
    ISPEC_DISK_COUNT: MAX_DISKS,
2275
    ISPEC_DISK_SIZE: 1024 * 1024,
2276
    ISPEC_NIC_COUNT: MAX_NICS,
2277
    ISPEC_SPINDLE_USE: 12,
2278
    },
2279
  }
2280
IPOLICY_DEFAULTS = {
2281
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2282
  ISPECS_STD: {
2283
    ISPEC_MEM_SIZE: 128,
2284
    ISPEC_CPU_COUNT: 1,
2285
    ISPEC_DISK_COUNT: 1,
2286
    ISPEC_DISK_SIZE: 1024,
2287
    ISPEC_NIC_COUNT: 1,
2288
    ISPEC_SPINDLE_USE: 1,
2289
    },
2290
  IPOLICY_DTS: list(DISK_TEMPLATES),
2291
  IPOLICY_VCPU_RATIO: 4.0,
2292
  IPOLICY_SPINDLE_RATIO: 32.0,
2293
  }
2294

    
2295
MASTER_POOL_SIZE_DEFAULT = 10
2296

    
2297
# Exclusive storage:
2298
# Error margin used to compare physical disks
2299
PART_MARGIN = .01
2300
# Space reserved when creating instance disks
2301
PART_RESERVED = .02
2302

    
2303
CONFD_PROTOCOL_VERSION = 1
2304

    
2305
CONFD_REQ_PING = 0
2306
CONFD_REQ_NODE_ROLE_BYNAME = 1
2307
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2308
CONFD_REQ_CLUSTER_MASTER = 3
2309
CONFD_REQ_NODE_PIP_LIST = 4
2310
CONFD_REQ_MC_PIP_LIST = 5
2311
CONFD_REQ_INSTANCES_IPS_LIST = 6
2312
CONFD_REQ_NODE_DRBD = 7
2313
CONFD_REQ_NODE_INSTANCES = 8
2314

    
2315
# Confd request query fields. These are used to narrow down queries.
2316
# These must be strings rather than integers, because json-encoding
2317
# converts them to strings anyway, as they're used as dict-keys.
2318
CONFD_REQQ_LINK = "0"
2319
CONFD_REQQ_IP = "1"
2320
CONFD_REQQ_IPLIST = "2"
2321
CONFD_REQQ_FIELDS = "3"
2322

    
2323
CONFD_REQFIELD_NAME = "0"
2324
CONFD_REQFIELD_IP = "1"
2325
CONFD_REQFIELD_MNODE_PIP = "2"
2326

    
2327
CONFD_REQS = compat.UniqueFrozenset([
2328
  CONFD_REQ_PING,
2329
  CONFD_REQ_NODE_ROLE_BYNAME,
2330
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2331
  CONFD_REQ_CLUSTER_MASTER,
2332
  CONFD_REQ_NODE_PIP_LIST,
2333
  CONFD_REQ_MC_PIP_LIST,
2334
  CONFD_REQ_INSTANCES_IPS_LIST,
2335
  CONFD_REQ_NODE_DRBD,
2336
  ])
2337

    
2338
CONFD_REPL_STATUS_OK = 0
2339
CONFD_REPL_STATUS_ERROR = 1
2340
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2341

    
2342
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2343
  CONFD_REPL_STATUS_OK,
2344
  CONFD_REPL_STATUS_ERROR,
2345
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2346
  ])
2347

    
2348
(CONFD_NODE_ROLE_MASTER,
2349
 CONFD_NODE_ROLE_CANDIDATE,
2350
 CONFD_NODE_ROLE_OFFLINE,
2351
 CONFD_NODE_ROLE_DRAINED,
2352
 CONFD_NODE_ROLE_REGULAR,
2353
 ) = range(5)
2354

    
2355
# A few common errors for confd
2356
CONFD_ERROR_UNKNOWN_ENTRY = 1
2357
CONFD_ERROR_INTERNAL = 2
2358
CONFD_ERROR_ARGUMENT = 3
2359

    
2360
# Each request is "salted" by the current timestamp.
2361
# This constants decides how many seconds of skew to accept.
2362
# TODO: make this a default and allow the value to be more configurable
2363
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2364

    
2365
# When we haven't reloaded the config for more than this amount of
2366
# seconds, we force a test to see if inotify is betraying us. Using a
2367
# prime number to ensure we get less chance of 'same wakeup' with
2368
# other processes.
2369
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2370

    
2371
# If we receive more than one update in this amount of microseconds,
2372
# we move to polling every RATELIMIT seconds, rather than relying on
2373
# inotify, to be able to serve more requests.
2374
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2375

    
2376
# Magic number prepended to all confd queries.
2377
# This allows us to distinguish different types of confd protocols and handle
2378
# them. For example by changing this we can move the whole payload to be
2379
# compressed, or move away from json.
2380
CONFD_MAGIC_FOURCC = "plj0"
2381

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

    
2387
# Timeout in seconds to expire pending query request in the confd client
2388
# library. We don't actually expect any answer more than 10 seconds after we
2389
# sent a request.
2390
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2391

    
2392
# Maximum UDP datagram size.
2393
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2394
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2395
#   (assuming we can't use jumbo frames)
2396
# We just set this to 60K, which should be enough
2397
MAX_UDP_DATA_SIZE = 61440
2398

    
2399
# User-id pool minimum/maximum acceptable user-ids.
2400
UIDPOOL_UID_MIN = 0
2401
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2402

    
2403
# Name or path of the pgrep command
2404
PGREP = "pgrep"
2405

    
2406
# Name of the node group that gets created at cluster init or upgrade
2407
INITIAL_NODE_GROUP_NAME = "default"
2408

    
2409
# Possible values for NodeGroup.alloc_policy
2410
ALLOC_POLICY_PREFERRED = "preferred"
2411
ALLOC_POLICY_LAST_RESORT = "last_resort"
2412
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2413
VALID_ALLOC_POLICIES = [
2414
  ALLOC_POLICY_PREFERRED,
2415
  ALLOC_POLICY_LAST_RESORT,
2416
  ALLOC_POLICY_UNALLOCABLE,
2417
  ]
2418

    
2419
# Temporary external/shared storage parameters
2420
BLOCKDEV_DRIVER_MANUAL = "manual"
2421

    
2422
# qemu-img path, required for ovfconverter
2423
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2424

    
2425
# Whether htools was enabled at compilation time
2426
HTOOLS = _autoconf.HTOOLS
2427
# The hail iallocator
2428
IALLOC_HAIL = "hail"
2429

    
2430
# Fake opcodes for functions that have hooks attached to them via
2431
# backend.RunLocalHooks
2432
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2433
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2434

    
2435
# SSH key types
2436
SSHK_RSA = "rsa"
2437
SSHK_DSA = "dsa"
2438
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2439

    
2440
# SSH authorized key types
2441
SSHAK_RSA = "ssh-rsa"
2442
SSHAK_DSS = "ssh-dss"
2443
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2444

    
2445
# SSH setup
2446
SSHS_CLUSTER_NAME = "cluster_name"
2447
SSHS_SSH_HOST_KEY = "ssh_host_key"
2448
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2449
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2450

    
2451
#: Key files for SSH daemon
2452
SSH_DAEMON_KEYFILES = {
2453
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2454
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2455
  }
2456

    
2457
# Node daemon setup
2458
NDS_CLUSTER_NAME = "cluster_name"
2459
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2460
NDS_SSCONF = "ssconf"
2461
NDS_START_NODE_DAEMON = "start_node_daemon"
2462

    
2463
# Path generating random UUID
2464
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2465

    
2466
# Regex string for verifying a UUID
2467
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2468

    
2469
# Auto-repair tag prefixes
2470
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2471
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2472
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2473
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2474
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2475

    
2476
# Auto-repair levels
2477
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2478
AUTO_REPAIR_MIGRATE = "migrate"
2479
AUTO_REPAIR_FAILOVER = "failover"
2480
AUTO_REPAIR_REINSTALL = "reinstall"
2481
AUTO_REPAIR_ALL_TYPES = [
2482
  AUTO_REPAIR_FIX_STORAGE,
2483
  AUTO_REPAIR_MIGRATE,
2484
  AUTO_REPAIR_FAILOVER,
2485
  AUTO_REPAIR_REINSTALL,
2486
]
2487

    
2488
# Auto-repair results
2489
AUTO_REPAIR_SUCCESS = "success"
2490
AUTO_REPAIR_FAILURE = "failure"
2491
AUTO_REPAIR_ENOPERM = "enoperm"
2492
AUTO_REPAIR_ALL_RESULTS = frozenset([
2493
    AUTO_REPAIR_SUCCESS,
2494
    AUTO_REPAIR_FAILURE,
2495
    AUTO_REPAIR_ENOPERM,
2496
])
2497

    
2498
# The version identifier for builtin data collectors
2499
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2500

    
2501
# The reason trail opcode parameter name
2502
OPCODE_REASON = "reason"
2503

    
2504
# The source reasons for the execution of an OpCode
2505
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2506
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2507
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2508
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2509
OPCODE_REASON_SRC_USER = "gnt:user"
2510

    
2511
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2512
  OPCODE_REASON_SRC_CLIENT,
2513
  OPCODE_REASON_SRC_NODED,
2514
  OPCODE_REASON_SRC_OPCODE,
2515
  OPCODE_REASON_SRC_RLIB2,
2516
  OPCODE_REASON_SRC_USER,
2517
  ])
2518

    
2519
DISKSTATS_FILE = "/proc/diskstats"
2520

    
2521
# Do not re-export imported modules
2522
del re, _vcsversion, _autoconf, socket, pathutils, compat