Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ da761678

History | View | Annotate | Download (64.5 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

    
139
# Wipe
140
DD_CMD = "dd"
141
MAX_WIPE_CHUNK = 1024 # 1GB
142
MIN_WIPE_CHUNK_PERCENT = 10
143

    
144
RUN_DIRS_MODE = 0775
145
SECURE_DIR_MODE = 0700
146
SECURE_FILE_MODE = 0600
147
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
148
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
149
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
150
ENABLE_CONFD = _autoconf.ENABLE_CONFD
151
ENABLE_MOND = _autoconf.ENABLE_MOND
152
ENABLE_SPLIT_QUERY = _autoconf.ENABLE_SPLIT_QUERY
153
ENABLE_RESTRICTED_COMMANDS = _autoconf.ENABLE_RESTRICTED_COMMANDS
154

    
155
# SSH constants
156
SSH = "ssh"
157
SCP = "scp"
158

    
159
NODED = "ganeti-noded"
160
CONFD = "ganeti-confd"
161
LUXID = "ganeti-luxid"
162
RAPI = "ganeti-rapi"
163
MASTERD = "ganeti-masterd"
164
MOND = "ganeti-mond"
165

    
166
DAEMONS = compat.UniqueFrozenset([
167
  NODED,
168
  CONFD,
169
  LUXID,
170
  RAPI,
171
  MASTERD,
172
  MOND,
173
  ])
174

    
175
DAEMONS_PORTS = {
176
  # daemon-name: ("proto", "default-port")
177
  NODED: ("tcp", 1811),
178
  CONFD: ("udp", 1814),
179
  MOND: ("tcp", 1815),
180
  RAPI: ("tcp", 5080),
181
  SSH: ("tcp", 22),
182
}
183

    
184
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
185
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
186
DEFAULT_MOND_PORT = DAEMONS_PORTS[MOND][1]
187
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
188

    
189
FIRST_DRBD_PORT = 11000
190
LAST_DRBD_PORT = 14999
191

    
192
DAEMONS_LOGBASE = {
193
  NODED: "node-daemon",
194
  CONFD: "conf-daemon",
195
  LUXID: "luxi-daemon",
196
  RAPI: "rapi-daemon",
197
  MASTERD: "master-daemon",
198
  MOND: "monitoring-daemon",
199
  }
200

    
201
DAEMONS_LOGFILES = \
202
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
203
         for daemon in DAEMONS_LOGBASE)
204

    
205
# Some daemons might require more than one logfile.
206
# Specifically, right now only the Haskell http library "snap", used by the
207
# monitoring daemon, requires multiple log files.
208

    
209
# These are the only valid reasons for having an extra logfile
210
EXTRA_LOGREASON_ACCESS = "access"
211
EXTRA_LOGREASON_ERROR = "error"
212

    
213
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
214
  EXTRA_LOGREASON_ACCESS,
215
  EXTRA_LOGREASON_ERROR,
216
  ])
217

    
218
# These are the extra logfiles, grouped by daemon
219
DAEMONS_EXTRA_LOGBASE = {
220
  MOND: {
221
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
222
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
223
    }
224
  }
225

    
226
DAEMONS_EXTRA_LOGFILES = \
227
  dict((daemon, dict((extra,
228
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
229
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
230
         for daemon in DAEMONS_EXTRA_LOGBASE)
231

    
232
DEV_CONSOLE = "/dev/console"
233

    
234
PROC_MOUNTS = "/proc/mounts"
235

    
236
# Local UniX Interface related constants
237
LUXI_EOM = "\3"
238
LUXI_VERSION = CONFIG_VERSION
239
#: Environment variable for the luxi override socket
240
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
241
LUXI_OVERRIDE_MASTER = "master"
242
LUXI_OVERRIDE_QUERY = "query"
243
LUXI_SOCKET_PERMS = 0660
244

    
245
# one of "no", "yes", "only"
246
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
247
SYSLOG_NO = "no"
248
SYSLOG_YES = "yes"
249
SYSLOG_ONLY = "only"
250
SYSLOG_SOCKET = "/dev/log"
251

    
252
EXPORT_CONF_FILE = "config.ini"
253

    
254
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
255
XEN_KERNEL = _autoconf.XEN_KERNEL
256
XEN_INITRD = _autoconf.XEN_INITRD
257
XEN_CMD_XM = "xm"
258
XEN_CMD_XL = "xl"
259
# FIXME: This will be made configurable using hvparams in Ganeti 2.7
260
XEN_CMD = _autoconf.XEN_CMD
261

    
262
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
263
  XEN_CMD_XM,
264
  XEN_CMD_XL,
265
  ])
266

    
267
# When the Xen toolstack used is "xl", live migration requires the source host
268
# to connect to the target host via ssh (xl runs this command). We need to pass
269
# the command xl runs some extra info so that it can use Ganeti's key
270
# verification and not fail. Note that this string is incomplete: it must be
271
# filled with the cluster name before being used.
272
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
273
              " -oUserKnownHostsFile=/dev/null"
274
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
275
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
276
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
277

    
278
KVM_PATH = _autoconf.KVM_PATH
279
KVM_KERNEL = _autoconf.KVM_KERNEL
280
SOCAT_PATH = _autoconf.SOCAT_PATH
281
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
282
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
283
SOCAT_ESCAPE_CODE = "0x1d"
284

    
285
#: Console as SSH command
286
CONS_SSH = "ssh"
287

    
288
#: Console as VNC server
289
CONS_VNC = "vnc"
290

    
291
#: Console as SPICE server
292
CONS_SPICE = "spice"
293

    
294
#: Display a message for console access
295
CONS_MESSAGE = "msg"
296

    
297
#: All console types
298
CONS_ALL = compat.UniqueFrozenset([
299
  CONS_SSH,
300
  CONS_VNC,
301
  CONS_SPICE,
302
  CONS_MESSAGE,
303
  ])
304

    
305
# For RSA keys more bits are better, but they also make operations more
306
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
307
# 2010 on.
308
RSA_KEY_BITS = 2048
309

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

    
318
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
319
X509_CERT_SIGN_DIGEST = "SHA1"
320

    
321
# Default validity of certificates in days
322
X509_CERT_DEFAULT_VALIDITY = 365 * 5
323

    
324
# commonName (CN) used in certificates
325
X509_CERT_CN = "ganeti.example.com"
326

    
327
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
328

    
329
# Import/export daemon mode
330
IEM_IMPORT = "import"
331
IEM_EXPORT = "export"
332

    
333
# Import/export transport compression
334
IEC_NONE = "none"
335
IEC_GZIP = "gzip"
336
IEC_ALL = compat.UniqueFrozenset([
337
  IEC_NONE,
338
  IEC_GZIP,
339
  ])
340

    
341
IE_CUSTOM_SIZE = "fd"
342

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

    
345
# Import/export I/O
346
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
347
IEIO_FILE = "file"
348
# Raw block device I/O using "dd"
349
IEIO_RAW_DISK = "raw"
350
# OS definition import/export script
351
IEIO_SCRIPT = "script"
352

    
353
VALUE_DEFAULT = "default"
354
VALUE_AUTO = "auto"
355
VALUE_GENERATE = "generate"
356
VALUE_NONE = "none"
357
VALUE_TRUE = "true"
358
VALUE_FALSE = "false"
359

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

    
363
# hooks-related constants
364
HOOKS_PHASE_PRE = "pre"
365
HOOKS_PHASE_POST = "post"
366
HOOKS_NAME_CFGUPDATE = "config-update"
367
HOOKS_NAME_WATCHER = "watcher"
368
HOOKS_VERSION = 2
369
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
370

    
371
# hooks subject type (what object type does the LU deal with)
372
HTYPE_CLUSTER = "CLUSTER"
373
HTYPE_NODE = "NODE"
374
HTYPE_GROUP = "GROUP"
375
HTYPE_INSTANCE = "INSTANCE"
376
HTYPE_NETWORK = "NETWORK"
377

    
378
HKR_SKIP = 0
379
HKR_FAIL = 1
380
HKR_SUCCESS = 2
381

    
382
# Storage types
383
ST_BLOCK = "blockdev"
384
ST_DISKLESS = "diskless"
385
ST_EXT = "ext"
386
ST_FILE = "file"
387
ST_LVM_PV = "lvm-pv"
388
ST_LVM_VG = "lvm-vg"
389
ST_RADOS = "rados"
390

    
391
VALID_STORAGE_TYPES = compat.UniqueFrozenset([
392
  ST_BLOCK,
393
  ST_DISKLESS,
394
  ST_EXT,
395
  ST_FILE,
396
  ST_LVM_PV,
397
  ST_LVM_VG,
398
  ST_RADOS,
399
  ])
400

    
401
# Storage fields
402
# first two are valid in LU context only, not passed to backend
403
SF_NODE = "node"
404
SF_TYPE = "type"
405
# and the rest are valid in backend
406
SF_NAME = "name"
407
SF_SIZE = "size"
408
SF_FREE = "free"
409
SF_USED = "used"
410
SF_ALLOCATABLE = "allocatable"
411

    
412
# Storage operations
413
SO_FIX_CONSISTENCY = "fix-consistency"
414

    
415
# Available fields per storage type
416
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
417
  SF_NAME,
418
  SF_TYPE,
419
  SF_SIZE,
420
  SF_USED,
421
  SF_FREE,
422
  SF_ALLOCATABLE,
423
  ])
424

    
425
MODIFIABLE_STORAGE_FIELDS = {
426
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
427
  }
428

    
429
VALID_STORAGE_OPERATIONS = {
430
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
431
  }
432

    
433
# Local disk status
434
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
435
(LDS_OKAY,
436
 LDS_UNKNOWN,
437
 LDS_FAULTY) = range(1, 4)
438

    
439
# disk template types
440
DT_BLOCK = "blockdev"
441
DT_DISKLESS = "diskless"
442
DT_DRBD8 = "drbd"
443
DT_EXT = "ext"
444
DT_FILE = "file"
445
DT_PLAIN = "plain"
446
DT_RBD = "rbd"
447
DT_SHARED_FILE = "sharedfile"
448

    
449
# This is used to order determine the default disk template when the list
450
# of enabled disk templates is inferred from the current state of the cluster.
451
# This only happens on an upgrade from a version of Ganeti that did not
452
# support the 'enabled_disk_templates' so far.
453
DISK_TEMPLATE_PREFERENCE = [
454
  DT_DRBD8,
455
  DT_PLAIN,
456
  DT_FILE,
457
  DT_SHARED_FILE,
458
  DT_RBD,
459
  DT_BLOCK,
460
  DT_DISKLESS,
461
  DT_EXT
462
  ]
463

    
464
DISK_TEMPLATES = compat.UniqueFrozenset([
465
  DT_DISKLESS,
466
  DT_PLAIN,
467
  DT_DRBD8,
468
  DT_FILE,
469
  DT_SHARED_FILE,
470
  DT_BLOCK,
471
  DT_RBD,
472
  DT_EXT
473
  ])
474

    
475
# disk templates that are enabled by default
476
DEFAULT_ENABLED_DISK_TEMPLATES = compat.UniqueFrozenset([
477
  DT_DRBD8,
478
  DT_PLAIN,
479
  ])
480

    
481
# mapping of disk templates to storage types
482
DISK_TEMPLATES_STORAGE_TYPE = {
483
  DT_BLOCK: ST_BLOCK,
484
  DT_DISKLESS: ST_DISKLESS,
485
  DT_DRBD8: ST_LVM_VG,
486
  DT_EXT: ST_EXT,
487
  DT_FILE: ST_FILE,
488
  DT_PLAIN: ST_LVM_VG,
489
  DT_RBD: ST_RADOS,
490
  DT_SHARED_FILE: ST_FILE,
491
  }
