Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 3a9fe2bc

History | View | Annotate | Download (64.2 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
LUXID_USER = _autoconf.LUXID_USER
108
LUXID_GROUP = _autoconf.LUXID_GROUP
109
NODED_USER = _autoconf.NODED_USER
110
NODED_GROUP = _autoconf.NODED_GROUP
111
MOND_USER = _autoconf.MOND_USER
112
MOND_GROUP = _autoconf.MOND_GROUP
113
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
114
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
115

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

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

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

    
139
# Wipe
140
DD_CMD = "dd"
141
MAX_WIPE_CHUNK = 1024 # 1GB
142
MIN_WIPE_CHUNK_PERCENT = 10
143

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

    
155
# SSH constants
156
SSH = "ssh"
157
SCP = "scp"
158

    
159
NODED = "ganeti-noded"
160
CONFD = "ganeti-confd"
161
LUXID = "ganeti-luxid"
162
RAPI = "ganeti-rapi"
163
MASTERD = "ganeti-masterd"
164
MOND = "ganeti-mond"
165

    
166
DAEMONS = compat.UniqueFrozenset([
167
  NODED,
168
  CONFD,
169
  LUXID,
170
  RAPI,
171
  MASTERD,
172
  MOND,
173
  ])
174

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

    
184
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
185
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
186
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
187
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
188

    
189
FIRST_DRBD_PORT = 11000
190
LAST_DRBD_PORT = 14999
191

    
192
DAEMONS_LOGBASE = {
193
  NODED: "node-daemon",
194
  CONFD: "conf-daemon",
195
  LUXID: "luxi-daemon",
196
  RAPI: "rapi-daemon",
197
  MASTERD: "master-daemon",
198
  MOND: "monitoring-daemon",
199
  }
200

    
201
DAEMONS_LOGFILES = \
202
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
203
         for daemon in DAEMONS_LOGBASE)
204

    
205
# Some daemons might require more than one logfile.
206
# Specifically, right now only the Haskell http library "snap", used by the
207
# monitoring daemon, requires multiple log files.
208

    
209
# These are the only valid reasons for having an extra logfile
210
EXTRA_LOGREASON_ACCESS = "access"
211
EXTRA_LOGREASON_ERROR = "error"
212

    
213
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
214
  EXTRA_LOGREASON_ACCESS,
215
  EXTRA_LOGREASON_ERROR,
216
  ])
217

    
218
# These are the extra logfiles, grouped by daemon
219
DAEMONS_EXTRA_LOGBASE = {
220
  MOND: {
221
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
222
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
223
    }
224
  }
225

    
226
DAEMONS_EXTRA_LOGFILES = \
227
  dict((daemon, dict((extra,
228
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
229
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
230
         for daemon in DAEMONS_EXTRA_LOGBASE)
231

    
232
DEV_CONSOLE = "/dev/console"
233

    
234
PROC_MOUNTS = "/proc/mounts"
235

    
236
# Local UniX Interface related constants
237
LUXI_EOM = "\3"
238
LUXI_VERSION = CONFIG_VERSION
239
#: Environment variable for the luxi override socket
240
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
241
LUXI_OVERRIDE_MASTER = "master"
242
LUXI_OVERRIDE_QUERY = "query"
243

    
244
# one of "no", "yes", "only"
245
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
246
SYSLOG_NO = "no"
247
SYSLOG_YES = "yes"
248
SYSLOG_ONLY = "only"
249
SYSLOG_SOCKET = "/dev/log"
250

    
251
EXPORT_CONF_FILE = "config.ini"
252

    
253
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
254
XEN_KERNEL = _autoconf.XEN_KERNEL
255
XEN_INITRD = _autoconf.XEN_INITRD
256
XEN_CMD_XM = "xm"
257
XEN_CMD_XL = "xl"
258
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
259
XEN_CMD = _autoconf.XEN_CMD
260

    
261
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
262
  XEN_CMD_XM,
263
  XEN_CMD_XL,
264
  ])
265

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

    
277
KVM_PATH = _autoconf.KVM_PATH
278
KVM_KERNEL = _autoconf.KVM_KERNEL
279
SOCAT_PATH = _autoconf.SOCAT_PATH
280
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
281
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
282
SOCAT_ESCAPE_CODE = "0x1d"
283

    
284
#: Console as SSH command
285
CONS_SSH = "ssh"
286

    
287
#: Console as VNC server
288
CONS_VNC = "vnc"
289

    
290
#: Console as SPICE server
291
CONS_SPICE = "spice"
292

    
293
#: Display a message for console access
294
CONS_MESSAGE = "msg"
295

    
296
#: All console types
297
CONS_ALL = compat.UniqueFrozenset([
298
  CONS_SSH,
299
  CONS_VNC,
300
  CONS_SPICE,
301
  CONS_MESSAGE,
302
  ])
303

    
304
# For RSA keys more bits are better, but they also make operations more
305
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
306
# 2010 on.
307
RSA_KEY_BITS = 2048
308

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

    
317
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
318
X509_CERT_SIGN_DIGEST = "SHA1"
319

    
320
# Default validity of certificates in days
321
X509_CERT_DEFAULT_VALIDITY = 365 * 5
322

    
323
# commonName (CN) used in certificates
324
X509_CERT_CN = "ganeti.example.com"
325

    
326
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
327

    
328
# Import/export daemon mode
329
IEM_IMPORT = "import"
330
IEM_EXPORT = "export"
331

    
332
# Import/export transport compression
333
IEC_NONE = "none"
334
IEC_GZIP = "gzip"
335
IEC_ALL = compat.UniqueFrozenset([
336
  IEC_NONE,
337
  IEC_GZIP,
338
  ])
339

    
340
IE_CUSTOM_SIZE = "fd"
341

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

    
344
# Import/export I/O
345
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
346
IEIO_FILE = "file"
347
# Raw block device I/O using "dd"
348
IEIO_RAW_DISK = "raw"
349
# OS definition import/export script
350
IEIO_SCRIPT = "script"
351

    
352
VALUE_DEFAULT = "default"
353
VALUE_AUTO = "auto"
354
VALUE_GENERATE = "generate"
355
VALUE_NONE = "none"
356
VALUE_TRUE = "true"
357
VALUE_FALSE = "false"
358

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

    
362
# hooks-related constants
363
HOOKS_PHASE_PRE = "pre"
364
HOOKS_PHASE_POST = "post"
365
HOOKS_NAME_CFGUPDATE = "config-update"
366
HOOKS_NAME_WATCHER = "watcher"
367
HOOKS_VERSION = 2
368
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
369

    
370
# hooks subject type (what object type does the LU deal with)
371
HTYPE_CLUSTER = "CLUSTER"
372
HTYPE_NODE = "NODE"
373
HTYPE_GROUP = "GROUP"
374
HTYPE_INSTANCE = "INSTANCE"
375
HTYPE_NETWORK = "NETWORK"
376

    
377
HKR_SKIP = 0
378
HKR_FAIL = 1
379
HKR_SUCCESS = 2
380

    
381
# Storage types
382
ST_BLOCK = "blockdev"
383
ST_DISKLESS = "diskless"
384
ST_EXT = "ext"
385
ST_FILE = "file"
386
ST_LVM_PV = "lvm-pv"
387
ST_LVM_VG = "lvm-vg"
388
ST_RADOS = "rados"
389

    
390
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
391
  ST_BLOCK,
392
  ST_DISKLESS,
393
  ST_EXT,
394
  ST_FILE,
395
  ST_LVM_PV,
396
  ST_LVM_VG,
397
  ST_RADOS,
398
  ])
