Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 7e7fa841

History | View | Annotate | Download (60.1 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_LOGFILES = {
170
  NODED: pathutils.GetLogFilename("node-daemon"),
171
  CONFD: pathutils.GetLogFilename("conf-daemon"),
172
  RAPI: pathutils.GetLogFilename("rapi-daemon"),
173
  MASTERD: pathutils.GetLogFilename("master-daemon"),
174
  }
175

    
176
DEV_CONSOLE = "/dev/console"
177

    
178
PROC_MOUNTS = "/proc/mounts"
179

    
180
# Local UniX Interface related constants
181
LUXI_EOM = "\3"
182
LUXI_VERSION = CONFIG_VERSION
183

    
184
# one of "no", "yes", "only"
185
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
186
SYSLOG_NO = "no"
187
SYSLOG_YES = "yes"
188
SYSLOG_ONLY = "only"
189
SYSLOG_SOCKET = "/dev/log"
190

    
191
EXPORT_CONF_FILE = "config.ini"
192

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

    
211
KVM_PATH = _autoconf.KVM_PATH
212
KVM_KERNEL = _autoconf.KVM_KERNEL
213
SOCAT_PATH = _autoconf.SOCAT_PATH
214
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
215
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
216
SOCAT_ESCAPE_CODE = "0x1d"
217

    
218
#: Console as SSH command
219
CONS_SSH = "ssh"
220

    
221
#: Console as VNC server
222
CONS_VNC = "vnc"
223

    
224
#: Console as SPICE server
225
CONS_SPICE = "spice"
226

    
227
#: Display a message for console access
228
CONS_MESSAGE = "msg"
229

    
230
#: All console types
231
CONS_ALL = compat.UniqueFrozenset([
232
  CONS_SSH,
233
  CONS_VNC,
234
  CONS_SPICE,
235
  CONS_MESSAGE,
236
  ])
237

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

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

    
251
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
252
X509_CERT_SIGN_DIGEST = "SHA1"
253

    
254
# Default validity of certificates in days
255
X509_CERT_DEFAULT_VALIDITY = 365 * 5
256

    
257
# commonName (CN) used in certificates
258
X509_CERT_CN = "ganeti.example.com"
259

    
260
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
261

    
262
# Import/export daemon mode
263
IEM_IMPORT = "import"
264
IEM_EXPORT = "export"
265

    
266
# Import/export transport compression
267
IEC_NONE = "none"
268
IEC_GZIP = "gzip"
269
IEC_ALL = compat.UniqueFrozenset([
270
  IEC_NONE,
271
  IEC_GZIP,
272
  ])
273

    
274
IE_CUSTOM_SIZE = "fd"
275

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

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

    
286
VALUE_DEFAULT = "default"
287
VALUE_AUTO = "auto"
288
VALUE_GENERATE = "generate"
289
VALUE_NONE = "none"
290
VALUE_TRUE = "true"
291
VALUE_FALSE = "false"
292

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

    
296
# hooks-related constants
297
HOOKS_PHASE_PRE = "pre"
298
HOOKS_PHASE_POST = "post"
299
HOOKS_NAME_CFGUPDATE = "config-update"
300
HOOKS_NAME_WATCHER = "watcher"
301
HOOKS_VERSION = 2
302
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
303

    
304
# hooks subject type (what object type does the LU deal with)
305
HTYPE_CLUSTER = "CLUSTER"
306
HTYPE_NODE = "NODE"
307
HTYPE_GROUP = "GROUP"
308
HTYPE_INSTANCE = "INSTANCE"
309
HTYPE_NETWORK = "NETWORK"
310

    
311
HKR_SKIP = 0
312
HKR_FAIL = 1
313
HKR_SUCCESS = 2
314

    
315
# Storage types
316
ST_FILE = "file"
317
ST_LVM_PV = "lvm-pv"
318
ST_LVM_VG = "lvm-vg"
319

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

    
331
# Storage operations
332
SO_FIX_CONSISTENCY = "fix-consistency"
333

    
334
# Available fields per storage type
335
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
336
  SF_NAME,
337
  SF_TYPE,
338
  SF_SIZE,
339
  SF_USED,
340
  SF_FREE,
341
  SF_ALLOCATABLE,
342
  ])
343

    
344
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
345
  ST_FILE,
346
  ST_LVM_PV,
347
  ST_LVM_VG,
