Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 250a9404

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

    
188
# one of "no", "yes", "only"
189
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
190
SYSLOG_NO = "no"
191
SYSLOG_YES = "yes"
192
SYSLOG_ONLY = "only"
193
SYSLOG_SOCKET = "/dev/log"
194

    
195
EXPORT_CONF_FILE = "config.ini"
196

    
197
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
198
XEN_KERNEL = _autoconf.XEN_KERNEL
199
XEN_INITRD = _autoconf.XEN_INITRD
200
XEN_CMD_XM = "xm"
201
XEN_CMD_XL = "xl"
202
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
203
XEN_CMD = _autoconf.XEN_CMD
204
# When the Xen toolstack used is "xl", live migration requires the source host
205
# to connect to the target host via ssh (xl runs this command). We need to pass
206
# the command xl runs some extra info so that it can use Ganeti's key
207
# verification and not fail. Note that this string is incomplete: it must be
208
# filled with the cluster name before being used.
209
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
210
              " -oUserKnownHostsFile=/dev/null"
211
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
212
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
213
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
214

    
215
KVM_PATH = _autoconf.KVM_PATH
216
KVM_KERNEL = _autoconf.KVM_KERNEL
217
SOCAT_PATH = _autoconf.SOCAT_PATH
218
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
219
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
220
SOCAT_ESCAPE_CODE = "0x1d"
221

    
222
#: Console as SSH command
223
CONS_SSH = "ssh"
224

    
225
#: Console as VNC server
226
CONS_VNC = "vnc"
227

    
228
#: Console as SPICE server
229
CONS_SPICE = "spice"
230

    
231
#: Display a message for console access
232
CONS_MESSAGE = "msg"
233

    
234
#: All console types
235
CONS_ALL = compat.UniqueFrozenset([
236
  CONS_SSH,
237
  CONS_VNC,
238
  CONS_SPICE,
239
  CONS_MESSAGE,
240
  ])
241

    
242
# For RSA keys more bits are better, but they also make operations more
243
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
244
# 2010 on.
245
RSA_KEY_BITS = 2048
246

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

    
255
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
256
X509_CERT_SIGN_DIGEST = "SHA1"
257

    
258
# Default validity of certificates in days
259
X509_CERT_DEFAULT_VALIDITY = 365 * 5
260

    
261
# commonName (CN) used in certificates
262
X509_CERT_CN = "ganeti.example.com"
263

    
264
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
265

    
266
# Import/export daemon mode
267
IEM_IMPORT = "import"
268
IEM_EXPORT = "export"
269

    
270
# Import/export transport compression
271
IEC_NONE = "none"
272
IEC_GZIP = "gzip"
273
IEC_ALL = compat.UniqueFrozenset([
274
  IEC_NONE,
275
  IEC_GZIP,
276
  ])
277

    
278
IE_CUSTOM_SIZE = "fd"
279

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

    
282
# Import/export I/O
283
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
284
IEIO_FILE = "file"
285
# Raw block device I/O using "dd"
286
IEIO_RAW_DISK = "raw"
287
# OS definition import/export script
288
IEIO_SCRIPT = "script"
289

    
290
VALUE_DEFAULT = "default"
291
VALUE_AUTO = "auto"
292
VALUE_GENERATE = "generate"
293
VALUE_NONE = "none"
294
VALUE_TRUE = "true"
295
VALUE_FALSE = "false"
296

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

    
300
# hooks-related constants
301
HOOKS_PHASE_PRE = "pre"
302
HOOKS_PHASE_POST = "post"
303
HOOKS_NAME_CFGUPDATE = "config-update"
304
HOOKS_NAME_WATCHER = "watcher"
305
HOOKS_VERSION = 2
306
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
307

    
308
# hooks subject type (what object type does the LU deal with)
309
HTYPE_CLUSTER = "CLUSTER"
310
HTYPE_NODE = "NODE"
311
HTYPE_GROUP = "GROUP"
312
HTYPE_INSTANCE = "INSTANCE"
313
HTYPE_NETWORK = "NETWORK"
314

    
315
HKR_SKIP = 0
316
HKR_FAIL = 1
317
HKR_SUCCESS = 2
318

    
319
# Storage types
320
ST_FILE = "file"
321
ST_LVM_PV = "lvm-pv"
322
ST_LVM_VG = "lvm-vg"
323

    
324
# Storage fields
325
# first two are valid in LU context only, not passed to backend
326
SF_NODE = "node"
327
SF_TYPE = "type"
328
# and the rest are valid in backend
329
SF_NAME = "name"
330
SF_SIZE = "size"
331
SF_FREE = "free"
332
SF_USED = "used"
333
SF_ALLOCATABLE = "allocatable"
334

    
335
# Storage operations
336
SO_FIX_CONSISTENCY = "fix-consistency"
337

    
338
# Available fields per storage type
339
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
340
  SF_NAME,
