Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ df726590

History | View | Annotate | Download (66.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 _constants
29
from ganeti import _vcsversion
30
from ganeti import compat
31
from ganeti import pathutils
32

    
33

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

    
48

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

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

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

66
  Returns: int representing version number
67

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

    
76

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

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

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

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

    
88
  return (major, minor, revision)
89

    
90

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

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

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

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

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

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

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

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

    
154
# SSH constants
155
SSH = _constants.SSH
156
SCP = _constants.SCP
157

    
158
NODED = _constants.NODED
159
CONFD = _constants.CONFD
160
LUXID = _constants.LUXID
161
RAPI = _constants.RAPI
162
MASTERD = _constants.MASTERD
163
MOND = _constants.MOND
164

    
165
DAEMONS = _constants.DAEMONS
166

    
167
DAEMONS_PORTS = _constants.DAEMONS_PORTS
168

    
169
DEFAULT_NODED_PORT = _constants.DEFAULT_NODED_PORT
170
DEFAULT_CONFD_PORT = _constants.DEFAULT_CONFD_PORT
171
DEFAULT_MOND_PORT = _constants.DEFAULT_MOND_PORT
172
DEFAULT_RAPI_PORT = _constants.DEFAULT_RAPI_PORT
173

    
174
FIRST_DRBD_PORT = 11000
175
LAST_DRBD_PORT = 14999
176

    
177
DAEMONS_LOGBASE = _constants.DAEMONS_LOGBASE
178

    
179
DAEMONS_LOGFILES = \
180
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
181
         for daemon in DAEMONS_LOGBASE)
182

    
183
# Some daemons might require more than one logfile.
184
# Specifically, right now only the Haskell http library "snap", used by the
185
# monitoring daemon, requires multiple log files.
186

    
187
# These are the only valid reasons for having an extra logfile
188
EXTRA_LOGREASON_ACCESS = "access"
189
EXTRA_LOGREASON_ERROR = "error"
190

    
191
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
192
  EXTRA_LOGREASON_ACCESS,
193
  EXTRA_LOGREASON_ERROR,
194
  ])
195

    
196
# These are the extra logfiles, grouped by daemon
197
DAEMONS_EXTRA_LOGBASE = {
198
  MOND: {
199
    EXTRA_LOGREASON_ACCESS: _constants.EXTRA_LOGREASON_ACCESS,
200
    EXTRA_LOGREASON_ERROR: _constants.EXTRA_LOGREASON_ERROR,
201
    }
202
  }
203

    
204
DAEMONS_EXTRA_LOGFILES = \
205
  dict((daemon, dict((extra,
206
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
207
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
208
         for daemon in DAEMONS_EXTRA_LOGBASE)
209

    
210
DEV_CONSOLE = _constants.DEV_CONSOLE
211

    
212
PROC_MOUNTS = "/proc/mounts"
213

    
214
# Local UniX Interface related constants
215
LUXI_EOM = "\3"
216
LUXI_VERSION = CONFIG_VERSION
217
#: Environment variable for the luxi override socket
218
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
219
LUXI_OVERRIDE_MASTER = "master"
220
LUXI_OVERRIDE_QUERY = "query"
221

    
222
# one of "no", "yes", "only"
223
SYSLOG_USAGE = _constants.SYSLOG_USAGE
224
SYSLOG_NO = _constants.SYSLOG_NO
225
SYSLOG_YES = _constants.SYSLOG_YES
226
SYSLOG_ONLY = _constants.SYSLOG_ONLY
227
SYSLOG_SOCKET = _constants.SYSLOG_SOCKET
228

    
229
EXPORT_CONF_FILE = "config.ini"
230

    
231
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
232
XEN_KERNEL = _autoconf.XEN_KERNEL
233
XEN_INITRD = _autoconf.XEN_INITRD
234
XEN_CMD_XM = "xm"
235
XEN_CMD_XL = "xl"
236

    
237
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
238
  XEN_CMD_XM,
239
  XEN_CMD_XL,
240
  ])
241

    
242
# When the Xen toolstack used is "xl", live migration requires the source host
243
# to connect to the target host via ssh (xl runs this command). We need to pass
244
# the command xl runs some extra info so that it can use Ganeti's key
245
# verification and not fail. Note that this string is incomplete: it must be
246
# filled with the cluster name before being used.
247
XL_SSH_CMD = ("ssh -l %s -oGlobalKnownHostsFile=%s"
248
              " -oUserKnownHostsFile=/dev/null"
249
              " -oCheckHostIp=no -oStrictHostKeyChecking=yes"
250
              " -oHostKeyAlias=%%s") % (SSH_LOGIN_USER,
251
                                        pathutils.SSH_KNOWN_HOSTS_FILE)
252

    
253
KVM_PATH = _autoconf.KVM_PATH
254
KVM_KERNEL = _autoconf.KVM_KERNEL
255
SOCAT_PATH = _autoconf.SOCAT_PATH
256
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
257
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
258
SOCAT_ESCAPE_CODE = "0x1d"
259

    
260
#: Console as SSH command
261
CONS_SSH = "ssh"
262

    
263
#: Console as VNC server
264
CONS_VNC = "vnc"
265

    
266
#: Console as SPICE server
267
CONS_SPICE = "spice"
268

    
269
#: Display a message for console access
270
CONS_MESSAGE = "msg"
271

    
272
#: All console types
273
CONS_ALL = compat.UniqueFrozenset([
274
  CONS_SSH,
275
  CONS_VNC,
276
  CONS_SPICE,
277
  CONS_MESSAGE,
278
  ])
279

    
280
# For RSA keys more bits are better, but they also make operations more
281
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
282
# 2010 on.
283
RSA_KEY_BITS = 2048
284

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

    
293
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
294
X509_CERT_SIGN_DIGEST = "SHA1"
295

    
296
# Default validity of certificates in days
297
X509_CERT_DEFAULT_VALIDITY = 365 * 5
298

    
299
# commonName (CN) used in certificates
300
X509_CERT_CN = "ganeti.example.com"
301

    
302
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
303

    
304
# Import/export daemon mode
305
IEM_IMPORT = "import"
306
IEM_EXPORT = "export"
307

    
308
# Import/export transport compression
309
IEC_NONE = "none"
310
IEC_GZIP = "gzip"
311
IEC_ALL = compat.UniqueFrozenset([
312
  IEC_NONE,
313
  IEC_GZIP,
314
  ])
315

    
316
IE_CUSTOM_SIZE = "fd"
317

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

    
320
# Import/export I/O
321
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
322
IEIO_FILE = "file"
323
# Raw block device I/O using "dd"
324
IEIO_RAW_DISK = "raw"
325
# OS definition import/export script
326
IEIO_SCRIPT = "script"
327

    
328
VALUE_DEFAULT = "default"
329
VALUE_AUTO = "auto"
330
VALUE_GENERATE = "generate"
331
VALUE_NONE = "none"
332
VALUE_TRUE = "true"
333
VALUE_FALSE = "false"
334
VALUE_HS_NOTHING = {"Nothing": None}
335

    
336

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

    
340
# hooks-related constants
341
HOOKS_PHASE_PRE = "pre"
342
HOOKS_PHASE_POST = "post"
343
HOOKS_NAME_CFGUPDATE = "config-update"
344
HOOKS_NAME_WATCHER = "watcher"
345
HOOKS_VERSION = 2
346
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
347

    
348
# hooks subject type (what object type does the LU deal with)
349
HTYPE_CLUSTER = "CLUSTER"
350
HTYPE_NODE = "NODE"
351
HTYPE_GROUP = "GROUP"
352
HTYPE_INSTANCE = "INSTANCE"
353
HTYPE_NETWORK = "NETWORK"
354

    
355
HKR_SKIP = 0
356
HKR_FAIL = 1
357
HKR_SUCCESS = 2
358

    
359
# Storage types
360
ST_BLOCK = "blockdev"
361
ST_DISKLESS = "diskless"
362
ST_EXT = "ext"
363
ST_FILE = "file"
364
ST_LVM_PV = "lvm-pv"
365
ST_LVM_VG = "lvm-vg"
366
ST_RADOS = "rados"
367

    
368
STORAGE_TYPES = compat.UniqueFrozenset([
369
  ST_BLOCK,
370
  ST_DISKLESS,
371
  ST_EXT,
372
  ST_FILE,
373
  ST_LVM_PV,
374
  ST_LVM_VG,
375
  ST_RADOS,
376
  ])
377

    
378
# the set of storage types for which storage reporting is available
379
# FIXME: Remove this, once storage reporting is available for all types.
380
STS_REPORT = compat.UniqueFrozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
381

    
382
# Storage fields
383
# first two are valid in LU context only, not passed to backend
384
SF_NODE = "node"
385
SF_TYPE = "type"
386
# and the rest are valid in backend
387
SF_NAME = "name"
388
SF_SIZE = "size"
389
SF_FREE = "free"
390
SF_USED = "used"
391
SF_ALLOCATABLE = "allocatable"
392

    
393
# Storage operations
394
SO_FIX_CONSISTENCY = "fix-consistency"
395

    
396
# Available fields per storage type
397
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
398
  SF_NODE,
399
  SF_NAME,
400
  SF_TYPE,
401
  SF_SIZE,
402
  SF_USED,
403
  SF_FREE,
404
  SF_ALLOCATABLE,
405
  ])
406

    
407
MODIFIABLE_STORAGE_FIELDS = {
408
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
409
  }
410

    
411
VALID_STORAGE_OPERATIONS = {
412
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
413
  }
414

    
415
# Volume fields
416
VF_DEV = "dev"
417
VF_INSTANCE = "instance"
418
VF_NAME = "name"
419
VF_NODE = "node"
420
VF_PHYS = "phys"
421
VF_SIZE = "size"
422
VF_VG = "vg"
423

    
424
# Local disk status
425
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
426
(LDS_OKAY,
427
 LDS_UNKNOWN,
428
 LDS_FAULTY) = range(1, 4)