399

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

    
411
# Storage operations
412
SO_FIX_CONSISTENCY = "fix-consistency"
413

    
414
# Available fields per storage type
415
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
416
  SF_NAME,
417
  SF_TYPE,
418
  SF_SIZE,
419
  SF_USED,
420
  SF_FREE,
421
  SF_ALLOCATABLE,
422
  ])
423

    
424
MODIFIABLE_STORAGE_FIELDS = {
425
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
426
  }
427

    
428
VALID_STORAGE_OPERATIONS = {
429
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
430
  }
431

    
432
# Local disk status
433
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
434
(LDS_OKAY,
435
 LDS_UNKNOWN,
436
 LDS_FAULTY) = range(1, 4)
437

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

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

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

    
474
# disk templates that are enabled by default
475
DEFAULT_ENABLED_DISK_TEMPLATES = compat.UniqueFrozenset([
476
  DT_DRBD8,
477
  DT_PLAIN,
478
  ])
479

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
694
# device types to hotplug
695
HOTPLUG_TARGET_DISK = "hotdisk"
696
HOTPLUG_TARGET_NIC = "hotnic"
697
HOTPLUG_ALL_TARGETS = frozenset([
698
  HOTPLUG_TARGET_DISK,
699
  HOTPLUG_TARGET_NIC
700
  ])
701

    
702
# hotplug actions
703
HOTPLUG_ACTION_ADD = "hotadd"
704
HOTPLUG_ACTION_REMOVE = "hotremove"
705
HOTPLUG_ACTION_MODIFY = "hotmod"
706
HOTPLUG_ALL_ACTIONS = frozenset([
707
  HOTPLUG_ACTION_ADD,
708
  HOTPLUG_ACTION_REMOVE,
709
  HOTPLUG_ACTION_MODIFY
710
  ])
711

    
712
# common exit codes
713
EXIT_SUCCESS = 0
714
EXIT_FAILURE = 1
715
EXIT_NOTCLUSTER = 5
716
EXIT_NOTMASTER = 11
717
EXIT_NODESETUP_ERROR = 12
718
EXIT_CONFIRMATION = 13 # need user confirmation
719

    
720
#: Exit code for query operations with unknown fields
721
EXIT_UNKNOWN_FIELD = 14
722

    
723
# tags
724
TAG_CLUSTER = "cluster"
725
TAG_NODEGROUP = "nodegroup"
726
TAG_NODE = "node"
727
TAG_INSTANCE = "instance"
728
TAG_NETWORK = "network"
729
VALID_TAG_TYPES = compat.UniqueFrozenset([
730
  TAG_CLUSTER,
731
  TAG_NODEGROUP,
732
  TAG_NODE,
733
  TAG_INSTANCE,
734
  TAG_NETWORK,
735
  ])
736
MAX_TAG_LEN = 128
737
MAX_TAGS_PER_OBJ = 4096
738

    
739
# others
740
DEFAULT_BRIDGE = "xen-br0"
741
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
742
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
743
IP4_ADDRESS_ANY = "0.0.0.0"
744
IP6_ADDRESS_LOCALHOST = "::1"
745
IP6_ADDRESS_ANY = "::"
746
IP4_VERSION = 4
747
IP6_VERSION = 6
748
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
749
# for export to htools
750
IP4_FAMILY = socket.AF_INET
751
IP6_FAMILY = socket.AF_INET6
752

    
753
TCP_PING_TIMEOUT = 10
754
DEFAULT_VG = "xenvg"
755
DEFAULT_DRBD_HELPER = "/bin/true"
756
MIN_VG_SIZE = 20480
757
DEFAULT_MAC_PREFIX = "aa:00:00"
758
# default maximum instance wait time, in seconds.
759
DEFAULT_SHUTDOWN_TIMEOUT = 120
760
NODE_MAX_CLOCK_SKEW = 150
761
# Time for an intra-cluster disk transfer to wait for a connection
762
DISK_TRANSFER_CONNECT_TIMEOUT = 60
763
# Disk index separator
764
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
765
IP_COMMAND_PATH = _autoconf.IP_PATH
766

    
767
#: Key for job IDs in opcode result
768
JOB_IDS_KEY = "jobs"
769

    
770
# runparts results
771
(RUNPARTS_SKIP,
772
 RUNPARTS_RUN,
773
 RUNPARTS_ERR) = range(3)
774

    
775
RUNPARTS_STATUS = compat.UniqueFrozenset([
776
  RUNPARTS_SKIP,
777
  RUNPARTS_RUN,
778
  RUNPARTS_ERR,
779
  ])
780

    
781
# RPC constants
782
(RPC_ENCODING_NONE,
783
 RPC_ENCODING_ZLIB_BASE64) = range(2)
784

    
785
# Various time constants for the timeout table
786
RPC_TMO_URGENT = 60 # one minute
787
RPC_TMO_FAST = 5 * 60 # five minutes
788
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
789
RPC_TMO_SLOW = 3600 # one hour
790
RPC_TMO_4HRS = 4 * 3600
791
RPC_TMO_1DAY = 86400
792

    
793
# Timeout for connecting to nodes (seconds)
794
RPC_CONNECT_TIMEOUT = 5
795

    
796
# os related constants
797
OS_SCRIPT_CREATE = "create"
798
OS_SCRIPT_IMPORT = "import"
799
OS_SCRIPT_EXPORT = "export"
800
OS_SCRIPT_RENAME = "rename"
801
OS_SCRIPT_VERIFY = "verify"
802
OS_SCRIPTS = compat.UniqueFrozenset([
803
  OS_SCRIPT_CREATE,
804
  OS_SCRIPT_IMPORT,
805
  OS_SCRIPT_EXPORT,
806
  OS_SCRIPT_RENAME,
807
  OS_SCRIPT_VERIFY,
808
  ])
809

    
810
OS_API_FILE = "ganeti_api_version"
811
OS_VARIANTS_FILE = "variants.list"
812
OS_PARAMETERS_FILE = "parameters.list"
813

    
814
OS_VALIDATE_PARAMETERS = "parameters"
815
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
816

    
817
# External Storage (ES) related constants
818
ES_ACTION_CREATE = "create"
819
ES_ACTION_REMOVE = "remove"
820
ES_ACTION_GROW = "grow"
821
ES_ACTION_ATTACH = "attach"
822
ES_ACTION_DETACH = "detach"
823
ES_ACTION_SETINFO = "setinfo"
824
ES_ACTION_VERIFY = "verify"
825
ES_ACTION_SNAPSHOT = "snapshot"
826

    
827
ES_SCRIPT_CREATE = ES_ACTION_CREATE
828
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
829
ES_SCRIPT_GROW = ES_ACTION_GROW
830
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
831
ES_SCRIPT_DETACH = ES_ACTION_DETACH
832
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
833
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
834
ES_SCRIPT_SNAPSHOT = ES_ACTION_SNAPSHOT
835
ES_SCRIPTS = frozenset([
836
  ES_SCRIPT_CREATE,
837
  ES_SCRIPT_REMOVE,
838
  ES_SCRIPT_GROW,
839
  ES_SCRIPT_ATTACH,
840
  ES_SCRIPT_DETACH,
841
  ES_SCRIPT_SETINFO,
842
  ES_SCRIPT_VERIFY,
843
  ES_SCRIPT_SNAPSHOT
844
  ])
