Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 5f5aa745

History | View | Annotate | Download (63.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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
826
ES_PARAMETERS_FILE = "parameters.list"
827

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

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

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

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

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

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

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

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

    
956

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

    
1029
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1030

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

    
1045
# Migration statuses
1046
HV_MIGRATION_COMPLETED = "completed"
1047
HV_MIGRATION_ACTIVE = "active"
1048
HV_MIGRATION_FAILED = "failed"
1049
HV_MIGRATION_CANCELLED = "cancelled"
1050

    
1051
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1052
  HV_MIGRATION_COMPLETED,
1053
  HV_MIGRATION_ACTIVE,
1054
  HV_MIGRATION_FAILED,
1055
  HV_MIGRATION_CANCELLED,
1056
  ])
1057

    
1058
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1059
  HV_MIGRATION_FAILED,
1060
  HV_MIGRATION_CANCELLED,
1061
  ])
1062

    
1063
# KVM-specific statuses
1064
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1065

    
1066
# Node info keys
1067
HV_NODEINFO_KEY_VERSION = "hv_version"
1068

    
1069
# Hypervisor state
1070
HVST_MEMORY_TOTAL = "mem_total"
1071
HVST_MEMORY_NODE = "mem_node"
1072
HVST_MEMORY_HV = "mem_hv"
1073
HVST_CPU_TOTAL = "cpu_total"
1074
HVST_CPU_NODE = "cpu_node"
1075

    
1076
HVST_DEFAULTS = {
1077
  HVST_MEMORY_TOTAL: 0,
1078
  HVST_MEMORY_NODE: 0,
1079
  HVST_MEMORY_HV: 0,
1080
  HVST_CPU_TOTAL: 1,
1081
  HVST_CPU_NODE: 1,
1082
  }
1083

    
1084
HVSTS_PARAMETER_TYPES = {
1085
  HVST_MEMORY_TOTAL: VTYPE_INT,
1086
  HVST_MEMORY_NODE: VTYPE_INT,
1087
  HVST_MEMORY_HV: VTYPE_INT,
1088
  HVST_CPU_TOTAL: VTYPE_INT,
1089
  HVST_CPU_NODE: VTYPE_INT,
1090
  }
1091

    
1092
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1093

    
1094
# Disk state
1095
DS_DISK_TOTAL = "disk_total"
1096
DS_DISK_RESERVED = "disk_reserved"
1097
DS_DISK_OVERHEAD = "disk_overhead"
1098

    
1099
DS_DEFAULTS = {
1100
  DS_DISK_TOTAL: 0,
1101
  DS_DISK_RESERVED: 0,
1102
  DS_DISK_OVERHEAD: 0,
1103
  }
1104

    
1105
DSS_PARAMETER_TYPES = {
1106
  DS_DISK_TOTAL: VTYPE_INT,
1107
  DS_DISK_RESERVED: VTYPE_INT,
1108
  DS_DISK_OVERHEAD: VTYPE_INT,
1109
  }
1110

    
1111
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1112
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1113

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

    
1123
BES_PARAMETER_TYPES = {
1124
  BE_MAXMEM: VTYPE_SIZE,
1125
  BE_MINMEM: VTYPE_SIZE,
1126
  BE_VCPUS: VTYPE_INT,
1127
  BE_AUTO_BALANCE: VTYPE_BOOL,
1128
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1129
  BE_SPINDLE_USE: VTYPE_INT,
1130
  }
1131

    
1132
BES_PARAMETER_TITLES = {
1133
  BE_AUTO_BALANCE: "Auto_balance",
1134
  BE_MAXMEM: "ConfigMaxMem",
1135
  BE_MINMEM: "ConfigMinMem",
1136
  BE_VCPUS: "ConfigVCPUs",
1137
  }
1138

    
1139
BES_PARAMETER_COMPAT = {
1140
  BE_MEMORY: VTYPE_SIZE,
1141
  }
1142
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1143

    
1144
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1145

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

    
1154
ISPECS_PARAMETER_TYPES = {
1155
  ISPEC_MEM_SIZE: VTYPE_INT,
1156
  ISPEC_CPU_COUNT: VTYPE_INT,
1157
  ISPEC_DISK_COUNT: VTYPE_INT,
1158
  ISPEC_DISK_SIZE: VTYPE_INT,
1159
  ISPEC_NIC_COUNT: VTYPE_INT,
1160
  ISPEC_SPINDLE_USE: VTYPE_INT,
1161
  }
1162

    
1163
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1164

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

    
1173
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1174
  ISPECS_MIN,
1175
  ISPECS_MAX,
1176
  ])
1177

    
1178
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1179
  IPOLICY_VCPU_RATIO,
1180
  IPOLICY_SPINDLE_RATIO,
1181
  ])
1182

    
1183
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1184
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1185

    
1186
# Node parameter names
1187
ND_OOB_PROGRAM = "oob_program"
1188
ND_SPINDLE_COUNT = "spindle_count"
1189
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1190

    
1191
NDS_PARAMETER_TYPES = {
1192
  ND_OOB_PROGRAM: VTYPE_STRING,
1193
  ND_SPINDLE_COUNT: VTYPE_INT,
1194
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1195
  }