341
  SF_TYPE,
342
  SF_SIZE,
343
  SF_USED,
344
  SF_FREE,
345
  SF_ALLOCATABLE,
346
  ])
347

    
348
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
349
  ST_FILE,
350
  ST_LVM_PV,
351
  ST_LVM_VG,
352
  ])
353

    
354
MODIFIABLE_STORAGE_FIELDS = {
355
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
356
  }
357

    
358
VALID_STORAGE_OPERATIONS = {
359
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
360
  }
361

    
362
# Local disk status
363
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
364
(LDS_OKAY,
365
 LDS_UNKNOWN,
366
 LDS_FAULTY) = range(1, 4)
367

    
368
# disk template types
369
DT_DISKLESS = "diskless"
370
DT_PLAIN = "plain"
371
DT_DRBD8 = "drbd"
372
DT_FILE = "file"
373
DT_SHARED_FILE = "sharedfile"
374
DT_BLOCK = "blockdev"
375
DT_RBD = "rbd"
376
DT_EXT = "ext"
377

    
378
# the set of network-mirrored disk templates
379
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
380

    
381
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
382
DTS_EXT_MIRROR = compat.UniqueFrozenset([
383
  DT_SHARED_FILE,
384
  DT_BLOCK,
385
  DT_RBD,
386
  DT_EXT,
387
  ])
388

    
389
# the set of non-lvm-based disk templates
390
DTS_NOT_LVM = compat.UniqueFrozenset([
391
  DT_DISKLESS,
392
  DT_FILE,
393
  DT_SHARED_FILE,
394
  DT_BLOCK,
395
  DT_RBD,
396
  DT_EXT,
397
  ])
398

    
399
# the set of disk templates which can be grown
400
DTS_GROWABLE = compat.UniqueFrozenset([
401
  DT_PLAIN,
402
  DT_DRBD8,
403
  DT_FILE,
404
  DT_SHARED_FILE,
405
  DT_RBD,
406
  DT_EXT,
407
  ])
408

    
409
# the set of disk templates that allow adoption
410
DTS_MAY_ADOPT = compat.UniqueFrozenset([
411
  DT_PLAIN,
412
  DT_BLOCK,
413
  ])
414

    
415
# the set of disk templates that *must* use adoption
416
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
417

    
418
# the set of disk templates that allow migrations
419
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
420

    
421
# the set of file based disk templates
422
DTS_FILEBASED = compat.UniqueFrozenset([
423
  DT_FILE,
424
  DT_SHARED_FILE,
425
  ])
426

    
427
# the set of disk templates that are supported by exclusive_storage
428
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
429

    
430
# templates for which we don't perform checks on free space
431
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
432
  DT_FILE,
433
  DT_SHARED_FILE,
434
  DT_RBD,
435
  DT_EXT,
436
  ])
437

    
438
# logical disk types
439
LD_LV = "lvm"
440
LD_DRBD8 = "drbd8"
441
LD_FILE = "file"
442
LD_BLOCKDEV = "blockdev"
443
LD_RBD = "rbd"
444
LD_EXT = "ext"
445
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
446
  LD_LV,
447
  LD_DRBD8,
448
  LD_FILE,
449
  LD_BLOCKDEV,
450
  LD_RBD,
451
  LD_EXT,
452
  ])
453

    
454
LDS_BLOCK = compat.UniqueFrozenset([
455
  LD_LV,
456
  LD_DRBD8,
457
  LD_BLOCKDEV,
458
  LD_RBD,
459
  LD_EXT,
460
  ])
461

    
462
# drbd constants
463
DRBD_HMAC_ALG = "md5"
464
DRBD_NET_PROTOCOL = "C"
465
DRBD_STATUS_FILE = "/proc/drbd"
466

    
467
#: Size of DRBD meta block device
468
DRBD_META_SIZE = 128
469

    
470
# drbd barrier types
471
DRBD_B_NONE = "n"
472
DRBD_B_DISK_BARRIERS = "b"
473
DRBD_B_DISK_DRAIN = "d"
474
DRBD_B_DISK_FLUSH = "f"
475

    
476
# Valid barrier combinations: "n" or any non-null subset of "bfd"
477
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
478
  frozenset([DRBD_B_NONE]),
479
  frozenset([DRBD_B_DISK_BARRIERS]),
480
  frozenset([DRBD_B_DISK_DRAIN]),
481
  frozenset([DRBD_B_DISK_FLUSH]),
482
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
483
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
484
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
485
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
486
  ])