845

    
846
ES_PARAMETERS_FILE = "parameters.list"
847

    
848
# reboot types
849
INSTANCE_REBOOT_SOFT = "soft"
850
INSTANCE_REBOOT_HARD = "hard"
851
INSTANCE_REBOOT_FULL = "full"
852

    
853
REBOOT_TYPES = compat.UniqueFrozenset([
854
  INSTANCE_REBOOT_SOFT,
855
  INSTANCE_REBOOT_HARD,
856
  INSTANCE_REBOOT_FULL,
857
  ])
858

    
859
# instance reboot behaviors
860
INSTANCE_REBOOT_ALLOWED = "reboot"
861
INSTANCE_REBOOT_EXIT = "exit"
862

    
863
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
864
  INSTANCE_REBOOT_ALLOWED,
865
  INSTANCE_REBOOT_EXIT,
866
  ])
867

    
868
VTYPE_STRING = "string"
869
VTYPE_MAYBE_STRING = "maybe-string"
870
VTYPE_BOOL = "bool"
871
VTYPE_SIZE = "size" # size, in MiBs
872
VTYPE_INT = "int"
873
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
874
  VTYPE_STRING,
875
  VTYPE_MAYBE_STRING,
876
  VTYPE_BOOL,
877
  VTYPE_SIZE,
878
  VTYPE_INT,
879
  ])
880

    
881
# Constant representing that the user does not specify any IP version
882
IFACE_NO_IP_VERSION_SPECIFIED = 0
883

    
884
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
885
  75,
886
  110,
887
  300,
888
  600,
889
  1200,
890
  1800,
891
  2400,
892
  4800,
893
  9600,
894
  14400,
895
  19200,
896
  28800,
897
  38400,
898
  57600,
899
  115200,
900
  230400,
901
  345600,
902
  460800,
903
  ])
904

    
905
# HV parameter names (global namespace)
906
HV_BOOT_ORDER = "boot_order"
907
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
908
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
909
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
910
HV_NIC_TYPE = "nic_type"
911
HV_DISK_TYPE = "disk_type"
912
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
913
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
914
HV_VNC_PASSWORD_FILE = "vnc_password_file"
915
HV_VNC_TLS = "vnc_tls"
916
HV_VNC_X509 = "vnc_x509_path"
917
HV_VNC_X509_VERIFY = "vnc_x509_verify"
918
HV_KVM_SPICE_BIND = "spice_bind"
919
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
920
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
921
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
922
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
923
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
924
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
925
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
926
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
927
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
928
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
929
HV_ACPI = "acpi"
930
HV_PAE = "pae"
931
HV_USE_BOOTLOADER = "use_bootloader"
932
HV_BOOTLOADER_ARGS = "bootloader_args"
933
HV_BOOTLOADER_PATH = "bootloader_path"
934
HV_KERNEL_ARGS = "kernel_args"
935
HV_KERNEL_PATH = "kernel_path"
936
HV_INITRD_PATH = "initrd_path"
937
HV_ROOT_PATH = "root_path"
938
HV_SERIAL_CONSOLE = "serial_console"
939
HV_SERIAL_SPEED = "serial_speed"
940
HV_USB_MOUSE = "usb_mouse"
941
HV_KEYMAP = "keymap"
942
HV_DEVICE_MODEL = "device_model"
943
HV_INIT_SCRIPT = "init_script"
944
HV_MIGRATION_PORT = "migration_port"
945
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
946
HV_MIGRATION_DOWNTIME = "migration_downtime"
947
HV_MIGRATION_MODE = "migration_mode"
948
HV_USE_LOCALTIME = "use_localtime"
949
HV_DISK_CACHE = "disk_cache"
950
HV_SECURITY_MODEL = "security_model"
951
HV_SECURITY_DOMAIN = "security_domain"
952
HV_KVM_FLAG = "kvm_flag"
953
HV_VHOST_NET = "vhost_net"
954
HV_KVM_USE_CHROOT = "use_chroot"
955
HV_CPU_MASK = "cpu_mask"
956
HV_MEM_PATH = "mem_path"
957
HV_PASSTHROUGH = "pci_pass"
958
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
959
HV_REBOOT_BEHAVIOR = "reboot_behavior"
960
HV_CPU_TYPE = "cpu_type"
961
HV_CPU_CAP = "cpu_cap"
962
HV_CPU_WEIGHT = "cpu_weight"
963
HV_CPU_CORES = "cpu_cores"
964
HV_CPU_THREADS = "cpu_threads"
965
HV_CPU_SOCKETS = "cpu_sockets"
966
HV_SOUNDHW = "soundhw"
967
HV_USB_DEVICES = "usb_devices"
968
HV_VGA = "vga"
969
HV_KVM_EXTRA = "kvm_extra"
970
HV_KVM_MACHINE_VERSION = "machine_version"
971
HV_KVM_PATH = "kvm_path"
972
HV_VIF_TYPE = "vif_type"
973
HV_VNET_HDR = "vnet_hdr"
974
HV_VIRIDIAN = "viridian"
975

    
976
HVS_PARAMETER_TYPES = {
977
  HV_KVM_PATH: VTYPE_STRING,
978
  HV_BOOT_ORDER: VTYPE_STRING,
979
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
980
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
981
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
982
  HV_NIC_TYPE: VTYPE_STRING,
983
  HV_DISK_TYPE: VTYPE_STRING,
984
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
985
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
986
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
987
  HV_VNC_TLS: VTYPE_BOOL,
988
  HV_VNC_X509: VTYPE_STRING,
989
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
990
  HV_KVM_SPICE_BIND: VTYPE_STRING,
991
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
992
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
993
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
994
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
995
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
996
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
997
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
998
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
999
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
1000
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
1001
  HV_ACPI: VTYPE_BOOL,
1002
  HV_PAE: VTYPE_BOOL,
1003
  HV_USE_BOOTLOADER: VTYPE_BOOL,
1004
  HV_BOOTLOADER_PATH: VTYPE_STRING,
1005
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
1006
  HV_KERNEL_PATH: VTYPE_STRING,
1007
  HV_KERNEL_ARGS: VTYPE_STRING,
1008
  HV_INITRD_PATH: VTYPE_STRING,
1009
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
1010
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
1011
  HV_SERIAL_SPEED: VTYPE_INT,
1012
  HV_USB_MOUSE: VTYPE_STRING,
1013
  HV_KEYMAP: VTYPE_STRING,
1014
  HV_DEVICE_MODEL: VTYPE_STRING,
1015
  HV_INIT_SCRIPT: VTYPE_STRING,
1016
  HV_MIGRATION_PORT: VTYPE_INT,
1017
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
1018
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
1019
  HV_MIGRATION_MODE: VTYPE_STRING,
1020
  HV_USE_LOCALTIME: VTYPE_BOOL,
1021
  HV_DISK_CACHE: VTYPE_STRING,
1022
  HV_SECURITY_MODEL: VTYPE_STRING,
1023
  HV_SECURITY_DOMAIN: VTYPE_STRING,
1024
  HV_KVM_FLAG: VTYPE_STRING,
1025
  HV_VHOST_NET: VTYPE_BOOL,
1026
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
1027
  HV_CPU_MASK: VTYPE_STRING,
1028
  HV_MEM_PATH: VTYPE_STRING,
1029
  HV_PASSTHROUGH: VTYPE_STRING,
1030
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
1031
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
1032
  HV_CPU_TYPE: VTYPE_STRING,
1033
  HV_CPU_CAP: VTYPE_INT,
1034
  HV_CPU_WEIGHT: VTYPE_INT,
1035
  HV_CPU_CORES: VTYPE_INT,
1036
  HV_CPU_THREADS: VTYPE_INT,
1037
  HV_CPU_SOCKETS: VTYPE_INT,
1038
  HV_SOUNDHW: VTYPE_STRING,
1039
  HV_USB_DEVICES: VTYPE_STRING,
1040
  HV_VGA: VTYPE_STRING,
1041
  HV_KVM_EXTRA: VTYPE_STRING,
1042
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1043
  HV_VIF_TYPE: VTYPE_STRING,
1044
  HV_VNET_HDR: VTYPE_BOOL,
1045
  HV_VIRIDIAN: VTYPE_BOOL,
1046
  }