1196

    
1197
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1198

    
1199
NDS_PARAMETER_TITLES = {
1200
  ND_OOB_PROGRAM: "OutOfBandProgram",
1201
  ND_SPINDLE_COUNT: "SpindleCount",
1202
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1203
  }
1204

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

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

    
1275
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1276

    
1277
# OOB supported commands
1278
OOB_POWER_ON = "power-on"
1279
OOB_POWER_OFF = "power-off"
1280
OOB_POWER_CYCLE = "power-cycle"
1281
OOB_POWER_STATUS = "power-status"
1282
OOB_HEALTH = "health"
1283

    
1284
OOB_COMMANDS = compat.UniqueFrozenset([
1285
  OOB_POWER_ON,
1286
  OOB_POWER_OFF,
1287
  OOB_POWER_CYCLE,
1288
  OOB_POWER_STATUS,
1289
  OOB_HEALTH,
1290
  ])
1291

    
1292
OOB_POWER_STATUS_POWERED = "powered"
1293

    
1294
OOB_TIMEOUT = 60 # 60 seconds
1295
OOB_POWER_DELAY = 2.0 # 2 seconds
1296

    
1297
OOB_STATUS_OK = "OK"
1298
OOB_STATUS_WARNING = "WARNING"
1299
OOB_STATUS_CRITICAL = "CRITICAL"
1300
OOB_STATUS_UNKNOWN = "UNKNOWN"
1301

    
1302
OOB_STATUSES = compat.UniqueFrozenset([
1303
  OOB_STATUS_OK,
1304
  OOB_STATUS_WARNING,
1305
  OOB_STATUS_CRITICAL,
1306
  OOB_STATUS_UNKNOWN,
1307
  ])
1308

    
1309
# Instance Parameters Profile
1310
PP_DEFAULT = "default"
1311

    
1312
# NIC_* constants are used inside the ganeti config
1313
NIC_MODE = "mode"
1314
NIC_LINK = "link"
1315

    
1316
NIC_MODE_BRIDGED = "bridged"
1317
NIC_MODE_ROUTED = "routed"
1318
NIC_MODE_OVS = "openvswitch"
1319
NIC_IP_POOL = "pool"
1320

    
1321
NIC_VALID_MODES = compat.UniqueFrozenset([
1322
  NIC_MODE_BRIDGED,
1323
  NIC_MODE_ROUTED,
1324
  NIC_MODE_OVS,
1325
  ])
1326

    
1327
RESERVE_ACTION = "reserve"
1328
RELEASE_ACTION = "release"
1329

    
1330
NICS_PARAMETER_TYPES = {
1331
  NIC_MODE: VTYPE_STRING,
1332
  NIC_LINK: VTYPE_STRING,
1333
  }
1334

    
1335
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1336

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

    
1356
# INIC_* constants are used in opcodes, to create/change nics
1357
INIC_MAC = "mac"
1358
INIC_IP = "ip"
1359
INIC_MODE = "mode"
1360
INIC_LINK = "link"
1361
INIC_NETWORK = "network"
1362
INIC_NAME = "name"
1363
INIC_PARAMS_TYPES = {
1364
  INIC_IP: VTYPE_MAYBE_STRING,
1365
  INIC_LINK: VTYPE_STRING,
1366
  INIC_MAC: VTYPE_STRING,
1367
  INIC_MODE: VTYPE_STRING,
1368
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1369
  INIC_NAME: VTYPE_MAYBE_STRING,
1370
  }
1371
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1372

    
1373
# Hypervisor constants
1374
HT_XEN_PVM = "xen-pvm"
1375
HT_FAKE = "fake"
1376
HT_XEN_HVM = "xen-hvm"
1377
HT_KVM = "kvm"
1378
HT_CHROOT = "chroot"
1379
HT_LXC = "lxc"
1380
HYPER_TYPES = compat.UniqueFrozenset([
1381
  HT_XEN_PVM,
1382
  HT_FAKE,
1383
  HT_XEN_HVM,
1384
  HT_KVM,
1385
  HT_CHROOT,
1386
  HT_LXC,
1387
  ])
1388
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1389

    
1390
VNC_BASE_PORT = 5900
1391
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1392

    
1393
# NIC types
1394
HT_NIC_RTL8139 = "rtl8139"
1395
HT_NIC_NE2K_PCI = "ne2k_pci"
1396
HT_NIC_NE2K_ISA = "ne2k_isa"
1397
HT_NIC_I82551 = "i82551"
1398
HT_NIC_I85557B = "i82557b"
1399
HT_NIC_I8259ER = "i82559er"
1400
HT_NIC_PCNET = "pcnet"
1401
HT_NIC_E1000 = "e1000"
1402
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1403

    
1404
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1405
  HT_NIC_RTL8139,