492

    
493
# the set of network-mirrored disk templates
494
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
495

    
496
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
497
DTS_EXT_MIRROR = compat.UniqueFrozenset([
498
  DT_DISKLESS, # 'trivially' externally mirrored
499
  DT_SHARED_FILE,
500
  DT_BLOCK,
501
  DT_RBD,
502
  DT_EXT,
503
  ])
504

    
505
# the set of non-lvm-based disk templates
506
DTS_NOT_LVM = compat.UniqueFrozenset([
507
  DT_DISKLESS,
508
  DT_FILE,
509
  DT_SHARED_FILE,
510
  DT_BLOCK,
511
  DT_RBD,
512
  DT_EXT,
513
  ])
514

    
515
# the set of disk templates which can be grown
516
DTS_GROWABLE = compat.UniqueFrozenset([
517
  DT_PLAIN,
518
  DT_DRBD8,
519
  DT_FILE,
520
  DT_SHARED_FILE,
521
  DT_RBD,
522
  DT_EXT,
523
  ])
524

    
525
# the set of disk templates that allow adoption
526
DTS_MAY_ADOPT = compat.UniqueFrozenset([
527
  DT_PLAIN,
528
  DT_BLOCK,
529
  ])
530

    
531
# the set of disk templates that *must* use adoption
532
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
533

    
534
# the set of disk templates that allow migrations
535
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
536

    
537
# the set of file based disk templates
538
DTS_FILEBASED = compat.UniqueFrozenset([
539
  DT_FILE,
540
  DT_SHARED_FILE,
541
  ])
542

    
543
# the set of disk templates that can be moved by copying
544
# Note: a requirement is that they're not accessed externally or shared between
545
# nodes; in particular, sharedfile is not suitable.
546
DTS_COPYABLE = compat.UniqueFrozenset([
547
  DT_FILE,
548
  DT_PLAIN,
549
  ])
550

    
551
# the set of disk templates that are supported by exclusive_storage
552
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
553

    
554
# templates for which we don't perform checks on free space
555
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
556
  DT_FILE,
557
  DT_SHARED_FILE,
558
  DT_RBD,
559
  DT_EXT,
560
  ])
561

    
562
# logical disk types
563
LD_LV = "lvm"
564
LD_DRBD8 = "drbd8"
565
LD_FILE = "file"
566
LD_BLOCKDEV = "blockdev"
567
LD_RBD = "rbd"
568
LD_EXT = "ext"
569
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
570
  LD_LV,
571
  LD_DRBD8,
572
  LD_FILE,
573
  LD_BLOCKDEV,
574
  LD_RBD,
575
  LD_EXT,
576
  ])
577

    
578
LDS_BLOCK = compat.UniqueFrozenset([
579
  LD_LV,
580
  LD_DRBD8,
581
  LD_BLOCKDEV,
582
  LD_RBD,
583
  LD_EXT,
584
  ])
585

    
586
# drbd constants
587
DRBD_HMAC_ALG = "md5"
588
DRBD_NET_PROTOCOL = "C"
589
DRBD_STATUS_FILE = "/proc/drbd"
590

    
591
#: Size of DRBD meta block device
592
DRBD_META_SIZE = 128
593

    
594
# drbd barrier types
595
DRBD_B_NONE = "n"
596
DRBD_B_DISK_BARRIERS = "b"
597
DRBD_B_DISK_DRAIN = "d"
598
DRBD_B_DISK_FLUSH = "f"
599

    
600
# Valid barrier combinations: "n" or any non-null subset of "bfd"
601
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
602
  frozenset([DRBD_B_NONE]),
603
  frozenset([DRBD_B_DISK_BARRIERS]),
604
  frozenset([DRBD_B_DISK_DRAIN]),
605
  frozenset([DRBD_B_DISK_FLUSH]),
606
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
607
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
608
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
609
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
610
  ])
611

    
612
# rbd tool command
613
RBD_CMD = "rbd"
614

    
615
# file backend driver
616
FD_LOOP = "loop"
617
FD_BLKTAP = "blktap"
618
FD_DEFAULT = FD_LOOP
619

    
620
# the set of drbd-like disk types
621
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
622

    
623
# disk access mode
624
DISK_RDONLY = "ro"
625
DISK_RDWR = "rw"
626
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
627

    
628
# disk replacement mode
629
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
630
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
631
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
632
REPLACE_DISK_AUTO = "replace_auto"
633
REPLACE_MODES = compat.UniqueFrozenset([
634
  REPLACE_DISK_PRI,
635
  REPLACE_DISK_SEC,
636
  REPLACE_DISK_CHG,
637
  REPLACE_DISK_AUTO,
638
  ])
639

    
640
# Instance export mode
641
EXPORT_MODE_LOCAL = "local"
642
EXPORT_MODE_REMOTE = "remote"
643
EXPORT_MODES = compat.UniqueFrozenset([
644
  EXPORT_MODE_LOCAL,
645
  EXPORT_MODE_REMOTE,
646
  ])
647

    
648
# instance creation modes
649
INSTANCE_CREATE = "create"
650
INSTANCE_IMPORT = "import"
651
INSTANCE_REMOTE_IMPORT = "remote-import"
652
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
653
  INSTANCE_CREATE,
654
  INSTANCE_IMPORT,
655
  INSTANCE_REMOTE_IMPORT,
656
  ])
657

    
658
# Remote import/export handshake message and version
659
RIE_VERSION = 0
660
RIE_HANDSHAKE = "Hi, I'm Ganeti"
661

    
662
# Remote import/export certificate validity in seconds
663
RIE_CERT_VALIDITY = 24 * 60 * 60
664

    
665
# Overall timeout for establishing connection
666
RIE_CONNECT_TIMEOUT = 180
667

    
668
# Export only: how long to wait per connection attempt (seconds)
669
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
670

    
671
# Export only: number of attempts to connect
672
RIE_CONNECT_RETRIES = 10
673

    
674
#: Give child process up to 5 seconds to exit after sending a signal
675
CHILD_LINGER_TIMEOUT = 5.0
676

    
677
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
678

    
679
# import/export config options
680
INISECT_EXP = "export"
681
INISECT_INS = "instance"
682
INISECT_HYP = "hypervisor"
683
INISECT_BEP = "backend"
684
INISECT_OSP = "os"
685

    
686
# dynamic device modification
687
DDM_ADD = "add"
688
DDM_MODIFY = "modify"
689
DDM_REMOVE = "remove"
690
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
691
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
692
  DDM_MODIFY,
693
  ]))
694
# TODO: DDM_SWAP, DDM_MOVE?
695

    
696
# device types to hotplug
697
HOTPLUG_TARGET_DISK = "hotdisk"
698
HOTPLUG_TARGET_NIC = "hotnic"
699
HOTPLUG_ALL_TARGETS = frozenset([
700
  HOTPLUG_TARGET_DISK,
701
  HOTPLUG_TARGET_NIC
702
  ])
703

    
704
# hotplug actions
705
HOTPLUG_ACTION_ADD = "hotadd"
706
HOTPLUG_ACTION_REMOVE = "hotremove"
707
HOTPLUG_ACTION_MODIFY = "hotmod"
708
HOTPLUG_ALL_ACTIONS = frozenset([
709
  HOTPLUG_ACTION_ADD,
710
  HOTPLUG_ACTION_REMOVE,
711
  HOTPLUG_ACTION_MODIFY
712
  ])
713

    
714
# common exit codes
715
EXIT_SUCCESS = 0
716
EXIT_FAILURE = 1
717
EXIT_NOTCLUSTER = 5
718
EXIT_NOTMASTER = 11
719
EXIT_NODESETUP_ERROR = 12
720
EXIT_CONFIRMATION = 13 # need user confirmation
721

    
722
#: Exit code for query operations with unknown fields
723
EXIT_UNKNOWN_FIELD = 14
724

    
725
# tags
726
TAG_CLUSTER = "cluster"
727
TAG_NODEGROUP = "nodegroup"
728
TAG_NODE = "node"
729
TAG_INSTANCE = "instance"
730
TAG_NETWORK = "network"
731
VALID_TAG_TYPES = compat.UniqueFrozenset([
732
  TAG_CLUSTER,
733
  TAG_NODEGROUP,
734
  TAG_NODE,
735
  TAG_INSTANCE,
736
  TAG_NETWORK,
737
  ])
738
MAX_TAG_LEN = 128
739
MAX_TAGS_PER_OBJ = 4096
740

    
741
# others
742
DEFAULT_BRIDGE = "xen-br0"
743
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
744
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
745
IP4_ADDRESS_ANY = "0.0.0.0"
746
IP6_ADDRESS_LOCALHOST = "::1"
747
IP6_ADDRESS_ANY = "::"
748
IP4_VERSION = 4
749
IP6_VERSION = 6
750
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
751
# for export to htools
752
IP4_FAMILY = socket.AF_INET
753
IP6_FAMILY = socket.AF_INET6
754

    
755
TCP_PING_TIMEOUT = 10
756
DEFAULT_VG = "xenvg"
757
DEFAULT_DRBD_HELPER = "/bin/true"
758
MIN_VG_SIZE = 20480
759
DEFAULT_MAC_PREFIX = "aa:00:00"
760
# default maximum instance wait time, in seconds.
761
DEFAULT_SHUTDOWN_TIMEOUT = 120
762
NODE_MAX_CLOCK_SKEW = 150
763
# Time for an intra-cluster disk transfer to wait for a connection
764
DISK_TRANSFER_CONNECT_TIMEOUT = 60
765
# Disk index separator
766
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
767
IP_COMMAND_PATH = _autoconf.IP_PATH
768

    
769
#: Key for job IDs in opcode result
770
JOB_IDS_KEY = "jobs"
771

    
772
# runparts results
773
(RUNPARTS_SKIP,
774
 RUNPARTS_RUN,
775
 RUNPARTS_ERR) = range(3)
776

    
777
RUNPARTS_STATUS = compat.UniqueFrozenset([
778
  RUNPARTS_SKIP,
779
  RUNPARTS_RUN,
780
  RUNPARTS_ERR,
781
  ])
782

    
783
# RPC constants
784
(RPC_ENCODING_NONE,
785
 RPC_ENCODING_ZLIB_BASE64) = range(2)
786

    
787
# Various time constants for the timeout table
788
RPC_TMO_URGENT = 60 # one minute
789
RPC_TMO_FAST = 5 * 60 # five minutes
790
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
791
RPC_TMO_SLOW = 3600 # one hour
792
RPC_TMO_4HRS = 4 * 3600
793
RPC_TMO_1DAY = 86400
794

    
795
# Timeout for connecting to nodes (seconds)
796
RPC_CONNECT_TIMEOUT = 5
797

    
798
# os related constants
799
OS_SCRIPT_CREATE = "create"
800
OS_SCRIPT_IMPORT = "import"
801
OS_SCRIPT_EXPORT = "export"
802
OS_SCRIPT_RENAME = "rename"
803
OS_SCRIPT_VERIFY = "verify"
804
OS_SCRIPTS = compat.UniqueFrozenset([
805
  OS_SCRIPT_CREATE,
806
  OS_SCRIPT_IMPORT,
807
  OS_SCRIPT_EXPORT,
808
  OS_SCRIPT_RENAME,
809
  OS_SCRIPT_VERIFY,
810
  ])