1047

    
1048
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1049

    
1050
HVS_PARAMETER_TITLES = {
1051
  HV_ACPI: "ACPI",
1052
  HV_BOOT_ORDER: "Boot_order",
1053
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1054
  HV_DISK_TYPE: "Disk_type",
1055
  HV_INITRD_PATH: "Initrd_path",
1056
  HV_KERNEL_PATH: "Kernel_path",
1057
  HV_NIC_TYPE: "NIC_type",
1058
  HV_PAE: "PAE",
1059
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1060
  HV_PASSTHROUGH: "pci_pass",
1061
  HV_CPU_TYPE: "cpu_type",
1062
  }
1063

    
1064
# Migration statuses
1065
HV_MIGRATION_COMPLETED = "completed"
1066
HV_MIGRATION_ACTIVE = "active"
1067
HV_MIGRATION_FAILED = "failed"
1068
HV_MIGRATION_CANCELLED = "cancelled"
1069

    
1070
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1071
  HV_MIGRATION_COMPLETED,
1072
  HV_MIGRATION_ACTIVE,
1073
  HV_MIGRATION_FAILED,
1074
  HV_MIGRATION_CANCELLED,
1075
  ])
1076

    
1077
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1078
  HV_MIGRATION_FAILED,
1079
  HV_MIGRATION_CANCELLED,
1080
  ])
1081

    
1082
# KVM-specific statuses
1083
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1084

    
1085
# Node info keys
1086
HV_NODEINFO_KEY_VERSION = "hv_version"
1087

    
1088
# Hypervisor state
1089
HVST_MEMORY_TOTAL = "mem_total"
1090
HVST_MEMORY_NODE = "mem_node"
1091
HVST_MEMORY_HV = "mem_hv"
1092
HVST_CPU_TOTAL = "cpu_total"
1093
HVST_CPU_NODE = "cpu_node"
1094

    
1095
HVST_DEFAULTS = {
1096
  HVST_MEMORY_TOTAL: 0,
1097
  HVST_MEMORY_NODE: 0,
1098
  HVST_MEMORY_HV: 0,
1099
  HVST_CPU_TOTAL: 1,
1100
  HVST_CPU_NODE: 1,
1101
  }
1102

    
1103
HVSTS_PARAMETER_TYPES = {
1104
  HVST_MEMORY_TOTAL: VTYPE_INT,
1105
  HVST_MEMORY_NODE: VTYPE_INT,
1106
  HVST_MEMORY_HV: VTYPE_INT,
1107
  HVST_CPU_TOTAL: VTYPE_INT,
1108
  HVST_CPU_NODE: VTYPE_INT,
1109
  }
1110

    
1111
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1112

    
1113
# Disk state
1114
DS_DISK_TOTAL = "disk_total"
1115
DS_DISK_RESERVED = "disk_reserved"
1116
DS_DISK_OVERHEAD = "disk_overhead"
1117

    
1118
DS_DEFAULTS = {
1119
  DS_DISK_TOTAL: 0,
1120
  DS_DISK_RESERVED: 0,
1121
  DS_DISK_OVERHEAD: 0,
1122
  }
1123

    
1124
DSS_PARAMETER_TYPES = {
1125
  DS_DISK_TOTAL: VTYPE_INT,
1126
  DS_DISK_RESERVED: VTYPE_INT,
1127
  DS_DISK_OVERHEAD: VTYPE_INT,
1128
  }
1129

    
1130
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1131
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1132

    
1133
# Backend parameter names
1134
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1135
BE_MAXMEM = "maxmem"
1136
BE_MINMEM = "minmem"
1137
BE_VCPUS = "vcpus"
1138
BE_AUTO_BALANCE = "auto_balance"
1139
BE_ALWAYS_FAILOVER = "always_failover"
1140
BE_SPINDLE_USE = "spindle_use"
1141

    
1142
BES_PARAMETER_TYPES = {
1143
  BE_MAXMEM: VTYPE_SIZE,
1144
  BE_MINMEM: VTYPE_SIZE,
1145
  BE_VCPUS: VTYPE_INT,
1146
  BE_AUTO_BALANCE: VTYPE_BOOL,
1147
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1148
  BE_SPINDLE_USE: VTYPE_INT,
1149
  }
1150

    
1151
BES_PARAMETER_TITLES = {
1152
  BE_AUTO_BALANCE: "Auto_balance",
1153
  BE_MAXMEM: "ConfigMaxMem",
1154
  BE_MINMEM: "ConfigMinMem",
1155
  BE_VCPUS: "ConfigVCPUs",
1156
  }
1157

    
1158
BES_PARAMETER_COMPAT = {
1159
  BE_MEMORY: VTYPE_SIZE,
1160
  }
