Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 13cc7b84

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

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

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

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

    
137
# Wipe
138
DD_CMD = "dd"
139
MAX_WIPE_CHUNK = 1024 # 1GB
140
MIN_WIPE_CHUNK_PERCENT = 10
141

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

    
152
# SSH constants
153
SSH = "ssh"
154
SCP = "scp"
155

    
156
NODED = "ganeti-noded"
157
CONFD = "ganeti-confd"
158
RAPI = "ganeti-rapi"
159
MASTERD = "ganeti-masterd"
160
MOND = "ganeti-mond"
161

    
162
DAEMONS = compat.UniqueFrozenset([
163
  NODED,
164
  CONFD,
165
  RAPI,
166
  MASTERD,
167
  MOND,
168
  ])
169

    
170
DAEMONS_PORTS = {
171
  # daemon-name: ("proto", "default-port")
172
  NODED: ("tcp", 1811),
173
  CONFD: ("udp", 1814),
174
  MOND: ("tcp", 1815),
175
  RAPI: ("tcp", 5080),
176
  SSH: ("tcp", 22),
177
}
178

    
179
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
180
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
181
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
182
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
183

    
184
FIRST_DRBD_PORT = 11000
185
LAST_DRBD_PORT = 14999
186

    
187
DAEMONS_LOGBASE = {
188
  NODED: "node-daemon",
189
  CONFD: "conf-daemon",
190
  RAPI: "rapi-daemon",
191
  MASTERD: "master-daemon",
192
  MOND: "monitoring-daemon",
193
  }
194

    
195
DAEMONS_LOGFILES = \
196
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
197
         for daemon in DAEMONS_LOGBASE)
198

    
199
# Some daemons might require more than one logfile.
200
# Specifically, right now only the Haskell http library "snap", used by the
201
# monitoring daemon, requires multiple log files.
202

    
203
# These are the only valid reasons for having an extra logfile
204
EXTRA_LOGREASON_ACCESS = "access"
205
EXTRA_LOGREASON_ERROR = "error"
206

    
207
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
208
  EXTRA_LOGREASON_ACCESS,
209
  EXTRA_LOGREASON_ERROR,
210
  ])
211

    
212
# These are the extra logfiles, grouped by daemon
213
DAEMONS_EXTRA_LOGBASE = {
214
  MOND: {
215
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
216
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
217
    }
218
  }
219

    
220
DAEMONS_EXTRA_LOGFILES = \
221
  dict((daemon, dict((extra,
222
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
223
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
224
         for daemon in DAEMONS_EXTRA_LOGBASE)
225

    
226
DEV_CONSOLE = "/dev/console"
227

    
228
PROC_MOUNTS = "/proc/mounts"
229

    
230
# Local UniX Interface related constants
231
LUXI_EOM = "\3"
232
LUXI_VERSION = CONFIG_VERSION
233
#: Environment variable for the luxi override socket
234
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
235
LUXI_OVERRIDE_MASTER = "master"
236
LUXI_OVERRIDE_QUERY = "query"
237

    
238
# one of "no", "yes", "only"
239
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
240
SYSLOG_NO = "no"
241
SYSLOG_YES = "yes"
242
SYSLOG_ONLY = "only"
243
SYSLOG_SOCKET = "/dev/log"
244

    
245
EXPORT_CONF_FILE = "config.ini"
246

    
247
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
248
XEN_KERNEL = _autoconf.XEN_KERNEL
249
XEN_INITRD = _autoconf.XEN_INITRD
250
XEN_CMD_XM = "xm"
251
XEN_CMD_XL = "xl"
252
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
253
XEN_CMD = _autoconf.XEN_CMD
254

    
255
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
256
  XEN_CMD_XM,
257
  XEN_CMD_XL,
258
  ])
259

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

    
271
KVM_PATH = _autoconf.KVM_PATH
272
KVM_KERNEL = _autoconf.KVM_KERNEL
273
SOCAT_PATH = _autoconf.SOCAT_PATH
274
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
275
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
276
SOCAT_ESCAPE_CODE = "0x1d"
277

    
278
#: Console as SSH command
279
CONS_SSH = "ssh"
280

    
281
#: Console as VNC server
282
CONS_VNC = "vnc"
283

    
284
#: Console as SPICE server
285
CONS_SPICE = "spice"
286

    
287
#: Display a message for console access
288
CONS_MESSAGE = "msg"
289

    
290
#: All console types
291
CONS_ALL = compat.UniqueFrozenset([
292
  CONS_SSH,
293
  CONS_VNC,
294
  CONS_SPICE,
295
  CONS_MESSAGE,
296
  ])
297

    
298
# For RSA keys more bits are better, but they also make operations more
299
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
300
# 2010 on.
301
RSA_KEY_BITS = 2048
302

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

    
311
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
312
X509_CERT_SIGN_DIGEST = "SHA1"
313

    
314
# Default validity of certificates in days
315
X509_CERT_DEFAULT_VALIDITY = 365 * 5
316

    
317
# commonName (CN) used in certificates
318
X509_CERT_CN = "ganeti.example.com"
319

    
320
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
321

    
322
# Import/export daemon mode
323
IEM_IMPORT = "import"
324
IEM_EXPORT = "export"
325

    
326
# Import/export transport compression
327
IEC_NONE = "none"
328
IEC_GZIP = "gzip"
329
IEC_ALL = compat.UniqueFrozenset([
330
  IEC_NONE,
331
  IEC_GZIP,
332
  ])
333

    
334
IE_CUSTOM_SIZE = "fd"
335

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

    
338
# Import/export I/O
339
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
340
IEIO_FILE = "file"
341
# Raw block device I/O using "dd"
342
IEIO_RAW_DISK = "raw"
343
# OS definition import/export script
344
IEIO_SCRIPT = "script"
345

    
346
VALUE_DEFAULT = "default"
347
VALUE_AUTO = "auto"
348
VALUE_GENERATE = "generate"
349
VALUE_NONE = "none"
350
VALUE_TRUE = "true"
351
VALUE_FALSE = "false"
352

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

    
356
# hooks-related constants
357
HOOKS_PHASE_PRE = "pre"
358
HOOKS_PHASE_POST = "post"
359
HOOKS_NAME_CFGUPDATE = "config-update"
360
HOOKS_NAME_WATCHER = "watcher"
361
HOOKS_VERSION = 2
362
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
363

    
364
# hooks subject type (what object type does the LU deal with)
365
HTYPE_CLUSTER = "CLUSTER"
366
HTYPE_NODE = "NODE"
367
HTYPE_GROUP = "GROUP"
368
HTYPE_INSTANCE = "INSTANCE"
369
HTYPE_NETWORK = "NETWORK"
370

    
371
HKR_SKIP = 0
372
HKR_FAIL = 1
373
HKR_SUCCESS = 2
374

    
375
# Storage types
376
ST_FILE = "file"
377
ST_LVM_PV = "lvm-pv"
378
ST_LVM_VG = "lvm-vg"
379

    
380
# Storage fields
381
# first two are valid in LU context only, not passed to backend
382
SF_NODE = "node"
383
SF_TYPE = "type"
384
# and the rest are valid in backend
385
SF_NAME = "name"
386
SF_SIZE = "size"
387
SF_FREE = "free"
388
SF_USED = "used"
389
SF_ALLOCATABLE = "allocatable"
390

    
391
# Storage operations
392
SO_FIX_CONSISTENCY = "fix-consistency"
393

    
394
# Available fields per storage type
395
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
396
  SF_NAME,
397
  SF_TYPE,
398
  SF_SIZE,
399
  SF_USED,
400
  SF_FREE,
401
  SF_ALLOCATABLE,
402
  ])
403

    
404
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
405
  ST_FILE,
406
  ST_LVM_PV,
407
  ST_LVM_VG,
408
  ])
409

    
410
MODIFIABLE_STORAGE_FIELDS = {
411
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
412
  }
413

    
414
VALID_STORAGE_OPERATIONS = {
415
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
416
  }
417

    
418
# Local disk status
419
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
420
(LDS_OKAY,
421
 LDS_UNKNOWN,
422
 LDS_FAULTY) = range(1, 4)
423

    
424
# disk template types
425
DT_DISKLESS = "diskless"
426
DT_PLAIN = "plain"
427
DT_DRBD8 = "drbd"
428
DT_FILE = "file"
429
DT_SHARED_FILE = "sharedfile"
430
DT_BLOCK = "blockdev"
431
DT_RBD = "rbd"
432
DT_EXT = "ext"
433

    
434
# the set of network-mirrored disk templates
435
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
436

    
437
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
438
DTS_EXT_MIRROR = compat.UniqueFrozenset([
439
  DT_SHARED_FILE,
440
  DT_BLOCK,
441
  DT_RBD,
442
  DT_EXT,
443
  ])
444

    
445
# the set of non-lvm-based disk templates
446
DTS_NOT_LVM = compat.UniqueFrozenset([
447
  DT_DISKLESS,
448
  DT_FILE,
449
  DT_SHARED_FILE,
450
  DT_BLOCK,
451
  DT_RBD,
452
  DT_EXT,
453
  ])
454

    
455
# the set of disk templates which can be grown
456
DTS_GROWABLE = compat.UniqueFrozenset([
457
  DT_PLAIN,
458
  DT_DRBD8,
459
  DT_FILE,
460
  DT_SHARED_FILE,
461
  DT_RBD,
462
  DT_EXT,
463
  ])
464

    
465
# the set of disk templates that allow adoption
466
DTS_MAY_ADOPT = compat.UniqueFrozenset([
467
  DT_PLAIN,
468
  DT_BLOCK,
469
  ])
470

    
471
# the set of disk templates that *must* use adoption
472
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
473

    
474
# the set of disk templates that allow migrations
475
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
476

    
477
# the set of file based disk templates
478
DTS_FILEBASED = compat.UniqueFrozenset([
479
  DT_FILE,
480
  DT_SHARED_FILE,
481
  ])
482

    
483
# the set of disk templates that are supported by exclusive_storage
484
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
485

    
486
# templates for which we don't perform checks on free space
487
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
488
  DT_FILE,
489
  DT_SHARED_FILE,
490
  DT_RBD,
491
  DT_EXT,
492
  ])
493

    
494
# logical disk types
495
LD_LV = "lvm"
496
LD_DRBD8 = "drbd8"
497
LD_FILE = "file"
498
LD_BLOCKDEV = "blockdev"
499
LD_RBD = "rbd"
500
LD_EXT = "ext"
501
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
502
  LD_LV,
503
  LD_DRBD8,
