Statistics
| Branch: | Tag: | Revision:

root / lib / constants.py @ fb62843c

History | View | Annotate | Download (65.4 kB)

1
#
2
#
3

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

    
21

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

    
24
import re
25
import socket
26

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

    
32

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

    
47

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

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

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

65
  Returns: int representing version number
66

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

    
75

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

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

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

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

    
87
  return (major, minor, revision)
88

    
89

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

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

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

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

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

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

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

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

    
153
# SSH constants
154
SSH = "ssh"
155
SCP = "scp"
156

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

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

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

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

    
187
FIRST_DRBD_PORT = 11000
188
LAST_DRBD_PORT = 14999
189

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

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

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

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

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

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

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

    
230
DEV_CONSOLE = "/dev/console"
231

    
232
PROC_MOUNTS = "/proc/mounts"
233

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

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

    
249
EXPORT_CONF_FILE = "config.ini"
250

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
322
X509_CERT_SIGNATURE_HEADER = "X-Ganeti-Signature"
323

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

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

    
336
IE_CUSTOM_SIZE = "fd"
337

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

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

    
348
VALUE_DEFAULT = "default"
349
VALUE_AUTO = "auto"
350
VALUE_GENERATE = "generate"
351
VALUE_NONE = "none"
352
VALUE_TRUE = "true"
353
VALUE_FALSE = "false"
354

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

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

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

    
373
HKR_SKIP = 0
374
HKR_FAIL = 1
375
HKR_SUCCESS = 2
376

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
575
# the set of drbd-like disk types
576
DTS_DRBD = compat.UniqueFrozenset([DT_DRBD8])
577

    
578
# drbd constants
579
DRBD_HMAC_ALG = "md5"
580
DRBD_DEFAULT_NET_PROTOCOL = "C"
581
DRBD_MIGRATION_NET_PROTOCOL = "C"
582
DRBD_STATUS_FILE = "/proc/drbd"
583

    
584
#: Size of DRBD meta block device
585
DRBD_META_SIZE = 128
586

    
587
# drbd barrier types
588
DRBD_B_NONE = "n"
589
DRBD_B_DISK_BARRIERS = "b"
590
DRBD_B_DISK_DRAIN = "d"
591
DRBD_B_DISK_FLUSH = "f"
592

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

    
605
# rbd tool command
606
RBD_CMD = "rbd"
607

    
608
# file backend driver
609
FD_LOOP = "loop"
610
FD_BLKTAP = "blktap"
611

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
816
ES_PARAMETERS_FILE = "parameters.list"
817

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

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

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

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

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

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

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

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

    
948

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

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

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

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

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

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

    
1057
# KVM-specific statuses
1058
HV_KVM_MIGRATION_VALID_STATUSES = HV_MIGRATION_VALID_STATUSES
1059

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1180
# Node parameter names
1181
ND_OOB_PROGRAM = "oob_program"
1182
ND_SPINDLE_COUNT = "spindle_count"
1183
ND_EXCLUSIVE_STORAGE = "exclusive_storage"
1184

    
1185
NDS_PARAMETER_TYPES = {
1186
  ND_OOB_PROGRAM: VTYPE_STRING,
1187
  ND_SPINDLE_COUNT: VTYPE_INT,
1188
  ND_EXCLUSIVE_STORAGE: VTYPE_BOOL,
1189
  }
1190

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

    
1193
NDS_PARAMETER_TITLES = {
1194
  ND_OOB_PROGRAM: "OutOfBandProgram",
1195
  ND_SPINDLE_COUNT: "SpindleCount",
1196
  ND_EXCLUSIVE_STORAGE: "ExclusiveStorage",
1197
  }
1198

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

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

    
1273
DISK_DT_PARAMETERS = frozenset(DISK_DT_TYPES.keys())
1274

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

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

    
1290
OOB_POWER_STATUS_POWERED = "powered"
1291

    
1292
OOB_TIMEOUT = 60 # 60 seconds
1293
OOB_POWER_DELAY = 2.0 # 2 seconds
1294

    
1295
OOB_STATUS_OK = "OK"
1296
OOB_STATUS_WARNING = "WARNING"
1297
OOB_STATUS_CRITICAL = "CRITICAL"
1298
OOB_STATUS_UNKNOWN = "UNKNOWN"
1299

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

    
1307
# Instance Parameters Profile
1308
PP_DEFAULT = "default"
1309

    
1310
# NIC_* constants are used inside the ganeti config
1311
NIC_MODE = "mode"
1312
NIC_LINK = "link"
1313

    
1314
NIC_MODE_BRIDGED = "bridged"
1315
NIC_MODE_ROUTED = "routed"
1316
NIC_MODE_OVS = "openvswitch"
1317
NIC_IP_POOL = "pool"
1318

    
1319
NIC_VALID_MODES = compat.UniqueFrozenset([
1320
  NIC_MODE_BRIDGED,
1321
  NIC_MODE_ROUTED,
1322
  NIC_MODE_OVS,
1323
  ])