811

    
812
OS_API_FILE = "ganeti_api_version"
813
OS_VARIANTS_FILE = "variants.list"
814
OS_PARAMETERS_FILE = "parameters.list"
815

    
816
OS_VALIDATE_PARAMETERS = "parameters"
817
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
818

    
819
# External Storage (ES) related constants
820
ES_ACTION_CREATE = "create"
821
ES_ACTION_REMOVE = "remove"
822
ES_ACTION_GROW = "grow"
823
ES_ACTION_ATTACH = "attach"
824
ES_ACTION_DETACH = "detach"
825
ES_ACTION_SETINFO = "setinfo"
826
ES_ACTION_VERIFY = "verify"
827

    
828
ES_SCRIPT_CREATE = ES_ACTION_CREATE
829
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
830
ES_SCRIPT_GROW = ES_ACTION_GROW
831
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
832
ES_SCRIPT_DETACH = ES_ACTION_DETACH
833
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
834
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
835
ES_SCRIPTS = frozenset([
836
  ES_SCRIPT_CREATE,
837
  ES_SCRIPT_REMOVE,
838
  ES_SCRIPT_GROW,
839
  ES_SCRIPT_ATTACH,
840
  ES_SCRIPT_DETACH,
841
  ES_SCRIPT_SETINFO,
842
  ES_SCRIPT_VERIFY
843
  ])
844

    
845
ES_PARAMETERS_FILE = "parameters.list"
846

    
847
# reboot types
848
INSTANCE_REBOOT_SOFT = "soft"
849
INSTANCE_REBOOT_HARD = "hard"
850
INSTANCE_REBOOT_FULL = "full"
851

    
852
REBOOT_TYPES = compat.UniqueFrozenset([
853
  INSTANCE_REBOOT_SOFT,
854
  INSTANCE_REBOOT_HARD,
855
  INSTANCE_REBOOT_FULL,
856
  ])
857

    
858
# instance reboot behaviors
859
INSTANCE_REBOOT_ALLOWED = "reboot"
860
INSTANCE_REBOOT_EXIT = "exit"
861

    
862
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
863
  INSTANCE_REBOOT_ALLOWED,
864
  INSTANCE_REBOOT_EXIT,
865
  ])
866

    
867
VTYPE_STRING = "string"
868
VTYPE_MAYBE_STRING = "maybe-string"
869
VTYPE_BOOL = "bool"
870
VTYPE_SIZE = "size" # size, in MiBs
871
VTYPE_INT = "int"
872
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
873
  VTYPE_STRING,
874
  VTYPE_MAYBE_STRING,
875
  VTYPE_BOOL,
876
  VTYPE_SIZE,
877
  VTYPE_INT,
878
  ])
879

    
880
# Constant representing that the user does not specify any IP version
881
IFACE_NO_IP_VERSION_SPECIFIED = 0
882

    
883
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
884
  75,
885
  110,
886
  300,
887
  600,
888
  1200,
889
  1800,
890
  2400,
891
  4800,
892
  9600,
893
  14400,
894
  19200,
895
  28800,
896
  38400,
897
  57600,
898
  115200,
899
  230400,
900
  345600,
901
  460800,
902
  ])
903

    
904
# HV parameter names (global namespace)
905
HV_BOOT_ORDER = "boot_order"
906
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
907
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
908
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
909
HV_NIC_TYPE = "nic_type"
910
HV_DISK_TYPE = "disk_type"
911
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
912
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
913
HV_VNC_PASSWORD_FILE = "vnc_password_file"
914
HV_VNC_TLS = "vnc_tls"
915
HV_VNC_X509 = "vnc_x509_path"
916
HV_VNC_X509_VERIFY = "vnc_x509_verify"
917
HV_KVM_SPICE_BIND = "spice_bind"
918
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
919
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
920
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
921
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
922
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
923
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
924
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
925
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
926
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
927
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
928
HV_ACPI = "acpi"
929
HV_PAE = "pae"
930
HV_USE_BOOTLOADER = "use_bootloader"
931
HV_BOOTLOADER_ARGS = "bootloader_args"
932
HV_BOOTLOADER_PATH = "bootloader_path"
933
HV_KERNEL_ARGS = "kernel_args"
934
HV_KERNEL_PATH = "kernel_path"
935
HV_INITRD_PATH = "initrd_path"
936
HV_ROOT_PATH = "root_path"
937
HV_SERIAL_CONSOLE = "serial_console"
938
HV_SERIAL_SPEED = "serial_speed"
939
HV_USB_MOUSE = "usb_mouse"
940
HV_KEYMAP = "keymap"
941
HV_DEVICE_MODEL = "device_model"
942
HV_INIT_SCRIPT = "init_script"
943
HV_MIGRATION_PORT = "migration_port"
944
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
945
HV_MIGRATION_DOWNTIME = "migration_downtime"
946
HV_MIGRATION_MODE = "migration_mode"
947
HV_USE_LOCALTIME = "use_localtime"
948
HV_DISK_CACHE = "disk_cache"
949
HV_SECURITY_MODEL = "security_model"
950
HV_SECURITY_DOMAIN = "security_domain"
951
HV_KVM_FLAG = "kvm_flag"
952
HV_VHOST_NET = "vhost_net"
953
HV_KVM_USE_CHROOT = "use_chroot"
954
HV_CPU_MASK = "cpu_mask"
955
HV_MEM_PATH = "mem_path"
956
HV_PASSTHROUGH = "pci_pass"
957
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
958
HV_REBOOT_BEHAVIOR = "reboot_behavior"
959
HV_CPU_TYPE = "cpu_type"
960
HV_CPU_CAP = "cpu_cap"
961
HV_CPU_WEIGHT = "cpu_weight"
962
HV_CPU_CORES = "cpu_cores"
963
HV_CPU_THREADS = "cpu_threads"
964
HV_CPU_SOCKETS = "cpu_sockets"
965
HV_SOUNDHW = "soundhw"
966
HV_USB_DEVICES = "usb_devices"
967
HV_VGA = "vga"
968
HV_KVM_EXTRA = "kvm_extra"
969
HV_KVM_MACHINE_VERSION = "machine_version"
970
HV_KVM_PATH = "kvm_path"
971
HV_VIF_TYPE = "vif_type"
972
HV_VNET_HDR = "vnet_hdr"
973
HV_VIRIDIAN = "viridian"
974
HV_VIF_SCRIPT = "vif_script"
975

    
976

    
977
HVS_PARAMETER_TYPES = {
978
  HV_KVM_PATH: VTYPE_STRING,
979
  HV_BOOT_ORDER: VTYPE_STRING,
980
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
981
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
982
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
983
  HV_NIC_TYPE: VTYPE_STRING,
984
  HV_DISK_TYPE: VTYPE_STRING,
985
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
986
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
987
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
988
  HV_VNC_TLS: VTYPE_BOOL,
989
  HV_VNC_X509: VTYPE_STRING,
990
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
991
  HV_KVM_SPICE_BIND: VTYPE_STRING,
992
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
993
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
994
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
995
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
996
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
997
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
998
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
999
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
1000
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
1001
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
1002
  HV_ACPI: VTYPE_BOOL,
1003
  HV_PAE: VTYPE_BOOL,
1004
  HV_USE_BOOTLOADER: VTYPE_BOOL,
1005
  HV_BOOTLOADER_PATH: VTYPE_STRING,
1006
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
1007
  HV_KERNEL_PATH: VTYPE_STRING,
1008
  HV_KERNEL_ARGS: VTYPE_STRING,
1009
  HV_INITRD_PATH: VTYPE_STRING,
1010
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
1011
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
1012
  HV_SERIAL_SPEED: VTYPE_INT,
1013
  HV_USB_MOUSE: VTYPE_STRING,
1014
  HV_KEYMAP: VTYPE_STRING,
1015
  HV_DEVICE_MODEL: VTYPE_STRING,
1016
  HV_INIT_SCRIPT: VTYPE_STRING,
1017
  HV_MIGRATION_PORT: VTYPE_INT,
1018
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
1019
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
1020
  HV_MIGRATION_MODE: VTYPE_STRING,
1021
  HV_USE_LOCALTIME: VTYPE_BOOL,
1022
  HV_DISK_CACHE: VTYPE_STRING,
1023
  HV_SECURITY_MODEL: VTYPE_STRING,
1024
  HV_SECURITY_DOMAIN: VTYPE_STRING,
1025
  HV_KVM_FLAG: VTYPE_STRING,
1026
  HV_VHOST_NET: VTYPE_BOOL,
1027
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
1028
  HV_CPU_MASK: VTYPE_STRING,
1029
  HV_MEM_PATH: VTYPE_STRING,
1030
  HV_PASSTHROUGH: VTYPE_STRING,
1031
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
1032
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
1033
  HV_CPU_TYPE: VTYPE_STRING,
1034
  HV_CPU_CAP: VTYPE_INT,
1035
  HV_CPU_WEIGHT: VTYPE_INT,
1036
  HV_CPU_CORES: VTYPE_INT,
1037
  HV_CPU_THREADS: VTYPE_INT,
1038
  HV_CPU_SOCKETS: VTYPE_INT,
1039
  HV_SOUNDHW: VTYPE_STRING,
1040
  HV_USB_DEVICES: VTYPE_STRING,
1041
  HV_VGA: VTYPE_STRING,
1042
  HV_KVM_EXTRA: VTYPE_STRING,
1043
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1044
  HV_VIF_TYPE: VTYPE_STRING,
1045
  HV_VNET_HDR: VTYPE_BOOL,
1046
  HV_VIRIDIAN: VTYPE_BOOL,
1047
  HV_VIF_SCRIPT: VTYPE_STRING,
1048
  }
1049

    
1050
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1051

    
1052
HVS_PARAMETER_TITLES = {
1053
  HV_ACPI: "ACPI",
1054
  HV_BOOT_ORDER: "Boot_order",
1055
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1056
  HV_DISK_TYPE: "Disk_type",
1057
  HV_INITRD_PATH: "Initrd_path",
1058
  HV_KERNEL_PATH: "Kernel_path",
1059
  HV_NIC_TYPE: "NIC_type",
1060
  HV_PAE: "PAE",
1061
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1062
  HV_PASSTHROUGH: "pci_pass",
1063
  HV_CPU_TYPE: "cpu_type",
1064
  }
1065

    
1066
# Migration statuses
1067
HV_MIGRATION_COMPLETED = "completed"
1068
HV_MIGRATION_ACTIVE = "active"
1069
HV_MIGRATION_FAILED = "failed"
1070
HV_MIGRATION_CANCELLED = "cancelled"
1071

    
1072
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1073
  HV_MIGRATION_COMPLETED,
1074
  HV_MIGRATION_ACTIVE,
1075
  HV_MIGRATION_FAILED,
1076
  HV_MIGRATION_CANCELLED,
1077
  ])
1078

    
1079
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1080
  HV_MIGRATION_FAILED,
1081
  HV_MIGRATION_CANCELLED,
1082
  ])
1083

    
1084
# KVM-specific statuses
1085
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1086

    
1087
# Node info keys
1088
HV_NODEINFO_KEY_VERSION = "hv_version"
1089

    
1090
# Hypervisor state
1091
HVST_MEMORY_TOTAL = "mem_total"
1092
HVST_MEMORY_NODE = "mem_node"
1093
HVST_MEMORY_HV = "mem_hv"
1094
HVST_CPU_TOTAL = "cpu_total"
1095
HVST_CPU_NODE = "cpu_node"
1096

    
1097
HVST_DEFAULTS = {
1098
  HVST_MEMORY_TOTAL: 0,
1099
  HVST_MEMORY_NODE: 0,
1100
  HVST_MEMORY_HV: 0,
1101
  HVST_CPU_TOTAL: 1,
1102
  HVST_CPU_NODE: 1,
1103
  }
