Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ da5f09ef

History | View | Annotate | Download (62.6 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

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

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

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

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

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

    
184
FIRST_DRBD_PORT = 11000
185
LAST_DRBD_PORT = 14999
186

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

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

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

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

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

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

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

    
226
DEV_CONSOLE = "/dev/console"
227

    
228
PROC_MOUNTS = "/proc/mounts"
229

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

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

    
245
EXPORT_CONF_FILE = "config.ini"
246

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
320
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
321

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

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

    
334
IE_CUSTOM_SIZE = "fd"
335

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

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

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

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

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

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

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

    
375
# Storage types
376
ST_BLOCK = "blockdev"
377
ST_DISKLESS = "diskless"
378
ST_EXT = "ext"
379
ST_FILE = "file"
380
ST_LVM_PV = "lvm-pv"
381
ST_LVM_VG = "lvm-vg"
382
ST_RADOS = "rados"
383
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
# Per default, only lvm is enabled.
397
DEFAULT_ENABLED_STORAGE_TYPES = compat.UniqueFrozenset([
398
  ST_LVM_VG,
399
  ])
400

    
401
# This is used to order determine the default storage type when the list
402
# of enabled storage types is inferred from the current state of the cluster.
403
# This only happens on an upgrade from a version of Ganeti that did not
404
# support the 'enabled_storage_methods' so far.
405
STORAGE_TYPES_PREFERENCE = [
406
  ST_LVM_VG,
407
  ST_FILE,
408
  ST_SHARED_FILE,
409
  ST_RADOS,
410
  ST_BLOCK,
411
  ]
412

    
413
# Storage fields
414
# first two are valid in LU context only, not passed to backend
415
SF_NODE = "node"
416
SF_TYPE = "type"
417
# and the rest are valid in backend
418
SF_NAME = "name"
419
SF_SIZE = "size"
420
SF_FREE = "free"
421
SF_USED = "used"
422
SF_ALLOCATABLE = "allocatable"
423

    
424
# Storage operations
425
SO_FIX_CONSISTENCY = "fix-consistency"
426

    
427
# Available fields per storage type
428
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
429
  SF_NAME,
430
  SF_TYPE,
431
  SF_SIZE,
432
  SF_USED,
433
  SF_FREE,
434
  SF_ALLOCATABLE,
435
  ])
436

    
437
MODIFIABLE_STORAGE_FIELDS = {
438
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
439
  }
440

    
441
VALID_STORAGE_OPERATIONS = {
442
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
443
  }
444

    
445
# Local disk status
446
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
447
(LDS_OKAY,
448
 LDS_UNKNOWN,
449
 LDS_FAULTY) = range(1, 4)
450

    
451
# disk template types
452
DT_BLOCK = "blockdev"
453
DT_DISKLESS = "diskless"
454
DT_DRBD8 = "drbd"
455
DT_EXT = "ext"
456
DT_FILE = "file"
457
DT_PLAIN = "plain"
458
DT_RBD = "rbd"
459
DT_SHARED_FILE = "sharedfile"
460

    
461
# mapping of disk templates to storage types
462
DISK_TEMPLATES_STORAGE_TYPE = {
463
  DT_BLOCK: ST_BLOCK,
464
  DT_DISKLESS: ST_DISKLESS,
465
  DT_DRBD8: ST_LVM_VG,
466
  DT_EXT: ST_EXT,
467
  DT_FILE: ST_FILE,
468
  DT_PLAIN: ST_LVM_VG,
469
  DT_RBD: ST_RADOS,
470
  DT_SHARED_FILE: ST_SHARED_FILE,
471
  }
472

    
473
# the set of network-mirrored disk templates
474
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
475

    
476
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
477
DTS_EXT_MIRROR = compat.UniqueFrozenset([
478
  DT_DISKLESS, # 'trivially' externally mirrored
479
  DT_SHARED_FILE,
480
  DT_BLOCK,
481
  DT_RBD,
482
  DT_EXT,
483
  ])
484

    
485
# the set of non-lvm-based disk templates
486
DTS_NOT_LVM = compat.UniqueFrozenset([
487
  DT_DISKLESS,
488
  DT_FILE,
489
  DT_SHARED_FILE,
490
  DT_BLOCK,
491
  DT_RBD,
492
  DT_EXT,
493
  ])
494

    
495
# the set of disk templates which can be grown
496
DTS_GROWABLE = compat.UniqueFrozenset([
497
  DT_PLAIN,
498
  DT_DRBD8,
499
  DT_FILE,
500
  DT_SHARED_FILE,
501
  DT_RBD,
502
  DT_EXT,
503
  ])
