Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 9c8c69bc

History | View | Annotate | Download (62.7 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
184
FIRST_DRBD_PORT = 11000
185
LAST_DRBD_PORT = 14999
186

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

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

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

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

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

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

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

    
226
DEV_CONSOLE = "/dev/console"
227

    
228
PROC_MOUNTS = "/proc/mounts"
229

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

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

    
245
EXPORT_CONF_FILE = "config.ini"
246

    
247
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
248
XEN_KERNEL = _autoconf.XEN_KERNEL
249
XEN_INITRD = _autoconf.XEN_INITRD
250
XEN_CMD_XM = "xm"
251
XEN_CMD_XL = "xl"
252
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
253
XEN_CMD = _autoconf.XEN_CMD
254

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

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

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

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

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

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

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

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

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

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

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

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

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

    
320
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
321

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

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

    
334
IE_CUSTOM_SIZE = "fd"
335

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
573
# drbd constants
574
DRBD_HMAC_ALG = "md5"
575
DRBD_NET_PROTOCOL = "C"
576
DRBD_STATUS_FILE = "/proc/drbd"
577

    
578
#: Size of DRBD meta block device
579
DRBD_META_SIZE = 128
580

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

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

    
599
# rbd tool command
600
RBD_CMD = "rbd"
601

    
602
# file backend driver
603
FD_LOOP = "loop"
604
FD_BLKTAP = "blktap"
605

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

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

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

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

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

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

    
648
# Remote import/export certificate validity in seconds
649
RIE_CERT_VALIDITY = 24 * 60 * 60
650

    
651
# Overall timeout for establishing connection
652
RIE_CONNECT_TIMEOUT = 180
653

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

    
657
# Export only: number of attempts to connect
658
RIE_CONNECT_RETRIES = 10
659

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

    
663
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
664

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

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

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

    
690
#: Exit code for query operations with unknown fields
691
EXIT_UNKNOWN_FIELD = 14
692

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

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

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

    
737
#: Key for job IDs in opcode result
738
JOB_IDS_KEY = "jobs"
739

    
740
# runparts results
741
(RUNPARTS_SKIP,
742
 RUNPARTS_RUN,
743
 RUNPARTS_ERR) = range(3)
744

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

    
751
# RPC constants
752
(RPC_ENCODING_NONE,
753
 RPC_ENCODING_ZLIB_BASE64) = range(2)
754

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

    
763
# Timeout for connecting to nodes (seconds)
764
RPC_CONNECT_TIMEOUT = 5
765

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

    
780
OS_API_FILE = "ganeti_api_version"
781
OS_VARIANTS_FILE = "variants.list"
782
OS_PARAMETERS_FILE = "parameters.list"
783

    
784
OS_VALIDATE_PARAMETERS = "parameters"
785
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
786

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

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

    
813
ES_PARAMETERS_FILE = "parameters.list"
814

    
815
# reboot types
816
INSTANCE_REBOOT_SOFT = "soft"
817
INSTANCE_REBOOT_HARD = "hard"
818
INSTANCE_REBOOT_FULL = "full"
819

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

    
826
# instance reboot behaviors
827
INSTANCE_REBOOT_ALLOWED = "reboot"
828
INSTANCE_REBOOT_EXIT = "exit"
829

    
830
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
831
  INSTANCE_REBOOT_ALLOWED,
832
  INSTANCE_REBOOT_EXIT,
833
  ])
834

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

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

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

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

    
940

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

    
1010
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1011

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

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

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

    
1039
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1040
  HV_MIGRATION_FAILED,
1041
  HV_MIGRATION_CANCELLED,
1042
  ])
1043

    
1044
# KVM-specific statuses
1045
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1046

    
1047
# Node info keys
1048
HV_NODEINFO_KEY_VERSION = "hv_version"
1049

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

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

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

    
1073
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1074

    
1075
# Disk state
1076
DS_DISK_TOTAL = "disk_total"
1077
DS_DISK_RESERVED = "disk_reserved"
1078
DS_DISK_OVERHEAD = "disk_overhead"
1079

    
1080
DS_DEFAULTS = {
1081
  DS_DISK_TOTAL: 0,
1082
  DS_DISK_RESERVED: 0,
1083
  DS_DISK_OVERHEAD: 0,
1084
  }
1085

    
1086
DSS_PARAMETER_TYPES = {
1087
  DS_DISK_TOTAL: VTYPE_INT,
1088
  DS_DISK_RESERVED: VTYPE_INT,
1089
  DS_DISK_OVERHEAD: VTYPE_INT,
1090
  }
1091

    
1092
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1093
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1094

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

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

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

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

    
1125
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1126

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

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

    
1144
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1145

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

    
1154
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1155
  ISPECS_MIN,
1156
  ISPECS_MAX,
1157
  ])
1158

    
1159
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1160
  IPOLICY_VCPU_RATIO,
1161
  IPOLICY_SPINDLE_RATIO,
1162
  ])
