Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ 6970c28b

History | View | Annotate | Download (66.6 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 = "ssh"
156
SCP = "scp"
157

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

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

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

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

    
188
FIRST_DRBD_PORT = 11000
189
LAST_DRBD_PORT = 14999
190

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

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

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

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

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

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

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

    
231
DEV_CONSOLE = "/dev/console"
232

    
233
PROC_MOUNTS = "/proc/mounts"
234

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

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

    
250
EXPORT_CONF_FILE = "config.ini"
251

    
252
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
253
XEN_KERNEL = _autoconf.XEN_KERNEL
254
XEN_INITRD = _autoconf.XEN_INITRD
255
XEN_CMD_XM = "xm"
256
XEN_CMD_XL = "xl"
257

    
258
KNOWN_XEN_COMMANDS = compat.UniqueFrozenset([
259
  XEN_CMD_XM,
260
  XEN_CMD_XL,
261
  ])
262

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

    
274
KVM_PATH = _autoconf.KVM_PATH
275
KVM_KERNEL = _autoconf.KVM_KERNEL
276
SOCAT_PATH = _autoconf.SOCAT_PATH
277
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
278
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
279
SOCAT_ESCAPE_CODE = "0x1d"
280

    
281
#: Console as SSH command
282
CONS_SSH = "ssh"
283

    
284
#: Console as VNC server
285
CONS_VNC = "vnc"
286

    
287
#: Console as SPICE server
288
CONS_SPICE = "spice"
289

    
290
#: Display a message for console access
291
CONS_MESSAGE = "msg"
292

    
293
#: All console types
294
CONS_ALL = compat.UniqueFrozenset([
295
  CONS_SSH,
296
  CONS_VNC,
297
  CONS_SPICE,
298
  CONS_MESSAGE,
299
  ])
300

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

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

    
314
# Digest used to sign certificates ("openssl x509" uses SHA1 by default)
315
X509_CERT_SIGN_DIGEST = "SHA1"
316

    
317
# Default validity of certificates in days
318
X509_CERT_DEFAULT_VALIDITY = 365 * 5
319

    
320
# commonName (CN) used in certificates
321
X509_CERT_CN = "ganeti.example.com"
322

    
323
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
324

    
325
# Import/export daemon mode
326
IEM_IMPORT = "import"
327
IEM_EXPORT = "export"
328

    
329
# Import/export transport compression
330
IEC_NONE = "none"
331
IEC_GZIP = "gzip"
332
IEC_ALL = compat.UniqueFrozenset([
333
  IEC_NONE,
334
  IEC_GZIP,
335
  ])
336

    
337
IE_CUSTOM_SIZE = "fd"
338

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

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

    
349
VALUE_DEFAULT = "default"
350
VALUE_AUTO = "auto"
351
VALUE_GENERATE = "generate"
352
VALUE_NONE = "none"
353
VALUE_TRUE = "true"
354
VALUE_FALSE = "false"
355
VALUE_HS_NOTHING = {"Nothing": None}
356

    
357

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

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

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

    
376
HKR_SKIP = 0
377
HKR_FAIL = 1
378
HKR_SUCCESS = 2
379

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

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

    
399
# the set of storage types for which storage reporting is available
400
# FIXME: Remove this, once storage reporting is available for all types.
401
STS_REPORT = compat.UniqueFrozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
402

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

    
414
# Storage operations
415
SO_FIX_CONSISTENCY = "fix-consistency"
416

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

    
428
MODIFIABLE_STORAGE_FIELDS = {
429
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
430
  }
431

    
432
VALID_STORAGE_OPERATIONS = {
433
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
434
  }
435

    
436
# Volume fields
437
VF_DEV = "dev"
438
VF_INSTANCE = "instance"
439
VF_NAME = "name"
440
VF_NODE = "node"
441
VF_PHYS = "phys"
442
VF_SIZE = "size"
443
VF_VG = "vg"
444

    
445
# Local disk status
446
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
447
(LDS_OKAY,
448
 LDS_UNKNOWN,
449
 LDS_FAULTY) = range(1, 4)
450

    
451
LDS_NAMES = {
452
  LDS_OKAY: "ok",
453
  LDS_UNKNOWN: "unknown",
454
  LDS_FAULTY: "faulty",
455
}
456

    
457
# disk template types
458
DT_BLOCK = "blockdev"
459
DT_DISKLESS = "diskless"
460
DT_DRBD8 = "drbd"
461
DT_EXT = "ext"
462
DT_FILE = "file"
463
DT_PLAIN = "plain"
464
DT_RBD = "rbd"
465
DT_SHARED_FILE = "sharedfile"
466

    
467
# This is used to order determine the default disk template when the list
468
# of enabled disk templates is inferred from the current state of the cluster.
469
# This only happens on an upgrade from a version of Ganeti that did not
470
# support the 'enabled_disk_templates' so far.
471
DISK_TEMPLATE_PREFERENCE = [
472
  DT_BLOCK,
473
  DT_DISKLESS,
474
  DT_DRBD8,
475
  DT_EXT,
476
  DT_FILE,
477
  DT_PLAIN,
478
  DT_RBD,
479
  DT_SHARED_FILE,
480
  ]
481

    
482
DISK_TEMPLATES = compat.UniqueFrozenset([
483
  DT_DISKLESS,
484
  DT_PLAIN,
485
  DT_DRBD8,
486
  DT_FILE,
487
  DT_SHARED_FILE,
488
  DT_BLOCK,
489
  DT_RBD,
490
  DT_EXT
491
  ])
492

    
493
# disk templates that are enabled by default
494
DEFAULT_ENABLED_DISK_TEMPLATES = [
495
  DT_DRBD8,
496
  DT_PLAIN,
497
  ]
498

    
499
# mapping of disk templates to storage types
500
MAP_DISK_TEMPLATE_STORAGE_TYPE = {
501
  DT_BLOCK: ST_BLOCK,
502
  DT_DISKLESS: ST_DISKLESS,
503
  DT_DRBD8: ST_LVM_VG,
504
  DT_EXT: ST_EXT,
505
  DT_FILE: ST_FILE,
506
  DT_PLAIN: ST_LVM_VG,
507
  DT_RBD: ST_RADOS,
508
  DT_SHARED_FILE: ST_FILE,
509
  }
510

    
511
# the set of network-mirrored disk templates
512
DTS_INT_MIRROR = compat.UniqueFrozenset([DT_DRBD8])
513

    
514
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
515
DTS_EXT_MIRROR = compat.UniqueFrozenset([
516
  DT_DISKLESS, # 'trivially' externally mirrored
517
  DT_SHARED_FILE,
518
  DT_BLOCK,
519
  DT_RBD,
520
  DT_EXT,
521
  ])
522

    
523
# the set of non-lvm-based disk templates
524
DTS_NOT_LVM = compat.UniqueFrozenset([
525
  DT_DISKLESS,
526
  DT_FILE,
527
  DT_SHARED_FILE,
528
  DT_BLOCK,
529
  DT_RBD,
530
  DT_EXT,
531
  ])
532

    
533
# the set of disk templates which can be grown
534
DTS_GROWABLE = compat.UniqueFrozenset([
535
  DT_PLAIN,
536
  DT_DRBD8,
537
  DT_FILE,
538
  DT_SHARED_FILE,
539
  DT_RBD,
540
  DT_EXT,
541
  ])
542

    
543
# the set of disk templates that allow adoption
544
DTS_MAY_ADOPT = compat.UniqueFrozenset([
545
  DT_PLAIN,
546
  DT_BLOCK,
547
  ])
548

    
549
# the set of disk templates that *must* use adoption
550
DTS_MUST_ADOPT = compat.UniqueFrozenset([DT_BLOCK])
551

    
552
# the set of disk templates that allow migrations
553
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
554

    
555
# the set of file based disk templates
556
DTS_FILEBASED = compat.UniqueFrozenset([
557
  DT_FILE,
558
  DT_SHARED_FILE,
559
  ])
560

    
561
# the set of disk templates that can be moved by copying
562
# Note: a requirement is that they're not accessed externally or shared between
563
# nodes; in particular, sharedfile is not suitable.
564
DTS_COPYABLE = compat.UniqueFrozenset([
565
  DT_FILE,
566
  DT_PLAIN,
567
  ])
568

    
569
# the set of disk templates that are supported by exclusive_storage
570
DTS_EXCL_STORAGE = compat.UniqueFrozenset([DT_PLAIN])
571

    
572
# templates for which we don't perform checks on free space
573
DTS_NO_FREE_SPACE_CHECK = compat.UniqueFrozenset([
574
  DT_FILE,
575
  DT_SHARED_FILE,
576
  DT_RBD,
577
  DT_EXT,
578
  ])
579

    
580
# logical disk types
581
LD_LV = "lvm"
582
LD_DRBD8 = "drbd8"
583
LD_FILE = "file"
584
LD_BLOCKDEV = "blockdev"
585
LD_RBD = "rbd"
586
LD_EXT = "ext"
587
LOGICAL_DISK_TYPES = compat.UniqueFrozenset([
588
  LD_LV,
589
  LD_DRBD8,
590
  LD_FILE,
591
  LD_BLOCKDEV,
592
  LD_RBD,
593
  LD_EXT,
594
  ])
595

    
596
LDS_BLOCK = compat.UniqueFrozenset([
597
  LD_LV,
598
  LD_DRBD8,
599
  LD_BLOCKDEV,
600
  LD_RBD,
601
  LD_EXT,
602
  ])
603

    
604
# drbd constants
605
DRBD_HMAC_ALG = "md5"
606
DRBD_DEFAULT_NET_PROTOCOL = "C"
607
DRBD_MIGRATION_NET_PROTOCOL = "C"
608
DRBD_STATUS_FILE = "/proc/drbd"
609

    
610
#: Size of DRBD meta block device
611
DRBD_META_SIZE = 128
612

    
613
# drbd barrier types
614
DRBD_B_NONE = "n"
615
DRBD_B_DISK_BARRIERS = "b"
616
DRBD_B_DISK_DRAIN = "d"
617
DRBD_B_DISK_FLUSH = "f"
618

    
619
# Valid barrier combinations: "n" or any non-null subset of "bfd"
620
DRBD_VALID_BARRIER_OPT = compat.UniqueFrozenset([
621
  frozenset([DRBD_B_NONE]),
622
  frozenset([DRBD_B_DISK_BARRIERS]),
623
  frozenset([DRBD_B_DISK_DRAIN]),
624
  frozenset([DRBD_B_DISK_FLUSH]),
625
  frozenset([DRBD_B_DISK_DRAIN, DRBD_B_DISK_FLUSH]),
626
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_DRAIN]),
627
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH]),
628
  frozenset([DRBD_B_DISK_BARRIERS, DRBD_B_DISK_FLUSH, DRBD_B_DISK_DRAIN]),