1406
  HT_NIC_NE2K_PCI,
1407
  HT_NIC_E1000,
1408
  HT_NIC_NE2K_ISA,
1409
  HT_NIC_PARAVIRTUAL,
1410
  ])
1411
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1412
  HT_NIC_RTL8139,
1413
  HT_NIC_NE2K_PCI,
1414
  HT_NIC_NE2K_ISA,
1415
  HT_NIC_I82551,
1416
  HT_NIC_I85557B,
1417
  HT_NIC_I8259ER,
1418
  HT_NIC_PCNET,
1419
  HT_NIC_E1000,
1420
  HT_NIC_PARAVIRTUAL,
1421
  ])
1422

    
1423
# Vif types
1424
# default vif type in xen-hvm
1425
HT_HVM_VIF_IOEMU = "ioemu"
1426
HT_HVM_VIF_VIF = "vif"
1427
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1428
  HT_HVM_VIF_IOEMU,
1429
  HT_HVM_VIF_VIF,
1430
  ])
1431

    
1432
# Disk types
1433
HT_DISK_IOEMU = "ioemu"
1434
HT_DISK_IDE = "ide"
1435
HT_DISK_SCSI = "scsi"
1436
HT_DISK_SD = "sd"
1437
HT_DISK_MTD = "mtd"
1438
HT_DISK_PFLASH = "pflash"
1439

    
1440
HT_CACHE_DEFAULT = "default"
1441
HT_CACHE_NONE = "none"
1442
HT_CACHE_WTHROUGH = "writethrough"
1443
HT_CACHE_WBACK = "writeback"
1444
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1445
  HT_CACHE_DEFAULT,
1446
  HT_CACHE_NONE,
1447
  HT_CACHE_WTHROUGH,
1448
  HT_CACHE_WBACK,
1449
  ])
1450

    
1451
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1452
  HT_DISK_PARAVIRTUAL,
1453
  HT_DISK_IOEMU,
1454
  ])
1455
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1456
  HT_DISK_PARAVIRTUAL,
1457
  HT_DISK_IDE,
1458
  HT_DISK_SCSI,
1459
  HT_DISK_SD,
1460
  HT_DISK_MTD,
1461
  HT_DISK_PFLASH,
1462
  ])
1463

    
1464
# Mouse types:
1465
HT_MOUSE_MOUSE = "mouse"
1466
HT_MOUSE_TABLET = "tablet"
1467

    
1468
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1469
  HT_MOUSE_MOUSE,
1470
  HT_MOUSE_TABLET,
1471
  ])
1472

    
1473
# Boot order
1474
HT_BO_FLOPPY = "floppy"
1475
HT_BO_CDROM = "cdrom"
1476
HT_BO_DISK = "disk"
1477
HT_BO_NETWORK = "network"
1478

    
1479
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1480
  HT_BO_FLOPPY,
1481
  HT_BO_CDROM,
1482
  HT_BO_DISK,
1483
  HT_BO_NETWORK,
1484
  ])
1485

    
1486
# SPICE lossless image compression options
1487
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1488
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1489
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1490
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1491
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1492
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1493

    
1494
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1495
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1496
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1497
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1498
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1499
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1500
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1501
  ])
1502

    
1503
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1504
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1505
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1506
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1507

    
1508
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1509
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1510
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1511
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1512
  ])
1513

    
1514
# SPICE video stream detection
1515
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1516
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1517
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1518

    
1519
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1520
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1521
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1522
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1523
  ])
1524

    
1525
# Security models
1526
HT_SM_NONE = "none"
1527
HT_SM_USER = "user"
1528
HT_SM_POOL = "pool"
1529

    
1530
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1531
  HT_SM_NONE,
1532
  HT_SM_USER,
1533
  HT_SM_POOL,
1534
  ])
1535

    
1536
# Kvm flag values
1537
HT_KVM_ENABLED = "enabled"
1538
HT_KVM_DISABLED = "disabled"
1539

    
1540
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1541

    
1542
# Migration type
1543
HT_MIGRATION_LIVE = "live"
1544
HT_MIGRATION_NONLIVE = "non-live"
1545
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1546
  HT_MIGRATION_LIVE,
1547
  HT_MIGRATION_NONLIVE,
1548
  ])
