constants.py 36.7 KB
Newer Older
Iustin Pop's avatar
Iustin Pop committed
1
#
Iustin Pop's avatar
Iustin Pop committed
2
3
#

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


"""Module holding different constants."""

24
25
import re

26
from ganeti import _autoconf
27

Iustin Pop's avatar
Iustin Pop committed
28
# various versions
29
RELEASE_VERSION = _autoconf.PACKAGE_VERSION
Guido Trotter's avatar
Guido Trotter committed
30
31
OS_API_V10 = 10
OS_API_V15 = 15
32
33
OS_API_V20 = 20
OS_API_VERSIONS = frozenset([OS_API_V10, OS_API_V15, OS_API_V20])
34
VCS_VERSION = _autoconf.VCS_VERSION
Iustin Pop's avatar
Iustin Pop committed
35
EXPORT_VERSION = 0
36
RAPI_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
37

38

39
40
41
42
43
44
45
46
# Format for CONFIG_VERSION:
#   01 03 0123 = 01030123
#   ^^ ^^ ^^^^
#   |  |  + Configuration version/revision
#   |  + Minor version
#   + Major version
#
# It stored as an integer. Make sure not to write an octal number.
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

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

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

  Returns: int representing version number

  """
  assert isinstance(major, int)
  assert isinstance(minor, int)
  assert isinstance(revision, int)
  return (1000000 * major +
            10000 * minor +
                1 * revision)


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

  Returns: tuple; (major, minor, revision)

  """
  assert isinstance(version, int)

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

  return (major, minor, revision)


81
82
83
CONFIG_MAJOR = int(_autoconf.VERSION_MAJOR)
CONFIG_MINOR = int(_autoconf.VERSION_MINOR)
CONFIG_REVISION = 0
84
CONFIG_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, CONFIG_REVISION)
Iustin Pop's avatar
Iustin Pop committed
85

86
87
88
#: RPC protocol version
PROTOCOL_VERSION = BuildVersion(CONFIG_MAJOR, CONFIG_MINOR, 0)

89
90
# user separation
DAEMONS_GROUP = _autoconf.DAEMONS_GROUP
91
ADMIN_GROUP = _autoconf.ADMIN_GROUP
92
MASTERD_USER = _autoconf.MASTERD_USER
93
MASTERD_GROUP = _autoconf.MASTERD_GROUP
94
RAPI_USER = _autoconf.RAPI_USER
95
96
97
98
RAPI_GROUP = _autoconf.RAPI_GROUP
CONFD_USER = _autoconf.CONFD_USER
CONFD_GROUP = _autoconf.CONFD_GROUP
NODED_USER = _autoconf.NODED_USER
René Nussbaumer's avatar
René Nussbaumer committed
99
NODED_GROUP = _autoconf.NODED_GROUP
100

101

102
# Wipe
103
104
DD_CMD = "dd"
WIPE_BLOCK_SIZE = 1024**2
105
106
107
MAX_WIPE_CHUNK = 1024 # 1GB
MIN_WIPE_CHUNK_PERCENT = 10

108

Iustin Pop's avatar
Iustin Pop committed
109
# file paths
110
DATA_DIR = _autoconf.LOCALSTATEDIR + "/lib/ganeti"
111
RUN_DIR = _autoconf.LOCALSTATEDIR + "/run"
112
RUN_GANETI_DIR = RUN_DIR + "/ganeti"
113
BDEV_CACHE_DIR = RUN_GANETI_DIR + "/bdev-cache"
114
DISK_LINKS_DIR = RUN_GANETI_DIR + "/instance-disks"
115
RUN_DIRS_MODE = 0775
Guido Trotter's avatar
Guido Trotter committed
116
SOCKET_DIR = RUN_GANETI_DIR + "/socket"
117
SECURE_DIR_MODE = 0700
118
SECURE_FILE_MODE = 0600
119
SOCKET_DIR_MODE = 0750
120
CRYPTO_KEYS_DIR = RUN_GANETI_DIR + "/crypto"
Guido Trotter's avatar
Guido Trotter committed
121
CRYPTO_KEYS_DIR_MODE = SECURE_DIR_MODE
122
123
IMPORT_EXPORT_DIR = RUN_GANETI_DIR + "/import-export"
IMPORT_EXPORT_DIR_MODE = 0755
124
ADOPTABLE_BLOCKDEV_ROOT = "/dev/disk/"
125
126
127
# keep RUN_GANETI_DIR first here, to make sure all get created when the node
# daemon is started (this takes care of RUN_DIR being tmpfs)
SUB_RUN_DIRS = [ RUN_GANETI_DIR, BDEV_CACHE_DIR, DISK_LINKS_DIR ]
Iustin Pop's avatar
Iustin Pop committed
128
LOCK_DIR = _autoconf.LOCALSTATEDIR + "/lock"
129
SSCONF_LOCK_FILE = LOCK_DIR + "/ganeti-ssconf.lock"
130
131
132
# User-id pool lock directory
# The user-ids that are in use have a corresponding lock file in this directory
UIDPOOL_LOCKDIR = RUN_GANETI_DIR + "/uid-pool"
Iustin Pop's avatar
Iustin Pop committed
133
CLUSTER_CONF_FILE = DATA_DIR + "/config.data"
134
NODED_CERT_FILE = DATA_DIR + "/server.pem"
135
RAPI_CERT_FILE = DATA_DIR + "/rapi.pem"
136
CONFD_HMAC_KEY = DATA_DIR + "/hmac.key"
Michael Hanselmann's avatar
Michael Hanselmann committed
137
CLUSTER_DOMAIN_SECRET_FILE = DATA_DIR + "/cluster-domain-secret"
138
WATCHER_STATEFILE = DATA_DIR + "/watcher.data"
139
WATCHER_PAUSEFILE = DATA_DIR + "/watcher.pause"
140
INSTANCE_UPFILE = RUN_GANETI_DIR + "/instance-status"
Iustin Pop's avatar
Iustin Pop committed
141
SSH_KNOWN_HOSTS_FILE = DATA_DIR + "/known_hosts"
142
RAPI_USERS_FILE = DATA_DIR + "/rapi/users"
143
QUEUE_DIR = DATA_DIR + "/queue"
144
DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util"
145
SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh"
146
KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup"
147
ETC_HOSTS = "/etc/hosts"
148
DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR
149
DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR
150
ENABLE_FILE_STORAGE = _autoconf.ENABLE_FILE_STORAGE
151
ENABLE_SHARED_FILE_STORAGE = _autoconf.ENABLE_SHARED_FILE_STORAGE
152
SYSCONFDIR = _autoconf.SYSCONFDIR
153
TOOLSDIR = _autoconf.TOOLSDIR
154
CONF_DIR = SYSCONFDIR + "/ganeti"
155

