Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 06c2fb4a

History | View | Annotate | Download (64.7 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

    
98
# user separation
99
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
100
ADMIN_GROUP = _autoconf.ADMIN_GROUP
101
MASTERD_USER = _autoconf.MASTERD_USER
102
MASTERD_GROUP = _autoconf.MASTERD_GROUP
103
RAPI_USER = _autoconf.RAPI_USER
104
RAPI_GROUP = _autoconf.RAPI_GROUP
105
CONFD_USER = _autoconf.CONFD_USER
106
CONFD_GROUP = _autoconf.CONFD_GROUP
107
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_BLKTAP2 = "blktap2"
619
FD_DEFAULT = FD_LOOP
620

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
697
# device types to hotplug
698
HOTPLUG_TARGET_DISK = "hotdisk"
699
HOTPLUG_TARGET_NIC = "hotnic"
700
HOTPLUG_ALL_TARGETS = frozenset([
701
  HOTPLUG_TARGET_DISK,
702
  HOTPLUG_TARGET_NIC
703
  ])
704

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

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

    
723
#: Exit code for query operations with unknown fields
724
EXIT_UNKNOWN_FIELD = 14
725

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

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

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

    
770
#: Key for job IDs in opcode result
771
JOB_IDS_KEY = "jobs"
772

    
773
# runparts results
774
(RUNPARTS_SKIP,
775
 RUNPARTS_RUN,
776
 RUNPARTS_ERR) = range(3)
777

    
778
RUNPARTS_STATUS = compat.UniqueFrozenset([
779
  RUNPARTS_SKIP,
780
  RUNPARTS_RUN,
781
  RUNPARTS_ERR,
782
  ])
783

    
784
# RPC constants
785
(RPC_ENCODING_NONE,
786
 RPC_ENCODING_ZLIB_BASE64) = range(2)
787

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

    
796
# Timeout for connecting to nodes (seconds)
797
RPC_CONNECT_TIMEOUT = 5
798

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

    
813
OS_API_FILE = "ganeti_api_version"
814
OS_VARIANTS_FILE = "variants.list"
815
OS_PARAMETERS_FILE = "parameters.list"
816

    
817
OS_VALIDATE_PARAMETERS = "parameters"
818
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
819

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

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

    
849
ES_PARAMETERS_FILE = "parameters.list"
850

    
851
# reboot types
852
INSTANCE_REBOOT_SOFT = "soft"
853
INSTANCE_REBOOT_HARD = "hard"
854
INSTANCE_REBOOT_FULL = "full"
855

    
856
REBOOT_TYPES = compat.UniqueFrozenset([
857
  INSTANCE_REBOOT_SOFT,
858
  INSTANCE_REBOOT_HARD,
859
  INSTANCE_REBOOT_FULL,
860
  ])
861

    
862
# instance reboot behaviors
863
INSTANCE_REBOOT_ALLOWED = "reboot"
864
INSTANCE_REBOOT_EXIT = "exit"
865

    
866
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
867
  INSTANCE_REBOOT_ALLOWED,
868
  INSTANCE_REBOOT_EXIT,
869
  ])
870

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

    
884
# Constant representing that the user does not specify any IP version
885
IFACE_NO_IP_VERSION_SPECIFIED = 0
886

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

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

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

    
1053
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1054

    
1055
HVS_PARAMETER_TITLES = {
1056
  HV_ACPI: "ACPI",
1057
  HV_BOOT_ORDER: "Boot_order",
1058
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1059
  HV_DISK_TYPE: "Disk_type",
1060
  HV_INITRD_PATH: "Initrd_path",
1061
  HV_KERNEL_PATH: "Kernel_path",
1062
  HV_NIC_TYPE: "NIC_type",
1063
  HV_PAE: "PAE",
1064
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1065
  HV_PASSTHROUGH: "pci_pass",
1066
  HV_CPU_TYPE: "cpu_type",
1067
  }
1068

    
1069
# Migration statuses
1070
HV_MIGRATION_COMPLETED = "completed"
1071
HV_MIGRATION_ACTIVE = "active"
1072
HV_MIGRATION_FAILED = "failed"
1073
HV_MIGRATION_CANCELLED = "cancelled"
1074

    
1075
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1076
  HV_MIGRATION_COMPLETED,
1077
  HV_MIGRATION_ACTIVE,
1078
  HV_MIGRATION_FAILED,
1079
  HV_MIGRATION_CANCELLED,
1080
  ])
1081

    
1082
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1083
  HV_MIGRATION_FAILED,
1084
  HV_MIGRATION_CANCELLED,
1085
  ])
1086

    
1087
# KVM-specific statuses
1088
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1089

    
1090
# Node info keys
1091
HV_NODEINFO_KEY_VERSION = "hv_version"
1092

    
1093
# Hypervisor state
1094
HVST_MEMORY_TOTAL = "mem_total"
1095
HVST_MEMORY_NODE = "mem_node"
1096
HVST_MEMORY_HV = "mem_hv"
1097
HVST_CPU_TOTAL = "cpu_total"
1098
HVST_CPU_NODE = "cpu_node"
1099

    
1100
HVST_DEFAULTS = {
1101
  HVST_MEMORY_TOTAL: 0,
1102
  HVST_MEMORY_NODE: 0,
1103
  HVST_MEMORY_HV: 0,
1104
  HVST_CPU_TOTAL: 1,
1105
  HVST_CPU_NODE: 1,
1106
  }