1549

    
1550
# Cluster Verify steps
1551
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1552
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1553

    
1554
# Cluster Verify error classes
1555
CV_TCLUSTER = "cluster"
1556
CV_TGROUP = "group"
1557
CV_TNODE = "node"
1558
CV_TINSTANCE = "instance"
1559

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

    
1642
CV_ALL_ECODES = compat.UniqueFrozenset([
1643
  CV_ECLUSTERCFG,
1644
  CV_ECLUSTERCERT,
1645
  CV_ECLUSTERFILECHECK,
1646
  CV_ECLUSTERDANGLINGNODES,
1647
  CV_ECLUSTERDANGLINGINST,
1648
  CV_EINSTANCEBADNODE,
1649
  CV_EINSTANCEDOWN,
1650
  CV_EINSTANCELAYOUT,
1651
  CV_EINSTANCEMISSINGDISK,
1652
  CV_EINSTANCEFAULTYDISK,
1653
  CV_EINSTANCEWRONGNODE,
1654
  CV_EINSTANCESPLITGROUPS,
1655
  CV_EINSTANCEPOLICY,
1656
  CV_ENODEDRBD,
1657
  CV_ENODEDRBDHELPER,
1658
  CV_ENODEFILECHECK,
1659
  CV_ENODEHOOKS,
1660
  CV_ENODEHV,
1661
  CV_ENODELVM,
1662
  CV_ENODEN1,
1663
  CV_ENODENET,
1664
  CV_ENODEOS,
1665
  CV_ENODEORPHANINSTANCE,
1666
  CV_ENODEORPHANLV,
1667
  CV_ENODERPC,
1668
  CV_ENODESSH,
1669
  CV_ENODEVERSION,
1670
  CV_ENODESETUP,
1671
  CV_ENODETIME,
1672
  CV_ENODEOOBPATH,
1673
  CV_ENODEUSERSCRIPTS,
1674
  CV_ENODEFILESTORAGEPATHS,
1675
  ])
1676

    
1677
CV_ALL_ECODES_STRINGS = \
1678
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1679

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

    
1705
# Instance status
1706
INSTST_RUNNING = "running"
1707
INSTST_ADMINDOWN = "ADMIN_down"
1708
INSTST_ADMINOFFLINE = "ADMIN_offline"
1709
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1710
INSTST_NODEDOWN = "ERROR_nodedown"
1711
INSTST_WRONGNODE = "ERROR_wrongnode"
1712
INSTST_ERRORUP = "ERROR_up"
1713
INSTST_ERRORDOWN = "ERROR_down"
1714
INSTST_ALL = compat.UniqueFrozenset([
1715
  INSTST_RUNNING,
1716
  INSTST_ADMINDOWN,
1717
  INSTST_ADMINOFFLINE,
1718
  INSTST_NODEOFFLINE,
1719
  INSTST_NODEDOWN,
1720
  INSTST_WRONGNODE,
1721
  INSTST_ERRORUP,
1722
  INSTST_ERRORDOWN,
1723
  ])
1724

    
1725
# Admin states
1726
ADMINST_UP = "up"
1727
ADMINST_DOWN = "down"
1728
ADMINST_OFFLINE = "offline"
1729
ADMINST_ALL = compat.UniqueFrozenset([
1730
  ADMINST_UP,
1731
  ADMINST_DOWN,
1732
  ADMINST_OFFLINE,
1733
  ])
1734

    
1735
# Node roles
1736
NR_REGULAR = "R"
1737
NR_MASTER = "M"
1738
NR_MCANDIDATE = "C"
1739
NR_DRAINED = "D"
1740
NR_OFFLINE = "O"
1741
NR_ALL = compat.UniqueFrozenset([
1742
  NR_REGULAR,
1743
  NR_MASTER,
1744
  NR_MCANDIDATE,
1745
  NR_DRAINED,
1746
  NR_OFFLINE,
1747
  ])
1748

    
1749
# SSL certificate check constants (in days)
1750
SSL_CERT_EXPIRATION_WARN = 30
1751
SSL_CERT_EXPIRATION_ERROR = 7
1752

    
1753
# Allocator framework constants
1754
IALLOCATOR_VERSION = 2
1755
IALLOCATOR_DIR_IN = "in"
1756
IALLOCATOR_DIR_OUT = "out"
1757
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1758
  IALLOCATOR_DIR_IN,
1759
  IALLOCATOR_DIR_OUT,
1760
  ])
1761
IALLOCATOR_MODE_ALLOC = "allocate"
1762
IALLOCATOR_MODE_RELOC = "relocate"
1763
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1764
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1765
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1766
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1767
  IALLOCATOR_MODE_ALLOC,
1768
  IALLOCATOR_MODE_RELOC,
1769
  IALLOCATOR_MODE_CHG_GROUP,
1770
  IALLOCATOR_MODE_NODE_EVAC,
1771
  IALLOCATOR_MODE_MULTI_ALLOC,
1772
  ])
1773
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1774
DEFAULT_IALLOCATOR_SHORTCUT = "."
1775

    
1776
IALLOCATOR_NEVAC_PRI = "primary-only"
1777
IALLOCATOR_NEVAC_SEC = "secondary-only"
1778
IALLOCATOR_NEVAC_ALL = "all"
1779
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1780
  IALLOCATOR_NEVAC_PRI,
1781
  IALLOCATOR_NEVAC_SEC,
1782
  IALLOCATOR_NEVAC_ALL,
1783
  ])
1784

    
1785
# Node evacuation
1786
NODE_EVAC_PRI = "primary-only"
1787
NODE_EVAC_SEC = "secondary-only"
1788
NODE_EVAC_ALL = "all"
1789
NODE_EVAC_MODES = compat.UniqueFrozenset([
1790
  NODE_EVAC_PRI,
1791
  NODE_EVAC_SEC,
1792
  NODE_EVAC_ALL,
1793
  ])
