Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 71fe51f8

History | View | Annotate | Download (64 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
LUXI_SOCKET_PERMS = 0660
244

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

    
252
EXPORT_CONF_FILE = "config.ini"
253

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
327
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
328

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

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

    
341
IE_CUSTOM_SIZE = "fd"
342

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
615
# file backend driver
616
FD_LOOP = "loop"
617
FD_BLKTAP = "blktap"
618
FD_DEFAULT = FD_LOOP
619

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

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

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

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

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

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

    
662
# Remote import/export certificate validity in seconds
663
RIE_CERT_VALIDITY = 24 * 60 * 60
664

    
665
# Overall timeout for establishing connection
666
RIE_CONNECT_TIMEOUT = 180
667

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

    
671
# Export only: number of attempts to connect
672
RIE_CONNECT_RETRIES = 10
673

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

    
677
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
678

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

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

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

    
704
#: Exit code for query operations with unknown fields
705
EXIT_UNKNOWN_FIELD = 14
706

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

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

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

    
751
#: Key for job IDs in opcode result
752
JOB_IDS_KEY = "jobs"
753

    
754
# runparts results
755
(RUNPARTS_SKIP,
756
 RUNPARTS_RUN,
757
 RUNPARTS_ERR) = range(3)
758

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

    
765
# RPC constants
766
(RPC_ENCODING_NONE,
767
 RPC_ENCODING_ZLIB_BASE64) = range(2)
768

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

    
777
# Timeout for connecting to nodes (seconds)
778
RPC_CONNECT_TIMEOUT = 5
779

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

    
794
OS_API_FILE = "ganeti_api_version"
795
OS_VARIANTS_FILE = "variants.list"
796
OS_PARAMETERS_FILE = "parameters.list"
797

    
798
OS_VALIDATE_PARAMETERS = "parameters"
799
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
800

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

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

    
827
ES_PARAMETERS_FILE = "parameters.list"
828

    
829
# reboot types
830
INSTANCE_REBOOT_SOFT = "soft"
831
INSTANCE_REBOOT_HARD = "hard"
832
INSTANCE_REBOOT_FULL = "full"
833

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

    
840
# instance reboot behaviors
841
INSTANCE_REBOOT_ALLOWED = "reboot"
842
INSTANCE_REBOOT_EXIT = "exit"
843

    
844
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
845
  INSTANCE_REBOOT_ALLOWED,
846
  INSTANCE_REBOOT_EXIT,
847
  ])
848

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

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

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

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

    
958

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

    
1032
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1033

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

    
1048
# Migration statuses
1049
HV_MIGRATION_COMPLETED = "completed"
1050
HV_MIGRATION_ACTIVE = "active"
1051
HV_MIGRATION_FAILED = "failed"
1052
HV_MIGRATION_CANCELLED = "cancelled"
1053

    
1054
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1055
  HV_MIGRATION_COMPLETED,
1056
  HV_MIGRATION_ACTIVE,
1057
  HV_MIGRATION_FAILED,
1058
  HV_MIGRATION_CANCELLED,
1059
  ])
1060

    
1061
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1062
  HV_MIGRATION_FAILED,
1063
  HV_MIGRATION_CANCELLED,
1064
  ])
1065

    
1066
# KVM-specific statuses
1067
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1068

    
1069
# Node info keys
1070
HV_NODEINFO_KEY_VERSION = "hv_version"
1071

    
1072
# Hypervisor state
1073
HVST_MEMORY_TOTAL = "mem_total"
1074
HVST_MEMORY_NODE = "mem_node"
1075
HVST_MEMORY_HV = "mem_hv"
1076
HVST_CPU_TOTAL = "cpu_total"
1077
HVST_CPU_NODE = "cpu_node"
1078

    
1079
HVST_DEFAULTS = {
1080
  HVST_MEMORY_TOTAL: 0,
1081
  HVST_MEMORY_NODE: 0,
1082
  HVST_MEMORY_HV: 0,
1083
  HVST_CPU_TOTAL: 1,
1084
  HVST_CPU_NODE: 1,
1085
  }