1107

    
1108
HVSTS_PARAMETER_TYPES = {
1109
  HVST_MEMORY_TOTAL: VTYPE_INT,
1110
  HVST_MEMORY_NODE: VTYPE_INT,
1111
  HVST_MEMORY_HV: VTYPE_INT,
1112
  HVST_CPU_TOTAL: VTYPE_INT,
1113
  HVST_CPU_NODE: VTYPE_INT,
1114
  }
1115

    
1116
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1117

    
1118
# Disk state
1119
DS_DISK_TOTAL = "disk_total"
1120
DS_DISK_RESERVED = "disk_reserved"
1121
DS_DISK_OVERHEAD = "disk_overhead"
1122

    
1123
DS_DEFAULTS = {
1124
  DS_DISK_TOTAL: 0,
1125
  DS_DISK_RESERVED: 0,
1126
  DS_DISK_OVERHEAD: 0,
1127
  }
1128

    
1129
DSS_PARAMETER_TYPES = {
1130
  DS_DISK_TOTAL: VTYPE_INT,
1131
  DS_DISK_RESERVED: VTYPE_INT,
1132
  DS_DISK_OVERHEAD: VTYPE_INT,
1133
  }
1134

    
1135
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1136
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1137

    
1138
# Backend parameter names
1139
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1140
BE_MAXMEM = "maxmem"
1141
BE_MINMEM = "minmem"
1142
BE_VCPUS = "vcpus"
1143
BE_AUTO_BALANCE = "auto_balance"
1144
BE_ALWAYS_FAILOVER = "always_failover"
1145
BE_SPINDLE_USE = "spindle_use"
1146

    
1147
BES_PARAMETER_TYPES = {
1148
  BE_MAXMEM: VTYPE_SIZE,
1149
  BE_MINMEM: VTYPE_SIZE,
1150
  BE_VCPUS: VTYPE_INT,
1151
  BE_AUTO_BALANCE: VTYPE_BOOL,
1152
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1153
  BE_SPINDLE_USE: VTYPE_INT,
1154
  }
1155

    
1156
BES_PARAMETER_TITLES = {
1157
  BE_AUTO_BALANCE: "Auto_balance",
1158
  BE_MAXMEM: "ConfigMaxMem",
1159
  BE_MINMEM: "ConfigMinMem",
1160
  BE_VCPUS: "ConfigVCPUs",
1161
  }
1162

    
1163
BES_PARAMETER_COMPAT = {
1164
  BE_MEMORY: VTYPE_SIZE,
1165
  }
1166
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1167

    
1168
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1169

    
1170
# instance specs
1171
ISPEC_MEM_SIZE = "memory-size"
1172
ISPEC_CPU_COUNT = "cpu-count"
1173
ISPEC_DISK_COUNT = "disk-count"
1174
ISPEC_DISK_SIZE = "disk-size"
1175
ISPEC_NIC_COUNT = "nic-count"
1176
ISPEC_SPINDLE_USE = "spindle-use"
1177

    
1178
ISPECS_PARAMETER_TYPES = {
1179
  ISPEC_MEM_SIZE: VTYPE_INT,
1180
  ISPEC_CPU_COUNT: VTYPE_INT,
1181
  ISPEC_DISK_COUNT: VTYPE_INT,
1182
  ISPEC_DISK_SIZE: VTYPE_INT,
1183
  ISPEC_NIC_COUNT: VTYPE_INT,
1184
  ISPEC_SPINDLE_USE: VTYPE_INT,
1185
  }
1186

    
1187
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1188

    
1189
ISPECS_MINMAX = "minmax"
1190
ISPECS_MIN = "min"
1191
ISPECS_MAX = "max"
1192
ISPECS_STD = "std"
1193
IPOLICY_DTS = "disk-templates"
1194
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1195
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1196

    
1197
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1198
  ISPECS_MIN,
1199
  ISPECS_MAX,
1200
  ])
1201

    
1202
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1203
  IPOLICY_VCPU_RATIO,
1204
  IPOLICY_SPINDLE_RATIO,
1205
  ])
1206

    
1207
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1208
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1209

    
1210
# Node parameter names
1211
ND_OOB_PROGRAM = "oob_program"
1212
ND_SPINDLE_COUNT = "spindle_count"
1213
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1214

    
1215
NDS_PARAMETER_TYPES = {
1216
  ND_OOB_PROGRAM: VTYPE_STRING,
1217
  ND_SPINDLE_COUNT: VTYPE_INT,
1218
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1219
  }
1220

    
1221
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1222

    
1223
NDS_PARAMETER_TITLES = {
1224
  ND_OOB_PROGRAM: "OutOfBandProgram",
1225
  ND_SPINDLE_COUNT: "SpindleCount",
1226
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1227
  }
1228

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

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

    
1299
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1300

    
1301
# OOB supported commands
1302
OOB_POWER_ON = "power-on"
1303
OOB_POWER_OFF = "power-off"
1304
OOB_POWER_CYCLE = "power-cycle"
1305
OOB_POWER_STATUS = "power-status"
1306
OOB_HEALTH = "health"
1307

    
1308
OOB_COMMANDS = compat.UniqueFrozenset([
1309
  OOB_POWER_ON,
1310
  OOB_POWER_OFF,
1311
  OOB_POWER_CYCLE,
1312
  OOB_POWER_STATUS,
1313
  OOB_HEALTH,
1314
  ])