504
  LD_FILE,
505
  LD_BLOCKDEV,
506
  LD_RBD,
507
  LD_EXT,
508
  ])
509

    
510
LDS_BLOCK = compat.UniqueFrozenset([
511
  LD_LV,
512
  LD_DRBD8,
513
  LD_BLOCKDEV,
514
  LD_RBD,
515
  LD_EXT,
516
  ])
517

    
518
# drbd constants
519
DRBD_HMAC_ALG = "md5"
520
DRBD_NET_PROTOCOL = "C"
521
DRBD_STATUS_FILE = "/proc/drbd"
522

    
523
#: Size of DRBD meta block device
524
DRBD_META_SIZE = 128
525

    
526
# drbd barrier types
527
DRBD_B_NONE = "n"
528
DRBD_B_DISK_BARRIERS = "b"
529
DRBD_B_DISK_DRAIN = "d"
530
DRBD_B_DISK_FLUSH = "f"
531

    
532
# Valid barrier combinations: "n" or any non-null subset of "bfd"
533
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
534
  frozenset([DRBD_B_NONE]),
535
  frozenset([DRBD_B_DISK_BARRIERS]),
536
  frozenset([DRBD_B_DISK_DRAIN]),
537
  frozenset([DRBD_B_DISK_FLUSH]),
538
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
539
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
540
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
541
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
542
  ])
543

    
544
# rbd tool command
545
RBD_CMD = "rbd"
546

    
547
# file backend driver
548
FD_LOOP = "loop"
549
FD_BLKTAP = "blktap"
550

    
551
# the set of drbd-like disk types
552
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
553

    
554
# disk access mode
555
DISK_RDONLY = "ro"
556
DISK_RDWR = "rw"
557
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
558

    
559
# disk replacement mode
560
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
561
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
562
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
563
REPLACE_DISK_AUTO = "replace_auto"
564
REPLACE_MODES = compat.UniqueFrozenset([
565
  REPLACE_DISK_PRI,
566
  REPLACE_DISK_SEC,
567
  REPLACE_DISK_CHG,
568
  REPLACE_DISK_AUTO,
569
  ])
570

    
571
# Instance export mode
572
EXPORT_MODE_LOCAL = "local"
573
EXPORT_MODE_REMOTE = "remote"
574
EXPORT_MODES = compat.UniqueFrozenset([
575
  EXPORT_MODE_LOCAL,
576
  EXPORT_MODE_REMOTE,
577
  ])
578

    
579
# instance creation modes
580
INSTANCE_CREATE = "create"
581
INSTANCE_IMPORT = "import"
582
INSTANCE_REMOTE_IMPORT = "remote-import"
583
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
584
  INSTANCE_CREATE,
585
  INSTANCE_IMPORT,
586
  INSTANCE_REMOTE_IMPORT,
587
  ])
588

    
589
# Remote import/export handshake message and version
590
RIE_VERSION = 0
591
RIE_HANDSHAKE = "Hi, I'm Ganeti"
592

    
593
# Remote import/export certificate validity in seconds
594
RIE_CERT_VALIDITY = 24 * 60 * 60
595

    
596
# Overall timeout for establishing connection
597
RIE_CONNECT_TIMEOUT = 180
598

    
599
# Export only: how long to wait per connection attempt (seconds)
600
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
601

    
602
# Export only: number of attempts to connect
603
RIE_CONNECT_RETRIES = 10
604

    
605
#: Give child process up to 5 seconds to exit after sending a signal
606
CHILD_LINGER_TIMEOUT = 5.0
607

    
608
DISK_TEMPLATES = compat.UniqueFrozenset([
609
  DT_DISKLESS,
610
  DT_PLAIN,
611
  DT_DRBD8,
612
  DT_FILE,
613
  DT_SHARED_FILE,
614
  DT_BLOCK,
615
  DT_RBD,
616
  DT_EXT
617
  ])
618

    
619
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
620

    
621
# import/export config options
622
INISECT_EXP = "export"
623
INISECT_INS = "instance"
624
INISECT_HYP = "hypervisor"
625
INISECT_BEP = "backend"
626
INISECT_OSP = "os"
627

    
628
# dynamic device modification
629
DDM_ADD = "add"
630
DDM_MODIFY = "modify"
631
DDM_REMOVE = "remove"
632
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
633
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
634
  DDM_MODIFY,
635
  ]))
636
# TODO: DDM_SWAP, DDM_MOVE?
637

    
638
# common exit codes
639
EXIT_SUCCESS = 0
640
EXIT_FAILURE = 1
641
EXIT_NOTCLUSTER = 5
642
EXIT_NOTMASTER = 11
643
EXIT_NODESETUP_ERROR = 12
644
EXIT_CONFIRMATION = 13 # need user confirmation
645

    
646
#: Exit code for query operations with unknown fields
647
EXIT_UNKNOWN_FIELD = 14
648

    
649
# tags
650
TAG_CLUSTER = "cluster"
651
TAG_NODEGROUP = "nodegroup"
652
TAG_NODE = "node"
653
TAG_INSTANCE = "instance"
654
TAG_NETWORK = "network"
655
VALID_TAG_TYPES = compat.UniqueFrozenset([
656
  TAG_CLUSTER,
657
  TAG_NODEGROUP,
658
  TAG_NODE,
659
  TAG_INSTANCE,
660
  TAG_NETWORK,
661
  ])
662
MAX_TAG_LEN = 128
663
MAX_TAGS_PER_OBJ = 4096
664

    
665
# others
666
DEFAULT_BRIDGE = "xen-br0"
667
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
668
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
669
IP4_ADDRESS_ANY = "0.0.0.0"
670
IP6_ADDRESS_LOCALHOST = "::1"
671
IP6_ADDRESS_ANY = "::"
672
IP4_VERSION = 4
673
IP6_VERSION = 6
674
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
675
# for export to htools
676
IP4_FAMILY = socket.AF_INET
677
IP6_FAMILY = socket.AF_INET6
678

    
679
TCP_PING_TIMEOUT = 10
680
DEFAULT_VG = "xenvg"
681
DEFAULT_DRBD_HELPER = "/bin/true"
682
MIN_VG_SIZE = 20480
683
DEFAULT_MAC_PREFIX = "aa:00:00"
684
# default maximum instance wait time, in seconds.
685
DEFAULT_SHUTDOWN_TIMEOUT = 120
686
NODE_MAX_CLOCK_SKEW = 150
687
# Time for an intra-cluster disk transfer to wait for a connection
688
DISK_TRANSFER_CONNECT_TIMEOUT = 60
689
# Disk index separator
690
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
691
IP_COMMAND_PATH = _autoconf.IP_PATH
692

    
693
#: Key for job IDs in opcode result
694
JOB_IDS_KEY = "jobs"
695

    
696
# runparts results
697
(RUNPARTS_SKIP,
698
 RUNPARTS_RUN,
699
 RUNPARTS_ERR) = range(3)
700

    
701
RUNPARTS_STATUS = compat.UniqueFrozenset([
702
  RUNPARTS_SKIP,
703
  RUNPARTS_RUN,
704
  RUNPARTS_ERR,
705
  ])
706

    
707
# RPC constants
708
(RPC_ENCODING_NONE,
709
 RPC_ENCODING_ZLIB_BASE64) = range(2)
710

    
711
# Various time constants for the timeout table
712
RPC_TMO_URGENT = 60 # one minute
713
RPC_TMO_FAST = 5 * 60 # five minutes
714
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
715
RPC_TMO_SLOW = 3600 # one hour
716
RPC_TMO_4HRS = 4 * 3600
717
RPC_TMO_1DAY = 86400
718

    
719
# Timeout for connecting to nodes (seconds)
720
RPC_CONNECT_TIMEOUT = 5
721

    
722
# os related constants
723
OS_SCRIPT_CREATE = "create"
724
OS_SCRIPT_IMPORT = "import"
725
OS_SCRIPT_EXPORT = "export"
726
OS_SCRIPT_RENAME = "rename"
727
OS_SCRIPT_VERIFY = "verify"
728
OS_SCRIPTS = compat.UniqueFrozenset([
729
  OS_SCRIPT_CREATE,
730
  OS_SCRIPT_IMPORT,
731
  OS_SCRIPT_EXPORT,
732
  OS_SCRIPT_RENAME,
733
  OS_SCRIPT_VERIFY,
734
  ])
735

    
736
OS_API_FILE = "ganeti_api_version"
737
OS_VARIANTS_FILE = "variants.list"
738
OS_PARAMETERS_FILE = "parameters.list"
739

    
740
OS_VALIDATE_PARAMETERS = "parameters"
741
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
742

    
743
# External Storage (ES) related constants
744
ES_ACTION_CREATE = "create"
745
ES_ACTION_REMOVE = "remove"
746
ES_ACTION_GROW = "grow"
747
ES_ACTION_ATTACH = "attach"
748
ES_ACTION_DETACH = "detach"
749
ES_ACTION_SETINFO = "setinfo"
750
ES_ACTION_VERIFY = "verify"
751

    
752
ES_SCRIPT_CREATE = ES_ACTION_CREATE
753
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
754
ES_SCRIPT_GROW = ES_ACTION_GROW
755
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
756
ES_SCRIPT_DETACH = ES_ACTION_DETACH
757
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
758
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
759
ES_SCRIPTS = frozenset([
760
  ES_SCRIPT_CREATE,
761
  ES_SCRIPT_REMOVE,
762
  ES_SCRIPT_GROW,
763
  ES_SCRIPT_ATTACH,
764
  ES_SCRIPT_DETACH,
765
  ES_SCRIPT_SETINFO,
766
  ES_SCRIPT_VERIFY
767
  ])
768

    
769
ES_PARAMETERS_FILE = "parameters.list"
770

    
771
# reboot types
772
INSTANCE_REBOOT_SOFT = "soft"
773
INSTANCE_REBOOT_HARD = "hard"
774
INSTANCE_REBOOT_FULL = "full"
775

    
776
REBOOT_TYPES = compat.UniqueFrozenset([
777
  INSTANCE_REBOOT_SOFT,
778
  INSTANCE_REBOOT_HARD,
779
  INSTANCE_REBOOT_FULL,
780
  ])
781

    
782
# instance reboot behaviors
783
INSTANCE_REBOOT_ALLOWED = "reboot"
784
INSTANCE_REBOOT_EXIT = "exit"
785

    
786
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
787
  INSTANCE_REBOOT_ALLOWED,
788
  INSTANCE_REBOOT_EXIT,
789
  ])