487

    
488
# rbd tool command
489
RBD_CMD = "rbd"
490

    
491
# file backend driver
492
FD_LOOP = "loop"
493
FD_BLKTAP = "blktap"
494

    
495
# the set of drbd-like disk types
496
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
497

    
498
# disk access mode
499
DISK_RDONLY = "ro"
500
DISK_RDWR = "rw"
501
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
502

    
503
# disk replacement mode
504
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
505
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
506
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
507
REPLACE_DISK_AUTO = "replace_auto"
508
REPLACE_MODES = compat.UniqueFrozenset([
509
  REPLACE_DISK_PRI,
510
  REPLACE_DISK_SEC,
511
  REPLACE_DISK_CHG,
512
  REPLACE_DISK_AUTO,
513
  ])
514

    
515
# Instance export mode
516
EXPORT_MODE_LOCAL = "local"
517
EXPORT_MODE_REMOTE = "remote"
518
EXPORT_MODES = compat.UniqueFrozenset([
519
  EXPORT_MODE_LOCAL,
520
  EXPORT_MODE_REMOTE,
521
  ])
522

    
523
# instance creation modes
524
INSTANCE_CREATE = "create"
525
INSTANCE_IMPORT = "import"
526
INSTANCE_REMOTE_IMPORT = "remote-import"
527
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
528
  INSTANCE_CREATE,
529
  INSTANCE_IMPORT,
530
  INSTANCE_REMOTE_IMPORT,
531
  ])
532

    
533
# Remote import/export handshake message and version
534
RIE_VERSION = 0
535
RIE_HANDSHAKE = "Hi, I'm Ganeti"
536

    
537
# Remote import/export certificate validity in seconds
538
RIE_CERT_VALIDITY = 24 * 60 * 60
539

    
540
# Overall timeout for establishing connection
541
RIE_CONNECT_TIMEOUT = 180
542

    
543
# Export only: how long to wait per connection attempt (seconds)
544
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
545

    
546
# Export only: number of attempts to connect
547
RIE_CONNECT_RETRIES = 10
548

    
549
#: Give child process up to 5 seconds to exit after sending a signal
550
CHILD_LINGER_TIMEOUT = 5.0
551

    
552
DISK_TEMPLATES = compat.UniqueFrozenset([
553
  DT_DISKLESS,
554
  DT_PLAIN,
555
  DT_DRBD8,
556
  DT_FILE,
557
  DT_SHARED_FILE,
558
  DT_BLOCK,
559
  DT_RBD,
560
  DT_EXT
561
  ])
562

    
563
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
564

    
565
# import/export config options
566
INISECT_EXP = "export"
567
INISECT_INS = "instance"
568
INISECT_HYP = "hypervisor"
569
INISECT_BEP = "backend"
570
INISECT_OSP = "os"
571

    
572
# dynamic device modification
573
DDM_ADD = "add"
574
DDM_MODIFY = "modify"
575
DDM_REMOVE = "remove"
576
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
577
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
578
  DDM_MODIFY,
579
  ]))
580
# TODO: DDM_SWAP, DDM_MOVE?
581

    
582
# common exit codes
583
EXIT_SUCCESS = 0
584
EXIT_FAILURE = 1
585
EXIT_NOTCLUSTER = 5
586
EXIT_NOTMASTER = 11
587
EXIT_NODESETUP_ERROR = 12
588
EXIT_CONFIRMATION = 13 # need user confirmation
589

    
590
#: Exit code for query operations with unknown fields
591
EXIT_UNKNOWN_FIELD = 14
592

    
593
# tags
594
TAG_CLUSTER = "cluster"
595
TAG_NODEGROUP = "nodegroup"
596
TAG_NODE = "node"
597
TAG_INSTANCE = "instance"
598
TAG_NETWORK = "network"
599
VALID_TAG_TYPES = compat.UniqueFrozenset([
600
  TAG_CLUSTER,
601
  TAG_NODEGROUP,
602
  TAG_NODE,
603
  TAG_INSTANCE,
604
  TAG_NETWORK,
605
  ])