1161
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1162

    
1163
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1164

    
1165
# instance specs
1166
ISPEC_MEM_SIZE = "memory-size"
1167
ISPEC_CPU_COUNT = "cpu-count"
1168
ISPEC_DISK_COUNT = "disk-count"
1169
ISPEC_DISK_SIZE = "disk-size"
1170
ISPEC_NIC_COUNT = "nic-count"
1171
ISPEC_SPINDLE_USE = "spindle-use"
1172

    
1173
ISPECS_PARAMETER_TYPES = {
1174
  ISPEC_MEM_SIZE: VTYPE_INT,
1175
  ISPEC_CPU_COUNT: VTYPE_INT,
1176
  ISPEC_DISK_COUNT: VTYPE_INT,
1177
  ISPEC_DISK_SIZE: VTYPE_INT,
1178
  ISPEC_NIC_COUNT: VTYPE_INT,
1179
  ISPEC_SPINDLE_USE: VTYPE_INT,
1180
  }
1181

    
1182
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1183

    
1184
ISPECS_MINMAX = "minmax"
1185
ISPECS_MIN = "min"
1186
ISPECS_MAX = "max"
1187
ISPECS_STD = "std"
1188
IPOLICY_DTS = "disk-templates"
1189
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1190
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1191

    
1192
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1193
  ISPECS_MIN,
1194
  ISPECS_MAX,
1195
  ])
1196

    
1197
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1198
  IPOLICY_VCPU_RATIO,
1199
  IPOLICY_SPINDLE_RATIO,
1200
  ])
1201

    
1202
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1203
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1204

    
1205
# Node parameter names
1206
ND_OOB_PROGRAM = "oob_program"
1207
ND_SPINDLE_COUNT = "spindle_count"
1208
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1209

    
1210
NDS_PARAMETER_TYPES = {
1211
  ND_OOB_PROGRAM: VTYPE_STRING,
1212
  ND_SPINDLE_COUNT: VTYPE_INT,
1213
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1214
  }
1215

    
1216
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1217

    
1218
NDS_PARAMETER_TITLES = {
1219
  ND_OOB_PROGRAM: "OutOfBandProgram",
1220
  ND_SPINDLE_COUNT: "SpindleCount",
1221
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1222
  }
1223

    
1224
# Logical Disks parameters
1225
LDP_RESYNC_RATE = "resync-rate"
1226
LDP_STRIPES = "stripes"
1227
LDP_BARRIERS = "disabled-barriers"
1228
LDP_NO_META_FLUSH = "disable-meta-flush"
1229
LDP_DEFAULT_METAVG = "default-metavg"
1230
LDP_DISK_CUSTOM = "disk-custom"
1231
LDP_NET_CUSTOM = "net-custom"
1232
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1233
LDP_PLAN_AHEAD = "c-plan-ahead"
1234
LDP_FILL_TARGET = "c-fill-target"
1235
LDP_DELAY_TARGET = "c-delay-target"
1236
LDP_MAX_RATE = "c-max-rate"
1237
LDP_MIN_RATE = "c-min-rate"
1238
LDP_POOL = "pool"
1239
DISK_LD_TYPES = {
1240
  LDP_RESYNC_RATE: VTYPE_INT,
1241
  LDP_STRIPES: VTYPE_INT,
1242
  LDP_BARRIERS: VTYPE_STRING,
1243
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1244
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1245
  LDP_DISK_CUSTOM: VTYPE_STRING,
1246
  LDP_NET_CUSTOM: VTYPE_STRING,
1247
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1248
  LDP_PLAN_AHEAD: VTYPE_INT,
1249
  LDP_FILL_TARGET: VTYPE_INT,
1250
  LDP_DELAY_TARGET: VTYPE_INT,
1251
  LDP_MAX_RATE: VTYPE_INT,
1252
  LDP_MIN_RATE: VTYPE_INT,
1253
  LDP_POOL: VTYPE_STRING,
1254
  }
1255
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1256

    
1257
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1258
# gnt-group)
1259
DRBD_RESYNC_RATE = "resync-rate"
1260
DRBD_DATA_STRIPES = "data-stripes"
1261
DRBD_META_STRIPES = "meta-stripes"
1262
DRBD_DISK_BARRIERS = "disk-barriers"
1263
DRBD_META_BARRIERS = "meta-barriers"
1264
DRBD_DEFAULT_METAVG = "metavg"
1265
DRBD_DISK_CUSTOM = "disk-custom"
1266
DRBD_NET_CUSTOM = "net-custom"
1267
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1268
DRBD_PLAN_AHEAD = "c-plan-ahead"
1269
DRBD_FILL_TARGET = "c-fill-target"
1270
DRBD_DELAY_TARGET = "c-delay-target"
1271
DRBD_MAX_RATE = "c-max-rate"
1272
DRBD_MIN_RATE = "c-min-rate"
1273
LV_STRIPES = "stripes"
1274
RBD_POOL = "pool"
1275
DISK_DT_TYPES = {
1276
  DRBD_RESYNC_RATE: VTYPE_INT,
1277
  DRBD_DATA_STRIPES: VTYPE_INT,
1278
  DRBD_META_STRIPES: VTYPE_INT,
1279
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1280
  DRBD_META_BARRIERS: VTYPE_BOOL,
1281
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1282
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1283
  DRBD_NET_CUSTOM: VTYPE_STRING,
1284
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1285
  DRBD_PLAN_AHEAD: VTYPE_INT,
1286
  DRBD_FILL_TARGET: VTYPE_INT,
1287
  DRBD_DELAY_TARGET: VTYPE_INT,
1288
  DRBD_MAX_RATE: VTYPE_INT,
1289
  DRBD_MIN_RATE: VTYPE_INT,
1290
  LV_STRIPES: VTYPE_INT,
1291
  RBD_POOL: VTYPE_STRING,
1292
  }
1293

    
1294
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1295

    
1296
# OOB supported commands
1297
OOB_POWER_ON = "power-on"
1298
OOB_POWER_OFF = "power-off"
1299
OOB_POWER_CYCLE = "power-cycle"
1300
OOB_POWER_STATUS = "power-status"
1301
OOB_HEALTH = "health"
1302

    
1303
OOB_COMMANDS = compat.UniqueFrozenset([
1304
  OOB_POWER_ON,
1305
  OOB_POWER_OFF,
1306
  OOB_POWER_CYCLE,
1307
  OOB_POWER_STATUS,
1308
  OOB_HEALTH,
1309
  ])
1310

    
1311
OOB_POWER_STATUS_POWERED = "powered"
1312

    
1313
OOB_TIMEOUT = 60 # 60 seconds
1314
OOB_POWER_DELAY = 2.0 # 2 seconds
1315

    
1316
OOB_STATUS_OK = "OK"
1317
OOB_STATUS_WARNING = "WARNING"
1318
OOB_STATUS_CRITICAL = "CRITICAL"
1319
OOB_STATUS_UNKNOWN = "UNKNOWN"
1320

    
1321
OOB_STATUSES = compat.UniqueFrozenset([
1322
  OOB_STATUS_OK,
1323
  OOB_STATUS_WARNING,
1324
  OOB_STATUS_CRITICAL,
1325
  OOB_STATUS_UNKNOWN,
1326
  ])
