Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 355d1f32

History | View | Annotate | Download (66.4 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 = {
178
  NODED: "node-daemon",
179
  CONFD: "conf-daemon",
180
  LUXID: "luxi-daemon",
181
  RAPI: "rapi-daemon",
182
  MASTERD: "master-daemon",
183
  MOND: "monitoring-daemon",
184
  }
185

    
186
DAEMONS_LOGFILES = \
187
    dict((daemon, pathutils.GetLogFilename(DAEMONS_LOGBASE[daemon]))
188
         for daemon in DAEMONS_LOGBASE)
189

    
190
# Some daemons might require more than one logfile.
191
# Specifically, right now only the Haskell http library "snap", used by the
192
# monitoring daemon, requires multiple log files.
193

    
194
# These are the only valid reasons for having an extra logfile
195
EXTRA_LOGREASON_ACCESS = "access"
196
EXTRA_LOGREASON_ERROR = "error"
197

    
198
VALID_EXTRA_LOGREASONS = compat.UniqueFrozenset([
199
  EXTRA_LOGREASON_ACCESS,
200
  EXTRA_LOGREASON_ERROR,
201
  ])
202

    
203
# These are the extra logfiles, grouped by daemon
204
DAEMONS_EXTRA_LOGBASE = {
205
  MOND: {
206
    EXTRA_LOGREASON_ACCESS: "monitoring-daemon-access",
207
    EXTRA_LOGREASON_ERROR: "monitoring-daemon-error",
208
    }
209
  }
210

    
211
DAEMONS_EXTRA_LOGFILES = \
212
  dict((daemon, dict((extra,
213
       pathutils.GetLogFilename(DAEMONS_EXTRA_LOGBASE[daemon][extra]))
214
       for extra in DAEMONS_EXTRA_LOGBASE[daemon]))
215
         for daemon in DAEMONS_EXTRA_LOGBASE)
216

    
217
DEV_CONSOLE = "/dev/console"
218

    
219
PROC_MOUNTS = "/proc/mounts"
220

    
221
# Local UniX Interface related constants
222
LUXI_EOM = "\3"
223
LUXI_VERSION = CONFIG_VERSION
224
#: Environment variable for the luxi override socket
225
LUXI_OVERRIDE = "FORCE_LUXI_SOCKET"
226
LUXI_OVERRIDE_MASTER = "master"
227
LUXI_OVERRIDE_QUERY = "query"
228

    
229
# one of "no", "yes", "only"
230
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
231
SYSLOG_NO = "no"
232
SYSLOG_YES = "yes"
233
SYSLOG_ONLY = "only"
234
SYSLOG_SOCKET = "/dev/log"
235

    
236
EXPORT_CONF_FILE = "config.ini"
237

    
238
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
239
XEN_KERNEL = _autoconf.XEN_KERNEL
240
XEN_INITRD = _autoconf.XEN_INITRD
241
XEN_CMD_XM = "xm"
242
XEN_CMD_XL = "xl"
243

    
244
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
245
  XEN_CMD_XM,
246
  XEN_CMD_XL,
247
  ])
248

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

    
260
KVM_PATH = _autoconf.KVM_PATH
261
KVM_KERNEL = _autoconf.KVM_KERNEL
262
SOCAT_PATH = _autoconf.SOCAT_PATH
263
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
264
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
265
SOCAT_ESCAPE_CODE = "0x1d"
266

    
267
#: Console as SSH command
268
CONS_SSH = "ssh"
269

    
270
#: Console as VNC server
271
CONS_VNC = "vnc"
272

    
273
#: Console as SPICE server
274
CONS_SPICE = "spice"
275

    
276
#: Display a message for console access
277
CONS_MESSAGE = "msg"
278

    
279
#: All console types
280
CONS_ALL = compat.UniqueFrozenset([
281
  CONS_SSH,
282
  CONS_VNC,
283
  CONS_SPICE,
284
  CONS_MESSAGE,
285
  ])
286

    
287
# For RSA keys more bits are better, but they also make operations more
288
# expensive. NIST SP 800-131 recommends a minimum of 2048 bits from the year
289
# 2010 on.
290
RSA_KEY_BITS = 2048
291

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

    
300
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
301
X509_CERT_SIGN_DIGEST = "SHA1"
302

    
303
# Default validity of certificates in days
304
X509_CERT_DEFAULT_VALIDITY = 365 * 5
305

    
306
# commonName (CN) used in certificates
307
X509_CERT_CN = "ganeti.example.com"
308

    
309
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
310

    
311
# Import/export daemon mode
312
IEM_IMPORT = "import"
313
IEM_EXPORT = "export"
314

    
315
# Import/export transport compression
316
IEC_NONE = "none"
317
IEC_GZIP = "gzip"
318
IEC_ALL = compat.UniqueFrozenset([
319
  IEC_NONE,
320
  IEC_GZIP,
321
  ])
322

    
323
IE_CUSTOM_SIZE = "fd"
324

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

    
327
# Import/export I/O
328
# Direct file I/O, equivalent to a shell's I/O redirection using '<' or '>'
329
IEIO_FILE = "file"
330
# Raw block device I/O using "dd"
331
IEIO_RAW_DISK = "raw"
332
# OS definition import/export script
333
IEIO_SCRIPT = "script"
334

    
335
VALUE_DEFAULT = "default"
336
VALUE_AUTO = "auto"
337
VALUE_GENERATE = "generate"
338
VALUE_NONE = "none"
339
VALUE_TRUE = "true"
340
VALUE_FALSE = "false"
341
VALUE_HS_NOTHING = {"Nothing": None}
342

    
343

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

    
347
# hooks-related constants
348
HOOKS_PHASE_PRE = "pre"
349
HOOKS_PHASE_POST = "post"
350
HOOKS_NAME_CFGUPDATE = "config-update"
351
HOOKS_NAME_WATCHER = "watcher"
352
HOOKS_VERSION = 2
353
HOOKS_PATH = "/sbin:/bin:/usr/sbin:/usr/bin"
354

    
355
# hooks subject type (what object type does the LU deal with)
356
HTYPE_CLUSTER = "CLUSTER"
357
HTYPE_NODE = "NODE"
358
HTYPE_GROUP = "GROUP"
359
HTYPE_INSTANCE = "INSTANCE"
360
HTYPE_NETWORK = "NETWORK"
361

    
362
HKR_SKIP = 0
363
HKR_FAIL = 1
364
HKR_SUCCESS = 2
365

    
366
# Storage types
367
ST_BLOCK = "blockdev"
368
ST_DISKLESS = "diskless"
369
ST_EXT = "ext"
370
ST_FILE = "file"
371
ST_LVM_PV = "lvm-pv"
372
ST_LVM_VG = "lvm-vg"
373
ST_RADOS = "rados"
374

    
375
STORAGE_TYPES = compat.UniqueFrozenset([
376
  ST_BLOCK,
377
  ST_DISKLESS,
378
  ST_EXT,
379
  ST_FILE,
380
  ST_LVM_PV,
381
  ST_LVM_VG,
382
  ST_RADOS,
383
  ])