1086

    
1087
HVSTS_PARAMETER_TYPES = {
1088
  HVST_MEMORY_TOTAL: VTYPE_INT,
1089
  HVST_MEMORY_NODE: VTYPE_INT,
1090
  HVST_MEMORY_HV: VTYPE_INT,
1091
  HVST_CPU_TOTAL: VTYPE_INT,
1092
  HVST_CPU_NODE: VTYPE_INT,
1093
  }
1094

    
1095
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1096

    
1097
# Disk state
1098
DS_DISK_TOTAL = "disk_total"
1099
DS_DISK_RESERVED = "disk_reserved"
1100
DS_DISK_OVERHEAD = "disk_overhead"
1101

    
1102
DS_DEFAULTS = {
1103
  DS_DISK_TOTAL: 0,
1104
  DS_DISK_RESERVED: 0,
1105
  DS_DISK_OVERHEAD: 0,
1106
  }
1107

    
1108
DSS_PARAMETER_TYPES = {
1109
  DS_DISK_TOTAL: VTYPE_INT,
1110
  DS_DISK_RESERVED: VTYPE_INT,
1111
  DS_DISK_OVERHEAD: VTYPE_INT,
1112
  }
1113

    
1114
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1115
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1116

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

    
1126
BES_PARAMETER_TYPES = {
1127
  BE_MAXMEM: VTYPE_SIZE,
1128
  BE_MINMEM: VTYPE_SIZE,
1129
  BE_VCPUS: VTYPE_INT,
1130
  BE_AUTO_BALANCE: VTYPE_BOOL,
1131
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1132
  BE_SPINDLE_USE: VTYPE_INT,
1133
  }
1134

    
1135
BES_PARAMETER_TITLES = {
1136
  BE_AUTO_BALANCE: "Auto_balance",
1137
  BE_MAXMEM: "ConfigMaxMem",
1138
  BE_MINMEM: "ConfigMinMem",
1139
  BE_VCPUS: "ConfigVCPUs",
1140
  }
1141

    
1142
BES_PARAMETER_COMPAT = {
1143
  BE_MEMORY: VTYPE_SIZE,
1144
  }
1145
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1146

    
1147
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1148

    
1149
# instance specs
1150
ISPEC_MEM_SIZE = "memory-size"
1151
ISPEC_CPU_COUNT = "cpu-count"
1152
ISPEC_DISK_COUNT = "disk-count"
1153
ISPEC_DISK_SIZE = "disk-size"
1154
ISPEC_NIC_COUNT = "nic-count"
1155
ISPEC_SPINDLE_USE = "spindle-use"
1156

    
1157
ISPECS_PARAMETER_TYPES = {
1158
  ISPEC_MEM_SIZE: VTYPE_INT,
1159
  ISPEC_CPU_COUNT: VTYPE_INT,
1160
  ISPEC_DISK_COUNT: VTYPE_INT,
1161
  ISPEC_DISK_SIZE: VTYPE_INT,
1162
  ISPEC_NIC_COUNT: VTYPE_INT,
1163
  ISPEC_SPINDLE_USE: VTYPE_INT,
1164
  }
1165

    
1166
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1167

    
1168
ISPECS_MINMAX = "minmax"
1169
ISPECS_MIN = "min"
1170
ISPECS_MAX = "max"
1171
ISPECS_STD = "std"
1172
IPOLICY_DTS = "disk-templates"
1173
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1174
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1175

    
1176
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1177
  ISPECS_MIN,
1178
  ISPECS_MAX,
1179
  ])
1180

    
1181
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1182
  IPOLICY_VCPU_RATIO,
1183
  IPOLICY_SPINDLE_RATIO,
1184
  ])
1185

    
1186
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1187
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1188

    
1189
# Node parameter names
1190
ND_OOB_PROGRAM = "oob_program"
1191
ND_SPINDLE_COUNT = "spindle_count"
1192
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1193

    
1194
NDS_PARAMETER_TYPES = {
1195
  ND_OOB_PROGRAM: VTYPE_STRING,
1196
  ND_SPINDLE_COUNT: VTYPE_INT,
1197
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1198
  }
1199

    
1200
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1201

    
1202
NDS_PARAMETER_TITLES = {
1203
  ND_OOB_PROGRAM: "OutOfBandProgram",
1204
  ND_SPINDLE_COUNT: "SpindleCount",
1205
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1206
  }