156
ALL_CERT_FILES = frozenset([NODED_CERT_FILE, RAPI_CERT_FILE])
157

158
MASTER_SOCKET = SOCKET_DIR + "/ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
159

160
NODED = "ganeti-noded"
Guido Trotter's avatar
Guido Trotter committed
161
CONFD = "ganeti-confd"
Guido Trotter's avatar
Guido Trotter committed
162
RAPI = "ganeti-rapi"
163
MASTERD = "ganeti-masterd"
Guido Trotter's avatar
Guido Trotter committed
164
165
# used in the ganeti-nbma project
NLD = "ganeti-nld"
166
167
168
169

DAEMONS_PORTS = {
  # daemon-name: ("proto", "default-port")
  NODED: ("tcp", 1811),
Guido Trotter's avatar
Guido Trotter committed
170
  CONFD: ("udp", 1814),
Guido Trotter's avatar
Guido Trotter committed
171
  RAPI: ("tcp", 5080),
172
  "ssh": ("tcp", 22),
Guido Trotter's avatar
Guido Trotter committed
173
174
  # used in the ganeti-nbma project
  NLD: ("udp", 1816),
175
176
}
DEFAULT_NODED_PORT = DAEMONS_PORTS[NODED][1]
Guido Trotter's avatar
Guido Trotter committed
177
DEFAULT_CONFD_PORT = DAEMONS_PORTS[CONFD][1]
Guido Trotter's avatar
Guido Trotter committed
178
DEFAULT_RAPI_PORT = DAEMONS_PORTS[RAPI][1]
Guido Trotter's avatar
Guido Trotter committed
179
180
# used in the ganeti-nbma project
DEFAULT_NLD_PORT = DAEMONS_PORTS[NLD][1]
181

Iustin Pop's avatar
Iustin Pop committed
182
183
FIRST_DRBD_PORT = 11000
LAST_DRBD_PORT = 14999
184
MASTER_SCRIPT = "ganeti-master"
Iustin Pop's avatar
Iustin Pop committed
185

186
LOG_DIR = _autoconf.LOCALSTATEDIR + "/log/ganeti/"
187
DAEMONS_LOGFILES = {
Michael Hanselmann's avatar
Michael Hanselmann committed
188
189
190
191
192
  # "daemon-name": "logfile"
  NODED: LOG_DIR + "node-daemon.log",
  CONFD: LOG_DIR + "conf-daemon.log",
  RAPI: LOG_DIR + "rapi-daemon.log",
  MASTERD: LOG_DIR + "master-daemon.log",
Guido Trotter's avatar
Guido Trotter committed
193
194
  # used in the ganeti-nbma project
  NLD: LOG_DIR + "nl-daemon.log",
Michael Hanselmann's avatar
Michael Hanselmann committed
195
  }
Michael Hanselmann's avatar
Michael Hanselmann committed
196

197
198
199
LOG_OS_DIR = LOG_DIR + "os"
LOG_WATCHER = LOG_DIR + "watcher.log"
LOG_COMMANDS = LOG_DIR + "commands.log"
Iustin Pop's avatar
Iustin Pop committed
200
LOG_BURNIN = LOG_DIR + "burnin.log"
201
LOG_SETUP_SSH = LOG_DIR + "setup-ssh.log"
Iustin Pop's avatar
Iustin Pop committed
202

Luca Bigliardi's avatar
Luca Bigliardi committed
203
204
DEV_CONSOLE = "/dev/console"

Balazs Lecz's avatar
Balazs Lecz committed
205
206
PROC_MOUNTS = "/proc/mounts"

207
# Local UniX Interface related constants
208
LUXI_EOM = "\3"
209
LUXI_VERSION = CONFIG_VERSION
210

211
212
213
214
215
216
217
# one of 'no', 'yes', 'only'
SYSLOG_USAGE = _autoconf.SYSLOG_USAGE
SYSLOG_NO = "no"
SYSLOG_YES = "yes"
SYSLOG_ONLY = "only"
SYSLOG_SOCKET = "/dev/log"

218
OS_SEARCH_PATH = _autoconf.OS_SEARCH_PATH
219
EXPORT_DIR = _autoconf.EXPORT_DIR
Iustin Pop's avatar
Iustin Pop committed
220
221
222

EXPORT_CONF_FILE = "config.ini"

223
XEN_BOOTLOADER = _autoconf.XEN_BOOTLOADER
224
225
226
XEN_KERNEL = _autoconf.XEN_KERNEL
XEN_INITRD = _autoconf.XEN_INITRD