348
  ])
349

    
350
MODIFIABLE_STORAGE_FIELDS = {
351
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
352
  }
353

    
354
VALID_STORAGE_OPERATIONS = {
355
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
356
  }
357

    
358
# Local disk status
359
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
360
(LDS_OKAY,
361
 LDS_UNKNOWN,
362
 LDS_FAULTY) = range(1, 4)
363

    
364
# disk template types
365
DT_DISKLESS = "diskless"
366
DT_PLAIN = "plain"
367
DT_DRBD8 = "drbd"
368
DT_FILE = "file"
369
DT_SHARED_FILE = "sharedfile"
370
DT_BLOCK = "blockdev"
371
DT_RBD = "rbd"
372
DT_EXT = "ext"
373

    
374
# the set of network-mirrored disk templates
375
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
376

    
377
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
378
DTS_EXT_MIRROR = compat.UniqueFrozenset([
379
  DT_SHARED_FILE,
380
  DT_BLOCK,
381
  DT_RBD,
382
  DT_EXT,
383
  ])
384

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

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

    
405
# the set of disk templates that allow adoption
406
DTS_MAY_ADOPT = compat.UniqueFrozenset([
407
  DT_PLAIN,
408
  DT_BLOCK,
409
  ])
410

    
411
# the set of disk templates that *must* use adoption
412
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
413

    
414
# the set of disk templates that allow migrations
415
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
416

    
417
# the set of file based disk templates
418
DTS_FILEBASED = compat.UniqueFrozenset([
419
  DT_FILE,
420
  DT_SHARED_FILE,
421
  ])
422

    
423
# the set of disk templates that are supported by exclusive_storage
424
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
425

    
426
# templates for which we don't perform checks on free space
427
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
428
  DT_FILE,
429
  DT_SHARED_FILE,
430
  DT_RBD,
431
  DT_EXT,
432
  ])
433

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

    
450
LDS_BLOCK = compat.UniqueFrozenset([
451
  LD_LV,
452
  LD_DRBD8,
453
  LD_BLOCKDEV,
454
  LD_RBD,
455
  LD_EXT,
456
  ])
457

    
458
# drbd constants
459
DRBD_HMAC_ALG = "md5"
460
DRBD_NET_PROTOCOL = "C"
461
DRBD_STATUS_FILE = "/proc/drbd"
462

    
463
#: Size of DRBD meta block device
464
DRBD_META_SIZE = 128
465

    
466
# drbd barrier types
467
DRBD_B_NONE = "n"
468
DRBD_B_DISK_BARRIERS = "b"
469
DRBD_B_DISK_DRAIN = "d"
470
DRBD_B_DISK_FLUSH = "f"
471

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

    
484
# rbd tool command
485
RBD_CMD = "rbd"
486

    
487
# file backend driver
488
FD_LOOP = "loop"
489
FD_BLKTAP = "blktap"
490

    
491
# the set of drbd-like disk types
492
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
493

    
494
# disk access mode
495
DISK_RDONLY = "ro"
496
DISK_RDWR = "rw"
497
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
498

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

    
511
# Instance export mode
512
EXPORT_MODE_LOCAL = "local"
513
EXPORT_MODE_REMOTE = "remote"
514
EXPORT_MODES = compat.UniqueFrozenset([
515
  EXPORT_MODE_LOCAL,
516
  EXPORT_MODE_REMOTE,
517
  ])
518

    
519
# instance creation modes
520
INSTANCE_CREATE = "create"
521
INSTANCE_IMPORT = "import"
522
INSTANCE_REMOTE_IMPORT = "remote-import"
523
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
524
  INSTANCE_CREATE,
525
  INSTANCE_IMPORT,
526
  INSTANCE_REMOTE_IMPORT,
527
  ])
528

    
529
# Remote import/export handshake message and version
530
RIE_VERSION = 0
531
RIE_HANDSHAKE = "Hi, I'm Ganeti"
532

    
533
# Remote import/export certificate validity in seconds
534
RIE_CERT_VALIDITY = 24 * 60 * 60
535

    
536
# Overall timeout for establishing connection
537
RIE_CONNECT_TIMEOUT = 180
538

    
539
# Export only: how long to wait per connection attempt (seconds)
540
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
541

    
542
# Export only: number of attempts to connect
543
RIE_CONNECT_RETRIES = 10
544

    
545
#: Give child process up to 5 seconds to exit after sending a signal
546
CHILD_LINGER_TIMEOUT = 5.0
547

    
548
DISK_TEMPLATES = compat.UniqueFrozenset([
549
  DT_DISKLESS,
550
  DT_PLAIN,
551
  DT_DRBD8,
552
  DT_FILE,
553
  DT_SHARED_FILE,
554
  DT_BLOCK,
555
  DT_RBD,
556
  DT_EXT
557
  ])