1104

    
1105
HVSTS_PARAMETER_TYPES = {
1106
  HVST_MEMORY_TOTAL: VTYPE_INT,
1107
  HVST_MEMORY_NODE: VTYPE_INT,
1108
  HVST_MEMORY_HV: VTYPE_INT,
1109
  HVST_CPU_TOTAL: VTYPE_INT,
1110
  HVST_CPU_NODE: VTYPE_INT,
1111
  }
1112

    
1113
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1114

    
1115
# Disk state
1116
DS_DISK_TOTAL = "disk_total"
1117
DS_DISK_RESERVED = "disk_reserved"
1118
DS_DISK_OVERHEAD = "disk_overhead"
1119

    
1120
DS_DEFAULTS = {
1121
  DS_DISK_TOTAL: 0,
1122
  DS_DISK_RESERVED: 0,
1123
  DS_DISK_OVERHEAD: 0,
1124
  }
1125

    
1126
DSS_PARAMETER_TYPES = {
1127
  DS_DISK_TOTAL: VTYPE_INT,
1128
  DS_DISK_RESERVED: VTYPE_INT,
1129
  DS_DISK_OVERHEAD: VTYPE_INT,
1130
  }
1131

    
1132
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1133
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1134

    
1135
# Backend parameter names
1136
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1137
BE_MAXMEM = "maxmem"
1138
BE_MINMEM = "minmem"
1139
BE_VCPUS = "vcpus"
1140
BE_AUTO_BALANCE = "auto_balance"
1141
BE_ALWAYS_FAILOVER = "always_failover"
1142
BE_SPINDLE_USE = "spindle_use"
1143

    
1144
BES_PARAMETER_TYPES = {
1145
  BE_MAXMEM: VTYPE_SIZE,
1146
  BE_MINMEM: VTYPE_SIZE,
1147
  BE_VCPUS: VTYPE_INT,
1148
  BE_AUTO_BALANCE: VTYPE_BOOL,
1149
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1150
  BE_SPINDLE_USE: VTYPE_INT,
1151
  }
1152

    
1153
BES_PARAMETER_TITLES = {
1154
  BE_AUTO_BALANCE: "Auto_balance",
1155
  BE_MAXMEM: "ConfigMaxMem",
1156
  BE_MINMEM: "ConfigMinMem",
1157
  BE_VCPUS: "ConfigVCPUs",
1158
  }
1159

    
1160
BES_PARAMETER_COMPAT = {
1161
  BE_MEMORY: VTYPE_SIZE,
1162
  }
1163
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1164

    
1165
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1166

    
1167
# instance specs
1168
ISPEC_MEM_SIZE = "memory-size"
1169
ISPEC_CPU_COUNT = "cpu-count"
1170
ISPEC_DISK_COUNT = "disk-count"
1171
ISPEC_DISK_SIZE = "disk-size"
1172
ISPEC_NIC_COUNT = "nic-count"
1173
ISPEC_SPINDLE_USE = "spindle-use"
1174

    
1175
ISPECS_PARAMETER_TYPES = {
1176
  ISPEC_MEM_SIZE: VTYPE_INT,
1177
  ISPEC_CPU_COUNT: VTYPE_INT,
1178
  ISPEC_DISK_COUNT: VTYPE_INT,
1179
  ISPEC_DISK_SIZE: VTYPE_INT,
1180
  ISPEC_NIC_COUNT: VTYPE_INT,
1181
  ISPEC_SPINDLE_USE: VTYPE_INT,
1182
  }
1183

    
1184
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1185

    
1186
ISPECS_MINMAX = "minmax"
1187
ISPECS_MIN = "min"
1188
ISPECS_MAX = "max"
1189
ISPECS_STD = "std"
1190
IPOLICY_DTS = "disk-templates"
1191
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1192
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1193

    
1194
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1195
  ISPECS_MIN,
1196
  ISPECS_MAX,
1197
  ])
1198

    
1199
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1200
  IPOLICY_VCPU_RATIO,
1201
  IPOLICY_SPINDLE_RATIO,
1202
  ])
1203

    
1204
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1205
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1206

    
1207
# Node parameter names
1208
ND_OOB_PROGRAM = "oob_program"
1209
ND_SPINDLE_COUNT = "spindle_count"
1210
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1211

    
1212
NDS_PARAMETER_TYPES = {
1213
  ND_OOB_PROGRAM: VTYPE_STRING,
1214
  ND_SPINDLE_COUNT: VTYPE_INT,
1215
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1216
  }
1217

    
1218
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1219

    
1220
NDS_PARAMETER_TITLES = {
1221
  ND_OOB_PROGRAM: "OutOfBandProgram",
1222
  ND_SPINDLE_COUNT: "SpindleCount",
1223
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1224
  }
1225

    
1226
# Logical Disks parameters
1227
LDP_RESYNC_RATE = "resync-rate"
1228
LDP_STRIPES = "stripes"
1229
LDP_BARRIERS = "disabled-barriers"
1230
LDP_NO_META_FLUSH = "disable-meta-flush"
1231
LDP_DEFAULT_METAVG = "default-metavg"
1232
LDP_DISK_CUSTOM = "disk-custom"
1233
LDP_NET_CUSTOM = "net-custom"
1234
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1235
LDP_PLAN_AHEAD = "c-plan-ahead"
1236
LDP_FILL_TARGET = "c-fill-target"
1237
LDP_DELAY_TARGET = "c-delay-target"
1238
LDP_MAX_RATE = "c-max-rate"
1239
LDP_MIN_RATE = "c-min-rate"
1240
LDP_POOL = "pool"
1241
DISK_LD_TYPES = {
1242
  LDP_RESYNC_RATE: VTYPE_INT,
1243
  LDP_STRIPES: VTYPE_INT,
1244
  LDP_BARRIERS: VTYPE_STRING,
1245
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1246
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1247
  LDP_DISK_CUSTOM: VTYPE_STRING,
1248
  LDP_NET_CUSTOM: VTYPE_STRING,
1249
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1250
  LDP_PLAN_AHEAD: VTYPE_INT,
1251
  LDP_FILL_TARGET: VTYPE_INT,
1252
  LDP_DELAY_TARGET: VTYPE_INT,
1253
  LDP_MAX_RATE: VTYPE_INT,
1254
  LDP_MIN_RATE: VTYPE_INT,
1255
  LDP_POOL: VTYPE_STRING,
1256
  }
1257
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1258

    
1259
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1260
# gnt-group)
1261
DRBD_RESYNC_RATE = "resync-rate"
1262
DRBD_DATA_STRIPES = "data-stripes"
1263
DRBD_META_STRIPES = "meta-stripes"
1264
DRBD_DISK_BARRIERS = "disk-barriers"
1265
DRBD_META_BARRIERS = "meta-barriers"
1266
DRBD_DEFAULT_METAVG = "metavg"
1267
DRBD_DISK_CUSTOM = "disk-custom"
1268
DRBD_NET_CUSTOM = "net-custom"
1269
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1270
DRBD_PLAN_AHEAD = "c-plan-ahead"
1271
DRBD_FILL_TARGET = "c-fill-target"
1272
DRBD_DELAY_TARGET = "c-delay-target"
1273
DRBD_MAX_RATE = "c-max-rate"
1274
DRBD_MIN_RATE = "c-min-rate"
1275
LV_STRIPES = "stripes"
1276
RBD_POOL = "pool"
1277
DISK_DT_TYPES = {
1278
  DRBD_RESYNC_RATE: VTYPE_INT,
1279
  DRBD_DATA_STRIPES: VTYPE_INT,
1280
  DRBD_META_STRIPES: VTYPE_INT,
1281
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1282
  DRBD_META_BARRIERS: VTYPE_BOOL,
1283
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1284
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1285
  DRBD_NET_CUSTOM: VTYPE_STRING,
1286
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1287
  DRBD_PLAN_AHEAD: VTYPE_INT,
1288
  DRBD_FILL_TARGET: VTYPE_INT,
1289
  DRBD_DELAY_TARGET: VTYPE_INT,
1290
  DRBD_MAX_RATE: VTYPE_INT,
1291
  DRBD_MIN_RATE: VTYPE_INT,
1292
  LV_STRIPES: VTYPE_INT,
1293
  RBD_POOL: VTYPE_STRING,
1294
  }
1295

    
1296
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1297

    
1298
# OOB supported commands
1299
OOB_POWER_ON = "power-on"
1300
OOB_POWER_OFF = "power-off"
1301
OOB_POWER_CYCLE = "power-cycle"
1302
OOB_POWER_STATUS = "power-status"
1303
OOB_HEALTH = "health"
1304

    
1305
OOB_COMMANDS = compat.UniqueFrozenset([
1306
  OOB_POWER_ON,
1307
  OOB_POWER_OFF,
1308
  OOB_POWER_CYCLE,
1309
  OOB_POWER_STATUS,
1310
  OOB_HEALTH,
1311
  ])
1312

    
1313
OOB_POWER_STATUS_POWERED = "powered"
1314

    
1315
OOB_TIMEOUT = 60 # 60 seconds
1316
OOB_POWER_DELAY = 2.0 # 2 seconds
1317

    
1318
OOB_STATUS_OK = "OK"
1319
OOB_STATUS_WARNING = "WARNING"
1320
OOB_STATUS_CRITICAL = "CRITICAL"
1321
OOB_STATUS_UNKNOWN = "UNKNOWN"
1322

    
1323
OOB_STATUSES = compat.UniqueFrozenset([
1324
  OOB_STATUS_OK,
1325
  OOB_STATUS_WARNING,
1326
  OOB_STATUS_CRITICAL,
1327
  OOB_STATUS_UNKNOWN,
1328
  ])
1329

    
1330
# Instance Parameters Profile
1331
PP_DEFAULT = "default"
1332

    
1333
# NIC_* constants are used inside the ganeti config
1334
NIC_MODE = "mode"
1335
NIC_LINK = "link"
1336

    
1337
NIC_MODE_BRIDGED = "bridged"
1338
NIC_MODE_ROUTED = "routed"
1339
NIC_MODE_OVS = "openvswitch"
1340
NIC_IP_POOL = "pool"
1341

    
1342
NIC_VALID_MODES = compat.UniqueFrozenset([
1343
  NIC_MODE_BRIDGED,
1344
  NIC_MODE_ROUTED,
1345
  NIC_MODE_OVS,
1346
  ])
1347

    
1348
RESERVE_ACTION = "reserve"
1349
RELEASE_ACTION = "release"
1350

    
1351
NICS_PARAMETER_TYPES = {
1352
  NIC_MODE: VTYPE_STRING,
1353
  NIC_LINK: VTYPE_STRING,
1354
  }
1355

    
1356
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1357

    
1358
# IDISK_* constants are used in opcodes, to create/change disks
1359
IDISK_SIZE = "size"
1360
IDISK_MODE = "mode"
1361
IDISK_ADOPT = "adopt"
1362
IDISK_VG = "vg"
1363
IDISK_METAVG = "metavg"
1364
IDISK_PROVIDER = "provider"
1365
IDISK_NAME = "name"
1366
IDISK_PARAMS_TYPES = {
1367
  IDISK_SIZE: VTYPE_SIZE,
1368
  IDISK_MODE: VTYPE_STRING,
1369
  IDISK_ADOPT: VTYPE_STRING,
1370
  IDISK_VG: VTYPE_STRING,
1371
  IDISK_METAVG: VTYPE_STRING,
1372
  IDISK_PROVIDER: VTYPE_STRING,
1373
  IDISK_NAME: VTYPE_MAYBE_STRING,
1374
  }