1315

    
1316
OOB_POWER_STATUS_POWERED = "powered"
1317

    
1318
OOB_TIMEOUT = 60 # 60 seconds
1319
OOB_POWER_DELAY = 2.0 # 2 seconds
1320

    
1321
OOB_STATUS_OK = "OK"
1322
OOB_STATUS_WARNING = "WARNING"
1323
OOB_STATUS_CRITICAL = "CRITICAL"
1324
OOB_STATUS_UNKNOWN = "UNKNOWN"
1325

    
1326
OOB_STATUSES = compat.UniqueFrozenset([
1327
  OOB_STATUS_OK,
1328
  OOB_STATUS_WARNING,
1329
  OOB_STATUS_CRITICAL,
1330
  OOB_STATUS_UNKNOWN,
1331
  ])
1332

    
1333
# Instance Parameters Profile
1334
PP_DEFAULT = "default"
1335

    
1336
# NIC_* constants are used inside the ganeti config
1337
NIC_MODE = "mode"
1338
NIC_LINK = "link"
1339

    
1340
NIC_MODE_BRIDGED = "bridged"
1341
NIC_MODE_ROUTED = "routed"
1342
NIC_MODE_OVS = "openvswitch"
1343
NIC_IP_POOL = "pool"
1344

    
1345
NIC_VALID_MODES = compat.UniqueFrozenset([
1346
  NIC_MODE_BRIDGED,
1347
  NIC_MODE_ROUTED,
1348
  NIC_MODE_OVS,
1349
  ])
1350

    
1351
RESERVE_ACTION = "reserve"
1352
RELEASE_ACTION = "release"
1353

    
1354
NICS_PARAMETER_TYPES = {
1355
  NIC_MODE: VTYPE_STRING,
1356
  NIC_LINK: VTYPE_STRING,
1357
  }
1358

    
1359
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1360

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

    
1382
MODIFIABLE_IDISK_PARAMS_TYPES = {
1383
  IDISK_MODE: VTYPE_STRING,
1384
  IDISK_NAME: VTYPE_STRING,
1385
  }
1386
MODIFIABLE_IDISK_PARAMS = frozenset(MODIFIABLE_IDISK_PARAMS_TYPES.keys())
1387

    
1388
# INIC_* constants are used in opcodes, to create/change nics
1389
INIC_MAC = "mac"
1390
INIC_IP = "ip"
1391
INIC_MODE = "mode"
1392
INIC_LINK = "link"
1393
INIC_NETWORK = "network"
1394
INIC_NAME = "name"
1395
INIC_PARAMS_TYPES = {
1396
  INIC_IP: VTYPE_MAYBE_STRING,
1397
  INIC_LINK: VTYPE_STRING,
1398
  INIC_MAC: VTYPE_STRING,
1399
  INIC_MODE: VTYPE_STRING,
1400
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1401
  INIC_NAME: VTYPE_MAYBE_STRING,
1402
  }
1403
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1404

    
1405
# Hypervisor constants
1406
HT_XEN_PVM = "xen-pvm"
1407
HT_FAKE = "fake"
1408
HT_XEN_HVM = "xen-hvm"
1409
HT_KVM = "kvm"
1410
HT_CHROOT = "chroot"
1411
HT_LXC = "lxc"
1412
HYPER_TYPES = compat.UniqueFrozenset([
1413
  HT_XEN_PVM,
1414
  HT_FAKE,
1415
  HT_XEN_HVM,
1416
  HT_KVM,
1417
  HT_CHROOT,
1418
  HT_LXC,
1419
  ])
1420
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1421

    
1422
VNC_BASE_PORT = 5900
1423
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1424

    
1425
# NIC types
1426
HT_NIC_RTL8139 = "rtl8139"
1427
HT_NIC_NE2K_PCI = "ne2k_pci"
1428
HT_NIC_NE2K_ISA = "ne2k_isa"
1429
HT_NIC_I82551 = "i82551"
1430
HT_NIC_I85557B = "i82557b"
1431
HT_NIC_I8259ER = "i82559er"
1432
HT_NIC_PCNET = "pcnet"
1433
HT_NIC_E1000 = "e1000"
1434
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1435

    
1436
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1437
  HT_NIC_RTL8139,
1438
  HT_NIC_NE2K_PCI,
1439
  HT_NIC_E1000,
1440
  HT_NIC_NE2K_ISA,
1441
  HT_NIC_PARAVIRTUAL,
1442
  ])
1443
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1444
  HT_NIC_RTL8139,
1445
  HT_NIC_NE2K_PCI,
1446
  HT_NIC_NE2K_ISA,
1447
  HT_NIC_I82551,
1448
  HT_NIC_I85557B,
1449
  HT_NIC_I8259ER,
1450
  HT_NIC_PCNET,
1451
  HT_NIC_E1000,
1452
  HT_NIC_PARAVIRTUAL,
1453
  ])
1454

    
1455
# Vif types
1456
# default vif type in xen-hvm
1457
HT_HVM_VIF_IOEMU = "ioemu"
1458
HT_HVM_VIF_VIF = "vif"
1459
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1460
  HT_HVM_VIF_IOEMU,
1461
  HT_HVM_VIF_VIF,
1462
  ])
1463

    
1464
# Disk types
1465
HT_DISK_IOEMU = "ioemu"
1466
HT_DISK_IDE = "ide"
1467
HT_DISK_SCSI = "scsi"
1468
HT_DISK_SD = "sd"
1469
HT_DISK_MTD = "mtd"
1470
HT_DISK_PFLASH = "pflash"
1471

    
1472
HT_CACHE_DEFAULT = "default"
1473
HT_CACHE_NONE = "none"
1474
HT_CACHE_WTHROUGH = "writethrough"
1475
HT_CACHE_WBACK = "writeback"
1476
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1477
  HT_CACHE_DEFAULT,
1478
  HT_CACHE_NONE,
1479
  HT_CACHE_WTHROUGH,
