Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 0c9d7319

History | View | Annotate | Download (60.5 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
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
110
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
111

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

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

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

    
135
# Wipe
136
DD_CMD = "dd"
137
MAX_WIPE_CHUNK = 1024 # 1GB
138
MIN_WIPE_CHUNK_PERCENT = 10
139

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

    
150
NODED = "ganeti-noded"
151
CONFD = "ganeti-confd"
152
RAPI = "ganeti-rapi"
153
MASTERD = "ganeti-masterd"
154

    
155
DAEMONS_PORTS = {
156
  # daemon-name: ("proto", "default-port")
157
  NODED: ("tcp", 1811),
158
  CONFD: ("udp", 1814),
159
  RAPI: ("tcp", 5080),
160
  "ssh": ("tcp", 22),
161
}
162
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
163
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
164
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
165

    
166
FIRST_DRBD_PORT = 11000
167
LAST_DRBD_PORT = 14999
168

    
169
DAEMONS_LOGBASE = {
170
  NODED: "node-daemon",
171
  CONFD: "conf-daemon",
172
  RAPI: "rapi-daemon",
173
  MASTERD: "master-daemon",
174
  }
175

    
176
DAEMONS_LOGFILES = \
177
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
178
         for daemon in DAEMONS_LOGBASE)
179

    
180
DEV_CONSOLE = "/dev/console"
181

    
182
PROC_MOUNTS = "/proc/mounts"
183

    
184
# Local UniX Interface related constants
185
LUXI_EOM = "\3"
186
LUXI_VERSION = CONFIG_VERSION
187
#: Environment variable for the luxi override socket
188
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
189
LUXI_OVERRIDE_MASTER = "master"
190
LUXI_OVERRIDE_QUERY = "query"
191

    
192
# one of "no", "yes", "only"
193
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
194
SYSLOG_NO = "no"
195
SYSLOG_YES = "yes"
196
SYSLOG_ONLY = "only"
197
SYSLOG_SOCKET = "/dev/log"
198

    
199
EXPORT_CONF_FILE = "config.ini"
200

    
201
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
202
XEN_KERNEL = _autoconf.XEN_KERNEL
203
XEN_INITRD = _autoconf.XEN_INITRD
204
XEN_CMD_XM = "xm"
205
XEN_CMD_XL = "xl"
206
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
207
XEN_CMD = _autoconf.XEN_CMD
208

    
209
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
210
  XEN_CMD_XM,
211
  XEN_CMD_XL,
212
  ])
213

    
214
# When the Xen toolstack used is "xl", live migration requires the source host
215
# to connect to the target host via ssh (xl runs this command). We need to pass
216
# the command xl runs some extra info so that it can use Ganeti's key
217
# verification and not fail. Note that this string is incomplete: it must be
218
# filled with the cluster name before being used.
219
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
220
              " -oUserKnownHostsFile=/dev/null"
221
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
222
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
223
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
224

    
225
KVM_PATH = _autoconf.KVM_PATH
226
KVM_KERNEL = _autoconf.KVM_KERNEL
227
SOCAT_PATH = _autoconf.SOCAT_PATH
228
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
229
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
230
SOCAT_ESCAPE_CODE = "0x1d"
231

    
232
#: Console as SSH command
233
CONS_SSH = "ssh"
234

    
235
#: Console as VNC server
236
CONS_VNC = "vnc"
237

    
238
#: Console as SPICE server
239
CONS_SPICE = "spice"
240

    
241
#: Display a message for console access
242
CONS_MESSAGE = "msg"
243

    
244
#: All console types
245
CONS_ALL = compat.UniqueFrozenset([
246
  CONS_SSH,
247
  CONS_VNC,
248
  CONS_SPICE,
249
  CONS_MESSAGE,
250
  ])
251

    
252
# For RSA keys more bits are better, but they also make operations more
253
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
254
# 2010 on.
255
RSA_KEY_BITS = 2048
256

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

    
265
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
266
X509_CERT_SIGN_DIGEST = "SHA1"
267

    
268
# Default validity of certificates in days
269
X509_CERT_DEFAULT_VALIDITY = 365 * 5
270

    
271
# commonName (CN) used in certificates
272
X509_CERT_CN = "ganeti.example.com"
273

    
274
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
275

    
276
# Import/export daemon mode
277
IEM_IMPORT = "import"
278
IEM_EXPORT = "export"
279

    
280
# Import/export transport compression
281
IEC_NONE = "none"
282
IEC_GZIP = "gzip"
283
IEC_ALL = compat.UniqueFrozenset([
284
  IEC_NONE,
285
  IEC_GZIP,
286
  ])
287

    
288
IE_CUSTOM_SIZE = "fd"
289

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

    
292
# Import/export I/O
293
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
294
IEIO_FILE = "file"
295
# Raw block device I/O using "dd"
296
IEIO_RAW_DISK = "raw"
297
# OS definition import/export script
298
IEIO_SCRIPT = "script"
299

    
300
VALUE_DEFAULT = "default"
301
VALUE_AUTO = "auto"
302
VALUE_GENERATE = "generate"
303
VALUE_NONE = "none"
304
VALUE_TRUE = "true"
305
VALUE_FALSE = "false"
306

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

    
310
# hooks-related constants
311
HOOKS_PHASE_PRE = "pre"
312
HOOKS_PHASE_POST = "post"
313
HOOKS_NAME_CFGUPDATE = "config-update"
314
HOOKS_NAME_WATCHER = "watcher"
315
HOOKS_VERSION = 2
316
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
317

    
318
# hooks subject type (what object type does the LU deal with)
319
HTYPE_CLUSTER = "CLUSTER"
320
HTYPE_NODE = "NODE"
321
HTYPE_GROUP = "GROUP"
322
HTYPE_INSTANCE = "INSTANCE"
323
HTYPE_NETWORK = "NETWORK"
324

    
325
HKR_SKIP = 0
326
HKR_FAIL = 1
327
HKR_SUCCESS = 2
328

    
329
# Storage types
330
ST_FILE = "file"
331
ST_LVM_PV = "lvm-pv"
332
ST_LVM_VG = "lvm-vg"
333

    
334
# Storage fields
335
# first two are valid in LU context only, not passed to backend
336
SF_NODE = "node"
337
SF_TYPE = "type"
338
# and the rest are valid in backend
339
SF_NAME = "name"
340
SF_SIZE = "size"
341
SF_FREE = "free"
342
SF_USED = "used"
343
SF_ALLOCATABLE = "allocatable"
344

    
345
# Storage operations
346
SO_FIX_CONSISTENCY = "fix-consistency"
347

    
348
# Available fields per storage type
349
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
350
  SF_NAME,
351
  SF_TYPE,
352
  SF_SIZE,
353
  SF_USED,
354
  SF_FREE,
355
  SF_ALLOCATABLE,
356
  ])
357

    
358
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
359
  ST_FILE,
360
  ST_LVM_PV,
361
  ST_LVM_VG,
362
  ])
363

    
364
MODIFIABLE_STORAGE_FIELDS = {
365
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
366
  }
367

    
368
VALID_STORAGE_OPERATIONS = {
369
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
370
  }
371

    
372
# Local disk status
373
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
374
(LDS_OKAY,
375
 LDS_UNKNOWN,
376
 LDS_FAULTY) = range(1, 4)
377

    
378
# disk template types
379
DT_DISKLESS = "diskless"
380
DT_PLAIN = "plain"
381
DT_DRBD8 = "drbd"
382
DT_FILE = "file"
383
DT_SHARED_FILE = "sharedfile"
384
DT_BLOCK = "blockdev"
385
DT_RBD = "rbd"
386
DT_EXT = "ext"
387

    
388
# the set of network-mirrored disk templates
389
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
390

    
391
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
392
DTS_EXT_MIRROR = compat.UniqueFrozenset([
393
  DT_SHARED_FILE,
394
  DT_BLOCK,
395
  DT_RBD,
396
  DT_EXT,
397
  ])
398

    
399
# the set of non-lvm-based disk templates
400
DTS_NOT_LVM = compat.UniqueFrozenset([
401
  DT_DISKLESS,
402
  DT_FILE,
403
  DT_SHARED_FILE,
404
  DT_BLOCK,
405
  DT_RBD,
406
  DT_EXT,
407
  ])
408

    
409
# the set of disk templates which can be grown
410
DTS_GROWABLE = compat.UniqueFrozenset([
411
  DT_PLAIN,
412
  DT_DRBD8,
413
  DT_FILE,
414
  DT_SHARED_FILE,
415
  DT_RBD,
416
  DT_EXT,
417
  ])
418

    
419
# the set of disk templates that allow adoption
420
DTS_MAY_ADOPT = compat.UniqueFrozenset([
421
  DT_PLAIN,
422
  DT_BLOCK,
423
  ])
424

    
425
# the set of disk templates that *must* use adoption
426
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
427

    
428
# the set of disk templates that allow migrations
429
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
430

    
431
# the set of file based disk templates
432
DTS_FILEBASED = compat.UniqueFrozenset([
433
  DT_FILE,
434
  DT_SHARED_FILE,
435
  ])
436

    
437
# the set of disk templates that are supported by exclusive_storage
438
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
439

    
440
# templates for which we don't perform checks on free space
441
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
442
  DT_FILE,
443
  DT_SHARED_FILE,
444
  DT_RBD,
445
  DT_EXT,
446
  ])
447

    
448
# logical disk types
449
LD_LV = "lvm"
450
LD_DRBD8 = "drbd8"
451
LD_FILE = "file"
452
LD_BLOCKDEV = "blockdev"
453
LD_RBD = "rbd"
454
LD_EXT = "ext"
455
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
456
  LD_LV,
457
  LD_DRBD8,
458
  LD_FILE,
459
  LD_BLOCKDEV,
460
  LD_RBD,
461
  LD_EXT,
462
  ])
463

    
464
LDS_BLOCK = compat.UniqueFrozenset([
465
  LD_LV,
466
  LD_DRBD8,
467
  LD_BLOCKDEV,
468
  LD_RBD,
469
  LD_EXT,
470
  ])
471

    
472
# drbd constants
473
DRBD_HMAC_ALG = "md5"
474
DRBD_NET_PROTOCOL = "C"
475
DRBD_STATUS_FILE = "/proc/drbd"
476

    
477
#: Size of DRBD meta block device
478
DRBD_META_SIZE = 128
479

    
480
# drbd barrier types
481
DRBD_B_NONE = "n"
482
DRBD_B_DISK_BARRIERS = "b"
483
DRBD_B_DISK_DRAIN = "d"
484
DRBD_B_DISK_FLUSH = "f"
485

    
486
# Valid barrier combinations: "n" or any non-null subset of "bfd"
487
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
488
  frozenset([DRBD_B_NONE]),