629
  ])
630

    
631
# rbd tool command
632
RBD_CMD = "rbd"
633

    
634
# file backend driver
635
FD_LOOP = "loop"
636
FD_BLKTAP = "blktap"
637

    
638
# the set of drbd-like disk types
639
LDS_DRBD = compat.UniqueFrozenset([LD_DRBD8])
640

    
641
# disk access mode
642
DISK_RDONLY = "ro"
643
DISK_RDWR = "rw"
644
DISK_ACCESS_SET = compat.UniqueFrozenset([DISK_RDONLY, DISK_RDWR])
645

    
646
# disk replacement mode
647
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
648
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
649
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
650
REPLACE_DISK_AUTO = "replace_auto"
651
REPLACE_MODES = compat.UniqueFrozenset([
652
  REPLACE_DISK_PRI,
653
  REPLACE_DISK_SEC,
654
  REPLACE_DISK_CHG,
655
  REPLACE_DISK_AUTO,
656
  ])
657

    
658
# Instance export mode
659
EXPORT_MODE_LOCAL = "local"
660
EXPORT_MODE_REMOTE = "remote"
661
EXPORT_MODES = compat.UniqueFrozenset([
662
  EXPORT_MODE_LOCAL,
663
  EXPORT_MODE_REMOTE,
664
  ])
665

    
666
# instance creation modes
667
INSTANCE_CREATE = "create"
668
INSTANCE_IMPORT = "import"
669
INSTANCE_REMOTE_IMPORT = "remote-import"
670
INSTANCE_CREATE_MODES = compat.UniqueFrozenset([
671
  INSTANCE_CREATE,
672
  INSTANCE_IMPORT,
673
  INSTANCE_REMOTE_IMPORT,
674
  ])
675

    
676
# Remote import/export handshake message and version
677
RIE_VERSION = 0
678
RIE_HANDSHAKE = "Hi, I'm Ganeti"
679

    
680
# Remote import/export certificate validity in seconds
681
RIE_CERT_VALIDITY = 24 * 60 * 60
682

    
683
# Overall timeout for establishing connection
684
RIE_CONNECT_TIMEOUT = 180
685

    
686
# Export only: how long to wait per connection attempt (seconds)
687
RIE_CONNECT_ATTEMPT_TIMEOUT = 20
688

    
689
# Export only: number of attempts to connect
690
RIE_CONNECT_RETRIES = 10
691

    
692
#: Give child process up to 5 seconds to exit after sending a signal
693
CHILD_LINGER_TIMEOUT = 5.0
694

    
695
FILE_DRIVER = compat.UniqueFrozenset([FD_LOOP, FD_BLKTAP])
696

    
697
# import/export config options
698
INISECT_EXP = "export"
699
INISECT_INS = "instance"
700
INISECT_HYP = "hypervisor"
701
INISECT_BEP = "backend"
702
INISECT_OSP = "os"
703

    
704
# dynamic device modification
705
DDM_ADD = "add"
706
DDM_MODIFY = "modify"
707
DDM_REMOVE = "remove"
708
DDMS_VALUES = compat.UniqueFrozenset([DDM_ADD, DDM_REMOVE])
709
DDMS_VALUES_WITH_MODIFY = (DDMS_VALUES | frozenset([
710
  DDM_MODIFY,
711
  ]))
712
# TODO: DDM_SWAP, DDM_MOVE?
713

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
846
ES_PARAMETERS_FILE = "parameters.list"
847

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

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

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

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

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

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

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

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

    
978

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

    
1053
HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
1054

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

    
1069
# Migration statuses
1070
HV_MIGRATION_COMPLETED = "completed"
1071
HV_MIGRATION_ACTIVE = "active"
1072
HV_MIGRATION_FAILED = "failed"
1073
HV_MIGRATION_CANCELLED = "cancelled"
1074

    
1075
HV_MIGRATION_VALID_STATUSES = compat.UniqueFrozenset([
1076
  HV_MIGRATION_COMPLETED,
1077
  HV_MIGRATION_ACTIVE,
1078
  HV_MIGRATION_FAILED,
1079
  HV_MIGRATION_CANCELLED,
1080
  ])
1081

    
1082
HV_MIGRATION_FAILED_STATUSES = compat.UniqueFrozenset([
1083
  HV_MIGRATION_FAILED,
1084
  HV_MIGRATION_CANCELLED,
1085
  ])
1086

    
1087
# KVM-specific statuses
1088
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1089

    
1090
# Node info keys
1091
HV_NODEINFO_KEY_VERSION = "hv_version"
1092

    
1093
# Hypervisor state
1094
HVST_MEMORY_TOTAL = "mem_total"
1095
HVST_MEMORY_NODE = "mem_node"
1096
HVST_MEMORY_HV = "mem_hv"
1097
HVST_CPU_TOTAL = "cpu_total"
1098
HVST_CPU_NODE = "cpu_node"
1099

    
1100
HVST_DEFAULTS = {
1101
  HVST_MEMORY_TOTAL: 0,
1102
  HVST_MEMORY_NODE: 0,
1103
  HVST_MEMORY_HV: 0,
1104
  HVST_CPU_TOTAL: 1,
1105
  HVST_CPU_NODE: 1,
1106
  }
1107

    
1108
HVSTS_PARAMETER_TYPES = {
1109
  HVST_MEMORY_TOTAL: VTYPE_INT,
1110
  HVST_MEMORY_NODE: VTYPE_INT,
1111
  HVST_MEMORY_HV: VTYPE_INT,
1112
  HVST_CPU_TOTAL: VTYPE_INT,
1113
  HVST_CPU_NODE: VTYPE_INT,
1114
  }
1115

    
1116
HVSTS_PARAMETERS = frozenset(HVSTS_PARAMETER_TYPES.keys())
1117

    
1118
# Disk state
1119
DS_DISK_TOTAL = "disk_total"
1120
DS_DISK_RESERVED = "disk_reserved"
1121
DS_DISK_OVERHEAD = "disk_overhead"
1122

    
1123
DS_DEFAULTS = {
1124
  DS_DISK_TOTAL: 0,
1125
  DS_DISK_RESERVED: 0,
1126
  DS_DISK_OVERHEAD: 0,
1127
  }
1128

    
1129
DSS_PARAMETER_TYPES = {
1130
  DS_DISK_TOTAL: VTYPE_INT,
1131
  DS_DISK_RESERVED: VTYPE_INT,
1132
  DS_DISK_OVERHEAD: VTYPE_INT,
1133
  }
1134

    
1135
DSS_PARAMETERS = frozenset(DSS_PARAMETER_TYPES.keys())
1136
DS_VALID_TYPES = compat.UniqueFrozenset([LD_LV])
1137

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

    
1147
BES_PARAMETER_TYPES = {
1148
  BE_MAXMEM: VTYPE_SIZE,
1149
  BE_MINMEM: VTYPE_SIZE,
1150
  BE_VCPUS: VTYPE_INT,
1151
  BE_AUTO_BALANCE: VTYPE_BOOL,
1152
  BE_ALWAYS_FAILOVER: VTYPE_BOOL,
1153
  BE_SPINDLE_USE: VTYPE_INT,
1154
  }
1155

    
1156
BES_PARAMETER_TITLES = {
1157
  BE_AUTO_BALANCE: "Auto_balance",
1158
  BE_MAXMEM: "ConfigMaxMem",
1159
  BE_MINMEM: "ConfigMinMem",
1160
  BE_VCPUS: "ConfigVCPUs",
1161
  }
1162

    
1163
BES_PARAMETER_COMPAT = {
1164
  BE_MEMORY: VTYPE_SIZE,
1165
  }
1166
BES_PARAMETER_COMPAT.update(BES_PARAMETER_TYPES)
1167

    
1168
BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
1169

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

    
1178
ISPECS_PARAMETER_TYPES = {
1179
  ISPEC_MEM_SIZE: VTYPE_INT,
1180
  ISPEC_CPU_COUNT: VTYPE_INT,
1181
  ISPEC_DISK_COUNT: VTYPE_INT,
1182
  ISPEC_DISK_SIZE: VTYPE_INT,
1183
  ISPEC_NIC_COUNT: VTYPE_INT,
1184
  ISPEC_SPINDLE_USE: VTYPE_INT,
1185
  }