1327

    
1328
# Instance Parameters Profile
1329
PP_DEFAULT = "default"
1330

    
1331
# NIC_* constants are used inside the ganeti config
1332
NIC_MODE = "mode"
1333
NIC_LINK = "link"
1334

    
1335
NIC_MODE_BRIDGED = "bridged"
1336
NIC_MODE_ROUTED = "routed"
1337
NIC_MODE_OVS = "openvswitch"
1338
NIC_IP_POOL = "pool"
1339

    
1340
NIC_VALID_MODES = compat.UniqueFrozenset([
1341
  NIC_MODE_BRIDGED,
1342
  NIC_MODE_ROUTED,
1343
  NIC_MODE_OVS,
1344
  ])
1345

    
1346
RESERVE_ACTION = "reserve"
1347
RELEASE_ACTION = "release"
1348

    
1349
NICS_PARAMETER_TYPES = {
1350
  NIC_MODE: VTYPE_STRING,
1351
  NIC_LINK: VTYPE_STRING,
1352
  }
1353

    
1354
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1355

    
1356
# IDISK_* constants are used in opcodes, to create/change disks
1357
IDISK_SIZE = "size"
1358
IDISK_MODE = "mode"
1359
IDISK_ADOPT = "adopt"
1360
IDISK_VG = "vg"
1361
IDISK_METAVG = "metavg"
1362
IDISK_PROVIDER = "provider"
1363
IDISK_NAME = "name"
1364
IDISK_PARAMS_TYPES = {
1365
  IDISK_SIZE: VTYPE_SIZE,
1366
  IDISK_MODE: VTYPE_STRING,
1367
  IDISK_ADOPT: VTYPE_STRING,
1368
  IDISK_VG: VTYPE_STRING,
1369
  IDISK_METAVG: VTYPE_STRING,
1370
  IDISK_PROVIDER: VTYPE_STRING,
1371
  IDISK_NAME: VTYPE_MAYBE_STRING,
1372
  }
1373
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1374

    
1375
# INIC_* constants are used in opcodes, to create/change nics
1376
INIC_MAC = "mac"
1377
INIC_IP = "ip"
1378
INIC_MODE = "mode"
1379
INIC_LINK = "link"
1380
INIC_NETWORK = "network"
1381
INIC_NAME = "name"
1382
INIC_PARAMS_TYPES = {
1383
  INIC_IP: VTYPE_MAYBE_STRING,
1384
  INIC_LINK: VTYPE_STRING,
1385
  INIC_MAC: VTYPE_STRING,
1386
  INIC_MODE: VTYPE_STRING,
1387
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1388
  INIC_NAME: VTYPE_MAYBE_STRING,
1389
  }
1390
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1391

    
1392
# Hypervisor constants
1393
HT_XEN_PVM = "xen-pvm"
1394
HT_FAKE = "fake"
1395
HT_XEN_HVM = "xen-hvm"
1396
HT_KVM = "kvm"
1397
HT_CHROOT = "chroot"
1398
HT_LXC = "lxc"
1399
HYPER_TYPES = compat.UniqueFrozenset([
1400
  HT_XEN_PVM,
1401
  HT_FAKE,
1402
  HT_XEN_HVM,
1403
  HT_KVM,
1404
  HT_CHROOT,
1405
  HT_LXC,
1406
  ])
1407
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1408

    
1409
VNC_BASE_PORT = 5900
1410
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1411

    
1412
# NIC types
1413
HT_NIC_RTL8139 = "rtl8139"
1414
HT_NIC_NE2K_PCI = "ne2k_pci"
1415
HT_NIC_NE2K_ISA = "ne2k_isa"
1416
HT_NIC_I82551 = "i82551"
1417
HT_NIC_I85557B = "i82557b"
1418
HT_NIC_I8259ER = "i82559er"
1419
HT_NIC_PCNET = "pcnet"
1420
HT_NIC_E1000 = "e1000"
1421
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1422

    
1423
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1424
  HT_NIC_RTL8139,
1425
  HT_NIC_NE2K_PCI,
1426
  HT_NIC_E1000,
1427
  HT_NIC_NE2K_ISA,
1428
  HT_NIC_PARAVIRTUAL,
1429
  ])
1430
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1431
  HT_NIC_RTL8139,
1432
  HT_NIC_NE2K_PCI,
1433
  HT_NIC_NE2K_ISA,
1434
  HT_NIC_I82551,
1435
  HT_NIC_I85557B,
1436
  HT_NIC_I8259ER,
1437
  HT_NIC_PCNET,
1438
  HT_NIC_E1000,
1439
  HT_NIC_PARAVIRTUAL,
1440
  ])
1441

    
1442
# Vif types
1443
# default vif type in xen-hvm
1444
HT_HVM_VIF_IOEMU = "ioemu"
1445
HT_HVM_VIF_VIF = "vif"
1446
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1447
  HT_HVM_VIF_IOEMU,
1448
  HT_HVM_VIF_VIF,
1449
  ])
1450

    
1451
# Disk types
1452
HT_DISK_IOEMU = "ioemu"
1453
HT_DISK_IDE = "ide"
1454
HT_DISK_SCSI = "scsi"
1455
HT_DISK_SD = "sd"
1456
HT_DISK_MTD = "mtd"
1457
HT_DISK_PFLASH = "pflash"
1458

    
1459
HT_CACHE_DEFAULT = "default"
1460
HT_CACHE_NONE = "none"
1461
HT_CACHE_WTHROUGH = "writethrough"
1462
HT_CACHE_WBACK = "writeback"
1463
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1464
  HT_CACHE_DEFAULT,
1465
  HT_CACHE_NONE,
1466
  HT_CACHE_WTHROUGH,
1467
  HT_CACHE_WBACK,
1468
  ])
1469

    
1470
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1471
  HT_DISK_PARAVIRTUAL,
1472
  HT_DISK_IOEMU,
1473
  ])
1474
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1475
  HT_DISK_PARAVIRTUAL,
1476
  HT_DISK_IDE,
1477
  HT_DISK_SCSI,
1478
  HT_DISK_SD,
1479
  HT_DISK_MTD,
1480
  HT_DISK_PFLASH,
1481
  ])
1482

    
1483
# Mouse types:
1484
HT_MOUSE_MOUSE = "mouse"
1485
HT_MOUSE_TABLET = "tablet"
1486

    
1487
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1488
  HT_MOUSE_MOUSE,
1489
  HT_MOUSE_TABLET,
1490
  ])
1491

    
1492
# Boot order
1493
HT_BO_FLOPPY = "floppy"
1494
HT_BO_CDROM = "cdrom"
1495
HT_BO_DISK = "disk"
1496
HT_BO_NETWORK = "network"
1497

    
1498
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1499
  HT_BO_FLOPPY,
1500
  HT_BO_CDROM,
1501
  HT_BO_DISK,
1502
  HT_BO_NETWORK,
1503
  ])
1504

    
1505
# SPICE lossless image compression options
1506
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1507
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1508
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1509
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1510
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1511
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1512

    
1513
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1514
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1515
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1516
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1517
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1518
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1519
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1520
  ])
1521

    
1522
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1523
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1524
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1525
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1526

    
1527
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1528
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1529
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1530
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1531
  ])
1532

    
1533
# SPICE video stream detection
1534
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1535
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1536
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1537

    
1538
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1539
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1540
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1541
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1542
  ])