227
KVM_PATH = _autoconf.KVM_PATH
Guido Trotter's avatar
Guido Trotter committed
228
SOCAT_PATH = _autoconf.SOCAT_PATH
229
SOCAT_USE_ESCAPE = _autoconf.SOCAT_USE_ESCAPE
230
SOCAT_USE_COMPRESS = _autoconf.SOCAT_USE_COMPRESS
231
SOCAT_ESCAPE_CODE = "0x1d"
232

233
234
235
236
237
238
239
240
241
242
243
244
#: Console as SSH command
CONS_SSH = "ssh"

#: Console as VNC server
CONS_VNC = "vnc"

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

#: All console types
CONS_ALL = frozenset([CONS_SSH, CONS_VNC, CONS_MESSAGE])

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

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

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

261
262
263
264
265
266
# Default validity of certificates in days
X509_CERT_DEFAULT_VALIDITY = 365 * 5

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

267
268
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"

269
270
271
272
273
274
IMPORT_EXPORT_DAEMON = _autoconf.PKGLIBDIR + "/import-export"

# Import/export daemon mode
IEM_IMPORT = "import"
IEM_EXPORT = "export"

275
276
277
278
279
280
281
282
# Import/export transport compression
IEC_NONE = "none"
IEC_GZIP = "gzip"
IEC_ALL = frozenset([
  IEC_NONE,
  IEC_GZIP,
  ])

283
284
IE_CUSTOM_SIZE = "fd"

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

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

295
VALUE_DEFAULT = "default"
296
297
VALUE_AUTO = "auto"
VALUE_GENERATE = "generate"
298
VALUE_NONE = "none"
299
300
VALUE_TRUE = "true"
VALUE_FALSE = "false"
301

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

Iustin Pop's avatar
Iustin Pop committed
305
# hooks-related constants
306
HOOKS_BASE_DIR = CONF_DIR + "/hooks"
Iustin Pop's avatar
Iustin Pop committed
307
308
HOOKS_PHASE_PRE = "pre"
HOOKS_PHASE_POST = "post"
309
HOOKS_NAME_CFGUPDATE = "config-update"
Guido Trotter's avatar
Guido Trotter committed
310
HOOKS_NAME_WATCHER = "watcher"
311
HOOKS_VERSION = 2
Iustin Pop's avatar
Iustin Pop committed
312
313
314
315

# hooks subject type (what object type does the LU deal with)
HTYPE_CLUSTER = "CLUSTER"
HTYPE_NODE = "NODE"
316
HTYPE_GROUP = "GROUP"
Iustin Pop's avatar
Iustin Pop committed
317
318
319
320
321
322
HTYPE_INSTANCE = "INSTANCE"

HKR_SKIP = 0
HKR_FAIL = 1
HKR_SUCCESS = 2

323
324
325
326
# Storage types
ST_FILE = "file"
ST_LVM_PV = "lvm-pv"
ST_LVM_VG = "lvm-vg"
327
328

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

339
340
341
# Storage operations
SO_FIX_CONSISTENCY = "fix-consistency"

342
# Available fields per storage type
343
344
345
346
VALID_STORAGE_FIELDS = frozenset([SF_NAME, SF_TYPE, SF_SIZE,
                                  SF_USED, SF_FREE, SF_ALLOCATABLE])

VALID_STORAGE_TYPES = frozenset([ST_FILE, ST_LVM_PV, ST_LVM_VG])
Iustin Pop's avatar
Iustin Pop committed
347

348
349
350
351
MODIFIABLE_STORAGE_FIELDS = {
  ST_LVM_PV: frozenset([SF_ALLOCATABLE]),
  }

352
VALID_STORAGE_OPERATIONS = {
353
  ST_LVM_VG: frozenset([SO_FIX_CONSISTENCY]),
354
355
  }

356
357
358
359
360
361
# Local disk status
# Note: Code depends on LDS_OKAY < LDS_UNKNOWN < LDS_FAULTY
(LDS_OKAY,
 LDS_UNKNOWN,
 LDS_FAULTY) = range(1, 4)

Iustin Pop's avatar
Iustin Pop committed
362
363
364
# disk template types
DT_DISKLESS = "diskless"
DT_PLAIN = "plain"
365
DT_DRBD8 = "drbd"
366
DT_FILE = "file"
367
DT_SHARED_FILE = "sharedfile"
368
DT_BLOCK = "blockdev"
369
370

# the set of network-mirrored disk templates
371
DTS_INT_MIRROR = frozenset([DT_DRBD8])
Iustin Pop's avatar
Iustin Pop committed
372

373
374
# the set of externally-mirrored disk templates (e.g. SAN, NAS)
DTS_EXT_MIRROR = frozenset([DT_SHARED_FILE, DT_BLOCK])
375

376
# the set of non-lvm-based disk templates
377
DTS_NOT_LVM = frozenset([DT_DISKLESS, DT_FILE, DT_SHARED_FILE, DT_BLOCK])
378

379
# the set of disk templates which can be grown
380
DTS_GROWABLE = frozenset([DT_PLAIN, DT_DRBD8, DT_FILE, DT_SHARED_FILE])
381

382
# the set of disk templates that allow adoption
383
384
385
386
DTS_MAY_ADOPT = frozenset([DT_PLAIN, DT_BLOCK])

# the set of disk templates that *must* use adoption
DTS_MUST_ADOPT = frozenset([DT_BLOCK])
387

388
# the set of disk templates that allow migrations
389
DTS_MIRRORED = frozenset.union(DTS_INT_MIRROR, DTS_EXT_MIRROR)
390
391


392
393
# logical disk types
LD_LV = "lvm"
394
LD_DRBD8 = "drbd8"
395
LD_FILE = "file"
396
397
LD_BLOCKDEV = "blockdev"
LDS_BLOCK = frozenset([LD_LV, LD_DRBD8, LD_BLOCKDEV])
398

