Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ d8f0b7c1

History | View | Annotate | Download (59.9 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_DISKLESS, # 'trivially' externally mirrored
384
  DT_SHARED_FILE,
385
  DT_BLOCK,
386
  DT_RBD,
387
  DT_EXT,
388
  ])
389

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
714
ES_PARAMETERS_FILE = "parameters.list"
715

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

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

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

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

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

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

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

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

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

    
845

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

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

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

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

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

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

    
949
# KVM-specific statuses
950
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
951

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1179
OOB_POWER_STATUS_POWERED = "powered"
1180

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

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

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

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

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

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

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

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

    
1217
NICS_PARAMETER_TYPES = {
1218
  NIC_MODE: VTYPE_STRING,
1219
  NIC_LINK: VTYPE_STRING,
1220
  }
1221

    
1222
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1223

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

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

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

    
1273
VNC_BASE_PORT = 5900
1274
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1275

    
1276
# NIC types
1277
HT_NIC_RTL8139 = "rtl8139"
1278
HT_NIC_NE2K_PCI = "ne2k_pci"
1279
HT_NIC_NE2K_ISA = "ne2k_isa"
1280
HT_NIC_I82551 = "i82551"
1281
HT_NIC_I85557B = "i82557b"
1282
HT_NIC_I8259ER = "i82559er"
1283
HT_NIC_PCNET = "pcnet"
1284
HT_NIC_E1000 = "e1000"
1285
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1286

    
1287
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1288
  HT_NIC_RTL8139,
1289
  HT_NIC_NE2K_PCI,
1290
  HT_NIC_E1000,
1291
  HT_NIC_NE2K_ISA,
1292
  HT_NIC_PARAVIRTUAL,
1293
  ])
1294
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1295
  HT_NIC_RTL8139,
1296
  HT_NIC_NE2K_PCI,
1297
  HT_NIC_NE2K_ISA,
1298
  HT_NIC_I82551,
1299
  HT_NIC_I85557B,
1300
  HT_NIC_I8259ER,
1301
  HT_NIC_PCNET,
1302
  HT_NIC_E1000,
1303
  HT_NIC_PARAVIRTUAL,
1304
  ])
1305

    
1306
# Disk types
1307
HT_DISK_IOEMU = "ioemu"
1308
HT_DISK_IDE = "ide"
1309
HT_DISK_SCSI = "scsi"
1310
HT_DISK_SD = "sd"
1311
HT_DISK_MTD = "mtd"
1312
HT_DISK_PFLASH = "pflash"
1313

    
1314
HT_CACHE_DEFAULT = "default"
1315
HT_CACHE_NONE = "none"
1316
HT_CACHE_WTHROUGH = "writethrough"
1317
HT_CACHE_WBACK = "writeback"
1318
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1319
  HT_CACHE_DEFAULT,
1320
  HT_CACHE_NONE,
1321
  HT_CACHE_WTHROUGH,
1322
  HT_CACHE_WBACK,
1323
  ])
1324

    
1325
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1326
  HT_DISK_PARAVIRTUAL,
1327
  HT_DISK_IOEMU,
1328
  ])
1329
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1330
  HT_DISK_PARAVIRTUAL,
1331
  HT_DISK_IDE,
1332
  HT_DISK_SCSI,
1333
  HT_DISK_SD,
1334
  HT_DISK_MTD,
1335
  HT_DISK_PFLASH,
1336
  ])
1337

    
1338
# Mouse types:
1339
HT_MOUSE_MOUSE = "mouse"
1340
HT_MOUSE_TABLET = "tablet"
1341

    
1342
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1343
  HT_MOUSE_MOUSE,
1344
  HT_MOUSE_TABLET,
1345
  ])
1346

    
1347
# Boot order
1348
HT_BO_FLOPPY = "floppy"
1349
HT_BO_CDROM = "cdrom"
1350
HT_BO_DISK = "disk"
1351
HT_BO_NETWORK = "network"
1352

    
1353
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1354
  HT_BO_FLOPPY,
1355
  HT_BO_CDROM,
1356
  HT_BO_DISK,
1357
  HT_BO_NETWORK,