790

    
791
VTYPE_STRING = "string"
792
VTYPE_MAYBE_STRING = "maybe-string"
793
VTYPE_BOOL = "bool"
794
VTYPE_SIZE = "size" # size, in MiBs
795
VTYPE_INT = "int"
796
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
797
  VTYPE_STRING,
798
  VTYPE_MAYBE_STRING,
799
  VTYPE_BOOL,
800
  VTYPE_SIZE,
801
  VTYPE_INT,
802
  ])
803

    
804
# Constant representing that the user does not specify any IP version
805
IFACE_NO_IP_VERSION_SPECIFIED = 0
806

    
807
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
808
  75,
809
  110,
810
  300,
811
  600,
812
  1200,
813
  1800,
814
  2400,
815
  4800,
816
  9600,
817
  14400,
818
  19200,
819
  28800,
820
  38400,
821
  57600,
822
  115200,
823
  230400,
824
  345600,
825
  460800,
826
  ])
827

    
828
# HV parameter names (global namespace)
829
HV_BOOT_ORDER = "boot_order"
830
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
831
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
832
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
833
HV_NIC_TYPE = "nic_type"
834
HV_DISK_TYPE = "disk_type"
835
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
836
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
837
HV_VNC_PASSWORD_FILE = "vnc_password_file"
838
HV_VNC_TLS = "vnc_tls"
839
HV_VNC_X509 = "vnc_x509_path"
840
HV_VNC_X509_VERIFY = "vnc_x509_verify"
841
HV_KVM_SPICE_BIND = "spice_bind"
842
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
843
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
844
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
845
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
846
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
847
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
848
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
849
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
850
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
851
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
852
HV_ACPI = "acpi"
853
HV_PAE = "pae"
854
HV_USE_BOOTLOADER = "use_bootloader"
855
HV_BOOTLOADER_ARGS = "bootloader_args"
856
HV_BOOTLOADER_PATH = "bootloader_path"
857
HV_KERNEL_ARGS = "kernel_args"
858
HV_KERNEL_PATH = "kernel_path"
859
HV_INITRD_PATH = "initrd_path"
860
HV_ROOT_PATH = "root_path"
861
HV_SERIAL_CONSOLE = "serial_console"
862
HV_SERIAL_SPEED = "serial_speed"
863
HV_USB_MOUSE = "usb_mouse"
864
HV_KEYMAP = "keymap"
865
HV_DEVICE_MODEL = "device_model"
866
HV_INIT_SCRIPT = "init_script"
867
HV_MIGRATION_PORT = "migration_port"
868
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
869
HV_MIGRATION_DOWNTIME = "migration_downtime"
870
HV_MIGRATION_MODE = "migration_mode"
871
HV_USE_LOCALTIME = "use_localtime"
872
HV_DISK_CACHE = "disk_cache"
873
HV_SECURITY_MODEL = "security_model"
874
HV_SECURITY_DOMAIN = "security_domain"
875
HV_KVM_FLAG = "kvm_flag"
876
HV_VHOST_NET = "vhost_net"
877
HV_KVM_USE_CHROOT = "use_chroot"
878
HV_CPU_MASK = "cpu_mask"
879
HV_MEM_PATH = "mem_path"
880
HV_PASSTHROUGH = "pci_pass"
881
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
882
HV_REBOOT_BEHAVIOR = "reboot_behavior"
883
HV_CPU_TYPE = "cpu_type"
884
HV_CPU_CAP = "cpu_cap"
885
HV_CPU_WEIGHT = "cpu_weight"
886
HV_CPU_CORES = "cpu_cores"
887
HV_CPU_THREADS = "cpu_threads"
888
HV_CPU_SOCKETS = "cpu_sockets"
889
HV_SOUNDHW = "soundhw"
890
HV_USB_DEVICES = "usb_devices"
891
HV_VGA = "vga"
892
HV_KVM_EXTRA = "kvm_extra"
893
HV_KVM_MACHINE_VERSION = "machine_version"
894
HV_KVM_PATH = "kvm_path"
895

    
896

    
897
HVS_PARAMETER_TYPES = {
898
  HV_KVM_PATH: VTYPE_STRING,
899
  HV_BOOT_ORDER: VTYPE_STRING,
900
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
901
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
902
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
903
  HV_NIC_TYPE: VTYPE_STRING,
904
  HV_DISK_TYPE: VTYPE_STRING,
905
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
906
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
907
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
908
  HV_VNC_TLS: VTYPE_BOOL,
909
  HV_VNC_X509: VTYPE_STRING,
910
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
911
  HV_KVM_SPICE_BIND: VTYPE_STRING,
912
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
913
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
914
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
915
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
916
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
917
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
918
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
919
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
920
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
921
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
922
  HV_ACPI: VTYPE_BOOL,
923
  HV_PAE: VTYPE_BOOL,
924
  HV_USE_BOOTLOADER: VTYPE_BOOL,
925
  HV_BOOTLOADER_PATH: VTYPE_STRING,
926
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
927
  HV_KERNEL_PATH: VTYPE_STRING,
928
  HV_KERNEL_ARGS: VTYPE_STRING,
929
  HV_INITRD_PATH: VTYPE_STRING,
930
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
931
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
932
  HV_SERIAL_SPEED: VTYPE_INT,
933
  HV_USB_MOUSE: VTYPE_STRING,
934
  HV_KEYMAP: VTYPE_STRING,
935
  HV_DEVICE_MODEL: VTYPE_STRING,
936
  HV_INIT_SCRIPT: VTYPE_STRING,
937
  HV_MIGRATION_PORT: VTYPE_INT,
938
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
939
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
940
  HV_MIGRATION_MODE: VTYPE_STRING,
941
  HV_USE_LOCALTIME: VTYPE_BOOL,
942
  HV_DISK_CACHE: VTYPE_STRING,
943
  HV_SECURITY_MODEL: VTYPE_STRING,
944
  HV_SECURITY_DOMAIN: VTYPE_STRING,
945
  HV_KVM_FLAG: VTYPE_STRING,
946
  HV_VHOST_NET: VTYPE_BOOL,
947
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
948
  HV_CPU_MASK: VTYPE_STRING,
949
  HV_MEM_PATH: VTYPE_STRING,
950
  HV_PASSTHROUGH: VTYPE_STRING,
951
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
952
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
953
  HV_CPU_TYPE: VTYPE_STRING,
954
  HV_CPU_CAP: VTYPE_INT,
955
  HV_CPU_WEIGHT: VTYPE_INT,
956
  HV_CPU_CORES: VTYPE_INT,
957
  HV_CPU_THREADS: VTYPE_INT,
958
  HV_CPU_SOCKETS: VTYPE_INT,
959
  HV_SOUNDHW: VTYPE_STRING,
960
  HV_USB_DEVICES: VTYPE_STRING,
961
  HV_VGA: VTYPE_STRING,
962
  HV_KVM_EXTRA: VTYPE_STRING,
963
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
964
  }
965

    
966
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
967

    
968
HVS_PARAMETER_TITLES = {
969
  HV_ACPI: "ACPI",
970
  HV_BOOT_ORDER: "Boot_order",
971
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
972
  HV_DISK_TYPE: "Disk_type",
973
  HV_INITRD_PATH: "Initrd_path",
974
  HV_KERNEL_PATH: "Kernel_path",
975
  HV_NIC_TYPE: "NIC_type",
976
  HV_PAE: "PAE",
977
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
978
  HV_PASSTHROUGH: "pci_pass",
979
  HV_CPU_TYPE: "cpu_type",
980
  }
981

    
982
# Migration statuses
983
HV_MIGRATION_COMPLETED = "completed"
984
HV_MIGRATION_ACTIVE = "active"
985
HV_MIGRATION_FAILED = "failed"
986
HV_MIGRATION_CANCELLED = "cancelled"
987

    
988
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
989
  HV_MIGRATION_COMPLETED,
990
  HV_MIGRATION_ACTIVE,
991
  HV_MIGRATION_FAILED,
992
  HV_MIGRATION_CANCELLED,
993
  ])
994

    
995
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
996
  HV_MIGRATION_FAILED,
997
  HV_MIGRATION_CANCELLED,
998
  ])
999

    
1000
# KVM-specific statuses
1001
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1002

    
1003
# Node info keys
1004
HV_NODEINFO_KEY_VERSION = "hv_version"
1005

    
1006
# Hypervisor state
1007
HVST_MEMORY_TOTAL = "mem_total"
1008
HVST_MEMORY_NODE = "mem_node"
1009
HVST_MEMORY_HV = "mem_hv"
1010
HVST_CPU_TOTAL = "cpu_total"
1011
HVST_CPU_NODE = "cpu_node"
1012

    
1013
HVST_DEFAULTS = {
1014
  HVST_MEMORY_TOTAL: 0,
1015
  HVST_MEMORY_NODE: 0,
1016
  HVST_MEMORY_HV: 0,
1017
  HVST_CPU_TOTAL: 1,
1018
  HVST_CPU_NODE: 1,
1019
  }
1020

    
1021
HVSTS_PARAMETER_TYPES = {
1022
  HVST_MEMORY_TOTAL: VTYPE_INT,
1023
  HVST_MEMORY_NODE: VTYPE_INT,
1024
  HVST_MEMORY_HV: VTYPE_INT,
1025
  HVST_CPU_TOTAL: VTYPE_INT,
1026
  HVST_CPU_NODE: VTYPE_INT,
1027
  }
1028

    
1029
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1030

    
1031
# Disk state
1032
DS_DISK_TOTAL = "disk_total"
1033
DS_DISK_RESERVED = "disk_reserved"
1034
DS_DISK_OVERHEAD = "disk_overhead"
1035

    
1036
DS_DEFAULTS = {
1037
  DS_DISK_TOTAL: 0,
1038
  DS_DISK_RESERVED: 0,
1039
  DS_DISK_OVERHEAD: 0,
1040
  }
1041

    
1042
DSS_PARAMETER_TYPES = {
1043
  DS_DISK_TOTAL: VTYPE_INT,
1044
  DS_DISK_RESERVED: VTYPE_INT,
1045
  DS_DISK_OVERHEAD: VTYPE_INT,
1046
  }