1324

    
1325
RESERVE_ACTION = "reserve"
1326
RELEASE_ACTION = "release"
1327

    
1328
NICS_PARAMETER_TYPES = {
1329
  NIC_MODE: VTYPE_STRING,
1330
  NIC_LINK: VTYPE_STRING,
1331
  }
1332

    
1333
NICS_PARAMETERS = frozenset(NICS_PARAMETER_TYPES.keys())
1334

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

    
1356
# INIC_* constants are used in opcodes, to create/change nics
1357
INIC_MAC = "mac"
1358
INIC_IP = "ip"
1359
INIC_MODE = "mode"
1360
INIC_LINK = "link"
1361
INIC_NETWORK = "network"
1362
INIC_NAME = "name"
1363
INIC_PARAMS_TYPES = {
1364
  INIC_IP: VTYPE_MAYBE_STRING,
1365
  INIC_LINK: VTYPE_STRING,
1366
  INIC_MAC: VTYPE_STRING,
1367
  INIC_MODE: VTYPE_STRING,
1368
  INIC_NETWORK: VTYPE_MAYBE_STRING,
1369
  INIC_NAME: VTYPE_MAYBE_STRING,
1370
  }
1371
INIC_PARAMS = frozenset(INIC_PARAMS_TYPES.keys())
1372

    
1373
# Hypervisor constants
1374
HT_XEN_PVM = "xen-pvm"
1375
HT_FAKE = "fake"
1376
HT_XEN_HVM = "xen-hvm"
1377
HT_KVM = "kvm"
1378
HT_CHROOT = "chroot"
1379
HT_LXC = "lxc"
1380
HYPER_TYPES = compat.UniqueFrozenset([
1381
  HT_XEN_PVM,
1382
  HT_FAKE,
1383
  HT_XEN_HVM,
1384
  HT_KVM,
1385
  HT_CHROOT,
1386
  HT_LXC,
1387
  ])
1388
HTS_REQ_PORT = compat.UniqueFrozenset([HT_XEN_HVM, HT_KVM])
1389

    
1390
VNC_BASE_PORT = 5900
1391
VNC_DEFAULT_BIND_ADDRESS = IP4_ADDRESS_ANY
1392

    
1393
# NIC types
1394
HT_NIC_RTL8139 = "rtl8139"
1395
HT_NIC_NE2K_PCI = "ne2k_pci"
1396
HT_NIC_NE2K_ISA = "ne2k_isa"
1397
HT_NIC_I82551 = "i82551"
1398
HT_NIC_I85557B = "i82557b"
1399
HT_NIC_I8259ER = "i82559er"
1400
HT_NIC_PCNET = "pcnet"
1401
HT_NIC_E1000 = "e1000"
1402
HT_NIC_PARAVIRTUAL = HT_DISK_PARAVIRTUAL = "paravirtual"
1403

    
1404
HT_HVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1405
  HT_NIC_RTL8139,
1406
  HT_NIC_NE2K_PCI,
1407
  HT_NIC_E1000,
1408
  HT_NIC_NE2K_ISA,
1409
  HT_NIC_PARAVIRTUAL,
1410
  ])
1411
HT_KVM_VALID_NIC_TYPES = compat.UniqueFrozenset([
1412
  HT_NIC_RTL8139,
1413
  HT_NIC_NE2K_PCI,
1414
  HT_NIC_NE2K_ISA,
1415
  HT_NIC_I82551,
1416
  HT_NIC_I85557B,
1417
  HT_NIC_I8259ER,
1418
  HT_NIC_PCNET,
1419
  HT_NIC_E1000,
1420
  HT_NIC_PARAVIRTUAL,
1421
  ])