1186

    
1187
ISPECS_PARAMETERS = frozenset(ISPECS_PARAMETER_TYPES.keys())
1188

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

    
1197
ISPECS_MINMAX_KEYS = compat.UniqueFrozenset([
1198
  ISPECS_MIN,
1199
  ISPECS_MAX,
1200
  ])
1201

    
1202
IPOLICY_PARAMETERS = compat.UniqueFrozenset([
1203
  IPOLICY_VCPU_RATIO,
1204
  IPOLICY_SPINDLE_RATIO,
1205
  ])
1206

    
1207
IPOLICY_ALL_KEYS = (IPOLICY_PARAMETERS |
1208
                    frozenset([ISPECS_MINMAX, ISPECS_STD, IPOLICY_DTS]))
1209

    
1210
# Node parameter names
1211
ND_OOB_PROGRAM = "oob_program"
1212
ND_SPINDLE_COUNT = "spindle_count"
1213
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1214
ND_OVS = "ovs"
1215
ND_OVS_NAME = "ovs_name"
1216
ND_OVS_LINK = "ovs_link"
1217

    
1218
NDS_PARAMETER_TYPES = {
1219
  ND_OOB_PROGRAM: VTYPE_STRING,
1220
  ND_SPINDLE_COUNT: VTYPE_INT,
1221
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1222
  ND_OVS: VTYPE_BOOL,
1223
  ND_OVS_NAME: VTYPE_MAYBE_STRING,
1224
  ND_OVS_LINK: VTYPE_MAYBE_STRING,
1225
  }
1226

    
1227
NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())
1228

    
1229
NDS_PARAMETER_TITLES = {
1230
  ND_OOB_PROGRAM: "OutOfBandProgram",
1231
  ND_SPINDLE_COUNT: "SpindleCount",
1232
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1233
  ND_OVS: "OpenvSwitch",
1234
  ND_OVS_NAME: "OpenvSwitchName",
1235
  ND_OVS_LINK: "OpenvSwitchLink",
1236
  }
1237

    
1238
# Logical Disks parameters
1239
LDP_RESYNC_RATE = "resync-rate"
1240
LDP_STRIPES = "stripes"
1241
LDP_BARRIERS = "disabled-barriers"
1242
LDP_NO_META_FLUSH = "disable-meta-flush"
1243
LDP_DEFAULT_METAVG = "default-metavg"
1244
LDP_DISK_CUSTOM = "disk-custom"
1245
LDP_NET_CUSTOM = "net-custom"
1246
LDP_PROTOCOL = "protocol"
1247
LDP_DYNAMIC_RESYNC = "dynamic-resync"
1248
LDP_PLAN_AHEAD = "c-plan-ahead"
1249
LDP_FILL_TARGET = "c-fill-target"
1250
LDP_DELAY_TARGET = "c-delay-target"
1251
LDP_MAX_RATE = "c-max-rate"
1252
LDP_MIN_RATE = "c-min-rate"
1253
LDP_POOL = "pool"
1254
DISK_LD_TYPES = {
1255
  LDP_RESYNC_RATE: VTYPE_INT,
1256
  LDP_STRIPES: VTYPE_INT,
1257
  LDP_BARRIERS: VTYPE_STRING,
1258
  LDP_NO_META_FLUSH: VTYPE_BOOL,
1259
  LDP_DEFAULT_METAVG: VTYPE_STRING,
1260
  LDP_DISK_CUSTOM: VTYPE_STRING,
1261
  LDP_NET_CUSTOM: VTYPE_STRING,
1262
  LDP_PROTOCOL: VTYPE_STRING,
1263
  LDP_DYNAMIC_RESYNC: VTYPE_BOOL,
1264
  LDP_PLAN_AHEAD: VTYPE_INT,
1265
  LDP_FILL_TARGET: VTYPE_INT,
1266
  LDP_DELAY_TARGET: VTYPE_INT,
1267
  LDP_MAX_RATE: VTYPE_INT,
1268
  LDP_MIN_RATE: VTYPE_INT,
1269
  LDP_POOL: VTYPE_STRING,
1270
  }
1271
DISK_LD_PARAMETERS = frozenset(DISK_LD_TYPES.keys())
1272

    
1273
# Disk template parameters (can be set/changed by the user via gnt-cluster and
1274
# gnt-group)
1275
DRBD_RESYNC_RATE = "resync-rate"
1276
DRBD_DATA_STRIPES = "data-stripes"
1277
DRBD_META_STRIPES = "meta-stripes"
1278
DRBD_DISK_BARRIERS = "disk-barriers"
1279
DRBD_META_BARRIERS = "meta-barriers"
1280
DRBD_DEFAULT_METAVG = "metavg"
1281
DRBD_DISK_CUSTOM = "disk-custom"
1282
DRBD_NET_CUSTOM = "net-custom"
1283
DRBD_PROTOCOL = "protocol"
1284
DRBD_DYNAMIC_RESYNC = "dynamic-resync"
1285
DRBD_PLAN_AHEAD = "c-plan-ahead"
1286
DRBD_FILL_TARGET = "c-fill-target"
1287
DRBD_DELAY_TARGET = "c-delay-target"
1288
DRBD_MAX_RATE = "c-max-rate"
1289
DRBD_MIN_RATE = "c-min-rate"
1290
LV_STRIPES = "stripes"
1291
RBD_POOL = "pool"
1292
DISK_DT_TYPES = {
1293
  DRBD_RESYNC_RATE: VTYPE_INT,
1294
  DRBD_DATA_STRIPES: VTYPE_INT,
1295
  DRBD_META_STRIPES: VTYPE_INT,
1296
  DRBD_DISK_BARRIERS: VTYPE_STRING,
1297
  DRBD_META_BARRIERS: VTYPE_BOOL,
1298
  DRBD_DEFAULT_METAVG: VTYPE_STRING,
1299
  DRBD_DISK_CUSTOM: VTYPE_STRING,
1300
  DRBD_NET_CUSTOM: VTYPE_STRING,
1301
  DRBD_PROTOCOL: VTYPE_STRING,
1302
  DRBD_DYNAMIC_RESYNC: VTYPE_BOOL,
1303
  DRBD_PLAN_AHEAD: VTYPE_INT,
1304
  DRBD_FILL_TARGET: VTYPE_INT,
1305
  DRBD_DELAY_TARGET: VTYPE_INT,
1306
  DRBD_MAX_RATE: VTYPE_INT,
1307
  DRBD_MIN_RATE: VTYPE_INT,
1308
  LV_STRIPES: VTYPE_INT,
1309
  RBD_POOL: VTYPE_STRING,
1310
  }
1311

    
1312
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1313

    
1314
# OOB supported commands
1315
OOB_POWER_ON = "power-on"
1316
OOB_POWER_OFF = "power-off"
1317
OOB_POWER_CYCLE = "power-cycle"
1318
OOB_POWER_STATUS = "power-status"
1319
OOB_HEALTH = "health"
1320

    
1321
OOB_COMMANDS = compat.UniqueFrozenset([
1322
  OOB_POWER_ON,
1323
  OOB_POWER_OFF,
1324
  OOB_POWER_CYCLE,
1325
  OOB_POWER_STATUS,
1326
  OOB_HEALTH,
1327
  ])
1328

    
1329
OOB_POWER_STATUS_POWERED = "powered"
1330

    
1331
OOB_TIMEOUT = 60 # 60 seconds
1332
OOB_POWER_DELAY = 2.0 # 2 seconds
1333

    
1334
OOB_STATUS_OK = "OK"
1335
OOB_STATUS_WARNING = "WARNING"
1336
OOB_STATUS_CRITICAL = "CRITICAL"
1337
OOB_STATUS_UNKNOWN = "UNKNOWN"
1338

    
1339
OOB_STATUSES = compat.UniqueFrozenset([
1340
  OOB_STATUS_OK,
1341
  OOB_STATUS_WARNING,
1342
  OOB_STATUS_CRITICAL,
1343
  OOB_STATUS_UNKNOWN,
1344
  ])
1345

    
1346
# Instance Parameters Profile
1347
PP_DEFAULT = "default"
1348

    
1349
# NIC_* constants are used inside the ganeti config
1350
NIC_MODE = "mode"
1351
NIC_LINK = "link"
1352
NIC_VLAN = "vlan"
1353

    
1354
NIC_MODE_BRIDGED = "bridged"
1355
NIC_MODE_ROUTED = "routed"
1356
NIC_MODE_OVS = "openvswitch"
1357
NIC_IP_POOL = "pool"
1358

    
1359
NIC_VALID_MODES = compat.UniqueFrozenset([
1360
  NIC_MODE_BRIDGED,
1361
  NIC_MODE_ROUTED,
1362
  NIC_MODE_OVS,
1363
  ])
1364

    
1365
RESERVE_ACTION = "reserve"
1366
RELEASE_ACTION = "release"
1367

    
1368
NICS_PARAMETER_TYPES = {
1369
  NIC_MODE: VTYPE_STRING,
1370
  NIC_LINK: VTYPE_STRING,
1371
  NIC_VLAN: VTYPE_MAYBE_STRING,
1372
  }