1358
  ])
1359

    
1360
# SPICE lossless image compression options
1361
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1362
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1363
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1364
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1365
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1366
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1367

    
1368
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1369
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1370
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1371
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1372
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1373
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1374
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1375
  ])
1376

    
1377
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1378
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1379
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1380
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1381

    
1382
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1383
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1384
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1385
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1386
  ])
1387

    
1388
# SPICE video stream detection
1389
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1390
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1391
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1392

    
1393
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1394
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1395
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1396
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1397
  ])
1398

    
1399
# Security models
1400
HT_SM_NONE = "none"
1401
HT_SM_USER = "user"
1402
HT_SM_POOL = "pool"
1403

    
1404
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1405
  HT_SM_NONE,
1406
  HT_SM_USER,
1407
  HT_SM_POOL,
1408
  ])
1409

    
1410
# Kvm flag values
1411
HT_KVM_ENABLED = "enabled"
1412
HT_KVM_DISABLED = "disabled"
1413

    
1414
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1415

    
1416
# Migration type
1417
HT_MIGRATION_LIVE = "live"
1418
HT_MIGRATION_NONLIVE = "non-live"
1419
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1420
  HT_MIGRATION_LIVE,
1421
  HT_MIGRATION_NONLIVE,
1422
  ])
1423

    
1424
# Cluster Verify steps
1425
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1426
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1427

    
1428
# Cluster Verify error classes
1429
CV_TCLUSTER = "cluster"
1430
CV_TGROUP = "group"
1431
CV_TNODE = "node"
1432
CV_TINSTANCE = "instance"
1433

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

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

    
1551
CV_ALL_ECODES_STRINGS = \
1552
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1553

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

    
1579
# Instance status
1580
INSTST_RUNNING = "running"
1581
INSTST_ADMINDOWN = "ADMIN_down"
1582
INSTST_ADMINOFFLINE = "ADMIN_offline"
1583
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1584
INSTST_NODEDOWN = "ERROR_nodedown"
1585
INSTST_WRONGNODE = "ERROR_wrongnode"
1586
INSTST_ERRORUP = "ERROR_up"
1587
INSTST_ERRORDOWN = "ERROR_down"
1588
INSTST_ALL = compat.UniqueFrozenset([
1589
  INSTST_RUNNING,
1590
  INSTST_ADMINDOWN,
1591
  INSTST_ADMINOFFLINE,
1592
  INSTST_NODEOFFLINE,
1593
  INSTST_NODEDOWN,
1594
  INSTST_WRONGNODE,
1595
  INSTST_ERRORUP,
1596
  INSTST_ERRORDOWN,
1597
  ])
1598

    
1599
# Admin states
1600
ADMINST_UP = "up"
1601
ADMINST_DOWN = "down"
1602
ADMINST_OFFLINE = "offline"
1603
ADMINST_ALL = compat.UniqueFrozenset([
1604
  ADMINST_UP,
1605
  ADMINST_DOWN,
1606
  ADMINST_OFFLINE,
1607
  ])
1608

    
1609
# Node roles
1610
NR_REGULAR = "R"
1611
NR_MASTER = "M"
1612
NR_MCANDIDATE = "C"
1613
NR_DRAINED = "D"
1614
NR_OFFLINE = "O"
1615
NR_ALL = compat.UniqueFrozenset([
1616
  NR_REGULAR,
1617
  NR_MASTER,
1618
  NR_MCANDIDATE,
1619
  NR_DRAINED,
1620
  NR_OFFLINE,
1621
  ])
1622

    
1623
# SSL certificate check constants (in days)
1624
SSL_CERT_EXPIRATION_WARN = 30
1625
SSL_CERT_EXPIRATION_ERROR = 7
1626

    
1627
# Allocator framework constants
1628
IALLOCATOR_VERSION = 2
1629
IALLOCATOR_DIR_IN = "in"
1630
IALLOCATOR_DIR_OUT = "out"
1631
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1632
  IALLOCATOR_DIR_IN,
1633
  IALLOCATOR_DIR_OUT,
1634
  ])