1543

    
1544
# Security models
1545
HT_SM_NONE = "none"
1546
HT_SM_USER = "user"
1547
HT_SM_POOL = "pool"
1548

    
1549
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1550
  HT_SM_NONE,
1551
  HT_SM_USER,
1552
  HT_SM_POOL,
1553
  ])
1554

    
1555
# Kvm flag values
1556
HT_KVM_ENABLED = "enabled"
1557
HT_KVM_DISABLED = "disabled"
1558

    
1559
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1560

    
1561
# Migration type
1562
HT_MIGRATION_LIVE = "live"
1563
HT_MIGRATION_NONLIVE = "non-live"
1564
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1565
  HT_MIGRATION_LIVE,
1566
  HT_MIGRATION_NONLIVE,
1567
  ])
1568

    
1569
# Cluster Verify steps
1570
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1571
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1572

    
1573
# Cluster Verify error classes
1574
CV_TCLUSTER = "cluster"
1575
CV_TGROUP = "group"
1576
CV_TNODE = "node"
1577
CV_TINSTANCE = "instance"
1578

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

    
1661
CV_ALL_ECODES = compat.UniqueFrozenset([
1662
  CV_ECLUSTERCFG,
1663
  CV_ECLUSTERCERT,
1664
  CV_ECLUSTERFILECHECK,
1665
  CV_ECLUSTERDANGLINGNODES,
1666
  CV_ECLUSTERDANGLINGINST,
1667
  CV_EINSTANCEBADNODE,
1668
  CV_EINSTANCEDOWN,
1669
  CV_EINSTANCELAYOUT,
1670
  CV_EINSTANCEMISSINGDISK,
1671
  CV_EINSTANCEFAULTYDISK,
1672
  CV_EINSTANCEWRONGNODE,
1673
  CV_EINSTANCESPLITGROUPS,
1674
  CV_EINSTANCEPOLICY,
1675
  CV_ENODEDRBD,
1676
  CV_ENODEDRBDHELPER,
1677
  CV_ENODEFILECHECK,
1678
  CV_ENODEHOOKS,
1679
  CV_ENODEHV,
1680
  CV_ENODELVM,
1681
  CV_ENODEN1,
1682
  CV_ENODENET,
1683
  CV_ENODEOS,
1684
  CV_ENODEORPHANINSTANCE,
1685
  CV_ENODEORPHANLV,
1686
  CV_ENODERPC,
1687
  CV_ENODESSH,
1688
  CV_ENODEVERSION,
1689
  CV_ENODESETUP,
1690
  CV_ENODETIME,
1691
  CV_ENODEOOBPATH,
1692
  CV_ENODEUSERSCRIPTS,
1693
  CV_ENODEFILESTORAGEPATHS,
1694
  ])
1695

    
1696
CV_ALL_ECODES_STRINGS = \
1697
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1698

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

    
1724
# Instance status
1725
INSTST_RUNNING = "running"
1726
INSTST_ADMINDOWN = "ADMIN_down"
1727
INSTST_ADMINOFFLINE = "ADMIN_offline"
1728
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1729
INSTST_NODEDOWN = "ERROR_nodedown"
1730
INSTST_WRONGNODE = "ERROR_wrongnode"
1731
INSTST_ERRORUP = "ERROR_up"
1732
INSTST_ERRORDOWN = "ERROR_down"
1733
INSTST_ALL = compat.UniqueFrozenset([
1734
  INSTST_RUNNING,
1735
  INSTST_ADMINDOWN,
1736
  INSTST_ADMINOFFLINE,
1737
  INSTST_NODEOFFLINE,
1738
  INSTST_NODEDOWN,
1739
  INSTST_WRONGNODE,
1740
  INSTST_ERRORUP,
1741
  INSTST_ERRORDOWN,
1742
  ])
1743

    
1744
# Admin states
1745
ADMINST_UP = "up"
1746
ADMINST_DOWN = "down"
1747
ADMINST_OFFLINE = "offline"
1748
ADMINST_ALL = compat.UniqueFrozenset([
1749
  ADMINST_UP,
1750
  ADMINST_DOWN,
1751
  ADMINST_OFFLINE,
1752
  ])
1753

    
1754
# Node roles
1755
NR_REGULAR = "R"
1756
NR_MASTER = "M"
1757
NR_MCANDIDATE = "C"
1758
NR_DRAINED = "D"
1759
NR_OFFLINE = "O"
1760
NR_ALL = compat.UniqueFrozenset([
1761
  NR_REGULAR,
1762
  NR_MASTER,
1763
  NR_MCANDIDATE,
1764
  NR_DRAINED,
1765
  NR_OFFLINE,
1766
  ])
1767

    
1768
# SSL certificate check constants (in days)
1769
SSL_CERT_EXPIRATION_WARN = 30
1770
SSL_CERT_EXPIRATION_ERROR = 7
1771

    
1772
# Allocator framework constants
1773
IALLOCATOR_VERSION = 2
1774
IALLOCATOR_DIR_IN = "in"
1775
IALLOCATOR_DIR_OUT = "out"
1776
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1777
  IALLOCATOR_DIR_IN,
1778
  IALLOCATOR_DIR_OUT,
1779
  ])
1780
IALLOCATOR_MODE_ALLOC = "allocate"
1781
IALLOCATOR_MODE_RELOC = "relocate"
1782
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1783
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1784
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1785
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1786
  IALLOCATOR_MODE_ALLOC,
1787
  IALLOCATOR_MODE_RELOC,
1788
  IALLOCATOR_MODE_CHG_GROUP,
1789
  IALLOCATOR_MODE_NODE_EVAC,
1790
  IALLOCATOR_MODE_MULTI_ALLOC,
1791
  ])
1792
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1793
DEFAULT_IALLOCATOR_SHORTCUT = "."
1794

    
1795
IALLOCATOR_NEVAC_PRI = "primary-only"
1796
IALLOCATOR_NEVAC_SEC = "secondary-only"
1797
IALLOCATOR_NEVAC_ALL = "all"
1798
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1799
  IALLOCATOR_NEVAC_PRI,
1800
  IALLOCATOR_NEVAC_SEC,
1801
  IALLOCATOR_NEVAC_ALL,
1802
  ])
1803

    
1804
# Node evacuation
1805
NODE_EVAC_PRI = "primary-only"
1806
NODE_EVAC_SEC = "secondary-only"
1807
NODE_EVAC_ALL = "all"
1808
NODE_EVAC_MODES = compat.UniqueFrozenset([
1809
  NODE_EVAC_PRI,
1810
  NODE_EVAC_SEC,
1811
  NODE_EVAC_ALL,
1812
  ])