384

    
385
# the set of storage types for which storage reporting is available
386
# FIXME: Remove this, once storage reporting is available for all types.
387
STS_REPORT = compat.UniqueFrozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
388

    
389
# Storage fields
390
# first two are valid in LU context only, not passed to backend
391
SF_NODE = "node"
392
SF_TYPE = "type"
393
# and the rest are valid in backend
394
SF_NAME = "name"
395
SF_SIZE = "size"
396
SF_FREE = "free"
397
SF_USED = "used"
398
SF_ALLOCATABLE = "allocatable"
399

    
400
# Storage operations
401
SO_FIX_CONSISTENCY = "fix-consistency"
402

    
403
# Available fields per storage type
404
VALID_STORAGE_FIELDS = compat.UniqueFrozenset([
405
  SF_NODE,
406
  SF_NAME,
407
  SF_TYPE,
408
  SF_SIZE,
409
  SF_USED,
410
  SF_FREE,
411
  SF_ALLOCATABLE,
412
  ])
413

    
414
MODIFIABLE_STORAGE_FIELDS = {
415
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
416
  }
417

    
418
VALID_STORAGE_OPERATIONS = {
419
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
420
  }
421

    
422
# Volume fields
423
VF_DEV = "dev"
424
VF_INSTANCE = "instance"
425
VF_NAME = "name"
426
VF_NODE = "node"
427
VF_PHYS = "phys"
428
VF_SIZE = "size"
429
VF_VG = "vg"
430

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

    
437
LDS_NAMES = {
438
  LDS_OKAY: "ok",
439
  LDS_UNKNOWN: "unknown",
440
  LDS_FAULTY: "faulty",
441
}
442

    
443
# disk template types
444
DT_BLOCK = "blockdev"
445
DT_DISKLESS = "diskless"
446
DT_DRBD8 = "drbd"
447
DT_EXT = "ext"
448
DT_FILE = "file"
449
DT_PLAIN = "plain"
450
DT_RBD = "rbd"
451
DT_SHARED_FILE = "sharedfile"
452

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

    
468
DISK_TEMPLATES = compat.UniqueFrozenset([
469
  DT_DISKLESS,
470
  DT_PLAIN,
471
  DT_DRBD8,
472
  DT_FILE,
473
  DT_SHARED_FILE,
474
  DT_BLOCK,
475
  DT_RBD,
476
  DT_EXT
477
  ])
478

    
479
# disk templates that are enabled by default
480
DEFAULT_ENABLED_DISK_TEMPLATES = [
481
  DT_DRBD8,
482
  DT_PLAIN,
483
  ]
484

    
485
# mapping of disk templates to storage types
486
MAP_DISK_TEMPLATE_STORAGE_TYPE = {
487
  DT_BLOCK: ST_BLOCK,
488
  DT_DISKLESS: ST_DISKLESS,
489
  DT_DRBD8: ST_LVM_VG,
490
  DT_EXT: ST_EXT,
491
  DT_FILE: ST_FILE,
492
  DT_PLAIN: ST_LVM_VG,
493
  DT_RBD: ST_RADOS,
494
  DT_SHARED_FILE: ST_FILE,
495
  }
496

    
497
# the set of network-mirrored disk templates
498
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
499

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

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

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

    
529
# the set of disk templates that allow adoption
530
DTS_MAY_ADOPT = compat.UniqueFrozenset([
531
  DT_PLAIN,
532
  DT_BLOCK,
533
  ])
534

    
535
# the set of disk templates that *must* use adoption
536
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
537

    
538
# the set of disk templates that allow migrations
539
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
540

    
541
# the set of file based disk templates
542
DTS_FILEBASED = compat.UniqueFrozenset([
543
  DT_FILE,
544
  DT_SHARED_FILE,
545
  ])
546

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

    
555
# the set of disk templates that are supported by exclusive_storage
556
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
557

    
558
# templates for which we don't perform checks on free space
559
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
560
  DT_FILE,
561
  DT_SHARED_FILE,
562
  DT_RBD,
563
  DT_EXT,
564
  ])
565

    
566
DTS_BLOCK = compat.UniqueFrozenset([
567
  DT_PLAIN,
568
  DT_DRBD8,
569
  DT_BLOCK,
570
  DT_RBD,
571
  DT_EXT,
572
  ])
573

    
574
# drbd constants
575
DRBD_HMAC_ALG = "md5"
576
DRBD_DEFAULT_NET_PROTOCOL = "C"
577
DRBD_MIGRATION_NET_PROTOCOL = "C"
578
DRBD_STATUS_FILE = "/proc/drbd"
579

    
580
#: Size of DRBD meta block device
581
DRBD_META_SIZE = 128
582

    
583
# drbd barrier types
584
DRBD_B_NONE = "n"
585
DRBD_B_DISK_BARRIERS = "b"
586
DRBD_B_DISK_DRAIN = "d"
587
DRBD_B_DISK_FLUSH = "f"
588

    
589
# Valid barrier combinations: "n" or any non-null subset of "bfd"
590
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
591
  frozenset([DRBD_B_NONE]),
592
  frozenset([DRBD_B_DISK_BARRIERS]),
593
  frozenset([DRBD_B_DISK_DRAIN]),
594
  frozenset([DRBD_B_DISK_FLUSH]),
595
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
596
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
597
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
598
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
599
  ])
600

    
601
# rbd tool command
602
RBD_CMD = "rbd"
603

    
604
# file backend driver
605
FD_LOOP = "loop"
606
FD_BLKTAP = "blktap"
607

    
608
# the set of drbd-like disk types
609
LDS_DRBD = compat.UniqueFrozenset([DT_DRBD8])
610

    
611
# disk access mode
612
DISK_RDONLY = "ro"
613
DISK_RDWR = "rw"
614
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
615

    
616
# disk replacement mode
617
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
618
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
619
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
620
REPLACE_DISK_AUTO = "replace_auto"
621
REPLACE_MODES = compat.UniqueFrozenset([
622
  REPLACE_DISK_PRI,
623
  REPLACE_DISK_SEC,
624
  REPLACE_DISK_CHG,
625
  REPLACE_DISK_AUTO,
626
  ])
627

    
628
# Instance export mode
629
EXPORT_MODE_LOCAL = "local"
630
EXPORT_MODE_REMOTE = "remote"
631
EXPORT_MODES = compat.UniqueFrozenset([
632
  EXPORT_MODE_LOCAL,
633
  EXPORT_MODE_REMOTE,
634
  ])