1635
IALLOCATOR_MODE_ALLOC = "allocate"
1636
IALLOCATOR_MODE_RELOC = "relocate"
1637
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1638
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1639
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1640
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1641
  IALLOCATOR_MODE_ALLOC,
1642
  IALLOCATOR_MODE_RELOC,
1643
  IALLOCATOR_MODE_CHG_GROUP,
1644
  IALLOCATOR_MODE_NODE_EVAC,
1645
  IALLOCATOR_MODE_MULTI_ALLOC,
1646
  ])
1647
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1648
DEFAULT_IALLOCATOR_SHORTCUT = "."
1649

    
1650
IALLOCATOR_NEVAC_PRI = "primary-only"
1651
IALLOCATOR_NEVAC_SEC = "secondary-only"
1652
IALLOCATOR_NEVAC_ALL = "all"
1653
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1654
  IALLOCATOR_NEVAC_PRI,
1655
  IALLOCATOR_NEVAC_SEC,
1656
  IALLOCATOR_NEVAC_ALL,
1657
  ])
1658

    
1659
# Node evacuation
1660
NODE_EVAC_PRI = "primary-only"
1661
NODE_EVAC_SEC = "secondary-only"
1662
NODE_EVAC_ALL = "all"
1663
NODE_EVAC_MODES = compat.UniqueFrozenset([
1664
  NODE_EVAC_PRI,
1665
  NODE_EVAC_SEC,
1666
  NODE_EVAC_ALL,
1667
  ])
1668

    
1669
# Job queue
1670
JOB_QUEUE_VERSION = 1
1671
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1672

    
1673
JOB_ID_TEMPLATE = r"\d+"
1674
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1675

    
1676
# unchanged job return
1677
JOB_NOTCHANGED = "nochange"
1678

    
1679
# Job status
1680
JOB_STATUS_QUEUED = "queued"
1681
JOB_STATUS_WAITING = "waiting"
1682
JOB_STATUS_CANCELING = "canceling"
1683
JOB_STATUS_RUNNING = "running"
1684
JOB_STATUS_CANCELED = "canceled"
1685
JOB_STATUS_SUCCESS = "success"
1686
JOB_STATUS_ERROR = "error"
1687
JOBS_PENDING = compat.UniqueFrozenset([
1688
  JOB_STATUS_QUEUED,
1689
  JOB_STATUS_WAITING,
1690
  JOB_STATUS_CANCELING,
1691
  ])
1692
JOBS_FINALIZED = compat.UniqueFrozenset([
1693
  JOB_STATUS_CANCELED,
1694
  JOB_STATUS_SUCCESS,
1695
  JOB_STATUS_ERROR,
1696
  ])
1697
JOB_STATUS_ALL = compat.UniqueFrozenset([
1698
  JOB_STATUS_RUNNING,
1699
  ]) | JOBS_PENDING | JOBS_FINALIZED
1700

    
1701
# OpCode status
1702
# not yet finalized
1703
OP_STATUS_QUEUED = "queued"
1704
OP_STATUS_WAITING = "waiting"
1705
OP_STATUS_CANCELING = "canceling"
1706
OP_STATUS_RUNNING = "running"
1707
# finalized
1708
OP_STATUS_CANCELED = "canceled"
1709
OP_STATUS_SUCCESS = "success"
1710
OP_STATUS_ERROR = "error"
1711
OPS_FINALIZED = compat.UniqueFrozenset([
1712
  OP_STATUS_CANCELED,
1713
  OP_STATUS_SUCCESS,
1714
  OP_STATUS_ERROR,
1715
  ])
1716

    
1717
# OpCode priority
1718
OP_PRIO_LOWEST = +19
1719
OP_PRIO_HIGHEST = -20
1720

    
1721
OP_PRIO_LOW = +10
1722
OP_PRIO_NORMAL = 0
1723
OP_PRIO_HIGH = -10
1724

    
1725
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1726
  OP_PRIO_LOW,
1727
  OP_PRIO_NORMAL,
1728
  OP_PRIO_HIGH,
1729
  ])