606
MAX_TAG_LEN = 128
607
MAX_TAGS_PER_OBJ = 4096
608

    
609
# others
610
DEFAULT_BRIDGE = "xen-br0"
611
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
612
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
613
IP4_ADDRESS_ANY = "0.0.0.0"
614
IP6_ADDRESS_LOCALHOST = "::1"
615
IP6_ADDRESS_ANY = "::"
616
IP4_VERSION = 4
617
IP6_VERSION = 6
618
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
619
# for export to htools
620
IP4_FAMILY = socket.AF_INET
621
IP6_FAMILY = socket.AF_INET6
622

    
623
TCP_PING_TIMEOUT = 10
624
DEFAULT_VG = "xenvg"
625
DEFAULT_DRBD_HELPER = "/bin/true"
626
MIN_VG_SIZE = 20480
627
DEFAULT_MAC_PREFIX = "aa:00:00"
628
# default maximum instance wait time, in seconds.
629
DEFAULT_SHUTDOWN_TIMEOUT = 120
630
NODE_MAX_CLOCK_SKEW = 150
631
# Time for an intra-cluster disk transfer to wait for a connection
632
DISK_TRANSFER_CONNECT_TIMEOUT = 60
633
# Disk index separator
634
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
635
IP_COMMAND_PATH = _autoconf.IP_PATH
636

    
637
#: Key for job IDs in opcode result
638
JOB_IDS_KEY = "jobs"
639

    
640
# runparts results
641
(RUNPARTS_SKIP,
642
 RUNPARTS_RUN,
643
 RUNPARTS_ERR) = range(3)
644

    
645
RUNPARTS_STATUS = compat.UniqueFrozenset([
646
  RUNPARTS_SKIP,
647
  RUNPARTS_RUN,
648
  RUNPARTS_ERR,
649
  ])
650

    
651
# RPC constants
652
(RPC_ENCODING_NONE,
653
 RPC_ENCODING_ZLIB_BASE64) = range(2)
654

    
655
# Various time constants for the timeout table
656
RPC_TMO_URGENT = 60 # one minute
657
RPC_TMO_FAST = 5 * 60 # five minutes
658
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
659
RPC_TMO_SLOW = 3600 # one hour
660
RPC_TMO_4HRS = 4 * 3600
661
RPC_TMO_1DAY = 86400
662

    
663
# Timeout for connecting to nodes (seconds)
664
RPC_CONNECT_TIMEOUT = 5
665

    
666
# os related constants
667
OS_SCRIPT_CREATE = "create"
668
OS_SCRIPT_IMPORT = "import"
669
OS_SCRIPT_EXPORT = "export"
670
OS_SCRIPT_RENAME = "rename"
671
OS_SCRIPT_VERIFY = "verify"
672
OS_SCRIPTS = compat.UniqueFrozenset([
673
  OS_SCRIPT_CREATE,
674
  OS_SCRIPT_IMPORT,
675
  OS_SCRIPT_EXPORT,
676
  OS_SCRIPT_RENAME,
677
  OS_SCRIPT_VERIFY,
678
  ])
679

    
680
OS_API_FILE = "ganeti_api_version"
681
OS_VARIANTS_FILE = "variants.list"
682
OS_PARAMETERS_FILE = "parameters.list"
683

    
684
OS_VALIDATE_PARAMETERS = "parameters"
685
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
686

    
687
# External Storage (ES) related constants
688
ES_ACTION_CREATE = "create"
689
ES_ACTION_REMOVE = "remove"
690
ES_ACTION_GROW = "grow"
691
ES_ACTION_ATTACH = "attach"
692
ES_ACTION_DETACH = "detach"
693
ES_ACTION_SETINFO = "setinfo"
694
ES_ACTION_VERIFY = "verify"
695

    
696
ES_SCRIPT_CREATE = ES_ACTION_CREATE
697
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
698
ES_SCRIPT_GROW = ES_ACTION_GROW
699
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
700
ES_SCRIPT_DETACH = ES_ACTION_DETACH
701
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
702
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
703
ES_SCRIPTS = frozenset([
704
  ES_SCRIPT_CREATE,
705
  ES_SCRIPT_REMOVE,
706
  ES_SCRIPT_GROW,
707
  ES_SCRIPT_ATTACH,
708
  ES_SCRIPT_DETACH,
709
  ES_SCRIPT_SETINFO,
710
  ES_SCRIPT_VERIFY
711
  ])
712

    
713
ES_PARAMETERS_FILE = "parameters.list"
714

    
715
# ssh constants
716
SSH = "ssh"
717
SCP = "scp"
718

    
719
# reboot types
720
INSTANCE_REBOOT_SOFT = "soft"
721
INSTANCE_REBOOT_HARD = "hard"
722
INSTANCE_REBOOT_FULL = "full"
723

    
724
REBOOT_TYPES = compat.UniqueFrozenset([
725
  INSTANCE_REBOOT_SOFT,
726
  INSTANCE_REBOOT_HARD,
727
  INSTANCE_REBOOT_FULL,
728
  ])
729

    
730
# instance reboot behaviors
731
INSTANCE_REBOOT_ALLOWED = "reboot"
732
INSTANCE_REBOOT_EXIT = "exit"
733

    
734
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
735
  INSTANCE_REBOOT_ALLOWED,
736
  INSTANCE_REBOOT_EXIT,