Iustin Pop's avatar
Iustin Pop committed
399
400
# drbd constants
DRBD_HMAC_ALG = "md5"
401
DRBD_NET_PROTOCOL = "C"
402
DRBD_BARRIERS = _autoconf.DRBD_BARRIERS
Iustin Pop's avatar
Iustin Pop committed
403

404
405
406
# file backend driver
FD_LOOP = "loop"
FD_BLKTAP = "blktap"
407
408

# the set of drbd-like disk types
409
LDS_DRBD = frozenset([LD_DRBD8])
410

411
# disk access mode
412
413
DISK_RDONLY = "ro"
DISK_RDWR = "rw"
414
415
DISK_ACCESS_SET = frozenset([DISK_RDONLY, DISK_RDWR])

416
# disk replacement mode
417
418
419
REPLACE_DISK_PRI = "replace_on_primary"    # replace disks on primary
REPLACE_DISK_SEC = "replace_on_secondary"  # replace disks on secondary
REPLACE_DISK_CHG = "replace_new_secondary" # change secondary node
420
REPLACE_DISK_AUTO = "replace_auto"
421
422
423
424
425
426
REPLACE_MODES = frozenset([
  REPLACE_DISK_PRI,
  REPLACE_DISK_SEC,
  REPLACE_DISK_CHG,
  REPLACE_DISK_AUTO,
  ])
427

428
429
430
431
432
433
434
435
# Instance export mode
EXPORT_MODE_LOCAL = "local"
EXPORT_MODE_REMOTE = "remote"
EXPORT_MODES = frozenset([
  EXPORT_MODE_LOCAL,
  EXPORT_MODE_REMOTE,
  ])

436
# Lock recalculate mode
437
LOCKS_REPLACE = 'replace'
438
LOCKS_APPEND = 'append'
439

440
441
442
443
444
445
446
447
# Lock timeout (sum) before we should go into blocking acquire (still
# can be reset by priority change); computed as max time (10 hours)
# before we should actually go into blocking acquire given that we
# start from default priority level; in seconds
LOCK_ATTEMPTS_TIMEOUT = 10 * 3600 / 20.0
LOCK_ATTEMPTS_MAXWAIT = 15.0
LOCK_ATTEMPTS_MINWAIT = 1.0

448
# instance creation modes
Iustin Pop's avatar
Iustin Pop committed
449
450
INSTANCE_CREATE = "create"
INSTANCE_IMPORT = "import"
451
452
453
454
455
456
INSTANCE_REMOTE_IMPORT = "remote-import"
INSTANCE_CREATE_MODES = frozenset([
  INSTANCE_CREATE,
  INSTANCE_IMPORT,
  INSTANCE_REMOTE_IMPORT,
  ])
Iustin Pop's avatar
Iustin Pop committed
457

458
459
460
461
462
463
464
# Remote import/export handshake message and version
RIE_VERSION = 0
RIE_HANDSHAKE = "Hi, I'm Ganeti"

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

465
# Overall timeout for establishing connection
466
RIE_CONNECT_TIMEOUT = 180
467

468
469
470
471
472
473
# Export only: how long to wait per connection attempt (seconds)
RIE_CONNECT_ATTEMPT_TIMEOUT = 20

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

René Nussbaumer's avatar
René Nussbaumer committed
474
475
#: Give child process up to 5 seconds to exit after sending a signal
CHILD_LINGER_TIMEOUT = 5.0
476

477
DISK_TEMPLATES = frozenset([DT_DISKLESS, DT_PLAIN, DT_DRBD8,
478
                            DT_FILE, DT_SHARED_FILE, DT_BLOCK])
479
480

FILE_DRIVER = frozenset([FD_LOOP, FD_BLKTAP])
Iustin Pop's avatar
Iustin Pop committed
481
482
483
484

# import/export config options
INISECT_EXP = "export"
INISECT_INS = "instance"
485
486
INISECT_HYP = "hypervisor"
INISECT_BEP = "backend"
487
INISECT_OSP = "os"
488

489
# dynamic device modification
490
491
492
DDM_ADD = "add"
DDM_REMOVE = "remove"
DDMS_VALUES = frozenset([DDM_ADD, DDM_REMOVE])
493

494
# common exit codes
Iustin Pop's avatar
Iustin Pop committed
495
EXIT_SUCCESS = 0
496
EXIT_FAILURE = 1
497
EXIT_NOTCLUSTER = 5
498
EXIT_NOTMASTER = 11
499
EXIT_NODESETUP_ERROR = 12
Iustin Pop's avatar
Iustin Pop committed
500
EXIT_CONFIRMATION = 13 # need user confirmation
501

502
503
504
#: Exit code for query operations with unknown fields
EXIT_UNKNOWN_FIELD = 14

505
506
# tags
TAG_CLUSTER = "cluster"
507
TAG_NODEGROUP = "nodegroup"
508
509
TAG_NODE = "node"
TAG_INSTANCE = "instance"
510
511
VALID_TAG_TYPES = frozenset([
  TAG_CLUSTER,
512
  TAG_NODEGROUP,
513
514
515
  TAG_NODE,
  TAG_INSTANCE,
  ])
516
517
518
MAX_TAG_LEN = 128
MAX_TAGS_PER_OBJ = 4096