1730

    
1731
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1732

    
1733
# Lock recalculate mode
1734
LOCKS_REPLACE = "replace"
1735
LOCKS_APPEND = "append"
1736

    
1737
# Lock timeout (sum) before we should go into blocking acquire (still
1738
# can be reset by priority change); computed as max time (10 hours)
1739
# before we should actually go into blocking acquire given that we
1740
# start from default priority level; in seconds
1741
# TODO
1742
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1743
LOCK_ATTEMPTS_MAXWAIT = 15.0
1744
LOCK_ATTEMPTS_MINWAIT = 1.0
1745

    
1746
# Execution log types
1747
ELOG_MESSAGE = "message"
1748
ELOG_REMOTE_IMPORT = "remote-import"
1749
ELOG_JQUEUE_TEST = "jqueue-test"
1750

    
1751
# /etc/hosts modification
1752
ETC_HOSTS_ADD = "add"
1753
ETC_HOSTS_REMOVE = "remove"
1754

    
1755
# Job queue test
1756
JQT_MSGPREFIX = "TESTMSG="
1757
JQT_EXPANDNAMES = "expandnames"
1758
JQT_EXEC = "exec"
1759
JQT_LOGMSG = "logmsg"
1760
JQT_STARTMSG = "startmsg"
1761
JQT_ALL = compat.UniqueFrozenset([
1762
  JQT_EXPANDNAMES,
1763
  JQT_EXEC,
1764
  JQT_LOGMSG,
1765
  JQT_STARTMSG,
1766
  ])
1767

    
1768
# Query resources
1769
QR_CLUSTER = "cluster"
1770
QR_INSTANCE = "instance"
1771
QR_NODE = "node"
1772
QR_LOCK = "lock"
1773
QR_GROUP = "group"
1774
QR_OS = "os"
1775
QR_JOB = "job"
1776
QR_EXPORT = "export"
1777
QR_NETWORK = "network"
1778
QR_EXTSTORAGE = "extstorage"
1779

    
1780
#: List of resources which can be queried using L{opcodes.OpQuery}
1781
QR_VIA_OP = compat.UniqueFrozenset([
1782
  QR_CLUSTER,
1783
  QR_INSTANCE,
1784
  QR_NODE,
1785
  QR_GROUP,
1786
  QR_OS,
1787
  QR_EXPORT,
1788
  QR_NETWORK,
1789
  QR_EXTSTORAGE,
1790
  ])
1791

    
1792
#: List of resources which can be queried using Local UniX Interface
1793
QR_VIA_LUXI = QR_VIA_OP.union([
1794
  QR_LOCK,
1795
  QR_JOB,
1796
  ])
1797

    
1798
#: List of resources which can be queried using RAPI
1799
QR_VIA_RAPI = QR_VIA_LUXI
1800

    
1801
# Query field types
1802
QFT_UNKNOWN = "unknown"
1803
QFT_TEXT = "text"
1804
QFT_BOOL = "bool"
1805
QFT_NUMBER = "number"
1806
QFT_UNIT = "unit"
1807
QFT_TIMESTAMP = "timestamp"
1808
QFT_OTHER = "other"
1809

    
1810
#: All query field types
1811
QFT_ALL = compat.UniqueFrozenset([
1812
  QFT_UNKNOWN,
1813
  QFT_TEXT,
1814
  QFT_BOOL,
1815
  QFT_NUMBER,
1816
  QFT_UNIT,
1817
  QFT_TIMESTAMP,
1818
  QFT_OTHER,
1819
  ])
1820

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

    
1836
RS_ALL = compat.UniqueFrozenset([
1837
  RS_NORMAL,
1838
  RS_UNKNOWN,
1839
  RS_NODATA,
1840
  RS_UNAVAIL,
1841
  RS_OFFLINE,
1842
  ])
1843

    
1844
#: Dictionary with special field cases and their verbose/terse formatting
1845
RSS_DESCRIPTION = {
1846
  RS_UNKNOWN: ("(unknown)", "??"),
1847
  RS_NODATA: ("(nodata)", "?"),
1848
  RS_OFFLINE: ("(offline)", "*"),
1849
  RS_UNAVAIL: ("(unavail)", "-"),
1850
  }