635

    
636
# instance creation modes
637
INSTANCE_CREATE = "create"
638
INSTANCE_IMPORT = "import"
639
INSTANCE_REMOTE_IMPORT = "remote-import"
640
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
641
  INSTANCE_CREATE,
642
  INSTANCE_IMPORT,
643
  INSTANCE_REMOTE_IMPORT,
644
  ])
645

    
646
# Remote import/export handshake message and version
647
RIE_VERSION = 0
648
RIE_HANDSHAKE = "Hi, I'm Ganeti"
649

    
650
# Remote import/export certificate validity in seconds
651
RIE_CERT_VALIDITY = 24 * 60 * 60
652

    
653
# Overall timeout for establishing connection
654
RIE_CONNECT_TIMEOUT = 180
655

    
656
# Export only: how long to wait per connection attempt (seconds)
657
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
658

    
659
# Export only: number of attempts to connect
660
RIE_CONNECT_RETRIES = 10
661

    
662
#: Give child process up to 5 seconds to exit after sending a signal
663
CHILD_LINGER_TIMEOUT = 5.0
664

    
665
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
666

    
667
# import/export config options
668
INISECT_EXP = "export"
669
INISECT_INS = "instance"
670
INISECT_HYP = "hypervisor"
671
INISECT_BEP = "backend"
672
INISECT_OSP = "os"
673

    
674
# dynamic device modification
675
DDM_ADD = "add"
676
DDM_MODIFY = "modify"
677
DDM_REMOVE = "remove"
678
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
679
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
680
  DDM_MODIFY,
681
  ]))
682
# TODO: DDM_SWAP, DDM_MOVE?
683

    
684
# common exit codes
685
EXIT_SUCCESS = 0
686
EXIT_FAILURE = 1
687
EXIT_NOTCLUSTER = 5
688
EXIT_NOTMASTER = 11
689
EXIT_NODESETUP_ERROR = 12
690
EXIT_CONFIRMATION = 13 # need user confirmation
691

    
692
#: Exit code for query operations with unknown fields
693
EXIT_UNKNOWN_FIELD = 14
694

    
695
# tags
696
TAG_CLUSTER = "cluster"
697
TAG_NODEGROUP = "nodegroup"
698
TAG_NODE = "node"
699
TAG_INSTANCE = "instance"
700
TAG_NETWORK = "network"
701
VALID_TAG_TYPES = compat.UniqueFrozenset([
702
  TAG_CLUSTER,
703
  TAG_NODEGROUP,
704
  TAG_NODE,
705
  TAG_INSTANCE,
706
  TAG_NETWORK,
707
  ])
708
MAX_TAG_LEN = 128
709
MAX_TAGS_PER_OBJ = 4096
710

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

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

    
740
#: Key for job IDs in opcode result
741
JOB_IDS_KEY = "jobs"
742

    
743
# runparts results
744
(RUNPARTS_SKIP,
745
 RUNPARTS_RUN,
746
 RUNPARTS_ERR) = range(3)
747

    
748
RUNPARTS_STATUS = compat.UniqueFrozenset([
749
  RUNPARTS_SKIP,
750
  RUNPARTS_RUN,
751
  RUNPARTS_ERR,
752
  ])
753

    
754
# RPC constants
755
(RPC_ENCODING_NONE,
756
 RPC_ENCODING_ZLIB_BASE64) = range(2)
757

    
758
# Various time constants for the timeout table
759
RPC_TMO_URGENT = 60 # one minute
760
RPC_TMO_FAST = 5 * 60 # five minutes
761
RPC_TMO_NORMAL = 15 * 60 # 15 minutes
762
RPC_TMO_SLOW = 3600 # one hour
763
RPC_TMO_4HRS = 4 * 3600
764
RPC_TMO_1DAY = 86400
765

    
766
# Timeout for connecting to nodes (seconds)
767
RPC_CONNECT_TIMEOUT = 5
768

    
769
# os related constants
770
OS_SCRIPT_CREATE = "create"
771
OS_SCRIPT_IMPORT = "import"
772
OS_SCRIPT_EXPORT = "export"
773
OS_SCRIPT_RENAME = "rename"
774
OS_SCRIPT_VERIFY = "verify"
775
OS_SCRIPTS = compat.UniqueFrozenset([
776
  OS_SCRIPT_CREATE,
777
  OS_SCRIPT_IMPORT,
778
  OS_SCRIPT_EXPORT,
779
  OS_SCRIPT_RENAME,
780
  OS_SCRIPT_VERIFY,
781
  ])
782

    
783
OS_API_FILE = "ganeti_api_version"
784
OS_VARIANTS_FILE = "variants.list"
785
OS_PARAMETERS_FILE = "parameters.list"
786

    
787
OS_VALIDATE_PARAMETERS = "parameters"
788
OS_VALIDATE_CALLS = compat.UniqueFrozenset([OS_VALIDATE_PARAMETERS])
789

    
790
# External Storage (ES) related constants
791
ES_ACTION_CREATE = "create"
792
ES_ACTION_REMOVE = "remove"
793
ES_ACTION_GROW = "grow"
794
ES_ACTION_ATTACH = "attach"
795
ES_ACTION_DETACH = "detach"
796
ES_ACTION_SETINFO = "setinfo"
797
ES_ACTION_VERIFY = "verify"
798

    
799
ES_SCRIPT_CREATE = ES_ACTION_CREATE
800
ES_SCRIPT_REMOVE = ES_ACTION_REMOVE
801
ES_SCRIPT_GROW = ES_ACTION_GROW
802
ES_SCRIPT_ATTACH = ES_ACTION_ATTACH
803
ES_SCRIPT_DETACH = ES_ACTION_DETACH
804
ES_SCRIPT_SETINFO = ES_ACTION_SETINFO
805
ES_SCRIPT_VERIFY = ES_ACTION_VERIFY
806
ES_SCRIPTS = frozenset([
807
  ES_SCRIPT_CREATE,
808
  ES_SCRIPT_REMOVE,
809
  ES_SCRIPT_GROW,
810
  ES_SCRIPT_ATTACH,
811
  ES_SCRIPT_DETACH,
812
  ES_SCRIPT_SETINFO,
813
  ES_SCRIPT_VERIFY
814
  ])
815

    
816
ES_PARAMETERS_FILE = "parameters.list"
817

    
818
# reboot types
819
INSTANCE_REBOOT_SOFT = "soft"
820
INSTANCE_REBOOT_HARD = "hard"
821
INSTANCE_REBOOT_FULL = "full"
822

    
823
REBOOT_TYPES = compat.UniqueFrozenset([
824
  INSTANCE_REBOOT_SOFT,
825
  INSTANCE_REBOOT_HARD,
826
  INSTANCE_REBOOT_FULL,
827
  ])