489
  frozenset([DRBD_B_DISK_BARRIERS]),
490
  frozenset([DRBD_B_DISK_DRAIN]),
491
  frozenset([DRBD_B_DISK_FLUSH]),
492
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
493
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
494
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
495
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
496
  ])
497

    
498
# rbd tool command
499
RBD_CMD = "rbd"
500

    
501
# file backend driver
502
FD_LOOP = "loop"
503
FD_BLKTAP = "blktap"
504

    
505
# the set of drbd-like disk types
506
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
507

    
508
# disk access mode
509
DISK_RDONLY = "ro"
510
DISK_RDWR = "rw"
511
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
512

    
513
# disk replacement mode
514
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
515
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
516
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
517
REPLACE_DISK_AUTO = "replace_auto"
518
REPLACE_MODES = compat.UniqueFrozenset([
519
  REPLACE_DISK_PRI,
520
  REPLACE_DISK_SEC,
521
  REPLACE_DISK_CHG,
522
  REPLACE_DISK_AUTO,
523
  ])
524

    
525
# Instance export mode
526
EXPORT_MODE_LOCAL = "local"
527
EXPORT_MODE_REMOTE = "remote"
528
EXPORT_MODES = compat.UniqueFrozenset([
529
  EXPORT_MODE_LOCAL,
530
  EXPORT_MODE_REMOTE,
531
  ])
532

    
533
# instance creation modes
534
INSTANCE_CREATE = "create"
535
INSTANCE_IMPORT = "import"
536
INSTANCE_REMOTE_IMPORT = "remote-import"
537
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
538
  INSTANCE_CREATE,
539
  INSTANCE_IMPORT,
540
  INSTANCE_REMOTE_IMPORT,
541
  ])
542

    
543
# Remote import/export handshake message and version
544
RIE_VERSION = 0
545
RIE_HANDSHAKE = "Hi, I'm Ganeti"
546

    
547
# Remote import/export certificate validity in seconds
548
RIE_CERT_VALIDITY = 24 * 60 * 60
549

    
550
# Overall timeout for establishing connection
551
RIE_CONNECT_TIMEOUT = 180
552

    
553
# Export only: how long to wait per connection attempt (seconds)
554
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
555

    
556
# Export only: number of attempts to connect
557
RIE_CONNECT_RETRIES = 10
558

    
559
#: Give child process up to 5 seconds to exit after sending a signal
560
CHILD_LINGER_TIMEOUT = 5.0
561

    
562
DISK_TEMPLATES = compat.UniqueFrozenset([
563
  DT_DISKLESS,
564
  DT_PLAIN,
565
  DT_DRBD8,
566
  DT_FILE,
567
  DT_SHARED_FILE,
568
  DT_BLOCK,
569
  DT_RBD,
570
  DT_EXT
571
  ])
572

    
573
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
574

    
575
# import/export config options
576
INISECT_EXP = "export"
577
INISECT_INS = "instance"
578
INISECT_HYP = "hypervisor"
579
INISECT_BEP = "backend"
580
INISECT_OSP = "os"
581

    
582
# dynamic device modification
583
DDM_ADD = "add"
584
DDM_MODIFY = "modify"
585
DDM_REMOVE = "remove"
586
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
587
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
588
  DDM_MODIFY,
589
  ]))
590
# TODO: DDM_SWAP, DDM_MOVE?
591

    
592
# common exit codes
593
EXIT_SUCCESS = 0
594
EXIT_FAILURE = 1
595
EXIT_NOTCLUSTER = 5
596
EXIT_NOTMASTER = 11
597
EXIT_NODESETUP_ERROR = 12
598
EXIT_CONFIRMATION = 13 # need user confirmation
599

    
600
#: Exit code for query operations with unknown fields
601
EXIT_UNKNOWN_FIELD = 14
602

    
603
# tags
604
TAG_CLUSTER = "cluster"
605
TAG_NODEGROUP = "nodegroup"
606
TAG_NODE = "node"
607
TAG_INSTANCE = "instance"
608
TAG_NETWORK = "network"
609
VALID_TAG_TYPES = compat.UniqueFrozenset([
610
  TAG_CLUSTER,
611
  TAG_NODEGROUP,
612
  TAG_NODE,
613
  TAG_INSTANCE,
614
  TAG_NETWORK,
615
  ])
616
MAX_TAG_LEN = 128
617
MAX_TAGS_PER_OBJ = 4096
618

    
619
# others
620
DEFAULT_BRIDGE = "xen-br0"
621
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
622
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
623
IP4_ADDRESS_ANY = "0.0.0.0"
624
IP6_ADDRESS_LOCALHOST = "::1"
625
IP6_ADDRESS_ANY = "::"
626
IP4_VERSION = 4
627
IP6_VERSION = 6
628
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
629
# for export to htools
630
IP4_FAMILY = socket.AF_INET
631
IP6_FAMILY = socket.AF_INET6
632

    
633
TCP_PING_TIMEOUT = 10
634
DEFAULT_VG = "xenvg"
635
DEFAULT_DRBD_HELPER = "/bin/true"
636
MIN_VG_SIZE = 20480
637
DEFAULT_MAC_PREFIX = "aa:00:00"
638
# default maximum instance wait time, in seconds.
639
DEFAULT_SHUTDOWN_TIMEOUT = 120
640
NODE_MAX_CLOCK_SKEW = 150
641
# Time for an intra-cluster disk transfer to wait for a connection
642
DISK_TRANSFER_CONNECT_TIMEOUT = 60
643
# Disk index separator
644
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
645
IP_COMMAND_PATH = _autoconf.IP_PATH
646

    
647
#: Key for job IDs in opcode result
648
JOB_IDS_KEY = "jobs"
649

    
650
# runparts results
651
(RUNPARTS_SKIP,
652
 RUNPARTS_RUN,
653
 RUNPARTS_ERR) = range(3)
654

    
655
RUNPARTS_STATUS = compat.UniqueFrozenset([
656
  RUNPARTS_SKIP,
657
  RUNPARTS_RUN,
658
  RUNPARTS_ERR,
659
  ])
660

    
661
# RPC constants
662
(RPC_ENCODING_NONE,
663
 RPC_ENCODING_ZLIB_BASE64) = range(2)
664

    
665
# Various time constants for the timeout table
666
RPC_TMO_URGENT = 60 # one minute
667
RPC_TMO_FAST = 5 * 60 # five minutes
668
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
669
RPC_TMO_SLOW = 3600 # one hour
670
RPC_TMO_4HRS = 4 * 3600
671
RPC_TMO_1DAY = 86400
672

    
673
# Timeout for connecting to nodes (seconds)
674
RPC_CONNECT_TIMEOUT = 5
675

    
676
# os related constants
677
OS_SCRIPT_CREATE = "create"
678
OS_SCRIPT_IMPORT = "import"
679
OS_SCRIPT_EXPORT = "export"
680
OS_SCRIPT_RENAME = "rename"
681
OS_SCRIPT_VERIFY = "verify"
682
OS_SCRIPTS = compat.UniqueFrozenset([
683
  OS_SCRIPT_CREATE,
684
  OS_SCRIPT_IMPORT,
685
  OS_SCRIPT_EXPORT,
686
  OS_SCRIPT_RENAME,
687
  OS_SCRIPT_VERIFY,
688
  ])
689

    
690
OS_API_FILE = "ganeti_api_version"
691
OS_VARIANTS_FILE = "variants.list"
692
OS_PARAMETERS_FILE = "parameters.list"
693

    
694
OS_VALIDATE_PARAMETERS = "parameters"
695
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
696

    
697
# External Storage (ES) related constants
698
ES_ACTION_CREATE = "create"
699
ES_ACTION_REMOVE = "remove"
700
ES_ACTION_GROW = "grow"
701
ES_ACTION_ATTACH = "attach"
702
ES_ACTION_DETACH = "detach"
703
ES_ACTION_SETINFO = "setinfo"
704
ES_ACTION_VERIFY = "verify"
705

    
706
ES_SCRIPT_CREATE = ES_ACTION_CREATE
707
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
708
ES_SCRIPT_GROW = ES_ACTION_GROW
709
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
710
ES_SCRIPT_DETACH = ES_ACTION_DETACH
711
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
712
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
713
ES_SCRIPTS = frozenset([
714
  ES_SCRIPT_CREATE,
715
  ES_SCRIPT_REMOVE,
716
  ES_SCRIPT_GROW,
717
  ES_SCRIPT_ATTACH,
718
  ES_SCRIPT_DETACH,
719
  ES_SCRIPT_SETINFO,
720
  ES_SCRIPT_VERIFY
721
  ])
722

    
723
ES_PARAMETERS_FILE = "parameters.list"
724

    
725
# ssh constants
726
SSH = "ssh"
727
SCP = "scp"
728

    
729
# reboot types
730
INSTANCE_REBOOT_SOFT = "soft"
731
INSTANCE_REBOOT_HARD = "hard"
732
INSTANCE_REBOOT_FULL = "full"
733

    
734
REBOOT_TYPES = compat.UniqueFrozenset([
735
  INSTANCE_REBOOT_SOFT,
736
  INSTANCE_REBOOT_HARD,
737
  INSTANCE_REBOOT_FULL,
738
  ])
739

    
740
# instance reboot behaviors
741
INSTANCE_REBOOT_ALLOWED = "reboot"
742
INSTANCE_REBOOT_EXIT = "exit"
743

    
744
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
745
  INSTANCE_REBOOT_ALLOWED,
746
  INSTANCE_REBOOT_EXIT,
747
  ])
748

    
749
VTYPE_STRING = "string"
750
VTYPE_MAYBE_STRING = "maybe-string"
751
VTYPE_BOOL = "bool"
752
VTYPE_SIZE = "size" # size, in MiBs
753
VTYPE_INT = "int"
754
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
755
  VTYPE_STRING,
756
  VTYPE_MAYBE_STRING,
757
  VTYPE_BOOL,
758
  VTYPE_SIZE,
759
  VTYPE_INT,
760
  ])
761

    
762
# Constant representing that the user does not specify any IP version
763
IFACE_NO_IP_VERSION_SPECIFIED = 0
764

    
765
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
766
  75,