1207

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

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

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

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

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

    
1295
OOB_POWER_STATUS_POWERED = "powered"
1296

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

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

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

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

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

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

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

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

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

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

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

    
1359
MODIFIABLE_IDISK_PARAMS_TYPES = {
1360
  IDISK_MODE: VTYPE_STRING,
1361
  IDISK_NAME: VTYPE_STRING,
1362
  }
1363
MODIFIABLE_IDISK_PARAMS = frozenset(MODIFIABLE_IDISK_PARAMS_TYPES.keys())
1364

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

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

    
1399
VNC_BASE_PORT = 5900
1400
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1401

    
1402
# NIC types
1403
HT_NIC_RTL8139 = "rtl8139"
1404
HT_NIC_NE2K_PCI = "ne2k_pci"
1405
HT_NIC_NE2K_ISA = "ne2k_isa"
1406
HT_NIC_I82551 = "i82551"
1407
HT_NIC_I85557B = "i82557b"
1408
HT_NIC_I8259ER = "i82559er"
1409
HT_NIC_PCNET = "pcnet"
1410
HT_NIC_E1000 = "e1000"
1411
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1412

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

    
1432
# Vif types
1433
# default vif type in xen-hvm
1434
HT_HVM_VIF_IOEMU = "ioemu"
1435
HT_HVM_VIF_VIF = "vif"
1436
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1437
  HT_HVM_VIF_IOEMU,
1438
  HT_HVM_VIF_VIF,
1439
  ])
1440

    
1441
# Disk types
1442
HT_DISK_IOEMU = "ioemu"
1443
HT_DISK_IDE = "ide"
1444
HT_DISK_SCSI = "scsi"
1445
HT_DISK_SD = "sd"
1446
HT_DISK_MTD = "mtd"
1447
HT_DISK_PFLASH = "pflash"
1448

    
1449
HT_CACHE_DEFAULT = "default"
1450
HT_CACHE_NONE = "none"
1451
HT_CACHE_WTHROUGH = "writethrough"
1452
HT_CACHE_WBACK = "writeback"
1453
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1454
  HT_CACHE_DEFAULT,
1455
  HT_CACHE_NONE,
1456
  HT_CACHE_WTHROUGH,
1457
  HT_CACHE_WBACK,
1458
  ])
1459

    
1460
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1461
  HT_DISK_PARAVIRTUAL,
1462
  HT_DISK_IOEMU,
1463
  ])
1464
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1465
  HT_DISK_PARAVIRTUAL,
1466
  HT_DISK_IDE,
1467
  HT_DISK_SCSI,
1468
  HT_DISK_SD,
1469
  HT_DISK_MTD,
1470
  HT_DISK_PFLASH,
1471
  ])
1472

    
1473
# Mouse types:
1474
HT_MOUSE_MOUSE = "mouse"
1475
HT_MOUSE_TABLET = "tablet"
1476

    
1477
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1478
  HT_MOUSE_MOUSE,
1479
  HT_MOUSE_TABLET,
1480
  ])
1481

    
1482
# Boot order
1483
HT_BO_FLOPPY = "floppy"
1484
HT_BO_CDROM = "cdrom"
1485
HT_BO_DISK = "disk"
1486
HT_BO_NETWORK = "network"
1487

    
1488
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1489
  HT_BO_FLOPPY,
1490
  HT_BO_CDROM,
1491
  HT_BO_DISK,
1492
  HT_BO_NETWORK,
1493
  ])
1494

    
1495
# SPICE lossless image compression options
1496
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1497
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1498
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1499
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1500
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1501
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1502

    
1503
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1504
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1505
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1506
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1507
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1508
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1509
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1510
  ])
1511

    
1512
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1513
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1514
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1515
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1516

    
1517
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1518
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1519
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1520
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1521
  ])
1522

    
1523
# SPICE video stream detection
1524
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1525
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1526
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1527

    
1528
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1529
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1530
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1531
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1532
  ])
1533

    
1534
# Security models
1535
HT_SM_NONE = "none"
1536
HT_SM_USER = "user"
1537
HT_SM_POOL = "pool"
1538

    
1539
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1540
  HT_SM_NONE,
1541
  HT_SM_USER,