737
  ])
738

    
739
VTYPE_STRING = "string"
740
VTYPE_MAYBE_STRING = "maybe-string"
741
VTYPE_BOOL = "bool"
742
VTYPE_SIZE = "size" # size, in MiBs
743
VTYPE_INT = "int"
744
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
745
  VTYPE_STRING,
746
  VTYPE_MAYBE_STRING,
747
  VTYPE_BOOL,
748
  VTYPE_SIZE,
749
  VTYPE_INT,
750
  ])
751

    
752
# Constant representing that the user does not specify any IP version
753
IFACE_NO_IP_VERSION_SPECIFIED = 0
754

    
755
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
756
  75,
757
  110,
758
  300,
759
  600,
760
  1200,
761
  1800,
762
  2400,
763
  4800,
764
  9600,
765
  14400,
766
  19200,
767
  28800,
768
  38400,
769
  57600,
770
  115200,
771
  230400,
772
  345600,
773
  460800,
774
  ])
775

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

    
844

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

    
914
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
915

    
916
HVS_PARAMETER_TITLES = {
917
  HV_ACPI: "ACPI",
918
  HV_BOOT_ORDER: "Boot_order",
919
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
920
  HV_DISK_TYPE: "Disk_type",
921
  HV_INITRD_PATH: "Initrd_path",
922
  HV_KERNEL_PATH: "Kernel_path",
923
  HV_NIC_TYPE: "NIC_type",
924
  HV_PAE: "PAE",
925
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
926
  HV_PASSTHROUGH: "pci_pass",
927
  HV_CPU_TYPE: "cpu_type",
928
  }
929

    
930
# Migration statuses
931
HV_MIGRATION_COMPLETED = "completed"
932
HV_MIGRATION_ACTIVE = "active"
933
HV_MIGRATION_FAILED = "failed"
934
HV_MIGRATION_CANCELLED = "cancelled"
935

    
936
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
937
  HV_MIGRATION_COMPLETED,
938
  HV_MIGRATION_ACTIVE,
939
  HV_MIGRATION_FAILED,
940
  HV_MIGRATION_CANCELLED,
941
  ])
942

    
943
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
944
  HV_MIGRATION_FAILED,
945
  HV_MIGRATION_CANCELLED,
946
  ])
947

    
948
# KVM-specific statuses
949
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
950

    
951
# Node info keys
952
HV_NODEINFO_KEY_VERSION = "hv_version"
953

    
954
# Hypervisor state
955
HVST_MEMORY_TOTAL = "mem_total"
956
HVST_MEMORY_NODE = "mem_node"
957
HVST_MEMORY_HV = "mem_hv"
958
HVST_CPU_TOTAL = "cpu_total"
959
HVST_CPU_NODE = "cpu_node"
960

    
961
HVST_DEFAULTS = {
962
  HVST_MEMORY_TOTAL: 0,
963
  HVST_MEMORY_NODE: 0,
964
  HVST_MEMORY_HV: 0,
965
  HVST_CPU_TOTAL: 1,
966
  HVST_CPU_NODE: 1,
967
  }
968

    
969
HVSTS_PARAMETER_TYPES = {
970
  HVST_MEMORY_TOTAL: VTYPE_INT,
971
  HVST_MEMORY_NODE: VTYPE_INT,
972
  HVST_MEMORY_HV: VTYPE_INT,
973
  HVST_CPU_TOTAL: VTYPE_INT,
974
  HVST_CPU_NODE: VTYPE_INT,
975
  }
976

    
977
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
978

    
979
# Disk state
980
DS_DISK_TOTAL = "disk_total"
981
DS_DISK_RESERVED = "disk_reserved"
982
DS_DISK_OVERHEAD = "disk_overhead"
983

    
984
DS_DEFAULTS = {
985
  DS_DISK_TOTAL: 0,
986
  DS_DISK_RESERVED: 0,
987
  DS_DISK_OVERHEAD: 0,
988
  }
989

    
990
DSS_PARAMETER_TYPES = {
991
  DS_DISK_TOTAL: VTYPE_INT,
992
  DS_DISK_RESERVED: VTYPE_INT,
993
  DS_DISK_OVERHEAD: VTYPE_INT,
994
  }
995

    
996
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
997
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
998

    
999
# Backend parameter names
1000
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1001
BE_MAXMEM = "maxmem"
1002
BE_MINMEM = "minmem"
1003
BE_VCPUS = "vcpus"
1004
BE_AUTO_BALANCE = "auto_balance"
1005
BE_ALWAYS_FAILOVER = "always_failover"
1006
BE_SPINDLE_USE = "spindle_use"
1007

    
1008
BES_PARAMETER_TYPES = {
1009
  BE_MAXMEM: VTYPE_SIZE,
1010
  BE_MINMEM: VTYPE_SIZE,
1011
  BE_VCPUS: VTYPE_INT,
1012
  BE_AUTO_BALANCE: VTYPE_BOOL,
1013
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1014
  BE_SPINDLE_USE: VTYPE_INT,
1015
  }