1794

    
1795
# Job queue
1796
JOB_QUEUE_VERSION = 1
1797
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1798
JOB_QUEUE_FILES_PERMS = 0640
1799

    
1800
JOB_ID_TEMPLATE = r"\d+"
1801
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1802

    
1803
# unchanged job return
1804
JOB_NOTCHANGED = "nochange"
1805

    
1806
# Job status
1807
JOB_STATUS_QUEUED = "queued"
1808
JOB_STATUS_WAITING = "waiting"
1809
JOB_STATUS_CANCELING = "canceling"
1810
JOB_STATUS_RUNNING = "running"
1811
JOB_STATUS_CANCELED = "canceled"
1812
JOB_STATUS_SUCCESS = "success"
1813
JOB_STATUS_ERROR = "error"
1814
JOBS_PENDING = compat.UniqueFrozenset([
1815
  JOB_STATUS_QUEUED,
1816
  JOB_STATUS_WAITING,
1817
  JOB_STATUS_CANCELING,
1818
  ])
1819
JOBS_FINALIZED = compat.UniqueFrozenset([
1820
  JOB_STATUS_CANCELED,
1821
  JOB_STATUS_SUCCESS,
1822
  JOB_STATUS_ERROR,
1823
  ])
1824
JOB_STATUS_ALL = compat.UniqueFrozenset([
1825
  JOB_STATUS_RUNNING,
1826
  ]) | JOBS_PENDING | JOBS_FINALIZED
1827

    
1828
# OpCode status
1829
# not yet finalized
1830
OP_STATUS_QUEUED = "queued"
1831
OP_STATUS_WAITING = "waiting"
1832
OP_STATUS_CANCELING = "canceling"
1833
OP_STATUS_RUNNING = "running"
1834
# finalized
1835
OP_STATUS_CANCELED = "canceled"
1836
OP_STATUS_SUCCESS = "success"
1837
OP_STATUS_ERROR = "error"
1838
OPS_FINALIZED = compat.UniqueFrozenset([
1839
  OP_STATUS_CANCELED,
1840
  OP_STATUS_SUCCESS,
1841
  OP_STATUS_ERROR,
1842
  ])
1843

    
1844
# OpCode priority
1845
OP_PRIO_LOWEST = +19
1846
OP_PRIO_HIGHEST = -20
1847

    
1848
OP_PRIO_LOW = +10
1849
OP_PRIO_NORMAL = 0
1850
OP_PRIO_HIGH = -10
1851

    
1852
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1853
  OP_PRIO_LOW,
1854
  OP_PRIO_NORMAL,
1855
  OP_PRIO_HIGH,
1856
  ])
1857

    
1858
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1859

    
1860
# Lock recalculate mode
1861
LOCKS_REPLACE = "replace"
1862
LOCKS_APPEND = "append"
1863

    
1864
# Lock timeout (sum) before we should go into blocking acquire (still
1865
# can be reset by priority change); computed as max time (10 hours)
1866
# before we should actually go into blocking acquire given that we
1867
# start from default priority level; in seconds
1868
# TODO
1869
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1870
LOCK_ATTEMPTS_MAXWAIT = 15.0
1871
LOCK_ATTEMPTS_MINWAIT = 1.0
1872

    
1873
# Execution log types
1874
ELOG_MESSAGE = "message"
1875
ELOG_REMOTE_IMPORT = "remote-import"
1876
ELOG_JQUEUE_TEST = "jqueue-test"
1877

    
1878
# /etc/hosts modification
1879
ETC_HOSTS_ADD = "add"
1880
ETC_HOSTS_REMOVE = "remove"
1881

    
1882
# Job queue test
1883
JQT_MSGPREFIX = "TESTMSG="
1884
JQT_EXPANDNAMES = "expandnames"
1885
JQT_EXEC = "exec"
1886
JQT_LOGMSG = "logmsg"
1887
JQT_STARTMSG = "startmsg"
1888
JQT_ALL = compat.UniqueFrozenset([
1889
  JQT_EXPANDNAMES,
1890
  JQT_EXEC,
1891
  JQT_LOGMSG,
1892
  JQT_STARTMSG,
1893
  ])
1894

    
1895
# Query resources
1896
QR_CLUSTER = "cluster"
1897
QR_INSTANCE = "instance"
1898
QR_NODE = "node"
1899
QR_LOCK = "lock"
1900
QR_GROUP = "group"
1901
QR_OS = "os"
1902
QR_JOB = "job"
1903
QR_EXPORT = "export"
1904
QR_NETWORK = "network"
1905
QR_EXTSTORAGE = "extstorage"
1906

    
1907
#: List of resources which can be queried using L{opcodes.OpQuery}
1908
QR_VIA_OP = compat.UniqueFrozenset([
1909
  QR_CLUSTER,
1910
  QR_INSTANCE,
1911
  QR_NODE,
1912
  QR_GROUP,
1913
  QR_OS,
1914
  QR_EXPORT,
1915
  QR_NETWORK,
1916
  QR_EXTSTORAGE,
1917
  ])