828

    
829
# instance reboot behaviors
830
INSTANCE_REBOOT_ALLOWED = "reboot"
831
INSTANCE_REBOOT_EXIT = "exit"
832

    
833
REBOOT_BEHAVIORS = compat.UniqueFrozenset([
834
  INSTANCE_REBOOT_ALLOWED,
835
  INSTANCE_REBOOT_EXIT,
836
  ])
837

    
838
VTYPE_STRING = "string"
839
VTYPE_MAYBE_STRING = "maybe-string"
840
VTYPE_BOOL = "bool"
841
VTYPE_SIZE = "size" # size, in MiBs
842
VTYPE_INT = "int"
843
ENFORCEABLE_TYPES = compat.UniqueFrozenset([
844
  VTYPE_STRING,
845
  VTYPE_MAYBE_STRING,
846
  VTYPE_BOOL,
847
  VTYPE_SIZE,
848
  VTYPE_INT,
849
  ])
850

    
851
# Constant representing that the user does not specify any IP version
852
IFACE_NO_IP_VERSION_SPECIFIED = 0
853

    
854
VALID_SERIAL_SPEEDS = compat.UniqueFrozenset([
855
  75,
856
  110,
857
  300,
858
  600,
859
  1200,
860
  1800,
861
  2400,
862
  4800,
863
  9600,
864
  14400,
865
  19200,
866
  28800,
867
  38400,
868
  57600,
869
  115200,
870
  230400,
871
  345600,
872
  460800,
873
  ])
874

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

    
948

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

    
1023
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1024

    
1025
HVS_PARAMETER_TITLES = {
1026
  HV_ACPI: "ACPI",
1027
  HV_BOOT_ORDER: "Boot_order",
1028
  HV_CDROM_IMAGE_PATH: "CDROM_image_path",
1029
  HV_DISK_TYPE: "Disk_type",
1030
  HV_INITRD_PATH: "Initrd_path",
1031
  HV_KERNEL_PATH: "Kernel_path",
1032
  HV_NIC_TYPE: "NIC_type",
1033
  HV_PAE: "PAE",
1034
  HV_VNC_BIND_ADDRESS: "VNC_bind_address",
1035
  HV_PASSTHROUGH: "pci_pass",
1036
  HV_CPU_TYPE: "cpu_type",
1037
  }
1038

    
1039
# Migration statuses
1040
HV_MIGRATION_COMPLETED = "completed"
1041
HV_MIGRATION_ACTIVE = "active"
1042
HV_MIGRATION_FAILED = "failed"
1043
HV_MIGRATION_CANCELLED = "cancelled"
1044

    
1045
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1046
  HV_MIGRATION_COMPLETED,
1047
  HV_MIGRATION_ACTIVE,
1048
  HV_MIGRATION_FAILED,
1049
  HV_MIGRATION_CANCELLED,
1050
  ])
1051

    
1052
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1053
  HV_MIGRATION_FAILED,
1054
  HV_MIGRATION_CANCELLED,
1055
  ])
1056

    
1057
# KVM-specific statuses
1058
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1059

    
1060
# Node info keys
1061
HV_NODEINFO_KEY_VERSION = "hv_version"
1062

    
1063
# Hypervisor state
1064
HVST_MEMORY_TOTAL = "mem_total"
1065
HVST_MEMORY_NODE = "mem_node"
1066
HVST_MEMORY_HV = "mem_hv"
1067
HVST_CPU_TOTAL = "cpu_total"
1068
HVST_CPU_NODE = "cpu_node"
1069

    
1070
HVST_DEFAULTS = {
1071
  HVST_MEMORY_TOTAL: 0,
1072
  HVST_MEMORY_NODE: 0,
1073
  HVST_MEMORY_HV: 0,
1074
  HVST_CPU_TOTAL: 1,
1075
  HVST_CPU_NODE: 1,
1076
  }
1077

    
1078
HVSTS_PARAMETER_TYPES = {
1079
  HVST_MEMORY_TOTAL: VTYPE_INT,
1080
  HVST_MEMORY_NODE: VTYPE_INT,
1081
  HVST_MEMORY_HV: VTYPE_INT,
1082
  HVST_CPU_TOTAL: VTYPE_INT,
1083
  HVST_CPU_NODE: VTYPE_INT,
1084
  }
1085

    
1086
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1087

    
1088
# Disk state
1089
DS_DISK_TOTAL = "disk_total"
1090
DS_DISK_RESERVED = "disk_reserved"
1091
DS_DISK_OVERHEAD = "disk_overhead"
1092

    
1093
DS_DEFAULTS = {
1094
  DS_DISK_TOTAL: 0,
1095
  DS_DISK_RESERVED: 0,
1096
  DS_DISK_OVERHEAD: 0,
1097
  }
1098

    
1099
DSS_PARAMETER_TYPES = {
1100
  DS_DISK_TOTAL: VTYPE_INT,
1101
  DS_DISK_RESERVED: VTYPE_INT,
1102
  DS_DISK_OVERHEAD: VTYPE_INT,
1103
  }
1104

    
1105
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1106
DS_VALID_TYPES = compat.UniqueFrozenset([DT_PLAIN])
1107

    
1108
# Backend parameter names
1109
BE_MEMORY = "memory" # deprecated and replaced by max and min mem
1110
BE_MAXMEM = "maxmem"
1111
BE_MINMEM = "minmem"
1112
BE_VCPUS = "vcpus"
1113
BE_AUTO_BALANCE = "auto_balance"
1114
BE_ALWAYS_FAILOVER = "always_failover"
1115
BE_SPINDLE_USE = "spindle_use"
1116

    
1117
BES_PARAMETER_TYPES = {
1118
  BE_MAXMEM: VTYPE_SIZE,
1119
  BE_MINMEM: VTYPE_SIZE,
1120
  BE_VCPUS: VTYPE_INT,
1121
  BE_AUTO_BALANCE: VTYPE_BOOL,
1122
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1123
  BE_SPINDLE_USE: VTYPE_INT,
1124
  }
1125

    
1126
BES_PARAMETER_TITLES = {
1127
  BE_AUTO_BALANCE: "Auto_balance",
1128
  BE_MAXMEM: "ConfigMaxMem",
1129
  BE_MINMEM: "ConfigMinMem",
1130
  BE_VCPUS: "ConfigVCPUs",
1131
  }
1132

    
1133
BES_PARAMETER_COMPAT = {
1134
  BE_MEMORY: VTYPE_SIZE,
1135
  }