504

    
505
# the set of disk templates that allow adoption
506
DTS_MAY_ADOPT = compat.UniqueFrozenset([
507
  DT_PLAIN,
508
  DT_BLOCK,
509
  ])
510

    
511
# the set of disk templates that *must* use adoption
512
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
513

    
514
# the set of disk templates that allow migrations
515
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
516

    
517
# the set of file based disk templates
518
DTS_FILEBASED = compat.UniqueFrozenset([
519
  DT_FILE,
520
  DT_SHARED_FILE,
521
  ])
522

    
523
# the set of disk templates that are supported by exclusive_storage
524
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
525

    
526
# templates for which we don't perform checks on free space
527
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
528
  DT_FILE,
529
  DT_SHARED_FILE,
530
  DT_RBD,
531
  DT_EXT,
532
  ])
533

    
534
# logical disk types
535
LD_LV = "lvm"
536
LD_DRBD8 = "drbd8"
537
LD_FILE = "file"
538
LD_BLOCKDEV = "blockdev"
539
LD_RBD = "rbd"
540
LD_EXT = "ext"
541
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
542
  LD_LV,
543
  LD_DRBD8,
544
  LD_FILE,
545
  LD_BLOCKDEV,
546
  LD_RBD,
547
  LD_EXT,
548
  ])
549

    
550
LDS_BLOCK = compat.UniqueFrozenset([
551
  LD_LV,
552
  LD_DRBD8,
553
  LD_BLOCKDEV,
554
  LD_RBD,
555
  LD_EXT,
556
  ])
557

    
558
# drbd constants
559
DRBD_HMAC_ALG = "md5"
560
DRBD_NET_PROTOCOL = "C"
561
DRBD_STATUS_FILE = "/proc/drbd"
562

    
563
#: Size of DRBD meta block device
564
DRBD_META_SIZE = 128
565

    
566
# drbd barrier types
567
DRBD_B_NONE = "n"
568
DRBD_B_DISK_BARRIERS = "b"
569
DRBD_B_DISK_DRAIN = "d"
570
DRBD_B_DISK_FLUSH = "f"
571

    
572
# Valid barrier combinations: "n" or any non-null subset of "bfd"
573
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
574
  frozenset([DRBD_B_NONE]),
575
  frozenset([DRBD_B_DISK_BARRIERS]),
576
  frozenset([DRBD_B_DISK_DRAIN]),
577
  frozenset([DRBD_B_DISK_FLUSH]),
578
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
579
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
580
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
581
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
582
  ])
583

    
584
# rbd tool command
585
RBD_CMD = "rbd"
586

    
587
# file backend driver
588
FD_LOOP = "loop"
589
FD_BLKTAP = "blktap"
590

    
591
# the set of drbd-like disk types
592
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
593

    
594
# disk access mode
595
DISK_RDONLY = "ro"
596
DISK_RDWR = "rw"
597
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
598

    
599
# disk replacement mode
600
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
601
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
602
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
603
REPLACE_DISK_AUTO = "replace_auto"
604
REPLACE_MODES = compat.UniqueFrozenset([
605
  REPLACE_DISK_PRI,
606
  REPLACE_DISK_SEC,
607
  REPLACE_DISK_CHG,
608
  REPLACE_DISK_AUTO,
609
  ])
610

    
611
# Instance export mode
612
EXPORT_MODE_LOCAL = "local"
613
EXPORT_MODE_REMOTE = "remote"
614
EXPORT_MODES = compat.UniqueFrozenset([
615
  EXPORT_MODE_LOCAL,
616
  EXPORT_MODE_REMOTE,
617
  ])
618

    
619
# instance creation modes
620
INSTANCE_CREATE = "create"
621
INSTANCE_IMPORT = "import"
622
INSTANCE_REMOTE_IMPORT = "remote-import"
623
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
624
  INSTANCE_CREATE,
625
  INSTANCE_IMPORT,
626
  INSTANCE_REMOTE_IMPORT,
627
  ])
628

    
629
# Remote import/export handshake message and version
630
RIE_VERSION = 0
631
RIE_HANDSHAKE = "Hi, I'm Ganeti"
632

    
633
# Remote import/export certificate validity in seconds
634
RIE_CERT_VALIDITY = 24 * 60 * 60
635

    
636
# Overall timeout for establishing connection
637
RIE_CONNECT_TIMEOUT = 180
638

    
639
# Export only: how long to wait per connection attempt (seconds)
640
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
641

    
642
# Export only: number of attempts to connect
643
RIE_CONNECT_RETRIES = 10
644

    
645
#: Give child process up to 5 seconds to exit after sending a signal
646
CHILD_LINGER_TIMEOUT = 5.0
647

    
648
DISK_TEMPLATES = compat.UniqueFrozenset([
649
  DT_DISKLESS,
650
  DT_PLAIN,
651
  DT_DRBD8,
652
  DT_FILE,
653
  DT_SHARED_FILE,
654
  DT_BLOCK,
655
  DT_RBD,
656
  DT_EXT
657
  ])