429

    
430
LDS_NAMES = {
431
  LDS_OKAY: "ok",
432
  LDS_UNKNOWN: "unknown",
433
  LDS_FAULTY: "faulty",
434
}
435

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

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

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

    
472
# disk templates that are enabled by default
473
DEFAULT_ENABLED_DISK_TEMPLATES = [
474
  DT_DRBD8,
475
  DT_PLAIN,
476
  ]
477

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

    
490
# the set of network-mirrored disk templates
491
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
492

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

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

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

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

    
528
# the set of disk templates that *must* use adoption
529
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
530

    
531
# the set of disk templates that allow migrations
532
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
533

    
534
# the set of file based disk templates
535
DTS_FILEBASED = compat.UniqueFrozenset([
536
  DT_FILE,
537
  DT_SHARED_FILE,
538
  ])
539

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

    
548
# the set of disk templates that are supported by exclusive_storage
549
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
550

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

    
559
DTS_BLOCK = compat.UniqueFrozenset([
560
  DT_PLAIN,
561
  DT_DRBD8,
562
  DT_BLOCK,
563
  DT_RBD,
564
  DT_EXT,
565
  ])
566

    
567
# drbd constants
568
DRBD_HMAC_ALG = "md5"
569
DRBD_DEFAULT_NET_PROTOCOL = "C"
570
DRBD_MIGRATION_NET_PROTOCOL = "C"
571
DRBD_STATUS_FILE = "/proc/drbd"
572

    
573
#: Size of DRBD meta block device
574
DRBD_META_SIZE = 128
575

    
576
# drbd barrier types
577
DRBD_B_NONE = "n"
578
DRBD_B_DISK_BARRIERS = "b"
579
DRBD_B_DISK_DRAIN = "d"
580
DRBD_B_DISK_FLUSH = "f"
581

    
582
# Valid barrier combinations: "n" or any non-null subset of "bfd"
583
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
584
  frozenset([DRBD_B_NONE]),
585
  frozenset([DRBD_B_DISK_BARRIERS]),
586
  frozenset([DRBD_B_DISK_DRAIN]),
587
  frozenset([DRBD_B_DISK_FLUSH]),
588
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
589
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
590
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
591
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
592
  ])
593

    
594
# rbd tool command
595
RBD_CMD = "rbd"
596

    
597
# file backend driver
598
FD_LOOP = "loop"
599
FD_BLKTAP = "blktap"
600

    
601
# the set of drbd-like disk types
602
LDS_DRBD = compat.UniqueFrozenset([DT_DRBD8])
603

    
604
# disk access mode
605
DISK_RDONLY = "ro"
606
DISK_RDWR = "rw"
607
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
608

    
609
# disk replacement mode
610
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
611
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
612
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
613
REPLACE_DISK_AUTO = "replace_auto"
614
REPLACE_MODES = compat.UniqueFrozenset([
615
  REPLACE_DISK_PRI,
616
  REPLACE_DISK_SEC,
617
  REPLACE_DISK_CHG,
618
  REPLACE_DISK_AUTO,
619
  ])
620

    
621
# Instance export mode
622
EXPORT_MODE_LOCAL = "local"
623
EXPORT_MODE_REMOTE = "remote"
624
EXPORT_MODES = compat.UniqueFrozenset([
625
  EXPORT_MODE_LOCAL,
626
  EXPORT_MODE_REMOTE,
627
  ])
628

    
629
# instance creation modes
630
INSTANCE_CREATE = "create"
631
INSTANCE_IMPORT = "import"
632
INSTANCE_REMOTE_IMPORT = "remote-import"
633
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
634
  INSTANCE_CREATE,
635
  INSTANCE_IMPORT,
636
  INSTANCE_REMOTE_IMPORT,
637
  ])
638

    
639
# Remote import/export handshake message and version
640
RIE_VERSION = 0
641
RIE_HANDSHAKE = "Hi, I'm Ganeti"
642

    
643
# Remote import/export certificate validity in seconds
644
RIE_CERT_VALIDITY = 24 * 60 * 60
645

    
646
# Overall timeout for establishing connection
647
RIE_CONNECT_TIMEOUT = 180
648

    
649
# Export only: how long to wait per connection attempt (seconds)
650
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
651

    
652
# Export only: number of attempts to connect
653
RIE_CONNECT_RETRIES = 10
654

    
655
#: Give child process up to 5 seconds to exit after sending a signal
656
CHILD_LINGER_TIMEOUT = 5.0
657

    
658
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
659

    
660
# import/export config options
661
INISECT_EXP = "export"
662
INISECT_INS = "instance"
663
INISECT_HYP = "hypervisor"
664
INISECT_BEP = "backend"
665
INISECT_OSP = "os"
666

    
667
# dynamic device modification
668
DDM_ADD = "add"
669
DDM_MODIFY = "modify"
670
DDM_REMOVE = "remove"
671
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
672
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
673
  DDM_MODIFY,
674
  ]))
675
# TODO: DDM_SWAP, DDM_MOVE?
676

    
677
# common exit codes
678
EXIT_SUCCESS = _constants.EXIT_SUCCESS
679
EXIT_FAILURE = _constants.EXIT_FAILURE
680
EXIT_NOTCLUSTER = _constants.EXIT_NOTCLUSTER
681
EXIT_NOTMASTER = _constants.EXIT_NOTMASTER
682
EXIT_NODESETUP_ERROR = _constants.EXIT_NODESETUP_ERROR
683
EXIT_CONFIRMATION = _constants.EXIT_CONFIRMATION # need user confirmation
684

    
685
#: Exit code for query operations with unknown fields
686
EXIT_UNKNOWN_FIELD = _constants.EXIT_UNKNOWN_FIELD
687

    
688
# tags
689
TAG_CLUSTER = "cluster"
690
TAG_NODEGROUP = "nodegroup"
691
TAG_NODE = "node"
692
TAG_INSTANCE = "instance"
693
TAG_NETWORK = "network"
694
VALID_TAG_TYPES = compat.UniqueFrozenset([
695
  TAG_CLUSTER,
696
  TAG_NODEGROUP,
697
  TAG_NODE,
698
  TAG_INSTANCE,
699
  TAG_NETWORK,
700
  ])
701
MAX_TAG_LEN = 128
702
MAX_TAGS_PER_OBJ = 4096
703

    
704
# others
705
DEFAULT_BRIDGE = "xen-br0"
706
DEFAULT_OVS = "switch1"
707
CLASSIC_DRBD_SYNC_SPEED = 60 * 1024  # 60 MiB, expressed in KiB
708
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
709
IP4_ADDRESS_ANY = "0.0.0.0"
710
IP6_ADDRESS_LOCALHOST = "::1"
711
IP6_ADDRESS_ANY = "::"
712
IP4_VERSION = 4
713
IP6_VERSION = 6
714
VALID_IP_VERSIONS = compat.UniqueFrozenset([IP4_VERSION, IP6_VERSION])
715
# for export to htools
716
IP4_FAMILY = socket.AF_INET
717
IP6_FAMILY = socket.AF_INET6
718

    
719
TCP_PING_TIMEOUT = 10
720
DEFAULT_VG = "xenvg"
721
DEFAULT_DRBD_HELPER = "/bin/true"
722
MIN_VG_SIZE = 20480
723
DEFAULT_MAC_PREFIX = "aa:00:00"
724
# default maximum instance wait time, in seconds.
725
DEFAULT_SHUTDOWN_TIMEOUT = 120
726
NODE_MAX_CLOCK_SKEW = 150
727
# Time for an intra-cluster disk transfer to wait for a connection
728
DISK_TRANSFER_CONNECT_TIMEOUT = 60
729
# Disk index separator
730
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
731
IP_COMMAND_PATH = _autoconf.IP_PATH
732

    
733
#: Key for job IDs in opcode result
734
JOB_IDS_KEY = "jobs"
735

    
736
# runparts results
737
(RUNPARTS_SKIP,
738
 RUNPARTS_RUN,
739
 RUNPARTS_ERR) = range(3)
740

    
741
RUNPARTS_STATUS = compat.UniqueFrozenset([
742
  RUNPARTS_SKIP,
743
  RUNPARTS_RUN,
744
  RUNPARTS_ERR,
745
  ])
746

    
747
# RPC constants
748
(RPC_ENCODING_NONE,
749
 RPC_ENCODING_ZLIB_BASE64) = range(2)
750

    
751
# Various time constants for the timeout table
752
RPC_TMO_URGENT = 60 # one minute
753
RPC_TMO_FAST = 5 * 60 # five minutes
754
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
755
RPC_TMO_SLOW = 3600 # one hour
756
RPC_TMO_4HRS = 4 * 3600
757
RPC_TMO_1DAY = 86400
758

    
759
# Timeout for connecting to nodes (seconds)
760
RPC_CONNECT_TIMEOUT = 5
761

    
762
# os related constants
763
OS_SCRIPT_CREATE = "create"
764
OS_SCRIPT_IMPORT = "import"
765
OS_SCRIPT_EXPORT = "export"
766
OS_SCRIPT_RENAME = "rename"
767
OS_SCRIPT_VERIFY = "verify"
768
OS_SCRIPTS = compat.UniqueFrozenset([
769
  OS_SCRIPT_CREATE,
770
  OS_SCRIPT_IMPORT,
771
  OS_SCRIPT_EXPORT,
772
  OS_SCRIPT_RENAME,
773
  OS_SCRIPT_VERIFY,
774
  ])