558

    
559
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
560

    
561
# import/export config options
562
INISECT_EXP = "export"
563
INISECT_INS = "instance"
564
INISECT_HYP = "hypervisor"
565
INISECT_BEP = "backend"
566
INISECT_OSP = "os"
567

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

    
578
# common exit codes
579
EXIT_SUCCESS = 0
580
EXIT_FAILURE = 1
581
EXIT_NOTCLUSTER = 5
582
EXIT_NOTMASTER = 11
583
EXIT_NODESETUP_ERROR = 12
584
EXIT_CONFIRMATION = 13 # need user confirmation
585

    
586
#: Exit code for query operations with unknown fields
587
EXIT_UNKNOWN_FIELD = 14
588

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

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

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

    
633
#: Key for job IDs in opcode result
634
JOB_IDS_KEY = "jobs"
635

    
636
# runparts results
637
(RUNPARTS_SKIP,
638
 RUNPARTS_RUN,
639
 RUNPARTS_ERR) = range(3)
640

    
641
RUNPARTS_STATUS = compat.UniqueFrozenset([
642
  RUNPARTS_SKIP,
643
  RUNPARTS_RUN,
644
  RUNPARTS_ERR,
645
  ])
646

    
647
# RPC constants
648
(RPC_ENCODING_NONE,
649
 RPC_ENCODING_ZLIB_BASE64) = range(2)
650

    
651
# Various time constants for the timeout table
652
RPC_TMO_URGENT = 60 # one minute
653
RPC_TMO_FAST = 5 * 60 # five minutes
654
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
655
RPC_TMO_SLOW = 3600 # one hour
656
RPC_TMO_4HRS = 4 * 3600
657
RPC_TMO_1DAY = 86400
658

    
659
# Timeout for connecting to nodes (seconds)
660
RPC_CONNECT_TIMEOUT = 5
661

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

    
676
OS_API_FILE = "ganeti_api_version"
677
OS_VARIANTS_FILE = "variants.list"
678
OS_PARAMETERS_FILE = "parameters.list"
679

    
680
OS_VALIDATE_PARAMETERS = "parameters"
681
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
682

    
683
# External Storage (ES) related constants
684
ES_ACTION_CREATE = "create"
685
ES_ACTION_REMOVE = "remove"
686
ES_ACTION_GROW = "grow"
687
ES_ACTION_ATTACH = "attach"
688
ES_ACTION_DETACH = "detach"
689
ES_ACTION_SETINFO = "setinfo"
690
ES_ACTION_VERIFY = "verify"
691

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

    
709
ES_PARAMETERS_FILE = "parameters.list"
710

    
711
# ssh constants
712
SSH = "ssh"
713
SCP = "scp"
714

    
715
# reboot types
716
INSTANCE_REBOOT_SOFT = "soft"
717
INSTANCE_REBOOT_HARD = "hard"
718
INSTANCE_REBOOT_FULL = "full"
719

    
720
REBOOT_TYPES = compat.UniqueFrozenset([
721
  INSTANCE_REBOOT_SOFT,
722
  INSTANCE_REBOOT_HARD,
723
  INSTANCE_REBOOT_FULL,
724
  ])
725

    
726
# instance reboot behaviors
727
INSTANCE_REBOOT_ALLOWED = "reboot"
728
INSTANCE_REBOOT_EXIT = "exit"
729

    
730
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
731
  INSTANCE_REBOOT_ALLOWED,
732
  INSTANCE_REBOOT_EXIT,
733
  ])
734

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

    
748
# Constant representing that the user does not specify any IP version
749
IFACE_NO_IP_VERSION_SPECIFIED = 0
750

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

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

    
840

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

    
910
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
911

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

    
926
# Migration statuses
927
HV_MIGRATION_COMPLETED = "completed"
928
HV_MIGRATION_ACTIVE = "active"
929
HV_MIGRATION_FAILED = "failed"
930
HV_MIGRATION_CANCELLED = "cancelled"
931

    
932
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
933
  HV_MIGRATION_COMPLETED,