1480
  HT_CACHE_WBACK,
1481
  ])
1482

    
1483
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1484
  HT_DISK_PARAVIRTUAL,
1485
  HT_DISK_IOEMU,
1486
  ])
1487
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1488
  HT_DISK_PARAVIRTUAL,
1489
  HT_DISK_IDE,
1490
  HT_DISK_SCSI,
1491
  HT_DISK_SD,
1492
  HT_DISK_MTD,
1493
  HT_DISK_PFLASH,
1494
  ])
1495

    
1496
# Mouse types:
1497
HT_MOUSE_MOUSE = "mouse"
1498
HT_MOUSE_TABLET = "tablet"
1499

    
1500
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1501
  HT_MOUSE_MOUSE,
1502
  HT_MOUSE_TABLET,
1503
  ])
1504

    
1505
# Boot order
1506
HT_BO_FLOPPY = "floppy"
1507
HT_BO_CDROM = "cdrom"
1508
HT_BO_DISK = "disk"
1509
HT_BO_NETWORK = "network"
1510

    
1511
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1512
  HT_BO_FLOPPY,
1513
  HT_BO_CDROM,
1514
  HT_BO_DISK,
1515
  HT_BO_NETWORK,
1516
  ])
1517

    
1518
# SPICE lossless image compression options
1519
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1520
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1521
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1522
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1523
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1524
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1525

    
1526
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1527
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1528
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1529
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1530
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1531
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1532
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1533
  ])
1534

    
1535
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1536
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1537
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1538
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1539

    
1540
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1541
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1542
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1543
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1544
  ])
1545

    
1546
# SPICE video stream detection
1547
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1548
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1549
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1550

    
1551
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1552
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1553
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1554
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1555
  ])
1556

    
1557
# Security models
1558
HT_SM_NONE = "none"
1559
HT_SM_USER = "user"
1560
HT_SM_POOL = "pool"
1561

    
1562
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1563
  HT_SM_NONE,
1564
  HT_SM_USER,
1565
  HT_SM_POOL,
1566
  ])
1567

    
1568
# Kvm flag values
1569
HT_KVM_ENABLED = "enabled"
1570
HT_KVM_DISABLED = "disabled"
1571

    
1572
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1573

    
1574
# Migration type
1575
HT_MIGRATION_LIVE = "live"
1576
HT_MIGRATION_NONLIVE = "non-live"
1577
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1578
  HT_MIGRATION_LIVE,
1579
  HT_MIGRATION_NONLIVE,
1580
  ])
1581

    
1582
# Cluster Verify steps
1583
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1584
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1585

    
1586
# Cluster Verify error classes
1587
CV_TCLUSTER = "cluster"
1588
CV_TGROUP = "group"
1589
CV_TNODE = "node"
1590
CV_TINSTANCE = "instance"
1591

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

    
1674
CV_ALL_ECODES = compat.UniqueFrozenset([
1675
  CV_ECLUSTERCFG,
1676
  CV_ECLUSTERCERT,
1677
  CV_ECLUSTERFILECHECK,
1678
  CV_ECLUSTERDANGLINGNODES,
1679
  CV_ECLUSTERDANGLINGINST,
1680
  CV_EINSTANCEBADNODE,
1681
  CV_EINSTANCEDOWN,
1682
  CV_EINSTANCELAYOUT,
1683
  CV_EINSTANCEMISSINGDISK,
1684
  CV_EINSTANCEFAULTYDISK,
1685
  CV_EINSTANCEWRONGNODE,
1686
  CV_EINSTANCESPLITGROUPS,
1687
  CV_EINSTANCEPOLICY,
1688
  CV_ENODEDRBD,
1689
  CV_ENODEDRBDHELPER,
1690
  CV_ENODEFILECHECK,
1691
  CV_ENODEHOOKS,
1692
  CV_ENODEHV,
1693
  CV_ENODELVM,
1694
  CV_ENODEN1,
1695
  CV_ENODENET,
1696
  CV_ENODEOS,
1697
  CV_ENODEORPHANINSTANCE,
1698
  CV_ENODEORPHANLV,
1699
  CV_ENODERPC,
1700
  CV_ENODESSH,
1701
  CV_ENODEVERSION,
1702
  CV_ENODESETUP,
1703
  CV_ENODETIME,
1704
  CV_ENODEOOBPATH,
1705
  CV_ENODEUSERSCRIPTS,
1706
  CV_ENODEFILESTORAGEPATHS,
1707
  ])
1708

    
1709
CV_ALL_ECODES_STRINGS = \
1710
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1711

    
1712
# Node verify constants
1713
NV_BRIDGES = "bridges"
1714
NV_DRBDHELPER = "drbd-helper"
1715
NV_DRBDLIST = "drbd-list"
1716
NV_EXCLUSIVEPVS = "exclusive-pvs"
1717
NV_FILELIST = "filelist"
1718
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1719
NV_HVINFO = "hvinfo"
1720
NV_HVPARAMS = "hvparms"
1721
NV_HYPERVISOR = "hypervisor"
1722
NV_INSTANCELIST = "instancelist"
1723
NV_LVLIST = "lvlist"
1724
NV_MASTERIP = "master-ip"
1725
NV_NODELIST = "nodelist"
1726
NV_NODENETTEST = "node-net-test"
1727
NV_NODESETUP = "nodesetup"
1728
NV_OOB_PATHS = "oob-paths"
1729
NV_OSLIST = "oslist"
1730
NV_PVLIST = "pvlist"
1731
NV_TIME = "time"
1732
NV_USERSCRIPTS = "user-scripts"
1733
NV_VERSION = "version"
1734
NV_VGLIST = "vglist"
1735
NV_VMNODES = "vmnodes"
1736

    
1737
# Instance status
1738
INSTST_RUNNING = "running"
1739
INSTST_ADMINDOWN = "ADMIN_down"
1740
INSTST_ADMINOFFLINE = "ADMIN_offline"
1741
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1742
INSTST_NODEDOWN = "ERROR_nodedown"
1743
INSTST_WRONGNODE = "ERROR_wrongnode"
1744
INSTST_ERRORUP = "ERROR_up"
1745
INSTST_ERRORDOWN = "ERROR_down"
1746
INSTST_ALL = compat.UniqueFrozenset([
1747
  INSTST_RUNNING,
1748
  INSTST_ADMINDOWN,
1749
  INSTST_ADMINOFFLINE,
1750
  INSTST_NODEOFFLINE,
1751
  INSTST_NODEDOWN,
1752
  INSTST_WRONGNODE,
1753
  INSTST_ERRORUP,
1754
  INSTST_ERRORDOWN,
1755
  ])