767
  110,
768
  300,
769
  600,
770
  1200,
771
  1800,
772
  2400,
773
  4800,
774
  9600,
775
  14400,
776
  19200,
777
  28800,
778
  38400,
779
  57600,
780
  115200,
781
  230400,
782
  345600,
783
  460800,
784
  ])
785

    
786
# HV parameter names (global namespace)
787
HV_BOOT_ORDER = "boot_order"
788
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
789
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
790
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
791
HV_NIC_TYPE = "nic_type"
792
HV_DISK_TYPE = "disk_type"
793
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
794
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
795
HV_VNC_PASSWORD_FILE = "vnc_password_file"
796
HV_VNC_TLS = "vnc_tls"
797
HV_VNC_X509 = "vnc_x509_path"
798
HV_VNC_X509_VERIFY = "vnc_x509_verify"
799
HV_KVM_SPICE_BIND = "spice_bind"
800
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
801
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
802
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
803
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
804
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
805
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
806
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
807
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
808
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
809
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
810
HV_ACPI = "acpi"
811
HV_PAE = "pae"
812
HV_USE_BOOTLOADER = "use_bootloader"
813
HV_BOOTLOADER_ARGS = "bootloader_args"
814
HV_BOOTLOADER_PATH = "bootloader_path"
815
HV_KERNEL_ARGS = "kernel_args"
816
HV_KERNEL_PATH = "kernel_path"
817
HV_INITRD_PATH = "initrd_path"
818
HV_ROOT_PATH = "root_path"
819
HV_SERIAL_CONSOLE = "serial_console"
820
HV_SERIAL_SPEED = "serial_speed"
821
HV_USB_MOUSE = "usb_mouse"
822
HV_KEYMAP = "keymap"
823
HV_DEVICE_MODEL = "device_model"
824
HV_INIT_SCRIPT = "init_script"
825
HV_MIGRATION_PORT = "migration_port"
826
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
827
HV_MIGRATION_DOWNTIME = "migration_downtime"
828
HV_MIGRATION_MODE = "migration_mode"
829
HV_USE_LOCALTIME = "use_localtime"
830
HV_DISK_CACHE = "disk_cache"
831
HV_SECURITY_MODEL = "security_model"
832
HV_SECURITY_DOMAIN = "security_domain"
833
HV_KVM_FLAG = "kvm_flag"
834
HV_VHOST_NET = "vhost_net"
835
HV_KVM_USE_CHROOT = "use_chroot"
836
HV_CPU_MASK = "cpu_mask"
837
HV_MEM_PATH = "mem_path"
838
HV_PASSTHROUGH = "pci_pass"
839
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
840
HV_REBOOT_BEHAVIOR = "reboot_behavior"
841
HV_CPU_TYPE = "cpu_type"
842
HV_CPU_CAP = "cpu_cap"
843
HV_CPU_WEIGHT = "cpu_weight"
844
HV_CPU_CORES = "cpu_cores"
845
HV_CPU_THREADS = "cpu_threads"
846
HV_CPU_SOCKETS = "cpu_sockets"
847
HV_SOUNDHW = "soundhw"
848
HV_USB_DEVICES = "usb_devices"
849
HV_VGA = "vga"
850
HV_KVM_EXTRA = "kvm_extra"
851
HV_KVM_MACHINE_VERSION = "machine_version"
852
HV_KVM_PATH = "kvm_path"
853

    
854

    
855
HVS_PARAMETER_TYPES = {
856
  HV_KVM_PATH: VTYPE_STRING,
857
  HV_BOOT_ORDER: VTYPE_STRING,
858
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
859
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
860
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
861
  HV_NIC_TYPE: VTYPE_STRING,
862
  HV_DISK_TYPE: VTYPE_STRING,
863
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
864
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
865
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
866
  HV_VNC_TLS: VTYPE_BOOL,
867
  HV_VNC_X509: VTYPE_STRING,
868
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
869
  HV_KVM_SPICE_BIND: VTYPE_STRING,
870
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
871
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
872
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
873
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
874
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
875
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
876
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
877
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
878
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
879
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
880
  HV_ACPI: VTYPE_BOOL,
881
  HV_PAE: VTYPE_BOOL,
882
  HV_USE_BOOTLOADER: VTYPE_BOOL,
883
  HV_BOOTLOADER_PATH: VTYPE_STRING,
884
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
885
  HV_KERNEL_PATH: VTYPE_STRING,
886
  HV_KERNEL_ARGS: VTYPE_STRING,
887
  HV_INITRD_PATH: VTYPE_STRING,
888
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
889
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
890
  HV_SERIAL_SPEED: VTYPE_INT,
891
  HV_USB_MOUSE: VTYPE_STRING,
892
  HV_KEYMAP: VTYPE_STRING,
893
  HV_DEVICE_MODEL: VTYPE_STRING,
894
  HV_INIT_SCRIPT: VTYPE_STRING,
895
  HV_MIGRATION_PORT: VTYPE_INT,
896
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
897
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
898
  HV_MIGRATION_MODE: VTYPE_STRING,
899
  HV_USE_LOCALTIME: VTYPE_BOOL,
900
  HV_DISK_CACHE: VTYPE_STRING,
901
  HV_SECURITY_MODEL: VTYPE_STRING,
902
  HV_SECURITY_DOMAIN: VTYPE_STRING,
903
  HV_KVM_FLAG: VTYPE_STRING,
904
  HV_VHOST_NET: VTYPE_BOOL,
905
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
906
  HV_CPU_MASK: VTYPE_STRING,
907
  HV_MEM_PATH: VTYPE_STRING,
908
  HV_PASSTHROUGH: VTYPE_STRING,
909
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
910
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
911
  HV_CPU_TYPE: VTYPE_STRING,
912
  HV_CPU_CAP: VTYPE_INT,
913
  HV_CPU_WEIGHT: VTYPE_INT,
914
  HV_CPU_CORES: VTYPE_INT,
915
  HV_CPU_THREADS: VTYPE_INT,
916
  HV_CPU_SOCKETS: VTYPE_INT,
917
  HV_SOUNDHW: VTYPE_STRING,
918
  HV_USB_DEVICES: VTYPE_STRING,
919
  HV_VGA: VTYPE_STRING,
920
  HV_KVM_EXTRA: VTYPE_STRING,
921
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
922
  }
923

    
924
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
925

    
926
HVS_PARAMETER_TITLES = {
927
  HV_ACPI: "ACPI",
928
  HV_BOOT_ORDER: "Boot_order",
929
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
930
  HV_DISK_TYPE: "Disk_type",
931
  HV_INITRD_PATH: "Initrd_path",
932
  HV_KERNEL_PATH: "Kernel_path",
933
  HV_NIC_TYPE: "NIC_type",
934
  HV_PAE: "PAE",
935
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
936
  HV_PASSTHROUGH: "pci_pass",
937
  HV_CPU_TYPE: "cpu_type",
938
  }
939

    
940
# Migration statuses
941
HV_MIGRATION_COMPLETED = "completed"
942
HV_MIGRATION_ACTIVE = "active"
943
HV_MIGRATION_FAILED = "failed"
944
HV_MIGRATION_CANCELLED = "cancelled"
945

    
946
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
947
  HV_MIGRATION_COMPLETED,
948
  HV_MIGRATION_ACTIVE,
949
  HV_MIGRATION_FAILED,
950
  HV_MIGRATION_CANCELLED,
951
  ])
952

    
953
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
954
  HV_MIGRATION_FAILED,
955
  HV_MIGRATION_CANCELLED,
956
  ])
957

    
958
# KVM-specific statuses
959
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
960

    
961
# Node info keys
962
HV_NODEINFO_KEY_VERSION = "hv_version"
963

    
964
# Hypervisor state
965
HVST_MEMORY_TOTAL = "mem_total"
966
HVST_MEMORY_NODE = "mem_node"
967
HVST_MEMORY_HV = "mem_hv"
968
HVST_CPU_TOTAL = "cpu_total"
969
HVST_CPU_NODE = "cpu_node"
970

    
971
HVST_DEFAULTS = {
972
  HVST_MEMORY_TOTAL: 0,
973
  HVST_MEMORY_NODE: 0,
974
  HVST_MEMORY_HV: 0,
975
  HVST_CPU_TOTAL: 1,
976
  HVST_CPU_NODE: 1,
977
  }
978

    
979
HVSTS_PARAMETER_TYPES = {
980
  HVST_MEMORY_TOTAL: VTYPE_INT,
981
  HVST_MEMORY_NODE: VTYPE_INT,
982
  HVST_MEMORY_HV: VTYPE_INT,
983
  HVST_CPU_TOTAL: VTYPE_INT,
984
  HVST_CPU_NODE: VTYPE_INT,
985
  }
986

    
987
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
988

    
989
# Disk state
990
DS_DISK_TOTAL = "disk_total"
991
DS_DISK_RESERVED = "disk_reserved"
992
DS_DISK_OVERHEAD = "disk_overhead"
993

    
994
DS_DEFAULTS = {
995
  DS_DISK_TOTAL: 0,
996
  DS_DISK_RESERVED: 0,
997
  DS_DISK_OVERHEAD: 0,
998
  }
999

    
1000
DSS_PARAMETER_TYPES = {
1001
  DS_DISK_TOTAL: VTYPE_INT,
1002
  DS_DISK_RESERVED: VTYPE_INT,
1003
  DS_DISK_OVERHEAD: VTYPE_INT,
1004
  }
1005

    
1006
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1007
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1008

    
1009
# Backend parameter names
1010
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1011
BE_MAXMEM = "maxmem"
1012
BE_MINMEM = "minmem"
1013
BE_VCPUS = "vcpus"
1014
BE_AUTO_BALANCE = "auto_balance"
1015
BE_ALWAYS_FAILOVER = "always_failover"
1016
BE_SPINDLE_USE = "spindle_use"
1017

    
1018
BES_PARAMETER_TYPES = {
1019
  BE_MAXMEM: VTYPE_SIZE,
1020
  BE_MINMEM: VTYPE_SIZE,
1021
  BE_VCPUS: VTYPE_INT,
1022
  BE_AUTO_BALANCE: VTYPE_BOOL,
1023
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1024
  BE_SPINDLE_USE: VTYPE_INT,
1025
  }