519
520
# others
DEFAULT_BRIDGE = "xen-br0"
Iustin Pop's avatar
Iustin Pop committed
521
SYNC_SPEED = 60 * 1024
522
523
IP4_ADDRESS_LOCALHOST = "127.0.0.1"
IP4_ADDRESS_ANY = "0.0.0.0"
Manuel Franceschini's avatar
Manuel Franceschini committed
524
525
IP6_ADDRESS_LOCALHOST = "::1"
IP6_ADDRESS_ANY = "::"
526
527
IP4_VERSION = 4
IP6_VERSION = 6
528
TCP_PING_TIMEOUT = 10
529
GANETI_RUNAS = "root"
530
DEFAULT_VG = "xenvg"
531
DEFAULT_DRBD_HELPER = "/bin/true"
532
MIN_VG_SIZE = 20480
533
DEFAULT_MAC_PREFIX = "aa:00:00"
534
LVM_STRIPECOUNT = _autoconf.LVM_STRIPECOUNT
535
536
# default maximum instance wait time, in seconds.
DEFAULT_SHUTDOWN_TIMEOUT = 120
537
NODE_MAX_CLOCK_SKEW = 150
538
# Time for an intra-cluster disk transfer to wait for a connection
539
DISK_TRANSFER_CONNECT_TIMEOUT = 60
540
541
# Disk index separator
DISK_SEPARATOR = _autoconf.DISK_SEPARATOR
542

543
544
545
#: Key for job IDs in opcode result
JOB_IDS_KEY = "jobs"

546
547
548
549
550
551
552
# runparts results
(RUNPARTS_SKIP,
 RUNPARTS_RUN,
 RUNPARTS_ERR) = range(3)

RUNPARTS_STATUS = frozenset([RUNPARTS_SKIP, RUNPARTS_RUN, RUNPARTS_ERR])

553
554
555
556
# RPC constants
(RPC_ENCODING_NONE,
 RPC_ENCODING_ZLIB_BASE64) = range(2)

557
558
559
560
561
# os related constants
OS_SCRIPT_CREATE = 'create'
OS_SCRIPT_IMPORT = 'import'
OS_SCRIPT_EXPORT = 'export'
OS_SCRIPT_RENAME = 'rename'
562
OS_SCRIPT_VERIFY = 'verify'
Iustin Pop's avatar
Iustin Pop committed
563
OS_SCRIPTS = frozenset([OS_SCRIPT_CREATE, OS_SCRIPT_IMPORT,
564
565
                        OS_SCRIPT_EXPORT, OS_SCRIPT_RENAME,
                        OS_SCRIPT_VERIFY])
566

567
OS_API_FILE = 'ganeti_api_version'
568
OS_VARIANTS_FILE = 'variants.list'
569
570
571
OS_PARAMETERS_FILE = 'parameters.list'

OS_VALIDATE_PARAMETERS = 'parameters'
572
OS_VALIDATE_CALLS = frozenset([OS_VALIDATE_PARAMETERS])
573

574
# ssh constants
575
576
SSH_CONFIG_DIR = _autoconf.SSH_CONFIG_DIR
SSH_HOST_DSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_dsa_key"
577
SSH_HOST_DSA_PUB = SSH_HOST_DSA_PRIV + ".pub"
578
SSH_HOST_RSA_PRIV = SSH_CONFIG_DIR + "/ssh_host_rsa_key"
579
SSH_HOST_RSA_PUB = SSH_HOST_RSA_PRIV + ".pub"
580
581
SSH = "ssh"
SCP = "scp"
582
583
584
585
586

# reboot types
INSTANCE_REBOOT_SOFT = "soft"
INSTANCE_REBOOT_HARD = "hard"
INSTANCE_REBOOT_FULL = "full"
587

588
589
590
591
REBOOT_TYPES = frozenset([INSTANCE_REBOOT_SOFT,
                          INSTANCE_REBOOT_HARD,
                          INSTANCE_REBOOT_FULL])

592
VTYPE_STRING = 'string'
593
VTYPE_MAYBE_STRING = "maybe-string"
594
595
596
597
598
VTYPE_BOOL = 'bool'
VTYPE_SIZE = 'size' # size, in MiBs
VTYPE_INT = 'int'
ENFORCEABLE_TYPES = frozenset([
                      VTYPE_STRING,
599
                      VTYPE_MAYBE_STRING,
600
601
602
603
604
                      VTYPE_BOOL,
                      VTYPE_SIZE,
                      VTYPE_INT,
                      ])

605
606
607
# HV parameter names (global namespace)
HV_BOOT_ORDER = "boot_order"
HV_CDROM_IMAGE_PATH = "cdrom_image_path"
608
609
HV_KVM_CDROM2_IMAGE_PATH = "cdrom2_image_path"
HV_KVM_FLOPPY_IMAGE_PATH = "floppy_image_path"
610
611
HV_NIC_TYPE = "nic_type"
HV_DISK_TYPE = "disk_type"
612
HV_KVM_CDROM_DISK_TYPE = "cdrom_disk_type"
613
HV_VNC_BIND_ADDRESS = "vnc_bind_address"
614
HV_VNC_PASSWORD_FILE = "vnc_password_file"
615
616
617
HV_VNC_TLS = "vnc_tls"
HV_VNC_X509 = "vnc_x509_path"
HV_VNC_X509_VERIFY = "vnc_x509_verify"
618
619
HV_ACPI = "acpi"
HV_PAE = "pae"
620
621
622
HV_USE_BOOTLOADER = "use_bootloader"
HV_BOOTLOADER_ARGS = "bootloader_args"
HV_BOOTLOADER_PATH = "bootloader_path"
623
HV_KERNEL_ARGS = "kernel_args"
624
625
HV_KERNEL_PATH = "kernel_path"
HV_INITRD_PATH = "initrd_path"
626
HV_ROOT_PATH = "root_path"
627
HV_SERIAL_CONSOLE = "serial_console"
628
HV_USB_MOUSE = "usb_mouse"
629
HV_DEVICE_MODEL = "device_model"
630
HV_INIT_SCRIPT = "init_script"
631
HV_MIGRATION_PORT = "migration_port"
632
633
HV_MIGRATION_BANDWIDTH = "migration_bandwidth"
HV_MIGRATION_DOWNTIME = "migration_downtime"
634
HV_MIGRATION_MODE = "migration_mode"
635
HV_USE_LOCALTIME = "use_localtime"
636
HV_DISK_CACHE = "disk_cache"
637
638
HV_SECURITY_MODEL = "security_model"
HV_SECURITY_DOMAIN = "security_domain"
Guido Trotter's avatar
Guido Trotter committed
639
HV_KVM_FLAG = "kvm_flag"
640
HV_VHOST_NET = "vhost_net"
Balazs Lecz's avatar
Balazs Lecz committed
641
HV_KVM_USE_CHROOT = "use_chroot"
642
HV_CPU_MASK = "cpu_mask"
643
HV_MEM_PATH = "mem_path"
644
HV_BLOCKDEV_PREFIX = "blockdev_prefix"
645