1373

    
1374
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1375

    
1376
# IDISK_* constants are used in opcodes, to create/change disks
1377
IDISK_SIZE = "size"
1378
IDISK_SPINDLES = "spindles"
1379
IDISK_MODE = "mode"
1380
IDISK_ADOPT = "adopt"
1381
IDISK_VG = "vg"
1382
IDISK_METAVG = "metavg"
1383
IDISK_PROVIDER = "provider"
1384
IDISK_NAME = "name"
1385
IDISK_PARAMS_TYPES = {
1386
  IDISK_SIZE: VTYPE_SIZE,
1387
  IDISK_SPINDLES: VTYPE_INT,
1388
  IDISK_MODE: VTYPE_STRING,
1389
  IDISK_ADOPT: VTYPE_STRING,
1390
  IDISK_VG: VTYPE_STRING,
1391
  IDISK_METAVG: VTYPE_STRING,
1392
  IDISK_PROVIDER: VTYPE_STRING,
1393
  IDISK_NAME: VTYPE_MAYBE_STRING,
1394
  }
1395
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1396

    
1397
# INIC_* constants are used in opcodes, to create/change nics
1398
INIC_MAC = "mac"
1399
INIC_IP = "ip"
1400
INIC_MODE = "mode"
1401
INIC_LINK = "link"
1402
INIC_NETWORK = "network"
1403
INIC_NAME = "name"
1404
INIC_VLAN = "vlan"
1405
INIC_BRIDGE = "bridge"
1406
INIC_PARAMS_TYPES = {
1407
  INIC_IP: VTYPE_MAYBE_STRING,
1408
  INIC_LINK: VTYPE_STRING,
1409
  INIC_MAC: VTYPE_STRING,
1410
  INIC_MODE: VTYPE_STRING,
1411
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1412
  INIC_NAME: VTYPE_MAYBE_STRING,
1413
  INIC_VLAN: VTYPE_MAYBE_STRING,
1414
  INIC_BRIDGE: VTYPE_MAYBE_STRING
1415
  }
1416
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1417

    
1418
# Hypervisor constants
1419
HT_XEN_PVM = "xen-pvm"
1420
HT_FAKE = "fake"
1421
HT_XEN_HVM = "xen-hvm"
1422
HT_KVM = "kvm"
1423
HT_CHROOT = "chroot"
1424
HT_LXC = "lxc"
1425
HYPER_TYPES = compat.UniqueFrozenset([
1426
  HT_XEN_PVM,
1427
  HT_FAKE,
1428
  HT_XEN_HVM,
1429
  HT_KVM,
1430
  HT_CHROOT,
1431
  HT_LXC,
1432
  ])
1433
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1434

    
1435
VNC_BASE_PORT = 5900
1436
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1437

    
1438
# NIC types
1439
HT_NIC_RTL8139 = "rtl8139"
1440
HT_NIC_NE2K_PCI = "ne2k_pci"
1441
HT_NIC_NE2K_ISA = "ne2k_isa"
1442
HT_NIC_I82551 = "i82551"
1443
HT_NIC_I85557B = "i82557b"
1444
HT_NIC_I8259ER = "i82559er"
1445
HT_NIC_PCNET = "pcnet"
1446
HT_NIC_E1000 = "e1000"
1447
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1448

    
1449
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1450
  HT_NIC_RTL8139,
1451
  HT_NIC_NE2K_PCI,
1452
  HT_NIC_E1000,
1453
  HT_NIC_NE2K_ISA,
1454
  HT_NIC_PARAVIRTUAL,
1455
  ])
1456
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1457
  HT_NIC_RTL8139,
1458
  HT_NIC_NE2K_PCI,
1459
  HT_NIC_NE2K_ISA,
1460
  HT_NIC_I82551,
1461
  HT_NIC_I85557B,
1462
  HT_NIC_I8259ER,
1463
  HT_NIC_PCNET,
1464
  HT_NIC_E1000,
1465
  HT_NIC_PARAVIRTUAL,
1466
  ])
1467

    
1468
# Vif types
1469
# default vif type in xen-hvm
1470
HT_HVM_VIF_IOEMU = "ioemu"
1471
HT_HVM_VIF_VIF = "vif"
1472
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1473
  HT_HVM_VIF_IOEMU,
1474
  HT_HVM_VIF_VIF,
1475
  ])
1476

    
1477
# Disk types
1478
HT_DISK_IOEMU = "ioemu"
1479
HT_DISK_IDE = "ide"
1480
HT_DISK_SCSI = "scsi"
1481
HT_DISK_SD = "sd"
1482
HT_DISK_MTD = "mtd"
1483
HT_DISK_PFLASH = "pflash"
1484

    
1485
HT_CACHE_DEFAULT = "default"
1486
HT_CACHE_NONE = "none"
1487
HT_CACHE_WTHROUGH = "writethrough"
1488
HT_CACHE_WBACK = "writeback"
1489
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1490
  HT_CACHE_DEFAULT,
1491
  HT_CACHE_NONE,
1492
  HT_CACHE_WTHROUGH,
1493
  HT_CACHE_WBACK,
1494
  ])
1495

    
1496
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1497
  HT_DISK_PARAVIRTUAL,
1498
  HT_DISK_IOEMU,
1499
  ])
1500
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1501
  HT_DISK_PARAVIRTUAL,
1502
  HT_DISK_IDE,
1503
  HT_DISK_SCSI,
1504
  HT_DISK_SD,
1505
  HT_DISK_MTD,
1506
  HT_DISK_PFLASH,
1507
  ])
1508

    
1509
# Mouse types:
1510
HT_MOUSE_MOUSE = "mouse"
1511
HT_MOUSE_TABLET = "tablet"
1512

    
1513
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1514
  HT_MOUSE_MOUSE,
1515
  HT_MOUSE_TABLET,
1516
  ])
1517

    
1518
# Boot order
1519
HT_BO_FLOPPY = "floppy"
1520
HT_BO_CDROM = "cdrom"
1521
HT_BO_DISK = "disk"
1522
HT_BO_NETWORK = "network"
1523

    
1524
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1525
  HT_BO_FLOPPY,
1526
  HT_BO_CDROM,
1527
  HT_BO_DISK,
1528
  HT_BO_NETWORK,
1529
  ])
1530

    
1531
# SPICE lossless image compression options
1532
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1533
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1534
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1535
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1536
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1537
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1538

    
1539
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1540
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1541
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1542
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1543
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1544
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1545
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1546
  ])
1547

    
1548
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1549
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1550
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1551
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1552

    
1553
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1554
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1555
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1556
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1557
  ])
1558

    
1559
# SPICE video stream detection
1560
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1561
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1562
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1563

    
1564
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1565
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1566
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1567
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1568
  ])
1569

    
1570
# Security models
1571
HT_SM_NONE = "none"
1572
HT_SM_USER = "user"
1573
HT_SM_POOL = "pool"
1574

    
1575
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1576
  HT_SM_NONE,
1577
  HT_SM_USER,
1578
  HT_SM_POOL,
1579
  ])
1580

    
1581
# Kvm flag values
1582
HT_KVM_ENABLED = "enabled"
1583
HT_KVM_DISABLED = "disabled"
1584

    
1585
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1586

    
1587
# Migration type
1588
HT_MIGRATION_LIVE = "live"
1589
HT_MIGRATION_NONLIVE = "non-live"
1590
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1591
  HT_MIGRATION_LIVE,
1592
  HT_MIGRATION_NONLIVE,
1593
  ])
1594

    
1595
# Cluster Verify steps
1596
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1597
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1598

    
1599
# Cluster Verify error classes
1600
CV_TCLUSTER = "cluster"
1601
CV_TGROUP = "group"
1602
CV_TNODE = "node"
1603
CV_TINSTANCE = "instance"
1604

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

    
1697
CV_ALL_ECODES = compat.UniqueFrozenset([
1698
  CV_ECLUSTERCFG,
1699
  CV_ECLUSTERCERT,
1700
  CV_ECLUSTERFILECHECK,
1701
  CV_ECLUSTERDANGLINGNODES,
1702
  CV_ECLUSTERDANGLINGINST,
1703
  CV_EINSTANCEBADNODE,
1704
  CV_EINSTANCEDOWN,
1705
  CV_EINSTANCELAYOUT,
1706
  CV_EINSTANCEMISSINGDISK,
1707
  CV_EINSTANCEFAULTYDISK,
1708
  CV_EINSTANCEWRONGNODE,
1709
  CV_EINSTANCESPLITGROUPS,
1710
  CV_EINSTANCEPOLICY,
1711
  CV_ENODEDRBD,
1712
  CV_ENODEDRBDHELPER,
1713
  CV_ENODEFILECHECK,
1714
  CV_ENODEHOOKS,
1715
  CV_ENODEHV,
1716
  CV_ENODELVM,
1717
  CV_ENODEN1,
1718
  CV_ENODENET,
1719
  CV_ENODEOS,
1720
  CV_ENODEORPHANINSTANCE,
1721
  CV_ENODEORPHANLV,
1722
  CV_ENODERPC,
1723
  CV_ENODESSH,
1724
  CV_ENODEVERSION,
1725
  CV_ENODESETUP,
1726
  CV_ENODETIME,
1727
  CV_ENODEOOBPATH,
1728
  CV_ENODEUSERSCRIPTS,
1729
  CV_ENODEFILESTORAGEPATHS,
1730
  CV_ENODEFILESTORAGEPATHUNUSABLE,
1731
  CV_ENODESHAREDFILESTORAGEPATHUNUSABLE,
1732
  ])