1756

    
1757
# Admin states
1758
ADMINST_UP = "up"
1759
ADMINST_DOWN = "down"
1760
ADMINST_OFFLINE = "offline"
1761
ADMINST_ALL = compat.UniqueFrozenset([
1762
  ADMINST_UP,
1763
  ADMINST_DOWN,
1764
  ADMINST_OFFLINE,
1765
  ])
1766

    
1767
# Node roles
1768
NR_REGULAR = "R"
1769
NR_MASTER = "M"
1770
NR_MCANDIDATE = "C"
1771
NR_DRAINED = "D"
1772
NR_OFFLINE = "O"
1773
NR_ALL = compat.UniqueFrozenset([
1774
  NR_REGULAR,
1775
  NR_MASTER,
1776
  NR_MCANDIDATE,
1777
  NR_DRAINED,
1778
  NR_OFFLINE,
1779
  ])
1780

    
1781
# SSL certificate check constants (in days)
1782
SSL_CERT_EXPIRATION_WARN = 30
1783
SSL_CERT_EXPIRATION_ERROR = 7
1784

    
1785
# Allocator framework constants
1786
IALLOCATOR_VERSION = 2
1787
IALLOCATOR_DIR_IN = "in"
1788
IALLOCATOR_DIR_OUT = "out"
1789
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1790
  IALLOCATOR_DIR_IN,
1791
  IALLOCATOR_DIR_OUT,
1792
  ])
1793
IALLOCATOR_MODE_ALLOC = "allocate"
1794
IALLOCATOR_MODE_RELOC = "relocate"
1795
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1796
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1797
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1798
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1799
  IALLOCATOR_MODE_ALLOC,
1800
  IALLOCATOR_MODE_RELOC,
1801
  IALLOCATOR_MODE_CHG_GROUP,
1802
  IALLOCATOR_MODE_NODE_EVAC,
1803
  IALLOCATOR_MODE_MULTI_ALLOC,
1804
  ])
1805
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1806
DEFAULT_IALLOCATOR_SHORTCUT = "."
1807

    
1808
IALLOCATOR_NEVAC_PRI = "primary-only"
1809
IALLOCATOR_NEVAC_SEC = "secondary-only"
1810
IALLOCATOR_NEVAC_ALL = "all"
1811
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1812
  IALLOCATOR_NEVAC_PRI,
1813
  IALLOCATOR_NEVAC_SEC,
1814
  IALLOCATOR_NEVAC_ALL,
1815
  ])
1816

    
1817
# Node evacuation
1818
NODE_EVAC_PRI = "primary-only"
1819
NODE_EVAC_SEC = "secondary-only"
1820
NODE_EVAC_ALL = "all"
1821
NODE_EVAC_MODES = compat.UniqueFrozenset([
1822
  NODE_EVAC_PRI,
1823
  NODE_EVAC_SEC,
1824
  NODE_EVAC_ALL,
1825
  ])
1826

    
1827
# Job queue
1828
JOB_QUEUE_VERSION = 1
1829
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1830
JOB_QUEUE_FILES_PERMS = 0640
1831

    
1832
JOB_ID_TEMPLATE = r"\d+"
1833
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1834

    
1835
# unchanged job return
1836
JOB_NOTCHANGED = "nochange"
1837

    
1838
# Job status
1839
JOB_STATUS_QUEUED = "queued"
1840
JOB_STATUS_WAITING = "waiting"
1841
JOB_STATUS_CANCELING = "canceling"
1842
JOB_STATUS_RUNNING = "running"
1843
JOB_STATUS_CANCELED = "canceled"
1844
JOB_STATUS_SUCCESS = "success"
1845
JOB_STATUS_ERROR = "error"
1846
JOBS_PENDING = compat.UniqueFrozenset([
1847
  JOB_STATUS_QUEUED,
1848
  JOB_STATUS_WAITING,
1849
  JOB_STATUS_CANCELING,
1850
  ])
1851
JOBS_FINALIZED = compat.UniqueFrozenset([
1852
  JOB_STATUS_CANCELED,
1853
  JOB_STATUS_SUCCESS,
1854
  JOB_STATUS_ERROR,
1855
  ])
1856
JOB_STATUS_ALL = compat.UniqueFrozenset([
1857
  JOB_STATUS_RUNNING,
1858
  ]) | JOBS_PENDING | JOBS_FINALIZED