934
  HV_MIGRATION_ACTIVE,
935
  HV_MIGRATION_FAILED,
936
  HV_MIGRATION_CANCELLED,
937
  ])
938

    
939
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
940
  HV_MIGRATION_FAILED,
941
  HV_MIGRATION_CANCELLED,
942
  ])
943

    
944
# KVM-specific statuses
945
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
946

    
947
# Node info keys
948
HV_NODEINFO_KEY_VERSION = "hv_version"
949

    
950
# Hypervisor state
951
HVST_MEMORY_TOTAL = "mem_total"
952
HVST_MEMORY_NODE = "mem_node"
953
HVST_MEMORY_HV = "mem_hv"
954
HVST_CPU_TOTAL = "cpu_total"
955
HVST_CPU_NODE = "cpu_node"
956

    
957
HVST_DEFAULTS = {
958
  HVST_MEMORY_TOTAL: 0,
959
  HVST_MEMORY_NODE: 0,
960
  HVST_MEMORY_HV: 0,
961
  HVST_CPU_TOTAL: 1,
962
  HVST_CPU_NODE: 1,
963
  }
964

    
965
HVSTS_PARAMETER_TYPES = {
966
  HVST_MEMORY_TOTAL: VTYPE_INT,
967
  HVST_MEMORY_NODE: VTYPE_INT,
968
  HVST_MEMORY_HV: VTYPE_INT,
969
  HVST_CPU_TOTAL: VTYPE_INT,
970
  HVST_CPU_NODE: VTYPE_INT,
971
  }
972

    
973
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
974

    
975
# Disk state
976
DS_DISK_TOTAL = "disk_total"
977
DS_DISK_RESERVED = "disk_reserved"
978
DS_DISK_OVERHEAD = "disk_overhead"
979

    
980
DS_DEFAULTS = {
981
  DS_DISK_TOTAL: 0,
982
  DS_DISK_RESERVED: 0,
983
  DS_DISK_OVERHEAD: 0,
984
  }
985

    
986
DSS_PARAMETER_TYPES = {
987
  DS_DISK_TOTAL: VTYPE_INT,
988
  DS_DISK_RESERVED: VTYPE_INT,
989
  DS_DISK_OVERHEAD: VTYPE_INT,
990
  }
991

    
992
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
993
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
994

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

    
1004
BES_PARAMETER_TYPES = {
1005
  BE_MAXMEM: VTYPE_SIZE,
1006
  BE_MINMEM: VTYPE_SIZE,
1007
  BE_VCPUS: VTYPE_INT,
1008
  BE_AUTO_BALANCE: VTYPE_BOOL,
1009
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1010
  BE_SPINDLE_USE: VTYPE_INT,
1011
  }
1012

    
1013
BES_PARAMETER_TITLES = {
1014
  BE_AUTO_BALANCE: "Auto_balance",
1015
  BE_MAXMEM: "ConfigMaxMem",
1016
  BE_MINMEM: "ConfigMinMem",
1017
  BE_VCPUS: "ConfigVCPUs",
1018
  }
1019

    
1020
BES_PARAMETER_COMPAT = {
1021
  BE_MEMORY: VTYPE_SIZE,
1022
  }
1023
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1024

    
1025
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1026

    
1027
# instance specs
1028
ISPEC_MEM_SIZE = "memory-size"
1029
ISPEC_CPU_COUNT = "cpu-count"
1030
ISPEC_DISK_COUNT = "disk-count"
1031
ISPEC_DISK_SIZE = "disk-size"
1032
ISPEC_NIC_COUNT = "nic-count"
1033
ISPEC_SPINDLE_USE = "spindle-use"
1034

    
1035
ISPECS_PARAMETER_TYPES = {
1036
  ISPEC_MEM_SIZE: VTYPE_INT,
1037
  ISPEC_CPU_COUNT: VTYPE_INT,
1038
  ISPEC_DISK_COUNT: VTYPE_INT,
1039
  ISPEC_DISK_SIZE: VTYPE_INT,
1040
  ISPEC_NIC_COUNT: VTYPE_INT,
1041
  ISPEC_SPINDLE_USE: VTYPE_INT,
1042
  }