1733

    
1734
CV_ALL_ECODES_STRINGS = \
1735
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1736

    
1737
# Node verify constants
1738
NV_BRIDGES = "bridges"
1739
NV_DRBDHELPER = "drbd-helper"
1740
NV_DRBDVERSION = "drbd-version"
1741
NV_DRBDLIST = "drbd-list"
1742
NV_EXCLUSIVEPVS = "exclusive-pvs"
1743
NV_FILELIST = "filelist"
1744
NV_ACCEPTED_STORAGE_PATHS = "allowed-file-storage-paths"
1745
NV_FILE_STORAGE_PATH = "file-storage-path"
1746
NV_SHARED_FILE_STORAGE_PATH = "shared-file-storage-path"
1747
NV_HVINFO = "hvinfo"
1748
NV_HVPARAMS = "hvparms"
1749
NV_HYPERVISOR = "hypervisor"
1750
NV_INSTANCELIST = "instancelist"
1751
NV_LVLIST = "lvlist"
1752
NV_MASTERIP = "master-ip"
1753
NV_NODELIST = "nodelist"
1754
NV_NODENETTEST = "node-net-test"
1755
NV_NODESETUP = "nodesetup"
1756
NV_OOB_PATHS = "oob-paths"
1757
NV_OSLIST = "oslist"
1758
NV_PVLIST = "pvlist"
1759
NV_TIME = "time"
1760
NV_USERSCRIPTS = "user-scripts"
1761
NV_VERSION = "version"
1762
NV_VGLIST = "vglist"
1763
NV_VMNODES = "vmnodes"
1764

    
1765
# Instance status
1766
INSTST_RUNNING = "running"
1767
INSTST_ADMINDOWN = "ADMIN_down"
1768
INSTST_ADMINOFFLINE = "ADMIN_offline"
1769
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1770
INSTST_NODEDOWN = "ERROR_nodedown"
1771
INSTST_WRONGNODE = "ERROR_wrongnode"
1772
INSTST_ERRORUP = "ERROR_up"
1773
INSTST_ERRORDOWN = "ERROR_down"
1774
INSTST_ALL = compat.UniqueFrozenset([
1775
  INSTST_RUNNING,
1776
  INSTST_ADMINDOWN,
1777
  INSTST_ADMINOFFLINE,
1778
  INSTST_NODEOFFLINE,
1779
  INSTST_NODEDOWN,
1780
  INSTST_WRONGNODE,
1781
  INSTST_ERRORUP,
1782
  INSTST_ERRORDOWN,
1783
  ])
1784

    
1785
# Admin states
1786
ADMINST_UP = _constants.ADMINST_UP
1787
ADMINST_DOWN = _constants.ADMINST_DOWN
1788
ADMINST_OFFLINE = _constants.ADMINST_OFFLINE
1789
ADMINST_ALL = _constants.ADMINST_ALL
1790

    
1791
# Node roles
1792
NR_REGULAR = "R"
1793
NR_MASTER = "M"
1794
NR_MCANDIDATE = "C"
1795
NR_DRAINED = "D"
1796
NR_OFFLINE = "O"
1797
NR_ALL = compat.UniqueFrozenset([
1798
  NR_REGULAR,
1799
  NR_MASTER,
1800
  NR_MCANDIDATE,
1801
  NR_DRAINED,
1802
  NR_OFFLINE,
1803
  ])
1804

    
1805
# SSL certificate check constants (in days)
1806
SSL_CERT_EXPIRATION_WARN = 30
1807
SSL_CERT_EXPIRATION_ERROR = 7
1808

    
1809
# Allocator framework constants
1810
IALLOCATOR_VERSION = 2
1811
IALLOCATOR_DIR_IN = "in"
1812
IALLOCATOR_DIR_OUT = "out"
1813
VALID_IALLOCATOR_DIRECTIONS = compat.UniqueFrozenset([
1814
  IALLOCATOR_DIR_IN,
1815
  IALLOCATOR_DIR_OUT,
1816
  ])
1817
IALLOCATOR_MODE_ALLOC = "allocate"
1818
IALLOCATOR_MODE_RELOC = "relocate"
1819
IALLOCATOR_MODE_CHG_GROUP = "change-group"
1820
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
1821
IALLOCATOR_MODE_MULTI_ALLOC = "multi-allocate"
1822
VALID_IALLOCATOR_MODES = compat.UniqueFrozenset([
1823
  IALLOCATOR_MODE_ALLOC,
1824
  IALLOCATOR_MODE_RELOC,
1825
  IALLOCATOR_MODE_CHG_GROUP,
1826
  IALLOCATOR_MODE_NODE_EVAC,
1827
  IALLOCATOR_MODE_MULTI_ALLOC,
1828
  ])
1829
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
1830
DEFAULT_IALLOCATOR_SHORTCUT = "."
1831

    
1832
IALLOCATOR_NEVAC_PRI = "primary-only"
1833
IALLOCATOR_NEVAC_SEC = "secondary-only"
1834
IALLOCATOR_NEVAC_ALL = "all"
1835
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1836
  IALLOCATOR_NEVAC_PRI,
1837
  IALLOCATOR_NEVAC_SEC,
1838
  IALLOCATOR_NEVAC_ALL,
1839
  ])
1840

    
1841
# Node evacuation
1842
NODE_EVAC_PRI = "primary-only"
1843
NODE_EVAC_SEC = "secondary-only"
1844
NODE_EVAC_ALL = "all"
1845
NODE_EVAC_MODES = compat.UniqueFrozenset([
1846
  NODE_EVAC_PRI,
1847
  NODE_EVAC_SEC,
1848
  NODE_EVAC_ALL,
1849
  ])
1850

    
1851
# Job queue
1852
JOB_QUEUE_VERSION = 1
1853
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1854
JOB_QUEUE_FILES_PERMS = 0640
1855

    
1856
JOB_ID_TEMPLATE = r"\d+"
1857
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1858

    
1859
# unchanged job return
1860
JOB_NOTCHANGED = "nochange"
1861

    
1862
# Job status
1863
JOB_STATUS_QUEUED = "queued"
1864
JOB_STATUS_WAITING = "waiting"
1865
JOB_STATUS_CANCELING = "canceling"
1866
JOB_STATUS_RUNNING = "running"
1867
JOB_STATUS_CANCELED = "canceled"
1868
JOB_STATUS_SUCCESS = "success"
1869
JOB_STATUS_ERROR = "error"
1870
JOBS_PENDING = compat.UniqueFrozenset([
1871
  JOB_STATUS_QUEUED,
1872
  JOB_STATUS_WAITING,
1873
  JOB_STATUS_CANCELING,
1874
  ])
1875
JOBS_FINALIZED = compat.UniqueFrozenset([
1876
  JOB_STATUS_CANCELED,
1877
  JOB_STATUS_SUCCESS,
1878
  JOB_STATUS_ERROR,
1879
  ])
1880
JOB_STATUS_ALL = compat.UniqueFrozenset([
1881
  JOB_STATUS_RUNNING,
1882
  ]) | JOBS_PENDING | JOBS_FINALIZED
1883

    
1884
# OpCode status
1885
# not yet finalized
1886
OP_STATUS_QUEUED = "queued"
1887
OP_STATUS_WAITING = "waiting"
1888
OP_STATUS_CANCELING = "canceling"
1889
OP_STATUS_RUNNING = "running"
1890
# finalized
1891
OP_STATUS_CANCELED = "canceled"
1892
OP_STATUS_SUCCESS = "success"
1893
OP_STATUS_ERROR = "error"
1894
OPS_FINALIZED = compat.UniqueFrozenset([
1895
  OP_STATUS_CANCELED,
1896
  OP_STATUS_SUCCESS,
1897
  OP_STATUS_ERROR,
1898
  ])
1899

    
1900
# OpCode priority
1901
OP_PRIO_LOWEST = +19
1902
OP_PRIO_HIGHEST = -20
1903

    
1904
OP_PRIO_LOW = +10
1905
OP_PRIO_NORMAL = 0
1906
OP_PRIO_HIGH = -10
1907

    
1908
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1909
  OP_PRIO_LOW,
1910
  OP_PRIO_NORMAL,
1911
  OP_PRIO_HIGH,
1912
  ])
1913

    
1914
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1915

    
1916
# Lock recalculate mode
1917
LOCKS_REPLACE = "replace"
1918
LOCKS_APPEND = "append"
1919

    
1920
# Lock timeout (sum) before we should go into blocking acquire (still
1921
# can be reset by priority change); computed as max time (10 hours)
1922
# before we should actually go into blocking acquire given that we
1923
# start from default priority level; in seconds
1924
# TODO
1925
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / (OP_PRIO_DEFAULT - OP_PRIO_HIGHEST)
1926
LOCK_ATTEMPTS_MAXWAIT = 15.0
1927
LOCK_ATTEMPTS_MINWAIT = 1.0
1928

    
1929
# Execution log types
1930
ELOG_MESSAGE = "message"
1931
ELOG_REMOTE_IMPORT = "remote-import"
1932
ELOG_JQUEUE_TEST = "jqueue-test"
1933

    
1934
# /etc/hosts modification
1935
ETC_HOSTS_ADD = "add"
1936
ETC_HOSTS_REMOVE = "remove"
1937

    
1938
# Job queue test
1939
JQT_MSGPREFIX = "TESTMSG="
1940
JQT_EXPANDNAMES = "expandnames"
1941
JQT_EXEC = "exec"
1942
JQT_LOGMSG = "logmsg"
1943
JQT_STARTMSG = "startmsg"
1944
JQT_ALL = compat.UniqueFrozenset([
1945
  JQT_EXPANDNAMES,
1946
  JQT_EXEC,
1947
  JQT_LOGMSG,
1948
  JQT_STARTMSG,
1949
  ])