1859

    
1860
# OpCode status
1861
# not yet finalized
1862
OP_STATUS_QUEUED = "queued"
1863
OP_STATUS_WAITING = "waiting"
1864
OP_STATUS_CANCELING = "canceling"
1865
OP_STATUS_RUNNING = "running"
1866
# finalized
1867
OP_STATUS_CANCELED = "canceled"
1868
OP_STATUS_SUCCESS = "success"
1869
OP_STATUS_ERROR = "error"
1870
OPS_FINALIZED = compat.UniqueFrozenset([
1871
  OP_STATUS_CANCELED,
1872
  OP_STATUS_SUCCESS,
1873
  OP_STATUS_ERROR,
1874
  ])
1875

    
1876
# OpCode priority
1877
OP_PRIO_LOWEST = +19
1878
OP_PRIO_HIGHEST = -20
1879

    
1880
OP_PRIO_LOW = +10
1881
OP_PRIO_NORMAL = 0
1882
OP_PRIO_HIGH = -10
1883

    
1884
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1885
  OP_PRIO_LOW,
1886
  OP_PRIO_NORMAL,
1887
  OP_PRIO_HIGH,
1888
  ])
1889

    
1890
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1891

    
1892
# Lock recalculate mode
1893
LOCKS_REPLACE = "replace"
1894
LOCKS_APPEND = "append"
1895

    
1896
# Lock timeout (sum) before we should go into blocking acquire (still
1897
# can be reset by priority change); computed as max time (10 hours)
1898
# before we should actually go into blocking acquire given that we
1899
# start from default priority level; in seconds
1900
# TODO
1901
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1902
LOCK_ATTEMPTS_MAXWAIT = 15.0
1903
LOCK_ATTEMPTS_MINWAIT = 1.0
1904

    
1905
# Execution log types
1906
ELOG_MESSAGE = "message"
1907
ELOG_REMOTE_IMPORT = "remote-import"
1908
ELOG_JQUEUE_TEST = "jqueue-test"
1909

    
1910
# /etc/hosts modification
1911
ETC_HOSTS_ADD = "add"
1912
ETC_HOSTS_REMOVE = "remove"
1913

    
1914
# Job queue test
1915
JQT_MSGPREFIX = "TESTMSG="
1916
JQT_EXPANDNAMES = "expandnames"
1917
JQT_EXEC = "exec"
1918
JQT_LOGMSG = "logmsg"
1919
JQT_STARTMSG = "startmsg"
1920
JQT_ALL = compat.UniqueFrozenset([
1921
  JQT_EXPANDNAMES,
1922
  JQT_EXEC,
1923
  JQT_LOGMSG,
1924
  JQT_STARTMSG,
1925
  ])
1926

    
1927
# Query resources
1928
QR_CLUSTER = "cluster"
1929
QR_INSTANCE = "instance"
1930
QR_NODE = "node"
1931
QR_LOCK = "lock"
1932
QR_GROUP = "group"
1933
QR_OS = "os"
1934
QR_JOB = "job"
1935
QR_EXPORT = "export"
1936
QR_NETWORK = "network"
1937
QR_EXTSTORAGE = "extstorage"
1938

    
1939
#: List of resources which can be queried using L{opcodes.OpQuery}
1940
QR_VIA_OP = compat.UniqueFrozenset([
1941
  QR_CLUSTER,
1942
  QR_INSTANCE,
1943
  QR_NODE,
1944
  QR_GROUP,
1945
  QR_OS,
1946
  QR_EXPORT,
1947
  QR_NETWORK,
1948
  QR_EXTSTORAGE,
1949
  ])
1950

    
1951
#: List of resources which can be queried using Local UniX Interface
1952
QR_VIA_LUXI = QR_VIA_OP.union([
1953
  QR_LOCK,
1954
  QR_JOB,
1955
  ])
1956

    
1957
#: List of resources which can be queried using RAPI
1958
QR_VIA_RAPI = QR_VIA_LUXI
1959

    
1960
# Query field types
1961
QFT_UNKNOWN = "unknown"
1962
QFT_TEXT = "text"
1963
QFT_BOOL = "bool"
1964
QFT_NUMBER = "number"
1965
QFT_UNIT = "unit"
1966
QFT_TIMESTAMP = "timestamp"
1967
QFT_OTHER = "other"
1968

    
1969
#: All query field types
1970
QFT_ALL = compat.UniqueFrozenset([
1971
  QFT_UNKNOWN,
1972
  QFT_TEXT,
1973
  QFT_BOOL,
1974
  QFT_NUMBER,
1975
  QFT_UNIT,
1976
  QFT_TIMESTAMP,
1977
  QFT_OTHER,
1978
  ])
1979

    
1980
# Query result field status (don't change or reuse values as they're used by
1981
# clients)
1982
#: Normal field status
1983
RS_NORMAL = 0
1984
#: Unknown field
1985
RS_UNKNOWN = 1
1986
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1987
RS_NODATA = 2
1988
#: Value unavailable/unsupported for item; if this field is supported
1989
#: but we cannot get the data for the moment, RS_NODATA or
1990
#: RS_OFFLINE should be used
1991
RS_UNAVAIL = 3
1992
#: Resource marked offline
1993
RS_OFFLINE = 4
1994

    
1995
RS_ALL = compat.UniqueFrozenset([
1996
  RS_NORMAL,
1997
  RS_UNKNOWN,
1998
  RS_NODATA,
1999
  RS_UNAVAIL,
2000
  RS_OFFLINE,
2001
  ])