775

    
776
OS_API_FILE = "ganeti_api_version"
777
OS_VARIANTS_FILE = "variants.list"
778
OS_PARAMETERS_FILE = "parameters.list"
779

    
780
OS_VALIDATE_PARAMETERS = "parameters"
781
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
782

    
783
# External Storage (ES) related constants
784
ES_ACTION_CREATE = "create"
785
ES_ACTION_REMOVE = "remove"
786
ES_ACTION_GROW = "grow"
787
ES_ACTION_ATTACH = "attach"
788
ES_ACTION_DETACH = "detach"
789
ES_ACTION_SETINFO = "setinfo"
790
ES_ACTION_VERIFY = "verify"
791

    
792
ES_SCRIPT_CREATE = ES_ACTION_CREATE
793
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
794
ES_SCRIPT_GROW = ES_ACTION_GROW
795
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
796
ES_SCRIPT_DETACH = ES_ACTION_DETACH
797
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
798
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
799
ES_SCRIPTS = frozenset([
800
  ES_SCRIPT_CREATE,
801
  ES_SCRIPT_REMOVE,
802
  ES_SCRIPT_GROW,
803
  ES_SCRIPT_ATTACH,
804
  ES_SCRIPT_DETACH,
805
  ES_SCRIPT_SETINFO,
806
  ES_SCRIPT_VERIFY
807
  ])
808

    
809
ES_PARAMETERS_FILE = "parameters.list"
810

    
811
# reboot types
812
INSTANCE_REBOOT_SOFT = "soft"
813
INSTANCE_REBOOT_HARD = "hard"
814
INSTANCE_REBOOT_FULL = "full"
815

    
816
REBOOT_TYPES = compat.UniqueFrozenset([
817
  INSTANCE_REBOOT_SOFT,
818
  INSTANCE_REBOOT_HARD,
819
  INSTANCE_REBOOT_FULL,
820
  ])
821

    
822
# instance reboot behaviors
823
INSTANCE_REBOOT_ALLOWED = "reboot"
824
INSTANCE_REBOOT_EXIT = "exit"
825

    
826
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
827
  INSTANCE_REBOOT_ALLOWED,
828
  INSTANCE_REBOOT_EXIT,
829
  ])
830

    
831
VTYPE_STRING = "string"
832
VTYPE_MAYBE_STRING = "maybe-string"
833
VTYPE_BOOL = "bool"
834
VTYPE_SIZE = "size" # size, in MiBs
835
VTYPE_INT = "int"
836
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
837
  VTYPE_STRING,
838
  VTYPE_MAYBE_STRING,
839
  VTYPE_BOOL,
840
  VTYPE_SIZE,
841
  VTYPE_INT,
842
  ])
843

    
844
# Constant representing that the user does not specify any IP version
845
IFACE_NO_IP_VERSION_SPECIFIED = 0
846

    
847
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
848
  75,
849
  110,
850
  300,
851
  600,
852
  1200,
853
  1800,
854
  2400,
855
  4800,
856
  9600,
857
  14400,
858
  19200,
859
  28800,
860
  38400,
861
  57600,
862
  115200,
863
  230400,
864
  345600,
865
  460800,
866
  ])
867

    
868
# HV parameter names (global namespace)
869
HV_BOOT_ORDER = "boot_order"
870
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
871
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
872
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
873
HV_NIC_TYPE = "nic_type"
874
HV_DISK_TYPE = "disk_type"
875
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
876
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
877
HV_VNC_PASSWORD_FILE = "vnc_password_file"
878
HV_VNC_TLS = "vnc_tls"
879
HV_VNC_X509 = "vnc_x509_path"
880
HV_VNC_X509_VERIFY = "vnc_x509_verify"
881
HV_KVM_SPICE_BIND = "spice_bind"
882
HV_KVM_SPICE_IP_VERSION = "spice_ip_version"
883
HV_KVM_SPICE_PASSWORD_FILE = "spice_password_file"
884
HV_KVM_SPICE_LOSSLESS_IMG_COMPR = "spice_image_compression"
885
HV_KVM_SPICE_JPEG_IMG_COMPR = "spice_jpeg_wan_compression"
886
HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR = "spice_zlib_glz_wan_compression"
887
HV_KVM_SPICE_STREAMING_VIDEO_DETECTION = "spice_streaming_video"
888
HV_KVM_SPICE_AUDIO_COMPR = "spice_playback_compression"
889
HV_KVM_SPICE_USE_TLS = "spice_use_tls"
890
HV_KVM_SPICE_TLS_CIPHERS = "spice_tls_ciphers"
891
HV_KVM_SPICE_USE_VDAGENT = "spice_use_vdagent"
892
HV_ACPI = "acpi"
893
HV_PAE = "pae"
894
HV_USE_BOOTLOADER = "use_bootloader"
895
HV_BOOTLOADER_ARGS = "bootloader_args"
896
HV_BOOTLOADER_PATH = "bootloader_path"
897
HV_KERNEL_ARGS = "kernel_args"
898
HV_KERNEL_PATH = "kernel_path"
899
HV_INITRD_PATH = "initrd_path"
900
HV_ROOT_PATH = "root_path"
901
HV_SERIAL_CONSOLE = "serial_console"
902
HV_SERIAL_SPEED = "serial_speed"
903
HV_USB_MOUSE = "usb_mouse"
904
HV_KEYMAP = "keymap"
905
HV_DEVICE_MODEL = "device_model"
906
HV_INIT_SCRIPT = "init_script"
907
HV_MIGRATION_PORT = "migration_port"
908
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
909
HV_MIGRATION_DOWNTIME = "migration_downtime"
910
HV_MIGRATION_MODE = "migration_mode"
911
HV_USE_LOCALTIME = "use_localtime"
912
HV_DISK_CACHE = "disk_cache"
913
HV_SECURITY_MODEL = "security_model"
914
HV_SECURITY_DOMAIN = "security_domain"
915
HV_KVM_FLAG = "kvm_flag"
916
HV_VHOST_NET = "vhost_net"
917
HV_KVM_USE_CHROOT = "use_chroot"
918
HV_CPU_MASK = "cpu_mask"
919
HV_MEM_PATH = "mem_path"
920
HV_PASSTHROUGH = "pci_pass"
921
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
922
HV_REBOOT_BEHAVIOR = "reboot_behavior"
923
HV_CPU_TYPE = "cpu_type"
924
HV_CPU_CAP = "cpu_cap"
925
HV_CPU_WEIGHT = "cpu_weight"
926
HV_CPU_CORES = "cpu_cores"
927
HV_CPU_THREADS = "cpu_threads"
928
HV_CPU_SOCKETS = "cpu_sockets"
929
HV_SOUNDHW = "soundhw"
930
HV_USB_DEVICES = "usb_devices"
931
HV_VGA = "vga"
932
HV_KVM_EXTRA = "kvm_extra"
933
HV_KVM_MACHINE_VERSION = "machine_version"
934
HV_KVM_PATH = "kvm_path"
935
HV_VIF_TYPE = "vif_type"
936
HV_VIF_SCRIPT = "vif_script"
937
HV_XEN_CMD = "xen_cmd"
938
HV_VNET_HDR = "vnet_hdr"
939
HV_VIRIDIAN = "viridian"
940

    
941

    
942
HVS_PARAMETER_TYPES = {
943
  HV_KVM_PATH: VTYPE_STRING,
944
  HV_BOOT_ORDER: VTYPE_STRING,
945
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
946
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
947
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
948
  HV_NIC_TYPE: VTYPE_STRING,
949
  HV_DISK_TYPE: VTYPE_STRING,
950
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
951
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
952
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
953
  HV_VNC_TLS: VTYPE_BOOL,
954
  HV_VNC_X509: VTYPE_STRING,
955
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
956
  HV_KVM_SPICE_BIND: VTYPE_STRING,
957
  HV_KVM_SPICE_IP_VERSION: VTYPE_INT,
958
  HV_KVM_SPICE_PASSWORD_FILE: VTYPE_STRING,
959
  HV_KVM_SPICE_LOSSLESS_IMG_COMPR: VTYPE_STRING,
960
  HV_KVM_SPICE_JPEG_IMG_COMPR: VTYPE_STRING,
961
  HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: VTYPE_STRING,
962
  HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: VTYPE_STRING,
963
  HV_KVM_SPICE_AUDIO_COMPR: VTYPE_BOOL,
964
  HV_KVM_SPICE_USE_TLS: VTYPE_BOOL,
965
  HV_KVM_SPICE_TLS_CIPHERS: VTYPE_STRING,
966
  HV_KVM_SPICE_USE_VDAGENT: VTYPE_BOOL,
967
  HV_ACPI: VTYPE_BOOL,
968
  HV_PAE: VTYPE_BOOL,
969
  HV_USE_BOOTLOADER: VTYPE_BOOL,
970
  HV_BOOTLOADER_PATH: VTYPE_STRING,
971
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
972
  HV_KERNEL_PATH: VTYPE_STRING,
973
  HV_KERNEL_ARGS: VTYPE_STRING,
974
  HV_INITRD_PATH: VTYPE_STRING,
975
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
976
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
977
  HV_SERIAL_SPEED: VTYPE_INT,
978
  HV_USB_MOUSE: VTYPE_STRING,
979
  HV_KEYMAP: VTYPE_STRING,
980
  HV_DEVICE_MODEL: VTYPE_STRING,
981
  HV_INIT_SCRIPT: VTYPE_STRING,
982
  HV_MIGRATION_PORT: VTYPE_INT,
983
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
984
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
985
  HV_MIGRATION_MODE: VTYPE_STRING,
986
  HV_USE_LOCALTIME: VTYPE_BOOL,
987
  HV_DISK_CACHE: VTYPE_STRING,
988
  HV_SECURITY_MODEL: VTYPE_STRING,
989
  HV_SECURITY_DOMAIN: VTYPE_STRING,
990
  HV_KVM_FLAG: VTYPE_STRING,
991
  HV_VHOST_NET: VTYPE_BOOL,
992
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
993
  HV_CPU_MASK: VTYPE_STRING,
994
  HV_MEM_PATH: VTYPE_STRING,
995
  HV_PASSTHROUGH: VTYPE_STRING,
996
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
997
  HV_REBOOT_BEHAVIOR: VTYPE_STRING,
998
  HV_CPU_TYPE: VTYPE_STRING,
999
  HV_CPU_CAP: VTYPE_INT,
1000
  HV_CPU_WEIGHT: VTYPE_INT,
1001
  HV_CPU_CORES: VTYPE_INT,
1002
  HV_CPU_THREADS: VTYPE_INT,
1003
  HV_CPU_SOCKETS: VTYPE_INT,
1004
  HV_SOUNDHW: VTYPE_STRING,
1005
  HV_USB_DEVICES: VTYPE_STRING,
1006
  HV_VGA: VTYPE_STRING,
1007
  HV_KVM_EXTRA: VTYPE_STRING,
1008
  HV_KVM_MACHINE_VERSION: VTYPE_STRING,
1009
  HV_VIF_TYPE: VTYPE_STRING,
1010
  HV_VIF_SCRIPT: VTYPE_STRING,
1011
  HV_XEN_CMD: VTYPE_STRING,
1012
  HV_VNET_HDR: VTYPE_BOOL,
1013
  HV_VIRIDIAN: VTYPE_BOOL,
1014
  }