1542
  HT_SM_POOL,
1543
  ])
1544

    
1545
# Kvm flag values
1546
HT_KVM_ENABLED = "enabled"
1547
HT_KVM_DISABLED = "disabled"
1548

    
1549
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1550

    
1551
# Migration type
1552
HT_MIGRATION_LIVE = "live"
1553
HT_MIGRATION_NONLIVE = "non-live"
1554
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1555
  HT_MIGRATION_LIVE,
1556
  HT_MIGRATION_NONLIVE,
1557
  ])
1558

    
1559
# Cluster Verify steps
1560
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1561
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1562

    
1563
# Cluster Verify error classes
1564
CV_TCLUSTER = "cluster"
1565
CV_TGROUP = "group"
1566
CV_TNODE = "node"
1567
CV_TINSTANCE = "instance"
1568

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

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

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

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

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

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

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

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

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

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

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

    
1804
# Job queue
1805
JOB_QUEUE_VERSION = 1
1806
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1807
JOB_QUEUE_FILES_PERMS = 0640
1808

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

    
1812
# unchanged job return
1813
JOB_NOTCHANGED = "nochange"
1814

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

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

    
1853
# OpCode priority
1854
OP_PRIO_LOWEST = +19
1855
OP_PRIO_HIGHEST = -20
1856

    
1857
OP_PRIO_LOW = +10
1858
OP_PRIO_NORMAL = 0
1859
OP_PRIO_HIGH = -10
1860

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

    
1867
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1868

    
1869
# Lock recalculate mode
1870
LOCKS_REPLACE = "replace"
1871
LOCKS_APPEND = "append"
1872

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

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

    
1887
# /etc/hosts modification
1888
ETC_HOSTS_ADD = "add"
1889
ETC_HOSTS_REMOVE = "remove"
1890

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

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

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

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

    
1934
#: List of resources which can be queried using RAPI
1935
QR_VIA_RAPI = QR_VIA_LUXI
1936

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

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

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

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

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

    
1988
# max dynamic devices
1989
MAX_NICS = 8
1990
MAX_DISKS = 16
1991

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

    
2019
SS_FILE_PERMS = 0444
2020

    
2021
# cluster wide default parameters
2022
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2023

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

    
2134
HVC_GLOBALS = compat.UniqueFrozenset([
2135
  HV_MIGRATION_PORT,
2136
  HV_MIGRATION_BANDWIDTH,
2137
  HV_MIGRATION_MODE,
2138
  ])
2139

    
2140
BEC_DEFAULTS = {
2141
  BE_MINMEM: 128,
2142
  BE_MAXMEM: 128,
2143
  BE_VCPUS: 1,
2144
  BE_AUTO_BALANCE: True,
2145
  BE_ALWAYS_FAILOVER: False,
2146
  BE_SPINDLE_USE: 1,
2147
  }
2148

    
2149
NDC_DEFAULTS = {
2150
  ND_OOB_PROGRAM: "",
2151
  ND_SPINDLE_COUNT: 1,
2152
  ND_EXCLUSIVE_STORAGE: False,
2153
  }
2154

    
2155
NDC_GLOBALS = compat.UniqueFrozenset([
2156
  ND_EXCLUSIVE_STORAGE,
2157
  ])