2002

    
2003
#: Dictionary with special field cases and their verbose/terse formatting
2004
RSS_DESCRIPTION = {
2005
  RS_UNKNOWN: ("(unknown)", "??"),
2006
  RS_NODATA: ("(nodata)", "?"),
2007
  RS_OFFLINE: ("(offline)", "*"),
2008
  RS_UNAVAIL: ("(unavail)", "-"),
2009
  }
2010

    
2011
# max dynamic devices
2012
MAX_NICS = 8
2013
MAX_DISKS = 16
2014

    
2015
# SSCONF file prefix
2016
SSCONF_FILEPREFIX = "ssconf_"
2017
# SSCONF keys
2018
SS_CLUSTER_NAME = "cluster_name"
2019
SS_CLUSTER_TAGS = "cluster_tags"
2020
SS_FILE_STORAGE_DIR = "file_storage_dir"
2021
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
2022
SS_MASTER_CANDIDATES = "master_candidates"
2023
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
2024
SS_MASTER_IP = "master_ip"
2025
SS_MASTER_NETDEV = "master_netdev"
2026
SS_MASTER_NETMASK = "master_netmask"
2027
SS_MASTER_NODE = "master_node"
2028
SS_NODE_LIST = "node_list"
2029
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2030
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2031
SS_OFFLINE_NODES = "offline_nodes"
2032
SS_ONLINE_NODES = "online_nodes"
2033
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2034
SS_INSTANCE_LIST = "instance_list"
2035
SS_RELEASE_VERSION = "release_version"
2036
SS_HYPERVISOR_LIST = "hypervisor_list"
2037
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2038
SS_UID_POOL = "uid_pool"
2039
SS_NODEGROUPS = "nodegroups"
2040
SS_NETWORKS = "networks"
2041

    
2042
SS_FILE_PERMS = 0444
2043

    
2044
# cluster wide default parameters
2045
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2046

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

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

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

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

    
2178
NDC_GLOBALS = compat.UniqueFrozenset([
2179
  ND_EXCLUSIVE_STORAGE,
2180
  ])
2181

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

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

    
2214
# readability shortcuts
2215
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2216
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2217

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

    
2248
# we don't want to export the shortcuts
2249
del _LV_DEFAULTS, _DRBD_DEFAULTS
2250

    
2251
NICC_DEFAULTS = {
2252
  NIC_MODE: NIC_MODE_BRIDGED,
2253
  NIC_LINK: DEFAULT_BRIDGE,
2254
  }
2255

    
2256
# All of the following values are quite arbitrarily - there are no
2257
# "good" defaults, these must be customised per-site
2258
ISPECS_MINMAX_DEFAULTS = {
2259
  ISPECS_MIN: {
2260
    ISPEC_MEM_SIZE: 128,
2261
    ISPEC_CPU_COUNT: 1,
2262
    ISPEC_DISK_COUNT: 1,
2263
    ISPEC_DISK_SIZE: 1024,
2264
    ISPEC_NIC_COUNT: 1,
2265
    ISPEC_SPINDLE_USE: 1,
2266
    },
2267
  ISPECS_MAX: {
2268
    ISPEC_MEM_SIZE: 32768,
2269
    ISPEC_CPU_COUNT: 8,
2270
    ISPEC_DISK_COUNT: MAX_DISKS,
2271
    ISPEC_DISK_SIZE: 1024 * 1024,
2272
    ISPEC_NIC_COUNT: MAX_NICS,
2273
    ISPEC_SPINDLE_USE: 12,
2274
    },
2275
  }
2276
IPOLICY_DEFAULTS = {
2277
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2278
  ISPECS_STD: {
2279
    ISPEC_MEM_SIZE: 128,
2280
    ISPEC_CPU_COUNT: 1,
2281
    ISPEC_DISK_COUNT: 1,
2282
    ISPEC_DISK_SIZE: 1024,
2283
    ISPEC_NIC_COUNT: 1,
2284
    ISPEC_SPINDLE_USE: 1,
2285
    },
2286
  IPOLICY_DTS: list(DISK_TEMPLATES),
2287
  IPOLICY_VCPU_RATIO: 4.0,
2288
  IPOLICY_SPINDLE_RATIO: 32.0,
2289
  }
2290

    
2291
MASTER_POOL_SIZE_DEFAULT = 10
2292

    
2293
# Exclusive storage:
2294
# Error margin used to compare physical disks
2295
PART_MARGIN = .01
2296
# Space reserved when creating instance disks
2297
PART_RESERVED = .02
2298

    
2299
CONFD_PROTOCOL_VERSION = 1
2300

    
2301
CONFD_REQ_PING = 0
2302
CONFD_REQ_NODE_ROLE_BYNAME = 1
2303
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2304
CONFD_REQ_CLUSTER_MASTER = 3
2305
CONFD_REQ_NODE_PIP_LIST = 4
2306
CONFD_REQ_MC_PIP_LIST = 5
2307
CONFD_REQ_INSTANCES_IPS_LIST = 6
2308
CONFD_REQ_NODE_DRBD = 7
2309
CONFD_REQ_NODE_INSTANCES = 8
2310

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

    
2319
CONFD_REQFIELD_NAME = "0"
2320
CONFD_REQFIELD_IP = "1"
2321
CONFD_REQFIELD_MNODE_PIP = "2"
2322

    
2323
CONFD_REQS = compat.UniqueFrozenset([
2324
  CONFD_REQ_PING,
2325
  CONFD_REQ_NODE_ROLE_BYNAME,
2326
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2327
  CONFD_REQ_CLUSTER_MASTER,
2328
  CONFD_REQ_NODE_PIP_LIST,
2329
  CONFD_REQ_MC_PIP_LIST,
2330
  CONFD_REQ_INSTANCES_IPS_LIST,
2331
  CONFD_REQ_NODE_DRBD,
2332
  ])