1047

    
1048
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1049
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1050

    
1051
# Backend parameter names
1052
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1053
BE_MAXMEM = "maxmem"
1054
BE_MINMEM = "minmem"
1055
BE_VCPUS = "vcpus"
1056
BE_AUTO_BALANCE = "auto_balance"
1057
BE_ALWAYS_FAILOVER = "always_failover"
1058
BE_SPINDLE_USE = "spindle_use"
1059

    
1060
BES_PARAMETER_TYPES = {
1061
  BE_MAXMEM: VTYPE_SIZE,
1062
  BE_MINMEM: VTYPE_SIZE,
1063
  BE_VCPUS: VTYPE_INT,
1064
  BE_AUTO_BALANCE: VTYPE_BOOL,
1065
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1066
  BE_SPINDLE_USE: VTYPE_INT,
1067
  }
1068

    
1069
BES_PARAMETER_TITLES = {
1070
  BE_AUTO_BALANCE: "Auto_balance",
1071
  BE_MAXMEM: "ConfigMaxMem",
1072
  BE_MINMEM: "ConfigMinMem",
1073
  BE_VCPUS: "ConfigVCPUs",
1074
  }
1075

    
1076
BES_PARAMETER_COMPAT = {
1077
  BE_MEMORY: VTYPE_SIZE,
1078
  }
1079
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1080

    
1081
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1082

    
1083
# instance specs
1084
ISPEC_MEM_SIZE = "memory-size"
1085
ISPEC_CPU_COUNT = "cpu-count"
1086
ISPEC_DISK_COUNT = "disk-count"
1087
ISPEC_DISK_SIZE = "disk-size"
1088
ISPEC_NIC_COUNT = "nic-count"
1089
ISPEC_SPINDLE_USE = "spindle-use"
1090

    
1091
ISPECS_PARAMETER_TYPES = {
1092
  ISPEC_MEM_SIZE: VTYPE_INT,
1093
  ISPEC_CPU_COUNT: VTYPE_INT,
1094
  ISPEC_DISK_COUNT: VTYPE_INT,
1095
  ISPEC_DISK_SIZE: VTYPE_INT,
1096
  ISPEC_NIC_COUNT: VTYPE_INT,
1097
  ISPEC_SPINDLE_USE: VTYPE_INT,
1098
  }
1099

    
1100
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1101

    
1102
ISPECS_MIN = "min"
1103
ISPECS_MAX = "max"
1104
ISPECS_STD = "std"
1105
IPOLICY_DTS = "disk-templates"
1106
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1107
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1108

    
1109
IPOLICY_ISPECS = compat.UniqueFrozenset([
1110
  ISPECS_MIN,
1111
  ISPECS_MAX,
1112
  ISPECS_STD,
1113
  ])
1114

    
1115
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1116
  IPOLICY_VCPU_RATIO,
1117
  IPOLICY_SPINDLE_RATIO,
1118
  ])
1119

    
1120
IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
1121
                    IPOLICY_PARAMETERS |
1122
                    frozenset([IPOLICY_DTS]))
1123

    
1124
# Node parameter names
1125
ND_OOB_PROGRAM = "oob_program"
1126
ND_SPINDLE_COUNT = "spindle_count"
1127
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1128

    
1129
NDS_PARAMETER_TYPES = {
1130
  ND_OOB_PROGRAM: VTYPE_STRING,
1131
  ND_SPINDLE_COUNT: VTYPE_INT,
1132
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1133
  }
1134

    
1135
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1136

    
1137
NDS_PARAMETER_TITLES = {
1138
  ND_OOB_PROGRAM: "OutOfBandProgram",
1139
  ND_SPINDLE_COUNT: "SpindleCount",
1140
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1141
  }
1142

    
1143
# Logical Disks parameters
1144
LDP_RESYNC_RATE = "resync-rate"
1145
LDP_STRIPES = "stripes"
1146
LDP_BARRIERS = "disabled-barriers"
1147
LDP_NO_META_FLUSH = "disable-meta-flush"
1148
LDP_DEFAULT_METAVG = "default-metavg"
1149
LDP_DISK_CUSTOM = "disk-custom"
1150
LDP_NET_CUSTOM = "net-custom"
1151
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1152
LDP_PLAN_AHEAD = "c-plan-ahead"
1153
LDP_FILL_TARGET = "c-fill-target"
1154
LDP_DELAY_TARGET = "c-delay-target"
1155
LDP_MAX_RATE = "c-max-rate"
1156
LDP_MIN_RATE = "c-min-rate"
1157
LDP_POOL = "pool"
1158
DISK_LD_TYPES = {
1159
  LDP_RESYNC_RATE: VTYPE_INT,
1160
  LDP_STRIPES: VTYPE_INT,
1161
  LDP_BARRIERS: VTYPE_STRING,
1162
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1163
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1164
  LDP_DISK_CUSTOM: VTYPE_STRING,
1165
  LDP_NET_CUSTOM: VTYPE_STRING,
1166
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1167
  LDP_PLAN_AHEAD: VTYPE_INT,
1168
  LDP_FILL_TARGET: VTYPE_INT,
1169
  LDP_DELAY_TARGET: VTYPE_INT,
1170
  LDP_MAX_RATE: VTYPE_INT,
1171
  LDP_MIN_RATE: VTYPE_INT,
1172
  LDP_POOL: VTYPE_STRING,
1173
  }
1174
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1175

    
1176
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1177
# gnt-group)
1178
DRBD_RESYNC_RATE = "resync-rate"
1179
DRBD_DATA_STRIPES = "data-stripes"
1180
DRBD_META_STRIPES = "meta-stripes"
1181
DRBD_DISK_BARRIERS = "disk-barriers"
1182
DRBD_META_BARRIERS = "meta-barriers"
1183
DRBD_DEFAULT_METAVG = "metavg"
1184
DRBD_DISK_CUSTOM = "disk-custom"
1185
DRBD_NET_CUSTOM = "net-custom"
1186
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1187
DRBD_PLAN_AHEAD = "c-plan-ahead"
1188
DRBD_FILL_TARGET = "c-fill-target"
1189
DRBD_DELAY_TARGET = "c-delay-target"
1190
DRBD_MAX_RATE = "c-max-rate"
1191
DRBD_MIN_RATE = "c-min-rate"
1192
LV_STRIPES = "stripes"
1193
RBD_POOL = "pool"
1194
DISK_DT_TYPES = {
1195
  DRBD_RESYNC_RATE: VTYPE_INT,
1196
  DRBD_DATA_STRIPES: VTYPE_INT,
1197
  DRBD_META_STRIPES: VTYPE_INT,
1198
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1199
  DRBD_META_BARRIERS: VTYPE_BOOL,
1200
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1201
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1202
  DRBD_NET_CUSTOM: VTYPE_STRING,
1203
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1204
  DRBD_PLAN_AHEAD: VTYPE_INT,
1205
  DRBD_FILL_TARGET: VTYPE_INT,
1206
  DRBD_DELAY_TARGET: VTYPE_INT,
1207
  DRBD_MAX_RATE: VTYPE_INT,
1208
  DRBD_MIN_RATE: VTYPE_INT,
1209
  LV_STRIPES: VTYPE_INT,
1210
  RBD_POOL: VTYPE_STRING,
1211
  }
1212

    
1213
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1214

    
1215
# OOB supported commands
1216
OOB_POWER_ON = "power-on"
1217
OOB_POWER_OFF = "power-off"
1218
OOB_POWER_CYCLE = "power-cycle"
1219
OOB_POWER_STATUS = "power-status"
1220
OOB_HEALTH = "health"
1221

    
1222
OOB_COMMANDS = compat.UniqueFrozenset([
1223
  OOB_POWER_ON,
1224
  OOB_POWER_OFF,
1225
  OOB_POWER_CYCLE,
1226
  OOB_POWER_STATUS,
1227
  OOB_HEALTH,
1228
  ])
1229

    
1230
OOB_POWER_STATUS_POWERED = "powered"
1231

    
1232
OOB_TIMEOUT = 60 # 60 seconds
1233
OOB_POWER_DELAY = 2.0 # 2 seconds
1234

    
1235
OOB_STATUS_OK = "OK"
1236
OOB_STATUS_WARNING = "WARNING"
1237
OOB_STATUS_CRITICAL = "CRITICAL"
1238
OOB_STATUS_UNKNOWN = "UNKNOWN"
1239

    
1240
OOB_STATUSES = compat.UniqueFrozenset([
1241
  OOB_STATUS_OK,
1242
  OOB_STATUS_WARNING,
1243
  OOB_STATUS_CRITICAL,
1244
  OOB_STATUS_UNKNOWN,
1245
  ])
1246

    
1247
# Instance Parameters Profile
1248
PP_DEFAULT = "default"
1249

    
1250
# NIC_* constants are used inside the ganeti config
1251
NIC_MODE = "mode"
1252
NIC_LINK = "link"
1253

    
1254
NIC_MODE_BRIDGED = "bridged"
1255
NIC_MODE_ROUTED = "routed"
1256
NIC_MODE_OVS = "openvswitch"
1257
NIC_IP_POOL = "pool"
1258

    
1259
NIC_VALID_MODES = compat.UniqueFrozenset([
1260
  NIC_MODE_BRIDGED,
1261
  NIC_MODE_ROUTED,
1262
  NIC_MODE_OVS,
1263
  ])
1264

    
1265
RESERVE_ACTION = "reserve"
1266
RELEASE_ACTION = "release"
1267

    
1268
NICS_PARAMETER_TYPES = {
1269
  NIC_MODE: VTYPE_STRING,
1270
  NIC_LINK: VTYPE_STRING,
1271
  }
1272

    
1273
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1274

    
1275
# IDISK_* constants are used in opcodes, to create/change disks
1276
IDISK_SIZE = "size"
1277
IDISK_MODE = "mode"
1278
IDISK_ADOPT = "adopt"
1279
IDISK_VG = "vg"
1280
IDISK_METAVG = "metavg"
1281
IDISK_PROVIDER = "provider"
1282
IDISK_PARAMS_TYPES = {
1283
  IDISK_SIZE: VTYPE_SIZE,
1284
  IDISK_MODE: VTYPE_STRING,
1285
  IDISK_ADOPT: VTYPE_STRING,
1286
  IDISK_VG: VTYPE_STRING,
1287
  IDISK_METAVG: VTYPE_STRING,
1288
  IDISK_PROVIDER: VTYPE_STRING,
1289
  }
1290
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1291

    
1292
# INIC_* constants are used in opcodes, to create/change nics
1293
INIC_MAC = "mac"
1294
INIC_IP = "ip"
1295
INIC_MODE = "mode"
1296
INIC_LINK = "link"
1297
INIC_NETWORK = "network"
1298
INIC_PARAMS_TYPES = {
1299
  INIC_IP: VTYPE_MAYBE_STRING,
1300
  INIC_LINK: VTYPE_STRING,
1301
  INIC_MAC: VTYPE_STRING,
1302
  INIC_MODE: VTYPE_STRING,
1303
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1304
  }