1043

    
1044
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1045

    
1046
ISPECS_MIN = "min"
1047
ISPECS_MAX = "max"
1048
ISPECS_STD = "std"
1049
IPOLICY_DTS = "disk-templates"
1050
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1051
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1052

    
1053
IPOLICY_ISPECS = compat.UniqueFrozenset([
1054
  ISPECS_MIN,
1055
  ISPECS_MAX,
1056
  ISPECS_STD,
1057
  ])
1058

    
1059
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1060
  IPOLICY_VCPU_RATIO,
1061
  IPOLICY_SPINDLE_RATIO,
1062
  ])
1063

    
1064
IPOLICY_ALL_KEYS = (IPOLICY_ISPECS |
1065
                    IPOLICY_PARAMETERS |
1066
                    frozenset([IPOLICY_DTS]))
1067

    
1068
# Node parameter names
1069
ND_OOB_PROGRAM = "oob_program"
1070
ND_SPINDLE_COUNT = "spindle_count"
1071
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1072

    
1073
NDS_PARAMETER_TYPES = {
1074
  ND_OOB_PROGRAM: VTYPE_STRING,
1075
  ND_SPINDLE_COUNT: VTYPE_INT,
1076
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1077
  }
1078

    
1079
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1080

    
1081
NDS_PARAMETER_TITLES = {
1082
  ND_OOB_PROGRAM: "OutOfBandProgram",
1083
  ND_SPINDLE_COUNT: "SpindleCount",
1084
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1085
  }
1086

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

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

    
1157
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1158

    
1159
# OOB supported commands
1160
OOB_POWER_ON = "power-on"
1161
OOB_POWER_OFF = "power-off"
1162
OOB_POWER_CYCLE = "power-cycle"
1163
OOB_POWER_STATUS = "power-status"
1164
OOB_HEALTH = "health"
1165

    
1166
OOB_COMMANDS = compat.UniqueFrozenset([
1167
  OOB_POWER_ON,
1168
  OOB_POWER_OFF,
1169
  OOB_POWER_CYCLE,
1170
  OOB_POWER_STATUS,
1171
  OOB_HEALTH,
1172
  ])
1173

    
1174
OOB_POWER_STATUS_POWERED = "powered"
1175

    
1176
OOB_TIMEOUT = 60 # 60 seconds
1177
OOB_POWER_DELAY = 2.0 # 2 seconds
1178

    
1179
OOB_STATUS_OK = "OK"
1180
OOB_STATUS_WARNING = "WARNING"
1181
OOB_STATUS_CRITICAL = "CRITICAL"
1182
OOB_STATUS_UNKNOWN = "UNKNOWN"
1183

    
1184
OOB_STATUSES = compat.UniqueFrozenset([
1185
  OOB_STATUS_OK,
1186
  OOB_STATUS_WARNING,
1187
  OOB_STATUS_CRITICAL,
1188
  OOB_STATUS_UNKNOWN,
1189
  ])
1190

    
1191
# Instance Parameters Profile
1192
PP_DEFAULT = "default"
1193

    
1194
# NIC_* constants are used inside the ganeti config
1195
NIC_MODE = "mode"
1196
NIC_LINK = "link"
1197

    
1198
NIC_MODE_BRIDGED = "bridged"
1199
NIC_MODE_ROUTED = "routed"
1200
NIC_MODE_OVS = "openvswitch"
1201
NIC_IP_POOL = "pool"
1202

    
1203
NIC_VALID_MODES = compat.UniqueFrozenset([
1204
  NIC_MODE_BRIDGED,
1205
  NIC_MODE_ROUTED,
1206
  NIC_MODE_OVS,
1207
  ])
1208

    
1209
RESERVE_ACTION = "reserve"
1210
RELEASE_ACTION = "release"
1211

    
1212
# An extra description of the network.
1213
# Can be used by hooks/kvm-vif-bridge to apply different rules
1214
NETWORK_TYPE_PRIVATE = "private"
1215
NETWORK_TYPE_PUBLIC = "public"
1216

    
1217
NETWORK_VALID_TYPES = compat.UniqueFrozenset([
1218
  NETWORK_TYPE_PRIVATE,
1219
  NETWORK_TYPE_PUBLIC,
1220
  ])
1221

    
1222
NICS_PARAMETER_TYPES = {
1223
  NIC_MODE: VTYPE_STRING,
1224
  NIC_LINK: VTYPE_STRING,
1225
  }