1375
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1376

    
1377
MODIFIABLE_IDISK_PARAMS_TYPES = {
1378
  IDISK_MODE: VTYPE_STRING,
1379
  IDISK_NAME: VTYPE_STRING,
1380
  }
1381
MODIFIABLE_IDISK_PARAMS = frozenset(MODIFIABLE_IDISK_PARAMS_TYPES.keys())
1382

    
1383
# INIC_* constants are used in opcodes, to create/change nics
1384
INIC_MAC = "mac"
1385
INIC_IP = "ip"
1386
INIC_MODE = "mode"
1387
INIC_LINK = "link"
1388
INIC_NETWORK = "network"
1389
INIC_NAME = "name"
1390
INIC_PARAMS_TYPES = {
1391
  INIC_IP: VTYPE_MAYBE_STRING,
1392
  INIC_LINK: VTYPE_STRING,
1393
  INIC_MAC: VTYPE_STRING,
1394
  INIC_MODE: VTYPE_STRING,
1395
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1396
  INIC_NAME: VTYPE_MAYBE_STRING,
1397
  }
1398
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1399

    
1400
# Hypervisor constants
1401
HT_XEN_PVM = "xen-pvm"
1402
HT_FAKE = "fake"
1403
HT_XEN_HVM = "xen-hvm"
1404
HT_KVM = "kvm"
1405
HT_CHROOT = "chroot"
1406
HT_LXC = "lxc"
1407
HYPER_TYPES = compat.UniqueFrozenset([
1408
  HT_XEN_PVM,
1409
  HT_FAKE,
1410
  HT_XEN_HVM,
1411
  HT_KVM,
1412
  HT_CHROOT,
1413
  HT_LXC,
1414
  ])
1415
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1416

    
1417
VNC_BASE_PORT = 5900
1418
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1419

    
1420
# NIC types
1421
HT_NIC_RTL8139 = "rtl8139"
1422
HT_NIC_NE2K_PCI = "ne2k_pci"
1423
HT_NIC_NE2K_ISA = "ne2k_isa"
1424
HT_NIC_I82551 = "i82551"
1425
HT_NIC_I85557B = "i82557b"
1426
HT_NIC_I8259ER = "i82559er"
1427
HT_NIC_PCNET = "pcnet"
1428
HT_NIC_E1000 = "e1000"
1429
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1430

    
1431
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1432
  HT_NIC_RTL8139,
1433
  HT_NIC_NE2K_PCI,
1434
  HT_NIC_E1000,
1435
  HT_NIC_NE2K_ISA,
1436
  HT_NIC_PARAVIRTUAL,
1437
  ])
1438
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1439
  HT_NIC_RTL8139,
1440
  HT_NIC_NE2K_PCI,
1441
  HT_NIC_NE2K_ISA,
1442
  HT_NIC_I82551,
1443
  HT_NIC_I85557B,
1444
  HT_NIC_I8259ER,
1445
  HT_NIC_PCNET,
1446
  HT_NIC_E1000,
1447
  HT_NIC_PARAVIRTUAL,
1448
  ])
1449

    
1450
# Vif types
1451
# default vif type in xen-hvm
1452
HT_HVM_VIF_IOEMU = "ioemu"
1453
HT_HVM_VIF_VIF = "vif"
1454
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1455
  HT_HVM_VIF_IOEMU,
1456
  HT_HVM_VIF_VIF,
1457
  ])
1458

    
1459
# Disk types
1460
HT_DISK_IOEMU = "ioemu"
1461
HT_DISK_IDE = "ide"
1462
HT_DISK_SCSI = "scsi"
1463
HT_DISK_SD = "sd"
1464
HT_DISK_MTD = "mtd"
1465
HT_DISK_PFLASH = "pflash"
1466

    
1467
HT_CACHE_DEFAULT = "default"
1468
HT_CACHE_NONE = "none"
1469
HT_CACHE_WTHROUGH = "writethrough"
1470
HT_CACHE_WBACK = "writeback"
1471
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1472
  HT_CACHE_DEFAULT,
1473
  HT_CACHE_NONE,
1474
  HT_CACHE_WTHROUGH,
1475
  HT_CACHE_WBACK,
1476
  ])
1477

    
1478
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1479
  HT_DISK_PARAVIRTUAL,
1480
  HT_DISK_IOEMU,
1481
  ])
1482
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1483
  HT_DISK_PARAVIRTUAL,
1484
  HT_DISK_IDE,
1485
  HT_DISK_SCSI,
1486
  HT_DISK_SD,
1487
  HT_DISK_MTD,
1488
  HT_DISK_PFLASH,
1489
  ])
1490

    
1491
# Mouse types:
1492
HT_MOUSE_MOUSE = "mouse"
1493
HT_MOUSE_TABLET = "tablet"
1494

    
1495
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1496
  HT_MOUSE_MOUSE,
1497
  HT_MOUSE_TABLET,
1498
  ])
1499

    
1500
# Boot order
1501
HT_BO_FLOPPY = "floppy"
1502
HT_BO_CDROM = "cdrom"
1503
HT_BO_DISK = "disk"
1504
HT_BO_NETWORK = "network"
1505

    
1506
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1507
  HT_BO_FLOPPY,
1508
  HT_BO_CDROM,
1509
  HT_BO_DISK,
1510
  HT_BO_NETWORK,
1511
  ])
1512

    
1513
# SPICE lossless image compression options
1514
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1515
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1516
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1517
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1518
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1519
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1520

    
1521
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1522
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1523
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1524
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1525
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1526
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1527
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1528
  ])
1529

    
1530
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1531
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1532
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1533
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1534

    
1535
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1536
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1537
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1538
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1539
  ])
1540

    
1541
# SPICE video stream detection
1542
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1543
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1544
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1545

    
1546
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1547
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1548
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1549
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1550
  ])
1551

    
1552
# Security models
1553
HT_SM_NONE = "none"
1554
HT_SM_USER = "user"
1555
HT_SM_POOL = "pool"
1556

    
1557
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1558
  HT_SM_NONE,
1559
  HT_SM_USER,
1560
  HT_SM_POOL,
1561
  ])
1562

    
1563
# Kvm flag values
1564
HT_KVM_ENABLED = "enabled"
1565
HT_KVM_DISABLED = "disabled"
1566

    
1567
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1568

    
1569
# Migration type
1570
HT_MIGRATION_LIVE = "live"
1571
HT_MIGRATION_NONLIVE = "non-live"
1572
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1573
  HT_MIGRATION_LIVE,
1574
  HT_MIGRATION_NONLIVE,
1575
  ])
1576

    
1577
# Cluster Verify steps
1578
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1579
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1580

    
1581
# Cluster Verify error classes
1582
CV_TCLUSTER = "cluster"
1583
CV_TGROUP = "group"
1584
CV_TNODE = "node"
1585
CV_TINSTANCE = "instance"
1586

    
1587
# Cluster Verify error codes and documentation
1588
CV_ECLUSTERCFG = \
1589
  (CV_TCLUSTER, "ECLUSTERCFG", "Cluster configuration verification failure")
1590
CV_ECLUSTERCERT = \
1591
  (CV_TCLUSTER, "ECLUSTERCERT",
1592
   "Cluster certificate files verification failure")
1593
CV_ECLUSTERFILECHECK = \
1594
  (CV_TCLUSTER, "ECLUSTERFILECHECK",
1595
   "Cluster configuration verification failure")
1596
CV_ECLUSTERDANGLINGNODES = \
1597
  (CV_TNODE, "ECLUSTERDANGLINGNODES",
1598
   "Some nodes belong to non-existing groups")
1599
CV_ECLUSTERDANGLINGINST = \
1600
  (CV_TNODE, "ECLUSTERDANGLINGINST",
1601
   "Some instances have a non-existing primary node")
1602
CV_EGROUPDIFFERENTPVSIZE = \
1603
  (CV_TGROUP, "EGROUPDIFFERENTPVSIZE", "PVs in the group have different sizes")
1604
CV_EINSTANCEBADNODE = \
1605
  (CV_TINSTANCE, "EINSTANCEBADNODE",
1606
   "Instance marked as running lives on an offline node")
1607
CV_EINSTANCEDOWN = \
1608
  (CV_TINSTANCE, "EINSTANCEDOWN", "Instance not running on its primary node")
1609
CV_EINSTANCELAYOUT = \
1610
  (CV_TINSTANCE, "EINSTANCELAYOUT", "Instance has multiple secondary nodes")
1611
CV_EINSTANCEMISSINGDISK = \
1612
  (CV_TINSTANCE, "EINSTANCEMISSINGDISK", "Missing volume on an instance")
1613
CV_EINSTANCEFAULTYDISK = \
1614
  (CV_TINSTANCE, "EINSTANCEFAULTYDISK",
1615
   "Impossible to retrieve status for a disk")
1616
CV_EINSTANCEWRONGNODE = \
1617
  (CV_TINSTANCE, "EINSTANCEWRONGNODE", "Instance running on the wrong node")
1618
CV_EINSTANCESPLITGROUPS = \
1619
  (CV_TINSTANCE, "EINSTANCESPLITGROUPS",
1620
   "Instance with primary and secondary nodes in different groups")
1621
CV_EINSTANCEPOLICY = \
1622
  (CV_TINSTANCE, "EINSTANCEPOLICY",
1623
   "Instance does not meet policy")
1624
CV_EINSTANCEUNSUITABLENODE = \
1625
  (CV_TINSTANCE, "EINSTANCEUNSUITABLENODE",
1626
   "Instance running on nodes that are not suitable for it")
1627
CV_ENODEDRBD = \
1628
  (CV_TNODE, "ENODEDRBD", "Error parsing the DRBD status file")
1629
CV_ENODEDRBDHELPER = \
1630
  (CV_TNODE, "ENODEDRBDHELPER", "Error caused by the DRBD helper")
1631
CV_ENODEFILECHECK = \
1632
  (CV_TNODE, "ENODEFILECHECK",
1633
   "Error retrieving the checksum of the node files")
1634
CV_ENODEHOOKS = \
1635
  (CV_TNODE, "ENODEHOOKS", "Communication failure in hooks execution")
1636
CV_ENODEHV = \
1637
  (CV_TNODE, "ENODEHV", "Hypervisor parameters verification failure")
1638
CV_ENODELVM = \
1639
  (CV_TNODE, "ENODELVM", "LVM-related node error")
1640
CV_ENODEN1 = \
1641
  (CV_TNODE, "ENODEN1", "Not enough memory to accommodate instance failovers")
1642
CV_ENODENET = \
1643
  (CV_TNODE, "ENODENET", "Network-related node error")
1644
CV_ENODEOS = \
1645
  (CV_TNODE, "ENODEOS", "OS-related node error")
1646
CV_ENODEORPHANINSTANCE = \
1647
  (CV_TNODE, "ENODEORPHANINSTANCE", "Unknown intance running on a node")
1648
CV_ENODEORPHANLV = \
1649
  (CV_TNODE, "ENODEORPHANLV", "Unknown LVM logical volume")
1650
CV_ENODERPC = \
1651
  (CV_TNODE, "ENODERPC",
1652
   "Error during connection to the primary node of an instance")