1918

    
1919
#: List of resources which can be queried using Local UniX Interface
1920
QR_VIA_LUXI = QR_VIA_OP.union([
1921
  QR_LOCK,
1922
  QR_JOB,
1923
  ])
1924

    
1925
#: List of resources which can be queried using RAPI
1926
QR_VIA_RAPI = QR_VIA_LUXI
1927

    
1928
# Query field types
1929
QFT_UNKNOWN = "unknown"
1930
QFT_TEXT = "text"
1931
QFT_BOOL = "bool"
1932
QFT_NUMBER = "number"
1933
QFT_UNIT = "unit"
1934
QFT_TIMESTAMP = "timestamp"
1935
QFT_OTHER = "other"
1936

    
1937
#: All query field types
1938
QFT_ALL = compat.UniqueFrozenset([
1939
  QFT_UNKNOWN,
1940
  QFT_TEXT,
1941
  QFT_BOOL,
1942
  QFT_NUMBER,
1943
  QFT_UNIT,
1944
  QFT_TIMESTAMP,
1945
  QFT_OTHER,
1946
  ])
1947

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

    
1963
RS_ALL = compat.UniqueFrozenset([
1964
  RS_NORMAL,
1965
  RS_UNKNOWN,
1966
  RS_NODATA,
1967
  RS_UNAVAIL,
1968
  RS_OFFLINE,
1969
  ])
1970

    
1971
#: Dictionary with special field cases and their verbose/terse formatting
1972
RSS_DESCRIPTION = {
1973
  RS_UNKNOWN: ("(unknown)", "??"),
1974
  RS_NODATA: ("(nodata)", "?"),
1975
  RS_OFFLINE: ("(offline)", "*"),
1976
  RS_UNAVAIL: ("(unavail)", "-"),
1977
  }
1978

    
1979
# max dynamic devices
1980
MAX_NICS = 8
1981
MAX_DISKS = 16
1982

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

    
2010
SS_FILE_PERMS = 0444
2011

    
2012
# cluster wide default parameters
2013
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2014

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

    
2123
HVC_GLOBALS = compat.UniqueFrozenset([
2124
  HV_MIGRATION_PORT,
2125
  HV_MIGRATION_BANDWIDTH,
2126
  HV_MIGRATION_MODE,
2127
  ])
2128

    
2129
BEC_DEFAULTS = {
2130
  BE_MINMEM: 128,
2131
  BE_MAXMEM: 128,
2132
  BE_VCPUS: 1,
2133
  BE_AUTO_BALANCE: True,
2134
  BE_ALWAYS_FAILOVER: False,
2135
  BE_SPINDLE_USE: 1,
2136
  }
2137

    
2138
NDC_DEFAULTS = {
2139
  ND_OOB_PROGRAM: "",
2140
  ND_SPINDLE_COUNT: 1,
2141
  ND_EXCLUSIVE_STORAGE: False,
2142
  }
2143

    
2144
NDC_GLOBALS = compat.UniqueFrozenset([
2145
  ND_EXCLUSIVE_STORAGE,
2146
  ])