1226

    
1227
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1228

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

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

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

    
1278
VNC_BASE_PORT = 5900
1279
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1280

    
1281
# NIC types
1282
HT_NIC_RTL8139 = "rtl8139"
1283
HT_NIC_NE2K_PCI = "ne2k_pci"
1284
HT_NIC_NE2K_ISA = "ne2k_isa"
1285
HT_NIC_I82551 = "i82551"
1286
HT_NIC_I85557B = "i82557b"
1287
HT_NIC_I8259ER = "i82559er"
1288
HT_NIC_PCNET = "pcnet"
1289
HT_NIC_E1000 = "e1000"
1290
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1291

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

    
1311
# Disk types
1312
HT_DISK_IOEMU = "ioemu"
1313
HT_DISK_IDE = "ide"
1314
HT_DISK_SCSI = "scsi"
1315
HT_DISK_SD = "sd"
1316
HT_DISK_MTD = "mtd"
1317
HT_DISK_PFLASH = "pflash"
1318

    
1319
HT_CACHE_DEFAULT = "default"
1320
HT_CACHE_NONE = "none"
1321
HT_CACHE_WTHROUGH = "writethrough"
1322
HT_CACHE_WBACK = "writeback"
1323
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1324
  HT_CACHE_DEFAULT,
1325
  HT_CACHE_NONE,
1326
  HT_CACHE_WTHROUGH,
1327
  HT_CACHE_WBACK,
1328
  ])
1329

    
1330
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1331
  HT_DISK_PARAVIRTUAL,
1332
  HT_DISK_IOEMU,
1333
  ])
1334
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1335
  HT_DISK_PARAVIRTUAL,
1336
  HT_DISK_IDE,
1337
  HT_DISK_SCSI,
1338
  HT_DISK_SD,
1339
  HT_DISK_MTD,
1340
  HT_DISK_PFLASH,
1341
  ])
1342

    
1343
# Mouse types:
1344
HT_MOUSE_MOUSE = "mouse"
1345
HT_MOUSE_TABLET = "tablet"
1346

    
1347
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1348
  HT_MOUSE_MOUSE,
1349
  HT_MOUSE_TABLET,
1350
  ])
1351

    
1352
# Boot order
1353
HT_BO_FLOPPY = "floppy"
1354
HT_BO_CDROM = "cdrom"
1355
HT_BO_DISK = "disk"
1356
HT_BO_NETWORK = "network"
1357

    
1358
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1359
  HT_BO_FLOPPY,
1360
  HT_BO_CDROM,
1361
  HT_BO_DISK,
1362
  HT_BO_NETWORK,
1363
  ])
1364

    
1365
# SPICE lossless image compression options
1366
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1367
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1368
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1369
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1370
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1371
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1372

    
1373
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1374
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1375
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1376
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1377
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1378
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1379
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1380
  ])
1381

    
1382
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1383
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1384
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1385
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1386

    
1387
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1388
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1389
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1390
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1391
  ])
1392

    
1393
# SPICE video stream detection
1394
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1395
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1396
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1397

    
1398
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1399
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1400
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1401
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1402
  ])
1403

    
1404
# Security models
1405
HT_SM_NONE = "none"
1406
HT_SM_USER = "user"
1407
HT_SM_POOL = "pool"
1408

    
1409
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1410
  HT_SM_NONE,
1411
  HT_SM_USER,
1412
  HT_SM_POOL,
1413
  ])
1414

    
1415
# Kvm flag values
1416
HT_KVM_ENABLED = "enabled"
1417
HT_KVM_DISABLED = "disabled"
1418

    
1419
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1420

    
1421
# Migration type
1422
HT_MIGRATION_LIVE = "live"
1423
HT_MIGRATION_NONLIVE = "non-live"
1424
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1425
  HT_MIGRATION_LIVE,
1426
  HT_MIGRATION_NONLIVE,
1427
  ])
