Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 0c348b86

History | View | Annotate | Download (60.2 kB)

1
#
2
#
3

    
4
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Module holding different constants."""
23

    
24
import re
25
import socket
26

    
27
from ganeti import _autoconf
28
from ganeti import _vcsversion
29
from ganeti import compat
30
from ganeti import pathutils
31

    
32

    
33
# various versions
34
RELEASE_VERSION = _autoconf.PACKAGE_VERSION
35
OS_API_V10 = 10
36
OS_API_V15 = 15
37
OS_API_V20 = 20
38
OS_API_VERSIONS = compat.UniqueFrozenset([
39
  OS_API_V10,
40
  OS_API_V15,
41
  OS_API_V20,
42
  ])
43
VCS_VERSION = _vcsversion.VCS_VERSION
44
EXPORT_VERSION = 0
45
RAPI_VERSION = 2
46

    
47

    
48
# Format for CONFIG_VERSION:
49
#   01 03 0123 = 01030123
50
#   ^^ ^^ ^^^^
51
#   |  |  + Configuration version/revision
52
#   |  + Minor version
53
#   + Major version
54
#
55
# It is stored as an integer. Make sure not to write an octal number.
56

    
57
# BuildVersion and SplitVersion must be in here because we can't import other
58
# modules. The cfgupgrade tool must be able to read and write version numbers
59
# and thus requires these functions. To avoid code duplication, they're kept in
60
# here.
61

    
62
def BuildVersion(major, minor, revision):
63
  """Calculates int version number from major, minor and revision numbers.
64

65
  Returns: int representing version number
66

67
  """
68
  assert isinstance(major, int)
69
  assert isinstance(minor, int)
70
  assert isinstance(revision, int)
71
  return (1000000 * major +
72
            10000 * minor +
73
                1 * revision)
74

    
75

    
76
def SplitVersion(version):
77
  """Splits version number stored in an int.
78

79
  Returns: tuple; (major, minor, revision)
80