2147

    
2148
DISK_LD_DEFAULTS = {
2149
  LD_DRBD8: {
2150
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2151
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2152
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2153
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2154
    LDP_DISK_CUSTOM: "",
2155
    LDP_NET_CUSTOM: "",
2156
    LDP_DYNAMIC_RESYNC: False,
2157

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

    
2180
# readability shortcuts
2181
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2182
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2183

    
2184
DISK_DT_DEFAULTS = {
2185
  DT_PLAIN: {
2186
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2187
    },
2188
  DT_DRBD8: {
2189
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2190
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2191
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2192
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2193
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2194
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2195
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2196
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2197
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2198
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2199
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2200
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2201
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2202
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2203
    },
2204
  DT_DISKLESS: {},
2205
  DT_FILE: {},
2206
  DT_SHARED_FILE: {},
2207
  DT_BLOCK: {},
2208
  DT_RBD: {
2209
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2210
    },
2211
  DT_EXT: {},
2212
  }
2213

    
2214
# we don't want to export the shortcuts
2215
del _LV_DEFAULTS, _DRBD_DEFAULTS
2216

    
2217
NICC_DEFAULTS = {
2218
  NIC_MODE: NIC_MODE_BRIDGED,
2219
  NIC_LINK: DEFAULT_BRIDGE,
2220
  }
2221

    
2222
# All of the following values are quite arbitrarily - there are no
2223
# "good" defaults, these must be customised per-site
2224
ISPECS_MINMAX_DEFAULTS = {
2225
  ISPECS_MIN: {
2226
    ISPEC_MEM_SIZE: 128,
2227
    ISPEC_CPU_COUNT: 1,
2228
    ISPEC_DISK_COUNT: 1,
2229
    ISPEC_DISK_SIZE: 1024,
2230
    ISPEC_NIC_COUNT: 1,
2231
    ISPEC_SPINDLE_USE: 1,
2232
    },
2233
  ISPECS_MAX: {
2234
    ISPEC_MEM_SIZE: 32768,
2235
    ISPEC_CPU_COUNT: 8,
2236
    ISPEC_DISK_COUNT: MAX_DISKS,
2237
    ISPEC_DISK_SIZE: 1024 * 1024,
2238
    ISPEC_NIC_COUNT: MAX_NICS,
2239
    ISPEC_SPINDLE_USE: 12,
2240
    },
2241
  }
2242
IPOLICY_DEFAULTS = {
2243
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2244
  ISPECS_STD: {
2245
    ISPEC_MEM_SIZE: 128,
2246
    ISPEC_CPU_COUNT: 1,
2247
    ISPEC_DISK_COUNT: 1,
2248
    ISPEC_DISK_SIZE: 1024,
2249
    ISPEC_NIC_COUNT: 1,
2250
    ISPEC_SPINDLE_USE: 1,
2251
    },
2252
  IPOLICY_DTS: list(DISK_TEMPLATES),
2253
  IPOLICY_VCPU_RATIO: 4.0,
2254
  IPOLICY_SPINDLE_RATIO: 32.0,
2255
  }
2256

    
2257
MASTER_POOL_SIZE_DEFAULT = 10
2258

    
2259
# Exclusive storage:
2260
# Error margin used to compare physical disks
2261
PART_MARGIN = .01
2262
# Space reserved when creating instance disks
2263
PART_RESERVED = .02
2264

    
2265
CONFD_PROTOCOL_VERSION = 1
2266

    
2267
CONFD_REQ_PING = 0
2268
CONFD_REQ_NODE_ROLE_BYNAME = 1
2269
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2270
CONFD_REQ_CLUSTER_MASTER = 3
2271
CONFD_REQ_NODE_PIP_LIST = 4
2272
CONFD_REQ_MC_PIP_LIST = 5
2273
CONFD_REQ_INSTANCES_IPS_LIST = 6
2274
CONFD_REQ_NODE_DRBD = 7
2275
CONFD_REQ_NODE_INSTANCES = 8
2276

    
2277
# Confd request query fields. These are used to narrow down queries.
2278
# These must be strings rather than integers, because json-encoding
2279
# converts them to strings anyway, as they're used as dict-keys.
2280
CONFD_REQQ_LINK = "0"
2281
CONFD_REQQ_IP = "1"
2282
CONFD_REQQ_IPLIST = "2"
2283
CONFD_REQQ_FIELDS = "3"
2284

    
2285
CONFD_REQFIELD_NAME = "0"
2286
CONFD_REQFIELD_IP = "1"
2287
CONFD_REQFIELD_MNODE_PIP = "2"
2288

    
2289
CONFD_REQS = compat.UniqueFrozenset([
2290
  CONFD_REQ_PING,
2291
  CONFD_REQ_NODE_ROLE_BYNAME,
2292
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2293
  CONFD_REQ_CLUSTER_MASTER,
2294
  CONFD_REQ_NODE_PIP_LIST,
2295
  CONFD_REQ_MC_PIP_LIST,
2296
  CONFD_REQ_INSTANCES_IPS_LIST,
2297
  CONFD_REQ_NODE_DRBD,
2298
  ])
2299

    
2300
CONFD_REPL_STATUS_OK = 0
2301
CONFD_REPL_STATUS_ERROR = 1
2302
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2303

    
2304
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2305
  CONFD_REPL_STATUS_OK,
2306
  CONFD_REPL_STATUS_ERROR,
2307
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2308
  ])
2309

    
2310
(CONFD_NODE_ROLE_MASTER,
2311
 CONFD_NODE_ROLE_CANDIDATE,
2312
 CONFD_NODE_ROLE_OFFLINE,
2313
 CONFD_NODE_ROLE_DRAINED,
2314
 CONFD_NODE_ROLE_REGULAR,
2315
 ) = range(5)