1422

    
1423
# Vif types
1424
# default vif type in xen-hvm
1425
HT_HVM_VIF_IOEMU = "ioemu"
1426
HT_HVM_VIF_VIF = "vif"
1427
HT_HVM_VALID_VIF_TYPES = compat.UniqueFrozenset([
1428
  HT_HVM_VIF_IOEMU,
1429
  HT_HVM_VIF_VIF,
1430
  ])
1431

    
1432
# Disk types
1433
HT_DISK_IOEMU = "ioemu"
1434
HT_DISK_IDE = "ide"
1435
HT_DISK_SCSI = "scsi"
1436
HT_DISK_SD = "sd"
1437
HT_DISK_MTD = "mtd"
1438
HT_DISK_PFLASH = "pflash"
1439

    
1440
HT_CACHE_DEFAULT = "default"
1441
HT_CACHE_NONE = "none"
1442
HT_CACHE_WTHROUGH = "writethrough"
1443
HT_CACHE_WBACK = "writeback"
1444
HT_VALID_CACHE_TYPES = compat.UniqueFrozenset([
1445
  HT_CACHE_DEFAULT,
1446
  HT_CACHE_NONE,
1447
  HT_CACHE_WTHROUGH,
1448
  HT_CACHE_WBACK,
1449
  ])
1450

    
1451
HT_HVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1452
  HT_DISK_PARAVIRTUAL,
1453
  HT_DISK_IOEMU,
1454
  ])
1455
HT_KVM_VALID_DISK_TYPES = compat.UniqueFrozenset([
1456
  HT_DISK_PARAVIRTUAL,
1457
  HT_DISK_IDE,
1458
  HT_DISK_SCSI,
1459
  HT_DISK_SD,
1460
  HT_DISK_MTD,
1461
  HT_DISK_PFLASH,
1462
  ])
1463

    
1464
# Mouse types:
1465
HT_MOUSE_MOUSE = "mouse"
1466
HT_MOUSE_TABLET = "tablet"
1467

    
1468
HT_KVM_VALID_MOUSE_TYPES = compat.UniqueFrozenset([
1469
  HT_MOUSE_MOUSE,
1470
  HT_MOUSE_TABLET,
1471
  ])
1472

    
1473
# Boot order
1474
HT_BO_FLOPPY = "floppy"
1475
HT_BO_CDROM = "cdrom"
1476
HT_BO_DISK = "disk"
1477
HT_BO_NETWORK = "network"
1478

    
1479
HT_KVM_VALID_BO_TYPES = compat.UniqueFrozenset([
1480
  HT_BO_FLOPPY,
1481
  HT_BO_CDROM,
1482
  HT_BO_DISK,
1483
  HT_BO_NETWORK,
1484
  ])
1485

    
1486
# SPICE lossless image compression options
1487
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ = "auto_glz"
1488
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ = "auto_lz"
1489
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC = "quic"
1490
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ = "glz"
1491
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ = "lz"
1492
HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF = "off"
1493

    
1494
HT_KVM_SPICE_VALID_LOSSLESS_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1495
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_GLZ,
1496
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_AUTO_LZ,
1497
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_QUIC,
1498
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_GLZ,
1499
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_LZ,
1500
  HT_KVM_SPICE_LOSSLESS_IMG_COMPR_OFF,
1501
  ])
1502

    
1503
# SPICE lossy image compression options (valid for both jpeg and zlib-glz)
1504
HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO = "auto"
1505
HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER = "never"
1506
HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS = "always"
1507

    
1508
HT_KVM_SPICE_VALID_LOSSY_IMG_COMPR_OPTIONS = compat.UniqueFrozenset([
1509
  HT_KVM_SPICE_LOSSY_IMG_COMPR_AUTO,
1510
  HT_KVM_SPICE_LOSSY_IMG_COMPR_NEVER,
1511
  HT_KVM_SPICE_LOSSY_IMG_COMPR_ALWAYS,
1512
  ])
1513

    
1514
# SPICE video stream detection
1515
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF = "off"
1516
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL = "all"
1517
HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER = "filter"
1518

    
1519
HT_KVM_SPICE_VALID_VIDEO_STREAM_DETECTION_OPTIONS = compat.UniqueFrozenset([
1520
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_OFF,
1521
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_ALL,
1522
  HT_KVM_SPICE_VIDEO_STREAM_DETECTION_FILTER,
1523
  ])