1026

    
1027
BES_PARAMETER_TITLES = {
1028
  BE_AUTO_BALANCE: "Auto_balance",
1029
  BE_MAXMEM: "ConfigMaxMem",
1030
  BE_MINMEM: "ConfigMinMem",
1031
  BE_VCPUS: "ConfigVCPUs",
1032
  }
1033

    
1034
BES_PARAMETER_COMPAT = {
1035
  BE_MEMORY: VTYPE_SIZE,
1036
  }
1037
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1038

    
1039
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1040

    
1041
# instance specs
1042
ISPEC_MEM_SIZE = "memory-size"
1043
ISPEC_CPU_COUNT = "cpu-count"
1044
ISPEC_DISK_COUNT = "disk-count"
1045
ISPEC_DISK_SIZE = "disk-size"
1046
ISPEC_NIC_COUNT = "nic-count"
1047
ISPEC_SPINDLE_USE = "spindle-use"
1048

    
1049
ISPECS_PARAMETER_TYPES = {
1050
  ISPEC_MEM_SIZE: VTYPE_INT,
1051
  ISPEC_CPU_COUNT: VTYPE_INT,
1052
  ISPEC_DISK_COUNT: VTYPE_INT,
1053
  ISPEC_DISK_SIZE: VTYPE_INT,
1054
  ISPEC_NIC_COUNT: VTYPE_INT,
1055
  ISPEC_SPINDLE_USE: VTYPE_INT,
1056
  }
1057

    
1058
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1059

    
1060
ISPECS_MIN = "min"
1061
ISPECS_MAX = "max"
1062
ISPECS_STD = "std"
1063
IPOLICY_DTS = "disk-templates"
1064
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1065
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1066

    
1067
IPOLICY_ISPECS = compat.UniqueFrozenset([
1068
  ISPECS_MIN,
1069
  ISPECS_MAX,
1070
  ISPECS_STD,
1071
  ])
1072

    
1073
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1074
  IPOLICY_VCPU_RATIO,
1075
  IPOLICY_SPINDLE_RATIO,
1076
  ])
1077

    
1078
IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
1079
                    IPOLICY_PARAMETERS |
1080
                    frozenset([IPOLICY_DTS]))
1081

    
1082
# Node parameter names
1083
ND_OOB_PROGRAM = "oob_program"
1084
ND_SPINDLE_COUNT = "spindle_count"
1085
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1086

    
1087
NDS_PARAMETER_TYPES = {
1088
  ND_OOB_PROGRAM: VTYPE_STRING,
1089
  ND_SPINDLE_COUNT: VTYPE_INT,
1090
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1091
  }
1092

    
1093
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1094

    
1095
NDS_PARAMETER_TITLES = {
1096
  ND_OOB_PROGRAM: "OutOfBandProgram",
1097
  ND_SPINDLE_COUNT: "SpindleCount",
1098
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1099
  }
1100

    
1101
# Logical Disks parameters
1102
LDP_RESYNC_RATE = "resync-rate"
1103
LDP_STRIPES = "stripes"
1104
LDP_BARRIERS = "disabled-barriers"
1105
LDP_NO_META_FLUSH = "disable-meta-flush"
1106
LDP_DEFAULT_METAVG = "default-metavg"
1107
LDP_DISK_CUSTOM = "disk-custom"
1108
LDP_NET_CUSTOM = "net-custom"
1109
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1110
LDP_PLAN_AHEAD = "c-plan-ahead"
1111
LDP_FILL_TARGET = "c-fill-target"
1112
LDP_DELAY_TARGET = "c-delay-target"
1113
LDP_MAX_RATE = "c-max-rate"
1114
LDP_MIN_RATE = "c-min-rate"
1115
LDP_POOL = "pool"
1116
DISK_LD_TYPES = {
1117
  LDP_RESYNC_RATE: VTYPE_INT,
1118
  LDP_STRIPES: VTYPE_INT,
1119
  LDP_BARRIERS: VTYPE_STRING,
1120
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1121
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1122
  LDP_DISK_CUSTOM: VTYPE_STRING,
1123
  LDP_NET_CUSTOM: VTYPE_STRING,
1124
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1125
  LDP_PLAN_AHEAD: VTYPE_INT,
1126
  LDP_FILL_TARGET: VTYPE_INT,
1127
  LDP_DELAY_TARGET: VTYPE_INT,
1128
  LDP_MAX_RATE: VTYPE_INT,
1129
  LDP_MIN_RATE: VTYPE_INT,
1130
  LDP_POOL: VTYPE_STRING,
1131
  }
1132
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1133

    
1134
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1135
# gnt-group)
1136
DRBD_RESYNC_RATE = "resync-rate"
1137
DRBD_DATA_STRIPES = "data-stripes"
1138
DRBD_META_STRIPES = "meta-stripes"
1139
DRBD_DISK_BARRIERS = "disk-barriers"
1140
DRBD_META_BARRIERS = "meta-barriers"
1141
DRBD_DEFAULT_METAVG = "metavg"
1142
DRBD_DISK_CUSTOM = "disk-custom"
1143
DRBD_NET_CUSTOM = "net-custom"
1144
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1145
DRBD_PLAN_AHEAD = "c-plan-ahead"
1146
DRBD_FILL_TARGET = "c-fill-target"
1147
DRBD_DELAY_TARGET = "c-delay-target"
1148
DRBD_MAX_RATE = "c-max-rate"
1149
DRBD_MIN_RATE = "c-min-rate"
1150
LV_STRIPES = "stripes"
1151
RBD_POOL = "pool"
1152
DISK_DT_TYPES = {
1153
  DRBD_RESYNC_RATE: VTYPE_INT,
1154
  DRBD_DATA_STRIPES: VTYPE_INT,
1155
  DRBD_META_STRIPES: VTYPE_INT,
1156
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1157
  DRBD_META_BARRIERS: VTYPE_BOOL,
1158
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1159
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1160
  DRBD_NET_CUSTOM: VTYPE_STRING,
1161
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1162
  DRBD_PLAN_AHEAD: VTYPE_INT,
1163
  DRBD_FILL_TARGET: VTYPE_INT,
1164
  DRBD_DELAY_TARGET: VTYPE_INT,
1165
  DRBD_MAX_RATE: VTYPE_INT,
1166
  DRBD_MIN_RATE: VTYPE_INT,
1167
  LV_STRIPES: VTYPE_INT,
1168
  RBD_POOL: VTYPE_STRING,
1169
  }
1170

    
1171
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1172

    
1173
# OOB supported commands
1174
OOB_POWER_ON = "power-on"
1175
OOB_POWER_OFF = "power-off"
1176
OOB_POWER_CYCLE = "power-cycle"
1177
OOB_POWER_STATUS = "power-status"
1178
OOB_HEALTH = "health"
1179

    
1180
OOB_COMMANDS = compat.UniqueFrozenset([
1181
  OOB_POWER_ON,
1182
  OOB_POWER_OFF,
1183
  OOB_POWER_CYCLE,
1184
  OOB_POWER_STATUS,
1185
  OOB_HEALTH,
1186
  ])
1187

    
1188
OOB_POWER_STATUS_POWERED = "powered"
1189

    
1190
OOB_TIMEOUT = 60 # 60 seconds
1191
OOB_POWER_DELAY = 2.0 # 2 seconds
1192

    
1193
OOB_STATUS_OK = "OK"
1194
OOB_STATUS_WARNING = "WARNING"
1195
OOB_STATUS_CRITICAL = "CRITICAL"
1196
OOB_STATUS_UNKNOWN = "UNKNOWN"
1197

    
1198
OOB_STATUSES = compat.UniqueFrozenset([
1199
  OOB_STATUS_OK,
1200
  OOB_STATUS_WARNING,
1201
  OOB_STATUS_CRITICAL,
1202
  OOB_STATUS_UNKNOWN,
1203
  ])
1204

    
1205
# Instance Parameters Profile
1206
PP_DEFAULT = "default"
1207

    
1208
# NIC_* constants are used inside the ganeti config
1209
NIC_MODE = "mode"
1210
NIC_LINK = "link"
1211

    
1212
NIC_MODE_BRIDGED = "bridged"
1213
NIC_MODE_ROUTED = "routed"
1214
NIC_MODE_OVS = "openvswitch"
1215
NIC_IP_POOL = "pool"
1216

    
1217
NIC_VALID_MODES = compat.UniqueFrozenset([
1218
  NIC_MODE_BRIDGED,
1219
  NIC_MODE_ROUTED,
1220
  NIC_MODE_OVS,
1221
  ])
1222

    
1223
RESERVE_ACTION = "reserve"
1224
RELEASE_ACTION = "release"
1225

    
1226
NICS_PARAMETER_TYPES = {
1227
  NIC_MODE: VTYPE_STRING,
1228
  NIC_LINK: VTYPE_STRING,
1229
  }
1230

    
1231
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1232

    
1233
# IDISK_* constants are used in opcodes, to create/change disks
1234
IDISK_SIZE = "size"
1235
IDISK_MODE = "mode"
1236
IDISK_ADOPT = "adopt"
1237
IDISK_VG = "vg"
1238
IDISK_METAVG = "metavg"
1239
IDISK_PROVIDER = "provider"
1240
IDISK_PARAMS_TYPES = {
1241
  IDISK_SIZE: VTYPE_SIZE,
1242
  IDISK_MODE: VTYPE_STRING,
1243
  IDISK_ADOPT: VTYPE_STRING,
1244
  IDISK_VG: VTYPE_STRING,
1245
  IDISK_METAVG: VTYPE_STRING,
1246
  IDISK_PROVIDER: VTYPE_STRING,
1247
  }
1248
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1249

    
1250
# INIC_* constants are used in opcodes, to create/change nics
1251
INIC_MAC = "mac"
1252
INIC_IP = "ip"
1253
INIC_MODE = "mode"
1254
INIC_LINK = "link"
1255
INIC_NETWORK = "network"
1256
INIC_PARAMS_TYPES = {
1257
  INIC_IP: VTYPE_MAYBE_STRING,
1258
  INIC_LINK: VTYPE_STRING,
1259
  INIC_MAC: VTYPE_STRING,
1260
  INIC_MODE: VTYPE_STRING,
1261
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1262
  }
1263
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1264

    
1265
# Hypervisor constants
1266
HT_XEN_PVM = "xen-pvm"
1267
HT_FAKE = "fake"
1268
HT_XEN_HVM = "xen-hvm"
1269
HT_KVM = "kvm"
1270
HT_CHROOT = "chroot"
1271
HT_LXC = "lxc"
1272
HYPER_TYPES = compat.UniqueFrozenset([
1273
  HT_XEN_PVM,
1274
  HT_FAKE,
1275
  HT_XEN_HVM,
1276
  HT_KVM,
1277
  HT_CHROOT,
1278
  HT_LXC,
1279
  ])