1016

    
1017
BES_PARAMETER_TITLES = {
1018
  BE_AUTO_BALANCE: "Auto_balance",
1019
  BE_MAXMEM: "ConfigMaxMem",
1020
  BE_MINMEM: "ConfigMinMem",
1021
  BE_VCPUS: "ConfigVCPUs",
1022
  }
1023

    
1024
BES_PARAMETER_COMPAT = {
1025
  BE_MEMORY: VTYPE_SIZE,
1026
  }
1027
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1028

    
1029
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1030

    
1031
# instance specs
1032
ISPEC_MEM_SIZE = "memory-size"
1033
ISPEC_CPU_COUNT = "cpu-count"
1034
ISPEC_DISK_COUNT = "disk-count"
1035
ISPEC_DISK_SIZE = "disk-size"
1036
ISPEC_NIC_COUNT = "nic-count"
1037
ISPEC_SPINDLE_USE = "spindle-use"
1038

    
1039
ISPECS_PARAMETER_TYPES = {
1040
  ISPEC_MEM_SIZE: VTYPE_INT,
1041
  ISPEC_CPU_COUNT: VTYPE_INT,
1042
  ISPEC_DISK_COUNT: VTYPE_INT,
1043
  ISPEC_DISK_SIZE: VTYPE_INT,
1044
  ISPEC_NIC_COUNT: VTYPE_INT,
1045
  ISPEC_SPINDLE_USE: VTYPE_INT,
1046
  }
1047

    
1048
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1049

    
1050
ISPECS_MIN = "min"
1051
ISPECS_MAX = "max"
1052
ISPECS_STD = "std"
1053
IPOLICY_DTS = "disk-templates"
1054
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1055
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1056

    
1057
IPOLICY_ISPECS = compat.UniqueFrozenset([
1058
  ISPECS_MIN,
1059
  ISPECS_MAX,
1060
  ISPECS_STD,
1061
  ])
1062

    
1063
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1064
  IPOLICY_VCPU_RATIO,
1065
  IPOLICY_SPINDLE_RATIO,
1066
  ])
1067

    
1068
IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
1069
                    IPOLICY_PARAMETERS |
1070
                    frozenset([IPOLICY_DTS]))
1071

    
1072
# Node parameter names
1073
ND_OOB_PROGRAM = "oob_program"
1074
ND_SPINDLE_COUNT = "spindle_count"
1075
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1076

    
1077
NDS_PARAMETER_TYPES = {
1078
  ND_OOB_PROGRAM: VTYPE_STRING,
1079
  ND_SPINDLE_COUNT: VTYPE_INT,
1080
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1081
  }
1082

    
1083
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1084

    
1085
NDS_PARAMETER_TITLES = {
1086
  ND_OOB_PROGRAM: "OutOfBandProgram",
1087
  ND_SPINDLE_COUNT: "SpindleCount",
1088
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1089
  }
1090

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

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

    
1161
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1162

    
1163
# OOB supported commands
1164
OOB_POWER_ON = "power-on"
1165
OOB_POWER_OFF = "power-off"
1166
OOB_POWER_CYCLE = "power-cycle"
1167
OOB_POWER_STATUS = "power-status"
1168
OOB_HEALTH = "health"
1169

    
1170
OOB_COMMANDS = compat.UniqueFrozenset([
1171
  OOB_POWER_ON,
1172
  OOB_POWER_OFF,
1173
  OOB_POWER_CYCLE,
1174
  OOB_POWER_STATUS,
1175
  OOB_HEALTH,
1176
  ])
1177

    
1178
OOB_POWER_STATUS_POWERED = "powered"
1179

    
1180
OOB_TIMEOUT = 60 # 60 seconds
1181
OOB_POWER_DELAY = 2.0 # 2 seconds
1182

    
1183
OOB_STATUS_OK = "OK"
1184
OOB_STATUS_WARNING = "WARNING"
1185
OOB_STATUS_CRITICAL = "CRITICAL"
1186
OOB_STATUS_UNKNOWN = "UNKNOWN"
1187

    
1188
OOB_STATUSES = compat.UniqueFrozenset([
1189
  OOB_STATUS_OK,
1190
  OOB_STATUS_WARNING,
1191
  OOB_STATUS_CRITICAL,
1192
  OOB_STATUS_UNKNOWN,
1193
  ])