1524

    
1525
# Security models
1526
HT_SM_NONE = "none"
1527
HT_SM_USER = "user"
1528
HT_SM_POOL = "pool"
1529

    
1530
HT_KVM_VALID_SM_TYPES = compat.UniqueFrozenset([
1531
  HT_SM_NONE,
1532
  HT_SM_USER,
1533
  HT_SM_POOL,
1534
  ])
1535

    
1536
# Kvm flag values
1537
HT_KVM_ENABLED = "enabled"
1538
HT_KVM_DISABLED = "disabled"
1539

    
1540
HT_KVM_FLAG_VALUES = compat.UniqueFrozenset([HT_KVM_ENABLED, HT_KVM_DISABLED])
1541

    
1542
# Migration type
1543
HT_MIGRATION_LIVE = "live"
1544
HT_MIGRATION_NONLIVE = "non-live"
1545
HT_MIGRATION_MODES = compat.UniqueFrozenset([
1546
  HT_MIGRATION_LIVE,
1547
  HT_MIGRATION_NONLIVE,
1548
  ])
1549

    
1550
# Cluster Verify steps
1551
VERIFY_NPLUSONE_MEM = "nplusone_mem"
1552
VERIFY_OPTIONAL_CHECKS = compat.UniqueFrozenset([VERIFY_NPLUSONE_MEM])
1553

    
1554
# Cluster Verify error classes
1555
CV_TCLUSTER = "cluster"
1556
CV_TGROUP = "group"
1557
CV_TNODE = "node"
1558
CV_TINSTANCE = "instance"
1559

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

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

    
1689
CV_ALL_ECODES_STRINGS = \
1690
  compat.UniqueFrozenset(estr for (_, estr, _) in CV_ALL_ECODES)
1691

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

    
1720
# Instance status
1721
INSTST_RUNNING = "running"
1722
INSTST_ADMINDOWN = "ADMIN_down"
1723
INSTST_ADMINOFFLINE = "ADMIN_offline"
1724
INSTST_NODEOFFLINE = "ERROR_nodeoffline"
1725
INSTST_NODEDOWN = "ERROR_nodedown"
1726
INSTST_WRONGNODE = "ERROR_wrongnode"
1727
INSTST_ERRORUP = "ERROR_up"
1728
INSTST_ERRORDOWN = "ERROR_down"
1729
INSTST_ALL = compat.UniqueFrozenset([
1730
  INSTST_RUNNING,
1731
  INSTST_ADMINDOWN,
1732
  INSTST_ADMINOFFLINE,
1733
  INSTST_NODEOFFLINE,
1734
  INSTST_NODEDOWN,
1735
  INSTST_WRONGNODE,
1736
  INSTST_ERRORUP,
1737
  INSTST_ERRORDOWN,
1738
  ])
1739

    
1740
# Admin states
1741
ADMINST_UP = "up"
1742
ADMINST_DOWN = "down"
1743
ADMINST_OFFLINE = "offline"
1744
ADMINST_ALL = compat.UniqueFrozenset([
1745
  ADMINST_UP,
1746
  ADMINST_DOWN,
1747
  ADMINST_OFFLINE,
1748
  ])
1749

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

    
1764
# SSL certificate check constants (in days)
1765
SSL_CERT_EXPIRATION_WARN = 30
1766
SSL_CERT_EXPIRATION_ERROR = 7
1767

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

    
1791
IALLOCATOR_NEVAC_PRI = "primary-only"
1792
IALLOCATOR_NEVAC_SEC = "secondary-only"
1793
IALLOCATOR_NEVAC_ALL = "all"
1794
IALLOCATOR_NEVAC_MODES = compat.UniqueFrozenset([
1795
  IALLOCATOR_NEVAC_PRI,
1796
  IALLOCATOR_NEVAC_SEC,
1797
  IALLOCATOR_NEVAC_ALL,
1798
  ])
1799

    
1800
# Node evacuation
1801
NODE_EVAC_PRI = "primary-only"
1802
NODE_EVAC_SEC = "secondary-only"
1803
NODE_EVAC_ALL = "all"
1804
NODE_EVAC_MODES = compat.UniqueFrozenset([
1805
  NODE_EVAC_PRI,
1806
  NODE_EVAC_SEC,
1807
  NODE_EVAC_ALL,
1808
  ])