646
647
HVS_PARAMETER_TYPES = {
  HV_BOOT_ORDER: VTYPE_STRING,
648
  HV_KVM_FLOPPY_IMAGE_PATH: VTYPE_STRING,
649
  HV_CDROM_IMAGE_PATH: VTYPE_STRING,
650
  HV_KVM_CDROM2_IMAGE_PATH: VTYPE_STRING,
651
652
  HV_NIC_TYPE: VTYPE_STRING,
  HV_DISK_TYPE: VTYPE_STRING,
653
  HV_KVM_CDROM_DISK_TYPE: VTYPE_STRING,
654
  HV_VNC_PASSWORD_FILE: VTYPE_STRING,
655
656
657
658
659
660
  HV_VNC_BIND_ADDRESS: VTYPE_STRING,
  HV_VNC_TLS: VTYPE_BOOL,
  HV_VNC_X509: VTYPE_STRING,
  HV_VNC_X509_VERIFY: VTYPE_BOOL,
  HV_ACPI: VTYPE_BOOL,
  HV_PAE: VTYPE_BOOL,
661
662
663
  HV_USE_BOOTLOADER: VTYPE_BOOL,
  HV_BOOTLOADER_PATH: VTYPE_STRING,
  HV_BOOTLOADER_ARGS: VTYPE_STRING,
664
  HV_KERNEL_PATH: VTYPE_STRING,
665
  HV_KERNEL_ARGS: VTYPE_STRING,
666
  HV_INITRD_PATH: VTYPE_STRING,
667
  HV_ROOT_PATH: VTYPE_MAYBE_STRING,
668
669
  HV_SERIAL_CONSOLE: VTYPE_BOOL,
  HV_USB_MOUSE: VTYPE_STRING,
670
  HV_DEVICE_MODEL: VTYPE_STRING,
671
  HV_INIT_SCRIPT: VTYPE_STRING,
672
  HV_MIGRATION_PORT: VTYPE_INT,
673
674
  HV_MIGRATION_BANDWIDTH: VTYPE_INT,
  HV_MIGRATION_DOWNTIME: VTYPE_INT,
675
  HV_MIGRATION_MODE: VTYPE_STRING,
676
  HV_USE_LOCALTIME: VTYPE_BOOL,
677
  HV_DISK_CACHE: VTYPE_STRING,
678
679
  HV_SECURITY_MODEL: VTYPE_STRING,
  HV_SECURITY_DOMAIN: VTYPE_STRING,
Guido Trotter's avatar
Guido Trotter committed
680
  HV_KVM_FLAG: VTYPE_STRING,
681
  HV_VHOST_NET: VTYPE_BOOL,
Balazs Lecz's avatar
Balazs Lecz committed
682
  HV_KVM_USE_CHROOT: VTYPE_BOOL,
683
  HV_CPU_MASK: VTYPE_STRING,
684
  HV_MEM_PATH: VTYPE_STRING,
685
  HV_BLOCKDEV_PREFIX: VTYPE_STRING,
686
687
688
  }

HVS_PARAMETERS = frozenset(HVS_PARAMETER_TYPES.keys())
689

690
# Backend parameter names
Iustin Pop's avatar
Iustin Pop committed
691
BE_MEMORY = "memory"
692
BE_VCPUS = "vcpus"
693
BE_AUTO_BALANCE = "auto_balance"
694

695
696
697
698
699
700
701
BES_PARAMETER_TYPES = {
    BE_MEMORY: VTYPE_SIZE,
    BE_VCPUS: VTYPE_INT,
    BE_AUTO_BALANCE: VTYPE_BOOL,
    }

BES_PARAMETERS = frozenset(BES_PARAMETER_TYPES.keys())
Iustin Pop's avatar
Iustin Pop committed
702

703
704
705
706
707
708
709
710
711
# Node parameter names
ND_OOB_PROGRAM = "oob_program"

NDS_PARAMETER_TYPES = {
    ND_OOB_PROGRAM: VTYPE_MAYBE_STRING,
    }

NDS_PARAMETERS = frozenset(NDS_PARAMETER_TYPES.keys())

712
713
714
715
716
717
718
719
720
721
# OOB supported commands
OOB_POWER_ON = "power-on"
OOB_POWER_OFF = "power-off"
OOB_POWER_CYCLE = "power-cycle"
OOB_POWER_STATUS = "power-status"
OOB_HEALTH = "health"

OOB_COMMANDS = frozenset([OOB_POWER_ON, OOB_POWER_OFF, OOB_POWER_CYCLE,
                          OOB_POWER_STATUS, OOB_HEALTH])

722
723
OOB_POWER_STATUS_POWERED = "powered"

724
OOB_TIMEOUT = 60 # 60 seconds
725
OOB_POWER_DELAY = 2.0 # 2 seconds
726
727
728
729
730
731
732
733
734
735
736
737
738

OOB_STATUS_OK = "OK"
OOB_STATUS_WARNING = "WARNING"
OOB_STATUS_CRITICAL = "CRITICAL"
OOB_STATUS_UNKNOWN = "UNKNOWN"