1950

    
1951
# Query resources
1952
QR_CLUSTER = "cluster"
1953
QR_INSTANCE = "instance"
1954
QR_NODE = "node"
1955
QR_LOCK = "lock"
1956
QR_GROUP = "group"
1957
QR_OS = "os"
1958
QR_JOB = "job"
1959
QR_EXPORT = "export"
1960
QR_NETWORK = "network"
1961
QR_EXTSTORAGE = "extstorage"
1962

    
1963
#: List of resources which can be queried using L{opcodes.OpQuery}
1964
QR_VIA_OP = compat.UniqueFrozenset([
1965
  QR_CLUSTER,
1966
  QR_INSTANCE,
1967
  QR_NODE,
1968
  QR_GROUP,
1969
  QR_OS,
1970
  QR_EXPORT,
1971
  QR_NETWORK,
1972
  QR_EXTSTORAGE,
1973
  ])
1974

    
1975
#: List of resources which can be queried using Local UniX Interface
1976
QR_VIA_LUXI = QR_VIA_OP.union([
1977
  QR_LOCK,
1978
  QR_JOB,
1979
  ])
1980

    
1981
#: List of resources which can be queried using RAPI
1982
QR_VIA_RAPI = QR_VIA_LUXI
1983

    
1984
# Query field types
1985
QFT_UNKNOWN = "unknown"
1986
QFT_TEXT = "text"
1987
QFT_BOOL = "bool"
1988
QFT_NUMBER = "number"
1989
QFT_UNIT = "unit"
1990
QFT_TIMESTAMP = "timestamp"
1991
QFT_OTHER = "other"
1992

    
1993
#: All query field types
1994
QFT_ALL = compat.UniqueFrozenset([
1995
  QFT_UNKNOWN,
1996
  QFT_TEXT,
1997
  QFT_BOOL,
1998
  QFT_NUMBER,
1999
  QFT_UNIT,
2000
  QFT_TIMESTAMP,
2001
  QFT_OTHER,
2002
  ])
2003

    
2004
# Query result field status (don't change or reuse values as they're used by
2005
# clients)
2006
#: Normal field status
2007
RS_NORMAL = 0
2008
#: Unknown field
2009
RS_UNKNOWN = 1
2010
#: No data (e.g. RPC error), can be used instead of L{RS_OFFLINE}
2011
RS_NODATA = 2
2012
#: Value unavailable/unsupported for item; if this field is supported
2013
#: but we cannot get the data for the moment, RS_NODATA or
2014
#: RS_OFFLINE should be used
2015
RS_UNAVAIL = 3
2016
#: Resource marked offline
2017
RS_OFFLINE = 4
2018

    
2019
RS_ALL = compat.UniqueFrozenset([
2020
  RS_NORMAL,
2021
  RS_UNKNOWN,
2022
  RS_NODATA,
2023
  RS_UNAVAIL,
2024
  RS_OFFLINE,
2025
  ])
2026

    
2027
#: Dictionary with special field cases and their verbose/terse formatting
2028
RSS_DESCRIPTION = {
2029
  RS_UNKNOWN: ("(unknown)", "??"),
2030
  RS_NODATA: ("(nodata)", "?"),
2031
  RS_OFFLINE: ("(offline)", "*"),
2032
  RS_UNAVAIL: ("(unavail)", "-"),
2033
  }
2034

    
2035
# max dynamic devices
2036
MAX_NICS = 8
2037
MAX_DISKS = 16
2038

    
2039
# SSCONF file prefix
2040
SSCONF_FILEPREFIX = "ssconf_"
2041
# SSCONF keys
2042
SS_CLUSTER_NAME = "cluster_name"
2043
SS_CLUSTER_TAGS = "cluster_tags"
2044
SS_FILE_STORAGE_DIR = "file_storage_dir"
2045
SS_SHARED_FILE_STORAGE_DIR = "shared_file_storage_dir"
2046
SS_MASTER_CANDIDATES = "master_candidates"
2047
SS_MASTER_CANDIDATES_IPS = "master_candidates_ips"
2048
SS_MASTER_IP = "master_ip"
2049
SS_MASTER_NETDEV = "master_netdev"
2050
SS_MASTER_NETMASK = "master_netmask"
2051
SS_MASTER_NODE = "master_node"
2052
SS_NODE_LIST = "node_list"
2053
SS_NODE_PRIMARY_IPS = "node_primary_ips"
2054
SS_NODE_SECONDARY_IPS = "node_secondary_ips"
2055
SS_OFFLINE_NODES = "offline_nodes"
2056
SS_ONLINE_NODES = "online_nodes"
2057
SS_PRIMARY_IP_FAMILY = "primary_ip_family"
2058
SS_INSTANCE_LIST = "instance_list"
2059
SS_RELEASE_VERSION = "release_version"
2060
SS_HYPERVISOR_LIST = "hypervisor_list"
2061
SS_MAINTAIN_NODE_HEALTH = "maintain_node_health"
2062
SS_UID_POOL = "uid_pool"
2063
SS_NODEGROUPS = "nodegroups"
2064
SS_NETWORKS = "networks"
2065

    
2066
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2067
SS_HVPARAMS_PREF = "hvparams_"
2068

    
2069
# Hvparams keys:
2070
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2071
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2072
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2073
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2074
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2075
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2076

    
2077
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2078
  SS_HVPARAMS_XEN_PVM,
2079
  SS_HVPARAMS_XEN_FAKE,
2080
  SS_HVPARAMS_XEN_HVM,
2081
  SS_HVPARAMS_XEN_KVM,
2082
  SS_HVPARAMS_XEN_CHROOT,
2083
  SS_HVPARAMS_XEN_LXC,
2084
  ])
2085

    
2086
SS_FILE_PERMS = 0444
2087

    
2088
# cluster wide default parameters
2089
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2090

    
2091
HVC_DEFAULTS = {
2092
  HT_XEN_PVM: {
2093
    HV_USE_BOOTLOADER: False,
2094
    HV_BOOTLOADER_PATH: XEN_BOOTLOADER,
2095
    HV_BOOTLOADER_ARGS: "",
2096
    HV_KERNEL_PATH: XEN_KERNEL,
2097
    HV_INITRD_PATH: "",
2098
    HV_ROOT_PATH: "/dev/xvda1",
2099
    HV_KERNEL_ARGS: "ro",
2100
    HV_MIGRATION_PORT: 8002,
2101
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2102
    HV_BLOCKDEV_PREFIX: "sd",
2103
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2104
    HV_CPU_MASK: CPU_PINNING_ALL,
2105
    HV_CPU_CAP: 0,
2106
    HV_CPU_WEIGHT: 256,
2107
    HV_VIF_SCRIPT: "",
2108
    HV_XEN_CMD: XEN_CMD_XM,
2109
    },
2110
  HT_XEN_HVM: {
2111
    HV_BOOT_ORDER: "cd",
2112
    HV_CDROM_IMAGE_PATH: "",
2113
    HV_NIC_TYPE: HT_NIC_RTL8139,
2114
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2115
    HV_VNC_BIND_ADDRESS: IP4_ADDRESS_ANY,
2116
    HV_VNC_PASSWORD_FILE: pathutils.VNC_PASSWORD_FILE,
2117
    HV_ACPI: True,
2118
    HV_PAE: True,
2119
    HV_KERNEL_PATH: "/usr/lib/xen/boot/hvmloader",
2120
    HV_DEVICE_MODEL: "/usr/lib/xen/bin/qemu-dm",
2121
    HV_MIGRATION_PORT: 8002,
2122
    HV_MIGRATION_MODE: HT_MIGRATION_NONLIVE,
2123
    HV_USE_LOCALTIME: False,
2124
    HV_BLOCKDEV_PREFIX: "hd",
2125
    HV_PASSTHROUGH: "",
2126
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2127
    HV_CPU_MASK: CPU_PINNING_ALL,
2128
    HV_CPU_CAP: 0,
2129
    HV_CPU_WEIGHT: 256,
2130
    HV_VIF_TYPE: HT_HVM_VIF_IOEMU,
2131
    HV_VIF_SCRIPT: "",
2132
    HV_VIRIDIAN: False,
2133
    HV_XEN_CMD: XEN_CMD_XM,
2134
    },
2135
  HT_KVM: {
2136
    HV_KVM_PATH: KVM_PATH,
2137
    HV_KERNEL_PATH: KVM_KERNEL,
2138
    HV_INITRD_PATH: "",
2139
    HV_KERNEL_ARGS: "ro",
2140
    HV_ROOT_PATH: "/dev/vda1",
2141
    HV_ACPI: True,
2142
    HV_SERIAL_CONSOLE: True,
2143
    HV_SERIAL_SPEED: 38400,
2144
    HV_VNC_BIND_ADDRESS: "",
2145
    HV_VNC_TLS: False,
2146
    HV_VNC_X509: "",
2147
    HV_VNC_X509_VERIFY: False,
2148
    HV_VNC_PASSWORD_FILE: "",
2149
    HV_KVM_SPICE_BIND: "",
2150
    HV_KVM_SPICE_IP_VERSION: IFACE_NO_IP_VERSION_SPECIFIED,
2151
    HV_KVM_SPICE_PASSWORD_FILE: "",
2152
    HV_KVM_SPICE_LOSSLESS_IMG_COMPR: "",
2153
    HV_KVM_SPICE_JPEG_IMG_COMPR: "",
2154
    HV_KVM_SPICE_ZLIB_GLZ_IMG_COMPR: "",
2155
    HV_KVM_SPICE_STREAMING_VIDEO_DETECTION: "",
2156
    HV_KVM_SPICE_AUDIO_COMPR: True,
2157
    HV_KVM_SPICE_USE_TLS: False,
2158
    HV_KVM_SPICE_TLS_CIPHERS: OPENSSL_CIPHERS,
2159
    HV_KVM_SPICE_USE_VDAGENT: True,
2160
    HV_KVM_FLOPPY_IMAGE_PATH: "",
2161
    HV_CDROM_IMAGE_PATH: "",
2162
    HV_KVM_CDROM2_IMAGE_PATH: "",
2163
    HV_BOOT_ORDER: HT_BO_DISK,
2164
    HV_NIC_TYPE: HT_NIC_PARAVIRTUAL,
2165
    HV_DISK_TYPE: HT_DISK_PARAVIRTUAL,
2166
    HV_KVM_CDROM_DISK_TYPE: "",
2167
    HV_USB_MOUSE: "",
2168
    HV_KEYMAP: "",
2169
    HV_MIGRATION_PORT: 8102,
2170
    HV_MIGRATION_BANDWIDTH: 32, # MiB/s
2171
    HV_MIGRATION_DOWNTIME: 30,  # ms
2172
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2173
    HV_USE_LOCALTIME: False,
2174
    HV_DISK_CACHE: HT_CACHE_DEFAULT,
2175
    HV_SECURITY_MODEL: HT_SM_NONE,
2176
    HV_SECURITY_DOMAIN: "",
2177
    HV_KVM_FLAG: "",
2178
    HV_VHOST_NET: False,
2179
    HV_KVM_USE_CHROOT: False,
2180
    HV_MEM_PATH: "",
2181
    HV_REBOOT_BEHAVIOR: INSTANCE_REBOOT_ALLOWED,
2182
    HV_CPU_MASK: CPU_PINNING_ALL,
2183
    HV_CPU_TYPE: "",
2184
    HV_CPU_CORES: 0,
2185
    HV_CPU_THREADS: 0,
2186
    HV_CPU_SOCKETS: 0,
2187
    HV_SOUNDHW: "",
2188
    HV_USB_DEVICES: "",
2189
    HV_VGA: "",
2190
    HV_KVM_EXTRA: "",
2191
    HV_KVM_MACHINE_VERSION: "",
2192
    HV_VNET_HDR: True,
2193
    },
2194
  HT_FAKE: {
2195
    HV_MIGRATION_MODE: HT_MIGRATION_LIVE,
2196
  },
2197
  HT_CHROOT: {
2198
    HV_INIT_SCRIPT: "/ganeti-chroot",
2199
    },
2200
  HT_LXC: {
2201
    HV_CPU_MASK: "",
2202
    },
2203
  }