1851

    
1852
# max dynamic devices
1853
MAX_NICS = 8
1854
MAX_DISKS = 16
1855

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

    
1883
SS_FILE_PERMS = 0444
1884

    
1885
# cluster wide default parameters
1886
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1887

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

    
1993
HVC_GLOBALS = compat.UniqueFrozenset([
1994
  HV_MIGRATION_PORT,
1995
  HV_MIGRATION_BANDWIDTH,
1996
  HV_MIGRATION_MODE,
1997
  ])
1998

    
1999
BEC_DEFAULTS = {
2000
  BE_MINMEM: 128,
2001
  BE_MAXMEM: 128,
2002
  BE_VCPUS: 1,
2003
  BE_AUTO_BALANCE: True,
2004
  BE_ALWAYS_FAILOVER: False,
2005
  BE_SPINDLE_USE: 1,
2006
  }
2007

    
2008
NDC_DEFAULTS = {
2009
  ND_OOB_PROGRAM: "",
2010
  ND_SPINDLE_COUNT: 1,
2011
  ND_EXCLUSIVE_STORAGE: False,
2012
  }
2013

    
2014
NDC_GLOBALS = compat.UniqueFrozenset([
2015
  ND_EXCLUSIVE_STORAGE,
2016
  ])
2017

    
2018
DISK_LD_DEFAULTS = {
2019
  LD_DRBD8: {
2020
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2021
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2022
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2023
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2024
    LDP_DISK_CUSTOM: "",
2025
    LDP_NET_CUSTOM: "",
2026
    LDP_DYNAMIC_RESYNC: False,
2027

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

    
2050
# readability shortcuts
2051
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2052
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2053

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

    
2084
# we don't want to export the shortcuts
2085
del _LV_DEFAULTS, _DRBD_DEFAULTS
2086

    
2087
NICC_DEFAULTS = {
2088
  NIC_MODE: NIC_MODE_BRIDGED,
2089
  NIC_LINK: DEFAULT_BRIDGE,
2090
  }
2091

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

    
2124
MASTER_POOL_SIZE_DEFAULT = 10
2125

    
2126
# Exclusive storage:
2127
# Error margin used to compare physical disks
2128
PART_MARGIN = .01
2129
# Space reserved when creating instance disks
2130
PART_RESERVED = .02
2131

    
2132
CONFD_PROTOCOL_VERSION = 1
2133

    
2134
CONFD_REQ_PING = 0
2135
CONFD_REQ_NODE_ROLE_BYNAME = 1
2136
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2137
CONFD_REQ_CLUSTER_MASTER = 3
2138
CONFD_REQ_NODE_PIP_LIST = 4
2139
CONFD_REQ_MC_PIP_LIST = 5
2140
CONFD_REQ_INSTANCES_IPS_LIST = 6
2141
CONFD_REQ_NODE_DRBD = 7
2142

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

    
2151
CONFD_REQFIELD_NAME = "0"
2152
CONFD_REQFIELD_IP = "1"
2153
CONFD_REQFIELD_MNODE_PIP = "2"
2154

    
2155
CONFD_REQS = compat.UniqueFrozenset([
2156
  CONFD_REQ_PING,
2157
  CONFD_REQ_NODE_ROLE_BYNAME,
2158
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2159
  CONFD_REQ_CLUSTER_MASTER,
2160
  CONFD_REQ_NODE_PIP_LIST,
2161
  CONFD_REQ_MC_PIP_LIST,
2162
  CONFD_REQ_INSTANCES_IPS_LIST,
2163
  CONFD_REQ_NODE_DRBD,
2164
  ])
2165

    
2166
CONFD_REPL_STATUS_OK = 0
2167
CONFD_REPL_STATUS_ERROR = 1
2168
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2169

    
2170
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2171
  CONFD_REPL_STATUS_OK,
2172
  CONFD_REPL_STATUS_ERROR,
2173
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2174
  ])
2175

    
2176
(CONFD_NODE_ROLE_MASTER,
2177
 CONFD_NODE_ROLE_CANDIDATE,
2178
 CONFD_NODE_ROLE_OFFLINE,
2179
 CONFD_NODE_ROLE_DRAINED,
2180
 CONFD_NODE_ROLE_REGULAR,
2181
 ) = range(5)