1653
CV_ENODESSH = \
1654
  (CV_TNODE, "ENODESSH", "SSH-related node error")
1655
CV_ENODEVERSION = \
1656
  (CV_TNODE, "ENODEVERSION",
1657
   "Protocol version mismatch or Ganeti version mismatch")
1658
CV_ENODESETUP = \
1659
  (CV_TNODE, "ENODESETUP", "Node setup error")
1660
CV_ENODETIME = \
1661
  (CV_TNODE, "ENODETIME", "Node returned invalid time")
1662
CV_ENODEOOBPATH = \
1663
  (CV_TNODE, "ENODEOOBPATH", "Invalid Out Of Band path")
1664
CV_ENODEUSERSCRIPTS = \
1665
  (CV_TNODE, "ENODEUSERSCRIPTS", "User scripts not present or not executable")
1666
CV_ENODEFILESTORAGEPATHS = \
1667
  (CV_TNODE, "ENODEFILESTORAGEPATHS", "Detected bad file storage paths")
1668

    
1669
CV_ALL_ECODES = compat.UniqueFrozenset([
1670
  CV_ECLUSTERCFG,
1671
  CV_ECLUSTERCERT,
1672
  CV_ECLUSTERFILECHECK,
1673
  CV_ECLUSTERDANGLINGNODES,
1674
  CV_ECLUSTERDANGLINGINST,
1675
  CV_EINSTANCEBADNODE,
1676
  CV_EINSTANCEDOWN,
1677
  CV_EINSTANCELAYOUT,
1678
  CV_EINSTANCEMISSINGDISK,
1679
  CV_EINSTANCEFAULTYDISK,
1680
  CV_EINSTANCEWRONGNODE,
1681
  CV_EINSTANCESPLITGROUPS,
1682
  CV_EINSTANCEPOLICY,
1683
  CV_ENODEDRBD,
1684
  CV_ENODEDRBDHELPER,
1685
  CV_ENODEFILECHECK,
1686
  CV_ENODEHOOKS,
1687
  CV_ENODEHV,
1688
  CV_ENODELVM,
1689
  CV_ENODEN1,
1690
  CV_ENODENET,
1691
  CV_ENODEOS,
1692
  CV_ENODEORPHANINSTANCE,
1693
  CV_ENODEORPHANLV,
1694
  CV_ENODERPC,
1695
  CV_ENODESSH,
1696
  CV_ENODEVERSION,
1697
  CV_ENODESETUP,
1698
  CV_ENODETIME,
1699
  CV_ENODEOOBPATH,
1700
  CV_ENODEUSERSCRIPTS,
1701
  CV_ENODEFILESTORAGEPATHS,
1702
  ])
1703

    
1704
CV_ALL_ECODES_STRINGS = \
1705
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1706

    
1707
# Node verify constants
1708
NV_BRIDGES = "bridges"
1709
NV_DRBDHELPER = "drbd-helper"
1710
NV_DRBDLIST = "drbd-list"
1711
NV_EXCLUSIVEPVS = "exclusive-pvs"
1712
NV_FILELIST = "filelist"
1713
NV_FILE_STORAGE_PATHS = "file-storage-paths"
1714
NV_HVINFO = "hvinfo"
1715
NV_HVPARAMS = "hvparms"
1716
NV_HYPERVISOR = "hypervisor"
1717
NV_INSTANCELIST = "instancelist"
1718
NV_LVLIST = "lvlist"
1719
NV_MASTERIP = "master-ip"
1720
NV_NODELIST = "nodelist"
1721
NV_NODENETTEST = "node-net-test"
1722
NV_NODESETUP = "nodesetup"
1723
NV_OOB_PATHS = "oob-paths"
1724
NV_OSLIST = "oslist"
1725
NV_PVLIST = "pvlist"
1726
NV_TIME = "time"
1727
NV_USERSCRIPTS = "user-scripts"
1728
NV_VERSION = "version"
1729
NV_VGLIST = "vglist"
1730
NV_VMNODES = "vmnodes"
1731

    
1732
# Instance status
1733
INSTST_RUNNING = "running"
1734
INSTST_ADMINDOWN = "ADMIN_down"
1735
INSTST_ADMINOFFLINE = "ADMIN_offline"
1736
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1737
INSTST_NODEDOWN = "ERROR_nodedown"
1738
INSTST_WRONGNODE = "ERROR_wrongnode"
1739
INSTST_ERRORUP = "ERROR_up"
1740
INSTST_ERRORDOWN = "ERROR_down"
1741
INSTST_ALL = compat.UniqueFrozenset([
1742
  INSTST_RUNNING,
1743
  INSTST_ADMINDOWN,
1744
  INSTST_ADMINOFFLINE,
1745
  INSTST_NODEOFFLINE,
1746
  INSTST_NODEDOWN,
1747
  INSTST_WRONGNODE,
1748
  INSTST_ERRORUP,
1749
  INSTST_ERRORDOWN,
1750
  ])
1751

    
1752
# Admin states
1753
ADMINST_UP = "up"
1754
ADMINST_DOWN = "down"
1755
ADMINST_OFFLINE = "offline"
1756
ADMINST_ALL = compat.UniqueFrozenset([
1757
  ADMINST_UP,
1758
  ADMINST_DOWN,
1759
  ADMINST_OFFLINE,
1760
  ])
1761

    
1762
# Node roles
1763
NR_REGULAR = "R"
1764
NR_MASTER = "M"
1765
NR_MCANDIDATE = "C"
1766
NR_DRAINED = "D"
1767
NR_OFFLINE = "O"
1768
NR_ALL = compat.UniqueFrozenset([
1769
  NR_REGULAR,
1770
  NR_MASTER,
1771
  NR_MCANDIDATE,
1772
  NR_DRAINED,
1773
  NR_OFFLINE,
1774
  ])
1775

    
1776
# SSL certificate check constants (in days)
1777
SSL_CERT_EXPIRATION_WARN = 30
1778
SSL_CERT_EXPIRATION_ERROR = 7
1779

    
1780
# Allocator framework constants
1781
IALLOCATOR_VERSION = 2
1782
IALLOCATOR_DIR_IN = "in"
1783
IALLOCATOR_DIR_OUT = "out"
1784
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1785
  IALLOCATOR_DIR_IN,
1786
  IALLOCATOR_DIR_OUT,
1787
  ])
1788
IALLOCATOR_MODE_ALLOC = "allocate"
1789
IALLOCATOR_MODE_RELOC = "relocate"
1790
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1791
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1792
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1793
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1794
  IALLOCATOR_MODE_ALLOC,
1795
  IALLOCATOR_MODE_RELOC,
1796
  IALLOCATOR_MODE_CHG_GROUP,
1797
  IALLOCATOR_MODE_NODE_EVAC,
1798
  IALLOCATOR_MODE_MULTI_ALLOC,
1799
  ])
1800
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1801
DEFAULT_IALLOCATOR_SHORTCUT = "."
1802

    
1803
IALLOCATOR_NEVAC_PRI = "primary-only"
1804
IALLOCATOR_NEVAC_SEC = "secondary-only"
1805
IALLOCATOR_NEVAC_ALL = "all"
1806
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1807
  IALLOCATOR_NEVAC_PRI,
1808
  IALLOCATOR_NEVAC_SEC,
1809
  IALLOCATOR_NEVAC_ALL,
1810
  ])
1811

    
1812
# Node evacuation
1813
NODE_EVAC_PRI = "primary-only"
1814
NODE_EVAC_SEC = "secondary-only"
1815
NODE_EVAC_ALL = "all"
1816
NODE_EVAC_MODES = compat.UniqueFrozenset([
1817
  NODE_EVAC_PRI,
1818
  NODE_EVAC_SEC,
1819
  NODE_EVAC_ALL,
1820
  ])
1821

    
1822
# Job queue
1823
JOB_QUEUE_VERSION = 1
1824
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1825
JOB_QUEUE_FILES_PERMS = 0640
1826

    
1827
JOB_ID_TEMPLATE = r"\d+"
1828
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1829

    
1830
# unchanged job return
1831
JOB_NOTCHANGED = "nochange"
1832

    
1833
# Job status
1834
JOB_STATUS_QUEUED = "queued"
1835
JOB_STATUS_WAITING = "waiting"
1836
JOB_STATUS_CANCELING = "canceling"
1837
JOB_STATUS_RUNNING = "running"
1838
JOB_STATUS_CANCELED = "canceled"
1839
JOB_STATUS_SUCCESS = "success"
1840
JOB_STATUS_ERROR = "error"
1841
JOBS_PENDING = compat.UniqueFrozenset([
1842
  JOB_STATUS_QUEUED,
1843
  JOB_STATUS_WAITING,
1844
  JOB_STATUS_CANCELING,
1845
  ])
1846
JOBS_FINALIZED = compat.UniqueFrozenset([
1847
  JOB_STATUS_CANCELED,
1848
  JOB_STATUS_SUCCESS,
1849
  JOB_STATUS_ERROR,
1850
  ])
1851
JOB_STATUS_ALL = compat.UniqueFrozenset([
1852
  JOB_STATUS_RUNNING,
1853
  ]) | JOBS_PENDING | JOBS_FINALIZED
1854

    
1855
# OpCode status
1856
# not yet finalized
1857
OP_STATUS_QUEUED = "queued"
1858
OP_STATUS_WAITING = "waiting"
1859
OP_STATUS_CANCELING = "canceling"
1860
OP_STATUS_RUNNING = "running"
1861
# finalized
1862
OP_STATUS_CANCELED = "canceled"
1863
OP_STATUS_SUCCESS = "success"
1864
OP_STATUS_ERROR = "error"
1865
OPS_FINALIZED = compat.UniqueFrozenset([
1866
  OP_STATUS_CANCELED,
1867
  OP_STATUS_SUCCESS,
1868
  OP_STATUS_ERROR,
1869
  ])
1870

    
1871
# OpCode priority
1872
OP_PRIO_LOWEST = +19
1873
OP_PRIO_HIGHEST = -20
1874

    
1875
OP_PRIO_LOW = +10
1876
OP_PRIO_NORMAL = 0
1877
OP_PRIO_HIGH = -10
1878

    
1879
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1880
  OP_PRIO_LOW,
1881
  OP_PRIO_NORMAL,
1882
  OP_PRIO_HIGH,
1883
  ])
1884

    
1885
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1886

    
1887
# Lock recalculate mode
1888
LOCKS_REPLACE = "replace"
1889
LOCKS_APPEND = "append"
1890

    
1891
# Lock timeout (sum) before we should go into blocking acquire (still
1892
# can be reset by priority change); computed as max time (10 hours)
1893
# before we should actually go into blocking acquire given that we
1894
# start from default priority level; in seconds
1895
# TODO
1896
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1897
LOCK_ATTEMPTS_MAXWAIT = 15.0
1898
LOCK_ATTEMPTS_MINWAIT = 1.0
1899

    
1900
# Execution log types
1901
ELOG_MESSAGE = "message"
1902
ELOG_REMOTE_IMPORT = "remote-import"
1903
ELOG_JQUEUE_TEST = "jqueue-test"
1904

    
1905
# /etc/hosts modification
1906
ETC_HOSTS_ADD = "add"
1907
ETC_HOSTS_REMOVE = "remove"
1908

    
1909
# Job queue test
1910
JQT_MSGPREFIX = "TESTMSG="
1911
JQT_EXPANDNAMES = "expandnames"
1912
JQT_EXEC = "exec"
1913
JQT_LOGMSG = "logmsg"
1914
JQT_STARTMSG = "startmsg"
1915
JQT_ALL = compat.UniqueFrozenset([
1916
  JQT_EXPANDNAMES,
1917
  JQT_EXEC,
1918
  JQT_LOGMSG,
1919
  JQT_STARTMSG,
1920
  ])