1280
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1281

    
1282
VNC_BASE_PORT = 5900
1283
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1284

    
1285
# NIC types
1286
HT_NIC_RTL8139 = "rtl8139"
1287
HT_NIC_NE2K_PCI = "ne2k_pci"
1288
HT_NIC_NE2K_ISA = "ne2k_isa"
1289
HT_NIC_I82551 = "i82551"
1290
HT_NIC_I85557B = "i82557b"
1291
HT_NIC_I8259ER = "i82559er"
1292
HT_NIC_PCNET = "pcnet"
1293
HT_NIC_E1000 = "e1000"
1294
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1295

    
1296
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1297
  HT_NIC_RTL8139,
1298
  HT_NIC_NE2K_PCI,
1299
  HT_NIC_E1000,
1300
  HT_NIC_NE2K_ISA,
1301
  HT_NIC_PARAVIRTUAL,
1302
  ])
1303
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1304
  HT_NIC_RTL8139,
1305
  HT_NIC_NE2K_PCI,
1306
  HT_NIC_NE2K_ISA,
1307
  HT_NIC_I82551,
1308
  HT_NIC_I85557B,
1309
  HT_NIC_I8259ER,
1310
  HT_NIC_PCNET,
1311
  HT_NIC_E1000,
1312
  HT_NIC_PARAVIRTUAL,
1313
  ])
1314

    
1315
# Disk types
1316
HT_DISK_IOEMU = "ioemu"
1317
HT_DISK_IDE = "ide"
1318
HT_DISK_SCSI = "scsi"
1319
HT_DISK_SD = "sd"
1320
HT_DISK_MTD = "mtd"
1321
HT_DISK_PFLASH = "pflash"
1322

    
1323
HT_CACHE_DEFAULT = "default"
1324
HT_CACHE_NONE = "none"
1325
HT_CACHE_WTHROUGH = "writethrough"
1326
HT_CACHE_WBACK = "writeback"
1327
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1328
  HT_CACHE_DEFAULT,
1329
  HT_CACHE_NONE,
1330
  HT_CACHE_WTHROUGH,
1331
  HT_CACHE_WBACK,
1332
  ])
1333

    
1334
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1335
  HT_DISK_PARAVIRTUAL,
1336
  HT_DISK_IOEMU,
1337
  ])
1338
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1339
  HT_DISK_PARAVIRTUAL,
1340
  HT_DISK_IDE,
1341
  HT_DISK_SCSI,
1342
  HT_DISK_SD,
1343
  HT_DISK_MTD,
1344
  HT_DISK_PFLASH,
1345
  ])
1346

    
1347
# Mouse types:
1348
HT_MOUSE_MOUSE = "mouse"
1349
HT_MOUSE_TABLET = "tablet"
1350

    
1351
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1352
  HT_MOUSE_MOUSE,
1353
  HT_MOUSE_TABLET,
1354
  ])
1355

    
1356
# Boot order
1357
HT_BO_FLOPPY = "floppy"
1358
HT_BO_CDROM = "cdrom"
1359
HT_BO_DISK = "disk"
1360
HT_BO_NETWORK = "network"
1361

    
1362
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1363
  HT_BO_FLOPPY,
1364
  HT_BO_CDROM,
1365
  HT_BO_DISK,
1366
  HT_BO_NETWORK,
1367
  ])
1368

    
1369
# SPICE lossless image compression options
1370
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1371
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1372
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1373
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1374
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1375
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1376

    
1377
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1378
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1379
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1380
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1381
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1382
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1383
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1384
  ])
1385

    
1386
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1387
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1388
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1389
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1390

    
1391
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1392
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1393
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1394
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1395
  ])
1396

    
1397
# SPICE video stream detection
1398
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1399
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1400
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1401

    
1402
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1403
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1404
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1405
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1406
  ])
1407

    
1408
# Security models
1409
HT_SM_NONE = "none"
1410
HT_SM_USER = "user"
1411
HT_SM_POOL = "pool"
1412

    
1413
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1414
  HT_SM_NONE,
1415
  HT_SM_USER,
1416
  HT_SM_POOL,
1417
  ])
1418

    
1419
# Kvm flag values
1420
HT_KVM_ENABLED = "enabled"
1421
HT_KVM_DISABLED = "disabled"
1422

    
1423
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1424

    
1425
# Migration type
1426
HT_MIGRATION_LIVE = "live"
1427
HT_MIGRATION_NONLIVE = "non-live"
1428
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1429
  HT_MIGRATION_LIVE,
1430
  HT_MIGRATION_NONLIVE,
1431
  ])
1432

    
1433
# Cluster Verify steps
1434
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1435
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1436

    
1437
# Cluster Verify error classes
1438
CV_TCLUSTER = "cluster"
1439
CV_TGROUP = "group"
1440
CV_TNODE = "node"
1441
CV_TINSTANCE = "instance"
1442

    
1443
# Cluster Verify error codes and documentation
1444
CV_ECLUSTERCFG = \
1445
  (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1446
CV_ECLUSTERCERT = \
1447
  (CV_TCLUSTER, "ECLUSTERCERT",
1448
   "Cluster certificate files verification failure")
1449
CV_ECLUSTERFILECHECK = \
1450
  (CV_TCLUSTER, "ECLUSTERFILECHECK",
1451
   "Cluster configuration verification failure")
1452
CV_ECLUSTERDANGLINGNODES = \
1453
  (CV_TNODE, "ECLUSTERDANGLINGNODES",
1454
   "Some nodes belong to non-existing groups")
1455
CV_ECLUSTERDANGLINGINST = \
1456
  (CV_TNODE, "ECLUSTERDANGLINGINST",
1457
   "Some instances have a non-existing primary node")
1458
CV_EGROUPDIFFERENTPVSIZE = \
1459
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1460
CV_EINSTANCEBADNODE = \
1461
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1462
   "Instance marked as running lives on an offline node")
1463
CV_EINSTANCEDOWN = \
1464
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1465
CV_EINSTANCELAYOUT = \
1466
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1467
CV_EINSTANCEMISSINGDISK = \
1468
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1469
CV_EINSTANCEFAULTYDISK = \
1470
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1471
   "Impossible to retrieve status for a disk")
1472
CV_EINSTANCEWRONGNODE = \
1473
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1474
CV_EINSTANCESPLITGROUPS = \
1475
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1476
   "Instance with primary and secondary nodes in different groups")
1477
CV_EINSTANCEPOLICY = \
1478
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1479
   "Instance does not meet policy")
1480
CV_EINSTANCEUNSUITABLENODE = \
1481
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1482
   "Instance running on nodes that are not suitable for it")
1483
CV_ENODEDRBD = \
1484
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1485
CV_ENODEDRBDHELPER = \
1486
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1487
CV_ENODEFILECHECK = \
1488
  (CV_TNODE, "ENODEFILECHECK",
1489
   "Error retrieving the checksum of the node files")
1490
CV_ENODEHOOKS = \
1491
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1492
CV_ENODEHV = \
1493
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1494
CV_ENODELVM = \
1495
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1496
CV_ENODEN1 = \
1497
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1498
CV_ENODENET = \
1499
  (CV_TNODE, "ENODENET", "Network-related node error")
1500
CV_ENODEOS = \
1501
  (CV_TNODE, "ENODEOS", "OS-related node error")
1502
CV_ENODEORPHANINSTANCE = \
1503
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1504
CV_ENODEORPHANLV = \
1505
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1506
CV_ENODERPC = \
1507
  (CV_TNODE, "ENODERPC",
1508
   "Error during connection to the primary node of an instance")
1509
CV_ENODESSH = \
1510
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1511
CV_ENODEVERSION = \
1512
  (CV_TNODE, "ENODEVERSION",
1513
   "Protocol version mismatch or Ganeti version mismatch")
1514
CV_ENODESETUP = \
1515
  (CV_TNODE, "ENODESETUP", "Node setup error")
1516
CV_ENODETIME = \
1517
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1518
CV_ENODEOOBPATH = \
1519
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1520
CV_ENODEUSERSCRIPTS = \
1521
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1522
CV_ENODEFILESTORAGEPATHS = \
1523
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1524

    
1525
CV_ALL_ECODES = compat.UniqueFrozenset([
1526
  CV_ECLUSTERCFG,
1527
  CV_ECLUSTERCERT,
1528
  CV_ECLUSTERFILECHECK,
1529
  CV_ECLUSTERDANGLINGNODES,
1530
  CV_ECLUSTERDANGLINGINST,
1531
  CV_EINSTANCEBADNODE,
1532
  CV_EINSTANCEDOWN,
1533
  CV_EINSTANCELAYOUT,
1534
  CV_EINSTANCEMISSINGDISK,
1535
  CV_EINSTANCEFAULTYDISK,
1536
  CV_EINSTANCEWRONGNODE,
1537
  CV_EINSTANCESPLITGROUPS,
1538
  CV_EINSTANCEPOLICY,
1539
  CV_ENODEDRBD,
1540
  CV_ENODEDRBDHELPER,
1541
  CV_ENODEFILECHECK,
1542
  CV_ENODEHOOKS,
1543
  CV_ENODEHV,
1544
  CV_ENODELVM,
1545
  CV_ENODEN1,
1546
  CV_ENODENET,
1547
  CV_ENODEOS,
1548
  CV_ENODEORPHANINSTANCE,
1549
  CV_ENODEORPHANLV,
1550
  CV_ENODERPC,
1551
  CV_ENODESSH,
1552
  CV_ENODEVERSION,
1553
  CV_ENODESETUP,
1554
  CV_ENODETIME,
1555
  CV_ENODEOOBPATH,
1556
  CV_ENODEUSERSCRIPTS,
1557
  CV_ENODEFILESTORAGEPATHS,
1558
  ])