1015

    
1016
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1017

    
1018
HVS_PARAMETER_TITLES = {
1019
  HV_ACPI: "ACPI",
1020
  HV_BOOT_ORDER: "Boot_order",
1021
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1022
  HV_DISK_TYPE: "Disk_type",
1023
  HV_INITRD_PATH: "Initrd_path",
1024
  HV_KERNEL_PATH: "Kernel_path",
1025
  HV_NIC_TYPE: "NIC_type",
1026
  HV_PAE: "PAE",
1027
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1028
  HV_PASSTHROUGH: "pci_pass",
1029
  HV_CPU_TYPE: "cpu_type",
1030
  }
1031

    
1032
# Migration statuses
1033
HV_MIGRATION_COMPLETED = "completed"
1034
HV_MIGRATION_ACTIVE = "active"
1035
HV_MIGRATION_FAILED = "failed"
1036
HV_MIGRATION_CANCELLED = "cancelled"
1037

    
1038
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1039
  HV_MIGRATION_COMPLETED,
1040
  HV_MIGRATION_ACTIVE,
1041
  HV_MIGRATION_FAILED,
1042
  HV_MIGRATION_CANCELLED,
1043
  ])
1044

    
1045
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1046
  HV_MIGRATION_FAILED,
1047
  HV_MIGRATION_CANCELLED,
1048
  ])
1049

    
1050
# KVM-specific statuses
1051
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1052

    
1053
# Node info keys
1054
HV_NODEINFO_KEY_VERSION = "hv_version"
1055

    
1056
# Hypervisor state
1057
HVST_MEMORY_TOTAL = "mem_total"
1058
HVST_MEMORY_NODE = "mem_node"
1059
HVST_MEMORY_HV = "mem_hv"
1060
HVST_CPU_TOTAL = "cpu_total"
1061
HVST_CPU_NODE = "cpu_node"
1062

    
1063
HVST_DEFAULTS = {
1064
  HVST_MEMORY_TOTAL: 0,
1065
  HVST_MEMORY_NODE: 0,
1066
  HVST_MEMORY_HV: 0,
1067
  HVST_CPU_TOTAL: 1,
1068
  HVST_CPU_NODE: 1,
1069
  }
1070

    
1071
HVSTS_PARAMETER_TYPES = {
1072
  HVST_MEMORY_TOTAL: VTYPE_INT,
1073
  HVST_MEMORY_NODE: VTYPE_INT,
1074
  HVST_MEMORY_HV: VTYPE_INT,
1075
  HVST_CPU_TOTAL: VTYPE_INT,
1076
  HVST_CPU_NODE: VTYPE_INT,
1077
  }
1078

    
1079
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1080

    
1081
# Disk state
1082
DS_DISK_TOTAL = "disk_total"
1083
DS_DISK_RESERVED = "disk_reserved"
1084
DS_DISK_OVERHEAD = "disk_overhead"
1085

    
1086
DS_DEFAULTS = {
1087
  DS_DISK_TOTAL: 0,
1088
  DS_DISK_RESERVED: 0,
1089
  DS_DISK_OVERHEAD: 0,
1090
  }
1091

    
1092
DSS_PARAMETER_TYPES = {
1093
  DS_DISK_TOTAL: VTYPE_INT,
1094
  DS_DISK_RESERVED: VTYPE_INT,
1095
  DS_DISK_OVERHEAD: VTYPE_INT,
1096
  }
1097

    
1098
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1099
DS_VALID_TYPES = compat.UniqueFrozenset([DT_PLAIN])
1100

    
1101
# Backend parameter names
1102
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1103
BE_MAXMEM = "maxmem"
1104
BE_MINMEM = "minmem"
1105
BE_VCPUS = "vcpus"
1106
BE_AUTO_BALANCE = "auto_balance"
1107
BE_ALWAYS_FAILOVER = "always_failover"
1108
BE_SPINDLE_USE = "spindle_use"
1109

    
1110
BES_PARAMETER_TYPES = {
1111
  BE_MAXMEM: VTYPE_SIZE,
1112
  BE_MINMEM: VTYPE_SIZE,
1113
  BE_VCPUS: VTYPE_INT,
1114
  BE_AUTO_BALANCE: VTYPE_BOOL,
1115
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1116
  BE_SPINDLE_USE: VTYPE_INT,
1117
  }
1118

    
1119
BES_PARAMETER_TITLES = {
1120
  BE_AUTO_BALANCE: "Auto_balance",
1121
  BE_MAXMEM: "ConfigMaxMem",
1122
  BE_MINMEM: "ConfigMinMem",
1123
  BE_VCPUS: "ConfigVCPUs",
1124
  }
1125

    
1126
BES_PARAMETER_COMPAT = {
1127
  BE_MEMORY: VTYPE_SIZE,
1128
  }
1129
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1130

    
1131
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1132

    
1133
# instance specs
1134
ISPEC_MEM_SIZE = "memory-size"
1135
ISPEC_CPU_COUNT = "cpu-count"
1136
ISPEC_DISK_COUNT = "disk-count"
1137
ISPEC_DISK_SIZE = "disk-size"
1138
ISPEC_NIC_COUNT = "nic-count"
1139
ISPEC_SPINDLE_USE = "spindle-use"
1140

    
1141
ISPECS_PARAMETER_TYPES = {
1142
  ISPEC_MEM_SIZE: VTYPE_INT,
1143
  ISPEC_CPU_COUNT: VTYPE_INT,
1144
  ISPEC_DISK_COUNT: VTYPE_INT,
1145
  ISPEC_DISK_SIZE: VTYPE_INT,
1146
  ISPEC_NIC_COUNT: VTYPE_INT,
1147
  ISPEC_SPINDLE_USE: VTYPE_INT,
1148
  }
1149

    
1150
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1151

    
1152
ISPECS_MINMAX = "minmax"
1153
ISPECS_MIN = "min"
1154
ISPECS_MAX = "max"
1155
ISPECS_STD = "std"
1156
IPOLICY_DTS = "disk-templates"
1157
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1158
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1159

    
1160
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1161
  ISPECS_MIN,
1162
  ISPECS_MAX,
1163
  ])
1164

    
1165
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1166
  IPOLICY_VCPU_RATIO,
1167
  IPOLICY_SPINDLE_RATIO,
1168
  ])
1169

    
1170
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1171
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1172

    
1173
# Node parameter names
1174
ND_OOB_PROGRAM = "oob_program"
1175
ND_SPINDLE_COUNT = "spindle_count"
1176
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1177
ND_OVS = "ovs"
1178
ND_OVS_NAME = "ovs_name"
1179
ND_OVS_LINK = "ovs_link"
1180

    
1181
NDS_PARAMETER_TYPES = {
1182
  ND_OOB_PROGRAM: VTYPE_STRING,
1183
  ND_SPINDLE_COUNT: VTYPE_INT,
1184
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1185
  ND_OVS: VTYPE_BOOL,
1186
  ND_OVS_NAME: VTYPE_MAYBE_STRING,
1187
  ND_OVS_LINK: VTYPE_MAYBE_STRING,
1188
  }
1189

    
1190
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1191

    
1192
NDS_PARAMETER_TITLES = {
1193
  ND_OOB_PROGRAM: "OutOfBandProgram",
1194
  ND_SPINDLE_COUNT: "SpindleCount",
1195
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1196
  ND_OVS: "OpenvSwitch",
1197
  ND_OVS_NAME: "OpenvSwitchName",
1198
  ND_OVS_LINK: "OpenvSwitchLink",
1199
  }
1200

    
1201
# Logical Disks parameters
1202
LDP_RESYNC_RATE = "resync-rate"
1203
LDP_STRIPES = "stripes"
1204
LDP_BARRIERS = "disabled-barriers"
1205
LDP_NO_META_FLUSH = "disable-meta-flush"
1206
LDP_DEFAULT_METAVG = "default-metavg"
1207
LDP_DISK_CUSTOM = "disk-custom"
1208
LDP_NET_CUSTOM = "net-custom"
1209
LDP_PROTOCOL = "protocol"
1210
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1211
LDP_PLAN_AHEAD = "c-plan-ahead"
1212
LDP_FILL_TARGET = "c-fill-target"
1213
LDP_DELAY_TARGET = "c-delay-target"
1214
LDP_MAX_RATE = "c-max-rate"
1215
LDP_MIN_RATE = "c-min-rate"
1216
LDP_POOL = "pool"
1217
DISK_LD_TYPES = {
1218
  LDP_RESYNC_RATE: VTYPE_INT,
1219
  LDP_STRIPES: VTYPE_INT,
1220
  LDP_BARRIERS: VTYPE_STRING,
1221
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1222
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1223
  LDP_DISK_CUSTOM: VTYPE_STRING,
1224
  LDP_NET_CUSTOM: VTYPE_STRING,
1225
  LDP_PROTOCOL: VTYPE_STRING,
1226
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1227
  LDP_PLAN_AHEAD: VTYPE_INT,
1228
  LDP_FILL_TARGET: VTYPE_INT,
1229
  LDP_DELAY_TARGET: VTYPE_INT,
1230
  LDP_MAX_RATE: VTYPE_INT,
1231
  LDP_MIN_RATE: VTYPE_INT,
1232
  LDP_POOL: VTYPE_STRING,
1233
  }