2182

    
2183
# A few common errors for confd
2184
CONFD_ERROR_UNKNOWN_ENTRY = 1
2185
CONFD_ERROR_INTERNAL = 2
2186
CONFD_ERROR_ARGUMENT = 3
2187

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

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

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

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

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

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

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

    
2227
# User-id pool minimum/maximum acceptable user-ids.
2228
UIDPOOL_UID_MIN = 0
2229
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2230

    
2231
# Name or path of the pgrep command
2232
PGREP = "pgrep"
2233

    
2234
# Name of the node group that gets created at cluster init or upgrade
2235
INITIAL_NODE_GROUP_NAME = "default"
2236

    
2237
# Possible values for NodeGroup.alloc_policy
2238
ALLOC_POLICY_PREFERRED = "preferred"
2239
ALLOC_POLICY_LAST_RESORT = "last_resort"
2240
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2241
VALID_ALLOC_POLICIES = [
2242
  ALLOC_POLICY_PREFERRED,
2243
  ALLOC_POLICY_LAST_RESORT,
2244
  ALLOC_POLICY_UNALLOCABLE,
2245
  ]
2246

    
2247
# Temporary external/shared storage parameters
2248
BLOCKDEV_DRIVER_MANUAL = "manual"
2249

    
2250
# qemu-img path, required for ovfconverter
2251
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2252

    
2253
# Whether htools was enabled at compilation time
2254
HTOOLS = _autoconf.HTOOLS
2255
# The hail iallocator
2256
IALLOC_HAIL = "hail"
2257

    
2258
# Fake opcodes for functions that have hooks attached to them via
2259
# backend.RunLocalHooks
2260
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2261
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2262

    
2263
# SSH key types
2264
SSHK_RSA = "rsa"
2265
SSHK_DSA = "dsa"
2266
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2267

    
2268
# SSH authorized key types
2269
SSHAK_RSA = "ssh-rsa"
2270
SSHAK_DSS = "ssh-dss"
2271
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2272

    
2273
# SSH setup
2274
SSHS_CLUSTER_NAME = "cluster_name"
2275
SSHS_SSH_HOST_KEY = "ssh_host_key"
2276
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2277
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2278

    
2279
#: Key files for SSH daemon
2280
SSH_DAEMON_KEYFILES = {
2281
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2282
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2283
  }
2284

    
2285
# Node daemon setup
2286
NDS_CLUSTER_NAME = "cluster_name"
2287
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2288
NDS_SSCONF = "ssconf"
2289
NDS_START_NODE_DAEMON = "start_node_daemon"
2290

    
2291
# Path generating random UUID
2292
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2293

    
2294
# Regex string for verifying a UUID
2295
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2296

    
2297
# Auto-repair tag prefixes
2298
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2299
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2300
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2301
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2302
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2303

    
2304
# Auto-repair levels
2305
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2306
AUTO_REPAIR_MIGRATE = "migrate"
2307
AUTO_REPAIR_FAILOVER = "failover"
2308
AUTO_REPAIR_REINSTALL = "reinstall"
2309
AUTO_REPAIR_ALL_TYPES = [
2310
  AUTO_REPAIR_FIX_STORAGE,
2311
  AUTO_REPAIR_MIGRATE,
2312
  AUTO_REPAIR_FAILOVER,
2313
  AUTO_REPAIR_REINSTALL,
2314
]
2315

    
2316
# Auto-repair results
2317
AUTO_REPAIR_SUCCESS = "success"
2318
AUTO_REPAIR_FAILURE = "failure"
2319
AUTO_REPAIR_ENOPERM = "enoperm"
2320
AUTO_REPAIR_ALL_RESULTS = frozenset([
2321
    AUTO_REPAIR_SUCCESS,
2322
    AUTO_REPAIR_FAILURE,
2323
    AUTO_REPAIR_ENOPERM,
2324
])
2325

    
2326
# The version identifier for builtin data collectors
2327
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2328

    
2329
# Do not re-export imported modules
2330
del re, _vcsversion, _autoconf, socket, pathutils, compat