1305
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1306

    
1307
# Hypervisor constants
1308
HT_XEN_PVM = "xen-pvm"
1309
HT_FAKE = "fake"
1310
HT_XEN_HVM = "xen-hvm"
1311
HT_KVM = "kvm"
1312
HT_CHROOT = "chroot"
1313
HT_LXC = "lxc"
1314
HYPER_TYPES = compat.UniqueFrozenset([
1315
  HT_XEN_PVM,
1316
  HT_FAKE,
1317
  HT_XEN_HVM,
1318
  HT_KVM,
1319
  HT_CHROOT,
1320
  HT_LXC,
1321
  ])
1322
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1323

    
1324
VNC_BASE_PORT = 5900
1325
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1326

    
1327
# NIC types
1328
HT_NIC_RTL8139 = "rtl8139"
1329
HT_NIC_NE2K_PCI = "ne2k_pci"
1330
HT_NIC_NE2K_ISA = "ne2k_isa"
1331
HT_NIC_I82551 = "i82551"
1332
HT_NIC_I85557B = "i82557b"
1333
HT_NIC_I8259ER = "i82559er"
1334
HT_NIC_PCNET = "pcnet"
1335
HT_NIC_E1000 = "e1000"
1336
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1337

    
1338
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1339
  HT_NIC_RTL8139,
1340
  HT_NIC_NE2K_PCI,
1341
  HT_NIC_E1000,
1342
  HT_NIC_NE2K_ISA,
1343
  HT_NIC_PARAVIRTUAL,
1344
  ])
1345
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1346
  HT_NIC_RTL8139,
1347
  HT_NIC_NE2K_PCI,
1348
  HT_NIC_NE2K_ISA,
1349
  HT_NIC_I82551,
1350
  HT_NIC_I85557B,
1351
  HT_NIC_I8259ER,
1352
  HT_NIC_PCNET,
1353
  HT_NIC_E1000,
1354
  HT_NIC_PARAVIRTUAL,
1355
  ])
1356

    
1357
# Disk types
1358
HT_DISK_IOEMU = "ioemu"
1359
HT_DISK_IDE = "ide"
1360
HT_DISK_SCSI = "scsi"
1361
HT_DISK_SD = "sd"
1362
HT_DISK_MTD = "mtd"
1363
HT_DISK_PFLASH = "pflash"
1364

    
1365
HT_CACHE_DEFAULT = "default"
1366
HT_CACHE_NONE = "none"
1367
HT_CACHE_WTHROUGH = "writethrough"
1368
HT_CACHE_WBACK = "writeback"
1369
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1370
  HT_CACHE_DEFAULT,
1371
  HT_CACHE_NONE,
1372
  HT_CACHE_WTHROUGH,
1373
  HT_CACHE_WBACK,
1374
  ])
1375

    
1376
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1377
  HT_DISK_PARAVIRTUAL,
1378
  HT_DISK_IOEMU,
1379
  ])
1380
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1381
  HT_DISK_PARAVIRTUAL,
1382
  HT_DISK_IDE,
1383
  HT_DISK_SCSI,
1384
  HT_DISK_SD,
1385
  HT_DISK_MTD,
1386
  HT_DISK_PFLASH,
1387
  ])
1388

    
1389
# Mouse types:
1390
HT_MOUSE_MOUSE = "mouse"
1391
HT_MOUSE_TABLET = "tablet"
1392

    
1393
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1394
  HT_MOUSE_MOUSE,
1395
  HT_MOUSE_TABLET,
1396
  ])
1397

    
1398
# Boot order
1399
HT_BO_FLOPPY = "floppy"
1400
HT_BO_CDROM = "cdrom"
1401
HT_BO_DISK = "disk"
1402
HT_BO_NETWORK = "network"
1403

    
1404
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1405
  HT_BO_FLOPPY,
1406
  HT_BO_CDROM,
1407
  HT_BO_DISK,
1408
  HT_BO_NETWORK,
1409
  ])
1410

    
1411
# SPICE lossless image compression options
1412
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1413
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1414
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1415
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1416
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1417
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1418

    
1419
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1420
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1421
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1422
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1423
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1424
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1425
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1426
  ])
1427

    
1428
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1429
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1430
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1431
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1432

    
1433
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1434
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1435
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1436
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1437
  ])
1438

    
1439
# SPICE video stream detection
1440
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1441
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1442
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1443

    
1444
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1445
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1446
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1447
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1448
  ])
1449

    
1450
# Security models
1451
HT_SM_NONE = "none"
1452
HT_SM_USER = "user"
1453
HT_SM_POOL = "pool"
1454

    
1455
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1456
  HT_SM_NONE,
1457
  HT_SM_USER,
1458
  HT_SM_POOL,
1459
  ])
1460

    
1461
# Kvm flag values
1462
HT_KVM_ENABLED = "enabled"
1463
HT_KVM_DISABLED = "disabled"
1464

    
1465
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1466

    
1467
# Migration type
1468
HT_MIGRATION_LIVE = "live"
1469
HT_MIGRATION_NONLIVE = "non-live"
1470
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1471
  HT_MIGRATION_LIVE,
1472
  HT_MIGRATION_NONLIVE,
1473
  ])
1474

    
1475
# Cluster Verify steps
1476
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1477
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1478

    
1479
# Cluster Verify error classes
1480
CV_TCLUSTER = "cluster"
1481
CV_TGROUP = "group"
1482
CV_TNODE = "node"
1483
CV_TINSTANCE = "instance"
1484

    
1485
# Cluster Verify error codes and documentation
1486
CV_ECLUSTERCFG = \
1487
  (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1488
CV_ECLUSTERCERT = \
1489
  (CV_TCLUSTER, "ECLUSTERCERT",
1490
   "Cluster certificate files verification failure")
1491
CV_ECLUSTERFILECHECK = \
1492
  (CV_TCLUSTER, "ECLUSTERFILECHECK",
1493
   "Cluster configuration verification failure")
1494
CV_ECLUSTERDANGLINGNODES = \
1495
  (CV_TNODE, "ECLUSTERDANGLINGNODES",
1496
   "Some nodes belong to non-existing groups")
1497
CV_ECLUSTERDANGLINGINST = \
1498
  (CV_TNODE, "ECLUSTERDANGLINGINST",
1499
   "Some instances have a non-existing primary node")
1500
CV_EGROUPDIFFERENTPVSIZE = \
1501
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1502
CV_EINSTANCEBADNODE = \
1503
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1504
   "Instance marked as running lives on an offline node")
1505
CV_EINSTANCEDOWN = \
1506
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1507
CV_EINSTANCELAYOUT = \
1508
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1509
CV_EINSTANCEMISSINGDISK = \
1510
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1511
CV_EINSTANCEFAULTYDISK = \
1512
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1513
   "Impossible to retrieve status for a disk")
1514
CV_EINSTANCEWRONGNODE = \
1515
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1516
CV_EINSTANCESPLITGROUPS = \
1517
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1518
   "Instance with primary and secondary nodes in different groups")
1519
CV_EINSTANCEPOLICY = \
1520
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1521
   "Instance does not meet policy")
1522
CV_EINSTANCEUNSUITABLENODE = \
1523
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1524
   "Instance running on nodes that are not suitable for it")
1525
CV_ENODEDRBD = \
1526
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1527
CV_ENODEDRBDHELPER = \
1528
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1529
CV_ENODEFILECHECK = \
1530
  (CV_TNODE, "ENODEFILECHECK",
1531
   "Error retrieving the checksum of the node files")
1532
CV_ENODEHOOKS = \
1533
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1534
CV_ENODEHV = \
1535
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1536
CV_ENODELVM = \
1537
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1538
CV_ENODEN1 = \
1539
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1540
CV_ENODENET = \
1541
  (CV_TNODE, "ENODENET", "Network-related node error")
1542
CV_ENODEOS = \
1543
  (CV_TNODE, "ENODEOS", "OS-related node error")
1544
CV_ENODEORPHANINSTANCE = \
1545
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1546
CV_ENODEORPHANLV = \
1547
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1548
CV_ENODERPC = \
1549
  (CV_TNODE, "ENODERPC",
1550
   "Error during connection to the primary node of an instance")
1551
CV_ENODESSH = \
1552
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1553
CV_ENODEVERSION = \
1554
  (CV_TNODE, "ENODEVERSION",
1555
   "Protocol version mismatch or Ganeti version mismatch")
1556
CV_ENODESETUP = \
1557
  (CV_TNODE, "ENODESETUP", "Node setup error")
1558
CV_ENODETIME = \
1559
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1560
CV_ENODEOOBPATH = \
1561
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1562
CV_ENODEUSERSCRIPTS = \
1563
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1564
CV_ENODEFILESTORAGEPATHS = \
1565
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1566

    
1567
CV_ALL_ECODES = compat.UniqueFrozenset([
1568
  CV_ECLUSTERCFG,
1569
  CV_ECLUSTERCERT,
1570
  CV_ECLUSTERFILECHECK,
1571
  CV_ECLUSTERDANGLINGNODES,
1572
  CV_ECLUSTERDANGLINGINST,
1573
  CV_EINSTANCEBADNODE,
1574
  CV_EINSTANCEDOWN,
1575
  CV_EINSTANCELAYOUT,
1576
  CV_EINSTANCEMISSINGDISK,
1577
  CV_EINSTANCEFAULTYDISK,
1578
  CV_EINSTANCEWRONGNODE,
1579
  CV_EINSTANCESPLITGROUPS,
1580
  CV_EINSTANCEPOLICY,
1581
  CV_ENODEDRBD,
1582
  CV_ENODEDRBDHELPER,
1583
  CV_ENODEFILECHECK,
1584
  CV_ENODEHOOKS,
1585
  CV_ENODEHV,
1586
  CV_ENODELVM,
1587
  CV_ENODEN1,
1588
  CV_ENODENET,
1589
  CV_ENODEOS,
1590
  CV_ENODEORPHANINSTANCE,
1591
  CV_ENODEORPHANLV,
1592
  CV_ENODERPC,
1593
  CV_ENODESSH,
1594
  CV_ENODEVERSION,
1595
  CV_ENODESETUP,
1596
  CV_ENODETIME,
1597
  CV_ENODEOOBPATH,
1598
  CV_ENODEUSERSCRIPTS,
1599
  CV_ENODEFILESTORAGEPATHS,
1600
  ])