1234
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1235

    
1236
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1237
# gnt-group)
1238
DRBD_RESYNC_RATE = "resync-rate"
1239
DRBD_DATA_STRIPES = "data-stripes"
1240
DRBD_META_STRIPES = "meta-stripes"
1241
DRBD_DISK_BARRIERS = "disk-barriers"
1242
DRBD_META_BARRIERS = "meta-barriers"
1243
DRBD_DEFAULT_METAVG = "metavg"
1244
DRBD_DISK_CUSTOM = "disk-custom"
1245
DRBD_NET_CUSTOM = "net-custom"
1246
DRBD_PROTOCOL = "protocol"
1247
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1248
DRBD_PLAN_AHEAD = "c-plan-ahead"
1249
DRBD_FILL_TARGET = "c-fill-target"
1250
DRBD_DELAY_TARGET = "c-delay-target"
1251
DRBD_MAX_RATE = "c-max-rate"
1252
DRBD_MIN_RATE = "c-min-rate"
1253
LV_STRIPES = "stripes"
1254
RBD_POOL = "pool"
1255
DISK_DT_TYPES = {
1256
  DRBD_RESYNC_RATE: VTYPE_INT,
1257
  DRBD_DATA_STRIPES: VTYPE_INT,
1258
  DRBD_META_STRIPES: VTYPE_INT,
1259
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1260
  DRBD_META_BARRIERS: VTYPE_BOOL,
1261
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1262
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1263
  DRBD_NET_CUSTOM: VTYPE_STRING,
1264
  DRBD_PROTOCOL: VTYPE_STRING,
1265
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1266
  DRBD_PLAN_AHEAD: VTYPE_INT,
1267
  DRBD_FILL_TARGET: VTYPE_INT,
1268
  DRBD_DELAY_TARGET: VTYPE_INT,
1269
  DRBD_MAX_RATE: VTYPE_INT,
1270
  DRBD_MIN_RATE: VTYPE_INT,
1271
  LV_STRIPES: VTYPE_INT,
1272
  RBD_POOL: VTYPE_STRING,
1273
  }
1274

    
1275
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1276

    
1277
# OOB supported commands
1278
OOB_POWER_ON = "power-on"
1279
OOB_POWER_OFF = "power-off"
1280
OOB_POWER_CYCLE = "power-cycle"
1281
OOB_POWER_STATUS = "power-status"
1282
OOB_HEALTH = "health"
1283

    
1284
OOB_COMMANDS = compat.UniqueFrozenset([
1285
  OOB_POWER_ON,
1286
  OOB_POWER_OFF,
1287
  OOB_POWER_CYCLE,
1288
  OOB_POWER_STATUS,
1289
  OOB_HEALTH,
1290
  ])
1291

    
1292
OOB_POWER_STATUS_POWERED = "powered"
1293

    
1294
OOB_TIMEOUT = 60 # 60 seconds
1295
OOB_POWER_DELAY = 2.0 # 2 seconds
1296

    
1297
OOB_STATUS_OK = "OK"
1298
OOB_STATUS_WARNING = "WARNING"
1299
OOB_STATUS_CRITICAL = "CRITICAL"
1300
OOB_STATUS_UNKNOWN = "UNKNOWN"
1301

    
1302
OOB_STATUSES = compat.UniqueFrozenset([
1303
  OOB_STATUS_OK,
1304
  OOB_STATUS_WARNING,
1305
  OOB_STATUS_CRITICAL,
1306
  OOB_STATUS_UNKNOWN,
1307
  ])
1308

    
1309
# Instance Parameters Profile
1310
PP_DEFAULT = "default"
1311

    
1312
# NIC_* constants are used inside the ganeti config
1313
NIC_MODE = "mode"
1314
NIC_LINK = "link"
1315
NIC_VLAN = "vlan"
1316

    
1317
NIC_MODE_BRIDGED = "bridged"
1318
NIC_MODE_ROUTED = "routed"
1319
NIC_MODE_OVS = "openvswitch"
1320
NIC_IP_POOL = "pool"
1321

    
1322
NIC_VALID_MODES = compat.UniqueFrozenset([
1323
  NIC_MODE_BRIDGED,
1324
  NIC_MODE_ROUTED,
1325
  NIC_MODE_OVS,
1326
  ])
1327

    
1328
RESERVE_ACTION = "reserve"
1329
RELEASE_ACTION = "release"
1330

    
1331
NICS_PARAMETER_TYPES = {
1332
  NIC_MODE: VTYPE_STRING,
1333
  NIC_LINK: VTYPE_STRING,
1334
  NIC_VLAN: VTYPE_MAYBE_STRING,
1335
  }
1336

    
1337
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1338

    
1339
# IDISK_* constants are used in opcodes, to create/change disks
1340
IDISK_SIZE = "size"
1341
IDISK_SPINDLES = "spindles"
1342
IDISK_MODE = "mode"
1343
IDISK_ADOPT = "adopt"
1344
IDISK_VG = "vg"
1345
IDISK_METAVG = "metavg"
1346
IDISK_PROVIDER = "provider"
1347
IDISK_NAME = "name"
1348
IDISK_PARAMS_TYPES = {
1349
  IDISK_SIZE: VTYPE_SIZE,
1350
  IDISK_SPINDLES: VTYPE_INT,
1351
  IDISK_MODE: VTYPE_STRING,
1352
  IDISK_ADOPT: VTYPE_STRING,
1353
  IDISK_VG: VTYPE_STRING,
1354
  IDISK_METAVG: VTYPE_STRING,
1355
  IDISK_PROVIDER: VTYPE_STRING,
1356
  IDISK_NAME: VTYPE_MAYBE_STRING,
1357
  }
1358
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1359

    
1360
# INIC_* constants are used in opcodes, to create/change nics
1361
INIC_MAC = "mac"
1362
INIC_IP = "ip"
1363
INIC_MODE = "mode"
1364
INIC_LINK = "link"
1365
INIC_NETWORK = "network"
1366
INIC_NAME = "name"
1367
INIC_VLAN = "vlan"
1368
INIC_BRIDGE = "bridge"
1369
INIC_PARAMS_TYPES = {
1370
  INIC_IP: VTYPE_MAYBE_STRING,
1371
  INIC_LINK: VTYPE_STRING,
1372
  INIC_MAC: VTYPE_STRING,
1373
  INIC_MODE: VTYPE_STRING,
1374
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1375
  INIC_NAME: VTYPE_MAYBE_STRING,
1376
  INIC_VLAN: VTYPE_MAYBE_STRING,
1377
  INIC_BRIDGE: VTYPE_MAYBE_STRING
1378
  }
1379
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1380

    
1381
# Hypervisor constants
1382
HT_XEN_PVM = "xen-pvm"
1383
HT_FAKE = "fake"
1384
HT_XEN_HVM = "xen-hvm"
1385
HT_KVM = "kvm"
1386
HT_CHROOT = "chroot"
1387
HT_LXC = "lxc"
1388
HYPER_TYPES = compat.UniqueFrozenset([
1389
  HT_XEN_PVM,
1390
  HT_FAKE,
1391
  HT_XEN_HVM,
1392
  HT_KVM,
1393
  HT_CHROOT,
1394
  HT_LXC,
1395
  ])
1396
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1397

    
1398
VNC_BASE_PORT = 5900
1399
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1400

    
1401
# NIC types
1402
HT_NIC_RTL8139 = "rtl8139"
1403
HT_NIC_NE2K_PCI = "ne2k_pci"
1404
HT_NIC_NE2K_ISA = "ne2k_isa"
1405
HT_NIC_I82551 = "i82551"
1406
HT_NIC_I85557B = "i82557b"
1407
HT_NIC_I8259ER = "i82559er"
1408
HT_NIC_PCNET = "pcnet"
1409
HT_NIC_E1000 = "e1000"
1410
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1411

    
1412
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1413
  HT_NIC_RTL8139,
1414
  HT_NIC_NE2K_PCI,
1415
  HT_NIC_E1000,
1416
  HT_NIC_NE2K_ISA,
1417
  HT_NIC_PARAVIRTUAL,
1418
  ])
1419
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1420
  HT_NIC_RTL8139,
1421
  HT_NIC_NE2K_PCI,
1422
  HT_NIC_NE2K_ISA,
1423
  HT_NIC_I82551,
1424
  HT_NIC_I85557B,
1425
  HT_NIC_I8259ER,
1426
  HT_NIC_PCNET,
1427
  HT_NIC_E1000,
1428
  HT_NIC_PARAVIRTUAL,
1429
  ])
1430

    
1431
# Vif types
1432
# default vif type in xen-hvm
1433
HT_HVM_VIF_IOEMU = "ioemu"
1434
HT_HVM_VIF_VIF = "vif"
1435
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1436
  HT_HVM_VIF_IOEMU,
1437
  HT_HVM_VIF_VIF,
1438
  ])
1439

    
1440
# Disk types
1441
HT_DISK_IOEMU = "ioemu"
1442
HT_DISK_IDE = "ide"
1443
HT_DISK_SCSI = "scsi"
1444
HT_DISK_SD = "sd"
1445
HT_DISK_MTD = "mtd"
1446
HT_DISK_PFLASH = "pflash"
1447

    
1448
HT_CACHE_DEFAULT = "default"
1449
HT_CACHE_NONE = "none"
1450
HT_CACHE_WTHROUGH = "writethrough"
1451
HT_CACHE_WBACK = "writeback"
1452
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1453
  HT_CACHE_DEFAULT,
1454
  HT_CACHE_NONE,
1455
  HT_CACHE_WTHROUGH,
1456
  HT_CACHE_WBACK,
1457
  ])
1458

    
1459
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1460
  HT_DISK_PARAVIRTUAL,
1461
  HT_DISK_IOEMU,
1462
  ])
1463
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1464
  HT_DISK_PARAVIRTUAL,
1465
  HT_DISK_IDE,
1466
  HT_DISK_SCSI,
1467
  HT_DISK_SD,