81
  """
82
  assert isinstance(version, int)
83

    
84
  (major, remainder) = divmod(version, 1000000)
85
  (minor, revision) = divmod(remainder, 10000)
86

    
87
  return (major, minor, revision)
88

    
89

    
90
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
91
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
92
CONFIG_REVISION = 0
93
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
94

    
95
#: RPC protocol version
96
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)
97

    
98
# user separation
99
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
100
ADMIN_GROUP = _autoconf.ADMIN_GROUP
101
MASTERD_USER = _autoconf.MASTERD_USER
102
MASTERD_GROUP = _autoconf.MASTERD_GROUP
103
RAPI_USER = _autoconf.RAPI_USER
104
RAPI_GROUP = _autoconf.RAPI_GROUP
105
CONFD_USER = _autoconf.CONFD_USER
106
CONFD_GROUP = _autoconf.CONFD_GROUP
107
NODED_USER = _autoconf.NODED_USER
108
NODED_GROUP = _autoconf.NODED_GROUP
109
SSH_LOGIN_USER = _autoconf.SSH_LOGIN_USER
110
SSH_CONSOLE_USER = _autoconf.SSH_CONSOLE_USER
111

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

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

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

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

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

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

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

    
166
FIRST_DRBD_PORT = 11000
167
LAST_DRBD_PORT = 14999
168

    
169
DAEMONS_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

    
201
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
202
  XEN_CMD_XM,
203
  XEN_CMD_XL,
204
  ])
205

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

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

    
224
#: Console as SSH command
225
CONS_SSH = "ssh"
226

    
227
#: Console as VNC server
228
CONS_VNC = "vnc"
229

    
230
#: Console as SPICE server
231
CONS_SPICE = "spice"
232

    
233
#: Display a message for console access
234
CONS_MESSAGE = "msg"
235

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

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

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

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

    
260
# Default validity of certificates in days
261
X509_CERT_DEFAULT_VALIDITY = 365 * 5
262

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

    
266
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
267

    
268
# Import/export daemon mode
269
IEM_IMPORT = "import"
270
IEM_EXPORT = "export"
271

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

    
280
IE_CUSTOM_SIZE = "fd"
281

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

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

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

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

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

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

    
317
HKR_SKIP = 0
318
HKR_FAIL = 1
319
HKR_SUCCESS = 2
320

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

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

    
337
# Storage operations
338
SO_FIX_CONSISTENCY = "fix-consistency"
339

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

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

    
356
MODIFIABLE_STORAGE_FIELDS = {
357
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
358
  }
359

    
360
VALID_STORAGE_OPERATIONS = {
361
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
362
  }
363

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
715
ES_PARAMETERS_FILE = "parameters.list"
716

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

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

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

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

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

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

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

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

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

    
846

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

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

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

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

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

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

    
950
# KVM-specific statuses
951
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
952

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1180
OOB_POWER_STATUS_POWERED = "powered"
1181

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

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

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

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

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

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

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

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

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

    
1223
NETWORK_VALID_TYPES = compat.UniqueFrozenset([
1224
  NETWORK_TYPE_PRIVATE,
1225
  NETWORK_TYPE_PUBLIC,
1226
  ])
1227

    
1228
NICS_PARAMETER_TYPES = {
1229
  NIC_MODE: VTYPE_STRING,
1230
  NIC_LINK: VTYPE_STRING,
1231
  }
1232

    
1233
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1234

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

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

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

    
1284
VNC_BASE_PORT = 5900
1285
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1286

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

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

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

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

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

    
1349
# Mouse types:
1350
HT_MOUSE_MOUSE = "mouse"
1351
HT_MOUSE_TABLET = "tablet"
1352

    
1353
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1354
  HT_MOUSE_MOUSE,
1355
  HT_MOUSE_TABLET,
1356
  ])
1357

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

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

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

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

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

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

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

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

    
1410
# Security models
1411
HT_SM_NONE = "none"
1412
HT_SM_USER = "user"
1413
HT_SM_POOL = "pool"
1414

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

    
1421
# Kvm flag values
1422
HT_KVM_ENABLED = "enabled"
1423
HT_KVM_DISABLED = "disabled"
1424

    
1425
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1426

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

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

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

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

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

    
1565
CV_ALL_ECODES_STRINGS = \
1566
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1567

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

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

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

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

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

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

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

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

    
1683
# Job queue
1684
JOB_QUEUE_VERSION = 1
1685
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1686

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

    
1690
# unchanged job return
1691
JOB_NOTCHANGED = "nochange"
1692

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

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

    
1731
# OpCode priority
1732
OP_PRIO_LOWEST = +19
1733
OP_PRIO_HIGHEST = -20
1734

    
1735
OP_PRIO_LOW = +10
1736
OP_PRIO_NORMAL = 0
1737
OP_PRIO_HIGH = -10
1738

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

    
1745
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1746

    
1747
# Lock recalculate mode
1748
LOCKS_REPLACE = "replace"
1749
LOCKS_APPEND = "append"
1750

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

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

    
1765
# /etc/hosts modification
1766
ETC_HOSTS_ADD = "add"
1767
ETC_HOSTS_REMOVE = "remove"
1768

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

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

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

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

    
1812
#: List of resources which can be queried using RAPI
1813
QR_VIA_RAPI = QR_VIA_LUXI
1814

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

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

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

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

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

    
1866
# max dynamic devices
1867
MAX_NICS = 8
1868
MAX_DISKS = 16
1869

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

    
1897
SS_FILE_PERMS = 0444
1898

    
1899
# cluster wide default parameters
1900
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
1901

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

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

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

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

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

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

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

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

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

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

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

    
2134
MASTER_POOL_SIZE_DEFAULT = 10
2135

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

    
2142
CONFD_PROTOCOL_VERSION = 1
2143

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2339
# Do not re-export imported modules
2340
del re, _vcsversion, _autoconf, socket, pathutils, compat