1163

    
1164
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1165
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1166

    
1167
# Node parameter names
1168
ND_OOB_PROGRAM = "oob_program"
1169
ND_SPINDLE_COUNT = "spindle_count"
1170
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1171

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

    
1178
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1179

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

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

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

    
1256
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1257

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

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

    
1273
OOB_POWER_STATUS_POWERED = "powered"
1274

    
1275
OOB_TIMEOUT = 60 # 60 seconds
1276
OOB_POWER_DELAY = 2.0 # 2 seconds
1277

    
1278
OOB_STATUS_OK = "OK"
1279
OOB_STATUS_WARNING = "WARNING"
1280
OOB_STATUS_CRITICAL = "CRITICAL"
1281
OOB_STATUS_UNKNOWN = "UNKNOWN"
1282

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

    
1290
# Instance Parameters Profile
1291
PP_DEFAULT = "default"
1292

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

    
1297
NIC_MODE_BRIDGED = "bridged"
1298
NIC_MODE_ROUTED = "routed"
1299
NIC_MODE_OVS = "openvswitch"
1300
NIC_IP_POOL = "pool"
1301

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

    
1308
RESERVE_ACTION = "reserve"
1309
RELEASE_ACTION = "release"
1310

    
1311
NICS_PARAMETER_TYPES = {
1312
  NIC_MODE: VTYPE_STRING,
1313
  NIC_LINK: VTYPE_STRING,
1314
  }
1315

    
1316
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1317

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

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

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

    
1367
VNC_BASE_PORT = 5900
1368
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1369

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

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

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

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

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

    
1432
# Mouse types:
1433
HT_MOUSE_MOUSE = "mouse"
1434
HT_MOUSE_TABLET = "tablet"
1435

    
1436
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1437
  HT_MOUSE_MOUSE,
1438
  HT_MOUSE_TABLET,
1439
  ])
1440

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

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

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

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

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

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

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

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

    
1493
# Security models
1494
HT_SM_NONE = "none"
1495
HT_SM_USER = "user"
1496
HT_SM_POOL = "pool"
1497

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

    
1504
# Kvm flag values
1505
HT_KVM_ENABLED = "enabled"
1506
HT_KVM_DISABLED = "disabled"
1507

    
1508
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1509

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

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

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

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

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

    
1645
CV_ALL_ECODES_STRINGS = \
1646
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1647

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

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

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

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

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

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

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

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

    
1763
# Job queue
1764
JOB_QUEUE_VERSION = 1
1765
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1766

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

    
1770
# unchanged job return
1771
JOB_NOTCHANGED = "nochange"
1772

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

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

    
1811
# OpCode priority
1812
OP_PRIO_LOWEST = +19
1813
OP_PRIO_HIGHEST = -20
1814

    
1815
OP_PRIO_LOW = +10
1816
OP_PRIO_NORMAL = 0
1817
OP_PRIO_HIGH = -10
1818

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

    
1825
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1826

    
1827
# Lock recalculate mode
1828
LOCKS_REPLACE = "replace"
1829
LOCKS_APPEND = "append"
1830

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

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

    
1845
# /etc/hosts modification
1846
ETC_HOSTS_ADD = "add"
1847
ETC_HOSTS_REMOVE = "remove"
1848

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

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

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

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

    
1892
#: List of resources which can be queried using RAPI
1893
QR_VIA_RAPI = QR_VIA_LUXI
1894

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

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

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

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

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

    
1946
# max dynamic devices
1947
MAX_NICS = 8
1948
MAX_DISKS = 16
1949

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

    
1977
SS_FILE_PERMS = 0444
1978

    
1979
# cluster wide default parameters
1980
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1981

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

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

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

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

    
2108
NDC_GLOBALS = compat.UniqueFrozenset([
2109
  ND_EXCLUSIVE_STORAGE,
2110
  ])
2111

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

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

    
2144
# readability shortcuts
2145
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2146
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2147

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

    
2178
# we don't want to export the shortcuts
2179
del _LV_DEFAULTS, _DRBD_DEFAULTS
2180

    
2181
NICC_DEFAULTS = {
2182
  NIC_MODE: NIC_MODE_BRIDGED,
2183
  NIC_LINK: DEFAULT_BRIDGE,
2184
  }
2185

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

    
2221
MASTER_POOL_SIZE_DEFAULT = 10
2222

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

    
2229
CONFD_PROTOCOL_VERSION = 1
2230

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

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

    
2249
CONFD_REQFIELD_NAME = "0"
2250
CONFD_REQFIELD_IP = "1"
2251
CONFD_REQFIELD_MNODE_PIP = "2"
2252

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

    
2264
CONFD_REPL_STATUS_OK = 0
2265
CONFD_REPL_STATUS_ERROR = 1
2266
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2267

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

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

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

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

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

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

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

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

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

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

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

    
2329
# Name or path of the pgrep command
2330
PGREP = "pgrep"
2331

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

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

    
2345
# Temporary external/shared storage parameters
2346
BLOCKDEV_DRIVER_MANUAL = "manual"
2347

    
2348
# qemu-img path, required for ovfconverter
2349
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2350

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

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

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

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

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

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

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

    
2389
# Path generating random UUID
2390
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2391

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

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

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

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

    
2424
# The version identifier for builtin data collectors
2425
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2426

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

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

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

    
2441
# Do not re-export imported modules
2442
del re, _vcsversion, _autoconf, socket, pathutils, compat