1601

    
1602
CV_ALL_ECODES_STRINGS = \
1603
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1604

    
1605
# Node verify constants
1606
NV_BRIDGES = "bridges"
1607
NV_DRBDHELPER = "drbd-helper"
1608
NV_DRBDLIST = "drbd-list"
1609
NV_EXCLUSIVEPVS = "exclusive-pvs"
1610
NV_FILELIST = "filelist"
1611
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1612
NV_HVINFO = "hvinfo"
1613
NV_HVPARAMS = "hvparms"
1614
NV_HYPERVISOR = "hypervisor"
1615
NV_INSTANCELIST = "instancelist"
1616
NV_LVLIST = "lvlist"
1617
NV_MASTERIP = "master-ip"
1618
NV_NODELIST = "nodelist"
1619
NV_NODENETTEST = "node-net-test"
1620
NV_NODESETUP = "nodesetup"
1621
NV_OOB_PATHS = "oob-paths"
1622
NV_OSLIST = "oslist"
1623
NV_PVLIST = "pvlist"
1624
NV_TIME = "time"
1625
NV_USERSCRIPTS = "user-scripts"
1626
NV_VERSION = "version"
1627
NV_VGLIST = "vglist"
1628
NV_VMNODES = "vmnodes"
1629

    
1630
# Instance status
1631
INSTST_RUNNING = "running"
1632
INSTST_ADMINDOWN = "ADMIN_down"
1633
INSTST_ADMINOFFLINE = "ADMIN_offline"
1634
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1635
INSTST_NODEDOWN = "ERROR_nodedown"
1636
INSTST_WRONGNODE = "ERROR_wrongnode"
1637
INSTST_ERRORUP = "ERROR_up"
1638
INSTST_ERRORDOWN = "ERROR_down"
1639
INSTST_ALL = compat.UniqueFrozenset([
1640
  INSTST_RUNNING,
1641
  INSTST_ADMINDOWN,
1642
  INSTST_ADMINOFFLINE,
1643
  INSTST_NODEOFFLINE,
1644
  INSTST_NODEDOWN,
1645
  INSTST_WRONGNODE,
1646
  INSTST_ERRORUP,
1647
  INSTST_ERRORDOWN,
1648
  ])
1649

    
1650
# Admin states
1651
ADMINST_UP = "up"
1652
ADMINST_DOWN = "down"
1653
ADMINST_OFFLINE = "offline"
1654
ADMINST_ALL = compat.UniqueFrozenset([
1655
  ADMINST_UP,
1656
  ADMINST_DOWN,
1657
  ADMINST_OFFLINE,
1658
  ])
1659

    
1660
# Node roles
1661
NR_REGULAR = "R"
1662
NR_MASTER = "M"
1663
NR_MCANDIDATE = "C"
1664
NR_DRAINED = "D"
1665
NR_OFFLINE = "O"
1666
NR_ALL = compat.UniqueFrozenset([
1667
  NR_REGULAR,
1668
  NR_MASTER,
1669
  NR_MCANDIDATE,
1670
  NR_DRAINED,
1671
  NR_OFFLINE,
1672
  ])
1673

    
1674
# SSL certificate check constants (in days)
1675
SSL_CERT_EXPIRATION_WARN = 30
1676
SSL_CERT_EXPIRATION_ERROR = 7
1677

    
1678
# Allocator framework constants
1679
IALLOCATOR_VERSION = 2
1680
IALLOCATOR_DIR_IN = "in"
1681
IALLOCATOR_DIR_OUT = "out"
1682
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1683
  IALLOCATOR_DIR_IN,
1684
  IALLOCATOR_DIR_OUT,
1685
  ])
1686
IALLOCATOR_MODE_ALLOC = "allocate"
1687
IALLOCATOR_MODE_RELOC = "relocate"
1688
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1689
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1690
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1691
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1692
  IALLOCATOR_MODE_ALLOC,
1693
  IALLOCATOR_MODE_RELOC,
1694
  IALLOCATOR_MODE_CHG_GROUP,
1695
  IALLOCATOR_MODE_NODE_EVAC,
1696
  IALLOCATOR_MODE_MULTI_ALLOC,
1697
  ])
1698
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1699
DEFAULT_IALLOCATOR_SHORTCUT = "."
1700

    
1701
IALLOCATOR_NEVAC_PRI = "primary-only"
1702
IALLOCATOR_NEVAC_SEC = "secondary-only"
1703
IALLOCATOR_NEVAC_ALL = "all"
1704
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1705
  IALLOCATOR_NEVAC_PRI,
1706
  IALLOCATOR_NEVAC_SEC,
1707
  IALLOCATOR_NEVAC_ALL,
1708
  ])
1709

    
1710
# Node evacuation
1711
NODE_EVAC_PRI = "primary-only"
1712
NODE_EVAC_SEC = "secondary-only"
1713
NODE_EVAC_ALL = "all"
1714
NODE_EVAC_MODES = compat.UniqueFrozenset([
1715
  NODE_EVAC_PRI,
1716
  NODE_EVAC_SEC,
1717
  NODE_EVAC_ALL,
1718
  ])
1719

    
1720
# Job queue
1721
JOB_QUEUE_VERSION = 1
1722
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1723

    
1724
JOB_ID_TEMPLATE = r"\d+"
1725
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1726

    
1727
# unchanged job return
1728
JOB_NOTCHANGED = "nochange"
1729

    
1730
# Job status
1731
JOB_STATUS_QUEUED = "queued"
1732
JOB_STATUS_WAITING = "waiting"
1733
JOB_STATUS_CANCELING = "canceling"
1734
JOB_STATUS_RUNNING = "running"
1735
JOB_STATUS_CANCELED = "canceled"
1736
JOB_STATUS_SUCCESS = "success"
1737
JOB_STATUS_ERROR = "error"
1738
JOBS_PENDING = compat.UniqueFrozenset([
1739
  JOB_STATUS_QUEUED,
1740
  JOB_STATUS_WAITING,
1741
  JOB_STATUS_CANCELING,
1742
  ])
1743
JOBS_FINALIZED = compat.UniqueFrozenset([
1744
  JOB_STATUS_CANCELED,
1745
  JOB_STATUS_SUCCESS,
1746
  JOB_STATUS_ERROR,
1747
  ])
1748
JOB_STATUS_ALL = compat.UniqueFrozenset([
1749
  JOB_STATUS_RUNNING,
1750
  ]) | JOBS_PENDING | JOBS_FINALIZED
1751

    
1752
# OpCode status
1753
# not yet finalized
1754
OP_STATUS_QUEUED = "queued"
1755
OP_STATUS_WAITING = "waiting"
1756
OP_STATUS_CANCELING = "canceling"
1757
OP_STATUS_RUNNING = "running"
1758
# finalized
1759
OP_STATUS_CANCELED = "canceled"
1760
OP_STATUS_SUCCESS = "success"
1761
OP_STATUS_ERROR = "error"
1762
OPS_FINALIZED = compat.UniqueFrozenset([
1763
  OP_STATUS_CANCELED,
1764
  OP_STATUS_SUCCESS,
1765
  OP_STATUS_ERROR,
1766
  ])
1767

    
1768
# OpCode priority
1769
OP_PRIO_LOWEST = +19
1770
OP_PRIO_HIGHEST = -20
1771

    
1772
OP_PRIO_LOW = +10
1773
OP_PRIO_NORMAL = 0
1774
OP_PRIO_HIGH = -10
1775

    
1776
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1777
  OP_PRIO_LOW,
1778
  OP_PRIO_NORMAL,
1779
  OP_PRIO_HIGH,
1780
  ])
1781

    
1782
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1783

    
1784
# Lock recalculate mode
1785
LOCKS_REPLACE = "replace"
1786
LOCKS_APPEND = "append"
1787

    
1788
# Lock timeout (sum) before we should go into blocking acquire (still
1789
# can be reset by priority change); computed as max time (10 hours)
1790
# before we should actually go into blocking acquire given that we
1791
# start from default priority level; in seconds
1792
# TODO
1793
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1794
LOCK_ATTEMPTS_MAXWAIT = 15.0
1795
LOCK_ATTEMPTS_MINWAIT = 1.0
1796

    
1797
# Execution log types
1798
ELOG_MESSAGE = "message"
1799
ELOG_REMOTE_IMPORT = "remote-import"
1800
ELOG_JQUEUE_TEST = "jqueue-test"
1801

    
1802
# /etc/hosts modification
1803
ETC_HOSTS_ADD = "add"
1804
ETC_HOSTS_REMOVE = "remove"
1805

    
1806
# Job queue test
1807
JQT_MSGPREFIX = "TESTMSG="
1808
JQT_EXPANDNAMES = "expandnames"
1809
JQT_EXEC = "exec"
1810
JQT_LOGMSG = "logmsg"
1811
JQT_STARTMSG = "startmsg"
1812
JQT_ALL = compat.UniqueFrozenset([
1813
  JQT_EXPANDNAMES,
1814
  JQT_EXEC,
1815
  JQT_LOGMSG,
1816
  JQT_STARTMSG,
1817
  ])
1818

    
1819
# Query resources
1820
QR_CLUSTER = "cluster"
1821
QR_INSTANCE = "instance"
1822
QR_NODE = "node"
1823
QR_LOCK = "lock"
1824
QR_GROUP = "group"
1825
QR_OS = "os"
1826
QR_JOB = "job"
1827
QR_EXPORT = "export"
1828
QR_NETWORK = "network"
1829
QR_EXTSTORAGE = "extstorage"
1830

    
1831
#: List of resources which can be queried using L{opcodes.OpQuery}
1832
QR_VIA_OP = compat.UniqueFrozenset([
1833
  QR_CLUSTER,
1834
  QR_INSTANCE,
1835
  QR_NODE,
1836
  QR_GROUP,
1837
  QR_OS,
1838
  QR_EXPORT,
1839
  QR_NETWORK,
1840
  QR_EXTSTORAGE,
1841
  ])
1842

    
1843
#: List of resources which can be queried using Local UniX Interface
1844
QR_VIA_LUXI = QR_VIA_OP.union([
1845
  QR_LOCK,
1846
  QR_JOB,
1847
  ])
1848

    
1849
#: List of resources which can be queried using RAPI
1850
QR_VIA_RAPI = QR_VIA_LUXI
1851

    
1852
# Query field types
1853
QFT_UNKNOWN = "unknown"
1854
QFT_TEXT = "text"
1855
QFT_BOOL = "bool"
1856
QFT_NUMBER = "number"
1857
QFT_UNIT = "unit"
1858
QFT_TIMESTAMP = "timestamp"
1859
QFT_OTHER = "other"
1860

    
1861
#: All query field types
1862
QFT_ALL = compat.UniqueFrozenset([
1863
  QFT_UNKNOWN,
1864
  QFT_TEXT,
1865
  QFT_BOOL,
1866
  QFT_NUMBER,
1867
  QFT_UNIT,
1868
  QFT_TIMESTAMP,
1869
  QFT_OTHER,
1870
  ])