1813

    
1814
# Job queue
1815
JOB_QUEUE_VERSION = 1
1816
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1817
JOB_QUEUE_FILES_PERMS = 0640
1818

    
1819
JOB_ID_TEMPLATE = r"\d+"
1820
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1821

    
1822
# unchanged job return
1823
JOB_NOTCHANGED = "nochange"
1824

    
1825
# Job status
1826
JOB_STATUS_QUEUED = "queued"
1827
JOB_STATUS_WAITING = "waiting"
1828
JOB_STATUS_CANCELING = "canceling"
1829
JOB_STATUS_RUNNING = "running"
1830
JOB_STATUS_CANCELED = "canceled"
1831
JOB_STATUS_SUCCESS = "success"
1832
JOB_STATUS_ERROR = "error"
1833
JOBS_PENDING = compat.UniqueFrozenset([
1834
  JOB_STATUS_QUEUED,
1835
  JOB_STATUS_WAITING,
1836
  JOB_STATUS_CANCELING,
1837
  ])
1838
JOBS_FINALIZED = compat.UniqueFrozenset([
1839
  JOB_STATUS_CANCELED,
1840
  JOB_STATUS_SUCCESS,
1841
  JOB_STATUS_ERROR,
1842
  ])
1843
JOB_STATUS_ALL = compat.UniqueFrozenset([
1844
  JOB_STATUS_RUNNING,
1845
  ]) | JOBS_PENDING | JOBS_FINALIZED
1846

    
1847
# OpCode status
1848
# not yet finalized
1849
OP_STATUS_QUEUED = "queued"
1850
OP_STATUS_WAITING = "waiting"
1851
OP_STATUS_CANCELING = "canceling"
1852
OP_STATUS_RUNNING = "running"
1853
# finalized
1854
OP_STATUS_CANCELED = "canceled"
1855
OP_STATUS_SUCCESS = "success"
1856
OP_STATUS_ERROR = "error"
1857
OPS_FINALIZED = compat.UniqueFrozenset([
1858
  OP_STATUS_CANCELED,
1859
  OP_STATUS_SUCCESS,
1860
  OP_STATUS_ERROR,
1861
  ])
1862

    
1863
# OpCode priority
1864
OP_PRIO_LOWEST = +19
1865
OP_PRIO_HIGHEST = -20
1866

    
1867
OP_PRIO_LOW = +10
1868
OP_PRIO_NORMAL = 0
1869
OP_PRIO_HIGH = -10
1870

    
1871
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1872
  OP_PRIO_LOW,
1873
  OP_PRIO_NORMAL,
1874
  OP_PRIO_HIGH,
1875
  ])
1876

    
1877
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1878

    
1879
# Lock recalculate mode
1880
LOCKS_REPLACE = "replace"
1881
LOCKS_APPEND = "append"
1882

    
1883
# Lock timeout (sum) before we should go into blocking acquire (still
1884
# can be reset by priority change); computed as max time (10 hours)
1885
# before we should actually go into blocking acquire given that we
1886
# start from default priority level; in seconds
1887
# TODO
1888
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1889
LOCK_ATTEMPTS_MAXWAIT = 15.0
1890
LOCK_ATTEMPTS_MINWAIT = 1.0
1891

    
1892
# Execution log types
1893
ELOG_MESSAGE = "message"
1894
ELOG_REMOTE_IMPORT = "remote-import"
1895
ELOG_JQUEUE_TEST = "jqueue-test"
1896

    
1897
# /etc/hosts modification
1898
ETC_HOSTS_ADD = "add"
1899
ETC_HOSTS_REMOVE = "remove"
1900

    
1901
# Job queue test
1902
JQT_MSGPREFIX = "TESTMSG="
1903
JQT_EXPANDNAMES = "expandnames"
1904
JQT_EXEC = "exec"
1905
JQT_LOGMSG = "logmsg"
1906
JQT_STARTMSG = "startmsg"
1907
JQT_ALL = compat.UniqueFrozenset([
1908
  JQT_EXPANDNAMES,
1909
  JQT_EXEC,
1910
  JQT_LOGMSG,
1911
  JQT_STARTMSG,
1912
  ])
1913

    
1914
# Query resources
1915
QR_CLUSTER = "cluster"
1916
QR_INSTANCE = "instance"
1917
QR_NODE = "node"
1918
QR_LOCK = "lock"
1919
QR_GROUP = "group"
1920
QR_OS = "os"
1921
QR_JOB = "job"
1922
QR_EXPORT = "export"
1923
QR_NETWORK = "network"
1924
QR_EXTSTORAGE = "extstorage"
1925

    
1926
#: List of resources which can be queried using L{opcodes.OpQuery}
1927
QR_VIA_OP = compat.UniqueFrozenset([
1928
  QR_CLUSTER,
1929
  QR_INSTANCE,
1930
  QR_NODE,
1931
  QR_GROUP,
1932
  QR_OS,
1933
  QR_EXPORT,
1934
  QR_NETWORK,
1935
  QR_EXTSTORAGE,
1936
  ])
1937

    
1938
#: List of resources which can be queried using Local UniX Interface
1939
QR_VIA_LUXI = QR_VIA_OP.union([
1940
  QR_LOCK,
1941
  QR_JOB,
1942
  ])
1943

    
1944
#: List of resources which can be queried using RAPI
1945
QR_VIA_RAPI = QR_VIA_LUXI
1946

    
1947
# Query field types
1948
QFT_UNKNOWN = "unknown"
1949
QFT_TEXT = "text"
1950
QFT_BOOL = "bool"
1951
QFT_NUMBER = "number"
1952
QFT_UNIT = "unit"
1953
QFT_TIMESTAMP = "timestamp"
1954
QFT_OTHER = "other"
1955

    
1956
#: All query field types
1957
QFT_ALL = compat.UniqueFrozenset([
1958
  QFT_UNKNOWN,
1959
  QFT_TEXT,
1960
  QFT_BOOL,
1961
  QFT_NUMBER,
1962
  QFT_UNIT,
1963
  QFT_TIMESTAMP,
1964
  QFT_OTHER,
1965
  ])
1966

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

    
1982
RS_ALL = compat.UniqueFrozenset([
1983
  RS_NORMAL,
1984
  RS_UNKNOWN,
1985
  RS_NODATA,
1986
  RS_UNAVAIL,
1987
  RS_OFFLINE,
1988
  ])
1989

    
1990
#: Dictionary with special field cases and their verbose/terse formatting
1991
RSS_DESCRIPTION = {
1992
  RS_UNKNOWN: ("(unknown)", "??"),
1993
  RS_NODATA: ("(nodata)", "?"),
1994
  RS_OFFLINE: ("(offline)", "*"),
1995
  RS_UNAVAIL: ("(unavail)", "-"),
1996
  }
1997

    
1998
# max dynamic devices
1999
MAX_NICS = 8
2000
MAX_DISKS = 16
2001

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

    
2029
SS_FILE_PERMS = 0444
2030

    
2031
# cluster wide default parameters
2032
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2033

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

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

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

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

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

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

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

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

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

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

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

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

    
2276
MASTER_POOL_SIZE_DEFAULT = 10
2277

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

    
2284
CONFD_PROTOCOL_VERSION = 1
2285

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2500
# Timeouts for disk removal
2501
DISK_REMOVE_RETRY_INTERVAL = 3
2502
DISK_REMOVE_RETRY_TIMEOUT = 30
2503

    
2504
# Do not re-export imported modules
2505
del re, _vcsversion, _autoconf, socket, pathutils, compat