2204

    
2205
HVC_GLOBALS = compat.UniqueFrozenset([
2206
  HV_MIGRATION_PORT,
2207
  HV_MIGRATION_BANDWIDTH,
2208
  HV_MIGRATION_MODE,
2209
  HV_XEN_CMD,
2210
  ])
2211

    
2212
BEC_DEFAULTS = {
2213
  BE_MINMEM: 128,
2214
  BE_MAXMEM: 128,
2215
  BE_VCPUS: 1,
2216
  BE_AUTO_BALANCE: True,
2217
  BE_ALWAYS_FAILOVER: False,
2218
  BE_SPINDLE_USE: 1,
2219
  }
2220

    
2221
NDC_DEFAULTS = {
2222
  ND_OOB_PROGRAM: "",
2223
  ND_SPINDLE_COUNT: 1,
2224
  ND_EXCLUSIVE_STORAGE: False,
2225
  ND_OVS: False,
2226
  ND_OVS_NAME: DEFAULT_OVS,
2227
  ND_OVS_LINK: ""
2228
  }
2229

    
2230
NDC_GLOBALS = compat.UniqueFrozenset([
2231
  ND_EXCLUSIVE_STORAGE,
2232
  ])
2233

    
2234
DISK_LD_DEFAULTS = {
2235
  LD_DRBD8: {
2236
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2237
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2238
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2239
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2240
    LDP_DISK_CUSTOM: "",
2241
    LDP_NET_CUSTOM: "",
2242
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2243
    LDP_DYNAMIC_RESYNC: False,
2244

    
2245
    # The default values for the DRBD dynamic resync speed algorithm
2246
    # are taken from the drbsetup 8.3.11 man page, except for
2247
    # c-plan-ahead (that we don't need to set to 0, because we have a
2248
    # separate option to enable it) and for c-max-rate, that we cap to
2249
    # the default value for the static resync rate.
2250
    LDP_PLAN_AHEAD: 20, # ds
2251
    LDP_FILL_TARGET: 0, # sectors
2252
    LDP_DELAY_TARGET: 1, # ds
2253
    LDP_MAX_RATE: CLASSIC_DRBD_SYNC_SPEED, # KiB/s
2254
    LDP_MIN_RATE: 4 * 1024, # KiB/s
2255
    },
2256
  LD_LV: {
2257
    LDP_STRIPES: _autoconf.LVM_STRIPECOUNT
2258
    },
2259
  LD_FILE: {},
2260
  LD_BLOCKDEV: {},
2261
  LD_RBD: {
2262
    LDP_POOL: "rbd"
2263
    },
2264
  LD_EXT: {},
2265
  }
2266

    
2267
# readability shortcuts
2268
_LV_DEFAULTS = DISK_LD_DEFAULTS[LD_LV]
2269
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[LD_DRBD8]
2270

    
2271
DISK_DT_DEFAULTS = {
2272
  DT_PLAIN: {
2273
    LV_STRIPES: DISK_LD_DEFAULTS[LD_LV][LDP_STRIPES],
2274
    },
2275
  DT_DRBD8: {
2276
    DRBD_RESYNC_RATE: _DRBD_DEFAULTS[LDP_RESYNC_RATE],
2277
    DRBD_DATA_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2278
    DRBD_META_STRIPES: _LV_DEFAULTS[LDP_STRIPES],
2279
    DRBD_DISK_BARRIERS: _DRBD_DEFAULTS[LDP_BARRIERS],
2280
    DRBD_META_BARRIERS: _DRBD_DEFAULTS[LDP_NO_META_FLUSH],
2281
    DRBD_DEFAULT_METAVG: _DRBD_DEFAULTS[LDP_DEFAULT_METAVG],
2282
    DRBD_DISK_CUSTOM: _DRBD_DEFAULTS[LDP_DISK_CUSTOM],
2283
    DRBD_NET_CUSTOM: _DRBD_DEFAULTS[LDP_NET_CUSTOM],
2284
    DRBD_PROTOCOL: _DRBD_DEFAULTS[LDP_PROTOCOL],
2285
    DRBD_DYNAMIC_RESYNC: _DRBD_DEFAULTS[LDP_DYNAMIC_RESYNC],
2286
    DRBD_PLAN_AHEAD: _DRBD_DEFAULTS[LDP_PLAN_AHEAD],
2287
    DRBD_FILL_TARGET: _DRBD_DEFAULTS[LDP_FILL_TARGET],
2288
    DRBD_DELAY_TARGET: _DRBD_DEFAULTS[LDP_DELAY_TARGET],
2289
    DRBD_MAX_RATE: _DRBD_DEFAULTS[LDP_MAX_RATE],
2290
    DRBD_MIN_RATE: _DRBD_DEFAULTS[LDP_MIN_RATE],
2291
    },
2292
  DT_DISKLESS: {},
2293
  DT_FILE: {},
2294
  DT_SHARED_FILE: {},
2295
  DT_BLOCK: {},
2296
  DT_RBD: {
2297
    RBD_POOL: DISK_LD_DEFAULTS[LD_RBD][LDP_POOL]
2298
    },
2299
  DT_EXT: {},
2300
  }
2301

    
2302
# we don't want to export the shortcuts
2303
del _LV_DEFAULTS, _DRBD_DEFAULTS
2304

    
2305
NICC_DEFAULTS = {
2306
  NIC_MODE: NIC_MODE_BRIDGED,
2307
  NIC_LINK: DEFAULT_BRIDGE,
2308
  NIC_VLAN: VALUE_HS_NOTHING,
2309
  }
2310

    
2311
# All of the following values are quite arbitrarily - there are no
2312
# "good" defaults, these must be customised per-site
2313
ISPECS_MINMAX_DEFAULTS = {
2314
  ISPECS_MIN: {
2315
    ISPEC_MEM_SIZE: 128,
2316
    ISPEC_CPU_COUNT: 1,
2317
    ISPEC_DISK_COUNT: 1,
2318
    ISPEC_DISK_SIZE: 1024,
2319
    ISPEC_NIC_COUNT: 1,
2320
    ISPEC_SPINDLE_USE: 1,
2321
    },
2322
  ISPECS_MAX: {
2323
    ISPEC_MEM_SIZE: 32768,
2324
    ISPEC_CPU_COUNT: 8,
2325
    ISPEC_DISK_COUNT: MAX_DISKS,
2326
    ISPEC_DISK_SIZE: 1024 * 1024,
2327
    ISPEC_NIC_COUNT: MAX_NICS,
2328
    ISPEC_SPINDLE_USE: 12,
2329
    },
2330
  }
2331
IPOLICY_DEFAULTS = {
2332
  ISPECS_MINMAX: [ISPECS_MINMAX_DEFAULTS],
2333
  ISPECS_STD: {
2334
    ISPEC_MEM_SIZE: 128,
2335
    ISPEC_CPU_COUNT: 1,
2336
    ISPEC_DISK_COUNT: 1,
2337
    ISPEC_DISK_SIZE: 1024,
2338
    ISPEC_NIC_COUNT: 1,
2339
    ISPEC_SPINDLE_USE: 1,
2340
    },
2341
  IPOLICY_DTS: list(DISK_TEMPLATES),
2342
  IPOLICY_VCPU_RATIO: 4.0,
2343
  IPOLICY_SPINDLE_RATIO: 32.0,
2344
  }