1428

    
1429
# Cluster Verify steps
1430
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1431
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1432

    
1433
# Cluster Verify error classes
1434
CV_TCLUSTER = "cluster"
1435
CV_TGROUP = "group"
1436
CV_TNODE = "node"
1437
CV_TINSTANCE = "instance"
1438

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1739
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1740

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1891
SS_FILE_PERMS = 0444
1892

    
1893
# cluster wide default parameters
1894
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1895

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

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

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

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

    
2022
DISK_LD_DEFAULTS = {
2023
  LD_DRBD8: {
2024
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2025
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2026
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2027
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2028
    LDP_DISK_CUSTOM: "",
2029
    LDP_NET_CUSTOM: "",
2030
    LDP_DYNAMIC_RESYNC: False,
2031

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

    
2054
# readability shortcuts
2055
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2056
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2057

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

    
2088
# we don't want to export the shortcuts
2089
del _LV_DEFAULTS, _DRBD_DEFAULTS
2090

    
2091
NICC_DEFAULTS = {
2092
  NIC_MODE: NIC_MODE_BRIDGED,
2093
  NIC_LINK: DEFAULT_BRIDGE,
2094
  }
2095

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

    
2128
MASTER_POOL_SIZE_DEFAULT = 10
2129

    
2130
# Exclusive storage:
2131
# Error margin used to compare physical disks
2132
PART_MARGIN = .01
2133
# Space reserved when creating instance disks
2134
PART_RESERVED = .02
2135

    
2136
CONFD_PROTOCOL_VERSION = 1
2137

    
2138
CONFD_REQ_PING = 0
2139
CONFD_REQ_NODE_ROLE_BYNAME = 1
2140
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2141
CONFD_REQ_CLUSTER_MASTER = 3
2142
CONFD_REQ_NODE_PIP_LIST = 4
2143
CONFD_REQ_MC_PIP_LIST = 5
2144
CONFD_REQ_INSTANCES_IPS_LIST = 6
2145
CONFD_REQ_NODE_DRBD = 7
2146

    
2147
# Confd request query fields. These are used to narrow down queries.
2148
# These must be strings rather than integers, because json-encoding
2149
# converts them to strings anyway, as they're used as dict-keys.
2150
CONFD_REQQ_LINK = "0"
2151
CONFD_REQQ_IP = "1"
2152
CONFD_REQQ_IPLIST = "2"
2153
CONFD_REQQ_FIELDS = "3"
2154

    
2155
CONFD_REQFIELD_NAME = "0"
2156
CONFD_REQFIELD_IP = "1"
2157
CONFD_REQFIELD_MNODE_PIP = "2"
2158

    
2159
CONFD_REQS = compat.UniqueFrozenset([
2160
  CONFD_REQ_PING,
2161
  CONFD_REQ_NODE_ROLE_BYNAME,
2162
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2163
  CONFD_REQ_CLUSTER_MASTER,
2164
  CONFD_REQ_NODE_PIP_LIST,
2165
  CONFD_REQ_MC_PIP_LIST,
2166
  CONFD_REQ_INSTANCES_IPS_LIST,
2167
  CONFD_REQ_NODE_DRBD,
2168
  ])
2169

    
2170
CONFD_REPL_STATUS_OK = 0
2171
CONFD_REPL_STATUS_ERROR = 1
2172
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2173

    
2174
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2175
  CONFD_REPL_STATUS_OK,
2176
  CONFD_REPL_STATUS_ERROR,
2177
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2178
  ])
2179

    
2180
(CONFD_NODE_ROLE_MASTER,
2181
 CONFD_NODE_ROLE_CANDIDATE,
2182
 CONFD_NODE_ROLE_OFFLINE,
2183
 CONFD_NODE_ROLE_DRAINED,
2184
 CONFD_NODE_ROLE_REGULAR,
2185
 ) = range(5)