1136
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1137

    
1138
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1139

    
1140
# instance specs
1141
ISPEC_MEM_SIZE = "memory-size"
1142
ISPEC_CPU_COUNT = "cpu-count"
1143
ISPEC_DISK_COUNT = "disk-count"
1144
ISPEC_DISK_SIZE = "disk-size"
1145
ISPEC_NIC_COUNT = "nic-count"
1146
ISPEC_SPINDLE_USE = "spindle-use"
1147

    
1148
ISPECS_PARAMETER_TYPES = {
1149
  ISPEC_MEM_SIZE: VTYPE_INT,
1150
  ISPEC_CPU_COUNT: VTYPE_INT,
1151
  ISPEC_DISK_COUNT: VTYPE_INT,
1152
  ISPEC_DISK_SIZE: VTYPE_INT,
1153
  ISPEC_NIC_COUNT: VTYPE_INT,
1154
  ISPEC_SPINDLE_USE: VTYPE_INT,
1155
  }
1156

    
1157
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1158

    
1159
ISPECS_MINMAX = "minmax"
1160
ISPECS_MIN = "min"
1161
ISPECS_MAX = "max"
1162
ISPECS_STD = "std"
1163
IPOLICY_DTS = "disk-templates"
1164
IPOLICY_VCPU_RATIO = "vcpu-ratio"
1165
IPOLICY_SPINDLE_RATIO = "spindle-ratio"
1166

    
1167
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1168
  ISPECS_MIN,
1169
  ISPECS_MAX,
1170
  ])
1171

    
1172
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1173
  IPOLICY_VCPU_RATIO,
1174
  IPOLICY_SPINDLE_RATIO,
1175
  ])
1176

    
1177
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1178
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1179

    
1180
# Node parameter names
1181
ND_OOB_PROGRAM = "oob_program"
1182
ND_SPINDLE_COUNT = "spindle_count"
1183
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1184
ND_OVS = "ovs"
1185
ND_OVS_NAME = "ovs_name"
1186
ND_OVS_LINK = "ovs_link"
1187

    
1188
NDS_PARAMETER_TYPES = {
1189
  ND_OOB_PROGRAM: VTYPE_STRING,
1190
  ND_SPINDLE_COUNT: VTYPE_INT,
1191
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1192
  ND_OVS: VTYPE_BOOL,
1193
  ND_OVS_NAME: VTYPE_MAYBE_STRING,
1194
  ND_OVS_LINK: VTYPE_MAYBE_STRING,
1195
  }
1196

    
1197
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1198

    
1199
NDS_PARAMETER_TITLES = {
1200
  ND_OOB_PROGRAM: "OutOfBandProgram",
1201
  ND_SPINDLE_COUNT: "SpindleCount",
1202
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1203
  ND_OVS: "OpenvSwitch",
1204
  ND_OVS_NAME: "OpenvSwitchName",
1205
  ND_OVS_LINK: "OpenvSwitchLink",
1206
  }
1207

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

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

    
1282
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1283

    
1284
# OOB supported commands
1285
OOB_POWER_ON = "power-on"
1286
OOB_POWER_OFF = "power-off"
1287
OOB_POWER_CYCLE = "power-cycle"
1288
OOB_POWER_STATUS = "power-status"
1289
OOB_HEALTH = "health"
1290

    
1291
OOB_COMMANDS = compat.UniqueFrozenset([
1292
  OOB_POWER_ON,
1293
  OOB_POWER_OFF,
1294
  OOB_POWER_CYCLE,
1295
  OOB_POWER_STATUS,
1296
  OOB_HEALTH,
1297
  ])
1298

    
1299
OOB_POWER_STATUS_POWERED = "powered"
1300

    
1301
OOB_TIMEOUT = 60 # 60 seconds
1302
OOB_POWER_DELAY = 2.0 # 2 seconds
1303

    
1304
OOB_STATUS_OK = "OK"
1305
OOB_STATUS_WARNING = "WARNING"
1306
OOB_STATUS_CRITICAL = "CRITICAL"
1307
OOB_STATUS_UNKNOWN = "UNKNOWN"
1308

    
1309
OOB_STATUSES = compat.UniqueFrozenset([
1310
  OOB_STATUS_OK,
1311
  OOB_STATUS_WARNING,
1312
  OOB_STATUS_CRITICAL,
1313
  OOB_STATUS_UNKNOWN,
1314
  ])
1315

    
1316
# Instance Parameters Profile
1317
PP_DEFAULT = "default"
1318

    
1319
# NIC_* constants are used inside the ganeti config
1320
NIC_MODE = "mode"
1321
NIC_LINK = "link"
1322
NIC_VLAN = "vlan"
1323

    
1324
NIC_MODE_BRIDGED = "bridged"
1325
NIC_MODE_ROUTED = "routed"
1326
NIC_MODE_OVS = "openvswitch"
1327
NIC_IP_POOL = "pool"
1328

    
1329
NIC_VALID_MODES = compat.UniqueFrozenset([
1330
  NIC_MODE_BRIDGED,
1331
  NIC_MODE_ROUTED,
1332
  NIC_MODE_OVS,
1333
  ])
1334

    
1335
RESERVE_ACTION = "reserve"
1336
RELEASE_ACTION = "release"
1337

    
1338
NICS_PARAMETER_TYPES = {
1339
  NIC_MODE: VTYPE_STRING,
1340
  NIC_LINK: VTYPE_STRING,
1341
  NIC_VLAN: VTYPE_MAYBE_STRING,
1342
  }
1343

    
1344
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1345

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

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

    
1388
# Hypervisor constants
1389
HT_XEN_PVM = "xen-pvm"
1390
HT_FAKE = "fake"
1391
HT_XEN_HVM = "xen-hvm"
1392
HT_KVM = "kvm"
1393
HT_CHROOT = "chroot"
1394
HT_LXC = "lxc"
1395
HYPER_TYPES = compat.UniqueFrozenset([
1396
  HT_XEN_PVM,
1397
  HT_FAKE,
1398
  HT_XEN_HVM,
1399
  HT_KVM,
1400
  HT_CHROOT,
1401
  HT_LXC,
1402
  ])
1403
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1404

    
1405
VNC_BASE_PORT = 5900
1406
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1407

    
1408
# NIC types
1409
HT_NIC_RTL8139 = "rtl8139"
1410
HT_NIC_NE2K_PCI = "ne2k_pci"
1411
HT_NIC_NE2K_ISA = "ne2k_isa"
1412
HT_NIC_I82551 = "i82551"
1413
HT_NIC_I85557B = "i82557b"
1414
HT_NIC_I8259ER = "i82559er"
1415
HT_NIC_PCNET = "pcnet"
1416
HT_NIC_E1000 = "e1000"
1417
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1418

    
1419
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1420
  HT_NIC_RTL8139,
1421
  HT_NIC_NE2K_PCI,
1422
  HT_NIC_E1000,
1423
  HT_NIC_NE2K_ISA,
1424
  HT_NIC_PARAVIRTUAL,
1425
  ])
1426
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1427
  HT_NIC_RTL8139,
1428
  HT_NIC_NE2K_PCI,
1429
  HT_NIC_NE2K_ISA,