658

    
659
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
660

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

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

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

    
686
#: Exit code for query operations with unknown fields
687
EXIT_UNKNOWN_FIELD = 14
688

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

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

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

    
733
#: Key for job IDs in opcode result
734
JOB_IDS_KEY = "jobs"
735

    
736
# runparts results
737
(RUNPARTS_SKIP,
738
 RUNPARTS_RUN,
739
 RUNPARTS_ERR) = range(3)
740

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

    
747
# RPC constants
748
(RPC_ENCODING_NONE,
749
 RPC_ENCODING_ZLIB_BASE64) = range(2)
750

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

    
759
# Timeout for connecting to nodes (seconds)
760
RPC_CONNECT_TIMEOUT = 5
761

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

    
776
OS_API_FILE = "ganeti_api_version"
777
OS_VARIANTS_FILE = "variants.list"
778
OS_PARAMETERS_FILE = "parameters.list"
779

    
780
OS_VALIDATE_PARAMETERS = "parameters"
781
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
782

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

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

    
809
ES_PARAMETERS_FILE = "parameters.list"
810

    
811
# reboot types
812
INSTANCE_REBOOT_SOFT = "soft"
813
INSTANCE_REBOOT_HARD = "hard"
814
INSTANCE_REBOOT_FULL = "full"
815

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

    
822
# instance reboot behaviors
823
INSTANCE_REBOOT_ALLOWED = "reboot"
824
INSTANCE_REBOOT_EXIT = "exit"
825

    
826
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
827
  INSTANCE_REBOOT_ALLOWED,
828
  INSTANCE_REBOOT_EXIT,
829
  ])
830

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

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

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

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

    
936

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

    
1006
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1007

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

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

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

    
1035
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1036
  HV_MIGRATION_FAILED,
1037
  HV_MIGRATION_CANCELLED,
1038
  ])
1039

    
1040
# KVM-specific statuses
1041
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1042

    
1043
# Node info keys
1044
HV_NODEINFO_KEY_VERSION = "hv_version"
1045

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

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

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

    
1069
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1070

    
1071
# Disk state
1072
DS_DISK_TOTAL = "disk_total"
1073
DS_DISK_RESERVED = "disk_reserved"
1074
DS_DISK_OVERHEAD = "disk_overhead"
1075

    
1076
DS_DEFAULTS = {
1077
  DS_DISK_TOTAL: 0,
1078
  DS_DISK_RESERVED: 0,
1079
  DS_DISK_OVERHEAD: 0,
1080
  }
1081

    
1082
DSS_PARAMETER_TYPES = {
1083
  DS_DISK_TOTAL: VTYPE_INT,
1084
  DS_DISK_RESERVED: VTYPE_INT,
1085
  DS_DISK_OVERHEAD: VTYPE_INT,
1086
  }
1087

    
1088
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1089
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1090

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

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

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

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

    
1121
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1122

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

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

    
1140
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1141

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

    
1150
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1151
  ISPECS_MIN,
1152
  ISPECS_MAX,
1153
  ])
1154

    
1155
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1156
  IPOLICY_VCPU_RATIO,
1157
  IPOLICY_SPINDLE_RATIO,
1158
  ])
1159

    
1160
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1161
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1162

    
1163
# Node parameter names
1164
ND_OOB_PROGRAM = "oob_program"
1165
ND_SPINDLE_COUNT = "spindle_count"
1166
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1167

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

    
1174
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1175

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

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

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

    
1252
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1253

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

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

    
1269
OOB_POWER_STATUS_POWERED = "powered"
1270

    
1271
OOB_TIMEOUT = 60 # 60 seconds
1272
OOB_POWER_DELAY = 2.0 # 2 seconds
1273

    
1274
OOB_STATUS_OK = "OK"
1275
OOB_STATUS_WARNING = "WARNING"
1276
OOB_STATUS_CRITICAL = "CRITICAL"
1277
OOB_STATUS_UNKNOWN = "UNKNOWN"
1278

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

    
1286
# Instance Parameters Profile
1287
PP_DEFAULT = "default"
1288

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

    
1293
NIC_MODE_BRIDGED = "bridged"
1294
NIC_MODE_ROUTED = "routed"
1295
NIC_MODE_OVS = "openvswitch"
1296
NIC_IP_POOL = "pool"
1297

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

    
1304
RESERVE_ACTION = "reserve"
1305
RELEASE_ACTION = "release"
1306

    
1307
NICS_PARAMETER_TYPES = {
1308
  NIC_MODE: VTYPE_STRING,
1309
  NIC_LINK: VTYPE_STRING,
1310
  }