2186

    
2187
# A few common errors for confd
2188
CONFD_ERROR_UNKNOWN_ENTRY = 1
2189
CONFD_ERROR_INTERNAL = 2
2190
CONFD_ERROR_ARGUMENT = 3
2191

    
2192
# Each request is "salted" by the current timestamp.
2193
# This constants decides how many seconds of skew to accept.
2194
# TODO: make this a default and allow the value to be more configurable
2195
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2196

    
2197
# When we haven't reloaded the config for more than this amount of
2198
# seconds, we force a test to see if inotify is betraying us. Using a
2199
# prime number to ensure we get less chance of 'same wakeup' with
2200
# other processes.
2201
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2202

    
2203
# If we receive more than one update in this amount of microseconds,
2204
# we move to polling every RATELIMIT seconds, rather than relying on
2205
# inotify, to be able to serve more requests.
2206
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2207

    
2208
# Magic number prepended to all confd queries.
2209
# This allows us to distinguish different types of confd protocols and handle
2210
# them. For example by changing this we can move the whole payload to be
2211
# compressed, or move away from json.
2212
CONFD_MAGIC_FOURCC = "plj0"
2213

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

    
2219
# Timeout in seconds to expire pending query request in the confd client
2220
# library. We don't actually expect any answer more than 10 seconds after we
2221
# sent a request.
2222
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2223

    
2224
# Maximum UDP datagram size.
2225
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2226
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2227
#   (assuming we can't use jumbo frames)
2228
# We just set this to 60K, which should be enough
2229
MAX_UDP_DATA_SIZE = 61440
2230

    
2231
# User-id pool minimum/maximum acceptable user-ids.
2232
UIDPOOL_UID_MIN = 0
2233
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2234

    
2235
# Name or path of the pgrep command
2236
PGREP = "pgrep"
2237

    
2238
# Name of the node group that gets created at cluster init or upgrade
2239
INITIAL_NODE_GROUP_NAME = "default"
2240

    
2241
# Possible values for NodeGroup.alloc_policy
2242
ALLOC_POLICY_PREFERRED = "preferred"
2243
ALLOC_POLICY_LAST_RESORT = "last_resort"
2244
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2245
VALID_ALLOC_POLICIES = [
2246
  ALLOC_POLICY_PREFERRED,
2247
  ALLOC_POLICY_LAST_RESORT,
2248
  ALLOC_POLICY_UNALLOCABLE,
2249
  ]
2250

    
2251
# Temporary external/shared storage parameters
2252
BLOCKDEV_DRIVER_MANUAL = "manual"
2253

    
2254
# qemu-img path, required for ovfconverter
2255
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2256

    
2257
# Whether htools was enabled at compilation time
2258
HTOOLS = _autoconf.HTOOLS
2259
# The hail iallocator
2260
IALLOC_HAIL = "hail"
2261

    
2262
# Fake opcodes for functions that have hooks attached to them via
2263
# backend.RunLocalHooks
2264
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2265
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2266

    
2267
# SSH key types
2268
SSHK_RSA = "rsa"
2269
SSHK_DSA = "dsa"
2270
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2271

    
2272
# SSH authorized key types
2273
SSHAK_RSA = "ssh-rsa"
2274
SSHAK_DSS = "ssh-dss"
2275
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2276

    
2277
# SSH setup
2278
SSHS_CLUSTER_NAME = "cluster_name"
2279
SSHS_SSH_HOST_KEY = "ssh_host_key"
2280
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2281
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2282

    
2283
#: Key files for SSH daemon
2284
SSH_DAEMON_KEYFILES = {
2285
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2286
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2287
  }
2288

    
2289
# Node daemon setup
2290
NDS_CLUSTER_NAME = "cluster_name"
2291
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2292
NDS_SSCONF = "ssconf"
2293
NDS_START_NODE_DAEMON = "start_node_daemon"
2294

    
2295
# Path generating random UUID
2296
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2297

    
2298
# Regex string for verifying a UUID
2299
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2300

    
2301
# Auto-repair tag prefixes
2302
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2303
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2304
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2305
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2306
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2307

    
2308
# Auto-repair levels
2309
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2310
AUTO_REPAIR_MIGRATE = "migrate"
2311
AUTO_REPAIR_FAILOVER = "failover"
2312
AUTO_REPAIR_REINSTALL = "reinstall"
2313
AUTO_REPAIR_ALL_TYPES = [
2314
  AUTO_REPAIR_FIX_STORAGE,
2315
  AUTO_REPAIR_MIGRATE,
2316
  AUTO_REPAIR_FAILOVER,
2317
  AUTO_REPAIR_REINSTALL,
2318
]
2319

    
2320
# Auto-repair results
2321
AUTO_REPAIR_SUCCESS = "success"
2322
AUTO_REPAIR_FAILURE = "failure"
2323
AUTO_REPAIR_ENOPERM = "enoperm"
2324
AUTO_REPAIR_ALL_RESULTS = frozenset([
2325
    AUTO_REPAIR_SUCCESS,
2326
    AUTO_REPAIR_FAILURE,
2327
    AUTO_REPAIR_ENOPERM,
2328
])
2329

    
2330
# The version identifier for builtin data collectors
2331
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2332

    
2333
# Do not re-export imported modules
2334
del re, _vcsversion, _autoconf, socket, pathutils, compat