1559

    
1560
CV_ALL_ECODES_STRINGS = \
1561
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1562

    
1563
# Node verify constants
1564
NV_BRIDGES = "bridges"
1565
NV_DRBDHELPER = "drbd-helper"
1566
NV_DRBDLIST = "drbd-list"
1567
NV_EXCLUSIVEPVS = "exclusive-pvs"
1568
NV_FILELIST = "filelist"
1569
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1570
NV_HVINFO = "hvinfo"
1571
NV_HVPARAMS = "hvparms"
1572
NV_HYPERVISOR = "hypervisor"
1573
NV_INSTANCELIST = "instancelist"
1574
NV_LVLIST = "lvlist"
1575
NV_MASTERIP = "master-ip"
1576
NV_NODELIST = "nodelist"
1577
NV_NODENETTEST = "node-net-test"
1578
NV_NODESETUP = "nodesetup"
1579
NV_OOB_PATHS = "oob-paths"
1580
NV_OSLIST = "oslist"
1581
NV_PVLIST = "pvlist"
1582
NV_TIME = "time"
1583
NV_USERSCRIPTS = "user-scripts"
1584
NV_VERSION = "version"
1585
NV_VGLIST = "vglist"
1586
NV_VMNODES = "vmnodes"
1587

    
1588
# Instance status
1589
INSTST_RUNNING = "running"
1590
INSTST_ADMINDOWN = "ADMIN_down"
1591
INSTST_ADMINOFFLINE = "ADMIN_offline"
1592
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1593
INSTST_NODEDOWN = "ERROR_nodedown"
1594
INSTST_WRONGNODE = "ERROR_wrongnode"
1595
INSTST_ERRORUP = "ERROR_up"
1596
INSTST_ERRORDOWN = "ERROR_down"
1597
INSTST_ALL = compat.UniqueFrozenset([
1598
  INSTST_RUNNING,
1599
  INSTST_ADMINDOWN,
1600
  INSTST_ADMINOFFLINE,
1601
  INSTST_NODEOFFLINE,
1602
  INSTST_NODEDOWN,
1603
  INSTST_WRONGNODE,
1604
  INSTST_ERRORUP,
1605
  INSTST_ERRORDOWN,
1606
  ])
1607

    
1608
# Admin states
1609
ADMINST_UP = "up"
1610
ADMINST_DOWN = "down"
1611
ADMINST_OFFLINE = "offline"
1612
ADMINST_ALL = compat.UniqueFrozenset([
1613
  ADMINST_UP,
1614
  ADMINST_DOWN,
1615
  ADMINST_OFFLINE,
1616
  ])
1617

    
1618
# Node roles
1619
NR_REGULAR = "R"
1620
NR_MASTER = "M"
1621
NR_MCANDIDATE = "C"
1622
NR_DRAINED = "D"
1623
NR_OFFLINE = "O"
1624
NR_ALL = compat.UniqueFrozenset([
1625
  NR_REGULAR,
1626
  NR_MASTER,
1627
  NR_MCANDIDATE,
1628
  NR_DRAINED,
1629
  NR_OFFLINE,
1630
  ])
1631

    
1632
# SSL certificate check constants (in days)
1633
SSL_CERT_EXPIRATION_WARN = 30
1634
SSL_CERT_EXPIRATION_ERROR = 7
1635

    
1636
# Allocator framework constants
1637
IALLOCATOR_VERSION = 2
1638
IALLOCATOR_DIR_IN = "in"
1639
IALLOCATOR_DIR_OUT = "out"
1640
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1641
  IALLOCATOR_DIR_IN,
1642
  IALLOCATOR_DIR_OUT,
1643
  ])
1644
IALLOCATOR_MODE_ALLOC = "allocate"
1645
IALLOCATOR_MODE_RELOC = "relocate"
1646
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1647
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1648
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1649
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1650
  IALLOCATOR_MODE_ALLOC,
1651
  IALLOCATOR_MODE_RELOC,
1652
  IALLOCATOR_MODE_CHG_GROUP,
1653
  IALLOCATOR_MODE_NODE_EVAC,
1654
  IALLOCATOR_MODE_MULTI_ALLOC,
1655
  ])
1656
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1657
DEFAULT_IALLOCATOR_SHORTCUT = "."
1658

    
1659
IALLOCATOR_NEVAC_PRI = "primary-only"
1660
IALLOCATOR_NEVAC_SEC = "secondary-only"
1661
IALLOCATOR_NEVAC_ALL = "all"
1662
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1663
  IALLOCATOR_NEVAC_PRI,
1664
  IALLOCATOR_NEVAC_SEC,
1665
  IALLOCATOR_NEVAC_ALL,
1666
  ])
1667

    
1668
# Node evacuation
1669
NODE_EVAC_PRI = "primary-only"
1670
NODE_EVAC_SEC = "secondary-only"
1671
NODE_EVAC_ALL = "all"
1672
NODE_EVAC_MODES = compat.UniqueFrozenset([
1673
  NODE_EVAC_PRI,
1674
  NODE_EVAC_SEC,
1675
  NODE_EVAC_ALL,
1676
  ])
1677

    
1678
# Job queue
1679
JOB_QUEUE_VERSION = 1
1680
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1681

    
1682
JOB_ID_TEMPLATE = r"\d+"
1683
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1684

    
1685
# unchanged job return
1686
JOB_NOTCHANGED = "nochange"
1687

    
1688
# Job status
1689
JOB_STATUS_QUEUED = "queued"
1690
JOB_STATUS_WAITING = "waiting"
1691
JOB_STATUS_CANCELING = "canceling"
1692
JOB_STATUS_RUNNING = "running"
1693
JOB_STATUS_CANCELED = "canceled"
1694
JOB_STATUS_SUCCESS = "success"
1695
JOB_STATUS_ERROR = "error"
1696
JOBS_PENDING = compat.UniqueFrozenset([
1697
  JOB_STATUS_QUEUED,
1698
  JOB_STATUS_WAITING,
1699
  JOB_STATUS_CANCELING,
1700
  ])
1701
JOBS_FINALIZED = compat.UniqueFrozenset([
1702
  JOB_STATUS_CANCELED,
1703
  JOB_STATUS_SUCCESS,
1704
  JOB_STATUS_ERROR,
1705
  ])
1706
JOB_STATUS_ALL = compat.UniqueFrozenset([
1707
  JOB_STATUS_RUNNING,
1708
  ]) | JOBS_PENDING | JOBS_FINALIZED
1709

    
1710
# OpCode status
1711
# not yet finalized
1712
OP_STATUS_QUEUED = "queued"
1713
OP_STATUS_WAITING = "waiting"
1714
OP_STATUS_CANCELING = "canceling"
1715
OP_STATUS_RUNNING = "running"
1716
# finalized
1717
OP_STATUS_CANCELED = "canceled"
1718
OP_STATUS_SUCCESS = "success"
1719
OP_STATUS_ERROR = "error"
1720
OPS_FINALIZED = compat.UniqueFrozenset([
1721
  OP_STATUS_CANCELED,
1722
  OP_STATUS_SUCCESS,
1723
  OP_STATUS_ERROR,
1724
  ])
1725

    
1726
# OpCode priority
1727
OP_PRIO_LOWEST = +19
1728
OP_PRIO_HIGHEST = -20
1729

    
1730
OP_PRIO_LOW = +10
1731
OP_PRIO_NORMAL = 0
1732
OP_PRIO_HIGH = -10
1733

    
1734
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1735
  OP_PRIO_LOW,
1736
  OP_PRIO_NORMAL,
1737
  OP_PRIO_HIGH,
1738
  ])
1739

    
1740
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1741

    
1742
# Lock recalculate mode
1743
LOCKS_REPLACE = "replace"
1744
LOCKS_APPEND = "append"
1745

    
1746
# Lock timeout (sum) before we should go into blocking acquire (still
1747
# can be reset by priority change); computed as max time (10 hours)
1748
# before we should actually go into blocking acquire given that we
1749
# start from default priority level; in seconds
1750
# TODO
1751
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1752
LOCK_ATTEMPTS_MAXWAIT = 15.0
1753
LOCK_ATTEMPTS_MINWAIT = 1.0
1754

    
1755
# Execution log types
1756
ELOG_MESSAGE = "message"
1757
ELOG_REMOTE_IMPORT = "remote-import"
1758
ELOG_JQUEUE_TEST = "jqueue-test"
1759

    
1760
# /etc/hosts modification
1761
ETC_HOSTS_ADD = "add"
1762
ETC_HOSTS_REMOVE = "remove"
1763

    
1764
# Job queue test
1765
JQT_MSGPREFIX = "TESTMSG="
1766
JQT_EXPANDNAMES = "expandnames"
1767
JQT_EXEC = "exec"
1768
JQT_LOGMSG = "logmsg"
1769
JQT_STARTMSG = "startmsg"
1770
JQT_ALL = compat.UniqueFrozenset([
1771
  JQT_EXPANDNAMES,
1772
  JQT_EXEC,
1773
  JQT_LOGMSG,
1774
  JQT_STARTMSG,
1775
  ])
1776

    
1777
# Query resources
1778
QR_CLUSTER = "cluster"
1779
QR_INSTANCE = "instance"
1780
QR_NODE = "node"
1781
QR_LOCK = "lock"
1782
QR_GROUP = "group"
1783
QR_OS = "os"
1784
QR_JOB = "job"
1785
QR_EXPORT = "export"
1786
QR_NETWORK = "network"
1787
QR_EXTSTORAGE = "extstorage"
1788

    
1789
#: List of resources which can be queried using L{opcodes.OpQuery}
1790
QR_VIA_OP = compat.UniqueFrozenset([
1791
  QR_CLUSTER,
1792
  QR_INSTANCE,
1793
  QR_NODE,
1794
  QR_GROUP,
1795
  QR_OS,
1796
  QR_EXPORT,
1797
  QR_NETWORK,
1798
  QR_EXTSTORAGE,
1799
  ])
1800

    
1801
#: List of resources which can be queried using Local UniX Interface
1802
QR_VIA_LUXI = QR_VIA_OP.union([
1803
  QR_LOCK,
1804
  QR_JOB,
1805
  ])
1806

    
1807
#: List of resources which can be queried using RAPI
1808
QR_VIA_RAPI = QR_VIA_LUXI
1809

    
1810
# Query field types
1811
QFT_UNKNOWN = "unknown"
1812
QFT_TEXT = "text"
1813
QFT_BOOL = "bool"
1814
QFT_NUMBER = "number"
1815
QFT_UNIT = "unit"
1816
QFT_TIMESTAMP = "timestamp"
1817
QFT_OTHER = "other"
1818

    
1819
#: All query field types
1820
QFT_ALL = compat.UniqueFrozenset([
1821
  QFT_UNKNOWN,
1822
  QFT_TEXT,
1823
  QFT_BOOL,
1824
  QFT_NUMBER,
1825
  QFT_UNIT,
1826
  QFT_TIMESTAMP,
1827
  QFT_OTHER,
1828
  ])