1311

    
1312
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1313

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

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

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

    
1363
VNC_BASE_PORT = 5900
1364
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1365

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

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

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

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

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

    
1428
# Mouse types:
1429
HT_MOUSE_MOUSE = "mouse"
1430
HT_MOUSE_TABLET = "tablet"
1431

    
1432
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1433
  HT_MOUSE_MOUSE,
1434
  HT_MOUSE_TABLET,
1435
  ])
1436

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

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

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

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

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

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

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

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

    
1489
# Security models
1490
HT_SM_NONE = "none"
1491
HT_SM_USER = "user"
1492
HT_SM_POOL = "pool"
1493

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

    
1500
# Kvm flag values
1501
HT_KVM_ENABLED = "enabled"
1502
HT_KVM_DISABLED = "disabled"
1503

    
1504
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1505

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

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

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

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

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

    
1641
CV_ALL_ECODES_STRINGS = \
1642
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1643

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

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

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

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

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

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

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

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

    
1759
# Job queue
1760
JOB_QUEUE_VERSION = 1
1761
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1762

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

    
1766
# unchanged job return
1767
JOB_NOTCHANGED = "nochange"
1768

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

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

    
1807
# OpCode priority
1808
OP_PRIO_LOWEST = +19
1809
OP_PRIO_HIGHEST = -20
1810

    
1811
OP_PRIO_LOW = +10
1812
OP_PRIO_NORMAL = 0
1813
OP_PRIO_HIGH = -10
1814

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

    
1821
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1822

    
1823
# Lock recalculate mode
1824
LOCKS_REPLACE = "replace"
1825
LOCKS_APPEND = "append"
1826

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

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

    
1841
# /etc/hosts modification
1842
ETC_HOSTS_ADD = "add"
1843
ETC_HOSTS_REMOVE = "remove"
1844

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

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

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

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

    
1888
#: List of resources which can be queried using RAPI
1889
QR_VIA_RAPI = QR_VIA_LUXI
1890

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

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

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

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

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

    
1942
# max dynamic devices
1943
MAX_NICS = 8
1944
MAX_DISKS = 16
1945

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

    
1973
SS_FILE_PERMS = 0444
1974

    
1975
# cluster wide default parameters
1976
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1977

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

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

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

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

    
2104
NDC_GLOBALS = compat.UniqueFrozenset([
2105
  ND_EXCLUSIVE_STORAGE,
2106
  ])
2107

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

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

    
2140
# readability shortcuts
2141
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2142
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2143

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

    
2174
# we don't want to export the shortcuts
2175
del _LV_DEFAULTS, _DRBD_DEFAULTS
2176

    
2177
NICC_DEFAULTS = {
2178
  NIC_MODE: NIC_MODE_BRIDGED,
2179
  NIC_LINK: DEFAULT_BRIDGE,
2180
  }
2181

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

    
2217
MASTER_POOL_SIZE_DEFAULT = 10
2218

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

    
2225
CONFD_PROTOCOL_VERSION = 1
2226

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

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

    
2245
CONFD_REQFIELD_NAME = "0"
2246
CONFD_REQFIELD_IP = "1"
2247
CONFD_REQFIELD_MNODE_PIP = "2"
2248

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

    
2260
CONFD_REPL_STATUS_OK = 0
2261
CONFD_REPL_STATUS_ERROR = 1
2262
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2263

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

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

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

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

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

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

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

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

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

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

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

    
2325
# Name or path of the pgrep command
2326
PGREP = "pgrep"
2327

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

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

    
2341
# Temporary external/shared storage parameters
2342
BLOCKDEV_DRIVER_MANUAL = "manual"
2343

    
2344
# qemu-img path, required for ovfconverter
2345
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2346

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

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

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

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

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

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

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

    
2385
# Path generating random UUID
2386
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2387

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

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

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

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

    
2420
# The version identifier for builtin data collectors
2421
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2422

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

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

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

    
2437
# Do not re-export imported modules
2438
del re, _vcsversion, _autoconf, socket, pathutils, compat