1809

    
1810
# Job queue
1811
JOB_QUEUE_VERSION = 1
1812
JOB_QUEUE_SIZE_HARD_LIMIT = 5000
1813
JOB_QUEUE_FILES_PERMS = 0640
1814

    
1815
JOB_ID_TEMPLATE = r"\d+"
1816
JOB_FILE_RE = re.compile(r"^job-(%s)$" % JOB_ID_TEMPLATE)
1817

    
1818
# unchanged job return
1819
JOB_NOTCHANGED = "nochange"
1820

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

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

    
1859
# OpCode priority
1860
OP_PRIO_LOWEST = +19
1861
OP_PRIO_HIGHEST = -20
1862

    
1863
OP_PRIO_LOW = +10
1864
OP_PRIO_NORMAL = 0
1865
OP_PRIO_HIGH = -10
1866

    
1867
OP_PRIO_SUBMIT_VALID = compat.UniqueFrozenset([
1868
  OP_PRIO_LOW,
1869
  OP_PRIO_NORMAL,
1870
  OP_PRIO_HIGH,
1871
  ])
1872

    
1873
OP_PRIO_DEFAULT = OP_PRIO_NORMAL
1874

    
1875
# Lock recalculate mode
1876
LOCKS_REPLACE = "replace"
1877
LOCKS_APPEND = "append"
1878

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

    
1888
# Execution log types
1889
ELOG_MESSAGE = "message"
1890
ELOG_REMOTE_IMPORT = "remote-import"
1891
ELOG_JQUEUE_TEST = "jqueue-test"
1892

    
1893
# /etc/hosts modification
1894
ETC_HOSTS_ADD = "add"
1895
ETC_HOSTS_REMOVE = "remove"
1896

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

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

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

    
1934
#: List of resources which can be queried using Local UniX Interface
1935
QR_VIA_LUXI = QR_VIA_OP.union([
1936
  QR_LOCK,
1937
  QR_JOB,
1938
  ])
1939

    
1940
#: List of resources which can be queried using RAPI
1941
QR_VIA_RAPI = QR_VIA_LUXI
1942

    
1943
# Query field types
1944
QFT_UNKNOWN = "unknown"
1945
QFT_TEXT = "text"
1946
QFT_BOOL = "bool"
1947
QFT_NUMBER = "number"
1948
QFT_UNIT = "unit"
1949
QFT_TIMESTAMP = "timestamp"
1950
QFT_OTHER = "other"
1951

    
1952
#: All query field types
1953
QFT_ALL = compat.UniqueFrozenset([
1954
  QFT_UNKNOWN,
1955
  QFT_TEXT,
1956
  QFT_BOOL,
1957
  QFT_NUMBER,
1958
  QFT_UNIT,
1959
  QFT_TIMESTAMP,
1960
  QFT_OTHER,
1961
  ])
1962

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

    
1978
RS_ALL = compat.UniqueFrozenset([
1979
  RS_NORMAL,
1980
  RS_UNKNOWN,
1981
  RS_NODATA,
1982
  RS_UNAVAIL,
1983
  RS_OFFLINE,
1984
  ])
1985

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

    
1994
# max dynamic devices
1995
MAX_NICS = 8
1996
MAX_DISKS = 16
1997

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

    
2025
# This is not a complete SSCONF key, but the prefix for the hypervisor keys
2026
SS_HVPARAMS_PREF = "hvparams_"
2027

    
2028
# Hvparams keys:
2029
SS_HVPARAMS_XEN_PVM = SS_HVPARAMS_PREF + HT_XEN_PVM
2030
SS_HVPARAMS_XEN_FAKE = SS_HVPARAMS_PREF + HT_FAKE
2031
SS_HVPARAMS_XEN_HVM = SS_HVPARAMS_PREF + HT_XEN_HVM
2032
SS_HVPARAMS_XEN_KVM = SS_HVPARAMS_PREF + HT_KVM
2033
SS_HVPARAMS_XEN_CHROOT = SS_HVPARAMS_PREF + HT_CHROOT
2034
SS_HVPARAMS_XEN_LXC = SS_HVPARAMS_PREF + HT_LXC
2035

    
2036
VALID_SS_HVPARAMS_KEYS = compat.UniqueFrozenset([
2037
  SS_HVPARAMS_XEN_PVM,
2038
  SS_HVPARAMS_XEN_FAKE,
2039
  SS_HVPARAMS_XEN_HVM,
2040
  SS_HVPARAMS_XEN_KVM,
2041
  SS_HVPARAMS_XEN_CHROOT,
2042
  SS_HVPARAMS_XEN_LXC,
2043
  ])