1468
  HT_DISK_MTD,
1469
  HT_DISK_PFLASH,
1470
  ])
1471

    
1472
# Mouse types:
1473
HT_MOUSE_MOUSE = "mouse"
1474
HT_MOUSE_TABLET = "tablet"
1475

    
1476
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1477
  HT_MOUSE_MOUSE,
1478
  HT_MOUSE_TABLET,
1479
  ])
1480

    
1481
# Boot order
1482
HT_BO_FLOPPY = "floppy"
1483
HT_BO_CDROM = "cdrom"
1484
HT_BO_DISK = "disk"
1485
HT_BO_NETWORK = "network"
1486

    
1487
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1488
  HT_BO_FLOPPY,
1489
  HT_BO_CDROM,
1490
  HT_BO_DISK,
1491
  HT_BO_NETWORK,
1492
  ])
1493

    
1494
# SPICE lossless image compression options
1495
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1496
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1497
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1498
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1499
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1500
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1501

    
1502
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1503
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1504
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1505
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1506
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1507
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1508
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1509
  ])
1510

    
1511
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1512
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1513
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1514
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1515

    
1516
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1517
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1518
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1519
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1520
  ])
1521

    
1522
# SPICE video stream detection
1523
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1524
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1525
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1526

    
1527
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1528
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1529
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1530
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1531
  ])
1532

    
1533
# Security models
1534
HT_SM_NONE = "none"
1535
HT_SM_USER = "user"
1536
HT_SM_POOL = "pool"
1537

    
1538
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1539
  HT_SM_NONE,
1540
  HT_SM_USER,
1541
  HT_SM_POOL,
1542
  ])
1543

    
1544
# Kvm flag values
1545
HT_KVM_ENABLED = "enabled"
1546
HT_KVM_DISABLED = "disabled"
1547

    
1548
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1549

    
1550
# Migration type
1551
HT_MIGRATION_LIVE = "live"
1552
HT_MIGRATION_NONLIVE = "non-live"
1553
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1554
  HT_MIGRATION_LIVE,
1555
  HT_MIGRATION_NONLIVE,
1556
  ])
1557

    
1558
# Cluster Verify steps
1559
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1560
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1561

    
1562
# Cluster Verify error classes
1563
CV_TCLUSTER = "cluster"
1564
CV_TGROUP = "group"
1565
CV_TNODE = "node"
1566
CV_TINSTANCE = "instance"
1567

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

    
1660
CV_ALL_ECODES = compat.UniqueFrozenset([
1661
  CV_ECLUSTERCFG,
1662
  CV_ECLUSTERCERT,
1663
  CV_ECLUSTERFILECHECK,
1664
  CV_ECLUSTERDANGLINGNODES,
1665
  CV_ECLUSTERDANGLINGINST,
1666
  CV_EINSTANCEBADNODE,
1667
  CV_EINSTANCEDOWN,
1668
  CV_EINSTANCELAYOUT,
1669
  CV_EINSTANCEMISSINGDISK,
1670
  CV_EINSTANCEFAULTYDISK,
1671
  CV_EINSTANCEWRONGNODE,
1672
  CV_EINSTANCESPLITGROUPS,
1673
  CV_EINSTANCEPOLICY,
1674
  CV_ENODEDRBD,
1675
  CV_ENODEDRBDHELPER,
1676
  CV_ENODEFILECHECK,
1677
  CV_ENODEHOOKS,
1678
  CV_ENODEHV,
1679
  CV_ENODELVM,
1680
  CV_ENODEN1,
1681
  CV_ENODENET,
1682
  CV_ENODEOS,
1683
  CV_ENODEORPHANINSTANCE,
1684
  CV_ENODEORPHANLV,
1685
  CV_ENODERPC,
1686
  CV_ENODESSH,
1687
  CV_ENODEVERSION,
1688
  CV_ENODESETUP,
1689
  CV_ENODETIME,
1690
  CV_ENODEOOBPATH,
1691
  CV_ENODEUSERSCRIPTS,
1692
  CV_ENODEFILESTORAGEPATHS,
1693
  CV_ENODEFILESTORAGEPATHUNUSABLE,
1694
  CV_ENODESHAREDFILESTORAGEPATHUNUSABLE,
1695
  ])
1696

    
1697
CV_ALL_ECODES_STRINGS = \
1698
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1699

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

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

    
1748
# Admin states
1749
ADMINST_UP = _constants.ADMINST_UP
1750
ADMINST_DOWN = _constants.ADMINST_DOWN
1751
ADMINST_OFFLINE = _constants.ADMINST_OFFLINE
1752
ADMINST_ALL = _constants.ADMINST_ALL
1753

    
1754
# Node roles
1755
NR_REGULAR = "R"
1756
NR_MASTER = "M"
1757
NR_MCANDIDATE = "C"
1758
NR_DRAINED = "D"
1759
NR_OFFLINE = "O"
1760
NR_ALL = compat.UniqueFrozenset([
1761
  NR_REGULAR,
1762
  NR_MASTER,
1763
  NR_MCANDIDATE,
1764
  NR_DRAINED,
1765
  NR_OFFLINE,
1766
  ])
1767

    
1768
# SSL certificate check constants (in days)
1769
SSL_CERT_EXPIRATION_WARN = 30
1770
SSL_CERT_EXPIRATION_ERROR = 7
1771

    
1772
# Allocator framework constants
1773
IALLOCATOR_VERSION = 2
1774
IALLOCATOR_DIR_IN = "in"
1775
IALLOCATOR_DIR_OUT = "out"
1776
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1777
  IALLOCATOR_DIR_IN,
1778
  IALLOCATOR_DIR_OUT,
1779
  ])
1780
IALLOCATOR_MODE_ALLOC = "allocate"
1781
IALLOCATOR_MODE_RELOC = "relocate"
1782
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1783
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1784
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1785
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1786
  IALLOCATOR_MODE_ALLOC,
1787
  IALLOCATOR_MODE_RELOC,
1788
  IALLOCATOR_MODE_CHG_GROUP,
1789
  IALLOCATOR_MODE_NODE_EVAC,
1790
  IALLOCATOR_MODE_MULTI_ALLOC,
1791
  ])
1792
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1793
DEFAULT_IALLOCATOR_SHORTCUT = "."
1794

    
1795
IALLOCATOR_NEVAC_PRI = "primary-only"
1796
IALLOCATOR_NEVAC_SEC = "secondary-only"
1797
IALLOCATOR_NEVAC_ALL = "all"
1798
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1799
  IALLOCATOR_NEVAC_PRI,
1800
  IALLOCATOR_NEVAC_SEC,
1801
  IALLOCATOR_NEVAC_ALL,
1802
  ])
1803

    
1804
# Node evacuation
1805
NODE_EVAC_PRI = "primary-only"
1806
NODE_EVAC_SEC = "secondary-only"
1807
NODE_EVAC_ALL = "all"
1808
NODE_EVAC_MODES = compat.UniqueFrozenset([
1809
  NODE_EVAC_PRI,
1810
  NODE_EVAC_SEC,
1811
  NODE_EVAC_ALL,
1812
  ])
1813

    
1814
# Job queue
1815
JOB_QUEUE_VERSION = 1
1816
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1817
JOB_QUEUE_FILES_PERMS = 0640
1818

    
1819
JOB_ID_TEMPLATE = r"\d+"
1820
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1821

    
1822
# unchanged job return
1823
JOB_NOTCHANGED = "nochange"
1824

    
1825
# Job status
1826
JOB_STATUS_QUEUED = "queued"
1827
JOB_STATUS_WAITING = "waiting"
1828
JOB_STATUS_CANCELING = "canceling"
1829
JOB_STATUS_RUNNING = "running"
1830
JOB_STATUS_CANCELED = "canceled"
1831
JOB_STATUS_SUCCESS = "success"
1832
JOB_STATUS_ERROR = "error"
1833
JOBS_PENDING = compat.UniqueFrozenset([
1834
  JOB_STATUS_QUEUED,
1835
  JOB_STATUS_WAITING,
1836
  JOB_STATUS_CANCELING,
1837
  ])
1838
JOBS_FINALIZED = compat.UniqueFrozenset([
1839
  JOB_STATUS_CANCELED,
1840
  JOB_STATUS_SUCCESS,
1841
  JOB_STATUS_ERROR,
1842
  ])
1843
JOB_STATUS_ALL = compat.UniqueFrozenset([
1844
  JOB_STATUS_RUNNING,
1845
  ]) | JOBS_PENDING | JOBS_FINALIZED
1846

    
1847
# OpCode status
1848
# not yet finalized
1849
OP_STATUS_QUEUED = "queued"
1850
OP_STATUS_WAITING = "waiting"
1851
OP_STATUS_CANCELING = "canceling"
1852
OP_STATUS_RUNNING = "running"
1853
# finalized
1854
OP_STATUS_CANCELED = "canceled"
1855
OP_STATUS_SUCCESS = "success"
1856
OP_STATUS_ERROR = "error"
1857
OPS_FINALIZED = compat.UniqueFrozenset([
1858
  OP_STATUS_CANCELED,
1859
  OP_STATUS_SUCCESS,
1860
  OP_STATUS_ERROR,
1861
  ])
1862

    
1863
# OpCode priority
1864
OP_PRIO_LOWEST = +19
1865
OP_PRIO_HIGHEST = -20
1866

    
1867
OP_PRIO_LOW = +10
1868
OP_PRIO_NORMAL = 0
1869
OP_PRIO_HIGH = -10
1870

    
1871
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1872
  OP_PRIO_LOW,
1873
  OP_PRIO_NORMAL,
1874
  OP_PRIO_HIGH,
1875
  ])