2316

    
2317
# A few common errors for confd
2318
CONFD_ERROR_UNKNOWN_ENTRY = 1
2319
CONFD_ERROR_INTERNAL = 2
2320
CONFD_ERROR_ARGUMENT = 3
2321

    
2322
# Each request is "salted" by the current timestamp.
2323
# This constants decides how many seconds of skew to accept.
2324
# TODO: make this a default and allow the value to be more configurable
2325
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2326

    
2327
# When we haven't reloaded the config for more than this amount of
2328
# seconds, we force a test to see if inotify is betraying us. Using a
2329
# prime number to ensure we get less chance of 'same wakeup' with
2330
# other processes.
2331
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2332

    
2333
# If we receive more than one update in this amount of microseconds,
2334
# we move to polling every RATELIMIT seconds, rather than relying on
2335
# inotify, to be able to serve more requests.
2336
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2337

    
2338
# Magic number prepended to all confd queries.
2339
# This allows us to distinguish different types of confd protocols and handle
2340
# them. For example by changing this we can move the whole payload to be
2341
# compressed, or move away from json.
2342
CONFD_MAGIC_FOURCC = "plj0"
2343

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

    
2349
# Timeout in seconds to expire pending query request in the confd client
2350
# library. We don't actually expect any answer more than 10 seconds after we
2351
# sent a request.
2352
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2353

    
2354
# Maximum UDP datagram size.
2355
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2356
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2357
#   (assuming we can't use jumbo frames)
2358
# We just set this to 60K, which should be enough
2359
MAX_UDP_DATA_SIZE = 61440
2360

    
2361
# User-id pool minimum/maximum acceptable user-ids.
2362
UIDPOOL_UID_MIN = 0
2363
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2364

    
2365
# Name or path of the pgrep command
2366
PGREP = "pgrep"
2367

    
2368
# Name of the node group that gets created at cluster init or upgrade
2369
INITIAL_NODE_GROUP_NAME = "default"
2370

    
2371
# Possible values for NodeGroup.alloc_policy
2372
ALLOC_POLICY_PREFERRED = "preferred"
2373
ALLOC_POLICY_LAST_RESORT = "last_resort"
2374
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2375
VALID_ALLOC_POLICIES = [
2376
  ALLOC_POLICY_PREFERRED,
2377
  ALLOC_POLICY_LAST_RESORT,
2378
  ALLOC_POLICY_UNALLOCABLE,
2379
  ]
2380

    
2381
# Temporary external/shared storage parameters
2382
BLOCKDEV_DRIVER_MANUAL = "manual"
2383

    
2384
# qemu-img path, required for ovfconverter
2385
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2386

    
2387
# Whether htools was enabled at compilation time
2388
HTOOLS = _autoconf.HTOOLS
2389
# The hail iallocator
2390
IALLOC_HAIL = "hail"
2391

    
2392
# Fake opcodes for functions that have hooks attached to them via
2393
# backend.RunLocalHooks
2394
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2395
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2396

    
2397
# SSH key types
2398
SSHK_RSA = "rsa"
2399
SSHK_DSA = "dsa"
2400
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2401

    
2402
# SSH authorized key types
2403
SSHAK_RSA = "ssh-rsa"
2404
SSHAK_DSS = "ssh-dss"
2405
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2406

    
2407
# SSH setup
2408
SSHS_CLUSTER_NAME = "cluster_name"
2409
SSHS_SSH_HOST_KEY = "ssh_host_key"
2410
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2411
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2412

    
2413
#: Key files for SSH daemon
2414
SSH_DAEMON_KEYFILES = {
2415
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2416
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2417
  }
2418

    
2419
# Node daemon setup
2420
NDS_CLUSTER_NAME = "cluster_name"
2421
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2422
NDS_SSCONF = "ssconf"
2423
NDS_START_NODE_DAEMON = "start_node_daemon"
2424

    
2425
# Path generating random UUID
2426
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2427

    
2428
# Regex string for verifying a UUID
2429
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2430

    
2431
# Auto-repair tag prefixes
2432
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2433
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2434
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2435
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2436
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2437

    
2438
# Auto-repair levels
2439
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2440
AUTO_REPAIR_MIGRATE = "migrate"
2441
AUTO_REPAIR_FAILOVER = "failover"
2442
AUTO_REPAIR_REINSTALL = "reinstall"
2443
AUTO_REPAIR_ALL_TYPES = [
2444
  AUTO_REPAIR_FIX_STORAGE,
2445
  AUTO_REPAIR_MIGRATE,
2446
  AUTO_REPAIR_FAILOVER,
2447
  AUTO_REPAIR_REINSTALL,
2448
]
2449

    
2450
# Auto-repair results
2451
AUTO_REPAIR_SUCCESS = "success"
2452
AUTO_REPAIR_FAILURE = "failure"
2453
AUTO_REPAIR_ENOPERM = "enoperm"
2454
AUTO_REPAIR_ALL_RESULTS = frozenset([
2455
    AUTO_REPAIR_SUCCESS,
2456
    AUTO_REPAIR_FAILURE,
2457
    AUTO_REPAIR_ENOPERM,
2458
])
2459

    
2460
# The version identifier for builtin data collectors
2461
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2462

    
2463
# The reason trail opcode parameter name
2464
OPCODE_REASON = "reason"
2465

    
2466
# The source reasons for the execution of an OpCode
2467
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2468
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2469
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2470
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2471
OPCODE_REASON_SRC_USER = "gnt:user"
2472

    
2473
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2474
  OPCODE_REASON_SRC_CLIENT,
2475
  OPCODE_REASON_SRC_NODED,
2476
  OPCODE_REASON_SRC_OPCODE,
2477
  OPCODE_REASON_SRC_RLIB2,
2478
  OPCODE_REASON_SRC_USER,
2479
  ])
2480

    
2481
# Do not re-export imported modules
2482
del re, _vcsversion, _autoconf, socket, pathutils, compat