1194

    
1195
# Instance Parameters Profile
1196
PP_DEFAULT = "default"
1197

    
1198
# NIC_* constants are used inside the ganeti config
1199
NIC_MODE = "mode"
1200
NIC_LINK = "link"
1201

    
1202
NIC_MODE_BRIDGED = "bridged"
1203
NIC_MODE_ROUTED = "routed"
1204
NIC_MODE_OVS = "openvswitch"
1205
NIC_IP_POOL = "pool"
1206

    
1207
NIC_VALID_MODES = compat.UniqueFrozenset([
1208
  NIC_MODE_BRIDGED,
1209
  NIC_MODE_ROUTED,
1210
  NIC_MODE_OVS,
1211
  ])
1212

    
1213
RESERVE_ACTION = "reserve"
1214
RELEASE_ACTION = "release"
1215

    
1216
# An extra description of the network.
1217
# Can be used by hooks/kvm-vif-bridge to apply different rules
1218
NETWORK_TYPE_PRIVATE = "private"
1219
NETWORK_TYPE_PUBLIC = "public"
1220

    
1221
NETWORK_VALID_TYPES = compat.UniqueFrozenset([
1222
  NETWORK_TYPE_PRIVATE,
1223
  NETWORK_TYPE_PUBLIC,
1224
  ])
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_EGROUPMIXEDESFLAG = \
1459
  (CV_TGROUP, "EGROUPMIXEDESFLAG",
1460
   "exclusive_storage flag is not uniform within the group")
1461
CV_EGROUPDIFFERENTPVSIZE = \
1462
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1463
CV_EINSTANCEBADNODE = \
1464
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1465
   "Instance marked as running lives on an offline node")
1466
CV_EINSTANCEDOWN = \
1467
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1468
CV_EINSTANCELAYOUT = \
1469
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1470
CV_EINSTANCEMISSINGDISK = \
1471
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1472
CV_EINSTANCEFAULTYDISK = \
1473
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1474
   "Impossible to retrieve status for a disk")
1475
CV_EINSTANCEWRONGNODE = \
1476
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1477
CV_EINSTANCESPLITGROUPS = \
1478
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1479
   "Instance with primary and secondary nodes in different groups")
1480
CV_EINSTANCEPOLICY = \
1481
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1482
   "Instance does not meet policy")
1483
CV_EINSTANCEUNSUITABLENODE = \
1484
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1485
   "Instance running on nodes that are not suitable for it")
1486
CV_ENODEDRBD = \
1487
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1488
CV_ENODEDRBDHELPER = \
1489
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1490
CV_ENODEFILECHECK = \
1491
  (CV_TNODE, "ENODEFILECHECK",
1492
   "Error retrieving the checksum of the node files")
1493
CV_ENODEHOOKS = \
1494
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1495
CV_ENODEHV = \
1496
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1497
CV_ENODELVM = \
1498
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1499
CV_ENODEN1 = \
1500
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1501
CV_ENODENET = \
1502
  (CV_TNODE, "ENODENET", "Network-related node error")
1503
CV_ENODEOS = \
1504
  (CV_TNODE, "ENODEOS", "OS-related node error")
1505
CV_ENODEORPHANINSTANCE = \
1506
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1507
CV_ENODEORPHANLV = \
1508
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1509
CV_ENODERPC = \
1510
  (CV_TNODE, "ENODERPC",
1511
   "Error during connection to the primary node of an instance")
1512
CV_ENODESSH = \
1513
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1514
CV_ENODEVERSION = \
1515
  (CV_TNODE, "ENODEVERSION",
1516
   "Protocol version mismatch or Ganeti version mismatch")
1517
CV_ENODESETUP = \
1518
  (CV_TNODE, "ENODESETUP", "Node setup error")
1519
CV_ENODETIME = \
1520
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1521
CV_ENODEOOBPATH = \
1522
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1523
CV_ENODEUSERSCRIPTS = \
1524
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1525
CV_ENODEFILESTORAGEPATHS = \
1526
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1527

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

    
1563
CV_ALL_ECODES_STRINGS = \
1564
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1565

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

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

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

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

    
1635
# SSL certificate check constants (in days)
1636
SSL_CERT_EXPIRATION_WARN = 30
1637
SSL_CERT_EXPIRATION_ERROR = 7
1638

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

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

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

    
1681
# Job queue
1682
JOB_QUEUE_VERSION = 1
1683
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1684

    
1685
JOB_ID_TEMPLATE = r"\d+"
1686
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1687

    
1688
# unchanged job return
1689
JOB_NOTCHANGED = "nochange"
1690

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

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

    
1729
# OpCode priority
1730
OP_PRIO_LOWEST = +19
1731
OP_PRIO_HIGHEST = -20
1732

    
1733
OP_PRIO_LOW = +10
1734
OP_PRIO_NORMAL = 0
1735
OP_PRIO_HIGH = -10
1736

    
1737
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1738
  OP_PRIO_LOW,