1876

    
1877
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1878

    
1879
# Lock recalculate mode
1880
LOCKS_REPLACE = "replace"
1881
LOCKS_APPEND = "append"
1882

    
1883
# Lock timeout (sum) before we should go into blocking acquire (still
1884
# can be reset by priority change); computed as max time (10 hours)
1885
# before we should actually go into blocking acquire given that we
1886
# start from default priority level; in seconds
1887
# TODO
1888
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1889
LOCK_ATTEMPTS_MAXWAIT = 15.0
1890
LOCK_ATTEMPTS_MINWAIT = 1.0
1891

    
1892
# Execution log types
1893
ELOG_MESSAGE = "message"
1894
ELOG_REMOTE_IMPORT = "remote-import"
1895
ELOG_JQUEUE_TEST = "jqueue-test"
1896

    
1897
# /etc/hosts modification
1898
ETC_HOSTS_ADD = "add"
1899
ETC_HOSTS_REMOVE = "remove"
1900

    
1901
# Job queue test
1902
JQT_MSGPREFIX = "TESTMSG="
1903
JQT_EXPANDNAMES = "expandnames"
1904
JQT_EXEC = "exec"
1905
JQT_LOGMSG = "logmsg"
1906
JQT_STARTMSG = "startmsg"
1907
JQT_ALL = compat.UniqueFrozenset([
1908
  JQT_EXPANDNAMES,
1909
  JQT_EXEC,
1910
  JQT_LOGMSG,
1911
  JQT_STARTMSG,
1912
  ])
1913

    
1914
# Query resources
1915
QR_CLUSTER = "cluster"
1916
QR_INSTANCE = "instance"
1917
QR_NODE = "node"
1918
QR_LOCK = "lock"
1919
QR_GROUP = "group"
1920
QR_OS = "os"
1921
QR_JOB = "job"
1922
QR_EXPORT = "export"
1923
QR_NETWORK = "network"
1924
QR_EXTSTORAGE = "extstorage"
1925

    
1926
#: List of resources which can be queried using L{opcodes.OpQuery}
1927
QR_VIA_OP = compat.UniqueFrozenset([
1928
  QR_CLUSTER,
1929
  QR_INSTANCE,
1930
  QR_NODE,
1931
  QR_GROUP,
1932
  QR_OS,
1933
  QR_EXPORT,
1934
  QR_NETWORK,
1935
  QR_EXTSTORAGE,
1936
  ])
1937

    
1938
#: List of resources which can be queried using Local UniX Interface
1939
QR_VIA_LUXI = QR_VIA_OP.union([
1940
  QR_LOCK,
1941
  QR_JOB,
1942
  ])
1943

    
1944
#: List of resources which can be queried using RAPI
1945
QR_VIA_RAPI = QR_VIA_LUXI
1946

    
1947
# Query field types
1948
QFT_UNKNOWN = "unknown"
1949
QFT_TEXT = "text"
1950
QFT_BOOL = "bool"
1951
QFT_NUMBER = "number"
1952
QFT_UNIT = "unit"
1953
QFT_TIMESTAMP = "timestamp"
1954
QFT_OTHER = "other"
1955

    
1956
#: All query field types
1957
QFT_ALL = compat.UniqueFrozenset([
1958
  QFT_UNKNOWN,
1959
  QFT_TEXT,
1960
  QFT_BOOL,
1961
  QFT_NUMBER,
1962
  QFT_UNIT,
1963
  QFT_TIMESTAMP,
1964
  QFT_OTHER,
1965
  ])
1966

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

    
1982
RS_ALL = compat.UniqueFrozenset([
1983
  RS_NORMAL,
1984
  RS_UNKNOWN,
1985
  RS_NODATA,
1986
  RS_UNAVAIL,
1987
  RS_OFFLINE,
1988
  ])
1989

    
1990
#: Dictionary with special field cases and their verbose/terse formatting
1991
RSS_DESCRIPTION = {
1992
  RS_UNKNOWN: ("(unknown)", "??"),
1993
  RS_NODATA: ("(nodata)", "?"),
1994
  RS_OFFLINE: ("(offline)", "*"),
1995
  RS_UNAVAIL: ("(unavail)", "-"),
1996
  }
1997

    
1998
# max dynamic devices
1999
MAX_NICS = 8
2000
MAX_DISKS = 16
2001

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

    
2029
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2030
SS_HVPARAMS_PREF = "hvparams_"
2031

    
2032
# Hvparams keys:
2033
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2034
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2035
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2036
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2037
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2038
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2039

    
2040
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2041
  SS_HVPARAMS_XEN_PVM,
2042
  SS_HVPARAMS_XEN_FAKE,
2043
  SS_HVPARAMS_XEN_HVM,
2044
  SS_HVPARAMS_XEN_KVM,
2045
  SS_HVPARAMS_XEN_CHROOT,
2046
  SS_HVPARAMS_XEN_LXC,
2047
  ])
2048

    
2049
SS_FILE_PERMS = 0444
2050

    
2051
# cluster wide default parameters
2052
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2053

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

    
2168
HVC_GLOBALS = compat.UniqueFrozenset([
2169
  HV_MIGRATION_PORT,
2170
  HV_MIGRATION_BANDWIDTH,
2171
  HV_MIGRATION_MODE,
2172
  HV_XEN_CMD,
2173
  ])
2174

    
2175
BEC_DEFAULTS = {
2176
  BE_MINMEM: 128,
2177
  BE_MAXMEM: 128,
2178
  BE_VCPUS: 1,
2179
  BE_AUTO_BALANCE: True,
2180
  BE_ALWAYS_FAILOVER: False,
2181
  BE_SPINDLE_USE: 1,
2182
  }
2183

    
2184
NDC_DEFAULTS = {
2185
  ND_OOB_PROGRAM: "",
2186
  ND_SPINDLE_COUNT: 1,
2187
  ND_EXCLUSIVE_STORAGE: False,
2188
  ND_OVS: False,
2189
  ND_OVS_NAME: DEFAULT_OVS,
2190
  ND_OVS_LINK: ""
2191
  }
2192

    
2193
NDC_GLOBALS = compat.UniqueFrozenset([
2194
  ND_EXCLUSIVE_STORAGE,
2195
  ])
2196

    
2197
DISK_LD_DEFAULTS = {
2198
  DT_DRBD8: {
2199
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2200
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2201
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2202
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2203
    LDP_DISK_CUSTOM: "",
2204
    LDP_NET_CUSTOM: "",
2205
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2206
    LDP_DYNAMIC_RESYNC: False,
2207

    
2208
    # The default values for the DRBD dynamic resync speed algorithm
2209
    # are taken from the drbsetup 8.3.11 man page, except for
2210
    # c-plan-ahead (that we don't need to set to 0, because we have a
2211
    # separate option to enable it) and for c-max-rate, that we cap to
2212
    # the default value for the static resync rate.
2213
    LDP_PLAN_AHEAD: 20, # ds
2214
    LDP_FILL_TARGET: 0, # sectors
2215
    LDP_DELAY_TARGET: 1, # ds
2216
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2217
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2218
    },
2219
  DT_PLAIN: {
2220
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2221
    },
2222
  DT_FILE: {},
2223
  DT_SHARED_FILE: {},
2224
  DT_BLOCK: {},
2225
  DT_RBD: {
2226
    LDP_POOL: "rbd"
2227
    },
2228
  DT_EXT: {},
2229
  }
2230

    
2231
# readability shortcuts
2232
_LV_DEFAULTS = DISK_LD_DEFAULTS[DT_PLAIN]
2233
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[DT_DRBD8]
2234

    
2235
DISK_DT_DEFAULTS = {
2236
  DT_PLAIN: {
2237
    LV_STRIPES: DISK_LD_DEFAULTS[DT_PLAIN][LDP_STRIPES],
2238
    },
2239
  DT_DRBD8: {
2240
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2241
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2242
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2243
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2244
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2245
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2246
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2247
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2248
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2249
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2250
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2251
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2252
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2253
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2254
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2255
    },
2256
  DT_DISKLESS: {},
2257
  DT_FILE: {},
2258
  DT_SHARED_FILE: {},
2259
  DT_BLOCK: {},
2260
  DT_RBD: {
2261
    RBD_POOL: DISK_LD_DEFAULTS[DT_RBD][LDP_POOL]
2262
    },
2263
  DT_EXT: {},
2264
  }
2265

    
2266
# we don't want to export the shortcuts
2267
del _LV_DEFAULTS, _DRBD_DEFAULTS
2268

    
2269
NICC_DEFAULTS = {
2270
  NIC_MODE: NIC_MODE_BRIDGED,
2271
  NIC_LINK: DEFAULT_BRIDGE,
2272
  NIC_VLAN: VALUE_HS_NOTHING,
2273
  }
2274

    
2275
# All of the following values are quite arbitrarily - there are no
2276
# "good" defaults, these must be customised per-site
2277
ISPECS_MINMAX_DEFAULTS = {
2278
  ISPECS_MIN: {
2279
    ISPEC_MEM_SIZE: 128,
2280
    ISPEC_CPU_COUNT: 1,
2281
    ISPEC_DISK_COUNT: 1,
2282
    ISPEC_DISK_SIZE: 1024,
2283
    ISPEC_NIC_COUNT: 1,
2284
    ISPEC_SPINDLE_USE: 1,
2285
    },
2286
  ISPECS_MAX: {
2287
    ISPEC_MEM_SIZE: 32768,
2288
    ISPEC_CPU_COUNT: 8,
2289
    ISPEC_DISK_COUNT: MAX_DISKS,
2290
    ISPEC_DISK_SIZE: 1024 * 1024,
2291
    ISPEC_NIC_COUNT: MAX_NICS,
2292
    ISPEC_SPINDLE_USE: 12,
2293
    },
2294
  }
2295
IPOLICY_DEFAULTS = {
2296
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2297
  ISPECS_STD: {
2298
    ISPEC_MEM_SIZE: 128,
2299
    ISPEC_CPU_COUNT: 1,
2300
    ISPEC_DISK_COUNT: 1,
2301
    ISPEC_DISK_SIZE: 1024,
2302
    ISPEC_NIC_COUNT: 1,
2303
    ISPEC_SPINDLE_USE: 1,
2304
    },
2305
  IPOLICY_DTS: list(DISK_TEMPLATES),
2306
  IPOLICY_VCPU_RATIO: 4.0,
2307
  IPOLICY_SPINDLE_RATIO: 32.0,
2308
  }