1829

    
1830
# Query result field status (don't change or reuse values as they're used by
1831
# clients)
1832
#: Normal field status
1833
RS_NORMAL = 0
1834
#: Unknown field
1835
RS_UNKNOWN = 1
1836
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1837
RS_NODATA = 2
1838
#: Value unavailable/unsupported for item; if this field is supported
1839
#: but we cannot get the data for the moment, RS_NODATA or
1840
#: RS_OFFLINE should be used
1841
RS_UNAVAIL = 3
1842
#: Resource marked offline
1843
RS_OFFLINE = 4
1844

    
1845
RS_ALL = compat.UniqueFrozenset([
1846
  RS_NORMAL,
1847
  RS_UNKNOWN,
1848
  RS_NODATA,
1849
  RS_UNAVAIL,
1850
  RS_OFFLINE,
1851
  ])
1852

    
1853
#: Dictionary with special field cases and their verbose/terse formatting
1854
RSS_DESCRIPTION = {
1855
  RS_UNKNOWN: ("(unknown)", "??"),
1856
  RS_NODATA: ("(nodata)", "?"),
1857
  RS_OFFLINE: ("(offline)", "*"),
1858
  RS_UNAVAIL: ("(unavail)", "-"),
1859
  }
1860

    
1861
# max dynamic devices
1862
MAX_NICS = 8
1863
MAX_DISKS = 16
1864

    
1865
# SSCONF file prefix
1866
SSCONF_FILEPREFIX = "ssconf_"
1867
# SSCONF keys
1868
SS_CLUSTER_NAME = "cluster_name"
1869
SS_CLUSTER_TAGS = "cluster_tags"
1870
SS_FILE_STORAGE_DIR = "file_storage_dir"
1871
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
1872
SS_MASTER_CANDIDATES = "master_candidates"
1873
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
1874
SS_MASTER_IP = "master_ip"
1875
SS_MASTER_NETDEV = "master_netdev"
1876
SS_MASTER_NETMASK = "master_netmask"
1877
SS_MASTER_NODE = "master_node"
1878
SS_NODE_LIST = "node_list"
1879
SS_NODE_PRIMARY_IPS = "node_primary_ips"
1880
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
1881
SS_OFFLINE_NODES = "offline_nodes"
1882
SS_ONLINE_NODES = "online_nodes"
1883
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
1884
SS_INSTANCE_LIST = "instance_list"
1885
SS_RELEASE_VERSION = "release_version"
1886
SS_HYPERVISOR_LIST = "hypervisor_list"
1887
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
1888
SS_UID_POOL = "uid_pool"
1889
SS_NODEGROUPS = "nodegroups"
1890
SS_NETWORKS = "networks"
1891

    
1892
SS_FILE_PERMS = 0444
1893

    
1894
# cluster wide default parameters
1895
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1896

    
1897
HVC_DEFAULTS = {
1898
  HT_XEN_PVM: {
1899
    HV_USE_BOOTLOADER: False,
1900
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
1901
    HV_BOOTLOADER_ARGS: "",
1902
    HV_KERNEL_PATH: XEN_KERNEL,
1903
    HV_INITRD_PATH: "",
1904
    HV_ROOT_PATH: "/dev/xvda1",
1905
    HV_KERNEL_ARGS: "ro",
1906
    HV_MIGRATION_PORT: 8002,
1907
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1908
    HV_BLOCKDEV_PREFIX: "sd",
1909
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1910
    HV_CPU_MASK: CPU_PINNING_ALL,
1911
    HV_CPU_CAP: 0,
1912
    HV_CPU_WEIGHT: 256,
1913
    },
1914
  HT_XEN_HVM: {
1915
    HV_BOOT_ORDER: "cd",
1916
    HV_CDROM_IMAGE_PATH: "",
1917
    HV_NIC_TYPE: HT_NIC_RTL8139,
1918
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
1919
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
1920
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
1921
    HV_ACPI: True,
1922
    HV_PAE: True,
1923
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
1924
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
1925
    HV_MIGRATION_PORT: 8002,
1926
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
1927
    HV_USE_LOCALTIME: False,
1928
    HV_BLOCKDEV_PREFIX: "hd",
1929
    HV_PASSTHROUGH: "",
1930
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1931
    HV_CPU_MASK: CPU_PINNING_ALL,
1932
    HV_CPU_CAP: 0,
1933
    HV_CPU_WEIGHT: 256,
1934
    },
1935
  HT_KVM: {
1936
    HV_KVM_PATH: KVM_PATH,
1937
    HV_KERNEL_PATH: KVM_KERNEL,
1938
    HV_INITRD_PATH: "",
1939
    HV_KERNEL_ARGS: "ro",
1940
    HV_ROOT_PATH: "/dev/vda1",
1941
    HV_ACPI: True,
1942
    HV_SERIAL_CONSOLE: True,
1943
    HV_SERIAL_SPEED: 38400,
1944
    HV_VNC_BIND_ADDRESS: "",
1945
    HV_VNC_TLS: False,
1946
    HV_VNC_X509: "",
1947
    HV_VNC_X509_VERIFY: False,
1948
    HV_VNC_PASSWORD_FILE: "",
1949
    HV_KVM_SPICE_BIND: "",
1950
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
1951
    HV_KVM_SPICE_PASSWORD_FILE: "",
1952
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
1953
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
1954
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
1955
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
1956
    HV_KVM_SPICE_AUDIO_COMPR: True,
1957
    HV_KVM_SPICE_USE_TLS: False,
1958
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
1959
    HV_KVM_SPICE_USE_VDAGENT: True,
1960
    HV_KVM_FLOPPY_IMAGE_PATH: "",
1961
    HV_CDROM_IMAGE_PATH: "",
1962
    HV_KVM_CDROM2_IMAGE_PATH: "",
1963
    HV_BOOT_ORDER: HT_BO_DISK,
1964
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
1965
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
1966
    HV_KVM_CDROM_DISK_TYPE: "",
1967
    HV_USB_MOUSE: "",
1968
    HV_KEYMAP: "",
1969
    HV_MIGRATION_PORT: 8102,
1970
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
1971
    HV_MIGRATION_DOWNTIME: 30,  # ms
1972
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
1973
    HV_USE_LOCALTIME: False,
1974
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
1975
    HV_SECURITY_MODEL: HT_SM_NONE,
1976
    HV_SECURITY_DOMAIN: "",
1977
    HV_KVM_FLAG: "",
1978
    HV_VHOST_NET: False,
1979
    HV_KVM_USE_CHROOT: False,
1980
    HV_MEM_PATH: "",
1981
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
1982
    HV_CPU_MASK: CPU_PINNING_ALL,
1983
    HV_CPU_TYPE: "",
1984
    HV_CPU_CORES: 0,
1985
    HV_CPU_THREADS: 0,
1986
    HV_CPU_SOCKETS: 0,
1987
    HV_SOUNDHW: "",
1988
    HV_USB_DEVICES: "",
1989
    HV_VGA: "",
1990
    HV_KVM_EXTRA: "",
1991
    HV_KVM_MACHINE_VERSION: "",
1992
    },
1993
  HT_FAKE: {},
1994
  HT_CHROOT: {
1995
    HV_INIT_SCRIPT: "/ganeti-chroot",
1996
    },
1997
  HT_LXC: {
1998
    HV_CPU_MASK: "",
1999
    },
2000
  }
2001

    
2002
HVC_GLOBALS = compat.UniqueFrozenset([
2003
  HV_MIGRATION_PORT,
2004
  HV_MIGRATION_BANDWIDTH,
2005
  HV_MIGRATION_MODE,
2006
  ])
2007

    
2008
BEC_DEFAULTS = {
2009
  BE_MINMEM: 128,
2010
  BE_MAXMEM: 128,
2011
  BE_VCPUS: 1,
2012
  BE_AUTO_BALANCE: True,
2013
  BE_ALWAYS_FAILOVER: False,
2014
  BE_SPINDLE_USE: 1,
2015
  }
2016

    
2017
NDC_DEFAULTS = {
2018
  ND_OOB_PROGRAM: "",
2019
  ND_SPINDLE_COUNT: 1,
2020
  ND_EXCLUSIVE_STORAGE: False,
2021
  }
2022

    
2023
NDC_GLOBALS = compat.UniqueFrozenset([
2024
  ND_EXCLUSIVE_STORAGE,
2025
  ])
2026

    
2027
DISK_LD_DEFAULTS = {
2028
  LD_DRBD8: {
2029
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2030
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2031
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2032
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2033
    LDP_DISK_CUSTOM: "",
2034
    LDP_NET_CUSTOM: "",
2035
    LDP_DYNAMIC_RESYNC: False,
2036

    
2037
    # The default values for the DRBD dynamic resync speed algorithm
2038
    # are taken from the drbsetup 8.3.11 man page, except for
2039
    # c-plan-ahead (that we don't need to set to 0, because we have a
2040
    # separate option to enable it) and for c-max-rate, that we cap to
2041
    # the default value for the static resync rate.
2042
    LDP_PLAN_AHEAD: 20, # ds
2043
    LDP_FILL_TARGET: 0, # sectors
2044
    LDP_DELAY_TARGET: 1, # ds
2045
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2046
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2047
    },
2048
  LD_LV: {
2049
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2050
    },
2051
  LD_FILE: {},
2052
  LD_BLOCKDEV: {},
2053
  LD_RBD: {
2054
    LDP_POOL: "rbd"
2055
    },
2056
  LD_EXT: {},
2057
  }
2058

    
2059
# readability shortcuts
2060
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2061
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2062

    
2063
DISK_DT_DEFAULTS = {
2064
  DT_PLAIN: {
2065
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2066
    },
2067
  DT_DRBD8: {
2068
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2069
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2070
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2071
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2072
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2073
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2074
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2075
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2076
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2077
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2078
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2079
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2080
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2081
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2082
    },
2083
  DT_DISKLESS: {},
2084
  DT_FILE: {},
2085
  DT_SHARED_FILE: {},
2086
  DT_BLOCK: {},
2087
  DT_RBD: {
2088
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2089
    },
2090
  DT_EXT: {},
2091
  }
2092

    
2093
# we don't want to export the shortcuts
2094
del _LV_DEFAULTS, _DRBD_DEFAULTS
2095

    
2096
NICC_DEFAULTS = {
2097
  NIC_MODE: NIC_MODE_BRIDGED,
2098
  NIC_LINK: DEFAULT_BRIDGE,
2099
  }