OOB_STATUSES = frozenset([
  OOB_STATUS_OK,
  OOB_STATUS_WARNING,
  OOB_STATUS_CRITICAL,
  OOB_STATUS_UNKNOWN,
  ])

739
740
# Instance Parameters Profile
PP_DEFAULT = "default"
741

742
# NIC_* constants are used inside the ganeti config
Guido Trotter's avatar
Guido Trotter committed
743
744
745
746
747
748
749
750
751
752
753
754
755
756
NIC_MODE = "mode"
NIC_LINK = "link"

NIC_MODE_BRIDGED = "bridged"
NIC_MODE_ROUTED = "routed"

NIC_VALID_MODES = frozenset([NIC_MODE_BRIDGED, NIC_MODE_ROUTED])

NICS_PARAMETER_TYPES = {
    NIC_MODE: VTYPE_STRING,
    NIC_LINK: VTYPE_STRING,
    }

NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
757

758
# IDISK_* constants are used in opcodes, to create/change disks
759
760
IDISK_SIZE = "size"
IDISK_MODE = "mode"
761
IDISK_ADOPT = "adopt"
762
IDISK_VG = "vg"
763
IDISK_METAVG = "metavg"
764
765
766
767
IDISK_PARAMS_TYPES = {
  IDISK_SIZE: VTYPE_SIZE,
  IDISK_MODE: VTYPE_STRING,
  IDISK_ADOPT: VTYPE_STRING,
768
  IDISK_VG: VTYPE_STRING,
769
  IDISK_METAVG: VTYPE_STRING,
770
  }
771
772
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())

773
# INIC_* constants are used in opcodes, to create/change nics
774
775
776
777
INIC_MAC = "mac"
INIC_IP = "ip"
INIC_MODE = "mode"
INIC_LINK = "link"
778
779
780
781
782
783
784
INIC_PARAMS_TYPES = {
  INIC_IP: VTYPE_MAYBE_STRING,
  INIC_LINK: VTYPE_STRING,
  INIC_MAC: VTYPE_STRING,
  INIC_MODE: VTYPE_STRING,
  }
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
785

786
# Hypervisor constants
Iustin Pop's avatar
Iustin Pop committed
787
HT_XEN_PVM = "xen-pvm"
788
HT_FAKE = "fake"
Iustin Pop's avatar
Iustin Pop committed
789
HT_XEN_HVM = "xen-hvm"
Guido Trotter's avatar
Guido Trotter committed
790
HT_KVM = "kvm"
791
HT_CHROOT = "chroot"
Iustin Pop's avatar
Iustin Pop committed
792
793
794
795
796
797
798
799
800
HT_LXC = "lxc"
HYPER_TYPES = frozenset([
  HT_XEN_PVM,
  HT_FAKE,
  HT_XEN_HVM,
  HT_KVM,
  HT_CHROOT,
  HT_LXC,
  ])
Guido Trotter's avatar
Guido Trotter committed
801
HTS_REQ_PORT = frozenset([HT_XEN_HVM, HT_KVM])
802

803
VNC_BASE_PORT = 5900
804
VNC_PASSWORD_FILE = CONF_DIR + "/vnc-cluster-password"
Manuel Franceschini's avatar
Manuel Franceschini committed
805
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
806

807
# NIC types
808
809
810
HT_NIC_RTL8139 = "rtl8139"
HT_NIC_NE2K_PCI = "ne2k_pci"
HT_NIC_NE2K_ISA = "ne2k_isa"
811
812
813
814
815
HT_NIC_I82551 = "i82551"
HT_NIC_I85557B = "i82557b"
HT_NIC_I8259ER = "i82559er"
HT_NIC_PCNET = "pcnet"
HT_NIC_E1000 = "e1000"
816
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
817

818
HT_HVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI,
Guido Trotter's avatar
Guido Trotter committed
819
820
                                    HT_NIC_E1000, HT_NIC_NE2K_ISA,
                                    HT_NIC_PARAVIRTUAL])
821
822
823
824
825
HT_KVM_VALID_NIC_TYPES = frozenset([HT_NIC_RTL8139, HT_NIC_NE2K_PCI,
                                    HT_NIC_NE2K_ISA, HT_NIC_I82551,
                                    HT_NIC_I85557B, HT_NIC_I8259ER,
                                    HT_NIC_PCNET, HT_NIC_E1000,
                                    HT_NIC_PARAVIRTUAL])
826
827
828
829
830
831
832
833
# Disk types
HT_DISK_IOEMU = "ioemu"
HT_DISK_IDE = "ide"
HT_DISK_SCSI = "scsi"
HT_DISK_SD = "sd"
HT_DISK_MTD = "mtd"
HT_DISK_PFLASH = "pflash"

834
835
836
837
838
839
840
841
842
HT_CACHE_DEFAULT = "default"
HT_CACHE_NONE = "none"
HT_CACHE_WTHROUGH = "writethrough"
HT_CACHE_WBACK = "writeback"
HT_VALID_CACHE_TYPES = frozenset([HT_CACHE_DEFAULT,
                                  HT_CACHE_NONE,
                                  HT_CACHE_WTHROUGH,
                                  HT_CACHE_WBACK])

843
HT_HVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IOEMU])
844
845
846
HT_KVM_VALID_DISK_TYPES = frozenset([HT_DISK_PARAVIRTUAL, HT_DISK_IDE,
                                     HT_DISK_SCSI, HT_DISK_SD, HT_DISK_MTD,
                                     HT_DISK_PFLASH])
847

848
849
850
851
852
853
854
# Mouse types:
HT_MOUSE_MOUSE = "mouse"
HT_MOUSE_TABLET = "tablet"

HT_KVM_VALID_MOUSE_TYPES = frozenset([HT_MOUSE_MOUSE, HT_MOUSE_TABLET])