1430
  HT_NIC_I82551,
1431
  HT_NIC_I85557B,
1432
  HT_NIC_I8259ER,
1433
  HT_NIC_PCNET,
1434
  HT_NIC_E1000,
1435
  HT_NIC_PARAVIRTUAL,
1436
  ])
1437

    
1438
# Vif types
1439
# default vif type in xen-hvm
1440
HT_HVM_VIF_IOEMU = "ioemu"
1441
HT_HVM_VIF_VIF = "vif"
1442
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1443
  HT_HVM_VIF_IOEMU,
1444
  HT_HVM_VIF_VIF,
1445
  ])
1446

    
1447
# Disk types
1448
HT_DISK_IOEMU = "ioemu"
1449
HT_DISK_IDE = "ide"
1450
HT_DISK_SCSI = "scsi"
1451
HT_DISK_SD = "sd"
1452
HT_DISK_MTD = "mtd"
1453
HT_DISK_PFLASH = "pflash"
1454

    
1455
HT_CACHE_DEFAULT = "default"
1456
HT_CACHE_NONE = "none"
1457
HT_CACHE_WTHROUGH = "writethrough"
1458
HT_CACHE_WBACK = "writeback"
1459
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1460
  HT_CACHE_DEFAULT,
1461
  HT_CACHE_NONE,
1462
  HT_CACHE_WTHROUGH,
1463
  HT_CACHE_WBACK,
1464
  ])
1465

    
1466
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1467
  HT_DISK_PARAVIRTUAL,
1468
  HT_DISK_IOEMU,
1469
  ])
1470
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1471
  HT_DISK_PARAVIRTUAL,
1472
  HT_DISK_IDE,
1473
  HT_DISK_SCSI,
1474
  HT_DISK_SD,
1475
  HT_DISK_MTD,
1476
  HT_DISK_PFLASH,
1477
  ])
1478

    
1479
# Mouse types:
1480
HT_MOUSE_MOUSE = "mouse"
1481
HT_MOUSE_TABLET = "tablet"
1482

    
1483
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1484
  HT_MOUSE_MOUSE,
1485
  HT_MOUSE_TABLET,
1486
  ])
1487

    
1488
# Boot order
1489
HT_BO_FLOPPY = "floppy"
1490
HT_BO_CDROM = "cdrom"
1491
HT_BO_DISK = "disk"
1492
HT_BO_NETWORK = "network"
1493

    
1494
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1495
  HT_BO_FLOPPY,
1496
  HT_BO_CDROM,
1497
  HT_BO_DISK,
1498
  HT_BO_NETWORK,
1499
  ])
1500

    
1501
# SPICE lossless image compression options
1502
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1503
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1504
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1505
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1506
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1507
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1508

    
1509
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1510
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1511
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1512
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1513
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1514
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1515
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1516
  ])
1517

    
1518
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1519
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1520
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1521
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1522

    
1523
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1524
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1525
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1526
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1527
  ])
1528

    
1529
# SPICE video stream detection
1530
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1531
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1532
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1533

    
1534
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1535
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1536
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1537
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1538
  ])
1539

    
1540
# Security models
1541
HT_SM_NONE = "none"
1542
HT_SM_USER = "user"
1543
HT_SM_POOL = "pool"
1544

    
1545
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1546
  HT_SM_NONE,
1547
  HT_SM_USER,
1548
  HT_SM_POOL,
1549
  ])
1550

    
1551
# Kvm flag values
1552
HT_KVM_ENABLED = "enabled"
1553
HT_KVM_DISABLED = "disabled"
1554

    
1555
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1556

    
1557
# Migration type
1558
HT_MIGRATION_LIVE = "live"
1559
HT_MIGRATION_NONLIVE = "non-live"
1560
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1561
  HT_MIGRATION_LIVE,
1562
  HT_MIGRATION_NONLIVE,
1563
  ])
1564

    
1565
# Cluster Verify steps
1566
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1567
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1568

    
1569
# Cluster Verify error classes
1570
CV_TCLUSTER = "cluster"
1571
CV_TGROUP = "group"
1572
CV_TNODE = "node"
1573
CV_TINSTANCE = "instance"
1574

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

    
1667
CV_ALL_ECODES = compat.UniqueFrozenset([
1668
  CV_ECLUSTERCFG,
1669
  CV_ECLUSTERCERT,
1670
  CV_ECLUSTERFILECHECK,
1671
  CV_ECLUSTERDANGLINGNODES,
1672
  CV_ECLUSTERDANGLINGINST,
1673
  CV_EINSTANCEBADNODE,
1674
  CV_EINSTANCEDOWN,
1675
  CV_EINSTANCELAYOUT,
1676
  CV_EINSTANCEMISSINGDISK,
1677
  CV_EINSTANCEFAULTYDISK,
1678
  CV_EINSTANCEWRONGNODE,
1679
  CV_EINSTANCESPLITGROUPS,
1680
  CV_EINSTANCEPOLICY,
1681
  CV_ENODEDRBD,
1682
  CV_ENODEDRBDHELPER,
1683
  CV_ENODEFILECHECK,
1684
  CV_ENODEHOOKS,
1685
  CV_ENODEHV,
1686
  CV_ENODELVM,
1687
  CV_ENODEN1,
1688
  CV_ENODENET,
1689
  CV_ENODEOS,
1690
  CV_ENODEORPHANINSTANCE,
1691
  CV_ENODEORPHANLV,
1692
  CV_ENODERPC,
1693
  CV_ENODESSH,
1694
  CV_ENODEVERSION,
1695
  CV_ENODESETUP,
1696
  CV_ENODETIME,
1697
  CV_ENODEOOBPATH,
1698
  CV_ENODEUSERSCRIPTS,
1699
  CV_ENODEFILESTORAGEPATHS,
1700
  CV_ENODEFILESTORAGEPATHUNUSABLE,
1701
  CV_ENODESHAREDFILESTORAGEPATHUNUSABLE,
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_DRBDVERSION = "drbd-version"
1711
NV_DRBDLIST = "drbd-list"
1712
NV_EXCLUSIVEPVS = "exclusive-pvs"
1713
NV_FILELIST = "filelist"
1714
NV_ACCEPTED_STORAGE_PATHS = "allowed-file-storage-paths"
1715
NV_FILE_STORAGE_PATH = "file-storage-path"
1716
NV_SHARED_FILE_STORAGE_PATH = "shared-file-storage-path"
1717
NV_HVINFO = "hvinfo"
1718
NV_HVPARAMS = "hvparms"
1719
NV_HYPERVISOR = "hypervisor"
1720
NV_INSTANCELIST = "instancelist"
1721
NV_LVLIST = "lvlist"
1722
NV_MASTERIP = "master-ip"
1723
NV_NODELIST = "nodelist"
1724
NV_NODENETTEST = "node-net-test"
1725
NV_NODESETUP = "nodesetup"
1726
NV_OOB_PATHS = "oob-paths"
1727
NV_OSLIST = "oslist"
1728
NV_PVLIST = "pvlist"
1729
NV_TIME = "time"
1730
NV_USERSCRIPTS = "user-scripts"
1731
NV_VERSION = "version"
1732
NV_VGLIST = "vglist"
1733
NV_VMNODES = "vmnodes"
1734

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

    
1755
# Admin states
1756
ADMINST_UP = _constants.ADMINST_UP
1757
ADMINST_DOWN = _constants.ADMINST_DOWN
1758
ADMINST_OFFLINE = _constants.ADMINST_OFFLINE
1759
ADMINST_ALL = _constants.ADMINST_ALL
1760

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1884
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1885

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2036
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2037
SS_HVPARAMS_PREF = "hvparams_"
2038

    
2039
# Hvparams keys:
2040
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2041
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2042
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2043
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2044
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2045
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2046

    
2047
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2048
  SS_HVPARAMS_XEN_PVM,
2049
  SS_HVPARAMS_XEN_FAKE,
2050
  SS_HVPARAMS_XEN_HVM,
2051
  SS_HVPARAMS_XEN_KVM,
2052
  SS_HVPARAMS_XEN_CHROOT,
2053
  SS_HVPARAMS_XEN_LXC,
2054
  ])