1921

    
1922
# Query resources
1923
QR_CLUSTER = "cluster"
1924
QR_INSTANCE = "instance"
1925
QR_NODE = "node"
1926
QR_LOCK = "lock"
1927
QR_GROUP = "group"
1928
QR_OS = "os"
1929
QR_JOB = "job"
1930
QR_EXPORT = "export"
1931
QR_NETWORK = "network"
1932
QR_EXTSTORAGE = "extstorage"
1933

    
1934
#: List of resources which can be queried using L{opcodes.OpQuery}
1935
QR_VIA_OP = compat.UniqueFrozenset([
1936
  QR_CLUSTER,
1937
  QR_INSTANCE,
1938
  QR_NODE,
1939
  QR_GROUP,
1940
  QR_OS,
1941
  QR_EXPORT,
1942
  QR_NETWORK,
1943
  QR_EXTSTORAGE,
1944
  ])
1945

    
1946
#: List of resources which can be queried using Local UniX Interface
1947
QR_VIA_LUXI = QR_VIA_OP.union([
1948
  QR_LOCK,
1949
  QR_JOB,
1950
  ])
1951

    
1952
#: List of resources which can be queried using RAPI
1953
QR_VIA_RAPI = QR_VIA_LUXI
1954

    
1955
# Query field types
1956
QFT_UNKNOWN = "unknown"
1957
QFT_TEXT = "text"
1958
QFT_BOOL = "bool"
1959
QFT_NUMBER = "number"
1960
QFT_UNIT = "unit"
1961
QFT_TIMESTAMP = "timestamp"
1962
QFT_OTHER = "other"
1963

    
1964
#: All query field types
1965
QFT_ALL = compat.UniqueFrozenset([
1966
  QFT_UNKNOWN,
1967
  QFT_TEXT,
1968
  QFT_BOOL,
1969
  QFT_NUMBER,
1970
  QFT_UNIT,
1971
  QFT_TIMESTAMP,
1972
  QFT_OTHER,
1973
  ])
1974

    
1975
# Query result field status (don't change or reuse values as they're used by
1976
# clients)
1977
#: Normal field status
1978
RS_NORMAL = 0
1979
#: Unknown field
1980
RS_UNKNOWN = 1
1981
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
1982
RS_NODATA = 2
1983
#: Value unavailable/unsupported for item; if this field is supported
1984
#: but we cannot get the data for the moment, RS_NODATA or
1985
#: RS_OFFLINE should be used
1986
RS_UNAVAIL = 3
1987
#: Resource marked offline
1988
RS_OFFLINE = 4
1989

    
1990
RS_ALL = compat.UniqueFrozenset([
1991
  RS_NORMAL,
1992
  RS_UNKNOWN,
1993
  RS_NODATA,
1994
  RS_UNAVAIL,
1995
  RS_OFFLINE,
1996
  ])
1997

    
1998
#: Dictionary with special field cases and their verbose/terse formatting
1999
RSS_DESCRIPTION = {
2000
  RS_UNKNOWN: ("(unknown)", "??"),
2001
  RS_NODATA: ("(nodata)", "?"),
2002
  RS_OFFLINE: ("(offline)", "*"),
2003
  RS_UNAVAIL: ("(unavail)", "-"),
2004
  }
2005

    
2006
# max dynamic devices
2007
MAX_NICS = 8
2008
MAX_DISKS = 16
2009

    
2010
# SSCONF file prefix
2011
SSCONF_FILEPREFIX = "ssconf_"
2012
# SSCONF keys
2013
SS_CLUSTER_NAME = "cluster_name"
2014
SS_CLUSTER_TAGS = "cluster_tags"
2015
SS_FILE_STORAGE_DIR = "file_storage_dir"
2016
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
2017
SS_MASTER_CANDIDATES = "master_candidates"
2018
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
2019
SS_MASTER_IP = "master_ip"
2020
SS_MASTER_NETDEV = "master_netdev"
2021
SS_MASTER_NETMASK = "master_netmask"
2022
SS_MASTER_NODE = "master_node"
2023
SS_NODE_LIST = "node_list"
2024
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2025
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2026
SS_OFFLINE_NODES = "offline_nodes"
2027
SS_ONLINE_NODES = "online_nodes"
2028
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2029
SS_INSTANCE_LIST = "instance_list"
2030
SS_RELEASE_VERSION = "release_version"
2031
SS_HYPERVISOR_LIST = "hypervisor_list"
2032
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2033
SS_UID_POOL = "uid_pool"
2034
SS_NODEGROUPS = "nodegroups"
2035
SS_NETWORKS = "networks"
2036

    
2037
SS_FILE_PERMS = 0444
2038

    
2039
# cluster wide default parameters
2040
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2041

    
2042
HVC_DEFAULTS = {
2043
  HT_XEN_PVM: {
2044
    HV_USE_BOOTLOADER: False,
2045
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
2046
    HV_BOOTLOADER_ARGS: "",
2047
    HV_KERNEL_PATH: XEN_KERNEL,
2048
    HV_INITRD_PATH: "",
2049
    HV_ROOT_PATH: "/dev/xvda1",
2050
    HV_KERNEL_ARGS: "ro",
2051
    HV_MIGRATION_PORT: 8002,
2052
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2053
    HV_BLOCKDEV_PREFIX: "sd",
2054
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2055
    HV_CPU_MASK: CPU_PINNING_ALL,
2056
    HV_CPU_CAP: 0,
2057
    HV_CPU_WEIGHT: 256,
2058
    HV_VIF_SCRIPT: "",
2059
    },
2060
  HT_XEN_HVM: {
2061
    HV_BOOT_ORDER: "cd",
2062
    HV_CDROM_IMAGE_PATH: "",
2063
    HV_NIC_TYPE: HT_NIC_RTL8139,
2064
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2065
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2066
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2067
    HV_ACPI: True,
2068
    HV_PAE: True,
2069
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2070
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2071
    HV_MIGRATION_PORT: 8002,
2072
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2073
    HV_USE_LOCALTIME: False,
2074
    HV_BLOCKDEV_PREFIX: "hd",
2075
    HV_PASSTHROUGH: "",
2076
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2077
    HV_CPU_MASK: CPU_PINNING_ALL,
2078
    HV_CPU_CAP: 0,
2079
    HV_CPU_WEIGHT: 256,
2080
    HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
2081
    HV_VIRIDIAN: False,
2082
    HV_VIF_SCRIPT: "",
2083
    },
2084
  HT_KVM: {
2085
    HV_KVM_PATH: KVM_PATH,
2086
    HV_KERNEL_PATH: KVM_KERNEL,
2087
    HV_INITRD_PATH: "",
2088
    HV_KERNEL_ARGS: "ro",
2089
    HV_ROOT_PATH: "/dev/vda1",
2090
    HV_ACPI: True,
2091
    HV_SERIAL_CONSOLE: True,
2092
    HV_SERIAL_SPEED: 38400,
2093
    HV_VNC_BIND_ADDRESS: "",
2094
    HV_VNC_TLS: False,
2095
    HV_VNC_X509: "",
2096
    HV_VNC_X509_VERIFY: False,
2097
    HV_VNC_PASSWORD_FILE: "",
2098
    HV_KVM_SPICE_BIND: "",
2099
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2100
    HV_KVM_SPICE_PASSWORD_FILE: "",
2101
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2102
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2103
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2104
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2105
    HV_KVM_SPICE_AUDIO_COMPR: True,
2106
    HV_KVM_SPICE_USE_TLS: False,
2107
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2108
    HV_KVM_SPICE_USE_VDAGENT: True,
2109
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2110
    HV_CDROM_IMAGE_PATH: "",
2111
    HV_KVM_CDROM2_IMAGE_PATH: "",
2112
    HV_BOOT_ORDER: HT_BO_DISK,
2113
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2114
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2115
    HV_KVM_CDROM_DISK_TYPE: "",
2116
    HV_USB_MOUSE: "",
2117
    HV_KEYMAP: "",
2118
    HV_MIGRATION_PORT: 8102,
2119
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2120
    HV_MIGRATION_DOWNTIME: 30,  # ms
2121
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2122
    HV_USE_LOCALTIME: False,
2123
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2124
    HV_SECURITY_MODEL: HT_SM_NONE,
2125
    HV_SECURITY_DOMAIN: "",
2126
    HV_KVM_FLAG: "",
2127
    HV_VHOST_NET: False,
2128
    HV_KVM_USE_CHROOT: False,
2129
    HV_MEM_PATH: "",
2130
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2131
    HV_CPU_MASK: CPU_PINNING_ALL,
2132
    HV_CPU_TYPE: "",
2133
    HV_CPU_CORES: 0,
2134
    HV_CPU_THREADS: 0,
2135
    HV_CPU_SOCKETS: 0,
2136
    HV_SOUNDHW: "",
2137
    HV_USB_DEVICES: "",
2138
    HV_VGA: "",
2139
    HV_KVM_EXTRA: "",
2140
    HV_KVM_MACHINE_VERSION: "",
2141
    HV_VNET_HDR: True,
2142
    },
2143
  HT_FAKE: {},
2144
  HT_CHROOT: {
2145
    HV_INIT_SCRIPT: "/ganeti-chroot",
2146
    },
2147
  HT_LXC: {
2148
    HV_CPU_MASK: "",
2149
    },
2150
  }
2151

    
2152
HVC_GLOBALS = compat.UniqueFrozenset([
2153
  HV_MIGRATION_PORT,
2154
  HV_MIGRATION_BANDWIDTH,
2155
  HV_MIGRATION_MODE,
2156
  ])
2157

    
2158
BEC_DEFAULTS = {
2159
  BE_MINMEM: 128,
2160
  BE_MAXMEM: 128,
2161
  BE_VCPUS: 1,
2162
  BE_AUTO_BALANCE: True,
2163
  BE_ALWAYS_FAILOVER: False,
2164
  BE_SPINDLE_USE: 1,
2165
  }
2166

    
2167
NDC_DEFAULTS = {
2168
  ND_OOB_PROGRAM: "",
2169
  ND_SPINDLE_COUNT: 1,
2170
  ND_EXCLUSIVE_STORAGE: False,
2171
  }
2172

    
2173
NDC_GLOBALS = compat.UniqueFrozenset([
2174
  ND_EXCLUSIVE_STORAGE,
2175
  ])
2176

    
2177
DISK_LD_DEFAULTS = {
2178
  LD_DRBD8: {
2179
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2180
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2181
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2182
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2183
    LDP_DISK_CUSTOM: "",
2184
    LDP_NET_CUSTOM: "",
2185
    LDP_DYNAMIC_RESYNC: False,
2186

    
2187
    # The default values for the DRBD dynamic resync speed algorithm
2188
    # are taken from the drbsetup 8.3.11 man page, except for
2189
    # c-plan-ahead (that we don't need to set to 0, because we have a
2190
    # separate option to enable it) and for c-max-rate, that we cap to
2191
    # the default value for the static resync rate.
2192
    LDP_PLAN_AHEAD: 20, # ds
2193
    LDP_FILL_TARGET: 0, # sectors
2194
    LDP_DELAY_TARGET: 1, # ds
2195
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2196
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2197
    },
2198
  LD_LV: {
2199
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2200
    },
2201
  LD_FILE: {},
2202
  LD_BLOCKDEV: {},
2203
  LD_RBD: {
2204
    LDP_POOL: "rbd"
2205
    },
2206
  LD_EXT: {},
2207
  }