2333

    
2334
CONFD_REPL_STATUS_OK = 0
2335
CONFD_REPL_STATUS_ERROR = 1
2336
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2337

    
2338
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2339
  CONFD_REPL_STATUS_OK,
2340
  CONFD_REPL_STATUS_ERROR,
2341
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2342
  ])
2343

    
2344
(CONFD_NODE_ROLE_MASTER,
2345
 CONFD_NODE_ROLE_CANDIDATE,
2346
 CONFD_NODE_ROLE_OFFLINE,
2347
 CONFD_NODE_ROLE_DRAINED,
2348
 CONFD_NODE_ROLE_REGULAR,
2349
 ) = range(5)
2350

    
2351
# A few common errors for confd
2352
CONFD_ERROR_UNKNOWN_ENTRY = 1
2353
CONFD_ERROR_INTERNAL = 2
2354
CONFD_ERROR_ARGUMENT = 3
2355

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

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

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

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

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

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

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

    
2395
# User-id pool minimum/maximum acceptable user-ids.
2396
UIDPOOL_UID_MIN = 0
2397
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2398

    
2399
# Name or path of the pgrep command
2400
PGREP = "pgrep"
2401

    
2402
# Name of the node group that gets created at cluster init or upgrade
2403
INITIAL_NODE_GROUP_NAME = "default"
2404

    
2405
# Possible values for NodeGroup.alloc_policy
2406
ALLOC_POLICY_PREFERRED = "preferred"
2407
ALLOC_POLICY_LAST_RESORT = "last_resort"
2408
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2409
VALID_ALLOC_POLICIES = [
2410
  ALLOC_POLICY_PREFERRED,
2411
  ALLOC_POLICY_LAST_RESORT,
2412
  ALLOC_POLICY_UNALLOCABLE,
2413
  ]
2414

    
2415
# Temporary external/shared storage parameters
2416
BLOCKDEV_DRIVER_MANUAL = "manual"
2417

    
2418
# qemu-img path, required for ovfconverter
2419
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2420

    
2421
# Whether htools was enabled at compilation time
2422
HTOOLS = _autoconf.HTOOLS
2423
# The hail iallocator
2424
IALLOC_HAIL = "hail"
2425

    
2426
# Fake opcodes for functions that have hooks attached to them via
2427
# backend.RunLocalHooks
2428
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2429
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2430

    
2431
# SSH key types
2432
SSHK_RSA = "rsa"
2433
SSHK_DSA = "dsa"
2434
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2435

    
2436
# SSH authorized key types
2437
SSHAK_RSA = "ssh-rsa"
2438
SSHAK_DSS = "ssh-dss"
2439
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2440

    
2441
# SSH setup
2442
SSHS_CLUSTER_NAME = "cluster_name"
2443
SSHS_SSH_HOST_KEY = "ssh_host_key"
2444
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2445
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2446

    
2447
#: Key files for SSH daemon
2448
SSH_DAEMON_KEYFILES = {
2449
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2450
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2451
  }
2452

    
2453
# Node daemon setup
2454
NDS_CLUSTER_NAME = "cluster_name"
2455
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2456
NDS_SSCONF = "ssconf"
2457
NDS_START_NODE_DAEMON = "start_node_daemon"
2458

    
2459
# Path generating random UUID
2460
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2461

    
2462
# Regex string for verifying a UUID
2463
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2464

    
2465
# Auto-repair tag prefixes
2466
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2467
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2468
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2469
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2470
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2471

    
2472
# Auto-repair levels
2473
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2474
AUTO_REPAIR_MIGRATE = "migrate"
2475
AUTO_REPAIR_FAILOVER = "failover"
2476
AUTO_REPAIR_REINSTALL = "reinstall"
2477
AUTO_REPAIR_ALL_TYPES = [
2478
  AUTO_REPAIR_FIX_STORAGE,
2479
  AUTO_REPAIR_MIGRATE,
2480
  AUTO_REPAIR_FAILOVER,
2481
  AUTO_REPAIR_REINSTALL,
2482
]
2483

    
2484
# Auto-repair results
2485
AUTO_REPAIR_SUCCESS = "success"
2486
AUTO_REPAIR_FAILURE = "failure"
2487
AUTO_REPAIR_ENOPERM = "enoperm"
2488
AUTO_REPAIR_ALL_RESULTS = frozenset([
2489
    AUTO_REPAIR_SUCCESS,
2490
    AUTO_REPAIR_FAILURE,
2491
    AUTO_REPAIR_ENOPERM,
2492
])
2493

    
2494
# The version identifier for builtin data collectors
2495
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2496

    
2497
# The reason trail opcode parameter name
2498
OPCODE_REASON = "reason"
2499

    
2500
# The source reasons for the execution of an OpCode
2501
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2502
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2503
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2504
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2505
OPCODE_REASON_SRC_USER = "gnt:user"
2506

    
2507
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2508
  OPCODE_REASON_SRC_CLIENT,
2509
  OPCODE_REASON_SRC_NODED,
2510
  OPCODE_REASON_SRC_OPCODE,
2511
  OPCODE_REASON_SRC_RLIB2,
2512
  OPCODE_REASON_SRC_USER,
2513
  ])
2514

    
2515
# disk removal timeouts
2516
DISK_REMOVE_RETRY_INTERVAL = 3
2517
DISK_REMOVE_RETRY_TIMEOUT = 30
2518

    
2519
# Do not re-export imported modules
2520
del re, _vcsversion, _autoconf, socket, pathutils, compat