2044

    
2045
SS_FILE_PERMS = 0444
2046

    
2047
# cluster wide default parameters
2048
DEFAULT_ENABLED_HYPERVISOR = HT_XEN_PVM
2049

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

    
2164
HVC_GLOBALS = compat.UniqueFrozenset([
2165
  HV_MIGRATION_PORT,
2166
  HV_MIGRATION_BANDWIDTH,
2167
  HV_MIGRATION_MODE,
2168
  HV_XEN_CMD,
2169
  ])
2170

    
2171
BEC_DEFAULTS = {
2172
  BE_MINMEM: 128,
2173
  BE_MAXMEM: 128,
2174
  BE_VCPUS: 1,
2175
  BE_AUTO_BALANCE: True,
2176
  BE_ALWAYS_FAILOVER: False,
2177
  BE_SPINDLE_USE: 1,
2178
  }
2179

    
2180
NDC_DEFAULTS = {
2181
  ND_OOB_PROGRAM: "",
2182
  ND_SPINDLE_COUNT: 1,
2183
  ND_EXCLUSIVE_STORAGE: False,
2184
  }
2185

    
2186
NDC_GLOBALS = compat.UniqueFrozenset([
2187
  ND_EXCLUSIVE_STORAGE,
2188
  ])
2189

    
2190
DISK_LD_DEFAULTS = {
2191
  DT_DRBD8: {
2192
    LDP_RESYNC_RATE: CLASSIC_DRBD_SYNC_SPEED,
2193
    LDP_BARRIERS: _autoconf.DRBD_BARRIERS,
2194
    LDP_NO_META_FLUSH: _autoconf.DRBD_NO_META_FLUSH,
2195
    LDP_DEFAULT_METAVG: DEFAULT_VG,
2196
    LDP_DISK_CUSTOM: "",
2197
    LDP_NET_CUSTOM: "",
2198
    LDP_PROTOCOL: DRBD_DEFAULT_NET_PROTOCOL,
2199
    LDP_DYNAMIC_RESYNC: False,
2200

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

    
2224
# readability shortcuts
2225
_LV_DEFAULTS = DISK_LD_DEFAULTS[DT_PLAIN]
2226
_DRBD_DEFAULTS = DISK_LD_DEFAULTS[DT_DRBD8]
2227

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

    
2259
# we don't want to export the shortcuts
2260
del _LV_DEFAULTS, _DRBD_DEFAULTS
2261

    
2262
NICC_DEFAULTS = {
2263
  NIC_MODE: NIC_MODE_BRIDGED,
2264
  NIC_LINK: DEFAULT_BRIDGE,
2265
  }
2266

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

    
2302
MASTER_POOL_SIZE_DEFAULT = 10
2303

    
2304
# Exclusive storage:
2305
# Error margin used to compare physical disks
2306
PART_MARGIN = .01
2307
# Space reserved when creating instance disks
2308
PART_RESERVED = .02
2309

    
2310
CONFD_PROTOCOL_VERSION = 1
2311

    
2312
CONFD_REQ_PING = 0
2313
CONFD_REQ_NODE_ROLE_BYNAME = 1
2314
CONFD_REQ_NODE_PIP_BY_INSTANCE_IP = 2
2315
CONFD_REQ_CLUSTER_MASTER = 3
2316
CONFD_REQ_NODE_PIP_LIST = 4
2317
CONFD_REQ_MC_PIP_LIST = 5
2318
CONFD_REQ_INSTANCES_IPS_LIST = 6
2319
CONFD_REQ_NODE_DRBD = 7
2320
CONFD_REQ_NODE_INSTANCES = 8
2321

    
2322
# Confd request query fields. These are used to narrow down queries.
2323
# These must be strings rather than integers, because json-encoding
2324
# converts them to strings anyway, as they're used as dict-keys.
2325
CONFD_REQQ_LINK = "0"
2326
CONFD_REQQ_IP = "1"
2327
CONFD_REQQ_IPLIST = "2"
2328
CONFD_REQQ_FIELDS = "3"
2329

    
2330
CONFD_REQFIELD_NAME = "0"
2331
CONFD_REQFIELD_IP = "1"
2332
CONFD_REQFIELD_MNODE_PIP = "2"
2333

    
2334
CONFD_REQS = compat.UniqueFrozenset([
2335
  CONFD_REQ_PING,
2336
  CONFD_REQ_NODE_ROLE_BYNAME,
2337
  CONFD_REQ_NODE_PIP_BY_INSTANCE_IP,
2338
  CONFD_REQ_CLUSTER_MASTER,
2339
  CONFD_REQ_NODE_PIP_LIST,
2340
  CONFD_REQ_MC_PIP_LIST,
2341
  CONFD_REQ_INSTANCES_IPS_LIST,
2342
  CONFD_REQ_NODE_DRBD,
2343
  ])
2344

    
2345
CONFD_REPL_STATUS_OK = 0
2346
CONFD_REPL_STATUS_ERROR = 1
2347
CONFD_REPL_STATUS_NOTIMPLEMENTED = 2
2348

    
2349
CONFD_REPL_STATUSES = compat.UniqueFrozenset([
2350
  CONFD_REPL_STATUS_OK,
2351
  CONFD_REPL_STATUS_ERROR,
2352
  CONFD_REPL_STATUS_NOTIMPLEMENTED,
2353
  ])
2354

    
2355
(CONFD_NODE_ROLE_MASTER,
2356
 CONFD_NODE_ROLE_CANDIDATE,
2357
 CONFD_NODE_ROLE_OFFLINE,
2358
 CONFD_NODE_ROLE_DRAINED,
2359
 CONFD_NODE_ROLE_REGULAR,
2360
 ) = range(5)
2361

    
2362
# A few common errors for confd
2363
CONFD_ERROR_UNKNOWN_ENTRY = 1
2364
CONFD_ERROR_INTERNAL = 2
2365
CONFD_ERROR_ARGUMENT = 3
2366

    
2367
# Each request is "salted" by the current timestamp.
2368
# This constants decides how many seconds of skew to accept.
2369
# TODO: make this a default and allow the value to be more configurable
2370
CONFD_MAX_CLOCK_SKEW = 2 * NODE_MAX_CLOCK_SKEW
2371

    
2372
# When we haven't reloaded the config for more than this amount of
2373
# seconds, we force a test to see if inotify is betraying us. Using a
2374
# prime number to ensure we get less chance of 'same wakeup' with
2375
# other processes.
2376
CONFD_CONFIG_RELOAD_TIMEOUT = 17
2377

    
2378
# If we receive more than one update in this amount of microseconds,
2379
# we move to polling every RATELIMIT seconds, rather than relying on
2380
# inotify, to be able to serve more requests.
2381
CONFD_CONFIG_RELOAD_RATELIMIT = 250000
2382

    
2383
# Magic number prepended to all confd queries.
2384
# This allows us to distinguish different types of confd protocols and handle
2385
# them. For example by changing this we can move the whole payload to be
2386
# compressed, or move away from json.
2387
CONFD_MAGIC_FOURCC = "plj0"
2388

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

    
2394
# Timeout in seconds to expire pending query request in the confd client
2395
# library. We don't actually expect any answer more than 10 seconds after we
2396
# sent a request.
2397
CONFD_CLIENT_EXPIRE_TIMEOUT = 10
2398

    
2399
# Maximum UDP datagram size.
2400
# On IPv4: 64K - 20 (ip header size) - 8 (udp header size) = 65507
2401
# On IPv6: 64K - 40 (ip6 header size) - 8 (udp header size) = 65487
2402
#   (assuming we can't use jumbo frames)
2403
# We just set this to 60K, which should be enough
2404
MAX_UDP_DATA_SIZE = 61440
2405

    
2406
# User-id pool minimum/maximum acceptable user-ids.
2407
UIDPOOL_UID_MIN = 0
2408
UIDPOOL_UID_MAX = 2 ** 32 - 1 # Assuming 32 bit user-ids
2409

    
2410
# Name or path of the pgrep command
2411
PGREP = "pgrep"
2412

    
2413
# Name of the node group that gets created at cluster init or upgrade
2414
INITIAL_NODE_GROUP_NAME = "default"
2415

    
2416
# Possible values for NodeGroup.alloc_policy
2417
ALLOC_POLICY_PREFERRED = "preferred"
2418
ALLOC_POLICY_LAST_RESORT = "last_resort"
2419
ALLOC_POLICY_UNALLOCABLE = "unallocable"
2420
VALID_ALLOC_POLICIES = [
2421
  ALLOC_POLICY_PREFERRED,
2422
  ALLOC_POLICY_LAST_RESORT,
2423
  ALLOC_POLICY_UNALLOCABLE,
2424
  ]
2425

    
2426
# Temporary external/shared storage parameters
2427
BLOCKDEV_DRIVER_MANUAL = "manual"
2428

    
2429
# qemu-img path, required for ovfconverter
2430
QEMUIMG_PATH = _autoconf.QEMUIMG_PATH
2431

    
2432
# Whether htools was enabled at compilation time
2433
HTOOLS = _autoconf.HTOOLS
2434
# The hail iallocator
2435
IALLOC_HAIL = "hail"
2436

    
2437
# Fake opcodes for functions that have hooks attached to them via
2438
# backend.RunLocalHooks
2439
FAKE_OP_MASTER_TURNUP = "OP_CLUSTER_IP_TURNUP"
2440
FAKE_OP_MASTER_TURNDOWN = "OP_CLUSTER_IP_TURNDOWN"
2441

    
2442
# SSH key types
2443
SSHK_RSA = "rsa"
2444
SSHK_DSA = "dsa"
2445
SSHK_ALL = compat.UniqueFrozenset([SSHK_RSA, SSHK_DSA])
2446

    
2447
# SSH authorized key types
2448
SSHAK_RSA = "ssh-rsa"
2449
SSHAK_DSS = "ssh-dss"
2450
SSHAK_ALL = compat.UniqueFrozenset([SSHAK_RSA, SSHAK_DSS])
2451

    
2452
# SSH setup
2453
SSHS_CLUSTER_NAME = "cluster_name"
2454
SSHS_SSH_HOST_KEY = "ssh_host_key"
2455
SSHS_SSH_ROOT_KEY = "ssh_root_key"
2456
SSHS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2457

    
2458
#: Key files for SSH daemon
2459
SSH_DAEMON_KEYFILES = {
2460
  SSHK_RSA: (pathutils.SSH_HOST_RSA_PRIV, pathutils.SSH_HOST_RSA_PUB),
2461
  SSHK_DSA: (pathutils.SSH_HOST_DSA_PRIV, pathutils.SSH_HOST_DSA_PUB),
2462
  }
2463

    
2464
# Node daemon setup
2465
NDS_CLUSTER_NAME = "cluster_name"
2466
NDS_NODE_DAEMON_CERTIFICATE = "node_daemon_certificate"
2467
NDS_SSCONF = "ssconf"
2468
NDS_START_NODE_DAEMON = "start_node_daemon"
2469

    
2470
# Path generating random UUID
2471
RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
2472

    
2473
# Regex string for verifying a UUID
2474
UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
2475

    
2476
# Auto-repair tag prefixes
2477
AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
2478
AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
2479
AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
2480
AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
2481
AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
2482

    
2483
# Auto-repair levels
2484
AUTO_REPAIR_FIX_STORAGE = "fix-storage"
2485
AUTO_REPAIR_MIGRATE = "migrate"
2486
AUTO_REPAIR_FAILOVER = "failover"
2487
AUTO_REPAIR_REINSTALL = "reinstall"
2488
AUTO_REPAIR_ALL_TYPES = [
2489
  AUTO_REPAIR_FIX_STORAGE,
2490
  AUTO_REPAIR_MIGRATE,
2491
  AUTO_REPAIR_FAILOVER,
2492
  AUTO_REPAIR_REINSTALL,
2493
]
2494

    
2495
# Auto-repair results
2496
AUTO_REPAIR_SUCCESS = "success"
2497
AUTO_REPAIR_FAILURE = "failure"
2498
AUTO_REPAIR_ENOPERM = "enoperm"
2499
AUTO_REPAIR_ALL_RESULTS = frozenset([
2500
    AUTO_REPAIR_SUCCESS,
2501
    AUTO_REPAIR_FAILURE,
2502
    AUTO_REPAIR_ENOPERM,
2503
])
2504

    
2505
# The version identifier for builtin data collectors
2506
BUILTIN_DATA_COLLECTOR_VERSION = "B"
2507

    
2508
# The reason trail opcode parameter name
2509
OPCODE_REASON = "reason"
2510

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

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

    
2526
DISKSTATS_FILE = "/proc/diskstats"
2527

    
2528
# Do not re-export imported modules
2529
del re, _vcsversion, _autoconf, socket, pathutils, compat