2208

    
2209
# readability shortcuts
2210
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2211
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2212

    
2213
DISK_DT_DEFAULTS = {
2214
  DT_PLAIN: {
2215
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2216
    },
2217
  DT_DRBD8: {
2218
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2219
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2220
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2221
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2222
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2223
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2224
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2225
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2226
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2227
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2228
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2229
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2230
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2231
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2232
    },
2233
  DT_DISKLESS: {},
2234
  DT_FILE: {},
2235
  DT_SHARED_FILE: {},
2236
  DT_BLOCK: {},
2237
  DT_RBD: {
2238
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2239
    },
2240
  DT_EXT: {},
2241
  }
2242

    
2243
# we don't want to export the shortcuts
2244
del _LV_DEFAULTS, _DRBD_DEFAULTS
2245

    
2246
NICC_DEFAULTS = {
2247
  NIC_MODE: NIC_MODE_BRIDGED,
2248
  NIC_LINK: DEFAULT_BRIDGE,
2249
  }
2250

    
2251
# All of the following values are quite arbitrarily - there are no
2252
# "good" defaults, these must be customised per-site
2253
ISPECS_MINMAX_DEFAULTS = {
2254
  ISPECS_MIN: {
2255
    ISPEC_MEM_SIZE: 128,
2256
    ISPEC_CPU_COUNT: 1,
2257
    ISPEC_DISK_COUNT: 1,
2258
    ISPEC_DISK_SIZE: 1024,
2259
    ISPEC_NIC_COUNT: 1,
2260
    ISPEC_SPINDLE_USE: 1,
2261
    },
2262
  ISPECS_MAX: {
2263
    ISPEC_MEM_SIZE: 32768,
2264
    ISPEC_CPU_COUNT: 8,
2265
    ISPEC_DISK_COUNT: MAX_DISKS,
2266
    ISPEC_DISK_SIZE: 1024 * 1024,
2267
    ISPEC_NIC_COUNT: MAX_NICS,
2268
    ISPEC_SPINDLE_USE: 12,
2269
    },
2270
  }
2271
IPOLICY_DEFAULTS = {
2272
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2273
  ISPECS_STD: {
2274
    ISPEC_MEM_SIZE: 128,
2275
    ISPEC_CPU_COUNT: 1,
2276
    ISPEC_DISK_COUNT: 1,
2277
    ISPEC_DISK_SIZE: 1024,
2278
    ISPEC_NIC_COUNT: 1,
2279
    ISPEC_SPINDLE_USE: 1,
2280
    },
2281
  IPOLICY_DTS: list(DISK_TEMPLATES),
2282
  IPOLICY_VCPU_RATIO: 4.0,
2283
  IPOLICY_SPINDLE_RATIO: 32.0,
2284
  }
2285

    
2286
MASTER_POOL_SIZE_DEFAULT = 10
2287

    
2288
# Exclusive storage:
2289
# Error margin used to compare physical disks
2290
PART_MARGIN = .01
2291
# Space reserved when creating instance disks
2292
PART_RESERVED = .02
2293

    
2294
CONFD_PROTOCOL_VERSION = 1
2295

    
2296
CONFD_REQ_PING = 0
2297
CONFD_REQ_NODE_ROLE_BYNAME = 1
2298
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2299
CONFD_REQ_CLUSTER_MASTER = 3
2300
CONFD_REQ_NODE_PIP_LIST = 4
2301
CONFD_REQ_MC_PIP_LIST = 5
2302
CONFD_REQ_INSTANCES_IPS_LIST = 6
2303
CONFD_REQ_NODE_DRBD = 7
2304
CONFD_REQ_NODE_INSTANCES = 8
2305

    
2306
# Confd request query fields. These are used to narrow down queries.
2307
# These must be strings rather than integers, because json-encoding
2308
# converts them to strings anyway, as they're used as dict-keys.
2309
CONFD_REQQ_LINK = "0"
2310
CONFD_REQQ_IP = "1"
2311
CONFD_REQQ_IPLIST = "2"
2312
CONFD_REQQ_FIELDS = "3"
2313

    
2314
CONFD_REQFIELD_NAME = "0"
2315
CONFD_REQFIELD_IP = "1"
2316
CONFD_REQFIELD_MNODE_PIP = "2"
2317

    
2318
CONFD_REQS = compat.UniqueFrozenset([
2319
  CONFD_REQ_PING,
2320
  CONFD_REQ_NODE_ROLE_BYNAME,
2321
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2322
  CONFD_REQ_CLUSTER_MASTER,
2323
  CONFD_REQ_NODE_PIP_LIST,
2324
  CONFD_REQ_MC_PIP_LIST,
2325
  CONFD_REQ_INSTANCES_IPS_LIST,
2326
  CONFD_REQ_NODE_DRBD,
2327
  ])
2328

    
2329
CONFD_REPL_STATUS_OK = 0
2330
CONFD_REPL_STATUS_ERROR = 1
2331
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2332

    
2333
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2334
  CONFD_REPL_STATUS_OK,
2335
  CONFD_REPL_STATUS_ERROR,
2336
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2337
  ])
2338

    
2339
(CONFD_NODE_ROLE_MASTER,
2340
 CONFD_NODE_ROLE_CANDIDATE,
2341
 CONFD_NODE_ROLE_OFFLINE,
2342
 CONFD_NODE_ROLE_DRAINED,
2343
 CONFD_NODE_ROLE_REGULAR,
2344
 ) = range(5)
2345

    
2346
# A few common errors for confd
2347
CONFD_ERROR_UNKNOWN_ENTRY = 1
2348
CONFD_ERROR_INTERNAL = 2
2349
CONFD_ERROR_ARGUMENT = 3
2350

    
2351
# Each request is "salted" by the current timestamp.
2352
# This constants decides how many seconds of skew to accept.
2353
# TODO: make this a default and allow the value to be more configurable
2354
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2355

    
2356
# When we haven't reloaded the config for more than this amount of
2357
# seconds, we force a test to see if inotify is betraying us. Using a
2358
# prime number to ensure we get less chance of 'same wakeup' with
2359
# other processes.
2360
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2361

    
2362
# If we receive more than one update in this amount of microseconds,
2363
# we move to polling every RATELIMIT seconds, rather than relying on
2364
# inotify, to be able to serve more requests.
2365
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2366

    
2367
# Magic number prepended to all confd queries.
2368
# This allows us to distinguish different types of confd protocols and handle
2369
# them. For example by changing this we can move the whole payload to be
2370
# compressed, or move away from json.
2371
CONFD_MAGIC_FOURCC = "plj0"
2372

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

    
2378
# Timeout in seconds to expire pending query request in the confd client
2379
# library. We don't actually expect any answer more than 10 seconds after we
2380
# sent a request.
2381
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2382

    
2383
# Maximum UDP datagram size.
2384
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2385
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2386
#   (assuming we can't use jumbo frames)
2387
# We just set this to 60K, which should be enough
2388
MAX_UDP_DATA_SIZE = 61440
2389

    
2390
# User-id pool minimum/maximum acceptable user-ids.
2391
UIDPOOL_UID_MIN = 0
2392
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2393

    
2394
# Name or path of the pgrep command
2395
PGREP = "pgrep"
2396

    
2397
# Name of the node group that gets created at cluster init or upgrade
2398
INITIAL_NODE_GROUP_NAME = "default"
2399

    
2400
# Possible values for NodeGroup.alloc_policy
2401
ALLOC_POLICY_PREFERRED = "preferred"
2402
ALLOC_POLICY_LAST_RESORT = "last_resort"
2403
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2404
VALID_ALLOC_POLICIES = [
2405
  ALLOC_POLICY_PREFERRED,
2406
  ALLOC_POLICY_LAST_RESORT,
2407
  ALLOC_POLICY_UNALLOCABLE,
2408
  ]
2409

    
2410
# Temporary external/shared storage parameters
2411
BLOCKDEV_DRIVER_MANUAL = "manual"
2412

    
2413
# qemu-img path, required for ovfconverter
2414
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2415

    
2416
# Whether htools was enabled at compilation time
2417
HTOOLS = _autoconf.HTOOLS
2418
# The hail iallocator
2419
IALLOC_HAIL = "hail"
2420

    
2421
# Fake opcodes for functions that have hooks attached to them via
2422
# backend.RunLocalHooks
2423
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2424
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2425

    
2426
# SSH key types
2427
SSHK_RSA = "rsa"
2428
SSHK_DSA = "dsa"
2429
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2430

    
2431
# SSH authorized key types
2432
SSHAK_RSA = "ssh-rsa"
2433
SSHAK_DSS = "ssh-dss"
2434
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2435

    
2436
# SSH setup
2437
SSHS_CLUSTER_NAME = "cluster_name"
2438
SSHS_SSH_HOST_KEY = "ssh_host_key"
2439
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2440
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2441

    
2442
#: Key files for SSH daemon
2443
SSH_DAEMON_KEYFILES = {
2444
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2445
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2446
  }
2447

    
2448
# Node daemon setup
2449
NDS_CLUSTER_NAME = "cluster_name"
2450
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2451
NDS_SSCONF = "ssconf"
2452
NDS_START_NODE_DAEMON = "start_node_daemon"
2453

    
2454
# Path generating random UUID
2455
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2456

    
2457
# Regex string for verifying a UUID
2458
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2459

    
2460
# Auto-repair tag prefixes
2461
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2462
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2463
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2464
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2465
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2466

    
2467
# Auto-repair levels
2468
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2469
AUTO_REPAIR_MIGRATE = "migrate"
2470
AUTO_REPAIR_FAILOVER = "failover"
2471
AUTO_REPAIR_REINSTALL = "reinstall"
2472
AUTO_REPAIR_ALL_TYPES = [
2473
  AUTO_REPAIR_FIX_STORAGE,
2474
  AUTO_REPAIR_MIGRATE,
2475
  AUTO_REPAIR_FAILOVER,
2476
  AUTO_REPAIR_REINSTALL,
2477
]
2478

    
2479
# Auto-repair results
2480
AUTO_REPAIR_SUCCESS = "success"
2481
AUTO_REPAIR_FAILURE = "failure"
2482
AUTO_REPAIR_ENOPERM = "enoperm"
2483
AUTO_REPAIR_ALL_RESULTS = frozenset([
2484
    AUTO_REPAIR_SUCCESS,
2485
    AUTO_REPAIR_FAILURE,
2486
    AUTO_REPAIR_ENOPERM,
2487
])
2488

    
2489
# The version identifier for builtin data collectors
2490
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2491

    
2492
# The reason trail opcode parameter name
2493
OPCODE_REASON = "reason"
2494

    
2495
# The source reasons for the execution of an OpCode
2496
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2497
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2498
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2499
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2500
OPCODE_REASON_SRC_USER = "gnt:user"
2501

    
2502
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2503
  OPCODE_REASON_SRC_CLIENT,
2504
  OPCODE_REASON_SRC_NODED,
2505
  OPCODE_REASON_SRC_OPCODE,
2506
  OPCODE_REASON_SRC_RLIB2,
2507
  OPCODE_REASON_SRC_USER,
2508
  ])
2509

    
2510
# disk removal timeouts
2511
DISK_REMOVE_RETRY_INTERVAL = 3
2512
DISK_REMOVE_RETRY_TIMEOUT = 30
2513

    
2514
# Do not re-export imported modules
2515
del re, _vcsversion, _autoconf, socket, pathutils, compat