Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ ecff332f

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

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

    
251
EXPORT_CONF_FILE = "config.ini"
252

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
326
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
327

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

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

    
340
IE_CUSTOM_SIZE = "fd"
341

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
825
ES_PARAMETERS_FILE = "parameters.list"
826

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

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

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

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

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

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

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

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

    
955

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

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

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

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

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

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

    
1062
# KVM-specific statuses
1063
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1064

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1291
OOB_POWER_STATUS_POWERED = "powered"
1292

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1389
VNC_BASE_PORT = 5900
1390
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1391

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1857
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1858

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2009
SS_FILE_PERMS = 0444
2010

    
2011
# cluster wide default parameters
2012
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2013

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

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

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

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

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

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

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

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

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

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

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

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

    
2256
MASTER_POOL_SIZE_DEFAULT = 10
2257

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

    
2264
CONFD_PROTOCOL_VERSION = 1
2265

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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