2158

    
2159
DISK_LD_DEFAULTS = {
2160
  LD_DRBD8: {
2161
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2162
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2163
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2164
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2165
    LDP_DISK_CUSTOM: "",
2166
    LDP_NET_CUSTOM: "",
2167
    LDP_DYNAMIC_RESYNC: False,
2168

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

    
2191
# readability shortcuts
2192
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2193
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2194

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

    
2225
# we don't want to export the shortcuts
2226
del _LV_DEFAULTS, _DRBD_DEFAULTS
2227

    
2228
NICC_DEFAULTS = {
2229
  NIC_MODE: NIC_MODE_BRIDGED,
2230
  NIC_LINK: DEFAULT_BRIDGE,
2231
  }
2232

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

    
2268
MASTER_POOL_SIZE_DEFAULT = 10
2269

    
2270
# Exclusive storage:
2271
# Error margin used to compare physical disks
2272
PART_MARGIN = .01
2273
# Space reserved when creating instance disks
2274
PART_RESERVED = .02
2275

    
2276
CONFD_PROTOCOL_VERSION = 1
2277

    
2278
CONFD_REQ_PING = 0
2279
CONFD_REQ_NODE_ROLE_BYNAME = 1
2280
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2281
CONFD_REQ_CLUSTER_MASTER = 3
2282
CONFD_REQ_NODE_PIP_LIST = 4
2283
CONFD_REQ_MC_PIP_LIST = 5
2284
CONFD_REQ_INSTANCES_IPS_LIST = 6
2285
CONFD_REQ_NODE_DRBD = 7
2286
CONFD_REQ_NODE_INSTANCES = 8
2287

    
2288
# Confd request query fields. These are used to narrow down queries.
2289
# These must be strings rather than integers, because json-encoding
2290
# converts them to strings anyway, as they're used as dict-keys.
2291
CONFD_REQQ_LINK = "0"
2292
CONFD_REQQ_IP = "1"
2293
CONFD_REQQ_IPLIST = "2"
2294
CONFD_REQQ_FIELDS = "3"
2295

    
2296
CONFD_REQFIELD_NAME = "0"
2297
CONFD_REQFIELD_IP = "1"
2298
CONFD_REQFIELD_MNODE_PIP = "2"
2299

    
2300
CONFD_REQS = compat.UniqueFrozenset([
2301
  CONFD_REQ_PING,
2302
  CONFD_REQ_NODE_ROLE_BYNAME,
2303
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2304
  CONFD_REQ_CLUSTER_MASTER,
2305
  CONFD_REQ_NODE_PIP_LIST,
2306
  CONFD_REQ_MC_PIP_LIST,
2307
  CONFD_REQ_INSTANCES_IPS_LIST,
2308
  CONFD_REQ_NODE_DRBD,
2309
  ])
2310

    
2311
CONFD_REPL_STATUS_OK = 0
2312
CONFD_REPL_STATUS_ERROR = 1
2313
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2314

    
2315
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2316
  CONFD_REPL_STATUS_OK,
2317
  CONFD_REPL_STATUS_ERROR,
2318
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2319
  ])
2320

    
2321
(CONFD_NODE_ROLE_MASTER,
2322
 CONFD_NODE_ROLE_CANDIDATE,
2323
 CONFD_NODE_ROLE_OFFLINE,
2324
 CONFD_NODE_ROLE_DRAINED,
2325
 CONFD_NODE_ROLE_REGULAR,
2326
 ) = range(5)
2327

    
2328
# A few common errors for confd
2329
CONFD_ERROR_UNKNOWN_ENTRY = 1
2330
CONFD_ERROR_INTERNAL = 2
2331
CONFD_ERROR_ARGUMENT = 3
2332

    
2333
# Each request is "salted" by the current timestamp.
2334
# This constants decides how many seconds of skew to accept.
2335
# TODO: make this a default and allow the value to be more configurable
2336
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2337

    
2338
# When we haven't reloaded the config for more than this amount of
2339
# seconds, we force a test to see if inotify is betraying us. Using a
2340
# prime number to ensure we get less chance of 'same wakeup' with
2341
# other processes.
2342
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2343

    
2344
# If we receive more than one update in this amount of microseconds,
2345
# we move to polling every RATELIMIT seconds, rather than relying on
2346
# inotify, to be able to serve more requests.
2347
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2348

    
2349
# Magic number prepended to all confd queries.
2350
# This allows us to distinguish different types of confd protocols and handle
2351
# them. For example by changing this we can move the whole payload to be
2352
# compressed, or move away from json.
2353
CONFD_MAGIC_FOURCC = "plj0"
2354

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

    
2360
# Timeout in seconds to expire pending query request in the confd client
2361
# library. We don't actually expect any answer more than 10 seconds after we
2362
# sent a request.
2363
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2364

    
2365
# Maximum UDP datagram size.
2366
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2367
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2368
#   (assuming we can't use jumbo frames)
2369
# We just set this to 60K, which should be enough
2370
MAX_UDP_DATA_SIZE = 61440
2371

    
2372
# User-id pool minimum/maximum acceptable user-ids.
2373
UIDPOOL_UID_MIN = 0
2374
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2375

    
2376
# Name or path of the pgrep command
2377
PGREP = "pgrep"
2378

    
2379
# Name of the node group that gets created at cluster init or upgrade
2380
INITIAL_NODE_GROUP_NAME = "default"
2381

    
2382
# Possible values for NodeGroup.alloc_policy
2383
ALLOC_POLICY_PREFERRED = "preferred"
2384
ALLOC_POLICY_LAST_RESORT = "last_resort"
2385
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2386
VALID_ALLOC_POLICIES = [
2387
  ALLOC_POLICY_PREFERRED,
2388
  ALLOC_POLICY_LAST_RESORT,
2389
  ALLOC_POLICY_UNALLOCABLE,
2390
  ]