# Boot order
855
HT_BO_FLOPPY = "floppy"
856
857
858
859
HT_BO_CDROM = "cdrom"
HT_BO_DISK = "disk"
HT_BO_NETWORK = "network"

860
861
HT_KVM_VALID_BO_TYPES = frozenset([HT_BO_FLOPPY, HT_BO_CDROM,
                                   HT_BO_DISK, HT_BO_NETWORK])
862

863
864
865
866
867
868
869
# Security models
HT_SM_NONE = "none"
HT_SM_USER = "user"
HT_SM_POOL = "pool"

HT_KVM_VALID_SM_TYPES = frozenset([HT_SM_NONE, HT_SM_USER, HT_SM_POOL])

Guido Trotter's avatar
Guido Trotter committed
870
871
872
873
874
875
# Kvm flag values
HT_KVM_ENABLED = "enabled"
HT_KVM_DISABLED = "disabled"

HT_KVM_FLAG_VALUES = frozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])

876
877
878
# Migration type
HT_MIGRATION_LIVE = "live"
HT_MIGRATION_NONLIVE = "non-live"
879
HT_MIGRATION_MODES = frozenset([HT_MIGRATION_LIVE, HT_MIGRATION_NONLIVE])
880

881
882
883
884
# Cluster Verify steps
VERIFY_NPLUSONE_MEM = 'nplusone_mem'
VERIFY_OPTIONAL_CHECKS = frozenset([VERIFY_NPLUSONE_MEM])

885
# Node verify constants
886
NV_DRBDHELPER = "drbd-helper"
887
NV_DRBDLIST = "drbd-list"
888
889
890
NV_FILELIST = "filelist"
NV_HVINFO = "hvinfo"
NV_HYPERVISOR = "hypervisor"
891
NV_HVPARAMS = "hvparms"
892
NV_INSTANCELIST = "instancelist"
893
894
NV_LVLIST = "lvlist"
NV_MASTERIP = "master-ip"
895
896
NV_NODELIST = "nodelist"
NV_NODENETTEST = "node-net-test"
897
NV_NODESETUP = "nodesetup"
898
899
NV_OSLIST = "oslist"
NV_PVLIST = "pvlist"
900
NV_TIME = "time"
901
902
NV_VERSION = "version"
NV_VGLIST = "vglist"
903
NV_VMNODES = "vmnodes"
904
NV_OOB_PATHS = "oob-paths"
905
NV_BRIDGES = "bridges"
906

907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
# Instance status
INSTST_RUNNING = "running"
INSTST_ADMINDOWN = "ADMIN_down"
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
INSTST_NODEDOWN = "ERROR_nodedown"
INSTST_WRONGNODE = "ERROR_wrongnode"
INSTST_ERRORUP = "ERROR_up"
INSTST_ERRORDOWN = "ERROR_down"
INSTST_ALL = frozenset([
  INSTST_RUNNING,
  INSTST_ADMINDOWN,
  INSTST_NODEOFFLINE,
  INSTST_NODEDOWN,
  INSTST_WRONGNODE,
  INSTST_ERRORUP,
  INSTST_ERRORDOWN,
  ])

925
926
927
928
929
930
931
932
933
934
935
936
937
938
# Node roles
NR_REGULAR = "R"
NR_MASTER = "M"
NR_MCANDIDATE = "C"
NR_DRAINED = "D"
NR_OFFLINE = "O"
NR_ALL = frozenset([
  NR_REGULAR,
  NR_MASTER,
  NR_MCANDIDATE,
  NR_DRAINED,
  NR_OFFLINE,
  ])

939
940
941
942
# SSL certificate check constants (in days)
SSL_CERT_EXPIRATION_WARN = 30
SSL_CERT_EXPIRATION_ERROR = 7

943
# Allocator framework constants
944
IALLOCATOR_VERSION = 2
945
946
IALLOCATOR_DIR_IN = "in"
IALLOCATOR_DIR_OUT = "out"
947
948
949
950
VALID_IALLOCATOR_DIRECTIONS = frozenset([
  IALLOCATOR_DIR_IN,
  IALLOCATOR_DIR_OUT,
  ])
951
952
IALLOCATOR_MODE_ALLOC = "allocate"
IALLOCATOR_MODE_RELOC = "relocate"
953
IALLOCATOR_MODE_MEVAC = "multi-evacuate"
954
IALLOCATOR_MODE_MRELOC = "multi-relocate"
955
956
IALLOCATOR_MODE_CHG_GROUP = "change-group"
IALLOCATOR_MODE_NODE_EVAC = "node-evacuate"
957
958
959
960
VALID_IALLOCATOR_MODES = frozenset([
  IALLOCATOR_MODE_ALLOC,
  IALLOCATOR_MODE_RELOC,
  IALLOCATOR_MODE_MEVAC,
961
  IALLOCATOR_MODE_MRELOC,
962
963
  IALLOCATOR_MODE_CHG_GROUP,
  IALLOCATOR_MODE_NODE_EVAC,
964
  ])
965
IALLOCATOR_SEARCH_PATH = _autoconf.IALLOCATOR_SEARCH_PATH
966

967
968
969
970
971
972
973
974
975
976
IALLOCATOR_NEVAC_PRI = "primary-only"
IALLOCATOR_NEVAC_SEC = "secondary-only"
IALLOCATOR_NEVAC_ALL = "all"
IALLOCATOR_NEVAC_MODES = frozenset([
  IALLOCATOR_NEVAC_PRI,
  IALLOCATOR_NEVAC_SEC,
  IALLOCATOR_NEVAC_ALL,
  ])

# TODO: Remove multi-relocate constants, including IALLOCATOR_MODE_MRELOC
Michael Hanselmann's avatar