2055

    
2056
SS_FILE_PERMS = 0444
2057

    
2058
# cluster wide default parameters
2059
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2060

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

    
2175
HVC_GLOBALS = compat.UniqueFrozenset([
2176
  HV_MIGRATION_PORT,
2177
  HV_MIGRATION_BANDWIDTH,
2178
  HV_MIGRATION_MODE,
2179
  HV_XEN_CMD,
2180
  ])
2181

    
2182
BEC_DEFAULTS = {
2183
  BE_MINMEM: 128,
2184
  BE_MAXMEM: 128,
2185
  BE_VCPUS: 1,
2186
  BE_AUTO_BALANCE: True,
2187
  BE_ALWAYS_FAILOVER: False,
2188
  BE_SPINDLE_USE: 1,
2189
  }
2190

    
2191
NDC_DEFAULTS = {
2192
  ND_OOB_PROGRAM: "",
2193
  ND_SPINDLE_COUNT: 1,
2194
  ND_EXCLUSIVE_STORAGE: False,
2195
  ND_OVS: False,
2196
  ND_OVS_NAME: DEFAULT_OVS,
2197
  ND_OVS_LINK: ""
2198
  }
2199

    
2200
NDC_GLOBALS = compat.UniqueFrozenset([
2201
  ND_EXCLUSIVE_STORAGE,
2202
  ])
2203

    
2204
DISK_LD_DEFAULTS = {
2205
  DT_DRBD8: {
2206
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2207
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2208
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2209
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2210
    LDP_DISK_CUSTOM: "",
2211
    LDP_NET_CUSTOM: "",
2212
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2213
    LDP_DYNAMIC_RESYNC: False,
2214

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

    
2238
# readability shortcuts
2239
_LV_DEFAULTS = DISK_LD_DEFAULTS[DT_PLAIN]
2240
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[DT_DRBD8]
2241

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

    
2273
# we don't want to export the shortcuts
2274
del _LV_DEFAULTS, _DRBD_DEFAULTS
2275

    
2276
NICC_DEFAULTS = {
2277
  NIC_MODE: NIC_MODE_BRIDGED,
2278
  NIC_LINK: DEFAULT_BRIDGE,
2279
  NIC_VLAN: VALUE_HS_NOTHING,
2280
  }
2281

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

    
2317
MASTER_POOL_SIZE_DEFAULT = 10
2318

    
2319
# Exclusive storage:
2320
# Error margin used to compare physical disks
2321
PART_MARGIN = .01
2322
# Space reserved when creating instance disks
2323
PART_RESERVED = .02
2324

    
2325
CONFD_PROTOCOL_VERSION = 1
2326

    
2327
CONFD_REQ_PING = 0
2328
CONFD_REQ_NODE_ROLE_BYNAME = 1
2329
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2330
CONFD_REQ_CLUSTER_MASTER = 3
2331
CONFD_REQ_NODE_PIP_LIST = 4
2332
CONFD_REQ_MC_PIP_LIST = 5
2333
CONFD_REQ_INSTANCES_IPS_LIST = 6
2334
CONFD_REQ_NODE_DRBD = 7
2335
CONFD_REQ_NODE_INSTANCES = 8
2336

    
2337
# Confd request query fields. These are used to narrow down queries.
2338
# These must be strings rather than integers, because json-encoding
2339
# converts them to strings anyway, as they're used as dict-keys.
2340
CONFD_REQQ_LINK = "0"
2341
CONFD_REQQ_IP = "1"
2342
CONFD_REQQ_IPLIST = "2"
2343
CONFD_REQQ_FIELDS = "3"
2344

    
2345
CONFD_REQFIELD_NAME = "0"
2346
CONFD_REQFIELD_IP = "1"
2347
CONFD_REQFIELD_MNODE_PIP = "2"
2348

    
2349
CONFD_REQS = compat.UniqueFrozenset([
2350
  CONFD_REQ_PING,
2351
  CONFD_REQ_NODE_ROLE_BYNAME,
2352
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2353
  CONFD_REQ_CLUSTER_MASTER,
2354
  CONFD_REQ_NODE_PIP_LIST,
2355
  CONFD_REQ_MC_PIP_LIST,
2356
  CONFD_REQ_INSTANCES_IPS_LIST,
2357
  CONFD_REQ_NODE_DRBD,
2358
  ])
2359

    
2360
CONFD_REPL_STATUS_OK = 0
2361
CONFD_REPL_STATUS_ERROR = 1
2362
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2363

    
2364
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2365
  CONFD_REPL_STATUS_OK,
2366
  CONFD_REPL_STATUS_ERROR,
2367
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2368
  ])
2369

    
2370
(CONFD_NODE_ROLE_MASTER,
2371
 CONFD_NODE_ROLE_CANDIDATE,
2372
 CONFD_NODE_ROLE_OFFLINE,
2373
 CONFD_NODE_ROLE_DRAINED,
2374
 CONFD_NODE_ROLE_REGULAR,
2375
 ) = range(5)