2309

    
2310
MASTER_POOL_SIZE_DEFAULT = 10
2311

    
2312
# Exclusive storage:
2313
# Error margin used to compare physical disks
2314
PART_MARGIN = .01
2315
# Space reserved when creating instance disks
2316
PART_RESERVED = .02
2317

    
2318
CONFD_PROTOCOL_VERSION = 1
2319

    
2320
CONFD_REQ_PING = 0
2321
CONFD_REQ_NODE_ROLE_BYNAME = 1
2322
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2323
CONFD_REQ_CLUSTER_MASTER = 3
2324
CONFD_REQ_NODE_PIP_LIST = 4
2325
CONFD_REQ_MC_PIP_LIST = 5
2326
CONFD_REQ_INSTANCES_IPS_LIST = 6
2327
CONFD_REQ_NODE_DRBD = 7
2328
CONFD_REQ_NODE_INSTANCES = 8
2329

    
2330
# Confd request query fields. These are used to narrow down queries.
2331
# These must be strings rather than integers, because json-encoding
2332
# converts them to strings anyway, as they're used as dict-keys.
2333
CONFD_REQQ_LINK = "0"
2334
CONFD_REQQ_IP = "1"
2335
CONFD_REQQ_IPLIST = "2"
2336
CONFD_REQQ_FIELDS = "3"
2337

    
2338
CONFD_REQFIELD_NAME = "0"
2339
CONFD_REQFIELD_IP = "1"
2340
CONFD_REQFIELD_MNODE_PIP = "2"
2341

    
2342
CONFD_REQS = compat.UniqueFrozenset([
2343
  CONFD_REQ_PING,
2344
  CONFD_REQ_NODE_ROLE_BYNAME,
2345
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2346
  CONFD_REQ_CLUSTER_MASTER,
2347
  CONFD_REQ_NODE_PIP_LIST,
2348
  CONFD_REQ_MC_PIP_LIST,
2349
  CONFD_REQ_INSTANCES_IPS_LIST,
2350
  CONFD_REQ_NODE_DRBD,
2351
  ])
2352

    
2353
CONFD_REPL_STATUS_OK = 0
2354
CONFD_REPL_STATUS_ERROR = 1
2355
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2356

    
2357
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2358
  CONFD_REPL_STATUS_OK,
2359
  CONFD_REPL_STATUS_ERROR,
2360
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2361
  ])
2362

    
2363
(CONFD_NODE_ROLE_MASTER,
2364
 CONFD_NODE_ROLE_CANDIDATE,
2365
 CONFD_NODE_ROLE_OFFLINE,
2366
 CONFD_NODE_ROLE_DRAINED,
2367
 CONFD_NODE_ROLE_REGULAR,
2368
 ) = range(5)
2369

    
2370
# A few common errors for confd
2371
CONFD_ERROR_UNKNOWN_ENTRY = 1
2372
CONFD_ERROR_INTERNAL = 2
2373
CONFD_ERROR_ARGUMENT = 3
2374

    
2375
# Each request is "salted" by the current timestamp.
2376
# This constants decides how many seconds of skew to accept.
2377
# TODO: make this a default and allow the value to be more configurable
2378
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2379

    
2380
# When we haven't reloaded the config for more than this amount of
2381
# seconds, we force a test to see if inotify is betraying us. Using a
2382
# prime number to ensure we get less chance of 'same wakeup' with
2383
# other processes.
2384
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2385

    
2386
# If we receive more than one update in this amount of microseconds,
2387
# we move to polling every RATELIMIT seconds, rather than relying on
2388
# inotify, to be able to serve more requests.
2389
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2390

    
2391
# Magic number prepended to all confd queries.
2392
# This allows us to distinguish different types of confd protocols and handle
2393
# them. For example by changing this we can move the whole payload to be
2394
# compressed, or move away from json.
2395
CONFD_MAGIC_FOURCC = "plj0"
2396

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

    
2402
# Timeout in seconds to expire pending query request in the confd client
2403
# library. We don't actually expect any answer more than 10 seconds after we
2404
# sent a request.
2405
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2406

    
2407
# Maximum UDP datagram size.
2408
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2409
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2410
#   (assuming we can't use jumbo frames)
2411
# We just set this to 60K, which should be enough
2412
MAX_UDP_DATA_SIZE = 61440
2413

    
2414
# User-id pool minimum/maximum acceptable user-ids.
2415
UIDPOOL_UID_MIN = 0
2416
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2417

    
2418
# Name or path of the pgrep command
2419
PGREP = "pgrep"
2420

    
2421
# Name of the node group that gets created at cluster init or upgrade
2422
INITIAL_NODE_GROUP_NAME = "default"
2423

    
2424
# Possible values for NodeGroup.alloc_policy
2425
ALLOC_POLICY_PREFERRED = _constants.ALLOC_POLICY_PREFERRED
2426
ALLOC_POLICY_LAST_RESORT = _constants.ALLOC_POLICY_LAST_RESORT
2427
ALLOC_POLICY_UNALLOCABLE = _constants.ALLOC_POLICY_UNALLOCABLE
2428
VALID_ALLOC_POLICIES = _constants.VALID_ALLOC_POLICIES
2429

    
2430
# Temporary external/shared storage parameters
2431
BLOCKDEV_DRIVER_MANUAL = _constants.BLOCKDEV_DRIVER_MANUAL
2432

    
2433
# qemu-img path, required for ovfconverter
2434
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2435

    
2436
# Whether htools was enabled at compilation time
2437
HTOOLS = _autoconf.HTOOLS
2438
# The hail iallocator
2439
IALLOC_HAIL = "hail"
2440

    
2441
# Fake opcodes for functions that have hooks attached to them via
2442
# backend.RunLocalHooks
2443
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2444
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2445

    
2446
# SSH key types
2447
SSHK_RSA = "rsa"
2448
SSHK_DSA = "dsa"
2449
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2450

    
2451
# SSH authorized key types
2452
SSHAK_RSA = "ssh-rsa"
2453
SSHAK_DSS = "ssh-dss"
2454
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2455

    
2456
# SSH setup
2457
SSHS_CLUSTER_NAME = "cluster_name"
2458
SSHS_SSH_HOST_KEY = "ssh_host_key"
2459
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2460
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2461

    
2462
#: Key files for SSH daemon
2463
SSH_DAEMON_KEYFILES = {
2464
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2465
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2466
  }
2467

    
2468
# Node daemon setup
2469
NDS_CLUSTER_NAME = "cluster_name"
2470
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2471
NDS_SSCONF = "ssconf"
2472
NDS_START_NODE_DAEMON = "start_node_daemon"
2473

    
2474
# Path generating random UUID
2475
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2476

    
2477
# Regex string for verifying a UUID
2478
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2479

    
2480
# Auto-repair tag prefixes
2481
AUTO_REPAIR_TAG_PREFIX = _constants.AUTO_REPAIR_TAG_PREFIX
2482
AUTO_REPAIR_TAG_ENABLED = _constants.AUTO_REPAIR_TAG_ENABLED
2483
AUTO_REPAIR_TAG_SUSPENDED = _constants.AUTO_REPAIR_TAG_SUSPENDED
2484
AUTO_REPAIR_TAG_PENDING = _constants.AUTO_REPAIR_TAG_PENDING
2485
AUTO_REPAIR_TAG_RESULT = _constants.AUTO_REPAIR_TAG_RESULT
2486

    
2487
# Auto-repair levels
2488
AUTO_REPAIR_FIX_STORAGE = _constants.AUTO_REPAIR_FIX_STORAGE
2489
AUTO_REPAIR_MIGRATE = _constants.AUTO_REPAIR_MIGRATE
2490
AUTO_REPAIR_FAILOVER = _constants.AUTO_REPAIR_FAILOVER
2491
AUTO_REPAIR_REINSTALL = _constants.AUTO_REPAIR_REINSTALL
2492
AUTO_REPAIR_ALL_TYPES = _constants.AUTO_REPAIR_ALL_TYPES
2493

    
2494
# Auto-repair results
2495
AUTO_REPAIR_SUCCESS = _constants.AUTO_REPAIR_SUCCESS
2496
AUTO_REPAIR_FAILURE = _constants.AUTO_REPAIR_FAILURE
2497
AUTO_REPAIR_ENOPERM = _constants.AUTO_REPAIR_ENOPERM
2498
AUTO_REPAIR_ALL_RESULTS = _constants.AUTO_REPAIR_ALL_RESULTS
2499

    
2500
# The version identifier for builtin data collectors
2501
BUILTIN_DATA_COLLECTOR_VERSION = _constants.BUILTIN_DATA_COLLECTOR_VERSION
2502

    
2503
# The reason trail opcode parameter name
2504
OPCODE_REASON = "reason"
2505

    
2506
# The source reasons for the execution of an OpCode
2507
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2508
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2509
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2510
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2511
OPCODE_REASON_SRC_USER = "gnt:user"
2512

    
2513
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2514
  OPCODE_REASON_SRC_CLIENT,
2515
  OPCODE_REASON_SRC_NODED,
2516
  OPCODE_REASON_SRC_OPCODE,
2517
  OPCODE_REASON_SRC_RLIB2,
2518
  OPCODE_REASON_SRC_USER,
2519
  ])
2520

    
2521
DISKSTATS_FILE = "/proc/diskstats"
2522

    
2523
# CPU load collector variables
2524
STAT_FILE = "/proc/stat"
2525
CPUAVGLOAD_BUFFER_SIZE = 150
2526
CPUAVGLOAD_WINDOW_SIZE = 600
2527

    
2528
# Mond's variable for periodical data collection
2529
MOND_TIME_INTERVAL = 5
2530

    
2531
# Do not re-export imported modules
2532
del re, _vcsversion, _autoconf, _constants, socket, pathutils, compat
2533

    
2534

    
2535
ALLOCATABLE_KEY = "allocatable"
2536
FAILED_KEY = "failed"