2100

    
2101
# All of the following values are quite arbitrarily - there are no
2102
# "good" defaults, these must be customised per-site
2103
IPOLICY_DEFAULTS = {
2104
  ISPECS_MIN: {
2105
    ISPEC_MEM_SIZE: 128,
2106
    ISPEC_CPU_COUNT: 1,
2107
    ISPEC_DISK_COUNT: 1,
2108
    ISPEC_DISK_SIZE: 1024,
2109
    ISPEC_NIC_COUNT: 1,
2110
    ISPEC_SPINDLE_USE: 1,
2111
    },
2112
  ISPECS_MAX: {
2113
    ISPEC_MEM_SIZE: 32768,
2114
    ISPEC_CPU_COUNT: 8,
2115
    ISPEC_DISK_COUNT: MAX_DISKS,
2116
    ISPEC_DISK_SIZE: 1024 * 1024,
2117
    ISPEC_NIC_COUNT: MAX_NICS,
2118
    ISPEC_SPINDLE_USE: 12,
2119
    },
2120
  ISPECS_STD: {
2121
    ISPEC_MEM_SIZE: 128,
2122
    ISPEC_CPU_COUNT: 1,
2123
    ISPEC_DISK_COUNT: 1,
2124
    ISPEC_DISK_SIZE: 1024,
2125
    ISPEC_NIC_COUNT: 1,
2126
    ISPEC_SPINDLE_USE: 1,
2127
    },
2128
  IPOLICY_DTS: DISK_TEMPLATES,
2129
  IPOLICY_VCPU_RATIO: 4.0,
2130
  IPOLICY_SPINDLE_RATIO: 32.0,
2131
  }
2132

    
2133
MASTER_POOL_SIZE_DEFAULT = 10
2134

    
2135
# Exclusive storage:
2136
# Error margin used to compare physical disks
2137
PART_MARGIN = .01
2138
# Space reserved when creating instance disks
2139
PART_RESERVED = .02
2140

    
2141
CONFD_PROTOCOL_VERSION = 1
2142

    
2143
CONFD_REQ_PING = 0
2144
CONFD_REQ_NODE_ROLE_BYNAME = 1
2145
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2146
CONFD_REQ_CLUSTER_MASTER = 3
2147
CONFD_REQ_NODE_PIP_LIST = 4
2148
CONFD_REQ_MC_PIP_LIST = 5
2149
CONFD_REQ_INSTANCES_IPS_LIST = 6
2150
CONFD_REQ_NODE_DRBD = 7
2151
CONFD_REQ_NODE_INSTANCES = 8
2152

    
2153
# Confd request query fields. These are used to narrow down queries.
2154
# These must be strings rather than integers, because json-encoding
2155
# converts them to strings anyway, as they're used as dict-keys.
2156
CONFD_REQQ_LINK = "0"
2157
CONFD_REQQ_IP = "1"
2158
CONFD_REQQ_IPLIST = "2"
2159
CONFD_REQQ_FIELDS = "3"
2160

    
2161
CONFD_REQFIELD_NAME = "0"
2162
CONFD_REQFIELD_IP = "1"
2163
CONFD_REQFIELD_MNODE_PIP = "2"
2164

    
2165
CONFD_REQS = compat.UniqueFrozenset([
2166
  CONFD_REQ_PING,
2167
  CONFD_REQ_NODE_ROLE_BYNAME,
2168
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2169
  CONFD_REQ_CLUSTER_MASTER,
2170
  CONFD_REQ_NODE_PIP_LIST,
2171
  CONFD_REQ_MC_PIP_LIST,
2172
  CONFD_REQ_INSTANCES_IPS_LIST,
2173
  CONFD_REQ_NODE_DRBD,
2174
  ])
2175

    
2176
CONFD_REPL_STATUS_OK = 0
2177
CONFD_REPL_STATUS_ERROR = 1
2178
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2179

    
2180
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2181
  CONFD_REPL_STATUS_OK,
2182
  CONFD_REPL_STATUS_ERROR,
2183
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2184
  ])
2185

    
2186
(CONFD_NODE_ROLE_MASTER,
2187
 CONFD_NODE_ROLE_CANDIDATE,
2188
 CONFD_NODE_ROLE_OFFLINE,
2189
 CONFD_NODE_ROLE_DRAINED,
2190
 CONFD_NODE_ROLE_REGULAR,
2191
 ) = range(5)
2192

    
2193
# A few common errors for confd
2194
CONFD_ERROR_UNKNOWN_ENTRY = 1
2195
CONFD_ERROR_INTERNAL = 2
2196
CONFD_ERROR_ARGUMENT = 3
2197

    
2198
# Each request is "salted" by the current timestamp.
2199
# This constants decides how many seconds of skew to accept.
2200
# TODO: make this a default and allow the value to be more configurable
2201
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2202

    
2203
# When we haven't reloaded the config for more than this amount of
2204
# seconds, we force a test to see if inotify is betraying us. Using a
2205
# prime number to ensure we get less chance of 'same wakeup' with
2206
# other processes.
2207
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2208

    
2209
# If we receive more than one update in this amount of microseconds,
2210
# we move to polling every RATELIMIT seconds, rather than relying on
2211
# inotify, to be able to serve more requests.
2212
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2213

    
2214
# Magic number prepended to all confd queries.
2215
# This allows us to distinguish different types of confd protocols and handle
2216
# them. For example by changing this we can move the whole payload to be
2217
# compressed, or move away from json.
2218
CONFD_MAGIC_FOURCC = "plj0"
2219

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

    
2225
# Timeout in seconds to expire pending query request in the confd client
2226
# library. We don't actually expect any answer more than 10 seconds after we
2227
# sent a request.
2228
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2229

    
2230
# Maximum UDP datagram size.
2231
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2232
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2233
#   (assuming we can't use jumbo frames)
2234
# We just set this to 60K, which should be enough
2235
MAX_UDP_DATA_SIZE = 61440
2236

    
2237
# User-id pool minimum/maximum acceptable user-ids.
2238
UIDPOOL_UID_MIN = 0
2239
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2240

    
2241
# Name or path of the pgrep command
2242
PGREP = "pgrep"
2243

    
2244
# Name of the node group that gets created at cluster init or upgrade
2245
INITIAL_NODE_GROUP_NAME = "default"
2246

    
2247
# Possible values for NodeGroup.alloc_policy
2248
ALLOC_POLICY_PREFERRED = "preferred"
2249
ALLOC_POLICY_LAST_RESORT = "last_resort"
2250
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2251
VALID_ALLOC_POLICIES = [
2252
  ALLOC_POLICY_PREFERRED,
2253
  ALLOC_POLICY_LAST_RESORT,
2254
  ALLOC_POLICY_UNALLOCABLE,
2255
  ]
2256

    
2257
# Temporary external/shared storage parameters
2258
BLOCKDEV_DRIVER_MANUAL = "manual"
2259

    
2260
# qemu-img path, required for ovfconverter
2261
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2262

    
2263
# Whether htools was enabled at compilation time
2264
HTOOLS = _autoconf.HTOOLS
2265
# The hail iallocator
2266
IALLOC_HAIL = "hail"
2267

    
2268
# Fake opcodes for functions that have hooks attached to them via
2269
# backend.RunLocalHooks
2270
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2271
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2272

    
2273
# SSH key types
2274
SSHK_RSA = "rsa"
2275
SSHK_DSA = "dsa"
2276
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2277

    
2278
# SSH authorized key types
2279
SSHAK_RSA = "ssh-rsa"
2280
SSHAK_DSS = "ssh-dss"
2281
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2282

    
2283
# SSH setup
2284
SSHS_CLUSTER_NAME = "cluster_name"
2285
SSHS_SSH_HOST_KEY = "ssh_host_key"
2286
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2287
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2288

    
2289
#: Key files for SSH daemon
2290
SSH_DAEMON_KEYFILES = {
2291
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2292
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2293
  }
2294

    
2295
# Node daemon setup
2296
NDS_CLUSTER_NAME = "cluster_name"
2297
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2298
NDS_SSCONF = "ssconf"
2299
NDS_START_NODE_DAEMON = "start_node_daemon"
2300

    
2301
# Path generating random UUID
2302
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2303

    
2304
# Regex string for verifying a UUID
2305
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2306

    
2307
# Auto-repair tag prefixes
2308
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2309
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2310
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2311
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2312
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2313

    
2314
# Auto-repair levels
2315
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2316
AUTO_REPAIR_MIGRATE = "migrate"
2317
AUTO_REPAIR_FAILOVER = "failover"
2318
AUTO_REPAIR_REINSTALL = "reinstall"
2319
AUTO_REPAIR_ALL_TYPES = [
2320
  AUTO_REPAIR_FIX_STORAGE,
2321
  AUTO_REPAIR_MIGRATE,
2322
  AUTO_REPAIR_FAILOVER,
2323
  AUTO_REPAIR_REINSTALL,
2324
]
2325

    
2326
# Auto-repair results
2327
AUTO_REPAIR_SUCCESS = "success"
2328
AUTO_REPAIR_FAILURE = "failure"
2329
AUTO_REPAIR_ENOPERM = "enoperm"
2330
AUTO_REPAIR_ALL_RESULTS = frozenset([
2331
    AUTO_REPAIR_SUCCESS,
2332
    AUTO_REPAIR_FAILURE,
2333
    AUTO_REPAIR_ENOPERM,
2334
])
2335

    
2336
# The version identifier for builtin data collectors
2337
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2338

    
2339
# The source reasons for the change of state of an instance
2340
INSTANCE_REASON_SOURCE_CLI = "cli"
2341
INSTANCE_REASON_SOURCE_RAPI = "rapi"
2342
INSTANCE_REASON_SOURCE_UNKNOWN = "unknown"
2343

    
2344
INSTANCE_REASON_SOURCES = compat.UniqueFrozenset([
2345
  INSTANCE_REASON_SOURCE_CLI,
2346
  INSTANCE_REASON_SOURCE_RAPI,
2347
  INSTANCE_REASON_SOURCE_UNKNOWN,
2348
  ])
2349

    
2350
# The default reasons for the change of state of an instance
2351
INSTANCE_REASON_REBOOT = "reboot"
2352

    
2353
# Do not re-export imported modules
2354
del re, _vcsversion, _autoconf, socket, pathutils, compat