2345

    
2346
MASTER_POOL_SIZE_DEFAULT = 10
2347

    
2348
# Exclusive storage:
2349
# Error margin used to compare physical disks
2350
PART_MARGIN = .01
2351
# Space reserved when creating instance disks
2352
PART_RESERVED = .02
2353

    
2354
CONFD_PROTOCOL_VERSION = 1
2355

    
2356
CONFD_REQ_PING = 0
2357
CONFD_REQ_NODE_ROLE_BYNAME = 1
2358
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2359
CONFD_REQ_CLUSTER_MASTER = 3
2360
CONFD_REQ_NODE_PIP_LIST = 4
2361
CONFD_REQ_MC_PIP_LIST = 5
2362
CONFD_REQ_INSTANCES_IPS_LIST = 6
2363
CONFD_REQ_NODE_DRBD = 7
2364
CONFD_REQ_NODE_INSTANCES = 8
2365

    
2366
# Confd request query fields. These are used to narrow down queries.
2367
# These must be strings rather than integers, because json-encoding
2368
# converts them to strings anyway, as they're used as dict-keys.
2369
CONFD_REQQ_LINK = "0"
2370
CONFD_REQQ_IP = "1"
2371
CONFD_REQQ_IPLIST = "2"
2372
CONFD_REQQ_FIELDS = "3"
2373

    
2374
CONFD_REQFIELD_NAME = "0"
2375
CONFD_REQFIELD_IP = "1"
2376
CONFD_REQFIELD_MNODE_PIP = "2"
2377

    
2378
CONFD_REQS = compat.UniqueFrozenset([
2379
  CONFD_REQ_PING,
2380
  CONFD_REQ_NODE_ROLE_BYNAME,
2381
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2382
  CONFD_REQ_CLUSTER_MASTER,
2383
  CONFD_REQ_NODE_PIP_LIST,
2384
  CONFD_REQ_MC_PIP_LIST,
2385
  CONFD_REQ_INSTANCES_IPS_LIST,
2386
  CONFD_REQ_NODE_DRBD,
2387
  ])
2388

    
2389
CONFD_REPL_STATUS_OK = 0
2390
CONFD_REPL_STATUS_ERROR = 1
2391
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2392

    
2393
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2394
  CONFD_REPL_STATUS_OK,
2395
  CONFD_REPL_STATUS_ERROR,
2396
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2397
  ])
2398

    
2399
(CONFD_NODE_ROLE_MASTER,
2400
 CONFD_NODE_ROLE_CANDIDATE,
2401
 CONFD_NODE_ROLE_OFFLINE,
2402
 CONFD_NODE_ROLE_DRAINED,
2403
 CONFD_NODE_ROLE_REGULAR,
2404
 ) = range(5)
2405

    
2406
# A few common errors for confd
2407
CONFD_ERROR_UNKNOWN_ENTRY = 1
2408
CONFD_ERROR_INTERNAL = 2
2409
CONFD_ERROR_ARGUMENT = 3
2410

    
2411
# Each request is "salted" by the current timestamp.
2412
# This constants decides how many seconds of skew to accept.
2413
# TODO: make this a default and allow the value to be more configurable
2414
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2415

    
2416
# When we haven't reloaded the config for more than this amount of
2417
# seconds, we force a test to see if inotify is betraying us. Using a
2418
# prime number to ensure we get less chance of 'same wakeup' with
2419
# other processes.
2420
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2421

    
2422
# If we receive more than one update in this amount of microseconds,
2423
# we move to polling every RATELIMIT seconds, rather than relying on
2424
# inotify, to be able to serve more requests.
2425
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2426

    
2427
# Magic number prepended to all confd queries.
2428
# This allows us to distinguish different types of confd protocols and handle
2429
# them. For example by changing this we can move the whole payload to be
2430
# compressed, or move away from json.
2431
CONFD_MAGIC_FOURCC = "plj0"
2432

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

    
2438
# Timeout in seconds to expire pending query request in the confd client
2439
# library. We don't actually expect any answer more than 10 seconds after we
2440
# sent a request.
2441
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2442

    
2443
# Maximum UDP datagram size.
2444
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2445
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2446
#   (assuming we can't use jumbo frames)
2447
# We just set this to 60K, which should be enough
2448
MAX_UDP_DATA_SIZE = 61440
2449

    
2450
# User-id pool minimum/maximum acceptable user-ids.
2451
UIDPOOL_UID_MIN = 0
2452
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2453

    
2454
# Name or path of the pgrep command
2455
PGREP = "pgrep"
2456

    
2457
# Name of the node group that gets created at cluster init or upgrade
2458
INITIAL_NODE_GROUP_NAME = "default"
2459

    
2460
# Possible values for NodeGroup.alloc_policy
2461
ALLOC_POLICY_PREFERRED = "preferred"
2462
ALLOC_POLICY_LAST_RESORT = "last_resort"
2463
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2464
VALID_ALLOC_POLICIES = [
2465
  ALLOC_POLICY_PREFERRED,
2466
  ALLOC_POLICY_LAST_RESORT,
2467
  ALLOC_POLICY_UNALLOCABLE,
2468
  ]
2469

    
2470
# Temporary external/shared storage parameters
2471
BLOCKDEV_DRIVER_MANUAL = "manual"
2472

    
2473
# qemu-img path, required for ovfconverter
2474
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2475

    
2476
# Whether htools was enabled at compilation time
2477
HTOOLS = _autoconf.HTOOLS
2478
# The hail iallocator
2479
IALLOC_HAIL = "hail"
2480

    
2481
# Fake opcodes for functions that have hooks attached to them via
2482
# backend.RunLocalHooks
2483
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2484
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2485

    
2486
# SSH key types
2487
SSHK_RSA = "rsa"
2488
SSHK_DSA = "dsa"
2489
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2490

    
2491
# SSH authorized key types
2492
SSHAK_RSA = "ssh-rsa"
2493
SSHAK_DSS = "ssh-dss"
2494
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2495

    
2496
# SSH setup
2497
SSHS_CLUSTER_NAME = "cluster_name"
2498
SSHS_SSH_HOST_KEY = "ssh_host_key"
2499
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2500
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2501

    
2502
#: Key files for SSH daemon
2503
SSH_DAEMON_KEYFILES = {
2504
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2505
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2506
  }
2507

    
2508
# Node daemon setup
2509
NDS_CLUSTER_NAME = "cluster_name"
2510
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2511
NDS_SSCONF = "ssconf"
2512
NDS_START_NODE_DAEMON = "start_node_daemon"
2513

    
2514
# Path generating random UUID
2515
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2516

    
2517
# Regex string for verifying a UUID
2518
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2519

    
2520
# Auto-repair tag prefixes
2521
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2522
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2523
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_PREFIX + "suspend:"
2524
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2525
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2526

    
2527
# Auto-repair levels
2528
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2529
AUTO_REPAIR_MIGRATE = "migrate"
2530
AUTO_REPAIR_FAILOVER = "failover"
2531
AUTO_REPAIR_REINSTALL = "reinstall"
2532
AUTO_REPAIR_ALL_TYPES = [
2533
  AUTO_REPAIR_FIX_STORAGE,
2534
  AUTO_REPAIR_MIGRATE,
2535
  AUTO_REPAIR_FAILOVER,
2536
  AUTO_REPAIR_REINSTALL,
2537
]
2538

    
2539
# Auto-repair results
2540
AUTO_REPAIR_SUCCESS = "success"
2541
AUTO_REPAIR_FAILURE = "failure"
2542
AUTO_REPAIR_ENOPERM = "enoperm"
2543
AUTO_REPAIR_ALL_RESULTS = frozenset([
2544
    AUTO_REPAIR_SUCCESS,
2545
    AUTO_REPAIR_FAILURE,
2546
    AUTO_REPAIR_ENOPERM,
2547
])
2548

    
2549
# The version identifier for builtin data collectors
2550
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2551

    
2552
# The reason trail opcode parameter name
2553
OPCODE_REASON = "reason"
2554

    
2555
# The source reasons for the execution of an OpCode
2556
OPCODE_REASON_SRC_CLIENT = "gnt:client"
2557
OPCODE_REASON_SRC_NODED = "gnt:daemon:noded"
2558
OPCODE_REASON_SRC_OPCODE = "gnt:opcode"
2559
OPCODE_REASON_SRC_RLIB2 = "gnt:library:rlib2"
2560
OPCODE_REASON_SRC_USER = "gnt:user"
2561

    
2562
OPCODE_REASON_SOURCES = compat.UniqueFrozenset([
2563
  OPCODE_REASON_SRC_CLIENT,
2564
  OPCODE_REASON_SRC_NODED,
2565
  OPCODE_REASON_SRC_OPCODE,
2566
  OPCODE_REASON_SRC_RLIB2,
2567
  OPCODE_REASON_SRC_USER,
2568
  ])
2569

    
2570
DISKSTATS_FILE = "/proc/diskstats"
2571

    
2572
# CPU load collector variables
2573
STAT_FILE = "/proc/stat"
2574
CPUAVGLOAD_BUFFER_SIZE = 150
2575
CPUAVGLOAD_WINDOW_SIZE = 600
2576

    
2577
# Mond's variable for periodical data collection
2578
MOND_TIME_INTERVAL = 5
2579

    
2580
# Do not re-export imported modules
2581
del re, _vcsversion, _autoconf, _constants, socket, pathutils, compat
2582

    
2583

    
2584
ALLOCATABLE_KEY = "allocatable"
2585
FAILED_KEY = "failed"