2391

    
2392
# Temporary external/shared storage parameters
2393
BLOCKDEV_DRIVER_MANUAL = "manual"
2394

    
2395
# qemu-img path, required for ovfconverter
2396
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2397

    
2398
# Whether htools was enabled at compilation time
2399
HTOOLS = _autoconf.HTOOLS
2400
# The hail iallocator
2401
IALLOC_HAIL = "hail"
2402

    
2403
# Fake opcodes for functions that have hooks attached to them via
2404
# backend.RunLocalHooks
2405
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2406
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2407

    
2408
# SSH key types
2409
SSHK_RSA = "rsa"
2410
SSHK_DSA = "dsa"
2411
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2412

    
2413
# SSH authorized key types
2414
SSHAK_RSA = "ssh-rsa"
2415
SSHAK_DSS = "ssh-dss"
2416
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2417

    
2418
# SSH setup
2419
SSHS_CLUSTER_NAME = "cluster_name"
2420
SSHS_SSH_HOST_KEY = "ssh_host_key"
2421
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2422
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2423

    
2424
#: Key files for SSH daemon
2425
SSH_DAEMON_KEYFILES = {
2426
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2427
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2428
  }
2429

    
2430
# Node daemon setup
2431
NDS_CLUSTER_NAME = "cluster_name"
2432
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2433
NDS_SSCONF = "ssconf"
2434
NDS_START_NODE_DAEMON = "start_node_daemon"
2435

    
2436
# Path generating random UUID
2437
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2438

    
2439
# Regex string for verifying a UUID
2440
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2441

    
2442
# Auto-repair tag prefixes
2443
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2444
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2445
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2446
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2447
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2448

    
2449
# Auto-repair levels
2450
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2451
AUTO_REPAIR_MIGRATE = "migrate"
2452
AUTO_REPAIR_FAILOVER = "failover"
2453
AUTO_REPAIR_REINSTALL = "reinstall"
2454
AUTO_REPAIR_ALL_TYPES = [
2455
  AUTO_REPAIR_FIX_STORAGE,
2456
  AUTO_REPAIR_MIGRATE,
2457
  AUTO_REPAIR_FAILOVER,
2458
  AUTO_REPAIR_REINSTALL,
2459
]
2460

    
2461
# Auto-repair results
2462
AUTO_REPAIR_SUCCESS = "success"
2463
AUTO_REPAIR_FAILURE = "failure"
2464
AUTO_REPAIR_ENOPERM = "enoperm"
2465
AUTO_REPAIR_ALL_RESULTS = frozenset([
2466
    AUTO_REPAIR_SUCCESS,
2467
    AUTO_REPAIR_FAILURE,
2468
    AUTO_REPAIR_ENOPERM,
2469
])
2470

    
2471
# The version identifier for builtin data collectors
2472
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2473

    
2474
# The reason trail opcode parameter name
2475
OPCODE_REASON = "reason"
2476

    
2477
# The source reasons for the execution of an OpCode
2478
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2479
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2480
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2481
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2482
OPCODE_REASON_SRC_USER = "gnt:user"
2483

    
2484
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2485
  OPCODE_REASON_SRC_CLIENT,
2486
  OPCODE_REASON_SRC_NODED,
2487
  OPCODE_REASON_SRC_OPCODE,
2488
  OPCODE_REASON_SRC_RLIB2,
2489
  OPCODE_REASON_SRC_USER,
2490
  ])
2491

    
2492
# Do not re-export imported modules
2493
del re, _vcsversion, _autoconf, socket, pathutils, compat