2376

    
2377
# A few common errors for confd
2378
CONFD_ERROR_UNKNOWN_ENTRY = 1
2379
CONFD_ERROR_INTERNAL = 2
2380
CONFD_ERROR_ARGUMENT = 3
2381

    
2382
# Each request is "salted" by the current timestamp.
2383
# This constants decides how many seconds of skew to accept.
2384
# TODO: make this a default and allow the value to be more configurable
2385
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2386

    
2387
# When we haven't reloaded the config for more than this amount of
2388
# seconds, we force a test to see if inotify is betraying us. Using a
2389
# prime number to ensure we get less chance of 'same wakeup' with
2390
# other processes.
2391
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2392

    
2393
# If we receive more than one update in this amount of microseconds,
2394
# we move to polling every RATELIMIT seconds, rather than relying on
2395
# inotify, to be able to serve more requests.
2396
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2397

    
2398
# Magic number prepended to all confd queries.
2399
# This allows us to distinguish different types of confd protocols and handle
2400
# them. For example by changing this we can move the whole payload to be
2401
# compressed, or move away from json.
2402
CONFD_MAGIC_FOURCC = "plj0"
2403

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

    
2409
# Timeout in seconds to expire pending query request in the confd client
2410
# library. We don't actually expect any answer more than 10 seconds after we
2411
# sent a request.
2412
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2413

    
2414
# Maximum UDP datagram size.
2415
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2416
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2417
#   (assuming we can't use jumbo frames)
2418
# We just set this to 60K, which should be enough
2419
MAX_UDP_DATA_SIZE = 61440
2420

    
2421
# User-id pool minimum/maximum acceptable user-ids.
2422
UIDPOOL_UID_MIN = 0
2423
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2424

    
2425
# Name or path of the pgrep command
2426
PGREP = "pgrep"
2427

    
2428
# Name of the node group that gets created at cluster init or upgrade
2429
INITIAL_NODE_GROUP_NAME = "default"
2430

    
2431
# Possible values for NodeGroup.alloc_policy
2432
ALLOC_POLICY_PREFERRED = _constants.ALLOC_POLICY_PREFERRED
2433
ALLOC_POLICY_LAST_RESORT = _constants.ALLOC_POLICY_LAST_RESORT
2434
ALLOC_POLICY_UNALLOCABLE = _constants.ALLOC_POLICY_UNALLOCABLE
2435
VALID_ALLOC_POLICIES = _constants.VALID_ALLOC_POLICIES
2436

    
2437
# Temporary external/shared storage parameters
2438
BLOCKDEV_DRIVER_MANUAL = _constants.BLOCKDEV_DRIVER_MANUAL
2439

    
2440
# qemu-img path, required for ovfconverter
2441
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2442

    
2443
# Whether htools was enabled at compilation time
2444
HTOOLS = _autoconf.HTOOLS
2445
# The hail iallocator
2446
IALLOC_HAIL = "hail"
2447

    
2448
# Fake opcodes for functions that have hooks attached to them via
2449
# backend.RunLocalHooks
2450
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2451
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2452

    
2453
# SSH key types
2454
SSHK_RSA = "rsa"
2455
SSHK_DSA = "dsa"
2456
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2457

    
2458
# SSH authorized key types
2459
SSHAK_RSA = "ssh-rsa"
2460
SSHAK_DSS = "ssh-dss"
2461
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2462

    
2463
# SSH setup
2464
SSHS_CLUSTER_NAME = "cluster_name"
2465
SSHS_SSH_HOST_KEY = "ssh_host_key"
2466
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2467
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2468

    
2469
#: Key files for SSH daemon
2470
SSH_DAEMON_KEYFILES = {
2471
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2472
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2473
  }
2474

    
2475
# Node daemon setup
2476
NDS_CLUSTER_NAME = "cluster_name"
2477
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2478
NDS_SSCONF = "ssconf"
2479
NDS_START_NODE_DAEMON = "start_node_daemon"
2480

    
2481
# Path generating random UUID
2482
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2483

    
2484
# Regex string for verifying a UUID
2485
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2486

    
2487
# Auto-repair tag prefixes
2488
AUTO_REPAIR_TAG_PREFIX = _constants.AUTO_REPAIR_TAG_PREFIX
2489
AUTO_REPAIR_TAG_ENABLED = _constants.AUTO_REPAIR_TAG_ENABLED
2490
AUTO_REPAIR_TAG_SUSPENDED = _constants.AUTO_REPAIR_TAG_SUSPENDED
2491
AUTO_REPAIR_TAG_PENDING = _constants.AUTO_REPAIR_TAG_PENDING
2492
AUTO_REPAIR_TAG_RESULT = _constants.AUTO_REPAIR_TAG_RESULT
2493

    
2494
# Auto-repair levels
2495
AUTO_REPAIR_FIX_STORAGE = _constants.AUTO_REPAIR_FIX_STORAGE
2496
AUTO_REPAIR_MIGRATE = _constants.AUTO_REPAIR_MIGRATE
2497
AUTO_REPAIR_FAILOVER = _constants.AUTO_REPAIR_FAILOVER
2498
AUTO_REPAIR_REINSTALL = _constants.AUTO_REPAIR_REINSTALL
2499
AUTO_REPAIR_ALL_TYPES = _constants.AUTO_REPAIR_ALL_TYPES
2500

    
2501
# Auto-repair results
2502
AUTO_REPAIR_SUCCESS = _constants.AUTO_REPAIR_SUCCESS
2503
AUTO_REPAIR_FAILURE = _constants.AUTO_REPAIR_FAILURE
2504
AUTO_REPAIR_ENOPERM = _constants.AUTO_REPAIR_ENOPERM
2505
AUTO_REPAIR_ALL_RESULTS = _constants.AUTO_REPAIR_ALL_RESULTS
2506

    
2507
# The version identifier for builtin data collectors
2508
BUILTIN_DATA_COLLECTOR_VERSION = _constants.BUILTIN_DATA_COLLECTOR_VERSION
2509

    
2510
# The reason trail opcode parameter name
2511
OPCODE_REASON = "reason"
2512

    
2513
# The source reasons for the execution of an OpCode
2514
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2515
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2516
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2517
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2518
OPCODE_REASON_SRC_USER = "gnt:user"
2519

    
2520
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2521
  OPCODE_REASON_SRC_CLIENT,
2522
  OPCODE_REASON_SRC_NODED,
2523
  OPCODE_REASON_SRC_OPCODE,
2524
  OPCODE_REASON_SRC_RLIB2,
2525
  OPCODE_REASON_SRC_USER,
2526
  ])
2527

    
2528
DISKSTATS_FILE = "/proc/diskstats"
2529

    
2530
# CPU load collector variables
2531
STAT_FILE = "/proc/stat"
2532
CPUAVGLOAD_BUFFER_SIZE = 150
2533
CPUAVGLOAD_WINDOW_SIZE = 600
2534

    
2535
# Mond's variable for periodical data collection
2536
MOND_TIME_INTERVAL = 5
2537

    
2538
# Do not re-export imported modules
2539
del re, _vcsversion, _autoconf, _constants, socket, pathutils, compat
2540

    
2541

    
2542
ALLOCATABLE_KEY = "allocatable"
2543
FAILED_KEY = "failed"