1739
  OP_PRIO_NORMAL,
1740
  OP_PRIO_HIGH,
1741
  ])
1742

    
1743
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1744

    
1745
# Lock recalculate mode
1746
LOCKS_REPLACE = "replace"
1747
LOCKS_APPEND = "append"
1748

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

    
1758
# Execution log types
1759
ELOG_MESSAGE = "message"
1760
ELOG_REMOTE_IMPORT = "remote-import"
1761
ELOG_JQUEUE_TEST = "jqueue-test"
1762

    
1763
# /etc/hosts modification
1764
ETC_HOSTS_ADD = "add"
1765
ETC_HOSTS_REMOVE = "remove"
1766

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

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

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

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

    
1810
#: List of resources which can be queried using RAPI
1811
QR_VIA_RAPI = QR_VIA_LUXI
1812

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

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

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

    
1848
RS_ALL = compat.UniqueFrozenset([
1849
  RS_NORMAL,
1850
  RS_UNKNOWN,
1851
  RS_NODATA,
1852
  RS_UNAVAIL,
1853
  RS_OFFLINE,
1854
  ])
1855

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

    
1864
# max dynamic devices
1865
MAX_NICS = 8
1866
MAX_DISKS = 16
1867

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

    
1895
SS_FILE_PERMS = 0444
1896

    
1897
# cluster wide default parameters
1898
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1899

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

    
2005
HVC_GLOBALS = compat.UniqueFrozenset([
2006
  HV_MIGRATION_PORT,
2007
  HV_MIGRATION_BANDWIDTH,
2008
  HV_MIGRATION_MODE,
2009
  ])
2010

    
2011
BEC_DEFAULTS = {
2012
  BE_MINMEM: 128,
2013
  BE_MAXMEM: 128,
2014
  BE_VCPUS: 1,
2015
  BE_AUTO_BALANCE: True,
2016
  BE_ALWAYS_FAILOVER: False,
2017
  BE_SPINDLE_USE: 1,
2018
  }
2019

    
2020
NDC_DEFAULTS = {
2021
  ND_OOB_PROGRAM: "",
2022
  ND_SPINDLE_COUNT: 1,
2023
  ND_EXCLUSIVE_STORAGE: False,
2024
  }
2025

    
2026
NDC_GLOBALS = compat.UniqueFrozenset([
2027
  ND_EXCLUSIVE_STORAGE,
2028
  ])
2029

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

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

    
2062
# readability shortcuts
2063
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2064
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2065

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

    
2096
# we don't want to export the shortcuts
2097
del _LV_DEFAULTS, _DRBD_DEFAULTS
2098

    
2099
NICC_DEFAULTS = {
2100
  NIC_MODE: NIC_MODE_BRIDGED,
2101
  NIC_LINK: DEFAULT_BRIDGE,
2102
  }
2103

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

    
2136
MASTER_POOL_SIZE_DEFAULT = 10
2137

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

    
2144
CONFD_PROTOCOL_VERSION = 1
2145

    
2146
CONFD_REQ_PING = 0
2147
CONFD_REQ_NODE_ROLE_BYNAME = 1
2148
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2149
CONFD_REQ_CLUSTER_MASTER = 3
2150
CONFD_REQ_NODE_PIP_LIST = 4
2151
CONFD_REQ_MC_PIP_LIST = 5
2152
CONFD_REQ_INSTANCES_IPS_LIST = 6
2153
CONFD_REQ_NODE_DRBD = 7
2154

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

    
2163
CONFD_REQFIELD_NAME = "0"
2164
CONFD_REQFIELD_IP = "1"
2165
CONFD_REQFIELD_MNODE_PIP = "2"
2166

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

    
2178
CONFD_REPL_STATUS_OK = 0
2179
CONFD_REPL_STATUS_ERROR = 1
2180
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2181

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

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

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

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

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

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

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

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

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

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

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

    
2243
# Name or path of the pgrep command
2244
PGREP = "pgrep"
2245

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

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

    
2259
# Temporary external/shared storage parameters
2260
BLOCKDEV_DRIVER_MANUAL = "manual"
2261

    
2262
# qemu-img path, required for ovfconverter
2263
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2264

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

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

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

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

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

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

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

    
2303
# Path generating random UUID
2304
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2305

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

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

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

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

    
2338
# The version identifier for builtin data collectors
2339
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2340

    
2341
# Do not re-export imported modules
2342
del re, _vcsversion, _autoconf, socket, pathutils, compat