1871

    
1872
# Query result field status (don't change or reuse values as they're used by
1873
# clients)
1874
#: Normal field status
1875
RS_NORMAL = 0
1876
#: Unknown field
1877
RS_UNKNOWN = 1
1878
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1879
RS_NODATA = 2
1880
#: Value unavailable/unsupported for item; if this field is supported
1881
#: but we cannot get the data for the moment, RS_NODATA or
1882
#: RS_OFFLINE should be used
1883
RS_UNAVAIL = 3
1884
#: Resource marked offline
1885
RS_OFFLINE = 4
1886

    
1887
RS_ALL = compat.UniqueFrozenset([
1888
  RS_NORMAL,
1889
  RS_UNKNOWN,
1890
  RS_NODATA,
1891
  RS_UNAVAIL,
1892
  RS_OFFLINE,
1893
  ])
1894

    
1895
#: Dictionary with special field cases and their verbose/terse formatting
1896
RSS_DESCRIPTION = {
1897
  RS_UNKNOWN: ("(unknown)", "??"),
1898
  RS_NODATA: ("(nodata)", "?"),
1899
  RS_OFFLINE: ("(offline)", "*"),
1900
  RS_UNAVAIL: ("(unavail)", "-"),
1901
  }
1902

    
1903
# max dynamic devices
1904
MAX_NICS = 8
1905
MAX_DISKS = 16
1906

    
1907
# SSCONF file prefix
1908
SSCONF_FILEPREFIX = "ssconf_"
1909
# SSCONF keys
1910
SS_CLUSTER_NAME = "cluster_name"
1911
SS_CLUSTER_TAGS = "cluster_tags"
1912
SS_FILE_STORAGE_DIR = "file_storage_dir"
1913
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1914
SS_MASTER_CANDIDATES = "master_candidates"
1915
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1916
SS_MASTER_IP = "master_ip"
1917
SS_MASTER_NETDEV = "master_netdev"
1918
SS_MASTER_NETMASK = "master_netmask"
1919
SS_MASTER_NODE = "master_node"
1920
SS_NODE_LIST = "node_list"
1921
SS_NODE_PRIMARY_IPS = "node_primary_ips"
1922
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1923
SS_OFFLINE_NODES = "offline_nodes"
1924
SS_ONLINE_NODES = "online_nodes"
1925
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
1926
SS_INSTANCE_LIST = "instance_list"
1927
SS_RELEASE_VERSION = "release_version"
1928
SS_HYPERVISOR_LIST = "hypervisor_list"
1929
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
1930
SS_UID_POOL = "uid_pool"
1931
SS_NODEGROUPS = "nodegroups"
1932
SS_NETWORKS = "networks"
1933

    
1934
SS_FILE_PERMS = 0444
1935

    
1936
# cluster wide default parameters
1937
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1938

    
1939
HVC_DEFAULTS = {
1940
  HT_XEN_PVM: {
1941
    HV_USE_BOOTLOADER: False,
1942
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
1943
    HV_BOOTLOADER_ARGS: "",
1944
    HV_KERNEL_PATH: XEN_KERNEL,
1945
    HV_INITRD_PATH: "",
1946
    HV_ROOT_PATH: "/dev/xvda1",
1947
    HV_KERNEL_ARGS: "ro",
1948
    HV_MIGRATION_PORT: 8002,
1949
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1950
    HV_BLOCKDEV_PREFIX: "sd",
1951
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1952
    HV_CPU_MASK: CPU_PINNING_ALL,
1953
    HV_CPU_CAP: 0,
1954
    HV_CPU_WEIGHT: 256,
1955
    },
1956
  HT_XEN_HVM: {
1957
    HV_BOOT_ORDER: "cd",
1958
    HV_CDROM_IMAGE_PATH: "",
1959
    HV_NIC_TYPE: HT_NIC_RTL8139,
1960
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
1961
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
1962
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
1963
    HV_ACPI: True,
1964
    HV_PAE: True,
1965
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
1966
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
1967
    HV_MIGRATION_PORT: 8002,
1968
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
1969
    HV_USE_LOCALTIME: False,
1970
    HV_BLOCKDEV_PREFIX: "hd",
1971
    HV_PASSTHROUGH: "",
1972
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1973
    HV_CPU_MASK: CPU_PINNING_ALL,
1974
    HV_CPU_CAP: 0,
1975
    HV_CPU_WEIGHT: 256,
1976
    },
1977
  HT_KVM: {
1978
    HV_KVM_PATH: KVM_PATH,
1979
    HV_KERNEL_PATH: KVM_KERNEL,
1980
    HV_INITRD_PATH: "",
1981
    HV_KERNEL_ARGS: "ro",
1982
    HV_ROOT_PATH: "/dev/vda1",
1983
    HV_ACPI: True,
1984
    HV_SERIAL_CONSOLE: True,
1985
    HV_SERIAL_SPEED: 38400,
1986
    HV_VNC_BIND_ADDRESS: "",
1987
    HV_VNC_TLS: False,
1988
    HV_VNC_X509: "",
1989
    HV_VNC_X509_VERIFY: False,
1990
    HV_VNC_PASSWORD_FILE: "",
1991
    HV_KVM_SPICE_BIND: "",
1992
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
1993
    HV_KVM_SPICE_PASSWORD_FILE: "",
1994
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
1995
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
1996
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
1997
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
1998
    HV_KVM_SPICE_AUDIO_COMPR: True,
1999
    HV_KVM_SPICE_USE_TLS: False,
2000
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2001
    HV_KVM_SPICE_USE_VDAGENT: True,
2002
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2003
    HV_CDROM_IMAGE_PATH: "",
2004
    HV_KVM_CDROM2_IMAGE_PATH: "",
2005
    HV_BOOT_ORDER: HT_BO_DISK,
2006
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2007
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2008
    HV_KVM_CDROM_DISK_TYPE: "",
2009
    HV_USB_MOUSE: "",
2010
    HV_KEYMAP: "",
2011
    HV_MIGRATION_PORT: 8102,
2012
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2013
    HV_MIGRATION_DOWNTIME: 30,  # ms
2014
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2015
    HV_USE_LOCALTIME: False,
2016
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2017
    HV_SECURITY_MODEL: HT_SM_NONE,
2018
    HV_SECURITY_DOMAIN: "",
2019
    HV_KVM_FLAG: "",
2020
    HV_VHOST_NET: False,
2021
    HV_KVM_USE_CHROOT: False,
2022
    HV_MEM_PATH: "",
2023
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2024
    HV_CPU_MASK: CPU_PINNING_ALL,
2025
    HV_CPU_TYPE: "",
2026
    HV_CPU_CORES: 0,
2027
    HV_CPU_THREADS: 0,
2028
    HV_CPU_SOCKETS: 0,
2029
    HV_SOUNDHW: "",
2030
    HV_USB_DEVICES: "",
2031
    HV_VGA: "",
2032
    HV_KVM_EXTRA: "",
2033
    HV_KVM_MACHINE_VERSION: "",
2034
    },
2035
  HT_FAKE: {},
2036
  HT_CHROOT: {
2037
    HV_INIT_SCRIPT: "/ganeti-chroot",
2038
    },
2039
  HT_LXC: {
2040
    HV_CPU_MASK: "",
2041
    },
2042
  }
2043

    
2044
HVC_GLOBALS = compat.UniqueFrozenset([
2045
  HV_MIGRATION_PORT,
2046
  HV_MIGRATION_BANDWIDTH,
2047
  HV_MIGRATION_MODE,
2048
  ])
2049

    
2050
BEC_DEFAULTS = {
2051
  BE_MINMEM: 128,
2052
  BE_MAXMEM: 128,
2053
  BE_VCPUS: 1,
2054
  BE_AUTO_BALANCE: True,
2055
  BE_ALWAYS_FAILOVER: False,
2056
  BE_SPINDLE_USE: 1,
2057
  }
2058

    
2059
NDC_DEFAULTS = {
2060
  ND_OOB_PROGRAM: "",
2061
  ND_SPINDLE_COUNT: 1,
2062
  ND_EXCLUSIVE_STORAGE: False,
2063
  }
2064

    
2065
NDC_GLOBALS = compat.UniqueFrozenset([
2066
  ND_EXCLUSIVE_STORAGE,
2067
  ])
2068

    
2069
DISK_LD_DEFAULTS = {
2070
  LD_DRBD8: {
2071
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2072
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2073
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2074
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2075
    LDP_DISK_CUSTOM: "",
2076
    LDP_NET_CUSTOM: "",
2077
    LDP_DYNAMIC_RESYNC: False,
2078

    
2079
    # The default values for the DRBD dynamic resync speed algorithm
2080
    # are taken from the drbsetup 8.3.11 man page, except for
2081
    # c-plan-ahead (that we don't need to set to 0, because we have a
2082
    # separate option to enable it) and for c-max-rate, that we cap to
2083
    # the default value for the static resync rate.
2084
    LDP_PLAN_AHEAD: 20, # ds
2085
    LDP_FILL_TARGET: 0, # sectors
2086
    LDP_DELAY_TARGET: 1, # ds
2087
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2088
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2089
    },
2090
  LD_LV: {
2091
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2092
    },
2093
  LD_FILE: {},
2094
  LD_BLOCKDEV: {},
2095
  LD_RBD: {
2096
    LDP_POOL: "rbd"
2097
    },
2098
  LD_EXT: {},
2099
  }
2100

    
2101
# readability shortcuts
2102
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2103
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2104

    
2105
DISK_DT_DEFAULTS = {
2106
  DT_PLAIN: {
2107
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2108
    },
2109
  DT_DRBD8: {
2110
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2111
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2112
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2113
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2114
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2115
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2116
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2117
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2118
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2119
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2120
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2121
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2122
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2123
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2124
    },
2125
  DT_DISKLESS: {},
2126
  DT_FILE: {},
2127
  DT_SHARED_FILE: {},
2128
  DT_BLOCK: {},
2129
  DT_RBD: {
2130
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2131
    },
2132
  DT_EXT: {},
2133
  }
2134

    
2135
# we don't want to export the shortcuts
2136
del _LV_DEFAULTS, _DRBD_DEFAULTS
2137

    
2138
NICC_DEFAULTS = {
2139
  NIC_MODE: NIC_MODE_BRIDGED,
2140
  NIC_LINK: DEFAULT_BRIDGE,
2141
  }
2142

    
2143
# All of the following values are quite arbitrarily - there are no
2144
# "good" defaults, these must be customised per-site
2145
IPOLICY_DEFAULTS = {
2146
  ISPECS_MIN: {
2147
    ISPEC_MEM_SIZE: 128,
2148
    ISPEC_CPU_COUNT: 1,
2149
    ISPEC_DISK_COUNT: 1,
2150
    ISPEC_DISK_SIZE: 1024,
2151
    ISPEC_NIC_COUNT: 1,
2152
    ISPEC_SPINDLE_USE: 1,
2153
    },
2154
  ISPECS_MAX: {
2155
    ISPEC_MEM_SIZE: 32768,
2156
    ISPEC_CPU_COUNT: 8,
2157
    ISPEC_DISK_COUNT: MAX_DISKS,
2158
    ISPEC_DISK_SIZE: 1024 * 1024,
2159
    ISPEC_NIC_COUNT: MAX_NICS,
2160
    ISPEC_SPINDLE_USE: 12,
2161
    },
2162
  ISPECS_STD: {
2163
    ISPEC_MEM_SIZE: 128,
2164
    ISPEC_CPU_COUNT: 1,
2165
    ISPEC_DISK_COUNT: 1,
2166
    ISPEC_DISK_SIZE: 1024,
2167
    ISPEC_NIC_COUNT: 1,
2168
    ISPEC_SPINDLE_USE: 1,
2169
    },
2170
  IPOLICY_DTS: list(DISK_TEMPLATES),
2171
  IPOLICY_VCPU_RATIO: 4.0,
2172
  IPOLICY_SPINDLE_RATIO: 32.0,
2173
  }
2174

    
2175
MASTER_POOL_SIZE_DEFAULT = 10
2176

    
2177
# Exclusive storage:
2178
# Error margin used to compare physical disks
2179
PART_MARGIN = .01
2180
# Space reserved when creating instance disks
2181
PART_RESERVED = .02
2182

    
2183
CONFD_PROTOCOL_VERSION = 1
2184

    
2185
CONFD_REQ_PING = 0
2186
CONFD_REQ_NODE_ROLE_BYNAME = 1
2187
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2188
CONFD_REQ_CLUSTER_MASTER = 3
2189
CONFD_REQ_NODE_PIP_LIST = 4
2190
CONFD_REQ_MC_PIP_LIST = 5
2191
CONFD_REQ_INSTANCES_IPS_LIST = 6
2192
CONFD_REQ_NODE_DRBD = 7
2193
CONFD_REQ_NODE_INSTANCES = 8
2194

    
2195
# Confd request query fields. These are used to narrow down queries.
2196
# These must be strings rather than integers, because json-encoding
2197
# converts them to strings anyway, as they're used as dict-keys.
2198
CONFD_REQQ_LINK = "0"
2199
CONFD_REQQ_IP = "1"
2200
CONFD_REQQ_IPLIST = "2"
2201
CONFD_REQQ_FIELDS = "3"
2202

    
2203
CONFD_REQFIELD_NAME = "0"
2204
CONFD_REQFIELD_IP = "1"
2205
CONFD_REQFIELD_MNODE_PIP = "2"
2206

    
2207
CONFD_REQS = compat.UniqueFrozenset([
2208
  CONFD_REQ_PING,
2209
  CONFD_REQ_NODE_ROLE_BYNAME,
2210
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2211
  CONFD_REQ_CLUSTER_MASTER,
2212
  CONFD_REQ_NODE_PIP_LIST,
2213
  CONFD_REQ_MC_PIP_LIST,
2214
  CONFD_REQ_INSTANCES_IPS_LIST,
2215
  CONFD_REQ_NODE_DRBD,
2216
  ])
2217

    
2218
CONFD_REPL_STATUS_OK = 0
2219
CONFD_REPL_STATUS_ERROR = 1
2220
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2221

    
2222
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2223
  CONFD_REPL_STATUS_OK,
2224
  CONFD_REPL_STATUS_ERROR,
2225
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2226
  ])
2227

    
2228
(CONFD_NODE_ROLE_MASTER,
2229
 CONFD_NODE_ROLE_CANDIDATE,
2230
 CONFD_NODE_ROLE_OFFLINE,
2231
 CONFD_NODE_ROLE_DRAINED,
2232
 CONFD_NODE_ROLE_REGULAR,
2233
 ) = range(5)
2234

    
2235
# A few common errors for confd
2236
CONFD_ERROR_UNKNOWN_ENTRY = 1
2237
CONFD_ERROR_INTERNAL = 2
2238
CONFD_ERROR_ARGUMENT = 3
2239

    
2240
# Each request is "salted" by the current timestamp.
2241
# This constants decides how many seconds of skew to accept.
2242
# TODO: make this a default and allow the value to be more configurable
2243
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2244

    
2245
# When we haven't reloaded the config for more than this amount of
2246
# seconds, we force a test to see if inotify is betraying us. Using a
2247
# prime number to ensure we get less chance of 'same wakeup' with
2248
# other processes.
2249
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2250

    
2251
# If we receive more than one update in this amount of microseconds,
2252
# we move to polling every RATELIMIT seconds, rather than relying on
2253
# inotify, to be able to serve more requests.
2254
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2255

    
2256
# Magic number prepended to all confd queries.
2257
# This allows us to distinguish different types of confd protocols and handle
2258
# them. For example by changing this we can move the whole payload to be
2259
# compressed, or move away from json.
2260
CONFD_MAGIC_FOURCC = "plj0"
2261

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

    
2267
# Timeout in seconds to expire pending query request in the confd client
2268
# library. We don't actually expect any answer more than 10 seconds after we
2269
# sent a request.
2270
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2271

    
2272
# Maximum UDP datagram size.
2273
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2274
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2275
#   (assuming we can't use jumbo frames)
2276
# We just set this to 60K, which should be enough
2277
MAX_UDP_DATA_SIZE = 61440
2278

    
2279
# User-id pool minimum/maximum acceptable user-ids.
2280
UIDPOOL_UID_MIN = 0
2281
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2282

    
2283
# Name or path of the pgrep command
2284
PGREP = "pgrep"
2285

    
2286
# Name of the node group that gets created at cluster init or upgrade
2287
INITIAL_NODE_GROUP_NAME = "default"
2288

    
2289
# Possible values for NodeGroup.alloc_policy
2290
ALLOC_POLICY_PREFERRED = "preferred"
2291
ALLOC_POLICY_LAST_RESORT = "last_resort"
2292
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2293
VALID_ALLOC_POLICIES = [
2294
  ALLOC_POLICY_PREFERRED,
2295
  ALLOC_POLICY_LAST_RESORT,
2296
  ALLOC_POLICY_UNALLOCABLE,
2297
  ]
2298

    
2299
# Temporary external/shared storage parameters
2300
BLOCKDEV_DRIVER_MANUAL = "manual"
2301

    
2302
# qemu-img path, required for ovfconverter
2303
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2304

    
2305
# Whether htools was enabled at compilation time
2306
HTOOLS = _autoconf.HTOOLS
2307
# The hail iallocator
2308
IALLOC_HAIL = "hail"
2309

    
2310
# Fake opcodes for functions that have hooks attached to them via
2311
# backend.RunLocalHooks
2312
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2313
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2314

    
2315
# SSH key types
2316
SSHK_RSA = "rsa"
2317
SSHK_DSA = "dsa"
2318
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2319

    
2320
# SSH authorized key types
2321
SSHAK_RSA = "ssh-rsa"
2322
SSHAK_DSS = "ssh-dss"
2323
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2324

    
2325
# SSH setup
2326
SSHS_CLUSTER_NAME = "cluster_name"
2327
SSHS_SSH_HOST_KEY = "ssh_host_key"
2328
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2329
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2330

    
2331
#: Key files for SSH daemon
2332
SSH_DAEMON_KEYFILES = {
2333
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2334
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2335
  }
2336

    
2337
# Node daemon setup
2338
NDS_CLUSTER_NAME = "cluster_name"
2339
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2340
NDS_SSCONF = "ssconf"
2341
NDS_START_NODE_DAEMON = "start_node_daemon"
2342

    
2343
# Path generating random UUID
2344
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2345

    
2346
# Regex string for verifying a UUID
2347
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2348

    
2349
# Auto-repair tag prefixes
2350
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2351
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2352
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2353
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2354
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2355

    
2356
# Auto-repair levels
2357
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2358
AUTO_REPAIR_MIGRATE = "migrate"
2359
AUTO_REPAIR_FAILOVER = "failover"
2360
AUTO_REPAIR_REINSTALL = "reinstall"
2361
AUTO_REPAIR_ALL_TYPES = [
2362
  AUTO_REPAIR_FIX_STORAGE,
2363
  AUTO_REPAIR_MIGRATE,
2364
  AUTO_REPAIR_FAILOVER,
2365
  AUTO_REPAIR_REINSTALL,
2366
]
2367

    
2368
# Auto-repair results
2369
AUTO_REPAIR_SUCCESS = "success"
2370
AUTO_REPAIR_FAILURE = "failure"
2371
AUTO_REPAIR_ENOPERM = "enoperm"
2372
AUTO_REPAIR_ALL_RESULTS = frozenset([
2373
    AUTO_REPAIR_SUCCESS,
2374
    AUTO_REPAIR_FAILURE,
2375
    AUTO_REPAIR_ENOPERM,
2376
])
2377

    
2378
# The version identifier for builtin data collectors
2379
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2380

    
2381
# The source reasons for the change of state of an instance
2382
INSTANCE_REASON_SOURCE_CLI = "cli"
2383
INSTANCE_REASON_SOURCE_RAPI = "rapi"
2384
INSTANCE_REASON_SOURCE_UNKNOWN = "unknown"
2385

    
2386
INSTANCE_REASON_SOURCES = compat.UniqueFrozenset([
2387
  INSTANCE_REASON_SOURCE_CLI,
2388
  INSTANCE_REASON_SOURCE_RAPI,
2389
  INSTANCE_REASON_SOURCE_UNKNOWN,
2390
  ])
2391

    
2392
# The default reasons for the change of state of an instance
2393
INSTANCE_REASON_REBOOT = "reboot"
2394

    
2395
# Do not re-export imported modules
2396
del re, _vcsversion, _autoconf, socket, pathutils, compat